Add an empty 3.txt to prevent last-released-api check errors am: 6a5c1b5cdd am: f3c534adb3
am: aefa5959ca
Change-Id: I3af25b2a7c06ed9b3326dc5ef075dba9600f36f7
diff --git a/.gitignore b/.gitignore
index 697ef2d..577e3ca 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,5 +4,6 @@
*.iml
gen/
*.pyc
+*.swp
__pycache__
-.idea
\ No newline at end of file
+.idea
diff --git a/EncryptionRunner/Android.bp b/EncryptionRunner/Android.bp
new file mode 100644
index 0000000..b02e6de
--- /dev/null
+++ b/EncryptionRunner/Android.bp
@@ -0,0 +1,49 @@
+// Copyright (C) 2019 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+android_library {
+ name: "EncryptionRunner",
+ min_sdk_version: "23",
+ product_variables: {
+ pdk: {
+ enabled: false,
+ },
+ },
+ srcs: [
+ "src/**/*.java",
+ ],
+}
+
+android_test {
+ name: "EncryptionRunnerTest",
+ min_sdk_version: "23",
+ srcs: [
+ "test/**/*.java",
+ ],
+ product_variables: {
+ pdk: {
+ enabled: false,
+ },
+ },
+ libs: [
+ "android.test.base",
+ "android.test.runner",
+ ],
+ static_libs: [
+ "androidx.test.rules",
+ "EncryptionRunner",
+ "junit",
+ "truth-prebuilt",
+ ],
+}
diff --git a/EncryptionRunner/AndroidManifest.xml b/EncryptionRunner/AndroidManifest.xml
new file mode 100644
index 0000000..8d7643e
--- /dev/null
+++ b/EncryptionRunner/AndroidManifest.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
+ package="android.car.encryptionrunner" >
+ <uses-sdk android:minSdkVersion="23" android:targetSdkVersion="23" />
+ <application>
+ <uses-library android:name="android.test.runner" />
+ </application>
+ <instrumentation
+ android:name="androidx.test.runner.AndroidJUnitRunner"
+ android:targetPackage="android.car.encryptionrunner"
+ android:label="Encryption Runner Tests" />
+</manifest>
diff --git a/EncryptionRunner/AndroidTest.xml b/EncryptionRunner/AndroidTest.xml
new file mode 100644
index 0000000..b6cbbfa
--- /dev/null
+++ b/EncryptionRunner/AndroidTest.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<configuration description="Runs Tests for EncryptionRunner.">
+ <option name="test-tag" value="EncryptionRunnerTest" />
+
+ <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
+ <option name="cleanup-apks" value="true" />
+ <option name="test-file-name" value="EncryptionRunnerTest.apk" />
+ </target_preparer>
+
+ <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
+ <option name="package" value="android.car.encryptionrunner" />
+ <option name="runner" value="androidx.test.runner.AndroidJUnitRunner" />
+ <option name="hidden-api-checks" value="false"/>
+ </test>
+</configuration>
diff --git a/EncryptionRunner/src/android/car/encryptionrunner/DummyEncryptionRunner.java b/EncryptionRunner/src/android/car/encryptionrunner/DummyEncryptionRunner.java
new file mode 100644
index 0000000..b08c985
--- /dev/null
+++ b/EncryptionRunner/src/android/car/encryptionrunner/DummyEncryptionRunner.java
@@ -0,0 +1,138 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.car.encryptionrunner;
+
+import android.annotation.IntDef;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * An ecnryption runnner that doesn't actually do encryption. Useful for debugging. Do not use in
+ * production environments.
+ */
+class DummyEncryptionRunner implements EncryptionRunner {
+
+ private static final String KEY = "key";
+ private static final String INIT = "init";
+ private static final String INIT_RESPONSE = "initResponse";
+ private static final String CLIENT_RESPONSE = "clientResponse";
+ public static final String PIN = "1234";
+
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({Mode.UNKNOWN, Mode.CLIENT, Mode.SERVER})
+ private @interface Mode {
+
+ int UNKNOWN = 0;
+ int CLIENT = 1;
+ int SERVER = 2;
+ }
+
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({State.UNKNOWN, State.WAITING_FOR_RESPONSE, State.FINISHED})
+ private @interface State {
+
+ int UNKNOWN = 0;
+ int WAITING_FOR_RESPONSE = 1;
+ int FINISHED = 2;
+ }
+
+ @Mode
+ private int mMode;
+ @State
+ private int mState;
+
+ @Override
+ public HandshakeMessage initHandshake() {
+ mMode = Mode.CLIENT;
+ mState = State.WAITING_FOR_RESPONSE;
+ return HandshakeMessage.newBuilder()
+ .setNextMessage(INIT.getBytes())
+ .build();
+ }
+
+ @Override
+ public HandshakeMessage respondToInitRequest(byte[] initializationRequest)
+ throws HandshakeException {
+ mMode = Mode.SERVER;
+ if (!new String(initializationRequest).equals(INIT)) {
+ throw new HandshakeException("Unexpected initialization request");
+ }
+ mState = State.WAITING_FOR_RESPONSE;
+ return HandshakeMessage.newBuilder()
+ .setNextMessage(INIT_RESPONSE.getBytes())
+ .build();
+ }
+
+ @Override
+ public HandshakeMessage continueHandshake(byte[] response) throws HandshakeException {
+ if (mState != State.WAITING_FOR_RESPONSE) {
+ throw new HandshakeException("not waiting for response but got one");
+ }
+ switch(mMode) {
+ case Mode.SERVER:
+ if (!CLIENT_RESPONSE.equals(new String(response))) {
+ throw new HandshakeException("unexpected response: " + new String(response));
+ }
+ mState = State.FINISHED;
+ return HandshakeMessage.newBuilder()
+ .setHandshakeComplete(true)
+ .setKey(new DummyKey())
+ .build();
+ case Mode.CLIENT:
+ if (!INIT_RESPONSE.equals(new String(response))) {
+ throw new HandshakeException("unexpected response: " + new String(response));
+ }
+ mState = State.FINISHED;
+ return HandshakeMessage.newBuilder()
+ .setHandshakeComplete(true)
+ .setKey(new DummyKey())
+ .setNextMessage(CLIENT_RESPONSE.getBytes())
+ .build();
+ default:
+ throw new IllegalStateException();
+ }
+ }
+
+ @Override
+ public Key keyOf(byte[] serialized) {
+ return new DummyKey();
+ }
+
+ @Override
+ public String getPin() {
+ return PIN;
+ }
+
+ @Override
+ public byte[] encryptData(Key key, byte[] data) {
+ return data;
+ }
+
+ @Override
+ public byte[] decryptData(Key key, byte[] encryptedData) {
+ return encryptedData;
+ }
+
+ private class DummyKey implements Key {
+
+ @Override
+ public byte[] asBytes() {
+ return KEY.getBytes();
+ }
+ }
+}
diff --git a/EncryptionRunner/src/android/car/encryptionrunner/EncryptionRunner.java b/EncryptionRunner/src/android/car/encryptionrunner/EncryptionRunner.java
new file mode 100644
index 0000000..7e7bd3e
--- /dev/null
+++ b/EncryptionRunner/src/android/car/encryptionrunner/EncryptionRunner.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.car.encryptionrunner;
+
+import android.annotation.NonNull;
+
+/**
+ * A generalized interface that allows for generating shared secrets as well as encrypting
+ * messages.
+ */
+public interface EncryptionRunner {
+
+ /**
+ * Starts an encryption handshake.
+ *
+ * @return A handshake message with information about the handshake that is started.
+ */
+ HandshakeMessage initHandshake();
+
+ /**
+ * Starts an encryption handshake where the device that is being communicated with already
+ * initiated the request.
+ *
+ * @param initializationRequest the bytes that the other device sent over.
+ * @return a handshake message with information about the handshake.
+ * @throws HandshakeException if initialization request is invalid.
+ */
+ HandshakeMessage respondToInitRequest(@NonNull byte[] initializationRequest)
+ throws HandshakeException;
+
+ /**
+ * Continues a handshake after receiving another response from the connected device.
+ *
+ * @param response the response from the other device.
+ * @return a message that can be used to continue the handshake.
+ * @throws HandshakeException if unexpected bytes in response.
+ */
+ HandshakeMessage continueHandshake(@NonNull byte[] response) throws HandshakeException;
+
+ /**
+ * De seriliazes a previously serilized key generated by an instance of this encryption runner.
+ *
+ * @param serialized the serialized bytes of the key.
+ * @return the Key object used for encryption.
+ */
+ Key keyOf(@NonNull byte[] serialized);
+
+ /**
+ * A user visible shared pin. This pin can be used to verify that both devices that are
+ * communicating have agreed to the same key and will be shown to a user.
+ *
+ * @return the user visible pin.
+ */
+ String getPin();
+
+ /**
+ * Encrypts data using an encryption key.
+ *
+ * @param key the key used to encrypt the data.
+ * @param data the data to be encrypted
+ * @return the encrypted data.
+ */
+ byte[] encryptData(@NonNull Key key, @NonNull byte[] data);
+
+ /**
+ * Decrypts data using a specified key.
+ *
+ * @param key The key used to decrypt the data.
+ * @param encryptedData The encrypted data.
+ * @return decrypted data.
+ */
+ byte[] decryptData(@NonNull Key key, @NonNull byte[] encryptedData);
+}
diff --git a/EncryptionRunner/src/android/car/encryptionrunner/EncryptionRunnerFactory.java b/EncryptionRunner/src/android/car/encryptionrunner/EncryptionRunnerFactory.java
new file mode 100644
index 0000000..d975835
--- /dev/null
+++ b/EncryptionRunner/src/android/car/encryptionrunner/EncryptionRunnerFactory.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.car.encryptionrunner;
+
+/**
+ * Factory that creates encryption runner.
+ */
+public class EncryptionRunnerFactory {
+
+ /**
+ * Creates a new {@link EncryptionRunner} one that doesn't actually do encryption but is useful
+ * for testing.
+ */
+ static EncryptionRunner newDummyRunner() {
+ return new DummyEncryptionRunner();
+ }
+}
diff --git a/EncryptionRunner/src/android/car/encryptionrunner/HandshakeException.java b/EncryptionRunner/src/android/car/encryptionrunner/HandshakeException.java
new file mode 100644
index 0000000..02c873c
--- /dev/null
+++ b/EncryptionRunner/src/android/car/encryptionrunner/HandshakeException.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.car.encryptionrunner;
+
+/**
+ * Exception indicating an error during a Handshake of EncryptionRunner.
+ */
+public class HandshakeException extends Exception {
+
+ public HandshakeException(String message) {
+ super(message);
+ }
+}
diff --git a/EncryptionRunner/src/android/car/encryptionrunner/HandshakeMessage.java b/EncryptionRunner/src/android/car/encryptionrunner/HandshakeMessage.java
new file mode 100644
index 0000000..5286770
--- /dev/null
+++ b/EncryptionRunner/src/android/car/encryptionrunner/HandshakeMessage.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.car.encryptionrunner;
+
+import android.annotation.Nullable;
+
+/**
+ * During an {@link EncryptionRunner} handshake process, these are the messages returned as part
+ * of each step.
+ */
+public class HandshakeMessage {
+
+ private final boolean mHandShakeComplete;
+ private final Key mKey;
+ private final byte[] mNextMessage;
+
+ /**
+ * @return Returns a builder for {@link HandshakeMessage}.
+ */
+ public static Builder newBuilder() {
+ return new Builder();
+ }
+
+ /**
+ * Use the builder;
+ */
+ private HandshakeMessage(
+ boolean handShakeComplete,
+ @Nullable Key key,
+ @Nullable byte[] nextMessage) {
+ mHandShakeComplete = handShakeComplete;
+ mKey = key;
+ mNextMessage = nextMessage;
+ }
+
+ /**
+ * Returns the next message to send in a handshake.
+ */
+ @Nullable
+ public byte[] getNextMessage() {
+ return mNextMessage == null ? null : mNextMessage.clone();
+ }
+
+ /**
+ * Returns true if the handshake is complete.
+ */
+ public boolean isHandShakeComplete() {
+ return mHandShakeComplete;
+ }
+
+ /**
+ * Returns the encryption key that can be used to encrypt data.
+ */
+ @Nullable
+ public Key getKey() {
+ return mKey;
+ }
+
+ static class Builder {
+ boolean mHandshakeComplete;
+ Key mKey;
+ byte[] mNextMessage;
+
+ Builder setHandshakeComplete(boolean handshakeComplete) {
+ mHandshakeComplete = handshakeComplete;
+ return this;
+ }
+
+ Builder setKey(Key key) {
+ mKey = key;
+ return this;
+ }
+
+ Builder setNextMessage(byte[] nextMessage) {
+ mNextMessage = nextMessage == null ? null : nextMessage.clone();
+ return this;
+ }
+
+ HandshakeMessage build() {
+ return new HandshakeMessage(mHandshakeComplete, mKey, mNextMessage);
+ }
+ }
+}
diff --git a/EncryptionRunner/src/android/car/encryptionrunner/Key.java b/EncryptionRunner/src/android/car/encryptionrunner/Key.java
new file mode 100644
index 0000000..97dd362
--- /dev/null
+++ b/EncryptionRunner/src/android/car/encryptionrunner/Key.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.car.encryptionrunner;
+
+import android.annotation.NonNull;
+
+/**
+ * Represents a serializable encryption key.
+ */
+public interface Key {
+ /**
+ * Returns a serialized encryption key.
+ */
+ @NonNull byte[] asBytes();
+}
diff --git a/EncryptionRunner/test/android/car/encryptionrunner/EncryptionRunnerTest.java b/EncryptionRunner/test/android/car/encryptionrunner/EncryptionRunnerTest.java
new file mode 100644
index 0000000..d08b37a
--- /dev/null
+++ b/EncryptionRunner/test/android/car/encryptionrunner/EncryptionRunnerTest.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.car.encryptionrunner;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class EncryptionRunnerTest {
+
+ private static final byte[] sTestData = "test data".getBytes();
+
+ @Test
+ public void happyFlow() throws Exception {
+ // This performs a handshake and then sends an "encrypted" message back and forth.
+ // Any encryption runner should be able to do this.
+ // Right now just using the dummy runner, when we have a real runner we can extract this
+ // method or just have the factory create a real runner.
+ EncryptionRunner clientRunner = EncryptionRunnerFactory.newDummyRunner();
+ EncryptionRunner serverRunner = EncryptionRunnerFactory.newDummyRunner();
+ HandshakeMessage initialClientMessage = clientRunner.initHandshake();
+
+ assertThat(initialClientMessage.isHandShakeComplete()).isFalse();
+ assertThat(initialClientMessage.getKey()).isNull();
+ assertThat(initialClientMessage.getNextMessage()).isNotNull();
+
+ HandshakeMessage initialServerMessage =
+ serverRunner.respondToInitRequest(initialClientMessage.getNextMessage());
+
+ assertThat(initialServerMessage.isHandShakeComplete()).isFalse();
+ assertThat(initialServerMessage.getKey()).isNull();
+ assertThat(initialServerMessage.getNextMessage()).isNotNull();
+
+ HandshakeMessage clientMessage =
+ clientRunner.continueHandshake(initialServerMessage.getNextMessage());
+
+ assertThat(clientMessage.isHandShakeComplete()).isTrue();
+ assertThat(clientMessage.getKey()).isNotNull();
+ assertThat(clientMessage.getNextMessage()).isNotNull();
+
+ HandshakeMessage serverMessage =
+ serverRunner.continueHandshake(clientMessage.getNextMessage());
+
+ assertThat(serverMessage.isHandShakeComplete()).isTrue();
+ assertThat(serverMessage.getKey()).isNotNull();
+ assertThat(serverMessage.getNextMessage()).isNull();
+
+ assertThat(serverRunner.decryptData(
+ serverMessage.getKey(),
+ clientRunner.encryptData(clientMessage.getKey(), sTestData))).isEqualTo(sTestData);
+ assertThat(clientRunner.decryptData(
+ clientMessage.getKey(),
+ serverRunner.encryptData(serverMessage.getKey(), sTestData))).isEqualTo(sTestData);
+ }
+
+}
diff --git a/TrustAgent/Android.mk b/TrustAgent/Android.mk
deleted file mode 100644
index 5d9ff98..0000000
--- a/TrustAgent/Android.mk
+++ /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.
-#
-
-ifneq ($(TARGET_BUILD_PDK), true)
-
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_JAVA_LIBRARIES += android.car
-LOCAL_USE_AAPT2 := true
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_PACKAGE_NAME := CarTrustAgentService
-LOCAL_PRIVATE_PLATFORM_APIS := true
-
-LOCAL_PRIVILEGED_MODULE := true
-
-# Remove this to verify permission checks are working correctly
-LOCAL_CERTIFICATE := platform
-
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_PROGUARD_ENABLED := disabled
-
-LOCAL_DEX_PREOPT := false
-
-include $(BUILD_PACKAGE)
-
-endif
diff --git a/TrustAgent/AndroidManifest.xml b/TrustAgent/AndroidManifest.xml
deleted file mode 100644
index 69e501c..0000000
--- a/TrustAgent/AndroidManifest.xml
+++ /dev/null
@@ -1,81 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ 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
- -->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.car.trust">
- <uses-sdk android:minSdkVersion="23" android:targetSdkVersion="23"/>
-
- <!-- Need Bluetooth LE -->
- <uses-feature android:name="android.hardware.bluetooth_le" android:required="true" />
-
- <uses-permission android:name="android.permission.BLUETOOTH" />
- <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
- <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
- <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
-
- <!-- Needed to unlock user -->
- <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />
- <!-- TODO(b/77717079) INTERACT_ACROSS_USERS_FULL should have granted INTERACT_ACROSS_USERS -->
- <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS" />
- <uses-permission android:name="android.permission.MANAGE_USERS" />
- <uses-permission android:name="android.permission.CONTROL_KEYGUARD" />
- <uses-permission android:name="android.permission.PROVIDE_TRUST_AGENT" />
- <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
-
- <application android:label="@string/app_name">
- <service
- android:name=".CarBleTrustAgent"
- android:permission="android.permission.BIND_TRUST_AGENT"
- android:directBootAware="true"
- android:exported="true"
- android:singleUser="true">
- <intent-filter>
- <action android:name="android.service.trust.TrustAgentService" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- <!-- Warning: the meta data must be included if the service is direct boot aware.
- If not included, the device will crash before boot completes. Rendering the
- device unusable. -->
- <meta-data android:name="android.service.trust.trustagent"
- android:resource="@xml/car_sample_trust_agent"/>
- </service>
-
- <!-- CarTrustAgentBleService needs to be direct boot aware, since the trust agent
- binds to it during direct boot.-->
- <service
- android:name=".CarTrustAgentBleService"
- android:directBootAware="true"
- android:singleUser="true">
- <!-- Warning: the meta data must be included if the service is direct boot aware.
- If not included, the device will crash before boot completes. Rendering the device
- unusable. -->
- <meta-data android:name="android.service.trust.trustagent"
- android:resource="@xml/car_sample_trust_agent"/>
- </service>
-
- <activity
- android:name=".CarEnrolmentActivity"
- android:label="@string/app_name"
- android:exported="true"
- android:launchMode="singleInstance">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
-
- </application>
-</manifest>
diff --git a/TrustAgent/res/layout/car_enrolment_activity.xml b/TrustAgent/res/layout/car_enrolment_activity.xml
deleted file mode 100644
index c5a27f0..0000000
--- a/TrustAgent/res/layout/car_enrolment_activity.xml
+++ /dev/null
@@ -1,47 +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.
--->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:weightSum="1">
-
- <ScrollView
- android:id="@+id/scroll"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:scrollbars="vertical"
- android:layout_weight="0.70"
- android:fillViewport="true">
-
- <TextView
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:id="@+id/textfield"/>
- </ScrollView>
- <Button
- android:id="@+id/start_button"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="@string/start_advertising"
- android:layout_weight="0.15"/>
- <Button
- android:id="@+id/revoke_trust_button"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="@string/revoke_trust"
- android:layout_weight="0.15"/>
-</LinearLayout>
diff --git a/TrustAgent/res/values/strings.xml b/TrustAgent/res/values/strings.xml
deleted file mode 100644
index 192b7e4..0000000
--- a/TrustAgent/res/values/strings.xml
+++ /dev/null
@@ -1,41 +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.
--->
-<resources>
- <string name="app_name">CarTrustAgentService</string>
- <string name="trust_granted_explanation">Unlock via escrow token, now granting trust</string>
-
- <!-- service/characteristics uuid for unlocking a device -->
- <string name="unlock_service_uuid">5e2a68a1-27be-43f9-8d1e-4546976fabd7</string>
- <string name="unlock_escrow_token_uiid">5e2a68a2-27be-43f9-8d1e-4546976fabd7</string>
- <string name="unlock_handle_uiid">5e2a68a3-27be-43f9-8d1e-4546976fabd7</string>
-
- <!-- service/characteristics uuid for adding new escrow token -->
- <string name="enrollment_service_uuid">5e2a68a4-27be-43f9-8d1e-4546976fabd7</string>
- <string name="enrollment_handle_uuid">5e2a68a5-27be-43f9-8d1e-4546976fabd7</string>
- <string name="enrollment_token_uuid">5e2a68a6-27be-43f9-8d1e-4546976fabd7</string>
-
- <string name="pref_key_token_handle">token-handle-key</string>
- <string name="pref_key_escrow_token">escrow-token-key</string>
-
- <string name="unlock_button">Unlock Car</string>
- <string name="enroll_button">Enroll New Token</string>
-
- <string name="start_advertising">Start Advertising</string>
- <string name="revoke_trust">Revoke Trust</string>
-
- <string translatable="false" name="token_handle_shared_preferences">com.android.car.trust.TOKEN_HANDLE</string>
-
-</resources>
diff --git a/TrustAgent/res/xml/car_sample_trust_agent.xml b/TrustAgent/res/xml/car_sample_trust_agent.xml
deleted file mode 100644
index 0c7d91d..0000000
--- a/TrustAgent/res/xml/car_sample_trust_agent.xml
+++ /dev/null
@@ -1,20 +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
- -->
-<trust-agent xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:priv-android="http://schemas.android.com/apk/prv/res/android"
- android:settingsActivity=".MainActivity"
- priv-android:unlockProfile="true" />
diff --git a/TrustAgent/src/com/android/car/trust/CarBleTrustAgent.java b/TrustAgent/src/com/android/car/trust/CarBleTrustAgent.java
deleted file mode 100644
index 1dfbd50..0000000
--- a/TrustAgent/src/com/android/car/trust/CarBleTrustAgent.java
+++ /dev/null
@@ -1,303 +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.car.trust;
-
-import android.annotation.Nullable;
-import android.app.ActivityManager;
-import android.app.UserSwitchObserver;
-import android.bluetooth.BluetoothAdapter;
-import android.car.trust.ICarTrustAgentBleService;
-import android.car.trust.ICarTrustAgentTokenRequestDelegate;
-import android.car.trust.ICarTrustAgentUnlockCallback;
-import android.content.BroadcastReceiver;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.ServiceConnection;
-import android.os.IBinder;
-import android.os.RemoteException;
-import android.os.UserHandle;
-import android.service.trust.TrustAgentService;
-import android.util.Log;
-
-/**
- * A BluetoothLE (BLE) based {@link TrustAgentService} that uses the escrow token unlock APIs. </p>
- *
- * This trust agent runs during direct boot and binds to a BLE service that listens for remote
- * devices to trigger an unlock. <p/>
- *
- * The permissions for this agent must be enabled as priv-app permissions for it to start.
- */
-public class CarBleTrustAgent extends TrustAgentService {
-
- private static final String TAG = CarBleTrustAgent.class.getSimpleName();
-
- /**
- * {@link CarTrustAgentBleService} will callback this function when it receives both
- * handle and token.
- */
- private final ICarTrustAgentUnlockCallback mUnlockCallback =
- new ICarTrustAgentUnlockCallback.Stub() {
- @Override
- public void onUnlockDataReceived(byte[] token, long handle) throws RemoteException {
- UserHandle userHandle = getUserHandleByTokenHandle(handle);
- if (userHandle == null) {
- Log.e(TAG, "Unable to find user by token handle " + handle);
- return;
- }
-
- int uid = userHandle.getIdentifier();
- if (ActivityManager.getCurrentUser() != uid) {
- Log.d(TAG, "Switch to user: " + uid);
- // Try to unlock when user switch completes
- ActivityManager.getService().registerUserSwitchObserver(
- getUserSwitchObserver(uid, token, handle), TAG);
- ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
- am.switchUser(uid);
- } else {
- unlockUserInternally(uid, token, handle);
- }
- }
- };
-
- /**
- * Delegates the escrow token API calls from {@link CarTrustAgentBleService} to
- * {@link TrustAgentService}. Due to the asynchronous nature, the results will be posted to
- * {@link CarTrustAgentBleService} by the following calls
- * <ul>
- * <li>{@link #onEscrowTokenAdded(byte[], long, UserHandle)}</li>
- * <li>{@link #onEscrowTokenRemoved(long, boolean)}</li>
- * <li>{@link #onEscrowTokenStateReceived(long, int)}</li>
- * </ul>
- */
- private final ICarTrustAgentTokenRequestDelegate mTokenRequestDelegate =
- new ICarTrustAgentTokenRequestDelegate.Stub() {
- @Override
- public void revokeTrust() {
- CarBleTrustAgent.this.revokeTrust();
- }
-
- @Override
- public void addEscrowToken(byte[] token, int uid) {
- CarBleTrustAgent.this.addEscrowToken(token, UserHandle.of(uid));
- }
-
- @Override
- public void removeEscrowToken(long handle, int uid) {
- CarBleTrustAgent.this.removeEscrowToken(handle, UserHandle.of(uid));
- }
-
- @Override
- public void isEscrowTokenActive(long handle, int uid) {
- CarBleTrustAgent.this.isEscrowTokenActive(handle, UserHandle.of(uid));
- }
- };
-
- /**
- * Service connection to {@link CarTrustAgentBleService}
- */
- private final ServiceConnection mServiceConnection = new ServiceConnection() {
- @Override
- public void onServiceConnected(ComponentName name, IBinder service) {
- Log.d(TAG, "CarTrustAgentBleService connected");
- mCarTrustAgentBleServiceBound = true;
- mCarTrustAgentBleService = ICarTrustAgentBleService.Stub.asInterface(service);
- try {
- mCarTrustAgentBleService.registerUnlockCallback(mUnlockCallback);
- mCarTrustAgentBleService.setTokenRequestDelegate(mTokenRequestDelegate);
- } catch (RemoteException e) {
- Log.e(TAG, "Error registerUnlockCallback", e);
- }
- }
-
- @Override
- public void onServiceDisconnected(ComponentName name) {
- Log.d(TAG, "CarTrustAgentBleService disconnected");
- if (mCarTrustAgentBleService != null) {
- try {
- mCarTrustAgentBleService.unregisterUnlockCallback(mUnlockCallback);
- mCarTrustAgentBleService.setTokenRequestDelegate(null);
- mCarTrustAgentBleService.stopUnlockAdvertising();
- } catch (RemoteException e) {
- Log.e(TAG, "Error unregisterUnlockCallback", e);
- }
- mCarTrustAgentBleService = null;
- mCarTrustAgentBleServiceBound = false;
- }
- }
- };
-
- /**
- * Receives the bluetooth state change broadcasts. Bluetooth is restarted when switching user,
- * we need to ensure calling {@link ICarTrustAgentBleService#startUnlockAdvertising} after
- * bluetooth is started.
- */
- private final BroadcastReceiver mBluetoothBroadcastReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- switch (intent.getAction()) {
- case BluetoothAdapter.ACTION_STATE_CHANGED:
- onBluetoothStateChanged(intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, -1));
- break;
- }
- }
- };
-
- private ICarTrustAgentBleService mCarTrustAgentBleService;
- private boolean mCarTrustAgentBleServiceBound;
-
- /**
- * TODO: Currently it relies on {@link #onDeviceLocked()} and {@link #onDeviceUnlocked()}
- * callback, and these callbacks won't happen if the user has unlocked once.
- */
- private boolean mIsOnLockScreen;
-
- @Override
- public void onCreate() {
- super.onCreate();
- setManagingTrust(true);
- bindService(new Intent(this, CarTrustAgentBleService.class),
- mServiceConnection, Context.BIND_AUTO_CREATE);
- IntentFilter intentFilter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
- registerReceiver(mBluetoothBroadcastReceiver, intentFilter);
- }
-
- @Override
- public void onDestroy() {
- Log.d(TAG, "Car Trust agent shutting down");
- if (mCarTrustAgentBleServiceBound) {
- unbindService(mServiceConnection);
- }
- unregisterReceiver(mBluetoothBroadcastReceiver);
- super.onDestroy();
- }
-
- @Override
- public void onDeviceLocked() {
- super.onDeviceLocked();
- mIsOnLockScreen = true;
- if (mCarTrustAgentBleServiceBound) {
- try {
- mCarTrustAgentBleService.startUnlockAdvertising();
- } catch (RemoteException e) {
- Log.e(TAG, "Error startUnlockAdvertising", e);
- }
- }
- }
-
- @Override
- public void onDeviceUnlocked() {
- super.onDeviceUnlocked();
- mIsOnLockScreen = false;
- if (mCarTrustAgentBleServiceBound) {
- try {
- mCarTrustAgentBleService.stopUnlockAdvertising();
- } catch (RemoteException e) {
- Log.e(TAG, "Error stopUnlockAdvertising", e);
- }
- }
- // Revoke trust right after to enable keyguard when switching user
- revokeTrust();
- }
-
- private UserSwitchObserver getUserSwitchObserver(int uid,
- byte[] token, long handle) {
- return new UserSwitchObserver() {
- @Override
- public void onUserSwitchComplete(int newUserId) throws RemoteException {
- if (uid != newUserId) return;
- unlockUserInternally(uid, token, handle);
- ActivityManager.getService().unregisterUserSwitchObserver(this);
- }
-
- @Override
- public void onLockedBootComplete(int newUserId) {
- // ignored.
- }
- };
- }
-
- private void unlockUserInternally(int uid, byte[] token, long handle) {
- Log.d(TAG, "About to unlock user: " + uid);
- unlockUserWithToken(handle, token, UserHandle.of(uid));
- grantTrust("Granting trust from escrow token",
- 0, FLAG_GRANT_TRUST_DISMISS_KEYGUARD);
- }
-
- private void onBluetoothStateChanged(int state) {
- Log.d(TAG, "onBluetoothStateChanged: " + state);
- if ((state == BluetoothAdapter.STATE_ON || state == BluetoothAdapter.STATE_BLE_ON)
- && mCarTrustAgentBleServiceBound
- && mIsOnLockScreen) {
- try {
- mCarTrustAgentBleService.startUnlockAdvertising();
- } catch (RemoteException e) {
- Log.e(TAG, "Error startUnlockAdvertising", e);
- }
- }
- }
-
- @Override
- public void onEscrowTokenRemoved(long handle, boolean successful) {
- if (mCarTrustAgentBleServiceBound) {
- try {
- mCarTrustAgentBleService.onEscrowTokenRemoved(handle, successful);
- Log.v(TAG, "Callback onEscrowTokenRemoved");
- } catch (RemoteException e) {
- Log.e(TAG, "Error callback onEscrowTokenRemoved", e);
- }
- }
- }
-
- @Override
- public void onEscrowTokenStateReceived(long handle, int tokenState) {
- boolean isActive = tokenState == TOKEN_STATE_ACTIVE;
- if (mCarTrustAgentBleServiceBound) {
- try {
- mCarTrustAgentBleService.onEscrowTokenActiveStateChanged(handle, isActive);
- Log.v(TAG, "Callback onEscrowTokenActiveStateChanged");
- } catch (RemoteException e) {
- Log.e(TAG, "Error callback onEscrowTokenActiveStateChanged", e);
- }
- }
- }
-
- @Override
- public void onEscrowTokenAdded(byte[] token, long handle, UserHandle user) {
- if (mCarTrustAgentBleServiceBound) {
- try {
- mCarTrustAgentBleService.onEscrowTokenAdded(token, handle, user.getIdentifier());
- Log.v(TAG, "Callback onEscrowTokenAdded");
- } catch (RemoteException e) {
- Log.e(TAG, "Error callback onEscrowTokenAdded", e);
- }
- }
- }
-
- private @Nullable UserHandle getUserHandleByTokenHandle(long tokenHandle) {
- if (mCarTrustAgentBleServiceBound) {
- try {
- int userId = mCarTrustAgentBleService.getUserIdByEscrowTokenHandle(tokenHandle);
- return userId < 0 ? null : UserHandle.of(userId);
- } catch (RemoteException e) {
- Log.e(TAG, "Error getUserHandleByTokenHandle");
- }
- }
- return null;
- }
-}
diff --git a/TrustAgent/src/com/android/car/trust/CarEnrolmentActivity.java b/TrustAgent/src/com/android/car/trust/CarEnrolmentActivity.java
deleted file mode 100644
index 4b587d1..0000000
--- a/TrustAgent/src/com/android/car/trust/CarEnrolmentActivity.java
+++ /dev/null
@@ -1,258 +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.car.trust;
-
-import android.Manifest;
-import android.app.Activity;
-import android.bluetooth.BluetoothDevice;
-import android.car.trust.ICarTrustAgentBleCallback;
-import android.car.trust.ICarTrustAgentBleService;
-import android.car.trust.ICarTrustAgentEnrolmentCallback;
-import android.car.trust.ICarTrustAgentTokenResponseCallback;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.ServiceConnection;
-import android.content.SharedPreferences;
-import android.content.pm.PackageManager;
-import android.os.Bundle;
-import android.os.IBinder;
-import android.os.RemoteException;
-import android.os.UserHandle;
-import android.preference.PreferenceManager;
-import android.util.Log;
-import android.widget.TextView;
-
-/**
- * Setup activity that binds {@link CarTrustAgentBleService} and starts the enrolment process.
- */
-public class CarEnrolmentActivity extends Activity {
-
- private static final String TAG = CarEnrolmentActivity.class.getSimpleName();
-
- private static final String SP_HANDLE_KEY = "sp-test";
- private static final int FINE_LOCATION_REQUEST_CODE = 42;
-
- /**
- * Receives escrow token callbacks, registered on {@link CarTrustAgentBleService}
- */
- private final ICarTrustAgentTokenResponseCallback mCarTrustAgentTokenResponseCallback =
- new ICarTrustAgentTokenResponseCallback.Stub() {
- @Override
- public void onEscrowTokenAdded(byte[] token, long handle, int uid) {
- runOnUiThread(() -> {
- mPrefs.edit().putLong(SP_HANDLE_KEY, handle).apply();
- Log.d(TAG, "stored new handle for user: " + uid);
- });
-
- if (mBluetoothDevice == null) {
- Log.e(TAG, "No active bluetooth found to add escrow token");
- return;
- }
-
- try {
- // Notify the enrolment client that escrow token has been added
- mCarTrustAgentBleService.sendEnrolmentHandle(mBluetoothDevice, handle);
- appendOutputText("Escrow Token Added. Handle: " + handle);
- appendOutputText("Lock and unlock the device to activate token");
- } catch (RemoteException e) {
- Log.e(TAG, "Error sendEnrolmentHandle", e);
- }
- }
-
- @Override
- public void onEscrowTokenRemoved(long handle, boolean successful) {
- appendOutputText("Escrow token Removed. Handle: " + handle);
- }
-
- @Override
- public void onEscrowTokenActiveStateChanged(long handle, boolean active) {
- appendOutputText("Is token active? " + active + " handle: " + handle);
- }
- };
-
- /**
- * Receives BLE state change callbacks, registered on {@link CarTrustAgentBleService}
- */
- private final ICarTrustAgentBleCallback mBleConnectionCallback =
- new ICarTrustAgentBleCallback.Stub() {
- @Override
- public void onBleServerStartSuccess() {
- appendOutputText("Server started");
- }
-
- @Override
- public void onBleServerStartFailure(int errorCode) {
- appendOutputText("Server failed to start, error code: " + errorCode);
- }
-
- @Override
- public void onBleDeviceConnected(BluetoothDevice device) {
- mBluetoothDevice = device;
- appendOutputText("Device connected: " + device.getName()
- + " address: " + device.getAddress());
- }
-
- @Override
- public void onBleDeviceDisconnected(BluetoothDevice device) {
- mBluetoothDevice = null;
- appendOutputText("Device disconnected: " + device.getName()
- + " address: " + device.getAddress());
- }
- };
-
- /**
- * {@link CarTrustAgentBleService} will callback this when receives enrolment data.
- *
- * Here is the place we can prompt to the user on HU whether or not to add this
- * {@link #mBluetoothDevice} as a trust device.
- */
- private final ICarTrustAgentEnrolmentCallback mEnrolmentCallback =
- new ICarTrustAgentEnrolmentCallback.Stub() {
- @Override
- public void onEnrolmentDataReceived(byte[] token) {
- appendOutputText("Enrolment data received ");
- try {
- addEscrowToken(token);
- } catch (RemoteException e) {
- Log.e(TAG, "Error addEscrowToken", e);
- }
- }
- };
-
- /**
- * Service connection to {@link CarTrustAgentBleService}
- */
- private final ServiceConnection mServiceConnection = new ServiceConnection() {
- @Override
- public void onServiceConnected(ComponentName name, IBinder service) {
- mCarTrustAgentBleServiceBound = true;
- mCarTrustAgentBleService = ICarTrustAgentBleService.Stub.asInterface(service);
- try {
- mCarTrustAgentBleService.registerBleCallback(mBleConnectionCallback);
- mCarTrustAgentBleService.registerEnrolmentCallback(mEnrolmentCallback);
- mCarTrustAgentBleService.setTokenResponseCallback(
- mCarTrustAgentTokenResponseCallback);
- mCarTrustAgentBleService.startEnrolmentAdvertising();
- } catch (RemoteException e) {
- Log.e(TAG, "Error startEnrolmentAdvertising", e);
- }
- checkTokenHandle();
- }
-
- @Override
- public void onServiceDisconnected(ComponentName name) {
- if (mCarTrustAgentBleService != null) {
- try {
- mCarTrustAgentBleService.unregisterBleCallback(mBleConnectionCallback);
- mCarTrustAgentBleService.unregisterEnrolmentCallback(mEnrolmentCallback);
- mCarTrustAgentBleService.setTokenResponseCallback(null);
- mCarTrustAgentBleService.stopEnrolmentAdvertising();
- } catch (RemoteException e) {
- Log.e(TAG, "Error unregister callbacks", e);
- }
- mCarTrustAgentBleService = null;
- }
- mCarTrustAgentBleServiceBound = false;
- }
- };
-
- private TextView mOutputText;
- private BluetoothDevice mBluetoothDevice;
- private ICarTrustAgentBleService mCarTrustAgentBleService;
- private boolean mCarTrustAgentBleServiceBound;
- private SharedPreferences mPrefs;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- setContentView(R.layout.car_enrolment_activity);
- mOutputText = findViewById(R.id.textfield);
- mPrefs = PreferenceManager.getDefaultSharedPreferences(this /* context */);
-
- findViewById(R.id.start_button).setOnClickListener((view) -> {
- if (!mCarTrustAgentBleServiceBound) {
- Intent bindIntent = new Intent(this, CarTrustAgentBleService.class);
- bindService(bindIntent, mServiceConnection, Context.BIND_AUTO_CREATE);
- }
- });
-
- findViewById(R.id.revoke_trust_button).setOnClickListener((view) -> {
- if (mCarTrustAgentBleServiceBound) {
- try {
- mCarTrustAgentBleService.revokeTrust();
- } catch (RemoteException e) {
- Log.e(TAG, "Error revokeTrust", e);
- }
- }
- });
- }
-
- @Override
- protected void onResume() {
- super.onResume();
-
- if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) !=
- PackageManager.PERMISSION_GRANTED) {
- requestPermissions(
- new String[] { android.Manifest.permission.ACCESS_FINE_LOCATION },
- FINE_LOCATION_REQUEST_CODE);
- }
- }
-
- @Override
- protected void onStop() {
- super.onStop();
-
- if (mCarTrustAgentBleServiceBound) {
- unbindService(mServiceConnection);
- mCarTrustAgentBleServiceBound = false;
- }
- }
-
- private void appendOutputText(final String text) {
- runOnUiThread(() -> mOutputText.append("\n" + text));
- }
-
- private void addEscrowToken(byte[] token) throws RemoteException {
- if (!mCarTrustAgentBleServiceBound) {
- Log.e(TAG, "No CarTrustAgentBleService bounded");
- return;
- }
- mCarTrustAgentBleService.addEscrowToken(token, UserHandle.myUserId());
- }
-
- private void checkTokenHandle() {
- long tokenHandle = mPrefs.getLong(SP_HANDLE_KEY, -1);
- if (tokenHandle != -1) {
- Log.d(TAG, "Checking handle active: " + tokenHandle);
- if (mCarTrustAgentBleServiceBound) {
- try {
- // Due to the asynchronous nature of isEscrowTokenActive in
- // TrustAgentService, query result will be delivered via
- // {@link #mCarTrustAgentTokenResponseCallback}
- mCarTrustAgentBleService.isEscrowTokenActive(tokenHandle,
- UserHandle.myUserId());
- } catch (RemoteException e) {
- Log.e(TAG, "Error isEscrowTokenActive", e);
- }
- }
- } else {
- appendOutputText("No handles found");
- }
- }
-}
diff --git a/TrustAgent/src/com/android/car/trust/CarTrustAgentBleService.java b/TrustAgent/src/com/android/car/trust/CarTrustAgentBleService.java
deleted file mode 100644
index 2cc2080..0000000
--- a/TrustAgent/src/com/android/car/trust/CarTrustAgentBleService.java
+++ /dev/null
@@ -1,395 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.car.trust;
-
-import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothGattCharacteristic;
-import android.bluetooth.BluetoothGattService;
-import android.car.trust.ICarTrustAgentBleCallback;
-import android.car.trust.ICarTrustAgentBleService;
-import android.car.trust.ICarTrustAgentEnrolmentCallback;
-import android.car.trust.ICarTrustAgentTokenRequestDelegate;
-import android.car.trust.ICarTrustAgentTokenResponseCallback;
-import android.car.trust.ICarTrustAgentUnlockCallback;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.os.IBinder;
-import android.os.ParcelUuid;
-import android.os.RemoteCallbackList;
-import android.os.RemoteException;
-import android.util.Log;
-
-import java.nio.ByteBuffer;
-import java.util.UUID;
-
-/**
- * Abstracts enrolment and unlock token exchange via BluetoothLE (BLE).
- * {@link CarBleTrustAgent} and any enrolment client should bind to
- * {@link ICarTrustAgentBleService}.
- */
-public class CarTrustAgentBleService extends SimpleBleServer {
-
- private static final String TAG = CarTrustAgentBleService.class.getSimpleName();
-
- private RemoteCallbackList<ICarTrustAgentBleCallback> mBleCallbacks;
- private RemoteCallbackList<ICarTrustAgentEnrolmentCallback> mEnrolmentCallbacks;
- private RemoteCallbackList<ICarTrustAgentUnlockCallback> mUnlockCallbacks;
- private ICarTrustAgentTokenRequestDelegate mTokenRequestDelegate;
- private ICarTrustAgentTokenResponseCallback mTokenResponseCallback;
- private CarTrustAgentBleWrapper mCarTrustBleService;
-
- private ParcelUuid mEnrolmentUuid;
- private BluetoothGattCharacteristic mEnrolmentEscrowToken;
- private BluetoothGattCharacteristic mEnrolmentTokenHandle;
- private BluetoothGattService mEnrolmentGattServer;
-
- private ParcelUuid mUnlockUuid;
- private BluetoothGattCharacteristic mUnlockEscrowToken;
- private BluetoothGattCharacteristic mUnlockTokenHandle;
- private BluetoothGattService mUnlockGattServer;
- private byte[] mCurrentUnlockToken;
- private Long mCurrentUnlockHandle;
-
- private SharedPreferences mTokenHandleSharedPreferences;
-
- @Override
- public void onCreate() {
- super.onCreate();
- mBleCallbacks = new RemoteCallbackList<>();
- mEnrolmentCallbacks = new RemoteCallbackList<>();
- mUnlockCallbacks = new RemoteCallbackList<>();
- mCarTrustBleService = new CarTrustAgentBleWrapper();
-
- setupEnrolmentBleServer();
- setupUnlockBleServer();
-
- mTokenHandleSharedPreferences = getSharedPreferences(
- getString(R.string.token_handle_shared_preferences),
- MODE_PRIVATE);
- }
-
- @Override
- public IBinder onBind(Intent intent) {
- return mCarTrustBleService;
- }
-
- @Override
- public int onStartCommand(Intent intent, int flags, int startId) {
- // keep it alive.
- return START_STICKY;
- }
-
- @Override
- public void onCharacteristicWrite(final BluetoothDevice device, int requestId,
- BluetoothGattCharacteristic characteristic, boolean preparedWrite, boolean
- responseNeeded, int offset, byte[] value) {
- UUID uuid = characteristic.getUuid();
- Log.d(TAG, "onCharacteristicWrite received uuid: " + uuid);
- if (uuid.equals(mEnrolmentEscrowToken.getUuid())) {
- final int callbackCount = mEnrolmentCallbacks.beginBroadcast();
- for (int i = 0; i < callbackCount; i++) {
- try {
- mEnrolmentCallbacks.getBroadcastItem(i).onEnrolmentDataReceived(value);
- } catch (RemoteException e) {
- Log.e(TAG, "Error callback onEnrolmentDataReceived", e);
- }
- }
- mEnrolmentCallbacks.finishBroadcast();
- } else if (uuid.equals(mUnlockEscrowToken.getUuid())) {
- mCurrentUnlockToken = value;
- maybeSendUnlockToken();
- } else if (uuid.equals(mUnlockTokenHandle.getUuid())) {
- mCurrentUnlockHandle = getLong(value);
- maybeSendUnlockToken();
- }
- }
-
- @Override
- public void onCharacteristicRead(BluetoothDevice device,
- int requestId, int offset, final BluetoothGattCharacteristic characteristic) {
- // Ignored read requests.
- }
-
- @Override
- protected void onAdvertiseStartSuccess() {
- final int callbackCount = mBleCallbacks.beginBroadcast();
- for (int i = 0; i < callbackCount; i++) {
- try {
- mBleCallbacks.getBroadcastItem(i).onBleServerStartSuccess();
- } catch (RemoteException e) {
- Log.e(TAG, "Error callback onBleServerStartSuccess", e);
- }
- }
- mBleCallbacks.finishBroadcast();
- }
-
- @Override
- protected void onAdvertiseStartFailure(int errorCode) {
- final int callbackCount = mBleCallbacks.beginBroadcast();
- for (int i = 0; i < callbackCount; i++) {
- try {
- mBleCallbacks.getBroadcastItem(i).onBleServerStartFailure(errorCode);
- } catch (RemoteException e) {
- Log.e(TAG, "Error callback onBleServerStartFailure", e);
- }
- }
- mBleCallbacks.finishBroadcast();
- }
-
- @Override
- protected void onAdvertiseDeviceConnected(BluetoothDevice device) {
- final int callbackCount = mBleCallbacks.beginBroadcast();
- for (int i = 0; i < callbackCount; i++) {
- try {
- mBleCallbacks.getBroadcastItem(i).onBleDeviceConnected(device);
- } catch (RemoteException e) {
- Log.e(TAG, "Error callback onBleDeviceConnected", e);
- }
- }
- mBleCallbacks.finishBroadcast();
- }
-
- @Override
- protected void onAdvertiseDeviceDisconnected(BluetoothDevice device) {
- final int callbackCount = mBleCallbacks.beginBroadcast();
- for (int i = 0; i < callbackCount; i++) {
- try {
- mBleCallbacks.getBroadcastItem(i).onBleDeviceDisconnected(device);
- } catch (RemoteException e) {
- Log.e(TAG, "Error callback onBleDeviceDisconnected", e);
- }
- }
- mBleCallbacks.finishBroadcast();
- }
-
- private void setupEnrolmentBleServer() {
- mEnrolmentUuid = new ParcelUuid(
- UUID.fromString(getString(R.string.enrollment_service_uuid)));
- mEnrolmentGattServer = new BluetoothGattService(
- UUID.fromString(getString(R.string.enrollment_service_uuid)),
- BluetoothGattService.SERVICE_TYPE_PRIMARY);
-
- // Characteristic to describe the escrow token being used for unlock
- mEnrolmentEscrowToken = new BluetoothGattCharacteristic(
- UUID.fromString(getString(R.string.enrollment_token_uuid)),
- BluetoothGattCharacteristic.PROPERTY_WRITE,
- BluetoothGattCharacteristic.PERMISSION_WRITE);
-
- // Characteristic to describe the handle being used for this escrow token
- mEnrolmentTokenHandle = new BluetoothGattCharacteristic(
- UUID.fromString(getString(R.string.enrollment_handle_uuid)),
- BluetoothGattCharacteristic.PROPERTY_NOTIFY,
- BluetoothGattCharacteristic.PERMISSION_READ);
-
- mEnrolmentGattServer.addCharacteristic(mEnrolmentEscrowToken);
- mEnrolmentGattServer.addCharacteristic(mEnrolmentTokenHandle);
- }
-
- private void setupUnlockBleServer() {
- mUnlockUuid = new ParcelUuid(
- UUID.fromString(getString(R.string.unlock_service_uuid)));
- mUnlockGattServer = new BluetoothGattService(
- UUID.fromString(getString(R.string.unlock_service_uuid)),
- BluetoothGattService.SERVICE_TYPE_PRIMARY);
-
- // Characteristic to describe the escrow token being used for unlock
- mUnlockEscrowToken = new BluetoothGattCharacteristic(
- UUID.fromString(getString(R.string.unlock_escrow_token_uiid)),
- BluetoothGattCharacteristic.PROPERTY_WRITE,
- BluetoothGattCharacteristic.PERMISSION_WRITE);
-
- // Characteristic to describe the handle being used for this escrow token
- mUnlockTokenHandle = new BluetoothGattCharacteristic(
- UUID.fromString(getString(R.string.unlock_handle_uiid)),
- BluetoothGattCharacteristic.PROPERTY_WRITE,
- BluetoothGattCharacteristic.PERMISSION_WRITE);
-
- mUnlockGattServer.addCharacteristic(mUnlockEscrowToken);
- mUnlockGattServer.addCharacteristic(mUnlockTokenHandle);
- }
-
- private synchronized void maybeSendUnlockToken() {
- if (mCurrentUnlockToken == null || mCurrentUnlockHandle == null) {
- return;
- }
- Log.d(TAG, "Handle and token both received, requesting unlock. Time: "
- + System.currentTimeMillis());
- final int callbackCount = mUnlockCallbacks.beginBroadcast();
- for (int i = 0; i < callbackCount; i++) {
- try {
- mUnlockCallbacks.getBroadcastItem(i).onUnlockDataReceived(
- mCurrentUnlockToken, mCurrentUnlockHandle);
- } catch (RemoteException e) {
- Log.e(TAG, "Error callback onUnlockDataReceived", e);
- }
- }
- mUnlockCallbacks.finishBroadcast();
- mCurrentUnlockHandle = null;
- mCurrentUnlockToken = null;
- }
-
- private static byte[] getBytes(long primitive) {
- ByteBuffer buffer = ByteBuffer.allocate(Long.SIZE / Byte.SIZE);
- buffer.putLong(0, primitive);
- return buffer.array();
- }
-
- private static long getLong(byte[] bytes) {
- ByteBuffer buffer = ByteBuffer.allocate(Long.SIZE / Byte.SIZE);
- buffer.put(bytes);
- buffer.flip();
- return buffer.getLong();
- }
-
- private final class CarTrustAgentBleWrapper extends ICarTrustAgentBleService.Stub {
- @Override
- public void registerBleCallback(ICarTrustAgentBleCallback callback) {
- mBleCallbacks.register(callback);
- }
-
- @Override
- public void unregisterBleCallback(ICarTrustAgentBleCallback callback) {
- mBleCallbacks.unregister(callback);
- }
-
- @Override
- public void startEnrolmentAdvertising() {
- stopUnlockAdvertising();
- Log.d(TAG, "startEnrolmentAdvertising");
- startAdvertising(mEnrolmentUuid, mEnrolmentGattServer);
- }
-
- @Override
- public void stopEnrolmentAdvertising() {
- Log.d(TAG, "stopEnrolmentAdvertising");
- stopAdvertising();
- }
-
- @Override
- public void sendEnrolmentHandle(BluetoothDevice device, long handle) {
- Log.d(TAG, "sendEnrolmentHandle: " + handle);
- mEnrolmentTokenHandle.setValue(getBytes(handle));
- notifyCharacteristicChanged(device, mEnrolmentTokenHandle, false);
- }
-
- @Override
- public void registerEnrolmentCallback(ICarTrustAgentEnrolmentCallback callback) {
- mEnrolmentCallbacks.register(callback);
- }
-
- @Override
- public void unregisterEnrolmentCallback(ICarTrustAgentEnrolmentCallback callback) {
- mEnrolmentCallbacks.unregister(callback);
- }
-
- @Override
- public void startUnlockAdvertising() {
- stopEnrolmentAdvertising();
- Log.d(TAG, "startUnlockAdvertising");
- startAdvertising(mUnlockUuid, mUnlockGattServer);
- }
-
- @Override
- public void stopUnlockAdvertising() {
- Log.d(TAG, "stopUnlockAdvertising");
- stopAdvertising();
- }
-
- @Override
- public void registerUnlockCallback(ICarTrustAgentUnlockCallback callback) {
- mUnlockCallbacks.register(callback);
- }
-
- @Override
- public void unregisterUnlockCallback(ICarTrustAgentUnlockCallback callback) {
- mUnlockCallbacks.unregister(callback);
- }
-
- @Override
- public void setTokenRequestDelegate(ICarTrustAgentTokenRequestDelegate delegate) {
- mTokenRequestDelegate = delegate;
- }
-
- @Override
- public void revokeTrust() throws RemoteException {
- if (mTokenRequestDelegate != null) {
- mTokenRequestDelegate.revokeTrust();
- }
- }
-
- @Override
- public void addEscrowToken(byte[] token, int uid) throws RemoteException {
- if (mTokenRequestDelegate != null) {
- mTokenRequestDelegate.addEscrowToken(token, uid);
- }
- }
-
- @Override
- public void removeEscrowToken(long handle, int uid) throws RemoteException {
- if (mTokenRequestDelegate != null) {
- mTokenRequestDelegate.removeEscrowToken(handle, uid);
- }
- }
-
- @Override
- public void isEscrowTokenActive(long handle, int uid) throws RemoteException {
- if (mTokenRequestDelegate != null) {
- mTokenRequestDelegate.isEscrowTokenActive(handle, uid);
- }
- }
-
- @Override
- public void setTokenResponseCallback(ICarTrustAgentTokenResponseCallback callback) {
- mTokenResponseCallback = callback;
- }
-
- @Override
- public void onEscrowTokenAdded(byte[] token, long handle, int uid)
- throws RemoteException {
- Log.d(TAG, "onEscrowTokenAdded handle:" + handle + " uid:" + uid);
- mTokenHandleSharedPreferences.edit()
- .putInt(String.valueOf(handle), uid)
- .apply();
- if (mTokenResponseCallback != null) {
- mTokenResponseCallback.onEscrowTokenAdded(token, handle, uid);
- }
- }
-
- @Override
- public void onEscrowTokenRemoved(long handle, boolean successful) throws RemoteException {
- Log.d(TAG, "onEscrowTokenRemoved handle:" + handle);
- mTokenHandleSharedPreferences.edit()
- .remove(String.valueOf(handle))
- .apply();
- if (mTokenResponseCallback != null) {
- mTokenResponseCallback.onEscrowTokenRemoved(handle, successful);
- }
- }
-
- @Override
- public void onEscrowTokenActiveStateChanged(long handle, boolean active)
- throws RemoteException {
- if (mTokenResponseCallback != null) {
- mTokenResponseCallback.onEscrowTokenActiveStateChanged(handle, active);
- }
- }
-
- @Override
- public int getUserIdByEscrowTokenHandle(long tokenHandle) {
- return mTokenHandleSharedPreferences.getInt(String.valueOf(tokenHandle), -1);
- }
- }
-}
diff --git a/TrustAgent/src/com/android/car/trust/SimpleBleServer.java b/TrustAgent/src/com/android/car/trust/SimpleBleServer.java
deleted file mode 100644
index 7fbf2fe..0000000
--- a/TrustAgent/src/com/android/car/trust/SimpleBleServer.java
+++ /dev/null
@@ -1,231 +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.car.trust;
-
-import static android.bluetooth.BluetoothProfile.GATT_SERVER;
-
-import android.app.Service;
-import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothGatt;
-import android.bluetooth.BluetoothGattCharacteristic;
-import android.bluetooth.BluetoothGattServer;
-import android.bluetooth.BluetoothGattServerCallback;
-import android.bluetooth.BluetoothGattService;
-import android.bluetooth.BluetoothManager;
-import android.bluetooth.BluetoothProfile;
-import android.bluetooth.le.AdvertiseCallback;
-import android.bluetooth.le.AdvertiseData;
-import android.bluetooth.le.AdvertiseSettings;
-import android.bluetooth.le.BluetoothLeAdvertiser;
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.os.Handler;
-import android.os.ParcelUuid;
-import android.util.Log;
-
-/**
- * A generic service to start a BLE
- */
-public abstract class SimpleBleServer extends Service {
-
- private static final String TAG = SimpleBleServer.class.getSimpleName();
-
- private static final int BLE_RETRY_LIMIT = 5;
- private static final int BLE_RETRY_INTERVAL_MS = 1000;
-
- private final AdvertiseCallback mAdvertisingCallback = new AdvertiseCallback() {
- @Override
- public void onStartSuccess(AdvertiseSettings settingsInEffect) {
- super.onStartSuccess(settingsInEffect);
- Log.d(TAG, "Successfully started advertising service");
- onAdvertiseStartSuccess();
- }
-
- @Override
- public void onStartFailure(int errorCode) {
- super.onStartFailure(errorCode);
- Log.e(TAG, "Failed to advertise, errorCode: " + errorCode);
- onAdvertiseStartFailure(errorCode);
- }
- };
-
- private final BluetoothGattServerCallback mGattServerCallback =
- new BluetoothGattServerCallback() {
- @Override
- public void onConnectionStateChange(BluetoothDevice device,
- final int status, final int newState) {
- Log.d(TAG, "GattServer connection change status: " + status
- + " newState: " + newState
- + " device name: " + device.getName());
- switch (newState) {
- case BluetoothProfile.STATE_CONNECTED:
- onAdvertiseDeviceConnected(device);
- break;
- case BluetoothProfile.STATE_DISCONNECTED:
- onAdvertiseDeviceDisconnected(device);
- break;
- }
- }
-
- @Override
- public void onServiceAdded(final int status, BluetoothGattService service) {
- Log.d(TAG, "Service added status: " + status + " uuid: " + service.getUuid());
- }
-
- @Override
- public void onCharacteristicReadRequest(BluetoothDevice device,
- int requestId, int offset, final BluetoothGattCharacteristic characteristic) {
- Log.d(TAG, "Read request for characteristic: " + characteristic.getUuid());
- mGattServer.sendResponse(device, requestId,
- BluetoothGatt.GATT_SUCCESS, offset, characteristic.getValue());
- onCharacteristicRead(device, requestId, offset, characteristic);
- }
-
- @Override
- public void onCharacteristicWriteRequest(final BluetoothDevice device, int requestId,
- BluetoothGattCharacteristic characteristic, boolean preparedWrite, boolean
- responseNeeded, int offset, byte[] value) {
- Log.d(TAG, "Write request for characteristic: " + characteristic.getUuid());
- mGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS,
- offset, value);
- onCharacteristicWrite(device, requestId, characteristic,
- preparedWrite, responseNeeded, offset, value);
- }
- };
-
- private final Handler mHandler = new Handler();
-
- private BluetoothManager mBluetoothManager;
- private BluetoothLeAdvertiser mAdvertiser;
- private BluetoothGattServer mGattServer;
- private int mAdvertiserStartCount;
-
- /**
- * Starts the GATT server with the given {@link BluetoothGattService} and begins
- * advertising with the {@link ParcelUuid}.
- * <p>It is possible that BLE service is still in TURNING_ON state when this method is invoked.
- * Therefore, several retries will be made to ensure advertising is started.
- *
- * @param advertiseUuid Service Uuid used in the {@link AdvertiseData}
- * @param service {@link BluetoothGattService} that will be discovered by clients
- */
- protected void startAdvertising(ParcelUuid advertiseUuid, BluetoothGattService service) {
- if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
- Log.e(TAG, "System does not support BLE");
- return;
- }
-
- mBluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
- mGattServer = mBluetoothManager.openGattServer(this, mGattServerCallback);
- if (mGattServer == null) {
- Log.e(TAG, "Gatt Server not created");
- return;
- }
-
- // We only allow adding one service in this implementation. If multiple services need
- // to be added, then they need to be queued up and added only after
- // BluetoothGattServerCallback.onServiceAdded is called.
- mGattServer.addService(service);
-
- AdvertiseSettings settings = new AdvertiseSettings.Builder()
- .setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY)
- .setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH)
- .setConnectable(true)
- .build();
-
- AdvertiseData data = new AdvertiseData.Builder()
- .setIncludeDeviceName(true)
- .addServiceUuid(advertiseUuid)
- .build();
-
- mAdvertiserStartCount = 0;
- startAdvertisingInternally(settings, data);
- }
-
- private void startAdvertisingInternally(AdvertiseSettings settings, AdvertiseData data) {
- mAdvertiserStartCount += 1;
- mAdvertiser = BluetoothAdapter.getDefaultAdapter().getBluetoothLeAdvertiser();
- if (mAdvertiser == null && mAdvertiserStartCount < BLE_RETRY_LIMIT) {
- mHandler.postDelayed(() -> startAdvertisingInternally(settings, data),
- BLE_RETRY_INTERVAL_MS);
- } else {
- mHandler.removeCallbacks(null);
- mAdvertiser.startAdvertising(settings, data, mAdvertisingCallback);
- mAdvertiserStartCount = 0;
- }
- }
-
- protected void stopAdvertising() {
- if (mAdvertiser != null) {
- mAdvertiser.stopAdvertising(mAdvertisingCallback);
- }
- }
-
- /**
- * Notifies the characteristic change via {@link BluetoothGattServer}
- */
- protected void notifyCharacteristicChanged(BluetoothDevice device,
- BluetoothGattCharacteristic characteristic, boolean confirm) {
- if (mGattServer != null) {
- mGattServer.notifyCharacteristicChanged(device, characteristic, confirm);
- }
- }
-
- @Override
- public void onDestroy() {
- // Stops the advertiser and GATT server. This needs to be done to avoid leaks
- if (mAdvertiser != null) {
- mAdvertiser.stopAdvertising(mAdvertisingCallback);
- mAdvertiser.cleanup();
- }
-
- if (mGattServer != null) {
- mGattServer.clearServices();
- try {
- for (BluetoothDevice d : mBluetoothManager.getConnectedDevices(GATT_SERVER)) {
- mGattServer.cancelConnection(d);
- }
- } catch (UnsupportedOperationException e) {
- Log.e(TAG, "Error getting connected devices", e);
- } finally {
- mGattServer.close();
- }
- }
- super.onDestroy();
- }
-
- // Delegate to subclass
- protected void onAdvertiseStartSuccess() { }
- protected void onAdvertiseStartFailure(int errorCode) { }
- protected void onAdvertiseDeviceConnected(BluetoothDevice device) { }
- protected void onAdvertiseDeviceDisconnected(BluetoothDevice device) { }
-
- /**
- * Triggered when this BleService receives a write request from a remote
- * device. Sub-classes should implement how to handle requests.
- */
- protected abstract void onCharacteristicWrite(BluetoothDevice device, int requestId,
- BluetoothGattCharacteristic characteristic, boolean preparedWrite, boolean
- responseNeeded, int offset, byte[] value);
-
- /**
- * Triggered when this BleService receives a read request from a remote device.
- */
- protected abstract void onCharacteristicRead(BluetoothDevice device,
- int requestId, int offset, final BluetoothGattCharacteristic characteristic);
-
-}
diff --git a/car-cluster-logging-renderer/Android.mk b/car-cluster-logging-renderer/Android.mk
index 27b0bbc..0f0435a 100644
--- a/car-cluster-logging-renderer/Android.mk
+++ b/car-cluster-logging-renderer/Android.mk
@@ -32,5 +32,8 @@
LOCAL_JAVA_LIBRARIES += android.car
+LOCAL_STATIC_ANDROID_LIBRARIES += \
+ androidx.car_car-cluster
+
include $(BUILD_PACKAGE)
endif
diff --git a/car-cluster-logging-renderer/AndroidManifest.xml b/car-cluster-logging-renderer/AndroidManifest.xml
index 5fc8d57..81fa46d 100644
--- a/car-cluster-logging-renderer/AndroidManifest.xml
+++ b/car-cluster-logging-renderer/AndroidManifest.xml
@@ -15,8 +15,14 @@
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="android.car.cluster.loggingrenderer"
+ android:sharedUserId="android.uid.system"
android:versionCode="1"
android:versionName="1.0">
+
+ <protected-broadcast android:name="android.car.cluster.NAVIGATION_STATE_UPDATE"/>
+
+ <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS"/>
+
<application android:label="@string/app_name"
android:icon="@drawable/ic_launcher"
android:directBootAware="true"
diff --git a/car-cluster-logging-renderer/res/values-af/strings.xml b/car-cluster-logging-renderer/res/values-af/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-af/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-am/strings.xml b/car-cluster-logging-renderer/res/values-am/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-am/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-ar/strings.xml b/car-cluster-logging-renderer/res/values-ar/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-ar/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-as/strings.xml b/car-cluster-logging-renderer/res/values-as/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-as/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-az/strings.xml b/car-cluster-logging-renderer/res/values-az/strings.xml
new file mode 100644
index 0000000..a3ea5d3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-az/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"ALƏT_KLASTERİ_TƏCHİZATÇISI_GİRİŞİ"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-b+sr+Latn/strings.xml b/car-cluster-logging-renderer/res/values-b+sr+Latn/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-b+sr+Latn/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-be/strings.xml b/car-cluster-logging-renderer/res/values-be/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-be/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-bg/strings.xml b/car-cluster-logging-renderer/res/values-bg/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-bg/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-bn/strings.xml b/car-cluster-logging-renderer/res/values-bn/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-bn/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-bs/strings.xml b/car-cluster-logging-renderer/res/values-bs/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-bs/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-ca/strings.xml b/car-cluster-logging-renderer/res/values-ca/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-ca/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-cs/strings.xml b/car-cluster-logging-renderer/res/values-cs/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-cs/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-da/strings.xml b/car-cluster-logging-renderer/res/values-da/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-da/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-de/strings.xml b/car-cluster-logging-renderer/res/values-de/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-de/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-el/strings.xml b/car-cluster-logging-renderer/res/values-el/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-el/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-en-rAU/strings.xml b/car-cluster-logging-renderer/res/values-en-rAU/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-en-rAU/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-en-rCA/strings.xml b/car-cluster-logging-renderer/res/values-en-rCA/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-en-rCA/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-en-rGB/strings.xml b/car-cluster-logging-renderer/res/values-en-rGB/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-en-rGB/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-en-rIN/strings.xml b/car-cluster-logging-renderer/res/values-en-rIN/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-en-rIN/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-en-rXC/strings.xml b/car-cluster-logging-renderer/res/values-en-rXC/strings.xml
new file mode 100644
index 0000000..9cf17c1
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-en-rXC/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-es-rUS/strings.xml b/car-cluster-logging-renderer/res/values-es-rUS/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-es-rUS/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-es/strings.xml b/car-cluster-logging-renderer/res/values-es/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-es/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-et/strings.xml b/car-cluster-logging-renderer/res/values-et/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-et/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-eu/strings.xml b/car-cluster-logging-renderer/res/values-eu/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-eu/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-fa/strings.xml b/car-cluster-logging-renderer/res/values-fa/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-fa/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-fi/strings.xml b/car-cluster-logging-renderer/res/values-fi/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-fi/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-fr-rCA/strings.xml b/car-cluster-logging-renderer/res/values-fr-rCA/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-fr-rCA/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-fr/strings.xml b/car-cluster-logging-renderer/res/values-fr/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-fr/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-gl/strings.xml b/car-cluster-logging-renderer/res/values-gl/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-gl/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-gu/strings.xml b/car-cluster-logging-renderer/res/values-gu/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-gu/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-hi/strings.xml b/car-cluster-logging-renderer/res/values-hi/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-hi/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-hr/strings.xml b/car-cluster-logging-renderer/res/values-hr/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-hr/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-hu/strings.xml b/car-cluster-logging-renderer/res/values-hu/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-hu/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-hy/strings.xml b/car-cluster-logging-renderer/res/values-hy/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-hy/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-in/strings.xml b/car-cluster-logging-renderer/res/values-in/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-in/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-is/strings.xml b/car-cluster-logging-renderer/res/values-is/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-is/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-it/strings.xml b/car-cluster-logging-renderer/res/values-it/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-it/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-iw/strings.xml b/car-cluster-logging-renderer/res/values-iw/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-iw/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-ja/strings.xml b/car-cluster-logging-renderer/res/values-ja/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-ja/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-ka/strings.xml b/car-cluster-logging-renderer/res/values-ka/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-ka/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-kk/strings.xml b/car-cluster-logging-renderer/res/values-kk/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-kk/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-km/strings.xml b/car-cluster-logging-renderer/res/values-km/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-km/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-kn/strings.xml b/car-cluster-logging-renderer/res/values-kn/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-kn/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-ko/strings.xml b/car-cluster-logging-renderer/res/values-ko/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-ko/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-ky/strings.xml b/car-cluster-logging-renderer/res/values-ky/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-ky/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-lo/strings.xml b/car-cluster-logging-renderer/res/values-lo/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-lo/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-lt/strings.xml b/car-cluster-logging-renderer/res/values-lt/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-lt/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-lv/strings.xml b/car-cluster-logging-renderer/res/values-lv/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-lv/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-mk/strings.xml b/car-cluster-logging-renderer/res/values-mk/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-mk/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-ml/strings.xml b/car-cluster-logging-renderer/res/values-ml/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-ml/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-mn/strings.xml b/car-cluster-logging-renderer/res/values-mn/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-mn/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-mr/strings.xml b/car-cluster-logging-renderer/res/values-mr/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-mr/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-ms/strings.xml b/car-cluster-logging-renderer/res/values-ms/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-ms/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-my/strings.xml b/car-cluster-logging-renderer/res/values-my/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-my/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-nb/strings.xml b/car-cluster-logging-renderer/res/values-nb/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-nb/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-ne/strings.xml b/car-cluster-logging-renderer/res/values-ne/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-ne/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-nl/strings.xml b/car-cluster-logging-renderer/res/values-nl/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-nl/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-or/strings.xml b/car-cluster-logging-renderer/res/values-or/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-or/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-pa/strings.xml b/car-cluster-logging-renderer/res/values-pa/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-pa/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-pl/strings.xml b/car-cluster-logging-renderer/res/values-pl/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-pl/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-pt-rPT/strings.xml b/car-cluster-logging-renderer/res/values-pt-rPT/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-pt-rPT/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-pt/strings.xml b/car-cluster-logging-renderer/res/values-pt/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-pt/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-ro/strings.xml b/car-cluster-logging-renderer/res/values-ro/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-ro/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-ru/strings.xml b/car-cluster-logging-renderer/res/values-ru/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-ru/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-si/strings.xml b/car-cluster-logging-renderer/res/values-si/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-si/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-sk/strings.xml b/car-cluster-logging-renderer/res/values-sk/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-sk/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-sl/strings.xml b/car-cluster-logging-renderer/res/values-sl/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-sl/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-sq/strings.xml b/car-cluster-logging-renderer/res/values-sq/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-sq/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-sr/strings.xml b/car-cluster-logging-renderer/res/values-sr/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-sr/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-sv/strings.xml b/car-cluster-logging-renderer/res/values-sv/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-sv/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-sw/strings.xml b/car-cluster-logging-renderer/res/values-sw/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-sw/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-ta/strings.xml b/car-cluster-logging-renderer/res/values-ta/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-ta/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-te/strings.xml b/car-cluster-logging-renderer/res/values-te/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-te/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-th/strings.xml b/car-cluster-logging-renderer/res/values-th/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-th/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-tl/strings.xml b/car-cluster-logging-renderer/res/values-tl/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-tl/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-tr/strings.xml b/car-cluster-logging-renderer/res/values-tr/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-tr/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-uk/strings.xml b/car-cluster-logging-renderer/res/values-uk/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-uk/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-ur/strings.xml b/car-cluster-logging-renderer/res/values-ur/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-ur/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-uz/strings.xml b/car-cluster-logging-renderer/res/values-uz/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-uz/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-vi/strings.xml b/car-cluster-logging-renderer/res/values-vi/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-vi/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-zh-rCN/strings.xml b/car-cluster-logging-renderer/res/values-zh-rCN/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-zh-rCN/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-zh-rHK/strings.xml b/car-cluster-logging-renderer/res/values-zh-rHK/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-zh-rHK/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-zh-rTW/strings.xml b/car-cluster-logging-renderer/res/values-zh-rTW/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-zh-rTW/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/res/values-zu/strings.xml b/car-cluster-logging-renderer/res/values-zu/strings.xml
new file mode 100644
index 0000000..daa61a3
--- /dev/null
+++ b/car-cluster-logging-renderer/res/values-zu/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="8762201061451645291">"LOGGING_INSTRUMENT_CLUSTER_RENDERER"</string>
+</resources>
diff --git a/car-cluster-logging-renderer/src/android/car/cluster/loggingrenderer/LoggingClusterRenderingService.java b/car-cluster-logging-renderer/src/android/car/cluster/loggingrenderer/LoggingClusterRenderingService.java
index 381b7ee..c42ea5e 100644
--- a/car-cluster-logging-renderer/src/android/car/cluster/loggingrenderer/LoggingClusterRenderingService.java
+++ b/car-cluster-logging-renderer/src/android/car/cluster/loggingrenderer/LoggingClusterRenderingService.java
@@ -18,20 +18,26 @@
import android.car.cluster.renderer.InstrumentClusterRenderingService;
import android.car.cluster.renderer.NavigationRenderer;
import android.car.navigation.CarNavigationInstrumentCluster;
-import android.graphics.Bitmap;
+import android.content.Intent;
import android.os.Bundle;
+import android.os.UserHandle;
import android.util.Log;
+
+import androidx.car.cluster.navigation.NavigationState;
+import androidx.versionedparcelable.ParcelUtils;
+
import com.google.android.collect.Lists;
/**
* Dummy implementation of {@link LoggingClusterRenderingService} to log all interaction.
*/
public class LoggingClusterRenderingService extends InstrumentClusterRenderingService {
-
private static final String TAG = LoggingClusterRenderingService.class.getSimpleName();
+ private static final String NAV_STATE_BUNDLE_KEY = "navstate";
+ private static final int NAV_STATE_EVENT_ID = 1;
@Override
- protected NavigationRenderer getNavigationRenderer() {
+ public NavigationRenderer getNavigationRenderer() {
NavigationRenderer navigationRenderer = new NavigationRenderer() {
@Override
public CarNavigationInstrumentCluster getNavigationProperties() {
@@ -45,7 +51,26 @@
@Override
public void onEvent(int eventType, Bundle bundle) {
- Log.i(TAG, "onEvent, eventType: " + eventType + ", bundle: " + bundle);
+ StringBuilder bundleSummary = new StringBuilder();
+ if (eventType == NAV_STATE_EVENT_ID) {
+ bundle.setClassLoader(ParcelUtils.class.getClassLoader());
+ NavigationState navState = NavigationState
+ .fromParcelable(bundle.getParcelable(NAV_STATE_BUNDLE_KEY));
+ bundleSummary.append(navState.toString());
+
+ // Sending broadcast for testing.
+ Intent intent = new Intent("android.car.cluster.NAVIGATION_STATE_UPDATE");
+ intent.putExtra(NAV_STATE_BUNDLE_KEY, bundle);
+ sendBroadcastAsUser(intent, UserHandle.ALL);
+ } else {
+ for (String key : bundle.keySet()) {
+ bundleSummary.append(key);
+ bundleSummary.append("=");
+ bundleSummary.append(bundle.get(key));
+ bundleSummary.append(" ");
+ }
+ }
+ Log.i(TAG, "onEvent(" + eventType + ", " + bundleSummary + ")");
}
};
diff --git a/car-default-input-service/res/values-af/strings.xml b/car-default-input-service/res/values-af/strings.xml
new file mode 100644
index 0000000..9e4a530
--- /dev/null
+++ b/car-default-input-service/res/values-af/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Motorverstekinvoerdiens"</string>
+</resources>
diff --git a/car-default-input-service/res/values-am/strings.xml b/car-default-input-service/res/values-am/strings.xml
new file mode 100644
index 0000000..ae59586
--- /dev/null
+++ b/car-default-input-service/res/values-am/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"የመኪና ነባሪ ግቤት አገልግሎት"</string>
+</resources>
diff --git a/car-default-input-service/res/values-ar/strings.xml b/car-default-input-service/res/values-ar/strings.xml
new file mode 100644
index 0000000..68913eb
--- /dev/null
+++ b/car-default-input-service/res/values-ar/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"جهاز الإدخال التلقائي في السيارة"</string>
+</resources>
diff --git a/car-default-input-service/res/values-as/strings.xml b/car-default-input-service/res/values-as/strings.xml
new file mode 100644
index 0000000..c6f29f6
--- /dev/null
+++ b/car-default-input-service/res/values-as/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"গাড়ীৰ ডিফ’ল্ট ইনপুট সেৱা"</string>
+</resources>
diff --git a/car-default-input-service/res/values-az/strings.xml b/car-default-input-service/res/values-az/strings.xml
new file mode 100644
index 0000000..e73948d
--- /dev/null
+++ b/car-default-input-service/res/values-az/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Avtomobilin Defolt Daxiletmə Xidməti"</string>
+</resources>
diff --git a/car-default-input-service/res/values-b+sr+Latn/strings.xml b/car-default-input-service/res/values-b+sr+Latn/strings.xml
new file mode 100644
index 0000000..2ded12d
--- /dev/null
+++ b/car-default-input-service/res/values-b+sr+Latn/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Podrazumevana usluga za unos za automobil"</string>
+</resources>
diff --git a/car-default-input-service/res/values-be/strings.xml b/car-default-input-service/res/values-be/strings.xml
new file mode 100644
index 0000000..c746e66
--- /dev/null
+++ b/car-default-input-service/res/values-be/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Стандартны сэрвіс падачы звестак пра аўтамабіль"</string>
+</resources>
diff --git a/car-default-input-service/res/values-bg/strings.xml b/car-default-input-service/res/values-bg/strings.xml
new file mode 100644
index 0000000..90a25e9
--- /dev/null
+++ b/car-default-input-service/res/values-bg/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Стандартна автомобилна услуга за входящи данни"</string>
+</resources>
diff --git a/car-default-input-service/res/values-bn/strings.xml b/car-default-input-service/res/values-bn/strings.xml
new file mode 100644
index 0000000..57671f3
--- /dev/null
+++ b/car-default-input-service/res/values-bn/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"গাড়ির ডিফল্ট ইনপুট সার্ভিস"</string>
+</resources>
diff --git a/car-default-input-service/res/values-bs/strings.xml b/car-default-input-service/res/values-bs/strings.xml
new file mode 100644
index 0000000..9d95f59
--- /dev/null
+++ b/car-default-input-service/res/values-bs/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Zadana usluga unosa za automobil"</string>
+</resources>
diff --git a/car-default-input-service/res/values-ca/strings.xml b/car-default-input-service/res/values-ca/strings.xml
new file mode 100644
index 0000000..66e84c7
--- /dev/null
+++ b/car-default-input-service/res/values-ca/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Servei d\'entrada predeterminat del cotxe"</string>
+</resources>
diff --git a/car-default-input-service/res/values-cs/strings.xml b/car-default-input-service/res/values-cs/strings.xml
new file mode 100644
index 0000000..36cfaf5
--- /dev/null
+++ b/car-default-input-service/res/values-cs/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Služba výchozího vstupu auta"</string>
+</resources>
diff --git a/car-default-input-service/res/values-da/strings.xml b/car-default-input-service/res/values-da/strings.xml
new file mode 100644
index 0000000..4be4f5a
--- /dev/null
+++ b/car-default-input-service/res/values-da/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Bilens standardtjeneste til input"</string>
+</resources>
diff --git a/car-default-input-service/res/values-de/strings.xml b/car-default-input-service/res/values-de/strings.xml
new file mode 100644
index 0000000..ae1e6b8
--- /dev/null
+++ b/car-default-input-service/res/values-de/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Standard-Eingabedienst für das Auto"</string>
+</resources>
diff --git a/car-default-input-service/res/values-el/strings.xml b/car-default-input-service/res/values-el/strings.xml
new file mode 100644
index 0000000..4862a37
--- /dev/null
+++ b/car-default-input-service/res/values-el/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Προεπιλεγμένη υπηρεσία εισόδου αυτοκινήτου"</string>
+</resources>
diff --git a/car-default-input-service/res/values-en-rAU/strings.xml b/car-default-input-service/res/values-en-rAU/strings.xml
new file mode 100644
index 0000000..af9019f
--- /dev/null
+++ b/car-default-input-service/res/values-en-rAU/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Car default input service"</string>
+</resources>
diff --git a/car-default-input-service/res/values-en-rCA/strings.xml b/car-default-input-service/res/values-en-rCA/strings.xml
new file mode 100644
index 0000000..af9019f
--- /dev/null
+++ b/car-default-input-service/res/values-en-rCA/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Car default input service"</string>
+</resources>
diff --git a/car-default-input-service/res/values-en-rGB/strings.xml b/car-default-input-service/res/values-en-rGB/strings.xml
new file mode 100644
index 0000000..af9019f
--- /dev/null
+++ b/car-default-input-service/res/values-en-rGB/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Car default input service"</string>
+</resources>
diff --git a/car-default-input-service/res/values-en-rIN/strings.xml b/car-default-input-service/res/values-en-rIN/strings.xml
new file mode 100644
index 0000000..af9019f
--- /dev/null
+++ b/car-default-input-service/res/values-en-rIN/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Car default input service"</string>
+</resources>
diff --git a/car-default-input-service/res/values-en-rXC/strings.xml b/car-default-input-service/res/values-en-rXC/strings.xml
new file mode 100644
index 0000000..34272f4
--- /dev/null
+++ b/car-default-input-service/res/values-en-rXC/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Car Default Input Service"</string>
+</resources>
diff --git a/car-default-input-service/res/values-es-rUS/strings.xml b/car-default-input-service/res/values-es-rUS/strings.xml
new file mode 100644
index 0000000..d11e509
--- /dev/null
+++ b/car-default-input-service/res/values-es-rUS/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Servicio de entrada predeterminado del auto"</string>
+</resources>
diff --git a/car-default-input-service/res/values-es/strings.xml b/car-default-input-service/res/values-es/strings.xml
new file mode 100644
index 0000000..4aa109a
--- /dev/null
+++ b/car-default-input-service/res/values-es/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Servicio de entrada predeterminado del coche"</string>
+</resources>
diff --git a/car-default-input-service/res/values-et/strings.xml b/car-default-input-service/res/values-et/strings.xml
new file mode 100644
index 0000000..c60ddc8
--- /dev/null
+++ b/car-default-input-service/res/values-et/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Auto vaikesisendteenus"</string>
+</resources>
diff --git a/car-default-input-service/res/values-eu/strings.xml b/car-default-input-service/res/values-eu/strings.xml
new file mode 100644
index 0000000..8825af2
--- /dev/null
+++ b/car-default-input-service/res/values-eu/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Autoaren sarrerako zerbitzu lehenetsia"</string>
+</resources>
diff --git a/car-default-input-service/res/values-fa/strings.xml b/car-default-input-service/res/values-fa/strings.xml
new file mode 100644
index 0000000..72dda79
--- /dev/null
+++ b/car-default-input-service/res/values-fa/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"سرویس ورودی پیشفرض خودرو"</string>
+</resources>
diff --git a/car-default-input-service/res/values-fi/strings.xml b/car-default-input-service/res/values-fi/strings.xml
new file mode 100644
index 0000000..0b06f9a
--- /dev/null
+++ b/car-default-input-service/res/values-fi/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Auton oletussyötepalvelu"</string>
+</resources>
diff --git a/car-default-input-service/res/values-fr-rCA/strings.xml b/car-default-input-service/res/values-fr-rCA/strings.xml
new file mode 100644
index 0000000..b8f4d61
--- /dev/null
+++ b/car-default-input-service/res/values-fr-rCA/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Service d\'entrée par défaut de la voiture"</string>
+</resources>
diff --git a/car-default-input-service/res/values-fr/strings.xml b/car-default-input-service/res/values-fr/strings.xml
new file mode 100644
index 0000000..b8f4d61
--- /dev/null
+++ b/car-default-input-service/res/values-fr/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Service d\'entrée par défaut de la voiture"</string>
+</resources>
diff --git a/car-default-input-service/res/values-gl/strings.xml b/car-default-input-service/res/values-gl/strings.xml
new file mode 100644
index 0000000..161e467
--- /dev/null
+++ b/car-default-input-service/res/values-gl/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Servizo de entrada predeterminado do coche"</string>
+</resources>
diff --git a/car-default-input-service/res/values-gu/strings.xml b/car-default-input-service/res/values-gu/strings.xml
new file mode 100644
index 0000000..9b92e28
--- /dev/null
+++ b/car-default-input-service/res/values-gu/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"કારની ડિફૉલ્ટ ઇનપુટ સેવા"</string>
+</resources>
diff --git a/car-default-input-service/res/values-hi/strings.xml b/car-default-input-service/res/values-hi/strings.xml
new file mode 100644
index 0000000..01ea8b9
--- /dev/null
+++ b/car-default-input-service/res/values-hi/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"कार की डिफ़ॉल्ट इनपुट सेवा"</string>
+</resources>
diff --git a/car-default-input-service/res/values-hr/strings.xml b/car-default-input-service/res/values-hr/strings.xml
new file mode 100644
index 0000000..5b1a689
--- /dev/null
+++ b/car-default-input-service/res/values-hr/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Zadana usluga za unos za automobil"</string>
+</resources>
diff --git a/car-default-input-service/res/values-hu/strings.xml b/car-default-input-service/res/values-hu/strings.xml
new file mode 100644
index 0000000..0a34bd1
--- /dev/null
+++ b/car-default-input-service/res/values-hu/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Az autó alapértelmezett beviteli szolgáltatása"</string>
+</resources>
diff --git a/car-default-input-service/res/values-hy/strings.xml b/car-default-input-service/res/values-hy/strings.xml
new file mode 100644
index 0000000..12ad35f
--- /dev/null
+++ b/car-default-input-service/res/values-hy/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Կանխադրված ներածման ծառայություն"</string>
+</resources>
diff --git a/car-default-input-service/res/values-in/strings.xml b/car-default-input-service/res/values-in/strings.xml
new file mode 100644
index 0000000..972b48c
--- /dev/null
+++ b/car-default-input-service/res/values-in/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Layanan Masukan Default Mobil"</string>
+</resources>
diff --git a/car-default-input-service/res/values-is/strings.xml b/car-default-input-service/res/values-is/strings.xml
new file mode 100644
index 0000000..016d25d
--- /dev/null
+++ b/car-default-input-service/res/values-is/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Sjálfgefin inntaksþjónusta bílsins"</string>
+</resources>
diff --git a/car-default-input-service/res/values-it/strings.xml b/car-default-input-service/res/values-it/strings.xml
new file mode 100644
index 0000000..28f1b85
--- /dev/null
+++ b/car-default-input-service/res/values-it/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Servizio di input predefinito dell\'automobile"</string>
+</resources>
diff --git a/car-default-input-service/res/values-iw/strings.xml b/car-default-input-service/res/values-iw/strings.xml
new file mode 100644
index 0000000..003e9e4
--- /dev/null
+++ b/car-default-input-service/res/values-iw/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"ברירת המחדל של שירות הקלט ברכב"</string>
+</resources>
diff --git a/car-default-input-service/res/values-ja/strings.xml b/car-default-input-service/res/values-ja/strings.xml
new file mode 100644
index 0000000..e5714de
--- /dev/null
+++ b/car-default-input-service/res/values-ja/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"車のデフォルト入力サービス"</string>
+</resources>
diff --git a/car-default-input-service/res/values-ka/strings.xml b/car-default-input-service/res/values-ka/strings.xml
new file mode 100644
index 0000000..f389138
--- /dev/null
+++ b/car-default-input-service/res/values-ka/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"მანქანის შეყვანის ნაგულისხმევი სერვისი"</string>
+</resources>
diff --git a/car-default-input-service/res/values-kk/strings.xml b/car-default-input-service/res/values-kk/strings.xml
new file mode 100644
index 0000000..7812059
--- /dev/null
+++ b/car-default-input-service/res/values-kk/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Көліктің деректерді енгізуге арналған әдепкі қызметі"</string>
+</resources>
diff --git a/car-default-input-service/res/values-km/strings.xml b/car-default-input-service/res/values-km/strings.xml
new file mode 100644
index 0000000..a90d8d9
--- /dev/null
+++ b/car-default-input-service/res/values-km/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"សេវាកម្មបញ្ចូលលំនាំដើមរបស់រថយន្ត"</string>
+</resources>
diff --git a/car-default-input-service/res/values-kn/strings.xml b/car-default-input-service/res/values-kn/strings.xml
new file mode 100644
index 0000000..54d48ac
--- /dev/null
+++ b/car-default-input-service/res/values-kn/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"ಕಾರಿನ ಪೂರ್ವನಿಯೋಜಿತ ಇನ್ಪುಟ್ ಸೇವೆ"</string>
+</resources>
diff --git a/car-default-input-service/res/values-ko/strings.xml b/car-default-input-service/res/values-ko/strings.xml
new file mode 100644
index 0000000..83e175a
--- /dev/null
+++ b/car-default-input-service/res/values-ko/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"차량 기본 입력 서비스"</string>
+</resources>
diff --git a/car-default-input-service/res/values-ky/strings.xml b/car-default-input-service/res/values-ky/strings.xml
new file mode 100644
index 0000000..6680e95
--- /dev/null
+++ b/car-default-input-service/res/values-ky/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Унааны демейки киргизүү кызматы"</string>
+</resources>
diff --git a/car-default-input-service/res/values-lo/strings.xml b/car-default-input-service/res/values-lo/strings.xml
new file mode 100644
index 0000000..ac2e6ca
--- /dev/null
+++ b/car-default-input-service/res/values-lo/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"ການບໍລິການປ້ອນຂໍ້ມູນເລີ່ມຕົ້ນຂອງລົດ"</string>
+</resources>
diff --git a/car-default-input-service/res/values-lt/strings.xml b/car-default-input-service/res/values-lt/strings.xml
new file mode 100644
index 0000000..efe7e70
--- /dev/null
+++ b/car-default-input-service/res/values-lt/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Numatytoji automobilio įvesties paslauga"</string>
+</resources>
diff --git a/car-default-input-service/res/values-lv/strings.xml b/car-default-input-service/res/values-lv/strings.xml
new file mode 100644
index 0000000..d20025d
--- /dev/null
+++ b/car-default-input-service/res/values-lv/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Automašīnas noklusējuma ieejas pakalpojums"</string>
+</resources>
diff --git a/car-default-input-service/res/values-mk/strings.xml b/car-default-input-service/res/values-mk/strings.xml
new file mode 100644
index 0000000..53436c2
--- /dev/null
+++ b/car-default-input-service/res/values-mk/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Стандардна влезна услуга на автомобилот"</string>
+</resources>
diff --git a/car-default-input-service/res/values-ml/strings.xml b/car-default-input-service/res/values-ml/strings.xml
new file mode 100644
index 0000000..1b1cc07
--- /dev/null
+++ b/car-default-input-service/res/values-ml/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"കാറിന്റെ ഡിഫോൾട്ട് ഇൻപുട്ട് സേവനം"</string>
+</resources>
diff --git a/car-default-input-service/res/values-mn/strings.xml b/car-default-input-service/res/values-mn/strings.xml
new file mode 100644
index 0000000..9ab8342
--- /dev/null
+++ b/car-default-input-service/res/values-mn/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Машины өгөгдмөл оролтын үйлчилгээ"</string>
+</resources>
diff --git a/car-default-input-service/res/values-mr/strings.xml b/car-default-input-service/res/values-mr/strings.xml
new file mode 100644
index 0000000..5029612
--- /dev/null
+++ b/car-default-input-service/res/values-mr/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"कार डीफॉल्ट इनपुट सेवा"</string>
+</resources>
diff --git a/car-default-input-service/res/values-ms/strings.xml b/car-default-input-service/res/values-ms/strings.xml
new file mode 100644
index 0000000..663d3ce
--- /dev/null
+++ b/car-default-input-service/res/values-ms/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Perkhidmatan Input Lalai Kereta"</string>
+</resources>
diff --git a/car-default-input-service/res/values-my/strings.xml b/car-default-input-service/res/values-my/strings.xml
new file mode 100644
index 0000000..86102bd
--- /dev/null
+++ b/car-default-input-service/res/values-my/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"ကား၏ မူလအချက်အလက်ထည့်သွင်းခြင်း ဝန်ဆောင်မှု"</string>
+</resources>
diff --git a/car-default-input-service/res/values-nb/strings.xml b/car-default-input-service/res/values-nb/strings.xml
new file mode 100644
index 0000000..293740f
--- /dev/null
+++ b/car-default-input-service/res/values-nb/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Bilens standard inndatatjeneste"</string>
+</resources>
diff --git a/car-default-input-service/res/values-ne/strings.xml b/car-default-input-service/res/values-ne/strings.xml
new file mode 100644
index 0000000..3330c5c
--- /dev/null
+++ b/car-default-input-service/res/values-ne/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"कारको पूर्वनिर्धारित इनपुट सेवा"</string>
+</resources>
diff --git a/car-default-input-service/res/values-nl/strings.xml b/car-default-input-service/res/values-nl/strings.xml
new file mode 100644
index 0000000..04de244
--- /dev/null
+++ b/car-default-input-service/res/values-nl/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Standaard invoerservice voor auto"</string>
+</resources>
diff --git a/car-default-input-service/res/values-or/strings.xml b/car-default-input-service/res/values-or/strings.xml
new file mode 100644
index 0000000..cf56e1a
--- /dev/null
+++ b/car-default-input-service/res/values-or/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"କାର୍ର ଡିଫଲ୍ଟ ଇନ୍ପୁଟ୍ ସେବା"</string>
+</resources>
diff --git a/car-default-input-service/res/values-pa/strings.xml b/car-default-input-service/res/values-pa/strings.xml
new file mode 100644
index 0000000..c4ee5cb
--- /dev/null
+++ b/car-default-input-service/res/values-pa/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"ਕਾਰ ਦੀ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਇਨਪੁੱਟ ਸੇਵਾ"</string>
+</resources>
diff --git a/car-default-input-service/res/values-pl/strings.xml b/car-default-input-service/res/values-pl/strings.xml
new file mode 100644
index 0000000..2e80e13
--- /dev/null
+++ b/car-default-input-service/res/values-pl/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Domyślna usługa wprowadzania danych w samochodzie"</string>
+</resources>
diff --git a/car-default-input-service/res/values-pt-rPT/strings.xml b/car-default-input-service/res/values-pt-rPT/strings.xml
new file mode 100644
index 0000000..0887bdc
--- /dev/null
+++ b/car-default-input-service/res/values-pt-rPT/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Serviço de entrada predefinido do automóvel"</string>
+</resources>
diff --git a/car-default-input-service/res/values-pt/strings.xml b/car-default-input-service/res/values-pt/strings.xml
new file mode 100644
index 0000000..9325384
--- /dev/null
+++ b/car-default-input-service/res/values-pt/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Serviço de entrada padrão do carro"</string>
+</resources>
diff --git a/car-default-input-service/res/values-ro/strings.xml b/car-default-input-service/res/values-ro/strings.xml
new file mode 100644
index 0000000..40a0a1d
--- /dev/null
+++ b/car-default-input-service/res/values-ro/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Serviciul prestabilit de intrare din mașină"</string>
+</resources>
diff --git a/car-default-input-service/res/values-ru/strings.xml b/car-default-input-service/res/values-ru/strings.xml
new file mode 100644
index 0000000..42aeec3
--- /dev/null
+++ b/car-default-input-service/res/values-ru/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Служба ввода по умолчанию"</string>
+</resources>
diff --git a/car-default-input-service/res/values-si/strings.xml b/car-default-input-service/res/values-si/strings.xml
new file mode 100644
index 0000000..53f62e2
--- /dev/null
+++ b/car-default-input-service/res/values-si/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"මෝටර් රථ පෙරනිමි ආදාන සේවය"</string>
+</resources>
diff --git a/car-default-input-service/res/values-sk/strings.xml b/car-default-input-service/res/values-sk/strings.xml
new file mode 100644
index 0000000..deb945a
--- /dev/null
+++ b/car-default-input-service/res/values-sk/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Predvolená služba vstupu v aute"</string>
+</resources>
diff --git a/car-default-input-service/res/values-sl/strings.xml b/car-default-input-service/res/values-sl/strings.xml
new file mode 100644
index 0000000..d24431d
--- /dev/null
+++ b/car-default-input-service/res/values-sl/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Privzeta vhodna storitev avtomobila"</string>
+</resources>
diff --git a/car-default-input-service/res/values-sq/strings.xml b/car-default-input-service/res/values-sq/strings.xml
new file mode 100644
index 0000000..1b0c1e2
--- /dev/null
+++ b/car-default-input-service/res/values-sq/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Shërbimi i parazgjedhur i hyrjes për makinën"</string>
+</resources>
diff --git a/car-default-input-service/res/values-sr/strings.xml b/car-default-input-service/res/values-sr/strings.xml
new file mode 100644
index 0000000..38620a4
--- /dev/null
+++ b/car-default-input-service/res/values-sr/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Подразумевана услуга за унос за аутомобил"</string>
+</resources>
diff --git a/car-default-input-service/res/values-sv/strings.xml b/car-default-input-service/res/values-sv/strings.xml
new file mode 100644
index 0000000..cde5fba
--- /dev/null
+++ b/car-default-input-service/res/values-sv/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Bilens standardtjänst för indata"</string>
+</resources>
diff --git a/car-default-input-service/res/values-sw/strings.xml b/car-default-input-service/res/values-sw/strings.xml
new file mode 100644
index 0000000..ce99a71
--- /dev/null
+++ b/car-default-input-service/res/values-sw/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Huduma Chaguomsingi ya Kuweka Data ya Gari"</string>
+</resources>
diff --git a/car-default-input-service/res/values-ta/strings.xml b/car-default-input-service/res/values-ta/strings.xml
new file mode 100644
index 0000000..c93e2e4
--- /dev/null
+++ b/car-default-input-service/res/values-ta/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"காருக்கு உற்பத்தியாளர் வழங்கும் சேவை"</string>
+</resources>
diff --git a/car-default-input-service/res/values-te/strings.xml b/car-default-input-service/res/values-te/strings.xml
new file mode 100644
index 0000000..ffd4acf
--- /dev/null
+++ b/car-default-input-service/res/values-te/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"కారు డిఫాల్ట్ ఇన్పుట్ సేవ"</string>
+</resources>
diff --git a/car-default-input-service/res/values-th/strings.xml b/car-default-input-service/res/values-th/strings.xml
new file mode 100644
index 0000000..c28d29a
--- /dev/null
+++ b/car-default-input-service/res/values-th/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"บริการป้อนข้อมูลเริ่มต้นของรถ"</string>
+</resources>
diff --git a/car-default-input-service/res/values-tl/strings.xml b/car-default-input-service/res/values-tl/strings.xml
new file mode 100644
index 0000000..b9ae49d
--- /dev/null
+++ b/car-default-input-service/res/values-tl/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Default na Serbisyo sa Input ng Sasakyan"</string>
+</resources>
diff --git a/car-default-input-service/res/values-tr/strings.xml b/car-default-input-service/res/values-tr/strings.xml
new file mode 100644
index 0000000..72f7f26
--- /dev/null
+++ b/car-default-input-service/res/values-tr/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Araç Varsayılan Giriş Hizmeti"</string>
+</resources>
diff --git a/car-default-input-service/res/values-uk/strings.xml b/car-default-input-service/res/values-uk/strings.xml
new file mode 100644
index 0000000..e8d1526
--- /dev/null
+++ b/car-default-input-service/res/values-uk/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Стандартний сервіс даних про вхідні події автомобіля"</string>
+</resources>
diff --git a/car-default-input-service/res/values-ur/strings.xml b/car-default-input-service/res/values-ur/strings.xml
new file mode 100644
index 0000000..a0e1ac0
--- /dev/null
+++ b/car-default-input-service/res/values-ur/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"کار کی ڈیفالٹ ان پٹ سروس"</string>
+</resources>
diff --git a/car-default-input-service/res/values-uz/strings.xml b/car-default-input-service/res/values-uz/strings.xml
new file mode 100644
index 0000000..416cc94
--- /dev/null
+++ b/car-default-input-service/res/values-uz/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Standart matn kiritish xizmati"</string>
+</resources>
diff --git a/car-default-input-service/res/values-vi/strings.xml b/car-default-input-service/res/values-vi/strings.xml
new file mode 100644
index 0000000..9c28716
--- /dev/null
+++ b/car-default-input-service/res/values-vi/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Dịch vụ nhập mặc định trên ô tô"</string>
+</resources>
diff --git a/car-default-input-service/res/values-zh-rCN/strings.xml b/car-default-input-service/res/values-zh-rCN/strings.xml
new file mode 100644
index 0000000..9c6f615
--- /dev/null
+++ b/car-default-input-service/res/values-zh-rCN/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"汽车默认输入服务"</string>
+</resources>
diff --git a/car-default-input-service/res/values-zh-rHK/strings.xml b/car-default-input-service/res/values-zh-rHK/strings.xml
new file mode 100644
index 0000000..7ad2fd3
--- /dev/null
+++ b/car-default-input-service/res/values-zh-rHK/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"汽車預設輸入服務"</string>
+</resources>
diff --git a/car-default-input-service/res/values-zh-rTW/strings.xml b/car-default-input-service/res/values-zh-rTW/strings.xml
new file mode 100644
index 0000000..df86715
--- /dev/null
+++ b/car-default-input-service/res/values-zh-rTW/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"車輛預設輸入服務"</string>
+</resources>
diff --git a/car-default-input-service/res/values-zu/strings.xml b/car-default-input-service/res/values-zu/strings.xml
new file mode 100644
index 0000000..5b5e99e
--- /dev/null
+++ b/car-default-input-service/res/values-zu/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="2732799531977169961">"Isevisi yokufaka ezenzakalelayo yemoto"</string>
+</resources>
diff --git a/car-lib/Android.bp b/car-lib/Android.bp
index 956ff70..1d887fa 100644
--- a/car-lib/Android.bp
+++ b/car-lib/Android.bp
@@ -109,13 +109,24 @@
],
}
+genrule {
+ name: "android-car-last-released-test-api",
+ srcs: [
+ "api/test-released/*.txt",
+ ],
+ cmd: "cp -f $$(echo $(in) | tr \" \" \"\\n\" | sort -n | tail -1) $(genDir)/last-released-test-api.txt",
+ out: [
+ "last-released-test-api.txt",
+ ],
+}
+
droidstubs {
name: "android.car-stubs-docs",
defaults: ["android.car-docs-default"],
api_tag_name: "ANDROID_CAR",
api_filename: "api.txt",
removed_api_filename: "removed.txt",
- args: "--hide DeprecationMismatch --hide UnavailableSymbol --hide UnhiddenSystemApi --hide HiddenTypedefConstant --hide ReferencesHidden --no-docs --stub-packages android.car* ",
+ args: "--hide UnavailableSymbol --no-docs --stub-packages android.car* ",
installable: false,
check_api: {
last_released: {
@@ -141,7 +152,7 @@
api_tag_name: "ANDROID_CAR_SYSTEM",
api_filename: "api.txt",
removed_api_filename: "removed.txt",
- args: "--hide DeprecationMismatch --hide UnavailableSymbol --hide UnhiddenSystemApi --hide HiddenTypedefConstant --hide ReferencesHidden --no-docs --stub-packages android.car* " +
+ args: "--hide UnavailableSymbol --no-docs --stub-packages android.car* " +
"--show-annotation android.annotation.SystemApi ",
installable: false,
check_api: {
@@ -163,6 +174,26 @@
}
droidstubs {
+ name: "android.car-test-stubs-docs",
+ defaults: ["android.car-docs-default"],
+ api_tag_name: "ANDROID_CAR_SYSTEM",
+ api_filename: "api.txt",
+ removed_api_filename: "removed.txt",
+ args: "--hide UnavailableSymbol --no-docs --stub-packages android.car* " +
+ "--show-annotation android.annotation.TestApi ",
+ installable: false,
+ check_api: {
+ current: {
+ api_file: "api/test-current.txt",
+ removed_api_file: "api/test-removed.txt",
+ args: " -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 -hide 113 ",
+ },
+ },
+}
+
+droidstubs {
name: "android.car-stub-docs",
srcs: [
"src/**/*.java",
@@ -172,7 +203,7 @@
],
api_tag_name: "ANDROID_CAR_STUB",
api_filename: "api.txt",
- args: "--hide DeprecationMismatch --hide UnavailableSymbol --hide UnhiddenSystemApi --hide HiddenTypedefConstant --hide ReferencesHidden --no-docs --stub-packages android.car* ",
+ args: "--hide UnavailableSymbol --no-docs --stub-packages android.car* ",
installable: false,
product_variables: {
pdk: {
@@ -212,3 +243,19 @@
},
compile_dex: true,
}
+
+java_library_static {
+ name: "android.car-test-stubs",
+ srcs: [
+ ":android.car-test-stubs-docs",
+ ],
+ libs: [
+ "android.car",
+ ],
+ product_variables: {
+ pdk: {
+ enabled: false,
+ },
+ },
+ compile_dex: true,
+}
diff --git a/car-lib/api/baseline.txt b/car-lib/api/baseline.txt
new file mode 100644
index 0000000..16e4b7b
--- /dev/null
+++ b/car-lib/api/baseline.txt
@@ -0,0 +1,41 @@
+// Baseline format: 1.0
+HiddenTypeParameter: android.car.hardware.CarSensorManager#getPropertyList():
+ Method android.car.hardware.CarSensorManager.getPropertyList() references hidden type class android.car.hardware.CarPropertyConfig.
+HiddenTypeParameter: android.car.navigation.CarNavigationStatusManager#getInstrumentClusterInfo():
+ Method android.car.navigation.CarNavigationStatusManager.getInstrumentClusterInfo() references hidden type android.car.navigation.CarNavigationInstrumentCluster.
+
+
+HiddenTypedefConstant: android.car.CarInfoManager#getEvConnectorTypes():
+ Typedef references constant which isn't part of the API, skipping in documentation: android.car.EvConnectorType#UNKNOWN
+HiddenTypedefConstant: android.car.CarInfoManager#getFuelTypes():
+ Typedef references constant which isn't part of the API, skipping in documentation: android.car.FuelType#UNKNOWN
+HiddenTypedefConstant: android.car.hardware.CarSensorManager#getLatestSensorEvent(int) parameter #0:
+ Typedef references constant which isn't part of the API, skipping in documentation: android.car.hardware.CarSensorManager#SENSOR_TYPE_ENGINE_OIL_LEVEL
+HiddenTypedefConstant: android.car.hardware.CarSensorManager#isSensorSupported(int) parameter #0:
+ Typedef references constant which isn't part of the API, skipping in documentation: android.car.hardware.CarSensorManager#SENSOR_TYPE_ENGINE_OIL_LEVEL
+HiddenTypedefConstant: android.car.hardware.CarSensorManager#isSensorSupported(int[], int) parameter #1:
+ Typedef references constant which isn't part of the API, skipping in documentation: android.car.hardware.CarSensorManager#SENSOR_TYPE_ENGINE_OIL_LEVEL
+HiddenTypedefConstant: android.car.hardware.CarSensorManager#registerListener(android.car.hardware.CarSensorManager.OnSensorChangedListener, int, int) parameter #1:
+ Typedef references constant which isn't part of the API, skipping in documentation: android.car.hardware.CarSensorManager#SENSOR_TYPE_ENGINE_OIL_LEVEL
+HiddenTypedefConstant: android.car.hardware.CarSensorManager#unregisterListener(android.car.hardware.CarSensorManager.OnSensorChangedListener, int) parameter #1:
+ Typedef references constant which isn't part of the API, skipping in documentation: android.car.hardware.CarSensorManager#SENSOR_TYPE_ENGINE_OIL_LEVEL
+
+
+ReferencesHidden: android.car.hardware.CarSensorManager#getPropertyList():
+ Class android.car.hardware.CarPropertyConfig is hidden but was referenced (as return type parameter) from public method android.car.hardware.CarSensorManager.getPropertyList()
+ReferencesHidden: android.car.navigation.CarNavigationStatusManager#getInstrumentClusterInfo():
+ Class android.car.navigation.CarNavigationInstrumentCluster is hidden but was referenced (as return type) from public method android.car.navigation.CarNavigationStatusManager.getInstrumentClusterInfo()
+
+
+RequiresPermission: android.car.hardware.CarSensorManager#registerListener(android.car.hardware.CarSensorManager.OnSensorChangedListener, int, int):
+ Method 'registerListener' documentation mentions permissions already declared by @RequiresPermission
+
+
+SdkConstant: android.car.Car#CAR_INTENT_ACTION_MEDIA_TEMPLATE:
+ Field 'CAR_INTENT_ACTION_MEDIA_TEMPLATE' is missing @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
+
+
+Todo: android.car.CarInfoManager#getVehicleId():
+ Documentation mentions 'TODO'
+
+
diff --git a/car-lib/api/current.txt b/car-lib/api/current.txt
index d8f7736..e0b5662 100644
--- a/car-lib/api/current.txt
+++ b/car-lib/api/current.txt
@@ -2,12 +2,14 @@
package android.car {
public final class Car {
- method public void connect() throws java.lang.IllegalStateException;
- method public static android.car.Car createCar(android.content.Context, android.content.ServiceConnection, @Nullable android.os.Handler);
- method public static android.car.Car createCar(android.content.Context, android.content.ServiceConnection);
+ method @Deprecated public void connect() throws java.lang.IllegalStateException;
+ method @Deprecated public static android.car.Car createCar(android.content.Context, android.content.ServiceConnection, @Nullable android.os.Handler);
+ method @Deprecated public static android.car.Car createCar(android.content.Context, android.content.ServiceConnection);
+ method @Nullable public static android.car.Car createCar(android.content.Context);
+ method @Nullable public static android.car.Car createCar(android.content.Context, @Nullable android.os.Handler);
method public void disconnect();
method public int getCarConnectionType();
- method public Object getCarManager(String) throws android.car.CarNotConnectedException;
+ method @Nullable public Object getCarManager(String) throws android.car.CarNotConnectedException;
method public boolean isConnected();
method public boolean isConnecting();
field public static final String APP_FOCUS_SERVICE = "app_focus";
@@ -20,6 +22,7 @@
field public static final int CONNECTION_TYPE_EMBEDDED = 5; // 0x5
field public static final String INFO_SERVICE = "info";
field public static final String PACKAGE_SERVICE = "package";
+ field public static final String PERMISSION_CAR_CONTROL_AUDIO_SETTINGS = "android.car.permission.CAR_CONTROL_AUDIO_SETTINGS";
field public static final String PERMISSION_CAR_CONTROL_AUDIO_VOLUME = "android.car.permission.CAR_CONTROL_AUDIO_VOLUME";
field public static final String PERMISSION_CAR_INFO = "android.car.permission.CAR_INFO";
field public static final String PERMISSION_CAR_NAVIGATION_MANAGER = "android.car.permission.CAR_NAVIGATION_MANAGER";
@@ -410,7 +413,7 @@
method public int[] getSupportedSensors() throws android.car.CarNotConnectedException;
method public boolean isSensorSupported(int) throws android.car.CarNotConnectedException;
method public static boolean isSensorSupported(int[], int);
- method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_FINE_LOCATION, android.car.Car.PERMISSION_SPEED, "android.car.permission.CAR_MILEAGE", android.car.Car.PERMISSION_ENERGY, "android.car.permission.CAR_DYNAMICS_STATE"}, conditional=true) public boolean registerListener(android.car.hardware.CarSensorManager.OnSensorChangedListener, int, int) throws android.car.CarNotConnectedException, java.lang.IllegalArgumentException;
+ method @RequiresPermission(anyOf={android.car.Car.PERMISSION_SPEED, "android.car.permission.CAR_ENGINE_DETAILED", "android.car.permission.CAR_MILEAGE", android.car.Car.PERMISSION_ENERGY, android.car.Car.PERMISSION_POWERTRAIN, android.car.Car.PERMISSION_EXTERIOR_ENVIRONMENT, "android.car.permission.CAR_DYNAMICS_STATE", android.car.Car.PERMISSION_ENERGY_PORTS}, conditional=true) public boolean registerListener(android.car.hardware.CarSensorManager.OnSensorChangedListener, int, int) throws android.car.CarNotConnectedException, java.lang.IllegalArgumentException;
method public void unregisterListener(android.car.hardware.CarSensorManager.OnSensorChangedListener);
method public void unregisterListener(android.car.hardware.CarSensorManager.OnSensorChangedListener, int);
field public static final int SENSOR_RATE_FAST = 10; // 0xa
@@ -445,23 +448,34 @@
package android.car.media {
public final class CarAudioManager {
- method public android.car.media.CarAudioPatchHandle createAudioPatch(String, int, int) throws android.car.CarNotConnectedException;
- method @NonNull public String[] getExternalSources() throws android.car.CarNotConnectedException;
+ method @RequiresPermission(android.car.Car.PERMISSION_CAR_CONTROL_AUDIO_SETTINGS) public android.car.media.CarAudioPatchHandle createAudioPatch(String, int, int) throws android.car.CarNotConnectedException;
+ method @RequiresPermission(android.car.Car.PERMISSION_CAR_CONTROL_AUDIO_SETTINGS) @NonNull public String[] getExternalSources() throws android.car.CarNotConnectedException;
method public int getGroupMaxVolume(int) throws android.car.CarNotConnectedException;
+ method @RequiresPermission(android.car.Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME) public int getGroupMaxVolume(int, int) throws android.car.CarNotConnectedException;
method public int getGroupMinVolume(int) throws android.car.CarNotConnectedException;
+ method @RequiresPermission(android.car.Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME) public int getGroupMinVolume(int, int) throws android.car.CarNotConnectedException;
method public int getGroupVolume(int) throws android.car.CarNotConnectedException;
+ method @RequiresPermission(android.car.Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME) public int getGroupVolume(int, int) throws android.car.CarNotConnectedException;
method @NonNull public int[] getUsagesForVolumeGroupId(int) throws android.car.CarNotConnectedException;
+ method @RequiresPermission(android.car.Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME) @NonNull public int[] getUsagesForVolumeGroupId(int, int) throws android.car.CarNotConnectedException;
method public int getVolumeGroupCount() throws android.car.CarNotConnectedException;
+ method @RequiresPermission(android.car.Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME) public int getVolumeGroupCount(int) throws android.car.CarNotConnectedException;
method public int getVolumeGroupIdForUsage(int) throws android.car.CarNotConnectedException;
- method public static String getVolumeSettingsKeyForGroup(int);
- method public void registerVolumeCallback(@NonNull android.os.IBinder) throws android.car.CarNotConnectedException;
- method public void registerVolumeChangeObserver(@NonNull android.database.ContentObserver);
- method public void releaseAudioPatch(android.car.media.CarAudioPatchHandle) throws android.car.CarNotConnectedException;
- method public void setBalanceTowardRight(float) throws android.car.CarNotConnectedException;
- method public void setFadeTowardFront(float) throws android.car.CarNotConnectedException;
+ method @RequiresPermission(android.car.Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME) public int getVolumeGroupIdForUsage(int, int) throws android.car.CarNotConnectedException;
+ method public void registerCarVolumeCallback(@NonNull android.car.media.CarAudioManager.CarVolumeCallback);
+ method @RequiresPermission(android.car.Car.PERMISSION_CAR_CONTROL_AUDIO_SETTINGS) public void releaseAudioPatch(android.car.media.CarAudioPatchHandle) throws android.car.CarNotConnectedException;
+ method @RequiresPermission(android.car.Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME) public void setBalanceTowardRight(float) throws android.car.CarNotConnectedException;
+ method @RequiresPermission(android.car.Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME) public void setFadeTowardFront(float) throws android.car.CarNotConnectedException;
method public void setGroupVolume(int, int, int) throws android.car.CarNotConnectedException;
- method public void unregisterVolumeCallback(@NonNull android.os.IBinder) throws android.car.CarNotConnectedException;
- method public void unregisterVolumeChangeObserver(@NonNull android.database.ContentObserver);
+ method @RequiresPermission(android.car.Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME) public void setGroupVolume(int, int, int, int) throws android.car.CarNotConnectedException;
+ method public void unregisterCarVolumeCallback(@NonNull android.car.media.CarAudioManager.CarVolumeCallback);
+ field public static final int PRIMARY_AUDIO_ZONE = 0; // 0x0
+ }
+
+ public abstract static class CarAudioManager.CarVolumeCallback {
+ ctor public CarAudioManager.CarVolumeCallback();
+ method public void onGroupVolumeChanged(int, int, int);
+ method public void onMasterMuteChanged(int, int);
}
public final class CarAudioPatchHandle implements android.os.Parcelable {
@@ -494,9 +508,9 @@
public static final class CarSettings.Global {
ctor public CarSettings.Global();
- field public static final String KEY_GARAGE_MODE_ENABLED = "android.car.GARAGE_MODE_ENABLED";
- field public static final String KEY_GARAGE_MODE_MAINTENANCE_WINDOW = "android.car.GARAGE_MODE_MAINTENANCE_WINDOW";
- field public static final String KEY_GARAGE_MODE_WAKE_UP_TIME = "android.car.GARAGE_MODE_WAKE_UP_TIME";
+ field @Deprecated public static final String KEY_GARAGE_MODE_ENABLED = "android.car.GARAGE_MODE_ENABLED";
+ field @Deprecated public static final String KEY_GARAGE_MODE_MAINTENANCE_WINDOW = "android.car.GARAGE_MODE_MAINTENANCE_WINDOW";
+ field @Deprecated public static final String KEY_GARAGE_MODE_WAKE_UP_TIME = "android.car.GARAGE_MODE_WAKE_UP_TIME";
}
public final class SpeedBumpConfiguration implements android.os.Parcelable {
diff --git a/car-lib/api/system-baseline.txt b/car-lib/api/system-baseline.txt
new file mode 100644
index 0000000..3d4f02d
--- /dev/null
+++ b/car-lib/api/system-baseline.txt
@@ -0,0 +1,59 @@
+// Baseline format: 1.0
+HiddenTypeParameter: android.car.vms.VmsAvailableLayers#VmsAvailableLayers(java.util.Set<android.car.vms.VmsAssociatedLayer>, int) parameter #0:
+ Parameter associatedLayers references hidden type class android.car.vms.VmsAssociatedLayer.
+HiddenTypeParameter: android.car.vms.VmsAvailableLayers#getAssociatedLayers():
+ Method android.car.vms.VmsAvailableLayers.getAssociatedLayers() references hidden type class android.car.vms.VmsAssociatedLayer.
+HiddenTypeParameter: android.car.vms.VmsOperationRecorder#VmsOperationRecorder(android.car.vms.VmsOperationRecorder.Writer) parameter #0:
+ Parameter writer references hidden type android.car.vms.VmsOperationRecorder.Writer.
+HiddenTypeParameter: android.car.vms.VmsPublisherClientService#getSubscriptions():
+ Method android.car.vms.VmsPublisherClientService.getSubscriptions() references hidden type android.car.vms.VmsSubscriptionState.
+HiddenTypeParameter: android.car.vms.VmsPublisherClientService#onVmsSubscriptionChange(android.car.vms.VmsSubscriptionState) parameter #0:
+ Parameter subscriptionState references hidden type android.car.vms.VmsSubscriptionState.
+
+
+HiddenTypedefConstant: android.car.CarInfoManager#getEvConnectorTypes():
+ Typedef references constant which isn't part of the API, skipping in documentation: android.car.EvConnectorType#UNKNOWN
+HiddenTypedefConstant: android.car.CarInfoManager#getFuelTypes():
+ Typedef references constant which isn't part of the API, skipping in documentation: android.car.FuelType#UNKNOWN
+HiddenTypedefConstant: android.car.hardware.CarPropertyValue#getStatus():
+ Typedef references constant which isn't part of the API, skipping in documentation: android.car.hardware.CarPropertyValue#STATUS_AVAILABLE
+HiddenTypedefConstant: android.car.hardware.CarSensorManager#getLatestSensorEvent(int) parameter #0:
+ Typedef references constant which isn't part of the API, skipping in documentation: android.car.hardware.CarSensorManager#SENSOR_TYPE_ENGINE_OIL_LEVEL
+HiddenTypedefConstant: android.car.hardware.CarSensorManager#isSensorSupported(int) parameter #0:
+ Typedef references constant which isn't part of the API, skipping in documentation: android.car.hardware.CarSensorManager#SENSOR_TYPE_ENGINE_OIL_LEVEL
+HiddenTypedefConstant: android.car.hardware.CarSensorManager#isSensorSupported(int[], int) parameter #1:
+ Typedef references constant which isn't part of the API, skipping in documentation: android.car.hardware.CarSensorManager#SENSOR_TYPE_ENGINE_OIL_LEVEL
+HiddenTypedefConstant: android.car.hardware.CarSensorManager#registerListener(android.car.hardware.CarSensorManager.OnSensorChangedListener, int, int) parameter #1:
+ Typedef references constant which isn't part of the API, skipping in documentation: android.car.hardware.CarSensorManager#SENSOR_TYPE_ENGINE_OIL_LEVEL
+HiddenTypedefConstant: android.car.hardware.CarSensorManager#unregisterListener(android.car.hardware.CarSensorManager.OnSensorChangedListener, int) parameter #1:
+ Typedef references constant which isn't part of the API, skipping in documentation: android.car.hardware.CarSensorManager#SENSOR_TYPE_ENGINE_OIL_LEVEL
+
+
+ReferencesHidden: android.car.vms.VmsAvailableLayers#VmsAvailableLayers(java.util.Set<android.car.vms.VmsAssociatedLayer>, int) parameter #0:
+ Class android.car.vms.VmsAssociatedLayer is hidden but was referenced (as parameter type) from public parameter associatedLayers in android.car.vms.VmsAvailableLayers(java.util.Set<android.car.vms.VmsAssociatedLayer> associatedLayers, int sequence)
+ReferencesHidden: android.car.vms.VmsAvailableLayers#getAssociatedLayers():
+ Class android.car.vms.VmsAssociatedLayer is hidden but was referenced (as return type parameter) from public method android.car.vms.VmsAvailableLayers.getAssociatedLayers()
+ReferencesHidden: android.car.vms.VmsOperationRecorder#VmsOperationRecorder(android.car.vms.VmsOperationRecorder.Writer) parameter #0:
+ Class android.car.vms.VmsOperationRecorder.Writer is hidden but was referenced (as parameter type) from public parameter writer in android.car.vms.VmsOperationRecorder(android.car.vms.VmsOperationRecorder.Writer writer)
+ReferencesHidden: android.car.vms.VmsPublisherClientService#getSubscriptions():
+ Class android.car.vms.VmsSubscriptionState is hidden but was referenced (as return type) from public method android.car.vms.VmsPublisherClientService.getSubscriptions()
+ReferencesHidden: android.car.vms.VmsPublisherClientService#onVmsSubscriptionChange(android.car.vms.VmsSubscriptionState) parameter #0:
+ Class android.car.vms.VmsSubscriptionState is hidden but was referenced (as parameter type) from public parameter subscriptionState in android.car.vms.VmsPublisherClientService.onVmsSubscriptionChange(android.car.vms.VmsSubscriptionState subscriptionState)
+
+
+RequiresPermission: android.car.hardware.CarSensorManager#registerListener(android.car.hardware.CarSensorManager.OnSensorChangedListener, int, int):
+ Method 'registerListener' documentation mentions permissions already declared by @RequiresPermission
+
+
+SdkConstant: android.car.Car#CAR_INTENT_ACTION_MEDIA_TEMPLATE:
+ Field 'CAR_INTENT_ACTION_MEDIA_TEMPLATE' is missing @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
+
+
+Todo: android.car.CarInfoManager#getVehicleId():
+ Documentation mentions 'TODO'
+Todo: android.car.cluster.renderer.InstrumentClusterRenderer:
+ Documentation mentions 'TODO'
+Todo: android.car.drivingstate.CarDrivingStateEvent#DRIVING_STATE_IDLING:
+ Documentation mentions 'TODO'
+
+
diff --git a/car-lib/api/system-current.txt b/car-lib/api/system-current.txt
index 1f80136..1c34646 100644
--- a/car-lib/api/system-current.txt
+++ b/car-lib/api/system-current.txt
@@ -4,6 +4,8 @@
public final class Car {
field public static final String CABIN_SERVICE = "cabin";
field public static final String CAR_DRIVING_STATE_SERVICE = "drivingstate";
+ field public static final String CAR_EXTRA_CLUSTER_ACTIVITY_STATE = "android.car.cluster.ClusterActivityState";
+ field public static final String CAR_TRUST_AGENT_ENROLLMENT_SERVICE = "trust_enroll";
field public static final String DIAGNOSTIC_SERVICE = "diagnostic";
field public static final String HVAC_SERVICE = "hvac";
field public static final String PERMISSION_CAR_DIAGNOSTIC_CLEAR = "android.car.permission.CLEAR_CAR_DIAGNOSTICS";
@@ -11,6 +13,7 @@
field public static final String PERMISSION_CAR_DRIVING_STATE = "android.car.permission.CAR_DRIVING_STATE";
field public static final String PERMISSION_CAR_DYNAMICS_STATE = "android.car.permission.CAR_DYNAMICS_STATE";
field public static final String PERMISSION_CAR_ENGINE_DETAILED = "android.car.permission.CAR_ENGINE_DETAILED";
+ field public static final String PERMISSION_CAR_ENROLL_TRUST = "android.car.permission.CAR_ENROLL_TRUST";
field public static final String PERMISSION_CAR_INSTRUMENT_CLUSTER_CONTROL = "android.car.permission.CAR_INSTRUMENT_CLUSTER_CONTROL";
field public static final String PERMISSION_CAR_POWER = "android.car.permission.CAR_POWER";
field public static final String PERMISSION_CAR_PROJECTION = "android.car.permission.CAR_PROJECTION";
@@ -43,6 +46,8 @@
method public void onCarDisconnected();
method public void registerProjectionListener(android.car.CarProjectionManager.CarProjectionListener, int) throws android.car.CarNotConnectedException;
method public void registerProjectionRunner(android.content.Intent) throws android.car.CarNotConnectedException;
+ method public void startProjectionAccessPoint(android.car.CarProjectionManager.ProjectionAccessPointCallback);
+ method public void stopProjectionAccessPoint();
method public void unregisterProjectionListener();
method public void unregisterProjectionRunner(android.content.Intent);
field public static final int PROJECTION_LONG_PRESS_VOICE_SEARCH = 2; // 0x2
@@ -53,6 +58,17 @@
method public void onVoiceAssistantRequest(boolean);
}
+ public abstract static class CarProjectionManager.ProjectionAccessPointCallback {
+ ctor public CarProjectionManager.ProjectionAccessPointCallback();
+ method public void onFailed(int);
+ method public void onStarted(android.net.wifi.WifiConfiguration);
+ method public void onStopped();
+ field public static final int ERROR_GENERIC = 2; // 0x2
+ field public static final int ERROR_INCOMPATIBLE_MODE = 3; // 0x3
+ field public static final int ERROR_NO_CHANNEL = 1; // 0x1
+ field public static final int ERROR_TETHERING_DISALLOWED = 4; // 0x4
+ }
+
public final class VehicleAreaDoor {
field public static final int DOOR_HOOD = 268435456; // 0x10000000
field public static final int DOOR_REAR = 536870912; // 0x20000000
@@ -123,37 +139,40 @@
package android.car.cluster {
- public class CarInstrumentClusterManager {
- method public void registerCallback(String, android.car.cluster.CarInstrumentClusterManager.Callback) throws android.car.CarNotConnectedException;
- method public void startActivity(android.content.Intent) throws android.car.CarNotConnectedException;
- method public void unregisterCallback(android.car.cluster.CarInstrumentClusterManager.Callback) throws android.car.CarNotConnectedException;
- field public static final String CATEGORY_NAVIGATION = "android.car.cluster.NAVIGATION";
- field public static final String KEY_EXTRA_ACTIVITY_STATE = "android.car.cluster.ClusterActivityState";
+ @Deprecated public class CarInstrumentClusterManager {
+ method @Deprecated public void registerCallback(String, android.car.cluster.CarInstrumentClusterManager.Callback) throws android.car.CarNotConnectedException;
+ method @Deprecated public void startActivity(android.content.Intent) throws android.car.CarNotConnectedException;
+ method @Deprecated public void unregisterCallback(android.car.cluster.CarInstrumentClusterManager.Callback) throws android.car.CarNotConnectedException;
+ field @Deprecated public static final String CATEGORY_NAVIGATION = "android.car.cluster.NAVIGATION";
+ field @Deprecated public static final String KEY_EXTRA_ACTIVITY_STATE = "android.car.cluster.ClusterActivityState";
}
- public static interface CarInstrumentClusterManager.Callback {
- method public void onClusterActivityStateChanged(String, android.os.Bundle);
+ @Deprecated public static interface CarInstrumentClusterManager.Callback {
+ method @Deprecated public void onClusterActivityStateChanged(String, android.os.Bundle);
}
}
package android.car.cluster.renderer {
- public abstract class InstrumentClusterRenderer {
- ctor public InstrumentClusterRenderer();
- method protected abstract android.car.cluster.renderer.NavigationRenderer createNavigationRenderer();
- method @Nullable public android.car.cluster.renderer.NavigationRenderer getNavigationRenderer();
- method @UiThread public final void initialize();
- method public abstract void onCreate(android.content.Context);
- method public abstract void onStart();
- method public abstract void onStop();
+ @Deprecated public abstract class InstrumentClusterRenderer {
+ ctor @Deprecated public InstrumentClusterRenderer();
+ method @Deprecated protected abstract android.car.cluster.renderer.NavigationRenderer createNavigationRenderer();
+ method @Deprecated @Nullable public android.car.cluster.renderer.NavigationRenderer getNavigationRenderer();
+ method @Deprecated @UiThread public final void initialize();
+ method @Deprecated public abstract void onCreate(android.content.Context);
+ method @Deprecated public abstract void onStart();
+ method @Deprecated public abstract void onStop();
}
public abstract class InstrumentClusterRenderingService extends android.app.Service {
ctor public InstrumentClusterRenderingService();
- method @MainThread protected abstract android.car.cluster.renderer.NavigationRenderer getNavigationRenderer();
+ method @MainThread @Nullable public abstract android.car.cluster.renderer.NavigationRenderer getNavigationRenderer();
method @CallSuper public android.os.IBinder onBind(android.content.Intent);
- method @MainThread protected void onKeyEvent(android.view.KeyEvent);
+ method @MainThread public void onKeyEvent(@NonNull android.view.KeyEvent);
+ method @MainThread public void onNavigationComponentLaunched();
+ method @MainThread public void onNavigationComponentReleased();
+ method protected boolean startNavigationActivity(@NonNull android.content.ComponentName);
}
@UiThread public abstract class NavigationRenderer {
@@ -697,8 +716,6 @@
method public void onStateChanged(int);
field public static final int SHUTDOWN_CANCELLED = 0; // 0x0
field public static final int SHUTDOWN_ENTER = 1; // 0x1
- field public static final int SUSPEND_ENTER = 2; // 0x2
- field public static final int SUSPEND_EXIT = 3; // 0x3
}
}
@@ -724,29 +741,6 @@
}
-package android.car.media {
-
- public final class CarAudioManager {
- method public android.car.media.CarAudioPatchHandle createAudioPatch(String, int, int) throws android.car.CarNotConnectedException;
- method @NonNull public String[] getExternalSources() throws android.car.CarNotConnectedException;
- method public int getGroupMaxVolume(int) throws android.car.CarNotConnectedException;
- method public int getGroupMinVolume(int) throws android.car.CarNotConnectedException;
- method public int getGroupVolume(int) throws android.car.CarNotConnectedException;
- method @NonNull public int[] getUsagesForVolumeGroupId(int) throws android.car.CarNotConnectedException;
- method public int getVolumeGroupCount() throws android.car.CarNotConnectedException;
- method public int getVolumeGroupIdForUsage(int) throws android.car.CarNotConnectedException;
- method public void registerVolumeCallback(@NonNull android.os.IBinder) throws android.car.CarNotConnectedException;
- method public void registerVolumeChangeObserver(@NonNull android.database.ContentObserver);
- method public void releaseAudioPatch(android.car.media.CarAudioPatchHandle) throws android.car.CarNotConnectedException;
- method public void setBalanceTowardRight(float) throws android.car.CarNotConnectedException;
- method public void setFadeTowardFront(float) throws android.car.CarNotConnectedException;
- method public void setGroupVolume(int, int, int) throws android.car.CarNotConnectedException;
- method public void unregisterVolumeCallback(@NonNull android.os.IBinder) throws android.car.CarNotConnectedException;
- method public void unregisterVolumeChangeObserver(@NonNull android.database.ContentObserver);
- }
-
-}
-
package android.car.navigation {
public class CarNavigationInstrumentCluster implements android.os.Parcelable {
@@ -904,6 +898,38 @@
}
+package android.car.trust {
+
+ public final class CarTrustAgentEnrollmentManager {
+ method @RequiresPermission(android.car.Car.PERMISSION_CAR_ENROLL_TRUST) public void activateToken(long) throws android.car.CarNotConnectedException;
+ method @RequiresPermission(android.car.Car.PERMISSION_CAR_ENROLL_TRUST) public void enrollmentHandshakeAccepted() throws android.car.CarNotConnectedException;
+ method @RequiresPermission(android.car.Car.PERMISSION_CAR_ENROLL_TRUST) public java.util.List<java.lang.Integer> getEnrollmentHandlesForUser(int) throws android.car.CarNotConnectedException;
+ method @RequiresPermission(android.car.Car.PERMISSION_CAR_ENROLL_TRUST) public void initiateEnrollmentHandshake(android.bluetooth.BluetoothDevice) throws android.car.CarNotConnectedException;
+ method @RequiresPermission(android.car.Car.PERMISSION_CAR_ENROLL_TRUST) public void revokeTrust(long) throws android.car.CarNotConnectedException;
+ method @RequiresPermission(android.car.Car.PERMISSION_CAR_ENROLL_TRUST) public void setBleCallback(@Nullable android.car.trust.CarTrustAgentEnrollmentManager.CarTrustAgentBleCallback) throws android.car.CarNotConnectedException;
+ method @RequiresPermission(android.car.Car.PERMISSION_CAR_ENROLL_TRUST) public void setEnrollmentCallback(@Nullable android.car.trust.CarTrustAgentEnrollmentManager.CarTrustAgentEnrollmentCallback) throws android.car.CarNotConnectedException;
+ method @RequiresPermission(android.car.Car.PERMISSION_CAR_ENROLL_TRUST) public void startEnrollmentAdvertising() throws android.car.CarNotConnectedException;
+ method @RequiresPermission(android.car.Car.PERMISSION_CAR_ENROLL_TRUST) public void stopEnrollmentAdvertising() throws android.car.CarNotConnectedException;
+ method @RequiresPermission(android.car.Car.PERMISSION_CAR_ENROLL_TRUST) public void terminateEnrollmentHandshake() throws android.car.CarNotConnectedException;
+ }
+
+ public static interface CarTrustAgentEnrollmentManager.CarTrustAgentBleCallback {
+ method public void onBleEnrollmentDeviceConnected(android.bluetooth.BluetoothDevice);
+ method public void onBleEnrollmentDeviceDisconnected(android.bluetooth.BluetoothDevice);
+ method public void onEnrollmentAdvertisingFailed(int);
+ method public void onEnrollmentAdvertisingStarted();
+ }
+
+ public static interface CarTrustAgentEnrollmentManager.CarTrustAgentEnrollmentCallback {
+ method public void onAuthStringAvailable(android.bluetooth.BluetoothDevice, String);
+ method public void onEnrollmentHandshakeFailure(android.bluetooth.BluetoothDevice, int);
+ method public void onEscrowTokenActiveStateChanged(long, boolean);
+ method public void onEscrowTokenAdded(long);
+ method public void onTrustRevoked(long, boolean);
+ }
+
+}
+
package android.car.vms {
public final class VmsAvailableLayers implements android.os.Parcelable {
diff --git a/car-lib/api/test-baseline.txt b/car-lib/api/test-baseline.txt
new file mode 100644
index 0000000..d71a9e5
--- /dev/null
+++ b/car-lib/api/test-baseline.txt
@@ -0,0 +1,55 @@
+// Baseline format: 1.0
+HiddenTypeParameter: android.car.drivingstate.CarUxRestrictionsManager#getConfig():
+ Method android.car.drivingstate.CarUxRestrictionsManager.getConfig() references hidden type android.car.drivingstate.CarUxRestrictionsConfiguration.
+HiddenTypeParameter: android.car.drivingstate.CarUxRestrictionsManager#getStagedConfig():
+ Method android.car.drivingstate.CarUxRestrictionsManager.getStagedConfig() references hidden type android.car.drivingstate.CarUxRestrictionsConfiguration.
+HiddenTypeParameter: android.car.hardware.CarSensorManager#getPropertyList():
+ Method android.car.hardware.CarSensorManager.getPropertyList() references hidden type class android.car.hardware.CarPropertyConfig.
+HiddenTypeParameter: android.car.navigation.CarNavigationStatusManager#getInstrumentClusterInfo():
+ Method android.car.navigation.CarNavigationStatusManager.getInstrumentClusterInfo() references hidden type android.car.navigation.CarNavigationInstrumentCluster.
+
+
+HiddenTypedefConstant: android.car.CarInfoManager#getEvConnectorTypes():
+ Typedef references constant which isn't part of the API, skipping in documentation: android.car.EvConnectorType#UNKNOWN
+HiddenTypedefConstant: android.car.CarInfoManager#getFuelTypes():
+ Typedef references constant which isn't part of the API, skipping in documentation: android.car.FuelType#UNKNOWN
+HiddenTypedefConstant: android.car.hardware.CarSensorManager#getLatestSensorEvent(int) parameter #0:
+ Typedef references constant which isn't part of the API, skipping in documentation: android.car.hardware.CarSensorManager#SENSOR_TYPE_ENGINE_OIL_LEVEL
+HiddenTypedefConstant: android.car.hardware.CarSensorManager#isSensorSupported(int) parameter #0:
+ Typedef references constant which isn't part of the API, skipping in documentation: android.car.hardware.CarSensorManager#SENSOR_TYPE_ENGINE_OIL_LEVEL
+HiddenTypedefConstant: android.car.hardware.CarSensorManager#isSensorSupported(int[], int) parameter #1:
+ Typedef references constant which isn't part of the API, skipping in documentation: android.car.hardware.CarSensorManager#SENSOR_TYPE_ENGINE_OIL_LEVEL
+HiddenTypedefConstant: android.car.hardware.CarSensorManager#registerListener(android.car.hardware.CarSensorManager.OnSensorChangedListener, int, int) parameter #1:
+ Typedef references constant which isn't part of the API, skipping in documentation: android.car.hardware.CarSensorManager#SENSOR_TYPE_ENGINE_OIL_LEVEL
+HiddenTypedefConstant: android.car.hardware.CarSensorManager#unregisterListener(android.car.hardware.CarSensorManager.OnSensorChangedListener, int) parameter #1:
+ Typedef references constant which isn't part of the API, skipping in documentation: android.car.hardware.CarSensorManager#SENSOR_TYPE_ENGINE_OIL_LEVEL
+
+
+MissingPermission: android.car.drivingstate.CarUxRestrictionsManager#getConfig():
+ Permission Car.PERMISSION_CAR_UX_RESTRICTIONS_CONFIGURATION required by method android.car.drivingstate.CarUxRestrictionsManager.getConfig() is hidden or removed
+MissingPermission: android.car.drivingstate.CarUxRestrictionsManager#getStagedConfig():
+ Permission Car.PERMISSION_CAR_UX_RESTRICTIONS_CONFIGURATION required by method android.car.drivingstate.CarUxRestrictionsManager.getStagedConfig() is hidden or removed
+
+
+ReferencesHidden: android.car.drivingstate.CarUxRestrictionsManager#getConfig():
+ Class android.car.drivingstate.CarUxRestrictionsConfiguration is hidden but was referenced (as return type) from public method android.car.drivingstate.CarUxRestrictionsManager.getConfig()
+ReferencesHidden: android.car.drivingstate.CarUxRestrictionsManager#getStagedConfig():
+ Class android.car.drivingstate.CarUxRestrictionsConfiguration is hidden but was referenced (as return type) from public method android.car.drivingstate.CarUxRestrictionsManager.getStagedConfig()
+ReferencesHidden: android.car.hardware.CarSensorManager#getPropertyList():
+ Class android.car.hardware.CarPropertyConfig is hidden but was referenced (as return type parameter) from public method android.car.hardware.CarSensorManager.getPropertyList()
+ReferencesHidden: android.car.navigation.CarNavigationStatusManager#getInstrumentClusterInfo():
+ Class android.car.navigation.CarNavigationInstrumentCluster is hidden but was referenced (as return type) from public method android.car.navigation.CarNavigationStatusManager.getInstrumentClusterInfo()
+
+
+RequiresPermission: android.car.hardware.CarSensorManager#registerListener(android.car.hardware.CarSensorManager.OnSensorChangedListener, int, int):
+ Method 'registerListener' documentation mentions permissions already declared by @RequiresPermission
+
+
+SdkConstant: android.car.Car#CAR_INTENT_ACTION_MEDIA_TEMPLATE:
+ Field 'CAR_INTENT_ACTION_MEDIA_TEMPLATE' is missing @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
+
+
+Todo: android.car.CarInfoManager#getVehicleId():
+ Documentation mentions 'TODO'
+
+
diff --git a/car-lib/api/test-current.txt b/car-lib/api/test-current.txt
new file mode 100644
index 0000000..c1e61d6
--- /dev/null
+++ b/car-lib/api/test-current.txt
@@ -0,0 +1,26 @@
+// Signature format: 2.0
+package android.car.content.pm {
+
+ public final class CarPackageManager {
+ method public void setEnableActivityBlocking(boolean);
+ }
+
+}
+
+package android.car.drivingstate {
+
+ public final class CarUxRestrictionsManager {
+ method @RequiresPermission("android.car.permission.CAR_UX_RESTRICTIONS_CONFIGURATION") public android.car.drivingstate.CarUxRestrictionsConfiguration getConfig() throws android.car.CarNotConnectedException;
+ method @Nullable @RequiresPermission("android.car.permission.CAR_UX_RESTRICTIONS_CONFIGURATION") public android.car.drivingstate.CarUxRestrictionsConfiguration getStagedConfig() throws android.car.CarNotConnectedException;
+ }
+
+}
+
+package android.car.media {
+
+ public final class CarAudioManager {
+ method public boolean isDynamicRoutingEnabled() throws android.car.CarNotConnectedException;
+ }
+
+}
+
diff --git a/car-support-lib/api/removed.txt b/car-lib/api/test-removed.txt
similarity index 100%
rename from car-support-lib/api/removed.txt
rename to car-lib/api/test-removed.txt
diff --git a/car-lib/native/CarPowerManager/CarPowerManager.cpp b/car-lib/native/CarPowerManager/CarPowerManager.cpp
index 856f6cd..e1545f4 100644
--- a/car-lib/native/CarPowerManager/CarPowerManager.cpp
+++ b/car-lib/native/CarPowerManager/CarPowerManager.cpp
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-#define LOG_TAG "CarPowerManagerNative"
+#define LOG_TAG "CarPowerManagerNative: "
#include <binder/IServiceManager.h>
#include <binder/IBinder.h>
@@ -40,24 +40,6 @@
return retVal;
}
-int CarPowerManager::getBootReason(BootReason *bootReason) {
- int retVal = -1;
-
- if ((bootReason != nullptr) && connectToCarService()) {
- int reason = -1;
- mICarPower->getBootReason(&reason);
-
- if ((reason >= static_cast<int>(BootReason::kFirst)) &&
- (reason <= static_cast<int>(BootReason::kLast))) {
- *bootReason = static_cast<BootReason>(reason);
- retVal = 0;
- } else {
- ALOGE("Received unknown bootReason = %d", reason);
- }
- }
- return retVal;
-}
-
int CarPowerManager::requestShutdownOnNextSuspend() {
int retVal = -1;
@@ -95,37 +77,37 @@
const String16 ICarName("car_service");
const String16 ICarPowerName("power");
- ALOGI("Connecting to CarService" LOG_TAG);
+ ALOGI(LOG_TAG "Connecting to CarService");
// Get ICar
sp<IServiceManager> serviceManager = defaultServiceManager();
if (serviceManager == nullptr) {
- ALOGE("Cannot get defaultServiceManager");
+ ALOGE(LOG_TAG "Cannot get defaultServiceManager");
return(false);
}
sp<IBinder> binder = (serviceManager->getService(ICarName));
if (binder == nullptr) {
- ALOGE("Cannot get ICar");
+ ALOGE(LOG_TAG "Cannot get ICar");
return false;
}
// Get ICarPower
sp<ICar> iCar = interface_cast<ICar>(binder);
if (iCar == nullptr) {
- ALOGW("car service unavailable");
+ ALOGW(LOG_TAG "car service unavailable");
return false;
}
iCar->getCarService(ICarPowerName, &binder);
if (binder == nullptr) {
- ALOGE("Cannot get ICarPower");
+ ALOGE(LOG_TAG "Cannot get ICarPower");
return false;
}
mICarPower = interface_cast<ICarPower>(binder);
if (mICarPower == nullptr) {
- ALOGW("car power management service unavailable");
+ ALOGW(LOG_TAG "car power management service unavailable");
return false;
}
mIsConnected = true;
diff --git a/car-lib/native/include/CarPowerManager.h b/car-lib/native/include/CarPowerManager.h
index aa31030..90e77f7 100644
--- a/car-lib/native/include/CarPowerManager.h
+++ b/car-lib/native/include/CarPowerManager.h
@@ -34,46 +34,34 @@
class CarPowerManager : public RefBase {
public:
- // Enumeration of possible boot reasons
- // NOTE: The entries in this enum must match the ones in located CarPowerManager java class:
- // packages/services/Car/car-lib/src/android/car/hardware/power/CarPowerManager.java
- enum class BootReason {
- kUserPowerOn = 1,
- kDoorUnlock = 2,
- kTimer = 3,
- kDoorOpen = 4,
- kRemoteStart = 5,
-
- kFirst = kUserPowerOn,
- kLast = kRemoteStart,
- };
-
// Enumeration of state change events
// NOTE: The entries in this enum must match the ones in CarPowerStateListener located in
// packages/services/Car/car-lib/src/android/car/hardware/power/CarPowerManager.java
enum class State {
kShutdownCancelled = 0,
kShutdownEnter = 1,
- kSuspendEnter = 2,
- kSuspendExit = 3,
+ kWaitForVhal = 2,
+ kSuspendEnter = 3,
+ kSuspendExit = 4,
+ kOn = 5,
+ kShutdownPrepare = 6,
- kFirst = kShutdownCancelled,
- kLast = kSuspendExit,
+ kFirst = kWaitForVhal,
+ kLast = kShutdownCancelled,
};
using Listener = std::function<void(State)>;
CarPowerManager() = default;
- virtual ~CarPowerManager() = default;
+ virtual ~CarPowerManager() {
+ // Clear the listener if one is set
+ clearListener();
+ }
// Removes the listener and turns off callbacks
// Returns 0 on success
int clearListener();
- // Returns the boot reason, defined in kBootReason*
- // Returns 0 on success
- int getBootReason(BootReason *bootReason);
-
// Request device to shutdown in lieu of suspend at the next opportunity
// Returns 0 on success
int requestShutdownOnNextSuspend();
@@ -88,25 +76,27 @@
explicit CarPowerStateListener(CarPowerManager* parent) : mParent(parent) {};
Status onStateChanged(int state, int token) override {
- sp<CarPowerManager> parent = mParent.promote();
+ sp<CarPowerManager> parent = mParent;
if ((parent != nullptr) && (parent->mListener != nullptr)) {
if ((state >= static_cast<int>(State::kFirst)) &&
(state <= static_cast<int>(State::kLast))) {
+ // Notify the listener of the state transition
parent->mListener(static_cast<State>(state));
+ if (token != 0) {
+ // Call finished() method to let CPMS know we're ready to suspend/shutdown.
+ parent->mICarPower->finished(parent->mListenerToService, token);
+ }
} else {
- ALOGE("onStateChanged unknown state received = %d", state);
+ ALOGE("CarPowerManagerNative: onStateChanged unknown state: %d", state);
}
- }
-
- if (token != 0) {
- // Call finished() method to let CPMS know that we're ready to suspend/shutdown.
- parent->mICarPower->finished(parent->mListenerToService, token);
+ } else {
+ ALOGE("CarPowerManagerNative: onStateChanged null pointer detected!");
}
return binder::Status::ok();
};
private:
- wp<CarPowerManager> mParent;
+ sp<CarPowerManager> mParent;
};
bool connectToCarService();
diff --git a/car-lib/src/android/car/Car.java b/car-lib/src/android/car/Car.java
index 8eef0a8..dc3cd40 100644
--- a/car-lib/src/android/car/Car.java
+++ b/car-lib/src/android/car/Car.java
@@ -22,6 +22,7 @@
import android.annotation.SdkConstant.SdkConstantType;
import android.annotation.SystemApi;
import android.car.cluster.CarInstrumentClusterManager;
+import android.car.cluster.ClusterActivityState;
import android.car.content.pm.CarPackageManager;
import android.car.diagnostic.CarDiagnosticManager;
import android.car.drivingstate.CarDrivingStateManager;
@@ -37,6 +38,7 @@
import android.car.settings.CarConfigurationManager;
import android.car.storagemonitoring.CarStorageMonitoringManager;
import android.car.test.CarTestManagerBinderWrapper;
+import android.car.trust.CarTrustAgentEnrollmentManager;
import android.car.vms.VmsSubscriberManager;
import android.content.ComponentName;
import android.content.Context;
@@ -47,6 +49,7 @@
import android.os.IBinder;
import android.os.Looper;
import android.os.RemoteException;
+import android.os.ServiceManager;
import android.os.UserHandle;
import android.util.Log;
@@ -91,8 +94,11 @@
/**
* Service name for {@link CarInstrumentClusterManager}
+ *
+ * @deprecated CarInstrumentClusterManager is being deprecated
* @hide
*/
+ @Deprecated
public static final String CAR_INSTRUMENT_CLUSTER_SERVICE = "cluster_service";
/**
@@ -172,6 +178,13 @@
public static final String STORAGE_MONITORING_SERVICE = "storage_monitoring";
/**
+ * Service name for {@link android.car.trust.CarTrustAgentEnrollmentManager}
+ * @hide
+ */
+ @SystemApi
+ public static final String CAR_TRUST_AGENT_ENROLLMENT_SERVICE = "trust_enroll";
+
+ /**
* Service for testing. This is system app only feature.
* Service name for {@link CarTestManager}, to be used in {@link #getCarManager(String)}.
* @hide
@@ -230,7 +243,6 @@
/**
* Permission necessary to change car audio settings through {@link CarAudioManager}.
- * @hide
*/
public static final String PERMISSION_CAR_CONTROL_AUDIO_SETTINGS =
"android.car.permission.CAR_CONTROL_AUDIO_SETTINGS";
@@ -407,7 +419,16 @@
* @hide
*/
@SystemApi
- public static final String PERMISSION_CAR_DIAGNOSTIC_CLEAR = "android.car.permission.CLEAR_CAR_DIAGNOSTICS";
+ public static final String PERMISSION_CAR_DIAGNOSTIC_CLEAR =
+ "android.car.permission.CLEAR_CAR_DIAGNOSTICS";
+
+ /**
+ * Permission necessary to configure UX restrictions through {@link CarUxRestrictionsManager}.
+ *
+ * @hide
+ */
+ public static final String PERMISSION_CAR_UX_RESTRICTIONS_CONFIGURATION =
+ "android.car.permission.CAR_UX_RESTRICTIONS_CONFIGURATION";
/**
* Permissions necessary to clear diagnostic information.
@@ -415,7 +436,17 @@
* @hide
*/
@SystemApi
- public static final String PERMISSION_STORAGE_MONITORING = "android.car.permission.STORAGE_MONITORING";
+ public static final String PERMISSION_STORAGE_MONITORING =
+ "android.car.permission.STORAGE_MONITORING";
+
+ /**
+ * Permission necessary to enroll a device as a trusted authenticator device.
+ *
+ * @hide
+ */
+ @SystemApi
+ public static final String PERMISSION_CAR_ENROLL_TRUST =
+ "android.car.permission.CAR_ENROLL_TRUST";
/** Type of car connection: platform runs directly in car. */
public static final int CONNECTION_TYPE_EMBEDDED = 5;
@@ -458,6 +489,26 @@
private static final String CAR_SERVICE_CLASS = "com.android.car.CarService";
+ /**
+ * Category used by navigation applications to indicate which activity should be launched on
+ * the instrument cluster when such application holds
+ * {@link CarAppFocusManager#APP_FOCUS_TYPE_NAVIGATION} focus.
+ *
+ * @hide
+ */
+ public static final String CAR_CATEGORY_NAVIGATION = "android.car.cluster.NAVIGATION";
+
+ /**
+ * When an activity is launched in the cluster, it will receive {@link ClusterActivityState} in
+ * the intent's extra under this key, containing instrument cluster information such as
+ * unobscured area, visibility, etc.
+ *
+ * @hide
+ */
+ @SystemApi
+ public static final String CAR_EXTRA_CLUSTER_ACTIVITY_STATE =
+ "android.car.cluster.ClusterActivityState";
+
private static final long CAR_SERVICE_BIND_RETRY_INTERVAL_MS = 500;
private static final long CAR_SERVICE_BIND_MAX_RETRY = 20;
@@ -500,13 +551,11 @@
public void onServiceDisconnected(ComponentName name) {
synchronized (Car.this) {
- mService = null;
if (mConnectionState == STATE_DISCONNECTED) {
return;
}
- mConnectionState = STATE_DISCONNECTED;
}
- // unbind explicitly here.
+ // unbind explicitly and set connectionState to STATE_DISCONNECTED here.
disconnect();
mServiceConnectionListenerClient.onServiceDisconnected(name);
}
@@ -530,7 +579,10 @@
* service's main thread. Note: the service connection listener will be always on the main
* thread regardless of the handler given.
* @return Car instance if system is in car environment and returns {@code null} otherwise.
+ *
+ * @deprecated use {@link #createCar(Context, Handler)} instead.
*/
+ @Deprecated
public static Car createCar(Context context, ServiceConnection serviceConnectionListener,
@Nullable Handler handler) {
if (!context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) {
@@ -550,11 +602,44 @@
* Looper}.
*
* @see #createCar(Context, ServiceConnection, Handler)
+ *
+ * @deprecated use {@link #createCar(Context, Handler)} instead.
*/
+ @Deprecated
public static Car createCar(Context context, ServiceConnection serviceConnectionListener) {
return createCar(context, serviceConnectionListener, null);
}
+ /**
+ * Creates new {@link Car} object which connected synchronously to Car Service and ready to use.
+ *
+ * @param context application's context
+ *
+ * @return Car object if operation succeeded, otherwise null.
+ */
+ @Nullable
+ public static Car createCar(Context context) {
+ return createCar(context, (Handler) null);
+ }
+
+ /**
+ * Creates new {@link Car} object which connected synchronously to Car Service and ready to use.
+ *
+ * @param context application's context
+ * @param handler the handler on which the manager's callbacks will be executed, or null to
+ * execute on the application's main thread.
+ *
+ * @return Car object if operation succeeded, otherwise null.
+ */
+ @Nullable
+ public static Car createCar(Context context, @Nullable Handler handler) {
+ IBinder service = ServiceManager.getService("car_service");
+ if (service == null) {
+ return null;
+ }
+ return new Car(context, ICar.Stub.asInterface(service), handler);
+ }
+
private Car(Context context, ServiceConnection serviceConnectionListener,
@Nullable Handler handler) {
mContext = context;
@@ -599,7 +684,11 @@
* Connect to car service. This can be called while it is disconnected.
* @throws IllegalStateException If connection is still on-going from previous
* connect call or it is already connected
+ *
+ * @deprecated this method is not need if this object is created via
+ * {@link #createCar(Context, Handler)}.
*/
+ @Deprecated
public void connect() throws IllegalStateException {
synchronized (this) {
if (mConnectionState != STATE_DISCONNECTED) {
@@ -663,6 +752,7 @@
* @return Matching service manager or null if there is no such service.
* @throws CarNotConnectedException if the connection to the car service has been lost.
*/
+ @Nullable
public Object getCarManager(String serviceName) throws CarNotConnectedException {
CarManagerBase manager;
ICar service = getICarOrThrow();
@@ -731,6 +821,7 @@
}
}
+ @Nullable
private CarManagerBase createCarManager(String serviceName, IBinder binder)
throws CarNotConnectedException {
CarManagerBase manager = null;
@@ -801,6 +892,9 @@
case CAR_CONFIGURATION_SERVICE:
manager = new CarConfigurationManager(binder);
break;
+ case CAR_TRUST_AGENT_ENROLLMENT_SERVICE:
+ manager = new CarTrustAgentEnrollmentManager(binder, mContext, mEventHandler);
+ break;
default:
break;
}
diff --git a/car-lib/src/android/car/CarBluetoothManager.java b/car-lib/src/android/car/CarBluetoothManager.java
index 841a055..bb9c8ff 100644
--- a/car-lib/src/android/car/CarBluetoothManager.java
+++ b/car-lib/src/android/car/CarBluetoothManager.java
@@ -19,10 +19,6 @@
import android.annotation.IntDef;
import android.annotation.RequiresPermission;
import android.bluetooth.BluetoothDevice;
-import android.car.CarLibLog;
-import android.car.CarManagerBase;
-import android.car.CarNotConnectedException;
-import android.car.ICarBluetooth;
import android.content.Context;
import android.os.IBinder;
import android.os.RemoteException;
@@ -132,6 +128,49 @@
}
}
+ /**
+ * Request to disconnect the given profile on the given device, and prevent it from reconnecting
+ * until either the request is released, or the process owning the given token dies.
+ *
+ * @param device The device on which to disconnect a profile.
+ * @param profile The {@link android.bluetooth.BluetoothProfile} to disconnect.
+ * @param token A {@link IBinder} to be used as an identity for the request. If the process
+ * owning the token dies, the request will automatically be released.
+ * @return True if the profile was successfully disconnected, false if an error occurred.
+ */
+ @RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN)
+ public boolean requestTemporaryProfileDisconnect(
+ BluetoothDevice device, int profile, IBinder token) throws CarNotConnectedException {
+ try {
+ return mService.requestTemporaryDisconnect(device, profile, token);
+ } catch (RemoteException e) {
+ Log.e(CarLibLog.TAG_CAR, "requestTemporaryDisconnect failed", e);
+ throw new CarNotConnectedException(e);
+ }
+ }
+
+ /**
+ * Undo a previous call to {@link #requestTemporaryProfileDisconnect} with the same parameters,
+ * and reconnect the profile if no other requests are active.
+ *
+ * @param device The device on which to release the disconnect request.
+ * @param profile The profile on which to release the disconnect request.
+ * @param token The token provided in the original call to
+ * {@link #requestTemporaryProfileDisconnect}.
+ *
+ * @return True if the request was released, false if an error occurred.
+ */
+ @RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN)
+ public boolean releaseTemporaryProfileDisconnect(
+ BluetoothDevice device, int profile, IBinder token) throws CarNotConnectedException {
+ try {
+ return mService.releaseTemporaryDisconnect(device, profile, token);
+ } catch (RemoteException e) {
+ Log.e(CarLibLog.TAG_CAR, "requestTemporaryDisconnect failed", e);
+ throw new CarNotConnectedException(e);
+ }
+ }
+
/** @hide */
public CarBluetoothManager(IBinder service, Context context) {
mContext = context;
diff --git a/car-lib/src/android/car/CarProjectionManager.java b/car-lib/src/android/car/CarProjectionManager.java
index d1824f6..2fc5944 100644
--- a/car-lib/src/android/car/CarProjectionManager.java
+++ b/car-lib/src/android/car/CarProjectionManager.java
@@ -18,19 +18,31 @@
import android.annotation.SystemApi;
import android.content.Intent;
+import android.net.wifi.WifiConfiguration;
+import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
+import android.os.Looper;
+import android.os.Message;
+import android.os.Messenger;
import android.os.RemoteException;
+import android.util.Log;
import java.lang.ref.WeakReference;
/**
* CarProjectionManager allows applications implementing projection to register/unregister itself
* with projection manager, listen for voice notification.
+ *
+ * A client must have {@link Car#PERMISSION_CAR_PROJECTION} permission in order to access this
+ * manager.
+ *
* @hide
*/
@SystemApi
public final class CarProjectionManager implements CarManagerBase {
+ private static final String TAG = CarProjectionManager.class.getSimpleName();
+
/**
* Listener to get projected notifications.
*
@@ -52,6 +64,13 @@
*/
public static final int PROJECTION_LONG_PRESS_VOICE_SEARCH = 0x2;
+ /** @hide */
+ public static final int PROJECTION_AP_STARTED = 0;
+ /** @hide */
+ public static final int PROJECTION_AP_STOPPED = 1;
+ /** @hide */
+ public static final int PROJECTION_AP_FAILED = 2;
+
private final ICarProjection mService;
private final Handler mHandler;
private final ICarProjectionCallbackImpl mBinderListener;
@@ -59,10 +78,15 @@
private CarProjectionListener mListener;
private int mVoiceSearchFilter;
+ private ProjectionAccessPointCallbackProxy mProjectionAccessPointCallbackProxy;
+
+ // Only one access point proxy object per process.
+ private static final IBinder mAccessPointProxyToken = new Binder();
+
/**
* @hide
*/
- CarProjectionManager(IBinder service, Handler handler) {
+ public CarProjectionManager(IBinder service, Handler handler) {
mService = ICarProjection.Stub.asInterface(service);
mHandler = handler;
mBinderListener = new ICarProjectionCallbackImpl(this);
@@ -171,6 +195,123 @@
// nothing to do
}
+ /**
+ * Request to start Wi-Fi access point if it hasn't been started yet for wireless projection
+ * receiver app.
+ *
+ * <p>A process can have only one request to start an access point, subsequent call of this
+ * method will invalidate previous calls.
+ */
+ public void startProjectionAccessPoint(ProjectionAccessPointCallback callback) {
+ synchronized (this) {
+ Looper looper = mHandler.getLooper();
+ ProjectionAccessPointCallbackProxy proxy =
+ new ProjectionAccessPointCallbackProxy(this, looper, callback);
+ try {
+ mService.startProjectionAccessPoint(proxy.getMessenger(), mAccessPointProxyToken);
+ mProjectionAccessPointCallbackProxy = proxy;
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+ }
+
+ /**
+ * Stop Wi-Fi Access Point for wireless projection receiver app.
+ */
+ public void stopProjectionAccessPoint() {
+ ProjectionAccessPointCallbackProxy proxy;
+ synchronized (this) {
+ proxy = mProjectionAccessPointCallbackProxy;
+ mProjectionAccessPointCallbackProxy = null;
+ }
+ if (proxy == null) {
+ return;
+ }
+
+ try {
+ mService.stopProjectionAccessPoint(mAccessPointProxyToken);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Callback class for applications to receive updates about the LocalOnlyHotspot status.
+ */
+ public abstract static class ProjectionAccessPointCallback {
+ public static final int ERROR_NO_CHANNEL = 1;
+ public static final int ERROR_GENERIC = 2;
+ public static final int ERROR_INCOMPATIBLE_MODE = 3;
+ public static final int ERROR_TETHERING_DISALLOWED = 4;
+
+ /** Called when access point started successfully. */
+ public void onStarted(WifiConfiguration wifiConfiguration) {}
+ /** Called when access point is stopped. No events will be sent after that. */
+ public void onStopped() {}
+ /** Called when access point failed to start. No events will be sent after that. */
+ public void onFailed(int reason) {}
+ }
+
+ /**
+ * Callback proxy for LocalOnlyHotspotCallback objects.
+ */
+ private static class ProjectionAccessPointCallbackProxy {
+ private static final String LOG_PREFIX =
+ ProjectionAccessPointCallbackProxy.class.getSimpleName() + ": ";
+
+ private final Handler mHandler;
+ private final WeakReference<CarProjectionManager> mCarProjectionManagerRef;
+ private final Messenger mMessenger;
+
+ ProjectionAccessPointCallbackProxy(CarProjectionManager manager, Looper looper,
+ final ProjectionAccessPointCallback callback) {
+ mCarProjectionManagerRef = new WeakReference<>(manager);
+
+ mHandler = new Handler(looper) {
+ @Override
+ public void handleMessage(Message msg) {
+ Log.d(TAG, LOG_PREFIX + "handle message what: " + msg.what + " msg: " + msg);
+
+ CarProjectionManager manager = mCarProjectionManagerRef.get();
+ if (manager == null) {
+ Log.w(TAG, LOG_PREFIX + "handle message post GC");
+ return;
+ }
+
+ switch (msg.what) {
+ case PROJECTION_AP_STARTED:
+ WifiConfiguration config = (WifiConfiguration) msg.obj;
+ if (config == null) {
+ Log.e(TAG, LOG_PREFIX + "config cannot be null.");
+ callback.onFailed(ProjectionAccessPointCallback.ERROR_GENERIC);
+ return;
+ }
+ callback.onStarted(config);
+ break;
+ case PROJECTION_AP_STOPPED:
+ Log.i(TAG, LOG_PREFIX + "hotspot stopped");
+ callback.onStopped();
+ break;
+ case PROJECTION_AP_FAILED:
+ int reasonCode = msg.arg1;
+ Log.w(TAG, LOG_PREFIX + "failed to start. reason: "
+ + reasonCode);
+ callback.onFailed(reasonCode);
+ break;
+ default:
+ Log.e(TAG, LOG_PREFIX + "unhandled message. type: " + msg.what);
+ }
+ }
+ };
+ mMessenger = new Messenger(mHandler);
+ }
+
+ Messenger getMessenger() {
+ return mMessenger;
+ }
+ }
+
private void handleVoiceAssistantRequest(boolean fromLongPress) {
CarProjectionListener listener;
synchronized (this) {
@@ -196,12 +337,7 @@
if (manager == null) {
return;
}
- manager.mHandler.post(new Runnable() {
- @Override
- public void run() {
- manager.handleVoiceAssistantRequest(fromLongPress);
- }
- });
+ manager.mHandler.post(() -> manager.handleVoiceAssistantRequest(fromLongPress));
}
}
}
diff --git a/car-lib/src/android/car/ICarBluetooth.aidl b/car-lib/src/android/car/ICarBluetooth.aidl
index a5fbb73..ee7eb29 100644
--- a/car-lib/src/android/car/ICarBluetooth.aidl
+++ b/car-lib/src/android/car/ICarBluetooth.aidl
@@ -24,4 +24,6 @@
void clearBluetoothDeviceConnectionPriority(in int profileToClear,in int priorityToClear);
boolean isPriorityDevicePresent(in int profile, in int priorityToCheck);
String getDeviceNameWithPriority(in int profile, in int priorityToCheck);
+ boolean requestTemporaryDisconnect(in BluetoothDevice device, in int profile, in IBinder token);
+ boolean releaseTemporaryDisconnect(in BluetoothDevice device, in int profile, in IBinder token);
}
diff --git a/car-lib/src/android/car/ICarBluetoothUserService.aidl b/car-lib/src/android/car/ICarBluetoothUserService.aidl
index a906a3c..d69d08f 100644
--- a/car-lib/src/android/car/ICarBluetoothUserService.aidl
+++ b/car-lib/src/android/car/ICarBluetoothUserService.aidl
@@ -24,5 +24,7 @@
void closeBluetoothConnectionProxy();
boolean isBluetoothConnectionProxyAvailable(in int profile);
void bluetoothConnectToProfile(in int profile, in BluetoothDevice device);
+ void bluetoothDisconnectFromProfile(in int profile, in BluetoothDevice device);
+ int getProfilePriority(in int profile, in BluetoothDevice device);
void setProfilePriority(in int profile, in BluetoothDevice device, in int priority);
}
diff --git a/car-lib/src/android/car/ICarProjection.aidl b/car-lib/src/android/car/ICarProjection.aidl
index 15831cd..4f80e6c 100644
--- a/car-lib/src/android/car/ICarProjection.aidl
+++ b/car-lib/src/android/car/ICarProjection.aidl
@@ -18,6 +18,7 @@
import android.car.ICarProjectionCallback;
import android.content.Intent;
+import android.os.Messenger;
/**
* Binder interface for {@link android.car.CarProjectionManager}.
@@ -48,4 +49,15 @@
* Unregisters projection callback.
*/
void unregisterProjectionListener(ICarProjectionCallback callback) = 3;
+
+ /**
+ * Starts Wi-Fi access point if it hasn't been started yet for wireless projection and returns
+ * WiFiConfiguration object with access point details.
+ */
+ void startProjectionAccessPoint(in Messenger messenger, in IBinder binder) = 4;
+
+ /**
+ * Stops previously requested Wi-Fi access point.
+ */
+ void stopProjectionAccessPoint(in IBinder binder) = 5;
}
diff --git a/car-lib/src/android/car/VehicleHvacFanDirection.java b/car-lib/src/android/car/VehicleHvacFanDirection.java
new file mode 100644
index 0000000..1de111b
--- /dev/null
+++ b/car-lib/src/android/car/VehicleHvacFanDirection.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.car;
+
+/**
+ * Bit flags for fan direction.
+ * This constant must be used with HVAC_FAN_DIRECTION property in {@link VehiclePropertyIds}.
+ * @hide
+ */
+public final class VehicleHvacFanDirection {
+ public static final int FACE = 0x1;
+ public static final int FLOOR = 0x2;
+ public static final int DEFROST = 0x4;
+
+ private VehicleHvacFanDirection() {}
+}
diff --git a/car-lib/src/android/car/cluster/CarInstrumentClusterManager.java b/car-lib/src/android/car/cluster/CarInstrumentClusterManager.java
index 0ec6d72..7427fcb 100644
--- a/car-lib/src/android/car/cluster/CarInstrumentClusterManager.java
+++ b/car-lib/src/android/car/cluster/CarInstrumentClusterManager.java
@@ -23,29 +23,25 @@
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
-import android.os.Looper;
-import android.os.Message;
-import android.os.RemoteException;
-import android.util.Log;
-import android.util.Pair;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
/**
* API to work with instrument cluster.
*
+ * @deprecated use {@link android.car.CarAppFocusManager} with focus type
+ * {@link android.car.CarAppFocusManager#APP_FOCUS_TYPE_NAVIGATION} instead.
+ * InstrumentClusterService will automatically launch a "android.car.cluster.NAVIGATION" activity
+ * from the package holding navigation focus.
+ *
* @hide
*/
+@Deprecated
@SystemApi
public class CarInstrumentClusterManager implements CarManagerBase {
- private static final String TAG = CarInstrumentClusterManager.class.getSimpleName();
-
- /** @hide */
+ /**
+ * @deprecated use {@link android.car.Car#CATEGORY_NAVIGATION} instead
+ *
+ * @hide
+ */
@SystemApi
public static final String CATEGORY_NAVIGATION = "android.car.cluster.NAVIGATION";
@@ -54,33 +50,24 @@
* intent's extra thus activity will know information about unobscured area, etc. upon activity
* creation.
*
+ * @deprecated use {@link android.car.Car#CATEGORY_NAVIGATION} instead
+ *
* @hide
*/
@SystemApi
public static final String KEY_EXTRA_ACTIVITY_STATE =
"android.car.cluster.ClusterActivityState";
- private final EventHandler mHandler;
- private final Map<String, Set<Callback>> mCallbacksByCategory = new HashMap<>(0);
- private final Object mLock = new Object();
- private final Map<String, Bundle> mActivityStatesByCategory = new HashMap<>(0);
-
- private final IInstrumentClusterManagerService mService;
-
- private ClusterManagerCallback mServiceToManagerCallback;
-
/**
* Starts activity in the instrument cluster.
*
+ * @deprecated see {@link CarInstrumentClusterManager} deprecation message
+ *
* @hide
*/
@SystemApi
public void startActivity(Intent intent) throws CarNotConnectedException {
- try {
- mService.startClusterActivity(intent);
- } catch (RemoteException e) {
- throw new CarNotConnectedException(e);
- }
+ // No-op
}
/**
@@ -91,42 +78,14 @@
* see {@link #CATEGORY_NAVIGATION}
* @param callback instance of {@link Callback} class to receive events.
*
+ * @deprecated see {@link CarInstrumentClusterManager} deprecation message
+ *
* @hide
*/
@SystemApi
public void registerCallback(String category, Callback callback)
throws CarNotConnectedException {
- Log.i(TAG, "registerCallback, category: " + category + ", callback: " + callback);
- ClusterManagerCallback callbackToCarService = null;
- synchronized (mLock) {
- Set<Callback> callbacks = mCallbacksByCategory.get(category);
- if (callbacks == null) {
- callbacks = new HashSet<>(1);
- mCallbacksByCategory.put(category, callbacks);
- }
- if (!callbacks.add(callback)) {
- Log.w(TAG, "registerCallback: already registered");
- return; // already registered
- }
-
- if (mActivityStatesByCategory.containsKey(category)) {
- Log.i(TAG, "registerCallback: sending activity state...");
- callback.onClusterActivityStateChanged(
- category, mActivityStatesByCategory.get(category));
- }
-
- if (mServiceToManagerCallback == null) {
- Log.i(TAG, "registerCallback: registering callback with car service...");
- mServiceToManagerCallback = new ClusterManagerCallback();
- callbackToCarService = mServiceToManagerCallback;
- }
- }
- try {
- mService.registerCallback(callbackToCarService);
- Log.i(TAG, "registerCallback: done");
- } catch (RemoteException e) {
- throw new CarNotConnectedException(e);
- }
+ // No-op
}
/**
@@ -134,46 +93,29 @@
*
* @param callback previously registered callback
*
+ * @deprecated see {@link CarInstrumentClusterManager} deprecation message
+ *
* @hide
*/
@SystemApi
public void unregisterCallback(Callback callback) throws CarNotConnectedException {
- List<String> keysToRemove = new ArrayList<>(1);
- synchronized (mLock) {
- for (Map.Entry<String, Set<Callback>> entry : mCallbacksByCategory.entrySet()) {
- Set<Callback> callbacks = entry.getValue();
- if (callbacks.remove(callback) && callbacks.isEmpty()) {
- keysToRemove.add(entry.getKey());
- }
-
- }
-
- for (String key: keysToRemove) {
- mCallbacksByCategory.remove(key);
- }
-
- if (mCallbacksByCategory.isEmpty()) {
- try {
- mService.unregisterCallback(mServiceToManagerCallback);
- } catch (RemoteException e) {
- throw new CarNotConnectedException(e);
- }
- mServiceToManagerCallback = null;
- }
- }
+ // No-op
}
/** @hide */
public CarInstrumentClusterManager(IBinder service, Handler handler) {
- mService = IInstrumentClusterManagerService.Stub.asInterface(service);
-
- mHandler = new EventHandler(handler.getLooper());
+ // No-op
}
- /** @hide */
+ /**
+ * @deprecated activity state is not longer being reported. See
+ * {@link CarInstrumentClusterManager} deprecation message for more details.
+ *
+ * @hide
+ */
+ @Deprecated
@SystemApi
public interface Callback {
-
/**
* Notify client that activity state was changed.
*
@@ -187,54 +129,4 @@
@Override
public void onCarDisconnected() {
}
-
- private class EventHandler extends Handler {
-
- final static int MSG_ACTIVITY_STATE = 1;
-
- EventHandler(Looper looper) {
- super(looper);
- }
-
- @Override
- public void handleMessage(Message msg) {
- Log.i(TAG, "handleMessage, message: " + msg);
- switch (msg.what) {
- case MSG_ACTIVITY_STATE:
- Pair<String, Bundle> info = (Pair<String, Bundle>) msg.obj;
- String category = info.first;
- Bundle state = info.second;
- List<CarInstrumentClusterManager.Callback> callbacks = null;
- synchronized (mLock) {
- if (mCallbacksByCategory.containsKey(category)) {
- callbacks = new ArrayList<>(mCallbacksByCategory.get(category));
- }
- }
- Log.i(TAG, "handleMessage, callbacks: " + callbacks);
- if (callbacks != null) {
- for (CarInstrumentClusterManager.Callback cb : callbacks) {
- cb.onClusterActivityStateChanged(category, state);
- }
- }
- break;
- default:
- Log.e(TAG, "Unexpected message: " + msg.what);
- }
- }
- }
-
- private class ClusterManagerCallback extends IInstrumentClusterManagerCallback.Stub {
-
- @Override
- public void setClusterActivityState(String category, Bundle clusterActivityState)
- throws RemoteException {
- Log.i(TAG, "setClusterActivityState, category: " + category);
- synchronized (mLock) {
- mActivityStatesByCategory.put(category, clusterActivityState);
- }
-
- mHandler.sendMessage(mHandler.obtainMessage(EventHandler.MSG_ACTIVITY_STATE,
- new Pair<>(category, clusterActivityState)));
- }
- }
}
\ No newline at end of file
diff --git a/car-lib/src/android/car/cluster/ClusterActivityState.java b/car-lib/src/android/car/cluster/ClusterActivityState.java
index 9a6223c..79f7e76 100644
--- a/car-lib/src/android/car/cluster/ClusterActivityState.java
+++ b/car-lib/src/android/car/cluster/ClusterActivityState.java
@@ -23,6 +23,7 @@
/**
* Helper class that represents activity state in the cluster and can be serialized / deserialized
* to/from bundle.
+ *
* @hide
*/
public class ClusterActivityState {
@@ -34,24 +35,65 @@
private Rect mUnobscuredBounds;
private Bundle mExtras;
+ /**
+ * Returns true if the cluster is currently able to display content, or false if the content
+ * area of the cluster is hidden.
+ */
public boolean isVisible() {
return mVisible;
}
+ /**
+ * Get a rectangle inside the cluster content area that is not covered by any decorations.
+ * Activities designed to display content in the instrument cluster can use this information to
+ * determine where to display user-relevant content, while using the rest of the window for
+ * content bleeding. For example, a navigation activity could decide to display current road
+ * inside this rectangle, while drawing additional map background outside this area.
+ * <p>
+ * All values of this {@link Rect} represent absolute coordinates inside the activity canvas.
+ */
@Nullable public Rect getUnobscuredBounds() {
return mUnobscuredBounds;
}
+ /**
+ * Get any custom extras that were set on this activity state.
+ */
+ @Nullable public Bundle getExtras() {
+ return mExtras;
+ }
+
+ /**
+ * Sets whether the cluster is currently able to display content, or false if content area of
+ * the cluster is hidden.
+ *
+ * @return this instance for chaining.
+ */
public ClusterActivityState setVisible(boolean visible) {
mVisible = visible;
return this;
}
+ /**
+ * Sets a rectangle inside that cluster content area that is not covered by any decorations.
+ * Activities designed to display content in the cluster can use this to determine where to
+ * display user-relevant content, while using the rest of the window for content bleeding.
+ *
+ * @param unobscuredBounds a {@link Rect} describing the area inside the activity canvas that is
+ * not covered by any decorations. All values of this {@link Rect}
+ * represent absolute coordinates inside the activity canvas.
+ * @return this instance for chaining.
+ */
public ClusterActivityState setUnobscuredBounds(Rect unobscuredBounds) {
mUnobscuredBounds = unobscuredBounds;
return this;
}
+ /**
+ * Set any custom extras to be included with the activity state.
+ *
+ * @return this instance for chaining.
+ */
public ClusterActivityState setExtras(Bundle bundle) {
mExtras = bundle;
return this;
@@ -60,12 +102,19 @@
/** Use factory methods instead. */
private ClusterActivityState() {}
+ /**
+ * Creates a {@link ClusterActivityState} with the given visibility and unobscured bounds (see
+ * {@link #setVisible(boolean)} and {@link #setUnobscuredBounds(Rect)} for more details)
+ */
public static ClusterActivityState create(boolean visible, Rect unobscuredBounds) {
return new ClusterActivityState()
.setVisible(visible)
.setUnobscuredBounds(unobscuredBounds);
}
+ /**
+ * Reconstructs a {@link ClusterActivityState} from a {@link Bundle}
+ */
public static ClusterActivityState fromBundle(Bundle bundle) {
return new ClusterActivityState()
.setVisible(bundle.getBoolean(KEY_VISIBLE, true))
@@ -73,6 +122,10 @@
.setExtras(bundle.getBundle(KEY_EXTRAS));
}
+ /**
+ * Returns a {@link Bundle} representation of this instance. This bundle can then be
+ * deserialized using {@link #fromBundle(Bundle)}.
+ */
public Bundle toBundle() {
Bundle b = new Bundle();
b.putBoolean(KEY_VISIBLE, mVisible);
@@ -85,7 +138,8 @@
public String toString() {
return this.getClass().getSimpleName() + " {"
+ "visible: " + mVisible + ", "
- + "unobscuredBounds: " + mUnobscuredBounds
+ + "unobscuredBounds: " + mUnobscuredBounds + ", "
+ + "extras: " + mExtras
+ " }";
}
}
diff --git a/car-lib/src/android/car/cluster/IInstrumentClusterManagerCallback.aidl b/car-lib/src/android/car/cluster/IInstrumentClusterManagerCallback.aidl
index 91a497d..d2f099e 100644
--- a/car-lib/src/android/car/cluster/IInstrumentClusterManagerCallback.aidl
+++ b/car-lib/src/android/car/cluster/IInstrumentClusterManagerCallback.aidl
@@ -19,6 +19,8 @@
/**
* Interface from Car Service to {@link android.car.cluster.CarInstrumentClusterManager}
+ *
+ * @deprecated CarInstrumentClusterManager is deprecated
* @hide
*/
interface IInstrumentClusterManagerCallback {
@@ -29,7 +31,6 @@
* see {@link android.car.cluster.CarInstrumentClusterManager} for details.
* @param clusterActivityState is a {@link Bundle} object,
* see {@link android.car.cluster.ClusterActivityState} for how to construct the bundle.
- * @hide
*/
oneway void setClusterActivityState(String category, in Bundle clusterActivityState);
}
diff --git a/car-lib/src/android/car/cluster/IInstrumentClusterManagerService.aidl b/car-lib/src/android/car/cluster/IInstrumentClusterManagerService.aidl
index aaaeaee..1f4988d 100644
--- a/car-lib/src/android/car/cluster/IInstrumentClusterManagerService.aidl
+++ b/car-lib/src/android/car/cluster/IInstrumentClusterManagerService.aidl
@@ -22,6 +22,7 @@
/**
* API to communicate between {@link CarInstrumentClusterManager} and Car Service.
*
+ * @deprecated CarInstrumentClusterManager is deprecated
* @hide
*/
interface IInstrumentClusterManagerService {
diff --git a/car-lib/src/android/car/cluster/renderer/IInstrumentCluster.aidl b/car-lib/src/android/car/cluster/renderer/IInstrumentCluster.aidl
index 3458975..7deecc7 100644
--- a/car-lib/src/android/car/cluster/renderer/IInstrumentCluster.aidl
+++ b/car-lib/src/android/car/cluster/renderer/IInstrumentCluster.aidl
@@ -15,22 +15,29 @@
*/
package android.car.cluster.renderer;
-import android.car.cluster.renderer.IInstrumentClusterCallback;
import android.car.cluster.renderer.IInstrumentClusterNavigation;
import android.view.KeyEvent;
/**
- * Binder API for Instrument Cluster.
+ * Binder API for Instrument Cluster. It defines a communication channel from Car Service to the
+ * cluster vendor implementation.
*
* @hide
*/
interface IInstrumentCluster {
- /** Returns {@link IInstrumentClusterNavigation} that will be passed to the Nav app */
+ /**
+ * Returns {@link IInstrumentClusterNavigation} that will be passed to the navigation
+ * application.
+ */
IInstrumentClusterNavigation getNavigationService();
- /** Supplies Instrument Cluster Renderer with current owner of Navigation app context */
+ /**
+ * Supplies Instrument Cluster Renderer with current owner of Navigation app context
+ */
oneway void setNavigationContextOwner(int uid, int pid);
- /** Called when key event that was addressed to instrument cluster display has been received. */
+ /**
+ * Called when key event that was addressed to instrument cluster display has been received.
+ */
oneway void onKeyEvent(in KeyEvent keyEvent);
}
diff --git a/car-lib/src/android/car/cluster/renderer/IInstrumentClusterCallback.aidl b/car-lib/src/android/car/cluster/renderer/IInstrumentClusterCallback.aidl
deleted file mode 100644
index 996dc9e..0000000
--- a/car-lib/src/android/car/cluster/renderer/IInstrumentClusterCallback.aidl
+++ /dev/null
@@ -1,54 +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.car.cluster.renderer;
-
-import android.graphics.Rect;
-import android.os.Bundle;
-
-/**
- * This interface defines the communication channel between the cluster vendor implementation and
- * Car Service.
- *
- * @hide
- */
-interface IInstrumentClusterCallback {
- /**
- * Notify Car Service how to launch an activity for particular category.
- *
- * @param category cluster activity category,
- * see {@link android.car.cluster.CarInstrumentClusterManager} for details.
- * @param activityOptions this bundle will be converted to {@link android.app.ActivityOptions}
- * and used when starting an activity. It may contain information such as virtual display
- * id or activity stack id where to start cluster activity.
- *
- * @hide
- */
- void setClusterActivityLaunchOptions(String category, in Bundle activityOptions);
-
- /**
- * Activities launched on virtual display will be in onPause state most of the time, so they
- * can't really know whether they visible on the screen or not. We need to propagate this
- * information along with unobscured bounds (and possible other info) from instrument cluster
- * vendor implementation to activity.
- *
- * @param category cluster activity category to which this state applies,
- * see {@link android.car.cluster.CarInstrumentClusterManager} for details.
- * @param clusterActivityState is a {@link Bundle} object,
- * see {@link android.car.cluster.ClusterActivityState} for how to construct the bundle.
- * @hide
- */
- void setClusterActivityState(String category, in Bundle clusterActivityState);
-}
diff --git a/car-lib/src/android/car/cluster/renderer/IInstrumentClusterNavigation.aidl b/car-lib/src/android/car/cluster/renderer/IInstrumentClusterNavigation.aidl
index 6f33a9d..c4e9d72 100644
--- a/car-lib/src/android/car/cluster/renderer/IInstrumentClusterNavigation.aidl
+++ b/car-lib/src/android/car/cluster/renderer/IInstrumentClusterNavigation.aidl
@@ -16,15 +16,29 @@
package android.car.cluster.renderer;
import android.car.navigation.CarNavigationInstrumentCluster;
+import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
/**
- * Binder API for Instrument Cluster Navigation.
+ * Binder API for Instrument Cluster Navigation. This represents a direct communication channel
+ * from navigation applications to the cluster vendor implementation.
*
* @hide
*/
interface IInstrumentClusterNavigation {
+ /**
+ * Called when an event is fired to change the navigation state. Content of this events can be
+ * interpreted using androidx.car.car-cluster API.
+ *
+ * @param eventType type of navigation state change
+ * @param bundle {@link android.os.Bundle} containing the description of the navigation state
+ * change.
+ */
void onEvent(int eventType, in Bundle bundle);
+
+ /**
+ * Returns attributes of instrument cluster for navigation.
+ */
CarNavigationInstrumentCluster getInstrumentClusterInfo();
}
diff --git a/car-lib/src/android/car/cluster/renderer/InstrumentClusterRenderer.java b/car-lib/src/android/car/cluster/renderer/InstrumentClusterRenderer.java
index 5086186..be4cfd4 100644
--- a/car-lib/src/android/car/cluster/renderer/InstrumentClusterRenderer.java
+++ b/car-lib/src/android/car/cluster/renderer/InstrumentClusterRenderer.java
@@ -18,16 +18,15 @@
import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.annotation.UiThread;
-import android.car.navigation.CarNavigationInstrumentCluster;
import android.content.Context;
/**
- * Interface for instrument cluster rendering.
- *
- * TODO: implement instrument cluster feature list and extend API. bug: 32060603
+ * @deprecated This class is unused. Refer to {@link InstrumentClusterRenderingService} for
+ * documentation on how to build a instrument cluster renderer.
*
* @hide
*/
+@Deprecated
@SystemApi
public abstract class InstrumentClusterRenderer {
diff --git a/car-lib/src/android/car/cluster/renderer/InstrumentClusterRenderingService.java b/car-lib/src/android/car/cluster/renderer/InstrumentClusterRenderingService.java
index d572d9a..6874106 100644
--- a/car-lib/src/android/car/cluster/renderer/InstrumentClusterRenderingService.java
+++ b/car-lib/src/android/car/cluster/renderer/InstrumentClusterRenderingService.java
@@ -15,30 +15,44 @@
*/
package android.car.cluster.renderer;
+import static android.content.PermissionChecker.PERMISSION_GRANTED;
+
import android.annotation.CallSuper;
import android.annotation.MainThread;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.app.ActivityOptions;
import android.app.Service;
+import android.car.Car;
import android.car.CarLibLog;
import android.car.CarNotConnectedException;
+import android.car.cluster.ClusterActivityState;
import android.car.navigation.CarNavigationInstrumentCluster;
+import android.content.ActivityNotFoundException;
+import android.content.ComponentName;
import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
-import android.os.Message;
import android.os.RemoteException;
+import android.os.UserHandle;
import android.util.Log;
-import android.util.Pair;
import android.view.KeyEvent;
import com.android.internal.annotations.GuardedBy;
import java.io.FileDescriptor;
import java.io.PrintWriter;
-import java.lang.ref.WeakReference;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.Supplier;
/**
* A service that used for interaction between Car Service and Instrument Cluster. Car Service may
@@ -58,18 +72,31 @@
*/
@SystemApi
public abstract class InstrumentClusterRenderingService extends Service {
-
private static final String TAG = CarLibLog.TAG_CLUSTER;
- private RendererBinder mRendererBinder;
-
- /** @hide */
- public static final String EXTRA_KEY_CALLBACK_SERVICE =
- "android.car.cluster.IInstrumentClusterCallback";
-
private final Object mLock = new Object();
+ private RendererBinder mRendererBinder;
+ private Handler mUiHandler = new Handler(Looper.getMainLooper());
+ private ActivityOptions mActivityOptions;
+ private ClusterActivityState mActivityState;
+ private ComponentName mNavigationComponent;
@GuardedBy("mLock")
- private IInstrumentClusterCallback mCallback;
+ private ContextOwner mNavContextOwner;
+
+ private static class ContextOwner {
+ final int mUid;
+ final int mPid;
+
+ ContextOwner(int uid, int pid) {
+ mUid = uid;
+ mPid = pid;
+ }
+
+ @Override
+ public String toString() {
+ return "{uid: " + mUid + ", pid: " + mPid + "}";
+ }
+ }
@Override
@CallSuper
@@ -78,15 +105,6 @@
Log.d(TAG, "onBind, intent: " + intent);
}
- if (intent.getExtras().containsKey(EXTRA_KEY_CALLBACK_SERVICE)) {
- IBinder callbackBinder = intent.getExtras().getBinder(EXTRA_KEY_CALLBACK_SERVICE);
- synchronized (mLock) {
- mCallback = IInstrumentClusterCallback.Stub.asInterface(callbackBinder);
- }
- } else {
- Log.w(TAG, "onBind, no callback in extra!");
- }
-
if (mRendererBinder == null) {
mRendererBinder = new RendererBinder(getNavigationRenderer());
}
@@ -94,196 +112,314 @@
return mRendererBinder;
}
- /** Returns {@link NavigationRenderer} or null if it's not supported. */
+ /**
+ * Returns {@link NavigationRenderer} or null if it's not supported. This renderer will be
+ * shared with the navigation context owner (application holding navigation focus).
+ */
@MainThread
- protected abstract NavigationRenderer getNavigationRenderer();
+ @Nullable
+ public abstract NavigationRenderer getNavigationRenderer();
- /** Called when key event that was addressed to instrument cluster display has been received. */
+ /**
+ * Called when key event that was addressed to instrument cluster display has been received.
+ */
@MainThread
- protected void onKeyEvent(KeyEvent keyEvent) {
+ public void onKeyEvent(@NonNull KeyEvent keyEvent) {
}
/**
+ * Called when a navigation application becomes a context owner (receives navigation focus) and
+ * its {@link Car#CATEGORY_NAVIGATION} activity is launched.
+ */
+ @MainThread
+ public void onNavigationComponentLaunched() {
+ }
+
+ /**
+ * Called when the current context owner (application holding navigation focus) releases the
+ * focus and its {@link Car#CAR_CATEGORY_NAVIGATION} activity is ready to be replaced by a
+ * system default.
+ */
+ @MainThread
+ public void onNavigationComponentReleased() {
+ }
+
+ /**
+ * Updates the cluster navigation activity by checking which activity to show (an activity of
+ * the {@link #mNavContextOwner}). If not yet launched, it will do so.
+ */
+ private void updateNavigationActivity() {
+ ContextOwner contextOwner = getNavigationContextOwner();
+
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, String.format("updateNavigationActivity (mActivityOptions: %s, "
+ + "mActivityState: %s, mNavContextOwnerUid: %s)", mActivityOptions,
+ mActivityState, contextOwner));
+ }
+
+ if (contextOwner == null || contextOwner.mUid == 0 || mActivityOptions == null
+ || mActivityState == null || !mActivityState.isVisible()) {
+ // We are not yet ready to display an activity on the cluster
+ if (mNavigationComponent != null) {
+ mNavigationComponent = null;
+ onNavigationComponentReleased();
+ }
+ return;
+ }
+
+ ComponentName component = getNavigationComponentByOwner(contextOwner);
+ if (Objects.equals(mNavigationComponent, component)) {
+ // We have already launched this component.
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "Already launched component: " + component);
+ }
+ return;
+ }
+
+ if (component == null) {
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "No component found for owner: " + contextOwner);
+ }
+ return;
+ }
+
+ if (!startNavigationActivity(component)) {
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "Unable to launch component: " + component);
+ }
+ return;
+ }
+
+ mNavigationComponent = component;
+ onNavigationComponentLaunched();
+ }
+
+ /**
+ * Returns a component with category {@link Car#CAR_CATEGORY_NAVIGATION} from the same package
+ * as the given navigation context owner.
+ */
+ @Nullable
+ private ComponentName getNavigationComponentByOwner(ContextOwner contextOwner) {
+ for (String packageName : getPackageNamesForUid(contextOwner)) {
+ ComponentName component = getComponentFromPackage(packageName);
+ if (component != null) {
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "Found component: " + component);
+ }
+ return component;
+ }
+ }
+ return null;
+ }
+
+ private String[] getPackageNamesForUid(ContextOwner contextOwner) {
+ if (contextOwner == null || contextOwner.mUid == 0 || contextOwner.mPid == 0) {
+ return new String[0];
+ }
+ String[] packageNames = getPackageManager().getPackagesForUid(contextOwner.mUid);
+ return packageNames != null ? packageNames : new String[0];
+ }
+
+ private ContextOwner getNavigationContextOwner() {
+ synchronized (mLock) {
+ return mNavContextOwner;
+ }
+ }
+
+ @Nullable
+ private ComponentName getComponentFromPackage(@NonNull String packageName) {
+ PackageManager packageManager = getPackageManager();
+
+ // Check package permission.
+ if (packageManager.checkPermission(Car.PERMISSION_CAR_DISPLAY_IN_CLUSTER, packageName)
+ != PERMISSION_GRANTED) {
+ Log.i(TAG, String.format("Package '%s' doesn't have permission %s", packageName,
+ Car.PERMISSION_CAR_DISPLAY_IN_CLUSTER));
+ return null;
+ }
+
+ Intent intent = new Intent(Intent.ACTION_MAIN)
+ .addCategory(Car.CAR_CATEGORY_NAVIGATION)
+ .setPackage(packageName);
+ List<ResolveInfo> resolveList = packageManager.queryIntentActivities(intent,
+ PackageManager.GET_RESOLVED_FILTER);
+ if (resolveList == null || resolveList.isEmpty()
+ || resolveList.get(0).getComponentInfo() == null) {
+ Log.i(TAG, "Failed to resolve an intent: " + intent);
+ return null;
+ }
+
+ // In case of multiple matching activities in the same package, we pick the first one.
+ return resolveList.get(0).getComponentInfo().getComponentName();
+ }
+
+ /**
+ * Starts an activity on the cluster using the given component.
*
+ * @return false if the activity couldn't be started.
+ */
+ protected boolean startNavigationActivity(@NonNull ComponentName component) {
+ // Create an explicit intent.
+ Intent intent = new Intent();
+ intent.setComponent(component);
+ intent.putExtra(Car.CAR_EXTRA_CLUSTER_ACTIVITY_STATE, mActivityState.toBundle());
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ try {
+ startActivityAsUser(intent, mActivityOptions.toBundle(), UserHandle.CURRENT);
+ Log.i(TAG, String.format("Activity launched: %s (options: %s, displayId: %d)",
+ mActivityOptions, intent, mActivityOptions.getLaunchDisplayId()));
+ } catch (ActivityNotFoundException ex) {
+ Log.w(TAG, "Unable to find activity for intent: " + intent);
+ return false;
+ } catch (Exception ex) {
+ // Catch all other possible exception to prevent service disruption by misbehaving
+ // applications.
+ Log.e(TAG, "Error trying to launch intent: " + intent + ". Ignored", ex);
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * @deprecated Use {@link #setClusterActivityLaunchOptions(ActivityOptions)} instead.
+ *
+ * @hide
+ */
+ @Deprecated
+ public void setClusterActivityLaunchOptions(String category, ActivityOptions activityOptions)
+ throws CarNotConnectedException {
+ setClusterActivityLaunchOptions(activityOptions);
+ }
+
+ /**
* Sets configuration for activities that should be launched directly in the instrument
* cluster.
*
- * @param category category of cluster activity
* @param activityOptions contains information of how to start cluster activity (on what display
- * or activity stack.
+ * or activity stack).
*
* @hide
*/
- public void setClusterActivityLaunchOptions(String category,
- ActivityOptions activityOptions) throws CarNotConnectedException {
- IInstrumentClusterCallback cb;
- synchronized (mLock) {
- cb = mCallback;
- }
- if (cb == null) throw new CarNotConnectedException();
- try {
- cb.setClusterActivityLaunchOptions(category, activityOptions.toBundle());
- } catch (RemoteException e) {
- throw new CarNotConnectedException(e);
- }
+ public void setClusterActivityLaunchOptions(ActivityOptions activityOptions) {
+ mActivityOptions = activityOptions;
+ updateNavigationActivity();
}
/**
- *
- * @param category cluster activity category,
- * see {@link android.car.cluster.CarInstrumentClusterManager}
- * @param state pass information about activity state,
- * see {@link android.car.cluster.ClusterActivityState}
- * @return true if information was sent to Car Service
- * @throws CarNotConnectedException
+ * @deprecated Use {@link #setClusterActivityState(ClusterActivityState)} instead.
*
* @hide
*/
- public void setClusterActivityState(String category, Bundle state)
- throws CarNotConnectedException {
- IInstrumentClusterCallback cb;
- synchronized (mLock) {
- cb = mCallback;
- }
- if (cb == null) throw new CarNotConnectedException();
- try {
- cb.setClusterActivityState(category, state);
- } catch (RemoteException e) {
- throw new CarNotConnectedException(e);
- }
+ @Deprecated
+ public void setClusterActivityState(String category, Bundle state) throws
+ CarNotConnectedException {
+ setClusterActivityState(ClusterActivityState.fromBundle(state));
}
+ /**
+ * Set activity state (such as unobscured bounds).
+ *
+ * @param state pass information about activity state, see
+ * {@link android.car.cluster.ClusterActivityState}
+ *
+ * @hide
+ */
+ public void setClusterActivityState(ClusterActivityState state) {
+ mActivityState = state;
+ updateNavigationActivity();
+ }
+ @CallSuper
@Override
protected void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
writer.println("**" + getClass().getSimpleName() + "**");
writer.println("renderer binder: " + mRendererBinder);
if (mRendererBinder != null) {
writer.println("navigation renderer: " + mRendererBinder.mNavigationRenderer);
- String owner = "none";
- synchronized (mLock) {
- if (mRendererBinder.mNavContextOwner != null) {
- owner = "[uid: " + mRendererBinder.mNavContextOwner.first
- + ", pid: " + mRendererBinder.mNavContextOwner.second + "]";
- }
- }
- writer.println("navigation focus owner: " + owner);
}
- IInstrumentClusterCallback cb;
- synchronized (mLock) {
- cb = mCallback;
- }
- writer.println("callback: " + cb);
+ writer.println("navigation focus owner: " + getNavigationContextOwner());
+ writer.println("activity options: " + mActivityOptions);
+ writer.println("activity state: " + mActivityState);
+ writer.println("current nav component: " + mNavigationComponent);
+ writer.println("current nav packages: " + Arrays.toString(getPackageNamesForUid(
+ getNavigationContextOwner())));
}
private class RendererBinder extends IInstrumentCluster.Stub {
-
private final NavigationRenderer mNavigationRenderer;
- private final UiHandler mUiHandler;
-
- @GuardedBy("mLock")
- private NavigationBinder mNavigationBinder;
- @GuardedBy("mLock")
- private Pair<Integer, Integer> mNavContextOwner;
RendererBinder(NavigationRenderer navigationRenderer) {
mNavigationRenderer = navigationRenderer;
- mUiHandler = new UiHandler(InstrumentClusterRenderingService.this);
}
@Override
public IInstrumentClusterNavigation getNavigationService() throws RemoteException {
- synchronized (mLock) {
- if (mNavigationBinder == null) {
- mNavigationBinder = new NavigationBinder(mNavigationRenderer);
- if (mNavContextOwner != null) {
- mNavigationBinder.setNavigationContextOwner(
- mNavContextOwner.first, mNavContextOwner.second);
- }
- }
- return mNavigationBinder;
- }
+ return new NavigationBinder(mNavigationRenderer);
}
@Override
public void setNavigationContextOwner(int uid, int pid) throws RemoteException {
synchronized (mLock) {
- mNavContextOwner = new Pair<>(uid, pid);
- if (mNavigationBinder != null) {
- mNavigationBinder.setNavigationContextOwner(uid, pid);
- }
+ mNavContextOwner = new ContextOwner(uid, pid);
}
+ mUiHandler.post(InstrumentClusterRenderingService.this::updateNavigationActivity);
}
@Override
public void onKeyEvent(KeyEvent keyEvent) throws RemoteException {
- mUiHandler.doKeyEvent(keyEvent);
+ mUiHandler.post(() -> InstrumentClusterRenderingService.this.onKeyEvent(keyEvent));
}
}
private class NavigationBinder extends IInstrumentClusterNavigation.Stub {
-
- private final NavigationRenderer mNavigationRenderer; // Thread-safe navigation renderer.
-
- private volatile Pair<Integer, Integer> mNavContextOwner;
+ private final NavigationRenderer mNavigationRenderer;
NavigationBinder(NavigationRenderer navigationRenderer) {
- mNavigationRenderer = ThreadSafeNavigationRenderer.createFor(
- Looper.getMainLooper(),
- navigationRenderer);
- }
-
- void setNavigationContextOwner(int uid, int pid) {
- mNavContextOwner = new Pair<>(uid, pid);
+ mNavigationRenderer = navigationRenderer;
}
@Override
public void onEvent(int eventType, Bundle bundle) throws RemoteException {
assertContextOwnership();
- mNavigationRenderer.onEvent(eventType, bundle);
+ mUiHandler.post(() -> {
+ if (mNavigationRenderer != null) {
+ mNavigationRenderer.onEvent(eventType, bundle);
+ }
+ });
}
@Override
public CarNavigationInstrumentCluster getInstrumentClusterInfo() throws RemoteException {
- return mNavigationRenderer.getNavigationProperties();
+ return runAndWaitResult(() -> mNavigationRenderer.getNavigationProperties());
}
private void assertContextOwnership() {
int uid = getCallingUid();
int pid = getCallingPid();
- Pair<Integer, Integer> owner = mNavContextOwner;
- if (owner == null || owner.first != uid || owner.second != pid) {
- throw new IllegalStateException("Client (uid:" + uid + ", pid: " + pid + ") is"
- + " not an owner of APP_FOCUS_TYPE_NAVIGATION");
+ synchronized (mLock) {
+ if (mNavContextOwner.mUid != uid || mNavContextOwner.mPid != pid) {
+ throw new IllegalStateException("Client {uid:" + uid + ", pid: " + pid + "} is"
+ + " not an owner of APP_FOCUS_TYPE_NAVIGATION " + mNavContextOwner);
+ }
}
}
}
- private static class UiHandler extends Handler {
- private static int KEY_EVENT = 0;
- private final WeakReference<InstrumentClusterRenderingService> mRefService;
+ private <E> E runAndWaitResult(final Supplier<E> supplier) {
+ final CountDownLatch latch = new CountDownLatch(1);
+ final AtomicReference<E> result = new AtomicReference<>();
- UiHandler(InstrumentClusterRenderingService service) {
- mRefService = new WeakReference<>(service);
+ mUiHandler.post(() -> {
+ result.set(supplier.get());
+ latch.countDown();
+ });
+
+ try {
+ latch.await();
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
}
-
- @Override
- public void handleMessage(Message msg) {
- InstrumentClusterRenderingService service = mRefService.get();
- if (service == null) {
- return;
- }
-
- if (msg.what == KEY_EVENT) {
- service.onKeyEvent((KeyEvent) msg.obj);
- } else {
- throw new IllegalArgumentException("Unexpected message: " + msg);
- }
- }
-
- void doKeyEvent(KeyEvent event) {
- sendMessage(obtainMessage(KEY_EVENT, event));
- }
+ return result.get();
}
}
diff --git a/car-lib/src/android/car/cluster/renderer/ThreadSafeNavigationRenderer.java b/car-lib/src/android/car/cluster/renderer/ThreadSafeNavigationRenderer.java
deleted file mode 100644
index 251b670..0000000
--- a/car-lib/src/android/car/cluster/renderer/ThreadSafeNavigationRenderer.java
+++ /dev/null
@@ -1,146 +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.car.cluster.renderer;
-
-import android.annotation.Nullable;
-import android.car.navigation.CarNavigationInstrumentCluster;
-import android.graphics.Bitmap;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
-
-import java.lang.ref.WeakReference;
-import java.util.concurrent.CountDownLatch;
-
-/**
- * A wrapper over {@link NavigationRenderer} that runs all its methods in the context of provided
- * looper. It is guaranteed that all calls will be invoked in order they were called.
- */
-// TODO(deanh): Does this class even need to exist?
-/* package */ class ThreadSafeNavigationRenderer extends NavigationRenderer {
-
- private final Handler mHandler;
- private final NavigationRenderer mRenderer;
-
- private final static int MSG_EVENT = 1;
-
- /** Creates thread-safe {@link NavigationRenderer}. Returns null if renderer == null */
- @Nullable
- static NavigationRenderer createFor(Looper looper, NavigationRenderer renderer) {
- return renderer == null ? null : new ThreadSafeNavigationRenderer(looper, renderer);
- }
-
- private ThreadSafeNavigationRenderer(Looper looper, NavigationRenderer renderer) {
- mRenderer = renderer;
- mHandler = new NavigationRendererHandler(looper, renderer);
- }
-
- @Override
- public CarNavigationInstrumentCluster getNavigationProperties() {
- if (mHandler.getLooper() == Looper.myLooper()) {
- return mRenderer.getNavigationProperties();
- } else {
- return runAndWaitResult(mHandler,
- new RunnableWithResult<CarNavigationInstrumentCluster>() {
- @Override
- protected CarNavigationInstrumentCluster createResult() {
- return mRenderer.getNavigationProperties();
- }
- });
- }
- }
-
- @Override
- public void onEvent(int eventType, Bundle bundle) {
- mHandler.sendMessage(mHandler.obtainMessage(MSG_EVENT, eventType, 0, bundle));
- }
-
- private static class NavigationRendererHandler extends RendererHandler<NavigationRenderer> {
-
- NavigationRendererHandler(Looper looper, NavigationRenderer renderer) {
- super(looper, renderer);
- }
-
- @Override
- public void handleMessage(Message msg, NavigationRenderer renderer) {
- switch (msg.what) {
- case MSG_EVENT:
- Bundle bundle = (Bundle) msg.obj;
- renderer.onEvent(msg.arg1, bundle);
- break;
- default:
- throw new IllegalArgumentException("Msg: " + msg.what);
- }
- }
- }
-
- private static <E> E runAndWaitResult(Handler handler, final RunnableWithResult<E> runnable) {
- final CountDownLatch latch = new CountDownLatch(1);
-
- Runnable wrappedRunnable = new Runnable() {
- @Override
- public void run() {
- runnable.run();
- latch.countDown();
- }
- };
-
- handler.post(wrappedRunnable);
-
- try {
- latch.await();
- } catch (InterruptedException e) {
- throw new RuntimeException(e);
- }
- return runnable.getResult();
- }
-
- private static abstract class RunnableWithResult<T> implements Runnable {
- private volatile T result;
-
- protected abstract T createResult();
-
- @Override
- public void run() {
- result = createResult();
- }
-
- public T getResult() {
- return result;
- }
- }
-
- private static abstract class RendererHandler<T> extends Handler {
-
- private final WeakReference<T> mRendererRef;
-
- RendererHandler(Looper looper, T renderer) {
- super(looper);
- mRendererRef = new WeakReference<>(renderer);
- }
-
- @Override
- public void handleMessage(Message msg) {
- T renderer = mRendererRef.get();
- if (renderer != null) {
- handleMessage(msg, renderer);
- }
- }
-
- public abstract void handleMessage(Message msg, T renderer);
- }
-}
diff --git a/car-lib/src/android/car/drivingstate/CarUxRestrictions.java b/car-lib/src/android/car/drivingstate/CarUxRestrictions.java
index 87dfa3a..acccfdd 100644
--- a/car-lib/src/android/car/drivingstate/CarUxRestrictions.java
+++ b/car-lib/src/android/car/drivingstate/CarUxRestrictions.java
@@ -328,12 +328,14 @@
dest.writeInt(mMaxContentDepth);
}
- public static final Parcelable.Creator<CarUxRestrictions> CREATOR
- = new Parcelable.Creator<CarUxRestrictions>() {
+ public static final Parcelable.Creator<CarUxRestrictions> CREATOR =
+ new Parcelable.Creator<CarUxRestrictions>() {
+ @Override
public CarUxRestrictions createFromParcel(Parcel in) {
return new CarUxRestrictions(in);
}
+ @Override
public CarUxRestrictions[] newArray(int size) {
return new CarUxRestrictions[size];
}
diff --git a/car-lib/src/android/car/drivingstate/CarUxRestrictionsConfiguration.aidl b/car-lib/src/android/car/drivingstate/CarUxRestrictionsConfiguration.aidl
new file mode 100644
index 0000000..e6f85b5
--- /dev/null
+++ b/car-lib/src/android/car/drivingstate/CarUxRestrictionsConfiguration.aidl
@@ -0,0 +1,19 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.car.drivingstate;
+
+parcelable CarUxRestrictionsConfiguration;
diff --git a/car-lib/src/android/car/drivingstate/CarUxRestrictionsConfiguration.java b/car-lib/src/android/car/drivingstate/CarUxRestrictionsConfiguration.java
new file mode 100644
index 0000000..06d19df
--- /dev/null
+++ b/car-lib/src/android/car/drivingstate/CarUxRestrictionsConfiguration.java
@@ -0,0 +1,732 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.car.drivingstate;
+
+import android.annotation.FloatRange;
+import android.annotation.Nullable;
+import android.car.drivingstate.CarDrivingStateEvent.CarDrivingState;
+import android.os.Build;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.os.SystemClock;
+import android.util.ArrayMap;
+import android.util.JsonReader;
+import android.util.JsonWriter;
+import android.util.Log;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Configuration for Car UX Restrictions service.
+ *
+ * @hide
+ */
+public final class CarUxRestrictionsConfiguration implements Parcelable {
+ private static final String TAG = "CarUxRConfig";
+
+ // Constants used by json de/serialization.
+ private static final String JSON_NAME_MAX_CONTENT_DEPTH = "max_content_depth";
+ private static final String JSON_NAME_MAX_CUMULATIVE_CONTENT_ITEMS =
+ "max_cumulative_content_items";
+ private static final String JSON_NAME_MAX_STRING_LENGTH = "max_string_length";
+ private static final String JSON_NAME_MOVING_RESTRICTIONS = "moving_restrictions";
+ private static final String JSON_NAME_IDLING_RESTRICTIONS = "idling_restrictions";
+ private static final String JSON_NAME_PARKED_RESTRICTIONS = "parked_restrictions";
+ private static final String JSON_NAME_UNKNOWN_RESTRICTIONS = "unknown_restrictions";
+ private static final String JSON_NAME_REQ_OPT = "req_opt";
+ private static final String JSON_NAME_RESTRICTIONS = "restrictions";
+ private static final String JSON_NAME_SPEED_RANGE = "speed_range";
+ private static final String JSON_NAME_MIN_SPEED = "min_speed";
+ private static final String JSON_NAME_MAX_SPEED = "max_speed";
+
+ private final int mMaxContentDepth;
+ private final int mMaxCumulativeContentItems;
+ private final int mMaxStringLength;
+ private final Map<Integer, List<RestrictionsPerSpeedRange>> mUxRestrictions =
+ new ArrayMap<>(DRIVING_STATES.length);
+
+ private CarUxRestrictionsConfiguration(CarUxRestrictionsConfiguration.Builder builder) {
+ mMaxContentDepth = builder.mMaxContentDepth;
+ mMaxCumulativeContentItems = builder.mMaxCumulativeContentItems;
+ mMaxStringLength = builder.mMaxStringLength;
+
+ for (int drivingState : DRIVING_STATES) {
+ List<RestrictionsPerSpeedRange> list = new ArrayList<>();
+ for (RestrictionsPerSpeedRange r : builder.mUxRestrictions.get(drivingState)) {
+ list.add(r);
+ }
+ mUxRestrictions.put(drivingState, list);
+ }
+ }
+
+ /**
+ * Returns the restrictions based on current driving state and speed.
+ */
+ public CarUxRestrictions getUxRestrictions(@CarDrivingState int drivingState,
+ float currentSpeed) {
+ List<RestrictionsPerSpeedRange> restrictions = mUxRestrictions.get(drivingState);
+ if (restrictions.isEmpty()) {
+ if (Build.IS_ENG || Build.IS_USERDEBUG) {
+ throw new IllegalStateException("No restrictions for driving state "
+ + getDrivingStateName(drivingState));
+ }
+ return createDefaultUxRestrictionsEvent();
+ }
+
+ RestrictionsPerSpeedRange restriction = null;
+ if (restrictions.size() == 1) {
+ restriction = restrictions.get(0);
+ } else {
+ for (RestrictionsPerSpeedRange r : restrictions) {
+ if (r.mSpeedRange != null && r.mSpeedRange.includes(currentSpeed)) {
+ restriction = r;
+ break;
+ }
+ }
+ }
+
+ if (restriction == null) {
+ if (Build.IS_ENG || Build.IS_USERDEBUG) {
+ throw new IllegalStateException(
+ "No restrictions found for driving state " + drivingState
+ + " at speed " + currentSpeed);
+ }
+ return createDefaultUxRestrictionsEvent();
+ }
+ return createUxRestrictionsEvent(restriction.mReqOpt, restriction.mRestrictions);
+ }
+
+ private CarUxRestrictions createDefaultUxRestrictionsEvent() {
+ return createUxRestrictionsEvent(true,
+ CarUxRestrictions.UX_RESTRICTIONS_FULLY_RESTRICTED);
+ }
+
+ /**
+ * Creates CarUxRestrictions with restrictions parameters from current configuration.
+ */
+ private CarUxRestrictions createUxRestrictionsEvent(boolean requiresOpt,
+ @CarUxRestrictions.CarUxRestrictionsInfo int uxr) {
+ // In case the UXR is not baseline, set requiresDistractionOptimization to true since it
+ // doesn't make sense to have an active non baseline restrictions without
+ // requiresDistractionOptimization set to true.
+ if (uxr != CarUxRestrictions.UX_RESTRICTIONS_BASELINE) {
+ requiresOpt = true;
+ }
+ CarUxRestrictions.Builder builder = new CarUxRestrictions.Builder(requiresOpt, uxr,
+ SystemClock.elapsedRealtimeNanos());
+ if (mMaxStringLength != Builder.UX_RESTRICTIONS_UNKNOWN) {
+ builder.setMaxStringLength(mMaxStringLength);
+ }
+ if (mMaxCumulativeContentItems != Builder.UX_RESTRICTIONS_UNKNOWN) {
+ builder.setMaxCumulativeContentItems(mMaxCumulativeContentItems);
+ }
+ if (mMaxContentDepth != Builder.UX_RESTRICTIONS_UNKNOWN) {
+ builder.setMaxContentDepth(mMaxContentDepth);
+ }
+ return builder.build();
+ }
+
+ // Json de/serialization methods.
+
+ /**
+ * Writes current configuration as Json.
+ */
+ public void writeJson(JsonWriter writer) throws IOException {
+ // We need to be lenient to accept infinity number (as max speed).
+ writer.setLenient(true);
+
+ writer.beginObject();
+
+ writer.name(JSON_NAME_MAX_CONTENT_DEPTH).value(mMaxContentDepth);
+ writer.name(JSON_NAME_MAX_CUMULATIVE_CONTENT_ITEMS).value(
+ mMaxCumulativeContentItems);
+ writer.name(JSON_NAME_MAX_STRING_LENGTH).value(mMaxStringLength);
+
+ writer.name(JSON_NAME_PARKED_RESTRICTIONS);
+ writeRestrictionsList(writer,
+ mUxRestrictions.get(CarDrivingStateEvent.DRIVING_STATE_PARKED));
+
+ writer.name(JSON_NAME_IDLING_RESTRICTIONS);
+ writeRestrictionsList(writer,
+ mUxRestrictions.get(CarDrivingStateEvent.DRIVING_STATE_IDLING));
+
+ writer.name(JSON_NAME_MOVING_RESTRICTIONS);
+ writeRestrictionsList(writer,
+ mUxRestrictions.get(CarDrivingStateEvent.DRIVING_STATE_MOVING));
+
+ writer.name(JSON_NAME_UNKNOWN_RESTRICTIONS);
+ writeRestrictionsList(writer,
+ mUxRestrictions.get(CarDrivingStateEvent.DRIVING_STATE_UNKNOWN));
+
+ writer.endObject();
+ }
+
+ private void writeRestrictionsList(JsonWriter writer, List<RestrictionsPerSpeedRange> messages)
+ throws IOException {
+ writer.beginArray();
+ for (RestrictionsPerSpeedRange restrictions : messages) {
+ writeRestrictions(writer, restrictions);
+ }
+ writer.endArray();
+ }
+
+ private void writeRestrictions(JsonWriter writer, RestrictionsPerSpeedRange restrictions)
+ throws IOException {
+ writer.beginObject();
+ writer.name(JSON_NAME_REQ_OPT).value(restrictions.mReqOpt);
+ writer.name(JSON_NAME_RESTRICTIONS).value(restrictions.mRestrictions);
+ if (restrictions.mSpeedRange != null) {
+ writer.name(JSON_NAME_SPEED_RANGE);
+ writer.beginObject();
+ writer.name(JSON_NAME_MIN_SPEED).value(restrictions.mSpeedRange.mMinSpeed);
+ writer.name(JSON_NAME_MAX_SPEED).value(restrictions.mSpeedRange.mMaxSpeed);
+ writer.endObject();
+ }
+ writer.endObject();
+ }
+
+ /**
+ * Reads Json as UX restriction configuration.
+ */
+ public static CarUxRestrictionsConfiguration readJson(JsonReader reader) throws IOException {
+ // We need to be lenient to accept infinity number (as max speed).
+ reader.setLenient(true);
+
+ Builder builder = new Builder();
+ reader.beginObject();
+ while (reader.hasNext()) {
+ String name = reader.nextName();
+ if (name.equals(JSON_NAME_MAX_CONTENT_DEPTH)) {
+ builder.setMaxContentDepth(reader.nextInt());
+ } else if (name.equals(JSON_NAME_MAX_CUMULATIVE_CONTENT_ITEMS)) {
+ builder.setMaxCumulativeContentItems(reader.nextInt());
+ } else if (name.equals(JSON_NAME_MAX_STRING_LENGTH)) {
+ builder.setMaxStringLength(reader.nextInt());
+ } else if (name.equals(JSON_NAME_PARKED_RESTRICTIONS)) {
+ readRestrictionsList(reader, CarDrivingStateEvent.DRIVING_STATE_PARKED, builder);
+ } else if (name.equals(JSON_NAME_IDLING_RESTRICTIONS)) {
+ readRestrictionsList(reader, CarDrivingStateEvent.DRIVING_STATE_IDLING, builder);
+ } else if (name.equals(JSON_NAME_MOVING_RESTRICTIONS)) {
+ readRestrictionsList(reader, CarDrivingStateEvent.DRIVING_STATE_MOVING, builder);
+ } else if (name.equals(JSON_NAME_UNKNOWN_RESTRICTIONS)) {
+ readRestrictionsList(reader, CarDrivingStateEvent.DRIVING_STATE_UNKNOWN, builder);
+ } else {
+ Log.e(TAG, "Unknown name parsing json config: " + name);
+ reader.skipValue();
+ }
+ }
+ reader.endObject();
+ return builder.build();
+ }
+
+ private static void readRestrictionsList(JsonReader reader, @CarDrivingState int drivingState,
+ Builder builder) throws IOException {
+ reader.beginArray();
+ while (reader.hasNext()) {
+ readRestrictions(reader, drivingState, builder);
+ }
+ reader.endArray();
+ }
+
+ private static void readRestrictions(JsonReader reader, @CarDrivingState int drivingState,
+ Builder builder) throws IOException {
+ reader.beginObject();
+ boolean reqOpt = false;
+ int restrictions = CarUxRestrictions.UX_RESTRICTIONS_BASELINE;
+ Builder.SpeedRange speedRange = null;
+ while (reader.hasNext()) {
+ String name = reader.nextName();
+ if (name.equals(JSON_NAME_REQ_OPT)) {
+ reqOpt = reader.nextBoolean();
+ } else if (name.equals(JSON_NAME_RESTRICTIONS)) {
+ restrictions = reader.nextInt();
+ } else if (name.equals(JSON_NAME_SPEED_RANGE)) {
+ reader.beginObject();
+ // Okay to set min initial value as MAX_SPEED because SpeedRange() won't allow it.
+ float minSpeed = Builder.SpeedRange.MAX_SPEED;
+ float maxSpeed = Builder.SpeedRange.MAX_SPEED;
+
+ while (reader.hasNext()) {
+ String n = reader.nextName();
+ if (n.equals(JSON_NAME_MIN_SPEED)) {
+ minSpeed = Double.valueOf(reader.nextDouble()).floatValue();
+ } else if (n.equals(JSON_NAME_MAX_SPEED)) {
+ maxSpeed = Double.valueOf(reader.nextDouble()).floatValue();
+ } else {
+ Log.e(TAG, "Unknown name parsing json config: " + n);
+ reader.skipValue();
+ }
+ }
+ speedRange = new Builder.SpeedRange(minSpeed, maxSpeed);
+ reader.endObject();
+ }
+ }
+ reader.endObject();
+ builder.setUxRestrictions(drivingState, speedRange, reqOpt, restrictions);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null || !(obj instanceof CarUxRestrictionsConfiguration)) {
+ return false;
+ }
+
+ CarUxRestrictionsConfiguration other = (CarUxRestrictionsConfiguration) obj;
+
+ // Compare UXR parameters.
+ if (mMaxContentDepth != other.mMaxContentDepth
+ || mMaxCumulativeContentItems != other.mMaxCumulativeContentItems
+ || mMaxStringLength != other.mMaxStringLength) {
+ return false;
+ }
+
+ // Compare UXR by driving state.
+ if (!mUxRestrictions.keySet().equals(other.mUxRestrictions.keySet())) {
+ return false;
+ }
+ for (int drivingState : mUxRestrictions.keySet()) {
+ List<RestrictionsPerSpeedRange> restrictions = mUxRestrictions.get(
+ drivingState);
+ List<RestrictionsPerSpeedRange> otherRestrictions = other.mUxRestrictions.get(
+ drivingState);
+ if (restrictions.size() != otherRestrictions.size()) {
+ return false;
+ }
+ // Assuming the restrictions are sorted.
+ for (int i = 0; i < restrictions.size(); i++) {
+ if (!restrictions.get(i).equals(otherRestrictions.get(i))) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Dump the driving state to UX restrictions mapping.
+ */
+ public void dump(PrintWriter writer) {
+ for (Integer state : mUxRestrictions.keySet()) {
+ List<RestrictionsPerSpeedRange> list = mUxRestrictions.get(state);
+ writer.println("===========================================");
+ writer.println("Driving State to UXR");
+ if (list != null) {
+ writer.println("State:" + getDrivingStateName(state) + " num restrictions:"
+ + list.size());
+ for (RestrictionsPerSpeedRange r : list) {
+ writer.println("Requires DO? " + r.mReqOpt
+ + "\nRestrictions: 0x" + Integer.toHexString(r.mRestrictions)
+ + "\nSpeed Range: " + (r.mSpeedRange == null
+ ? "None"
+ : r.mSpeedRange.mMinSpeed + " - " + r.mSpeedRange.mMaxSpeed));
+ writer.println("===========================================");
+ }
+ }
+ }
+ writer.println("Max String length: " + mMaxStringLength);
+ writer.println("Max Cumulative Content Items: " + mMaxCumulativeContentItems);
+ writer.println("Max Content depth: " + mMaxContentDepth);
+ }
+
+ private static String getDrivingStateName(@CarDrivingState int state) {
+ switch (state) {
+ case 0:
+ return "parked";
+ case 1:
+ return "idling";
+ case 2:
+ return "moving";
+ default:
+ return "unknown";
+ }
+ }
+
+ // Parcelable methods/fields.
+
+ // Used by Parcel methods to ensure de/serialization order.
+ private static final int[] DRIVING_STATES = new int[]{
+ CarDrivingStateEvent.DRIVING_STATE_UNKNOWN,
+ CarDrivingStateEvent.DRIVING_STATE_PARKED,
+ CarDrivingStateEvent.DRIVING_STATE_IDLING,
+ CarDrivingStateEvent.DRIVING_STATE_MOVING
+ };
+
+ public static final Parcelable.Creator<CarUxRestrictionsConfiguration> CREATOR =
+ new Parcelable.Creator<CarUxRestrictionsConfiguration>() {
+
+ @Override
+ public CarUxRestrictionsConfiguration createFromParcel(Parcel source) {
+ return new CarUxRestrictionsConfiguration(source);
+ }
+
+ @Override
+ public CarUxRestrictionsConfiguration[] newArray(int size) {
+ return new CarUxRestrictionsConfiguration[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ private CarUxRestrictionsConfiguration(Parcel in) {
+ for (int drivingState : DRIVING_STATES) {
+ List<RestrictionsPerSpeedRange> restrictions = new ArrayList<>();
+ in.readTypedList(restrictions, RestrictionsPerSpeedRange.CREATOR);
+ mUxRestrictions.put(drivingState, restrictions);
+ }
+ mMaxContentDepth = in.readInt();
+ mMaxCumulativeContentItems = in.readInt();
+ mMaxStringLength = in.readInt();
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ for (int drivingState : DRIVING_STATES) {
+ dest.writeTypedList(mUxRestrictions.get(drivingState), 0);
+ }
+ dest.writeInt(mMaxContentDepth);
+ dest.writeInt(mMaxCumulativeContentItems);
+ dest.writeInt(mMaxStringLength);
+ }
+
+ /**
+ * @hide
+ */
+ public static final class Builder {
+
+ private static final int UX_RESTRICTIONS_UNKNOWN = -1;
+
+ private int mMaxContentDepth = UX_RESTRICTIONS_UNKNOWN;
+ private int mMaxCumulativeContentItems = UX_RESTRICTIONS_UNKNOWN;
+ private int mMaxStringLength = UX_RESTRICTIONS_UNKNOWN;
+
+ private Map<Integer, List<RestrictionsPerSpeedRange>> mUxRestrictions =
+ new ArrayMap<>(DRIVING_STATES.length);
+
+ public Builder() {
+ for (int drivingState : DRIVING_STATES) {
+ mUxRestrictions.put(drivingState, new ArrayList<>());
+ }
+ }
+
+ /**
+ * Sets ux restrictions for driving state.
+ */
+ public Builder setUxRestrictions(@CarDrivingState int drivingState,
+ boolean requiresOptimization,
+ @CarUxRestrictions.CarUxRestrictionsInfo int restrictions) {
+ return this.setUxRestrictions(drivingState, null, requiresOptimization, restrictions);
+ }
+
+ /**
+ * Sets ux restrictions with speed range.
+ *
+ * @param drivingState Restrictions will be set for this Driving state.
+ * See constants in {@link CarDrivingStateEvent}.
+ * @param speedRange If set, restrictions will only apply when current speed is within
+ * the range. Only {@link CarDrivingStateEvent#DRIVING_STATE_MOVING}
+ * supports speed range. {@code null} implies the full speed range,
+ * i.e. zero to {@link SpeedRange#MAX_SPEED}.
+ * @param requiresOptimization Whether distraction optimization (DO) is required for this
+ * driving state.
+ * @param restrictions See constants in {@link CarUxRestrictions}.
+ */
+ public Builder setUxRestrictions(@CarDrivingState int drivingState,
+ SpeedRange speedRange, boolean requiresOptimization,
+ @CarUxRestrictions.CarUxRestrictionsInfo int restrictions) {
+ if (drivingState != CarDrivingStateEvent.DRIVING_STATE_MOVING) {
+ if (speedRange != null) {
+ throw new IllegalArgumentException(
+ "Non-moving driving state cannot specify speed range.");
+ }
+ if (mUxRestrictions.get(drivingState).size() > 0) {
+ throw new IllegalArgumentException("Non-moving driving state cannot have "
+ + "more than one set of restrictions.");
+ }
+ }
+
+ mUxRestrictions.get(drivingState).add(
+ new RestrictionsPerSpeedRange(requiresOptimization, restrictions, speedRange));
+ return this;
+ }
+
+ /**
+ * Sets max string length.
+ */
+ public Builder setMaxStringLength(int maxStringLength) {
+ mMaxStringLength = maxStringLength;
+ return this;
+ }
+
+ /**
+ * Sets max cumulative content items.
+ */
+ public Builder setMaxCumulativeContentItems(int maxCumulativeContentItems) {
+ mMaxCumulativeContentItems = maxCumulativeContentItems;
+ return this;
+ }
+
+ /**
+ * Sets max content depth.
+ */
+ public Builder setMaxContentDepth(int maxContentDepth) {
+ mMaxContentDepth = maxContentDepth;
+ return this;
+ }
+
+ /**
+ * @return CarUxRestrictionsConfiguration based on builder configuration.
+ */
+ public CarUxRestrictionsConfiguration build() {
+ // Create default restriction for unspecified driving state.
+ for (int drivingState : DRIVING_STATES) {
+ List<RestrictionsPerSpeedRange> restrictions = mUxRestrictions.get(drivingState);
+ if (restrictions.size() == 0) {
+ Log.i(TAG, "Using default restrictions for driving state: "
+ + getDrivingStateName(drivingState));
+ restrictions.add(new RestrictionsPerSpeedRange(
+ true, CarUxRestrictions.UX_RESTRICTIONS_FULLY_RESTRICTED));
+ }
+ }
+
+ // Configuration validation.
+ for (int drivingState : DRIVING_STATES) {
+ List<RestrictionsPerSpeedRange> restrictions = mUxRestrictions.get(drivingState);
+
+ if (drivingState == CarDrivingStateEvent.DRIVING_STATE_MOVING) {
+ // Sort restrictions based on speed range.
+ Collections.sort(restrictions,
+ (r1, r2) -> r1.mSpeedRange.compareTo(r2.mSpeedRange));
+
+ if (!isAllSpeedRangeCovered(restrictions)) {
+ throw new IllegalStateException(
+ "Moving state should cover full speed range.");
+ }
+ } else {
+ if (restrictions.size() != 1) {
+ throw new IllegalStateException("Non-moving driving state should contain "
+ + "one set of restriction rules.");
+ }
+ }
+ }
+ return new CarUxRestrictionsConfiguration(this);
+ }
+
+ /**
+ * restrictions should be sorted based on speed range.
+ */
+ private boolean isAllSpeedRangeCovered(List<RestrictionsPerSpeedRange> restrictions) {
+ if (restrictions.size() == 1) {
+ if (restrictions.get(0).mSpeedRange == null) {
+ // Single restriction with null speed range implies that
+ // it applies to the entire driving state.
+ return true;
+ }
+ return restrictions.get(0).mSpeedRange.mMinSpeed == 0
+ && Float.compare(restrictions.get(0).mSpeedRange.mMaxSpeed,
+ SpeedRange.MAX_SPEED) == 0;
+ }
+
+ if (restrictions.get(0).mSpeedRange.mMinSpeed != 0) {
+ Log.e(TAG, "Speed range min speed should start at 0.");
+ return false;
+ }
+ for (int i = 1; i < restrictions.size(); i++) {
+ RestrictionsPerSpeedRange prev = restrictions.get(i - 1);
+ RestrictionsPerSpeedRange curr = restrictions.get(i);
+ // If current min != prev.max, there's either an overlap or a gap in speed range.
+ if (Float.compare(curr.mSpeedRange.mMinSpeed, prev.mSpeedRange.mMaxSpeed) != 0) {
+ Log.e(TAG, "Mis-configured speed range. Possibly speed range overlap or gap.");
+ return false;
+ }
+ }
+ // The last speed range should have max speed.
+ float lastMaxSpeed = restrictions.get(restrictions.size() - 1).mSpeedRange.mMaxSpeed;
+ return lastMaxSpeed == SpeedRange.MAX_SPEED;
+ }
+
+ /**
+ * Speed range is defined by min and max speed. When there is no upper bound for max speed,
+ * set it to {@link SpeedRange#MAX_SPEED}.
+ */
+ public static final class SpeedRange implements Comparable<SpeedRange> {
+ public static final float MAX_SPEED = Float.POSITIVE_INFINITY;
+
+ private float mMinSpeed;
+ private float mMaxSpeed;
+
+ /**
+ * Defaults max speed to {@link SpeedRange#MAX_SPEED}.
+ */
+ public SpeedRange(@FloatRange(from = 0.0) float minSpeed) {
+ this(minSpeed, MAX_SPEED);
+ }
+
+ public SpeedRange(@FloatRange(from = 0.0) float minSpeed,
+ @FloatRange(from = 0.0) float maxSpeed) {
+ if (minSpeed == MAX_SPEED) {
+ throw new IllegalArgumentException("Min speed cannot be MAX_SPEED.");
+ }
+ if (maxSpeed < 0) {
+ throw new IllegalArgumentException("Max speed cannot be negative.");
+ }
+ if (minSpeed > maxSpeed) {
+ throw new IllegalArgumentException("Min speed " + minSpeed
+ + " should not be greater than max speed " + maxSpeed);
+ }
+ mMinSpeed = minSpeed;
+ mMaxSpeed = maxSpeed;
+ }
+
+ /**
+ * Return if the given speed is in the range of [minSpeed, maxSpeed).
+ *
+ * @param speed Speed to check
+ * @return {@code true} if in range; {@code false} otherwise.
+ */
+ public boolean includes(float speed) {
+ if (speed < mMinSpeed) {
+ return false;
+ }
+ if (mMaxSpeed == MAX_SPEED) {
+ return true;
+ }
+ return speed < mMaxSpeed;
+ }
+
+ @Override
+ public int compareTo(SpeedRange other) {
+ // First compare min speed; then max speed.
+ int minSpeedComparison = Float.compare(this.mMinSpeed, other.mMinSpeed);
+ if (minSpeedComparison != 0) {
+ return minSpeedComparison;
+ }
+
+ return Float.compare(this.mMaxSpeed, other.mMaxSpeed);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null || !(obj instanceof SpeedRange)) {
+ return false;
+ }
+ SpeedRange other = (SpeedRange) obj;
+
+ return this.compareTo(other) == 0;
+ }
+ }
+ }
+
+ /**
+ * Container for UX restrictions for a speed range.
+ * Speed range is valid only for the {@link CarDrivingStateEvent#DRIVING_STATE_MOVING}.
+ * @hide
+ */
+ public static final class RestrictionsPerSpeedRange implements Parcelable {
+ final boolean mReqOpt;
+ final int mRestrictions;
+ @Nullable
+ final Builder.SpeedRange mSpeedRange;
+
+ public RestrictionsPerSpeedRange(boolean reqOpt, int restrictions) {
+ this(reqOpt, restrictions, null);
+ }
+
+ public RestrictionsPerSpeedRange(boolean reqOpt, int restrictions,
+ @Nullable Builder.SpeedRange speedRange) {
+ if (!reqOpt && restrictions != CarUxRestrictions.UX_RESTRICTIONS_BASELINE) {
+ throw new IllegalArgumentException(
+ "Driving optimization is not required but UX restrictions is required.");
+ }
+ mReqOpt = reqOpt;
+ mRestrictions = restrictions;
+ mSpeedRange = speedRange;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null || !(obj instanceof RestrictionsPerSpeedRange)) {
+ return false;
+ }
+ RestrictionsPerSpeedRange other = (RestrictionsPerSpeedRange) obj;
+ return mReqOpt == other.mReqOpt
+ && mRestrictions == other.mRestrictions
+ && ((mSpeedRange == null && other.mSpeedRange == null) || mSpeedRange.equals(
+ other.mSpeedRange));
+ }
+
+ // Parcelable methods/fields.
+
+ public static final Creator<RestrictionsPerSpeedRange> CREATOR =
+ new Creator<RestrictionsPerSpeedRange>() {
+ @Override
+ public RestrictionsPerSpeedRange createFromParcel(Parcel in) {
+ return new RestrictionsPerSpeedRange(in);
+ }
+
+ @Override
+ public RestrictionsPerSpeedRange[] newArray(int size) {
+ return new RestrictionsPerSpeedRange[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ protected RestrictionsPerSpeedRange(Parcel in) {
+ mReqOpt = in.readBoolean();
+ mRestrictions = in.readInt();
+ // Whether speed range is specified.
+ Builder.SpeedRange speedRange = null;
+ if (in.readBoolean()) {
+ float minSpeed = in.readFloat();
+ float maxSpeed = in.readFloat();
+ speedRange = new Builder.SpeedRange(minSpeed, maxSpeed);
+ }
+ mSpeedRange = speedRange;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeBoolean(mReqOpt);
+ dest.writeInt(mRestrictions);
+ // Whether speed range is specified.
+ dest.writeBoolean(mSpeedRange != null);
+ if (mSpeedRange != null) {
+ dest.writeFloat(mSpeedRange.mMinSpeed);
+ dest.writeFloat(mSpeedRange.mMaxSpeed);
+ }
+ }
+ }
+}
diff --git a/car-lib/src/android/car/drivingstate/CarUxRestrictionsManager.java b/car-lib/src/android/car/drivingstate/CarUxRestrictionsManager.java
index 57e7d60..7b60538 100644
--- a/car-lib/src/android/car/drivingstate/CarUxRestrictionsManager.java
+++ b/car-lib/src/android/car/drivingstate/CarUxRestrictionsManager.java
@@ -18,10 +18,11 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.RequiresPermission;
+import android.annotation.TestApi;
import android.car.Car;
import android.car.CarManagerBase;
import android.car.CarNotConnectedException;
-import android.car.drivingstate.ICarUxRestrictionsManager;
import android.content.Context;
import android.os.Handler;
import android.os.IBinder;
@@ -117,6 +118,31 @@
}
/**
+ * Set a new {@link CarUxRestrictionsConfiguration} for next trip.
+ * <p>
+ * Saving a new configuration does not affect current configuration. The new configuration will
+ * only be used after UX Restrictions service restarts when the vehicle is parked.
+ * <p>
+ * Requires Permission:
+ * {@link android.car.Manifest.permission#CAR_UX_RESTRICTIONS_CONFIGURATION}.
+ *
+ * @param config UX restrictions configuration to be persisted.
+ * @return {@code true} if input config was successfully saved; {@code false} otherwise.
+ *
+ * @hide
+ */
+ @RequiresPermission(value = Car.PERMISSION_CAR_UX_RESTRICTIONS_CONFIGURATION)
+ public synchronized boolean saveUxRestrictionsConfigurationForNextBoot(
+ CarUxRestrictionsConfiguration config) throws CarNotConnectedException {
+ try {
+ return mUxRService.saveUxRestrictionsConfigurationForNextBoot(config);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Could not save new UX restrictions configuration", e);
+ throw new CarNotConnectedException(e);
+ }
+ }
+
+ /**
* Unregister the registered {@link OnUxRestrictionsChangedListener}
*/
public synchronized void unregisterListener()
@@ -153,6 +179,49 @@
}
/**
+ * Get the current staged configuration, staged config file will only be accessible after
+ * the boot up completed or user has been switched.
+ * This methods is only for test purpose, please do not use in production.
+ *
+ * @return current staged configuration, {@code null} if it's not available
+ *
+ * @hide
+ *
+ */
+ @TestApi
+ @Nullable
+ @RequiresPermission(value = Car.PERMISSION_CAR_UX_RESTRICTIONS_CONFIGURATION)
+ public synchronized CarUxRestrictionsConfiguration getStagedConfig()
+ throws CarNotConnectedException {
+ try {
+ return mUxRService.getStagedConfig();
+ } catch (RemoteException e) {
+ Log.e(TAG, "Could not get staged UX restrictions staged configuration " + e);
+ throw new CarNotConnectedException(e);
+ }
+ }
+
+ /**
+ * Get the current prod configuration
+ *
+ * @return current prod configuration that is in effect.
+ *
+ * @hide
+ *
+ */
+ @TestApi
+ @RequiresPermission(value = Car.PERMISSION_CAR_UX_RESTRICTIONS_CONFIGURATION)
+ public synchronized CarUxRestrictionsConfiguration getConfig()
+ throws CarNotConnectedException {
+ try {
+ return mUxRService.getConfig();
+ } catch (RemoteException e) {
+ Log.e(TAG, "Could not get production UX restrictions prod configuration" + e);
+ throw new CarNotConnectedException(e);
+ }
+ }
+
+ /**
* Class that implements the listener interface and gets called back from the
* {@link com.android.car.CarDrivingStateService} across the binder interface.
*/
diff --git a/car-lib/src/android/car/drivingstate/ICarUxRestrictionsManager.aidl b/car-lib/src/android/car/drivingstate/ICarUxRestrictionsManager.aidl
index e5c69b8..8f48c5e 100644
--- a/car-lib/src/android/car/drivingstate/ICarUxRestrictionsManager.aidl
+++ b/car-lib/src/android/car/drivingstate/ICarUxRestrictionsManager.aidl
@@ -17,6 +17,7 @@
package android.car.drivingstate;
import android.car.drivingstate.CarUxRestrictions;
+import android.car.drivingstate.CarUxRestrictionsConfiguration;
import android.car.drivingstate.ICarUxRestrictionsChangeListener;
/**
@@ -30,4 +31,7 @@
void registerUxRestrictionsChangeListener(in ICarUxRestrictionsChangeListener listener) = 0;
void unregisterUxRestrictionsChangeListener(in ICarUxRestrictionsChangeListener listener) = 1;
CarUxRestrictions getCurrentUxRestrictions() = 2;
+ boolean saveUxRestrictionsConfigurationForNextBoot(in CarUxRestrictionsConfiguration config) = 3;
+ CarUxRestrictionsConfiguration getStagedConfig() = 4;
+ CarUxRestrictionsConfiguration getConfig() = 5;
}
diff --git a/car-lib/src/android/car/hardware/CarSensorManager.java b/car-lib/src/android/car/hardware/CarSensorManager.java
index 338d74f..6119806 100644
--- a/car-lib/src/android/car/hardware/CarSensorManager.java
+++ b/car-lib/src/android/car/hardware/CarSensorManager.java
@@ -16,7 +16,6 @@
package android.car.hardware;
-import android.Manifest;
import android.annotation.IntDef;
import android.annotation.RequiresPermission;
import android.car.Car;
@@ -59,6 +58,7 @@
public static final int SENSOR_TYPE_CAR_SPEED = 0x11600207;
/**
* Represents engine RPM of the car. Sensor data in {@link CarSensorEvent} is a float.
+ * This requires {@link Car#PERMISSION_CAR_ENGINE_DETAILED} permission.
*/
public static final int SENSOR_TYPE_RPM = 0x11600305;
/**
@@ -77,18 +77,21 @@
* intValues[0]. Value of 1 represents parking brake applied while 0 means the other way
* around. For this sensor, rate in {@link #registerListener(OnSensorChangedListener, int, int)}
* will be ignored and all changes will be notified.
+ * This requires {@link Car#PERMISSION_POWERTRAIN} permission.
*/
public static final int SENSOR_TYPE_PARKING_BRAKE = 0x11200402;
/**
* This represents the current position of transmission gear. Sensor data in
* {@link CarSensorEvent} is an intValues[0]. For the meaning of the value, check
* {@link CarSensorEvent#GEAR_NEUTRAL} and other GEAR_*.
+ * This requires {@link Car#PERMISSION_POWERTRAIN} permission.
*/
public static final int SENSOR_TYPE_GEAR = 0x11400400;
/** @hide */
public static final int SENSOR_TYPE_RESERVED8 = 8;
/**
* Day/night sensor. Sensor data is intValues[0].
+ * This requires {@link Car#PERMISSION_EXTERIOR_ENVIRONMENT} permission.
*/
public static final int SENSOR_TYPE_NIGHT = 0x11200407;
/**
@@ -123,6 +126,7 @@
/**
* Represents ignition state. The value should be one of the constants that starts with
* IGNITION_STATE_* in {@link CarSensorEvent}.
+ * This requires {@link Car#PERMISSION_POWERTRAIN} permission.
*/
public static final int SENSOR_TYPE_IGNITION_STATE = 0x11400409;
/**
@@ -147,6 +151,7 @@
public static final int SENSOR_TYPE_RESERVED26 = 26;
/**
* Set to true if the fuel door is open.
+ * This requires {@link Car#PERMISSION_ENERGY_PORTS} permission.
*/
public static final int SENSOR_TYPE_FUEL_DOOR_OPEN = 0x11200308;
@@ -161,10 +166,12 @@
public static final int SENSOR_TYPE_EV_BATTERY_LEVEL = 0x11600309;
/**
* Set to true if EV charging port is open.
+ * This requires {@link Car#PERMISSION_ENERGY_PORTS} permission.
*/
public static final int SENSOR_TYPE_EV_CHARGE_PORT_OPEN = 0x1120030a;
/**
* Set to true if EV charging port is connected.
+ * This requires {@link Car#PERMISSION_ENERGY_PORTS} permission.
*/
public static final int SENSOR_TYPE_EV_CHARGE_PORT_CONNECTED = 0x1120030b;
/**
@@ -374,11 +381,18 @@
* updated depending on the rate.
* <p>
* Requires {@link Car#PERMISSION_SPEED} for {@link #SENSOR_TYPE_CAR_SPEED} and
- * {@link #SENSOR_TYPE_WHEEL_TICK_DISTANCE}, {@link Car#PERMISSION_MILEAGE} for
- * {@link #SENSOR_TYPE_ODOMETER}, {@link Car#PERMISSION_ENERGY} for
- * {@link #SENSOR_TYPE_FUEL_LEVEL} and (@link #SENSOR_TYPE_EV_BATTERY_LEVEL and
- * {@link #SENSOR_TYPE_EV_CHARGE_RATE}, {@link Car#PERMISSION_CAR_DYNAMICS_STATE} for
- * {@link #SENSOR_TYPE_ABS_ACTIVE} and {@link #SENSOR_TYPE_TRACTION_CONTROL_ACTIVE}
+ * {@link #SENSOR_TYPE_WHEEL_TICK_DISTANCE}, {@link Car#PERMISSION_CAR_ENGINE_DETAILED} for
+ * {@link #SENSOR_TYPE_RPM} and {@link #SENSOR_TYPE_ENGINE_OIL_LEVEL},
+ * {@link Car#PERMISSION_MILEAGE} for {@link #SENSOR_TYPE_ODOMETER},
+ * {@link Car#PERMISSION_ENERGY} for {@link #SENSOR_TYPE_FUEL_LEVEL} and
+ * {@link #SENSOR_TYPE_EV_BATTERY_LEVEL} and {@link #SENSOR_TYPE_EV_CHARGE_RATE},
+ * {@link Car#PERMISSION_POWERTRAIN} for {@link #SENSOR_TYPE_PARKING_BRAKE} and
+ * {@link #SENSOR_TYPE_GEAR} and {@link #SENSOR_TYPE_IGNITION_STATE},
+ * {@link Car#PERMISSION_EXTERIOR_ENVIRONMENT} for {@link #SENSOR_TYPE_NIGHT} and
+ * {@link #SENSOR_TYPE_ENV_OUTSIDE_TEMPERATURE}, {@link Car#PERMISSION_CAR_DYNAMICS_STATE} for
+ * {@link #SENSOR_TYPE_ABS_ACTIVE} and {@link #SENSOR_TYPE_TRACTION_CONTROL_ACTIVE},
+ * {@link Car#PERMISSION_ENERGY_PORTS} for {@link #SENSOR_TYPE_FUEL_DOOR_OPEN} and
+ * {@link #SENSOR_TYPE_EV_CHARGE_PORT_OPEN} and {@link #SENSOR_TYPE_EV_CHARGE_PORT_CONNECTED}
*
* @param listener
* @param sensorType sensor type to subscribe.
@@ -394,9 +408,10 @@
* @throws IllegalArgumentException for wrong argument like wrong rate
* @throws SecurityException if missing the appropriate permission
*/
- @RequiresPermission(anyOf={Manifest.permission.ACCESS_FINE_LOCATION, Car.PERMISSION_SPEED,
- Car.PERMISSION_MILEAGE, Car.PERMISSION_ENERGY, Car.PERMISSION_CAR_DYNAMICS_STATE},
- conditional=true)
+ @RequiresPermission(anyOf = {Car.PERMISSION_SPEED, Car.PERMISSION_CAR_ENGINE_DETAILED,
+ Car.PERMISSION_MILEAGE, Car.PERMISSION_ENERGY, Car.PERMISSION_POWERTRAIN,
+ Car.PERMISSION_EXTERIOR_ENVIRONMENT, Car.PERMISSION_CAR_DYNAMICS_STATE,
+ Car.PERMISSION_ENERGY_PORTS}, conditional = true)
public boolean registerListener(OnSensorChangedListener listener, @SensorType int sensorType,
@SensorRate int rate) throws CarNotConnectedException, IllegalArgumentException {
if (rate != SENSOR_RATE_FASTEST && rate != SENSOR_RATE_NORMAL
@@ -422,7 +437,6 @@
* @param listener
*/
public void unregisterListener(OnSensorChangedListener listener) {
- //TODO: removing listener should reset update rate, bug: 32060307
synchronized (mListenerMap) {
mCarPropertyEventListener = mListenerMap.get(listener);
mCarPropertyMgr.unregisterListener(mCarPropertyEventListener);
diff --git a/car-lib/src/android/car/hardware/CarVendorExtensionManager.java b/car-lib/src/android/car/hardware/CarVendorExtensionManager.java
index 9f06764..5e07ace 100644
--- a/car-lib/src/android/car/hardware/CarVendorExtensionManager.java
+++ b/car-lib/src/android/car/hardware/CarVendorExtensionManager.java
@@ -106,7 +106,6 @@
if (mCallbacks.isEmpty()) {
mListenerToBase = new CarPropertyEventListenerToBase(this);
}
-
List<CarPropertyConfig> configs = mPropertyManager.getPropertyList();
for (CarPropertyConfig c : configs) {
// Register each individual propertyId
diff --git a/car-lib/src/android/car/hardware/cabin/CarCabinManager.java b/car-lib/src/android/car/hardware/cabin/CarCabinManager.java
index 1dee2b0..7d5715f 100644
--- a/car-lib/src/android/car/hardware/cabin/CarCabinManager.java
+++ b/car-lib/src/android/car/hardware/cabin/CarCabinManager.java
@@ -496,8 +496,6 @@
mCarPropertyMgr.registerListener(mListenerToBase, c.getPropertyId(), 0);
}
mCallbacks.add(callback);
-
-
}
/**
@@ -510,7 +508,7 @@
mCallbacks.remove(callback);
List<CarPropertyConfig> configs = getPropertyList();
for (CarPropertyConfig c : configs) {
- // Register each individual propertyId
+ // Register each individual propertyId
mCarPropertyMgr.unregisterListener(mListenerToBase, c.getPropertyId());
}
if (mCallbacks.isEmpty()) {
diff --git a/car-lib/src/android/car/hardware/hvac/CarHvacManager.java b/car-lib/src/android/car/hardware/hvac/CarHvacManager.java
index c953d6f..f86640f 100644
--- a/car-lib/src/android/car/hardware/hvac/CarHvacManager.java
+++ b/car-lib/src/android/car/hardware/hvac/CarHvacManager.java
@@ -54,10 +54,6 @@
* HVAC property IDs for get/set methods
*/
/**
- * Global HVAC properties. There is only a single instance in a car.
- * Global properties are in the range of 0-0x3FFF.
- */
- /**
* Mirror defrosters state, bool type
* true indicates mirror defroster is on
*/
@@ -81,10 +77,6 @@
public static final int ID_TEMPERATURE_DISPLAY_UNITS = 0x1140050e;
/**
- * ID_ZONED_* represents properties available on a per-zone basis. All zones in a car are
- * not required to have the same properties. Zone specific properties start at 0x4000.
- */
- /**
* Temperature setpoint, float type
* Temperature set by the user, units are in degrees Celsius.
*/
@@ -325,7 +317,7 @@
}
List<CarPropertyConfig> configs = getPropertyList();
for (CarPropertyConfig c : configs) {
- // Register each individual propertyId
+ // Register each individual propertyId
mCarPropertyMgr.registerListener(mListenerToBase, c.getPropertyId(), 0);
}
mCallbacks.add(callback);
@@ -343,6 +335,7 @@
for (CarPropertyConfig c : configs) {
// Register each individual propertyId
mCarPropertyMgr.unregisterListener(mListenerToBase, c.getPropertyId());
+
}
} catch (Exception e) {
Log.e(TAG, "getPropertyList exception ", e);
diff --git a/car-lib/src/android/car/hardware/power/CarPowerManager.java b/car-lib/src/android/car/hardware/power/CarPowerManager.java
index 38c5cd1..e61a817 100644
--- a/car-lib/src/android/car/hardware/power/CarPowerManager.java
+++ b/car-lib/src/android/car/hardware/power/CarPowerManager.java
@@ -16,15 +16,6 @@
package android.car.hardware.power;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.ref.WeakReference;
-import java.util.concurrent.Executor;
-
-import com.android.internal.annotations.GuardedBy;
-
-import android.annotation.IntDef;
-import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.car.Car;
import android.car.CarManagerBase;
@@ -32,10 +23,13 @@
import android.content.Context;
import android.os.Handler;
import android.os.IBinder;
-import android.os.Message;
import android.os.RemoteException;
import android.util.Log;
+import com.android.internal.annotations.GuardedBy;
+
+import java.util.concurrent.CompletableFuture;
+
/**
* API for receiving power state change notifications.
* @hide
@@ -46,7 +40,7 @@
private final static String TAG = "CarPowerManager";
private CarPowerStateListener mListener;
private final ICarPower mService;
- private Executor mExecutor;
+ private CompletableFuture<Void> mFuture;
@GuardedBy("mLock")
private ICarPowerStateListener mListenerToService;
@@ -54,42 +48,26 @@
private final Object mLock = new Object();
/**
- * Power boot up reasons, returned by {@link getBootReason}
- */
- /**
- * User powered on the vehicle. These definitions must match the ones located in the native
- * CarPowerManager: packages/services/Car/car-lib/native/CarPowerManager/CarPowerManager.h
- *
+ * Deleted! Don't use.
*/
public static final int BOOT_REASON_USER_POWER_ON = 1;
/**
- * Door unlock caused device to boot
+ * Deleted! Don't use.
*/
public static final int BOOT_REASON_DOOR_UNLOCK = 2;
/**
- * Timer expired and vehicle woke up the AP
+ * Deleted! Don't use.
*/
public static final int BOOT_REASON_TIMER = 3;
/**
- * Door open caused device to boot
+ * Deleted! Don't use.
*/
public static final int BOOT_REASON_DOOR_OPEN = 4;
/**
- * User activated remote start
+ * Deleted! Don't use.
*/
public static final int BOOT_REASON_REMOTE_START = 5;
- /** @hide */
- @IntDef({
- BOOT_REASON_USER_POWER_ON,
- BOOT_REASON_DOOR_UNLOCK,
- BOOT_REASON_TIMER,
- BOOT_REASON_DOOR_OPEN,
- BOOT_REASON_REMOTE_START,
- })
- @Retention(RetentionPolicy.SOURCE)
- public @interface BootReason{}
-
/**
* Applications set a {@link CarPowerStateListener} for power state event updates.
*/
@@ -97,32 +75,57 @@
/**
* onStateChanged() states. These definitions must match the ones located in the native
* CarPowerManager: packages/services/Car/car-lib/native/CarPowerManager/CarPowerManager.h
- *
*/
+
/**
* Shutdown is cancelled, return to normal state.
*/
- public static final int SHUTDOWN_CANCELLED = 0;
+ int SHUTDOWN_CANCELLED = 0;
/**
- * Enter shutdown state. Application is expected to cleanup and be ready to shutdown.
+ * Enter shutdown state. CPMS is switching to WAIT_FOR_FINISHED state.
*/
- public static final int SHUTDOWN_ENTER = 1;
+ int SHUTDOWN_ENTER = 1;
/**
- * Enter suspend state. Application is expected to cleanup and be ready to suspend.
+ * Android is up, but vendor is controlling the audio / display
+ * @hide
*/
- public static final int SUSPEND_ENTER = 2;
+ int WAIT_FOR_VHAL = 2;
/**
- * Wake up from suspend, or resume from a cancelled suspend. Application transitions to
- * normal state.
+ * Enter suspend state. CPMS is switching to WAIT_FOR_FINISHED state.
+ * @hide
*/
- public static final int SUSPEND_EXIT = 3;
+ int SUSPEND_ENTER = 3;
+ /**
+ * Wake up from suspend.
+ * @hide
+ */
+ int SUSPEND_EXIT = 4;
+ /**
+ * On state
+ * @hide
+ */
+ int ON = 5;
+ /**
+ * State where system is getting ready for shutdown or suspend. Application is expected to
+ * cleanup and be ready to suspend
+ * @hide
+ */
+ int SHUTDOWN_PREPARE = 6;
+
+ /**
+ * Deleted! Don't use.
+ */
+ void onStateChanged(int state);
/**
* Called when power state changes
* @param state New power state of device.
- * @param token Opaque identifier to keep track of listener events.
+ * @param future CompletableFuture used by consumer modules to notify CPMS that
+ * they are ready to continue shutting down. CPMS will wait until this future
+ * is completed.
+ * @hide
*/
- void onStateChanged(int state);
+ void onStateChanged(int state, CompletableFuture<Void> future);
}
/**
@@ -139,22 +142,6 @@
}
/**
- * Returns the current {@link BootReason}. This value does not change until the device goes
- * through a suspend/resume cycle.
- * @return int
- * @throws CarNotConnectedException
- * @hide
- */
- public int getBootReason() throws CarNotConnectedException {
- try {
- return mService.getBootReason();
- } catch (RemoteException e) {
- Log.e(TAG, "Exception in getBootReason", e);
- throw new CarNotConnectedException(e);
- }
- }
-
- /**
* Request power manager to shutdown in lieu of suspend at the next opportunity.
* @throws CarNotConnectedException
* @hide
@@ -169,28 +156,39 @@
}
/**
+ * Schedule next wake up time in CarPowerManagementSystem
+ * @throws CarNotConnectedException
+ * @hide
+ */
+ public void scheduleNextWakeupTime(int seconds) throws CarNotConnectedException {
+ try {
+ mService.scheduleNextWakeupTime(seconds);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Exception while scheduling next wakeup time", e);
+ throw new CarNotConnectedException(e);
+ }
+ }
+
+ /**
* Sets a listener to receive power state changes. Only one listener may be set at a time.
- * Caller may add an Executor to allow the callback to run in a seperate thread of execution
- * if the {@link onStateChanged} method will take some time. If no Executor is passed in,
- * the listener will run in the Binder thread and should finish quickly. After
- * {@link onStateChanged} is called, the {@link finished} method will automatically be called
- * to notify {@link CarPowerManagementService} that the application has handled the
- * {@link #SHUTDOWN_ENTER} or {@link #SUSPEND_ENTER} state transitions. Only these two states
- * require a confirmation from the application.
+ * For calls that require completion before continue, we attach a {@link CompletableFuture}
+ * which is being used as a signal that caller is finished and ready to proceed.
+ * Once future is completed, the {@link finished} method will automatically be called to notify
+ * {@link CarPowerManagementService} that the application has handled the
+ * {@link #SHUTDOWN_ENTER} or {@link #SUSPEND_ENTER} state transition.
*
- * @param executor
* @param listener
* @throws CarNotConnectedException, IllegalStateException
* @hide
*/
- public void setListener(CarPowerStateListener listener, Executor executor) throws
+ public void setListener(CarPowerStateListener listener) throws
CarNotConnectedException, IllegalStateException {
synchronized(mLock) {
if (mListenerToService == null) {
ICarPowerStateListener listenerToService = new ICarPowerStateListener.Stub() {
@Override
public void onStateChanged(int state, int token) throws RemoteException {
- handleEvent(state, token);
+ handleStateTransition(state, token);
}
};
try {
@@ -203,9 +201,8 @@
Car.checkCarNotConnectedExceptionFromCarService(ex);
}
}
- if ((mExecutor == null) && (mListener == null)) {
- // Update listener and executor
- mExecutor = executor;
+ if (mListener == null) {
+ // Update listener
mListener = listener;
} else {
throw new IllegalStateException("Listener must be cleared first");
@@ -223,7 +220,7 @@
listenerToService = mListenerToService;
mListenerToService = null;
mListener = null;
- mExecutor = null;
+ cleanupFuture();
}
if (listenerToService == null) {
@@ -241,33 +238,37 @@
}
}
- private void handleEvent(int state, int token) {
- Executor executor;
- synchronized (mLock) {
- executor = mExecutor;
- }
- if (executor != null) {
- executor.execute(() -> {
- handleEventInternal(state, token);
+ private void handleStateTransition(int state, int token) {
+ // Update CompletableFuture. It will recreate it or just clean it up
+ updateFuture(state, token);
+ // Notify user that state has changed and supply future
+ mListener.onStateChanged(state, mFuture);
+ }
+
+ private void updateFuture(int state, int token) {
+ cleanupFuture();
+ if (state == CarPowerStateListener.SHUTDOWN_PREPARE) {
+ mFuture = new CompletableFuture<>();
+ mFuture.whenComplete((result, exception) -> {
+ if (exception != null) {
+ Log.e(TAG, "Exception occurred while waiting for future", exception);
+ return;
+ }
+ try {
+ mService.finished(mListenerToService, token);
+ } catch (RemoteException e) {
+ Log.e(TAG, "RemoteException while calling CPMS.finished()", e);
+ }
});
- } else {
- // If no executor provided, run in binder thread. This should only be done for
- // trivial listener logic.
- handleEventInternal(state, token);
}
}
- private void handleEventInternal(int state, int token) {
- mListener.onStateChanged(state);
- if ((state == CarPowerStateListener.SHUTDOWN_ENTER) ||
- (state == CarPowerStateListener.SUSPEND_ENTER)) {
- // Notify service that state change is complete for SHUTDOWN_ENTER and SUSPEND_ENTER
- // states only.
- try {
- mService.finished(mListenerToService, token);
- } catch (RemoteException e) {
- Log.e(TAG, "Exception in finished", e);
+ private void cleanupFuture() {
+ if (mFuture != null) {
+ if (!mFuture.isDone()) {
+ mFuture.cancel(false);
}
+ mFuture = null;
}
}
diff --git a/car-lib/src/android/car/hardware/power/ICarPower.aidl b/car-lib/src/android/car/hardware/power/ICarPower.aidl
index 851ed0c..ecbf29e 100644
--- a/car-lib/src/android/car/hardware/power/ICarPower.aidl
+++ b/car-lib/src/android/car/hardware/power/ICarPower.aidl
@@ -26,7 +26,7 @@
void requestShutdownOnNextSuspend() = 2;
- int getBootReason() = 3;
+ void finished(in ICarPowerStateListener listener, int token) = 3;
- void finished(in ICarPowerStateListener listener, int token) = 4;
+ void scheduleNextWakeupTime(int seconds) = 4;
}
diff --git a/car-lib/src/android/car/hardware/property/CarPropertyManager.java b/car-lib/src/android/car/hardware/property/CarPropertyManager.java
index 373c23a..62d6c38 100644
--- a/car-lib/src/android/car/hardware/property/CarPropertyManager.java
+++ b/car-lib/src/android/car/hardware/property/CarPropertyManager.java
@@ -246,6 +246,44 @@
}
/**
+ *
+ * @param propId Property ID to query
+ *
+ * @return String Permission needed to read this property. NULL if propId not available.
+ */
+ public String getReadPermission(int propId) throws CarNotConnectedException {
+ if (mDbg) {
+ Log.d(mTag, "getReadPermission, propId: 0x" + toHexString(propId));
+ }
+ try {
+ String permission = mService.getReadPermission(propId);
+ return permission;
+ } catch (RemoteException e) {
+ Log.e(mTag, "getReadPermission failed with " + e.toString(), e);
+ throw new CarNotConnectedException(e);
+ }
+ }
+
+ /**
+ *
+ * @param propId Property ID to query
+ *
+ * @return String Permission needed to write this property. NULL if propId not available.
+ */
+ public String getWritePermission(int propId) throws CarNotConnectedException {
+ if (mDbg) {
+ Log.d(mTag, "getWritePermission, propId: 0x" + toHexString(propId));
+ }
+ try {
+ String permission = mService.getWritePermission(propId);
+ return permission;
+ } catch (RemoteException e) {
+ Log.e(mTag, "getWritePermission failed with " + e.toString(), e);
+ throw new CarNotConnectedException(e);
+ }
+ }
+
+ /**
* Check whether a given property is available or disabled based on the car's current state.
* @return true if STATUS_AVAILABLE, false otherwise (eg STATUS_UNAVAILABLE)
* @throws CarNotConnectedException
diff --git a/car-lib/src/android/car/hardware/property/ICarProperty.aidl b/car-lib/src/android/car/hardware/property/ICarProperty.aidl
index 3e7e5c9..ab5ad7e 100644
--- a/car-lib/src/android/car/hardware/property/ICarProperty.aidl
+++ b/car-lib/src/android/car/hardware/property/ICarProperty.aidl
@@ -34,4 +34,8 @@
CarPropertyValue getProperty(int prop, int zone) = 3;
void setProperty(in CarPropertyValue prop) = 4;
+
+ String getReadPermission(int propId) = 5;
+
+ String getWritePermission(int propId) = 6;
}
diff --git a/car-lib/src/android/car/media/CarAudioManager.java b/car-lib/src/android/car/media/CarAudioManager.java
index 7257255..1f9f1ce 100644
--- a/car-lib/src/android/car/media/CarAudioManager.java
+++ b/car-lib/src/android/car/media/CarAudioManager.java
@@ -16,87 +16,103 @@
package android.car.media;
import android.annotation.NonNull;
-import android.annotation.SystemApi;
+import android.annotation.RequiresPermission;
+import android.annotation.TestApi;
+import android.car.Car;
import android.car.CarLibLog;
import android.car.CarManagerBase;
import android.car.CarNotConnectedException;
-import android.content.ContentResolver;
import android.content.Context;
-import android.database.ContentObserver;
import android.media.AudioAttributes;
import android.os.Handler;
import android.os.IBinder;
import android.os.RemoteException;
-import android.provider.Settings;
import android.util.Log;
+import java.util.ArrayList;
+import java.util.List;
+
/**
- * APIs for handling car specific audio stuff.
+ * APIs for handling audio in a car.
+ *
+ * In a car environment, we introduced the support to turn audio dynamic routing on /off by
+ * setting the "audioUseDynamicRouting" attribute in config.xml
+ *
+ * When audio dynamic routing is enabled:
+ * - Audio devices are grouped into zones
+ * - There is at least one primary zone, and extra secondary zones such as RSE
+ * (Reat Seat Entertainment)
+ * - Within each zone, audio devices are grouped into volume groups for volume control
+ * - Audio is assigned to an audio device based on its AudioAttributes usage
+ *
+ * When audio dynamic routing is disabled:
+ * - There is exactly one audio zone, which is the primary zone
+ * - Each volume group represents a controllable STREAM_TYPE, same as AudioManager
*/
public final class CarAudioManager implements CarManagerBase {
- // The trailing slash forms a directory-liked hierarchy and
- // allows listening for both GROUP/MEDIA and GROUP/NAVIGATION.
- private static final String VOLUME_SETTINGS_KEY_FOR_GROUP_PREFIX = "android.car.VOLUME_GROUP/";
-
/**
- * @param groupId The volume group id
- * @return Key to persist volume index for volume group in {@link Settings.Global}
+ * Zone id of the primary audio zone.
*/
- public static String getVolumeSettingsKeyForGroup(int groupId) {
- return VOLUME_SETTINGS_KEY_FOR_GROUP_PREFIX + groupId;
- }
+ public static final int PRIMARY_AUDIO_ZONE = 0x0;
+
+ private final ICarAudio mService;
+ private final List<CarVolumeCallback> mCarVolumeCallbacks;
+
+ private final ICarVolumeCallback mCarVolumeCallbackImpl = new ICarVolumeCallback.Stub() {
+ @Override
+ public void onGroupVolumeChanged(int zoneId, int groupId, int flags) {
+ for (CarVolumeCallback callback : mCarVolumeCallbacks) {
+ callback.onGroupVolumeChanged(zoneId, groupId, flags);
+ }
+ }
+
+ @Override
+ public void onMasterMuteChanged(int zoneId, int flags) {
+ for (CarVolumeCallback callback : mCarVolumeCallbacks) {
+ callback.onMasterMuteChanged(zoneId, flags);
+ }
+ }
+ };
/**
- * Key to persist master mute state in {@link Settings.Global}
- *
+ * @return Whether dynamic routing is enabled or not.
* @hide
*/
- public static final String VOLUME_SETTINGS_KEY_MASTER_MUTE = "android.car.MASTER_MUTE";
-
- private final ContentResolver mContentResolver;
- private final ICarAudio mService;
-
- /**
- * Registers a {@link ContentObserver} to listen for volume group changes.
- * Note that this observer is valid for bus based car audio stack only.
- *
- * {@link ContentObserver#onChange(boolean)} will be called on every group volume change.
- *
- * @param observer The {@link ContentObserver} instance to register, non-null
- */
- @SystemApi
- public void registerVolumeChangeObserver(@NonNull ContentObserver observer) {
- mContentResolver.registerContentObserver(
- Settings.Global.getUriFor(VOLUME_SETTINGS_KEY_FOR_GROUP_PREFIX),
- true, observer);
+ @TestApi
+ public boolean isDynamicRoutingEnabled() throws CarNotConnectedException {
+ try {
+ return mService.isDynamicRoutingEnabled();
+ } catch (RemoteException e) {
+ Log.e(CarLibLog.TAG_CAR, "isDynamicRoutingEnabled failed", e);
+ throw new CarNotConnectedException(e);
+ }
}
/**
- * Unregisters the {@link ContentObserver} which listens for volume group changes.
+ * Sets the volume index for a volume group in primary zone.
*
- * @param observer The {@link ContentObserver} instance to unregister, non-null
+ * @see {@link #setGroupVolume(int, int, int, int)}
*/
- @SystemApi
- public void unregisterVolumeChangeObserver(@NonNull ContentObserver observer) {
- mContentResolver.unregisterContentObserver(observer);
+ public void setGroupVolume(int groupId, int index, int flags) throws CarNotConnectedException {
+ setGroupVolume(PRIMARY_AUDIO_ZONE, groupId, index, flags);
}
/**
* Sets the volume index for a volume group.
*
- * Requires {@link android.car.Car#PERMISSION_CAR_CONTROL_AUDIO_VOLUME} permission.
- *
+ * @param zoneId The zone id whose volume group is affected.
* @param groupId The volume group id whose volume index should be set.
* @param index The volume index to set. See
- * {@link #getGroupMaxVolume(int)} for the largest valid value.
+ * {@link #getGroupMaxVolume(int, int)} for the largest valid value.
* @param flags One or more flags (e.g., {@link android.media.AudioManager#FLAG_SHOW_UI},
* {@link android.media.AudioManager#FLAG_PLAY_SOUND})
*/
- @SystemApi
- public void setGroupVolume(int groupId, int index, int flags) throws CarNotConnectedException {
+ @RequiresPermission(Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME)
+ public void setGroupVolume(int zoneId, int groupId, int index, int flags)
+ throws CarNotConnectedException {
try {
- mService.setGroupVolume(groupId, index, flags);
+ mService.setGroupVolume(zoneId, groupId, index, flags);
} catch (RemoteException e) {
Log.e(CarLibLog.TAG_CAR, "setGroupVolume failed", e);
throw new CarNotConnectedException(e);
@@ -104,58 +120,82 @@
}
/**
+ * Returns the maximum volume index for a volume group in primary zone.
+ *
+ * @see {@link #getGroupMaxVolume(int, int)}
+ */
+ public int getGroupMaxVolume(int groupId) throws CarNotConnectedException {
+ return getGroupMaxVolume(PRIMARY_AUDIO_ZONE, groupId);
+ }
+
+ /**
* Returns the maximum volume index for a volume group.
*
- * Requires {@link android.car.Car#PERMISSION_CAR_CONTROL_AUDIO_VOLUME} permission.
- *
+ * @param zoneId The zone id whose volume group is queried.
* @param groupId The volume group id whose maximum volume index is returned.
* @return The maximum valid volume index for the given group.
*/
- @SystemApi
- public int getGroupMaxVolume(int groupId) throws CarNotConnectedException {
+ @RequiresPermission(Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME)
+ public int getGroupMaxVolume(int zoneId, int groupId) throws CarNotConnectedException {
try {
- return mService.getGroupMaxVolume(groupId);
+ return mService.getGroupMaxVolume(zoneId, groupId);
} catch (RemoteException e) {
- Log.e(CarLibLog.TAG_CAR, "getUsageMaxVolume failed", e);
+ Log.e(CarLibLog.TAG_CAR, "getGroupMaxVolume failed", e);
throw new CarNotConnectedException(e);
}
}
/**
+ * Returns the minimum volume index for a volume group in primary zone.
+ *
+ * @see {@link #getGroupMinVolume(int, int)}
+ */
+ public int getGroupMinVolume(int groupId) throws CarNotConnectedException {
+ return getGroupMinVolume(PRIMARY_AUDIO_ZONE, groupId);
+ }
+
+ /**
* Returns the minimum volume index for a volume group.
*
- * Requires {@link android.car.Car#PERMISSION_CAR_CONTROL_AUDIO_VOLUME} permission.
- *
+ * @param zoneId The zone id whose volume group is queried.
* @param groupId The volume group id whose minimum volume index is returned.
* @return The minimum valid volume index for the given group, non-negative
*/
- @SystemApi
- public int getGroupMinVolume(int groupId) throws CarNotConnectedException {
+ @RequiresPermission(Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME)
+ public int getGroupMinVolume(int zoneId, int groupId) throws CarNotConnectedException {
try {
- return mService.getGroupMinVolume(groupId);
+ return mService.getGroupMinVolume(zoneId, groupId);
} catch (RemoteException e) {
- Log.e(CarLibLog.TAG_CAR, "getUsageMinVolume failed", e);
+ Log.e(CarLibLog.TAG_CAR, "getGroupMinVolume failed", e);
throw new CarNotConnectedException(e);
}
}
/**
+ * Returns the current volume index for a volume group in primary zone.
+ *
+ * @see {@link #getGroupVolume(int, int)}
+ */
+ public int getGroupVolume(int groupId) throws CarNotConnectedException {
+ return getGroupVolume(PRIMARY_AUDIO_ZONE, groupId);
+ }
+
+ /**
* Returns the current volume index for a volume group.
*
- * Requires {@link android.car.Car#PERMISSION_CAR_CONTROL_AUDIO_VOLUME} permission.
- *
+ * @param zoneId The zone id whose volume groups is queried.
* @param groupId The volume group id whose volume index is returned.
* @return The current volume index for the given group.
*
- * @see #getGroupMaxVolume(int)
- * @see #setGroupVolume(int, int, int)
+ * @see #getGroupMaxVolume(int, int)
+ * @see #setGroupVolume(int, int, int, int)
*/
- @SystemApi
- public int getGroupVolume(int groupId) throws CarNotConnectedException {
+ @RequiresPermission(Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME)
+ public int getGroupVolume(int zoneId, int groupId) throws CarNotConnectedException {
try {
- return mService.getGroupVolume(groupId);
+ return mService.getGroupVolume(zoneId, groupId);
} catch (RemoteException e) {
- Log.e(CarLibLog.TAG_CAR, "getUsageVolume failed", e);
+ Log.e(CarLibLog.TAG_CAR, "getGroupVolume failed", e);
throw new CarNotConnectedException(e);
}
}
@@ -163,14 +203,12 @@
/**
* Adjust the relative volume in the front vs back of the vehicle cabin.
*
- * Requires {@link android.car.Car#PERMISSION_CAR_CONTROL_AUDIO_VOLUME} permission.
- *
* @param value in the range -1.0 to 1.0 for fully toward the back through
* fully toward the front. 0.0 means evenly balanced.
*
* @see #setBalanceTowardRight(float)
*/
- @SystemApi
+ @RequiresPermission(Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME)
public void setFadeTowardFront(float value) throws CarNotConnectedException {
try {
mService.setFadeTowardFront(value);
@@ -183,14 +221,12 @@
/**
* Adjust the relative volume on the left vs right side of the vehicle cabin.
*
- * Requires {@link android.car.Car#PERMISSION_CAR_CONTROL_AUDIO_VOLUME} permission.
- *
* @param value in the range -1.0 to 1.0 for fully toward the left through
* fully toward the right. 0.0 means evenly balanced.
*
* @see #setFadeTowardFront(float)
*/
- @SystemApi
+ @RequiresPermission(Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME)
public void setBalanceTowardRight(float value) throws CarNotConnectedException {
try {
mService.setBalanceTowardRight(value);
@@ -204,8 +240,6 @@
* Queries the system configuration in order to report the available, non-microphone audio
* input devices.
*
- * Requires {@link android.car.Car#PERMISSION_CAR_CONTROL_AUDIO_SETTINGS} permission.
- *
* @return An array of strings representing the available input ports.
* Each port is identified by it's "address" tag in the audioPolicyConfiguration xml file.
* Empty array if we find nothing.
@@ -213,7 +247,7 @@
* @see #createAudioPatch(String, int, int)
* @see #releaseAudioPatch(CarAudioPatchHandle)
*/
- @SystemApi
+ @RequiresPermission(Car.PERMISSION_CAR_CONTROL_AUDIO_SETTINGS)
public @NonNull String[] getExternalSources() throws CarNotConnectedException {
try {
return mService.getExternalSources();
@@ -229,8 +263,6 @@
* The output of a tuner might be routed directly to the output buss associated with
* AudioAttributes.USAGE_MEDIA while the tuner is playing.
*
- * Requires {@link android.car.Car#PERMISSION_CAR_CONTROL_AUDIO_SETTINGS} permission.
- *
* @param sourceAddress the input port name obtained from getExternalSources().
* @param usage the type of audio represented by this source (usually USAGE_MEDIA).
* @param gainInMillibels How many steps above the minimum value defined for the source port to
@@ -243,7 +275,7 @@
* @see #getExternalSources()
* @see #releaseAudioPatch(CarAudioPatchHandle)
*/
- @SystemApi
+ @RequiresPermission(Car.PERMISSION_CAR_CONTROL_AUDIO_SETTINGS)
public CarAudioPatchHandle createAudioPatch(String sourceAddress,
@AudioAttributes.AttributeUsage int usage, int gainInMillibels)
throws CarNotConnectedException {
@@ -259,14 +291,12 @@
* Removes the association between an input port and an output port identified by the provided
* handle.
*
- * Requires {@link android.car.Car#PERMISSION_CAR_CONTROL_AUDIO_SETTINGS} permission.
- *
* @param patch CarAudioPatchHandle returned from createAudioPatch().
*
* @see #getExternalSources()
* @see #createAudioPatch(String, int, int)
*/
- @SystemApi
+ @RequiresPermission(Car.PERMISSION_CAR_CONTROL_AUDIO_SETTINGS)
public void releaseAudioPatch(CarAudioPatchHandle patch) throws CarNotConnectedException {
try {
mService.releaseAudioPatch(patch);
@@ -277,16 +307,24 @@
}
/**
+ * Gets the count of available volume groups in primary zone.
+ *
+ * @see {@link #getVolumeGroupCount(int)}
+ */
+ public int getVolumeGroupCount() throws CarNotConnectedException {
+ return getVolumeGroupCount(PRIMARY_AUDIO_ZONE);
+ }
+
+ /**
* Gets the count of available volume groups in the system.
*
- * Requires {@link android.car.Car#PERMISSION_CAR_CONTROL_AUDIO_VOLUME} permission.
- *
+ * @param zoneId The zone id whois count of volume groups is queried.
* @return Count of volume groups
*/
- @SystemApi
- public int getVolumeGroupCount() throws CarNotConnectedException {
+ @RequiresPermission(Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME)
+ public int getVolumeGroupCount(int zoneId) throws CarNotConnectedException {
try {
- return mService.getVolumeGroupCount();
+ return mService.getVolumeGroupCount(zoneId);
} catch (RemoteException e) {
Log.e(CarLibLog.TAG_CAR, "getVolumeGroupCount failed", e);
throw new CarNotConnectedException(e);
@@ -294,18 +332,27 @@
}
/**
+ * Gets the volume group id for a given {@link AudioAttributes} usage in primary zone.
+ *
+ * @see {@link #getVolumeGroupIdForUsage(int, int)}
+ */
+ public int getVolumeGroupIdForUsage(@AudioAttributes.AttributeUsage int usage)
+ throws CarNotConnectedException {
+ return getVolumeGroupIdForUsage(PRIMARY_AUDIO_ZONE, usage);
+ }
+
+ /**
* Gets the volume group id for a given {@link AudioAttributes} usage.
*
- * Requires {@link android.car.Car#PERMISSION_CAR_CONTROL_AUDIO_VOLUME} permission.
- *
+ * @param zoneId The zone id whose volume group is queried.
* @param usage The {@link AudioAttributes} usage to get a volume group from.
* @return The volume group id where the usage belongs to
*/
- @SystemApi
- public int getVolumeGroupIdForUsage(@AudioAttributes.AttributeUsage int usage)
+ @RequiresPermission(Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME)
+ public int getVolumeGroupIdForUsage(int zoneId, @AudioAttributes.AttributeUsage int usage)
throws CarNotConnectedException {
try {
- return mService.getVolumeGroupIdForUsage(usage);
+ return mService.getVolumeGroupIdForUsage(zoneId, usage);
} catch (RemoteException e) {
Log.e(CarLibLog.TAG_CAR, "getVolumeGroupIdForUsage failed", e);
throw new CarNotConnectedException(e);
@@ -313,71 +360,97 @@
}
/**
- * Gets array of {@link AudioAttributes} usages for a given volume group id.
+ * Gets array of {@link AudioAttributes} usages for a volume group in primary zone.
*
- * Requires {@link android.car.Car#PERMISSION_CAR_CONTROL_AUDIO_VOLUME} permission.
+ * @see {@link #getUsagesForVolumeGroupId(int, int)}
+ */
+ public @NonNull int[] getUsagesForVolumeGroupId(int groupId) throws CarNotConnectedException {
+ return getUsagesForVolumeGroupId(PRIMARY_AUDIO_ZONE, groupId);
+ }
+
+ /**
+ * Gets array of {@link AudioAttributes} usages for a volume group in a zone.
*
+ * @param zoneId The zone id whose volume group is queried.
* @param groupId The volume group id whose associated audio usages is returned.
* @return Array of {@link AudioAttributes} usages for a given volume group id
*/
- @SystemApi
- public @NonNull int[] getUsagesForVolumeGroupId(int groupId) throws CarNotConnectedException {
+ @RequiresPermission(Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME)
+ public @NonNull int[] getUsagesForVolumeGroupId(int zoneId, int groupId)
+ throws CarNotConnectedException {
try {
- return mService.getUsagesForVolumeGroupId(groupId);
+ return mService.getUsagesForVolumeGroupId(zoneId, groupId);
} catch (RemoteException e) {
Log.e(CarLibLog.TAG_CAR, "getUsagesForVolumeGroupId failed", e);
throw new CarNotConnectedException(e);
}
}
- /**
- * Register {@link ICarVolumeCallback} to receive the volume key events
- *
- * Requires {@link android.car.Car#PERMISSION_CAR_CONTROL_AUDIO_VOLUME} permission.
- *
- * @param binder {@link IBinder} instance of {@link ICarVolumeCallback} to receive
- * volume key event callbacks
- * @throws CarNotConnectedException
- */
- @SystemApi
- public void registerVolumeCallback(@NonNull IBinder binder)
- throws CarNotConnectedException {
- try {
- mService.registerVolumeCallback(binder);
- } catch (RemoteException e) {
- Log.e(CarLibLog.TAG_CAR, "registerVolumeCallback failed", e);
- throw new CarNotConnectedException(e);
- }
- }
-
- /**
- * Unregister {@link ICarVolumeCallback} from receiving volume key events
- *
- * Requires {@link android.car.Car#PERMISSION_CAR_CONTROL_AUDIO_VOLUME} permission.
- *
- * @param binder {@link IBinder} instance of {@link ICarVolumeCallback} to stop receiving
- * volume key event callbacks
- * @throws CarNotConnectedException
- */
- @SystemApi
- public void unregisterVolumeCallback(@NonNull IBinder binder)
- throws CarNotConnectedException {
- try {
- mService.unregisterVolumeCallback(binder);
- } catch (RemoteException e) {
- Log.e(CarLibLog.TAG_CAR, "unregisterVolumeCallback failed", e);
- throw new CarNotConnectedException(e);
- }
- }
-
/** @hide */
@Override
public void onCarDisconnected() {
+ if (mService != null) {
+ try {
+ mService.unregisterVolumeCallback(mCarVolumeCallbackImpl.asBinder());
+ } catch (RemoteException e) {
+ Log.e(CarLibLog.TAG_CAR, "unregisterVolumeCallback failed", e);
+ }
+ }
}
/** @hide */
public CarAudioManager(IBinder service, Context context, Handler handler) {
- mContentResolver = context.getContentResolver();
mService = ICarAudio.Stub.asInterface(service);
+ mCarVolumeCallbacks = new ArrayList<>();
+
+ try {
+ mService.registerVolumeCallback(mCarVolumeCallbackImpl.asBinder());
+ } catch (RemoteException e) {
+ Log.e(CarLibLog.TAG_CAR, "registerVolumeCallback failed", e);
+ }
+ }
+
+ /**
+ * Registers a {@link CarVolumeCallback} to receive volume change callbacks
+ * @param callback {@link CarVolumeCallback} instance, can not be null
+ */
+ public void registerCarVolumeCallback(@NonNull CarVolumeCallback callback) {
+ mCarVolumeCallbacks.add(callback);
+ }
+
+ /**
+ * Unregisters a {@link CarVolumeCallback} from receiving volume change callbacks
+ * @param callback {@link CarVolumeCallback} instance previously registered, can not be null
+ */
+ public void unregisterCarVolumeCallback(@NonNull CarVolumeCallback callback) {
+ mCarVolumeCallbacks.remove(callback);
+ }
+
+ /**
+ * Callback interface to receive volume change events in a car.
+ * Extend this class and register it with {@link #registerCarVolumeCallback(CarVolumeCallback)}
+ * and unregister it via {@link #unregisterCarVolumeCallback(CarVolumeCallback)}
+ */
+ public abstract static class CarVolumeCallback {
+ /**
+ * This is called whenever a group volume is changed.
+ * The changed-to volume index is not included, the caller is encouraged to
+ * get the current group volume index via CarAudioManager.
+ *
+ * @param zoneId Id of the audio zone that volume change happens
+ * @param groupId Id of the volume group that volume is changed
+ * @param flags see {@link android.media.AudioManager} for flag definitions
+ */
+ public void onGroupVolumeChanged(int zoneId, int groupId, int flags) {}
+
+ /**
+ * This is called whenever the master mute state is changed.
+ * The changed-to master mute state is not included, the caller is encouraged to
+ * get the current master mute state via AudioManager.
+ *
+ * @param zoneId Id of the audio zone that master mute state change happens
+ * @param flags see {@link android.media.AudioManager} for flag definitions
+ */
+ public void onMasterMuteChanged(int zoneId, int flags) {}
}
}
diff --git a/car-lib/src/android/car/media/ICarAudio.aidl b/car-lib/src/android/car/media/ICarAudio.aidl
index 353c168..178f75a 100644
--- a/car-lib/src/android/car/media/ICarAudio.aidl
+++ b/car-lib/src/android/car/media/ICarAudio.aidl
@@ -25,10 +25,12 @@
* @hide
*/
interface ICarAudio {
- void setGroupVolume(int groupId, int index, int flags);
- int getGroupMaxVolume(int groupId);
- int getGroupMinVolume(int groupId);
- int getGroupVolume(int groupId);
+ boolean isDynamicRoutingEnabled();
+
+ void setGroupVolume(int zoneId, int groupId, int index, int flags);
+ int getGroupMaxVolume(int zoneId, int groupId);
+ int getGroupMinVolume(int zoneId, int groupId);
+ int getGroupVolume(int zoneId, int groupId);
void setFadeTowardFront(float value);
void setBalanceTowardRight(float value);
@@ -37,9 +39,9 @@
CarAudioPatchHandle createAudioPatch(in String sourceAddress, int usage, int gainInMillibels);
void releaseAudioPatch(in CarAudioPatchHandle patch);
- int getVolumeGroupCount();
- int getVolumeGroupIdForUsage(int usage);
- int[] getUsagesForVolumeGroupId(int groupId);
+ int getVolumeGroupCount(int zoneId);
+ int getVolumeGroupIdForUsage(int zoneId, int usage);
+ int[] getUsagesForVolumeGroupId(int zoneId, int groupId);
/**
* IBinder is ICarVolumeCallback but passed as IBinder due to aidl hidden.
diff --git a/car-lib/src/android/car/media/ICarVolumeCallback.aidl b/car-lib/src/android/car/media/ICarVolumeCallback.aidl
index 8540680..9672983 100644
--- a/car-lib/src/android/car/media/ICarVolumeCallback.aidl
+++ b/car-lib/src/android/car/media/ICarVolumeCallback.aidl
@@ -27,12 +27,12 @@
* The changed-to volume index is not included, the caller is encouraged to
* get the current group volume index via CarAudioManager.
*/
- void onGroupVolumeChanged(int groupId, int flags);
+ void onGroupVolumeChanged(int zoneId, int groupId, int flags);
/**
* This is called whenever the master mute state is changed.
* The changed-to master mute state is not included, the caller is encouraged to
* get the current master mute state via AudioManager.
*/
- void onMasterMuteChanged(int flags);
+ void onMasterMuteChanged(int zoneId, int flags);
}
diff --git a/car-lib/src/android/car/navigation/CarNavigationStatusManager.java b/car-lib/src/android/car/navigation/CarNavigationStatusManager.java
index df0dee9..6d4a561 100644
--- a/car-lib/src/android/car/navigation/CarNavigationStatusManager.java
+++ b/car-lib/src/android/car/navigation/CarNavigationStatusManager.java
@@ -55,6 +55,7 @@
try {
mService.onEvent(eventType, bundle);
} catch (IllegalStateException e) {
+ Log.e(TAG, "Illegal state sending event " + eventType, e);
CarApiUtil.checkCarNotConnectedExceptionFromCarService(e);
} catch (RemoteException e) {
handleCarServiceRemoteExceptionAndThrow(e);
@@ -63,7 +64,9 @@
/** @hide */
@Override
- public void onCarDisconnected() {}
+ public void onCarDisconnected() {
+ Log.e(TAG, "Car service disconnected");
+ }
/** Returns navigation features of instrument cluster */
public CarNavigationInstrumentCluster getInstrumentClusterInfo()
@@ -78,12 +81,7 @@
private void handleCarServiceRemoteExceptionAndThrow(RemoteException e)
throws CarNotConnectedException {
- handleCarServiceRemoteException(e);
- throw new CarNotConnectedException();
- }
-
- private void handleCarServiceRemoteException(RemoteException e) {
- Log.w(TAG, "RemoteException from car service:" + e.getMessage());
- // nothing to do for now
+ Log.e(TAG, "RemoteException from car service:" + e);
+ throw new CarNotConnectedException(e);
}
}
diff --git a/car-lib/src/android/car/settings/CarSettings.java b/car-lib/src/android/car/settings/CarSettings.java
index f5e1037..f614601 100644
--- a/car-lib/src/android/car/settings/CarSettings.java
+++ b/car-lib/src/android/car/settings/CarSettings.java
@@ -32,17 +32,24 @@
*/
public static final class Global {
/**
- * Key for when to wake up to run garage mode.
+ * DEPRECATED. Will be removed in Q. Key for when to wake up to run garage mode.
+ * @deprecated not used by GarageMode anymore. Will be removed in Q.
*/
+ @Deprecated
public static final String KEY_GARAGE_MODE_WAKE_UP_TIME =
"android.car.GARAGE_MODE_WAKE_UP_TIME";
/**
- * Key for whether garage mode is enabled.
+ * DEPRECATED. Will be removed in Q. Key for whether garage mode is enabled.
+ * @deprecated not used by GarageMode anymore. Will be removed in Q.
*/
+ @Deprecated
public static final String KEY_GARAGE_MODE_ENABLED = "android.car.GARAGE_MODE_ENABLED";
+
/**
- * Key for garage mode maintenance window.
+ * DEPRECATED. Will be removed in Q. Key for garage mode maintenance window.
+ * @deprecated not used by GarageMode anymore. Will be removed in Q.
*/
+ @Deprecated
public static final String KEY_GARAGE_MODE_MAINTENANCE_WINDOW =
"android.car.GARAGE_MODE_MAINTENANCE_WINDOW";
@@ -61,6 +68,14 @@
*/
public static final String LAST_ACTIVE_USER_ID =
"android.car.LAST_ACTIVE_USER_ID";
+
+ /**
+ * Whether default restrictions for users have been set.
+ *
+ * @hide
+ */
+ public static final String DEFAULT_USER_RESTRICTIONS_SET =
+ "android.car.DEFAULT_USER_RESTRICTIONS_SET";
}
/**
@@ -186,6 +201,12 @@
public static final String KEY_BLUETOOTH_AUTOCONNECT_NETWORK_DEVICE_PRIORITY_1 =
"android.car.BLUETOOTH_AUTOCONNECT_NETWORK_DEVICE_PRIORITY_1";
-
+ /**
+ * Key for storing temporarily-disconnected devices and profiles.
+ * Read and written by {@link com.android.car.BluetoothDeviceConnectionPolicy}.
+ * @hide
+ */
+ public static final String KEY_BLUETOOTH_TEMPORARY_DISCONNECTS =
+ "android.car.BLUETOOTH_TEMPORARY_DISCONNECTS";
}
}
diff --git a/car-lib/src/android/car/settings/GarageModeSettingsObserver.java b/car-lib/src/android/car/settings/GarageModeSettingsObserver.java
deleted file mode 100644
index 8b58ed6..0000000
--- a/car-lib/src/android/car/settings/GarageModeSettingsObserver.java
+++ /dev/null
@@ -1,67 +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.car.settings;
-
-import android.content.Context;
-import android.database.ContentObserver;
-import android.net.Uri;
-import android.os.Handler;
-import android.provider.Settings;
-
-import java.lang.ref.WeakReference;
-
-/**
- * A content observer for garage mode settings.
- * @hide
- */
-public abstract class GarageModeSettingsObserver extends ContentObserver {
-
- public static final Uri GARAGE_MODE_ENABLED_URI =
- Settings.Global.getUriFor(CarSettings.Global.KEY_GARAGE_MODE_ENABLED);
- public static final Uri GARAGE_MODE_WAKE_UP_TIME_URI =
- Settings.Global.getUriFor(CarSettings.Global.KEY_GARAGE_MODE_WAKE_UP_TIME);
- public static final Uri GARAGE_MODE_MAINTENANCE_WINDOW_URI =
- Settings.Global.getUriFor(CarSettings.Global.KEY_GARAGE_MODE_MAINTENANCE_WINDOW);
-
- public static final Uri[] GARAGE_SETTING_URIS = {GARAGE_MODE_ENABLED_URI,
- GARAGE_MODE_WAKE_UP_TIME_URI, GARAGE_MODE_MAINTENANCE_WINDOW_URI};
-
- private final WeakReference<Context> mContext;
-
- public GarageModeSettingsObserver(Context context, Handler handler) {
- super(handler);
- mContext = new WeakReference<Context>(context);
- }
-
- public void register() {
- if (mContext.get() == null) {
- return;
- }
- for (Uri uri : GARAGE_SETTING_URIS) {
- mContext.get().getContentResolver().registerContentObserver(
- uri, false, this);
- }
- }
-
- public void unregister() {
- if (mContext.get() == null) {
- return;
- }
- mContext.get().getContentResolver().unregisterContentObserver(this);
- }
-
-}
diff --git a/car-lib/src/android/car/test/CarLocationTestHelper.java b/car-lib/src/android/car/test/CarLocationTestHelper.java
new file mode 100644
index 0000000..a5ef4d7
--- /dev/null
+++ b/car-lib/src/android/car/test/CarLocationTestHelper.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.car.test;
+
+import android.annotation.TestApi;
+import android.content.Context;
+import android.location.Location;
+import android.location.LocationManager;
+
+/**
+ * Provides a helper method for use in ATS tests which calls {@link LocationManager#injectLocation}
+ * without reflection.
+ *
+ * @hide
+ */
+public class CarLocationTestHelper {
+
+ /**
+ * Calls the {@link LocationManager#injectLocation} API without reflection.
+ *
+ * @hide
+ */
+ @TestApi
+ public static boolean injectLocation(Location location, Context context) {
+ LocationManager locationManager =
+ (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
+ return locationManager.injectLocation(location);
+ }
+}
diff --git a/car-lib/src/android/car/trust/CarTrustAgentEnrollmentManager.java b/car-lib/src/android/car/trust/CarTrustAgentEnrollmentManager.java
new file mode 100644
index 0000000..6b27b5e
--- /dev/null
+++ b/car-lib/src/android/car/trust/CarTrustAgentEnrollmentManager.java
@@ -0,0 +1,676 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.car.trust;
+
+import static android.car.Car.PERMISSION_CAR_ENROLL_TRUST;
+
+import android.annotation.Nullable;
+import android.annotation.RequiresPermission;
+import android.annotation.SystemApi;
+import android.bluetooth.BluetoothDevice;
+import android.car.CarManagerBase;
+import android.car.CarNotConnectedException;
+import android.content.Context;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Looper;
+import android.os.Message;
+import android.os.RemoteException;
+import android.util.Log;
+
+import com.android.internal.annotations.GuardedBy;
+
+import java.lang.ref.WeakReference;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+
+/**
+ * APIs to help enroll a remote device as a trusted device that can be used to authenticate a user
+ * in the head unit.
+ * <p>
+ * The call sequence to add a new trusted device from the client should be as follows:
+ * <ol>
+ * <li> setEnrollmentCallback()
+ * <li> setBleCallback(bleCallback)
+ * <li> startEnrollmentAdvertising()
+ * <li> wait for onEnrollmentAdvertisingStarted() or
+ * <li> wait for onBleEnrollmentDeviceConnected() and check if the device connected is the right
+ * one.
+ * <li> initiateEnrollmentHandshake()
+ * <li> wait for onAuthStringAvailable() to get the pairing code to display to the user
+ * <li> enrollmentHandshakeAccepted() after user confirms the pairing code
+ * <li> wait for onEscrowTokenAdded()
+ * <li> Authenticate user's credentials by showing the lock screen
+ * <li> activateToken()
+ * <li> wait for onEscrowTokenActiveStateChanged() to add the device as a trusted device and show
+ * in the list
+ * </ol>
+ *
+ * @hide
+ */
+@SystemApi
+public final class CarTrustAgentEnrollmentManager implements CarManagerBase {
+ private static final String TAG = "CarTrustEnrollMgr";
+ private static final String KEY_HANDLE = "handle";
+ private static final String KEY_ACTIVE = "active";
+ private static final String KEY_SUCCESS = "success";
+ private static final int MSG_ENROLL_ADVERTISING_STARTED = 0;
+ private static final int MSG_ENROLL_ADVERTISING_FAILED = 1;
+ private static final int MSG_ENROLL_DEVICE_CONNECTED = 2;
+ private static final int MSG_ENROLL_DEVICE_DISCONNECTED = 3;
+ private static final int MSG_ENROLL_HANDSHAKE_FAILURE = 4;
+ private static final int MSG_ENROLL_AUTH_STRING_AVAILABLE = 5;
+ private static final int MSG_ENROLL_TOKEN_ADDED = 6;
+ private static final int MSG_ENROLL_TOKEN_REVOKED = 7;
+ private static final int MSG_ENROLL_TOKEN_STATE_CHANGED = 8;
+
+ private final Context mContext;
+ private final ICarTrustAgentEnrollment mEnrollmentService;
+ private Object mListenerLock = new Object();
+ @GuardedBy("mListenerLock")
+ private CarTrustAgentEnrollmentCallback mEnrollmentCallback;
+ @GuardedBy("mListenerLock")
+ private CarTrustAgentBleCallback mBleCallback;
+ @GuardedBy("mListenerLock")
+ private final ListenerToEnrollmentService mListenerToEnrollmentService =
+ new ListenerToEnrollmentService(this);
+ private final ListenerToBleService mListenerToBleService = new ListenerToBleService(this);
+ private final EventCallbackHandler mEventCallbackHandler;
+
+
+ /** @hide */
+ public CarTrustAgentEnrollmentManager(IBinder service, Context context, Handler handler) {
+ mContext = context;
+ mEnrollmentService = ICarTrustAgentEnrollment.Stub.asInterface(service);
+ mEventCallbackHandler = new EventCallbackHandler(this, handler.getLooper());
+ }
+
+ /** @hide */
+ @Override
+ public synchronized void onCarDisconnected() {
+ }
+
+ /**
+ * Starts broadcasting enrollment UUID on BLE.
+ * Phones can scan and connect for the enrollment process to begin.
+ */
+ @RequiresPermission(PERMISSION_CAR_ENROLL_TRUST)
+ public void startEnrollmentAdvertising() throws CarNotConnectedException {
+ try {
+ mEnrollmentService.startEnrollmentAdvertising();
+ } catch (RemoteException e) {
+ throw new CarNotConnectedException(e);
+ }
+ }
+
+ /**
+ * Stops Enrollment advertising.
+ */
+ @RequiresPermission(PERMISSION_CAR_ENROLL_TRUST)
+ public void stopEnrollmentAdvertising() throws CarNotConnectedException {
+ try {
+ mEnrollmentService.stopEnrollmentAdvertising();
+ } catch (RemoteException e) {
+ throw new CarNotConnectedException(e);
+ }
+ }
+
+ /**
+ * Initiates the handshake with the phone for enrollment. This should be called after the
+ * user has confirmed the phone that is requesting enrollment.
+ *
+ * @param device the remote Bluetooth device that is trying to enroll.
+ */
+ @RequiresPermission(PERMISSION_CAR_ENROLL_TRUST)
+ public void initiateEnrollmentHandshake(BluetoothDevice device)
+ throws CarNotConnectedException {
+ try {
+ mEnrollmentService.initiateEnrollmentHandshake(device);
+ } catch (RemoteException e) {
+ throw new CarNotConnectedException(e);
+ }
+ }
+
+ /**
+ * Confirms that the enrollment handshake has been accepted by the user. This should be called
+ * after the user has confirmed the verification code displayed on the UI.
+ */
+ @RequiresPermission(PERMISSION_CAR_ENROLL_TRUST)
+ public void enrollmentHandshakeAccepted() throws CarNotConnectedException {
+ try {
+ mEnrollmentService.enrollmentHandshakeAccepted();
+ } catch (RemoteException e) {
+ throw new CarNotConnectedException(e);
+ }
+ }
+
+ /**
+ * Provides an option to quit enrollment if the pairing code doesn't match for example.
+ */
+ @RequiresPermission(PERMISSION_CAR_ENROLL_TRUST)
+ public void terminateEnrollmentHandshake() throws CarNotConnectedException {
+ try {
+ mEnrollmentService.terminateEnrollmentHandshake();
+ } catch (RemoteException e) {
+ throw new CarNotConnectedException(e);
+ }
+ }
+
+ /**
+ * Activate the newly added escrow token.
+ *
+ * @param handle the handle corresponding to the escrow token
+ */
+ @RequiresPermission(PERMISSION_CAR_ENROLL_TRUST)
+ public void activateToken(long handle) throws CarNotConnectedException {
+ try {
+ mEnrollmentService.activateToken(handle);
+ } catch (RemoteException e) {
+ throw new CarNotConnectedException(e);
+ }
+ }
+
+ /**
+ * Revoke trust for the remote device denoted by the handle.
+ *
+ * @param handle the handle associated with the escrow token
+ */
+ @RequiresPermission(PERMISSION_CAR_ENROLL_TRUST)
+ public void revokeTrust(long handle) throws CarNotConnectedException {
+ try {
+ mEnrollmentService.revokeTrust(handle);
+ } catch (RemoteException e) {
+ throw new CarNotConnectedException(e);
+ }
+ }
+
+ /**
+ * Register for enrollment event callbacks.
+ *
+ * @param callback The callback methods to call, null to unregister
+ */
+ @RequiresPermission(PERMISSION_CAR_ENROLL_TRUST)
+ public void setEnrollmentCallback(@Nullable CarTrustAgentEnrollmentCallback callback)
+ throws CarNotConnectedException {
+ if (callback == null) {
+ unregisterEnrollmentCallback();
+ } else {
+ registerEnrollmentCallback(callback);
+ }
+ }
+
+ private void registerEnrollmentCallback(CarTrustAgentEnrollmentCallback callback)
+ throws CarNotConnectedException {
+ synchronized (mListenerLock) {
+ if (callback != null && mEnrollmentCallback == null) {
+ try {
+ mEnrollmentService.registerEnrollmentCallback(mListenerToEnrollmentService);
+ mEnrollmentCallback = callback;
+ } catch (RemoteException e) {
+ throw new CarNotConnectedException(e);
+ }
+ }
+ }
+ }
+
+ private void unregisterEnrollmentCallback() throws CarNotConnectedException {
+ synchronized (mListenerLock) {
+ if (mEnrollmentCallback != null) {
+ try {
+ mEnrollmentService.unregisterEnrollmentCallback(mListenerToEnrollmentService);
+ } catch (RemoteException e) {
+ throw new CarNotConnectedException(e);
+ }
+ mEnrollmentCallback = null;
+ }
+ }
+ }
+
+ /**
+ * Register for general BLE callbacks
+ *
+ * @param callback The callback methods to call, null to unregister
+ */
+ @RequiresPermission(PERMISSION_CAR_ENROLL_TRUST)
+ public void setBleCallback(@Nullable CarTrustAgentBleCallback callback)
+ throws CarNotConnectedException {
+ if (callback == null) {
+ unregisterBleCallback();
+ } else {
+ registerBleCallback(callback);
+ }
+ }
+
+ private void registerBleCallback(CarTrustAgentBleCallback callback)
+ throws CarNotConnectedException {
+ synchronized (mListenerLock) {
+ if (callback != null && mBleCallback == null) {
+ try {
+ mEnrollmentService.registerBleCallback(mListenerToBleService);
+ mBleCallback = callback;
+ } catch (RemoteException e) {
+ throw new CarNotConnectedException(e);
+ }
+ }
+ }
+ }
+
+ private void unregisterBleCallback() throws CarNotConnectedException {
+ synchronized (mListenerLock) {
+ if (mBleCallback != null) {
+ try {
+ mEnrollmentService.unregisterBleCallback(mListenerToBleService);
+ } catch (RemoteException e) {
+ throw new CarNotConnectedException(e);
+ }
+ mBleCallback = null;
+ }
+ }
+ }
+
+ /**
+ * Provides a list of enrollment handles for the given user id.
+ * Each enrollment handle corresponds to a trusted device for the given user.
+ *
+ * @param uid user id.
+ * @return list of the Enrollment handles for the user id.
+ */
+ @RequiresPermission(PERMISSION_CAR_ENROLL_TRUST)
+ public List<Integer> getEnrollmentHandlesForUser(int uid) throws CarNotConnectedException {
+ try {
+ return Arrays.stream(
+ mEnrollmentService.getEnrollmentHandlesForUser(uid)).boxed().collect(
+ Collectors.toList());
+ } catch (RemoteException e) {
+ throw new CarNotConnectedException(e);
+ }
+ }
+
+ private Handler getEventCallbackHandler() {
+ return mEventCallbackHandler;
+ }
+
+ /**
+ * Callback interface for Trusted device enrollment applications to implement. The applications
+ * get notified on various enrollment state change events.
+ */
+ public interface CarTrustAgentEnrollmentCallback {
+ /**
+ * Communicate about failure/timeouts in the handshake process.
+ *
+ * @param device the remote device trying to enroll
+ * @param errorCode information on what failed.
+ */
+ void onEnrollmentHandshakeFailure(BluetoothDevice device, int errorCode);
+
+ /**
+ * Present the pairing/authentication string to the user.
+ *
+ * @param device the remote device trying to enroll
+ * @param authString the authentication string to show to the user to confirm across
+ * both devices
+ */
+ void onAuthStringAvailable(BluetoothDevice device, String authString);
+
+ /**
+ * Escrow token was received and the Trust Agent framework has generated a corresponding
+ * handle.
+ *
+ * @param handle the handle associated with the escrow token.
+ */
+ void onEscrowTokenAdded(long handle);
+
+ /**
+ * Escrow token corresponding to the given handle has been removed.
+ *
+ * @param handle the handle associated with the escrow token.
+ * @param success status of the revoke operation.
+ */
+ void onTrustRevoked(long handle, boolean success);
+
+ /**
+ * Escrow token's active state changed.
+ *
+ * @param handle the handle associated with the escrow token
+ * @param active True if token has been activated, false if not.
+ */
+ void onEscrowTokenActiveStateChanged(long handle, boolean active);
+
+ }
+
+ /**
+ * Callback interface for Trusted device enrollment applications to implement. The applications
+ * get notified on various BLE state change events that happen during trusted device enrollment.
+ */
+ public interface CarTrustAgentBleCallback {
+ /**
+ * Indicates a remote device connected on BLE.
+ */
+ void onBleEnrollmentDeviceConnected(BluetoothDevice device);
+
+ /**
+ * Indicates a remote device disconnected on BLE.
+ */
+ void onBleEnrollmentDeviceDisconnected(BluetoothDevice device);
+
+ /**
+ * Indicates that the device is broadcasting for trusted device enrollment on BLE.
+ */
+ void onEnrollmentAdvertisingStarted();
+
+ /**
+ * Indicates a failure in BLE broadcasting for enrollment.
+ */
+ void onEnrollmentAdvertisingFailed(int errorCode);
+ }
+
+ private static final class ListenerToEnrollmentService extends
+ ICarTrustAgentEnrollmentCallback.Stub {
+ private final WeakReference<CarTrustAgentEnrollmentManager> mMgr;
+
+ ListenerToEnrollmentService(CarTrustAgentEnrollmentManager mgr) {
+ mMgr = new WeakReference<>(mgr);
+ }
+
+ /**
+ * Communicate about failure/timeouts in the handshake process.
+ */
+ @Override
+ public void onEnrollmentHandshakeFailure(BluetoothDevice device, int errorCode) {
+ CarTrustAgentEnrollmentManager enrollmentManager = mMgr.get();
+ if (enrollmentManager == null) {
+ return;
+ }
+ enrollmentManager.getEventCallbackHandler().sendMessage(
+ enrollmentManager.getEventCallbackHandler().obtainMessage(
+ MSG_ENROLL_HANDSHAKE_FAILURE, new AuthInfo(device, null, errorCode)));
+ }
+
+ /**
+ * Present the pairing/authentication string to the user.
+ */
+ @Override
+ public void onAuthStringAvailable(BluetoothDevice device, String authString) {
+ CarTrustAgentEnrollmentManager enrollmentManager = mMgr.get();
+ if (enrollmentManager == null) {
+ return;
+ }
+ enrollmentManager.getEventCallbackHandler().sendMessage(
+ enrollmentManager.getEventCallbackHandler().obtainMessage(
+ MSG_ENROLL_AUTH_STRING_AVAILABLE, new AuthInfo(device, authString, 0)));
+ }
+
+ /**
+ * Escrow token was received and the Trust Agent framework has generated a corresponding
+ * handle.
+ */
+ @Override
+ public void onEscrowTokenAdded(long handle) {
+ CarTrustAgentEnrollmentManager enrollmentManager = mMgr.get();
+ if (enrollmentManager == null) {
+ return;
+ }
+ Message message = enrollmentManager.getEventCallbackHandler().obtainMessage(
+ MSG_ENROLL_TOKEN_ADDED);
+ Bundle data = new Bundle();
+ data.putLong(KEY_HANDLE, handle);
+ message.setData(data);
+ enrollmentManager.getEventCallbackHandler().sendMessage(message);
+ }
+
+ /**
+ * Escrow token corresponding to the given handle has been removed.
+ */
+ @Override
+ public void onTrustRevoked(long handle, boolean success) {
+ CarTrustAgentEnrollmentManager enrollmentManager = mMgr.get();
+ if (enrollmentManager == null) {
+ return;
+ }
+ Message message = enrollmentManager.getEventCallbackHandler().obtainMessage(
+ MSG_ENROLL_TOKEN_REVOKED);
+ Bundle data = new Bundle();
+ data.putLong(KEY_HANDLE, handle);
+ data.putBoolean(KEY_SUCCESS, success);
+ message.setData(data);
+ enrollmentManager.getEventCallbackHandler().sendMessage(message);
+ }
+
+ /**
+ * Escrow token's active state changed.
+ */
+ @Override
+ public void onEscrowTokenActiveStateChanged(long handle, boolean active) {
+ CarTrustAgentEnrollmentManager enrollmentManager = mMgr.get();
+ if (enrollmentManager == null) {
+ return;
+ }
+ Message message = enrollmentManager.getEventCallbackHandler().obtainMessage(
+ MSG_ENROLL_TOKEN_STATE_CHANGED);
+ Bundle data = new Bundle();
+ data.putLong(KEY_HANDLE, handle);
+ data.putBoolean(KEY_ACTIVE, active);
+ message.setData(data);
+ enrollmentManager.getEventCallbackHandler().sendMessage(message);
+ }
+ }
+
+ private static final class ListenerToBleService extends ICarTrustAgentBleCallback.Stub {
+ private final WeakReference<CarTrustAgentEnrollmentManager> mMgr;
+
+ ListenerToBleService(CarTrustAgentEnrollmentManager mgr) {
+ mMgr = new WeakReference<>(mgr);
+ }
+
+ /**
+ * Called when the GATT server is started and BLE is successfully advertising for
+ * enrollment.
+ */
+ public void onEnrollmentAdvertisingStarted() {
+ CarTrustAgentEnrollmentManager enrollmentManager = mMgr.get();
+ if (enrollmentManager == null) {
+ return;
+ }
+ enrollmentManager.getEventCallbackHandler().sendMessage(
+ enrollmentManager.getEventCallbackHandler().obtainMessage(
+ MSG_ENROLL_ADVERTISING_STARTED));
+ }
+
+ /**
+ * Called when the BLE enrollment advertisement fails to start.
+ * see AdvertiseCallback#ADVERTISE_FAILED_* for possible error codes.
+ */
+ public void onEnrollmentAdvertisingFailed(int errorCode) {
+ CarTrustAgentEnrollmentManager enrollmentManager = mMgr.get();
+ if (enrollmentManager == null) {
+ return;
+ }
+ enrollmentManager.getEventCallbackHandler().sendMessage(
+ enrollmentManager.getEventCallbackHandler().obtainMessage(
+ MSG_ENROLL_ADVERTISING_FAILED, errorCode));
+ }
+
+ /**
+ * Called when a remote device is connected on BLE.
+ */
+ public void onBleEnrollmentDeviceConnected(BluetoothDevice device) {
+ CarTrustAgentEnrollmentManager enrollmentManager = mMgr.get();
+ if (enrollmentManager == null) {
+ return;
+ }
+ enrollmentManager.getEventCallbackHandler().sendMessage(
+ enrollmentManager.getEventCallbackHandler().obtainMessage(
+ MSG_ENROLL_DEVICE_CONNECTED, device));
+ }
+
+ /**
+ * Called when a remote device is disconnected on BLE.
+ */
+ public void onBleEnrollmentDeviceDisconnected(BluetoothDevice device) {
+ CarTrustAgentEnrollmentManager enrollmentManager = mMgr.get();
+ if (enrollmentManager == null) {
+ return;
+ }
+ enrollmentManager.getEventCallbackHandler().sendMessage(
+ enrollmentManager.getEventCallbackHandler().obtainMessage(
+ MSG_ENROLL_DEVICE_DISCONNECTED, device));
+ }
+ }
+
+ /**
+ * Callback Handler to handle dispatching the enrollment state changes to the corresponding
+ * listeners
+ */
+ private static final class EventCallbackHandler extends Handler {
+ private final WeakReference<CarTrustAgentEnrollmentManager> mEnrollmentManager;
+
+ EventCallbackHandler(CarTrustAgentEnrollmentManager manager, Looper looper) {
+ super(looper);
+ mEnrollmentManager = new WeakReference<>(manager);
+ }
+
+ @Override
+ public void handleMessage(Message message) {
+ CarTrustAgentEnrollmentManager enrollmentManager = mEnrollmentManager.get();
+ if (enrollmentManager == null) {
+ return;
+ }
+ switch (message.what) {
+ case MSG_ENROLL_ADVERTISING_STARTED:
+ case MSG_ENROLL_ADVERTISING_FAILED:
+ case MSG_ENROLL_DEVICE_CONNECTED:
+ case MSG_ENROLL_DEVICE_DISCONNECTED:
+ enrollmentManager.dispatchBleCallback(message);
+ break;
+ case MSG_ENROLL_HANDSHAKE_FAILURE:
+ case MSG_ENROLL_AUTH_STRING_AVAILABLE:
+ case MSG_ENROLL_TOKEN_ADDED:
+ case MSG_ENROLL_TOKEN_REVOKED:
+ case MSG_ENROLL_TOKEN_STATE_CHANGED:
+ enrollmentManager.dispatchEnrollmentCallback(message);
+ break;
+ default:
+ Log.e(TAG, "Unknown message:" + message.what);
+ break;
+ }
+ }
+ }
+
+ /**
+ * Dispatch BLE related state change callbacks
+ *
+ * @param message Message to handle and dispatch
+ */
+ private void dispatchBleCallback(Message message) {
+ CarTrustAgentBleCallback bleCallback;
+ synchronized (mListenerLock) {
+ bleCallback = mBleCallback;
+ }
+ if (bleCallback == null) {
+ return;
+ }
+ switch (message.what) {
+ case MSG_ENROLL_ADVERTISING_STARTED:
+ bleCallback.onEnrollmentAdvertisingStarted();
+ break;
+ case MSG_ENROLL_ADVERTISING_FAILED:
+ bleCallback.onEnrollmentAdvertisingFailed((int) message.obj);
+ break;
+ case MSG_ENROLL_DEVICE_CONNECTED:
+ bleCallback.onBleEnrollmentDeviceConnected((BluetoothDevice) message.obj);
+ break;
+ case MSG_ENROLL_DEVICE_DISCONNECTED:
+ bleCallback.onBleEnrollmentDeviceDisconnected((BluetoothDevice) message.obj);
+ break;
+ default:
+ break;
+ }
+ }
+
+ /**
+ * Dispatch Enrollment related state changes to the listener.
+ *
+ * @param message Message to handle and dispatch
+ */
+ private void dispatchEnrollmentCallback(Message message) {
+ CarTrustAgentEnrollmentCallback enrollmentCallback;
+ synchronized (mListenerLock) {
+ enrollmentCallback = mEnrollmentCallback;
+ }
+ if (enrollmentCallback == null) {
+ return;
+ }
+ AuthInfo auth;
+ Bundle data;
+ switch (message.what) {
+ case MSG_ENROLL_HANDSHAKE_FAILURE:
+ auth = (AuthInfo) message.obj;
+ enrollmentCallback.onEnrollmentHandshakeFailure(auth.mDevice, auth.mErrorCode);
+ break;
+ case MSG_ENROLL_AUTH_STRING_AVAILABLE:
+ auth = (AuthInfo) message.obj;
+ if (auth.mDevice != null && auth.mAuthString != null) {
+ enrollmentCallback.onAuthStringAvailable(auth.mDevice, auth.mAuthString);
+ }
+ break;
+ case MSG_ENROLL_TOKEN_ADDED:
+ data = message.getData();
+ if (data == null) {
+ break;
+ }
+ enrollmentCallback.onEscrowTokenAdded(data.getLong(KEY_HANDLE));
+ break;
+ case MSG_ENROLL_TOKEN_REVOKED:
+ data = message.getData();
+ if (data == null) {
+ break;
+ }
+ enrollmentCallback.onTrustRevoked(data.getLong(KEY_HANDLE),
+ data.getBoolean(KEY_SUCCESS));
+ break;
+ case MSG_ENROLL_TOKEN_STATE_CHANGED:
+ data = message.getData();
+ if (data == null) {
+ break;
+ }
+ enrollmentCallback.onEscrowTokenActiveStateChanged(data.getLong(KEY_HANDLE),
+ data.getBoolean(KEY_ACTIVE));
+ break;
+ default:
+ break;
+ }
+ }
+
+ /**
+ * Container class to pass information through a Message to the handler.
+ */
+ private static class AuthInfo {
+ final BluetoothDevice mDevice;
+ @Nullable
+ final String mAuthString;
+ final int mErrorCode;
+
+ AuthInfo(BluetoothDevice device, @Nullable String authString, int errorCode) {
+ mDevice = device;
+ mAuthString = authString;
+ mErrorCode = errorCode;
+ }
+ }
+}
diff --git a/car-lib/src/android/car/trust/ICarTrustAgentBleCallback.aidl b/car-lib/src/android/car/trust/ICarTrustAgentBleCallback.aidl
index 9f28db9..e2a972d 100644
--- a/car-lib/src/android/car/trust/ICarTrustAgentBleCallback.aidl
+++ b/car-lib/src/android/car/trust/ICarTrustAgentBleCallback.aidl
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 The Android Open Source Project
+ * Copyright (C) 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -19,29 +19,29 @@
import android.bluetooth.BluetoothDevice;
/**
- * Callback interface for BLE connection state changes.
+ * Callback interface for BLE connection state changes during trusted device enrollment.
*
* @hide
*/
oneway interface ICarTrustAgentBleCallback {
/**
- * Called when the GATT server is started and BLE is successfully advertising.
+ * Called when the GATT server is started and BLE is successfully advertising for enrollment.
*/
- void onBleServerStartSuccess();
+ void onEnrollmentAdvertisingStarted();
/**
- * Called when the BLE advertisement fails to start.
+ * Called when the BLE enrollment advertisement fails to start.
* see AdvertiseCallback#ADVERTISE_FAILED_* for possible error codes.
*/
- void onBleServerStartFailure(int errorCode);
+ void onEnrollmentAdvertisingFailed(int errorCode);
/**
- * Called when a device is connected.
+ * Called when a remote device is connected on BLE.
*/
- void onBleDeviceConnected(in BluetoothDevice device);
+ void onBleEnrollmentDeviceConnected(in BluetoothDevice device);
/**
- * Called when a device is disconnected.
+ * Called when a remote device is disconnected on BLE.
*/
- void onBleDeviceDisconnected(in BluetoothDevice device);
+ void onBleEnrollmentDeviceDisconnected(in BluetoothDevice device);
}
diff --git a/car-lib/src/android/car/trust/ICarTrustAgentBleService.aidl b/car-lib/src/android/car/trust/ICarTrustAgentBleService.aidl
deleted file mode 100644
index 4dec6a0..0000000
--- a/car-lib/src/android/car/trust/ICarTrustAgentBleService.aidl
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.car.trust;
-
-import android.bluetooth.BluetoothDevice;
-import android.car.trust.ICarTrustAgentBleCallback;
-import android.car.trust.ICarTrustAgentEnrolmentCallback;
-import android.car.trust.ICarTrustAgentTokenRequestDelegate;
-import android.car.trust.ICarTrustAgentTokenResponseCallback;
-import android.car.trust.ICarTrustAgentUnlockCallback;
-
-/**
- * Binder interface for CarTrustAgentBleService.
- *
- * @hide
- */
-interface ICarTrustAgentBleService {
- /** General BLE */
- void registerBleCallback(in ICarTrustAgentBleCallback callback);
- void unregisterBleCallback(in ICarTrustAgentBleCallback callback);
-
- /** Enrolment */
- void startEnrolmentAdvertising();
- void stopEnrolmentAdvertising();
- void sendEnrolmentHandle(in BluetoothDevice device, long handle);
- void registerEnrolmentCallback(in ICarTrustAgentEnrolmentCallback callback);
- void unregisterEnrolmentCallback(in ICarTrustAgentEnrolmentCallback callback);
-
- /** Unlock */
- void startUnlockAdvertising();
- void stopUnlockAdvertising();
- void registerUnlockCallback(in ICarTrustAgentUnlockCallback callback);
- void unregisterUnlockCallback(in ICarTrustAgentUnlockCallback callback);
-
- /** Token request */
- void setTokenRequestDelegate(in ICarTrustAgentTokenRequestDelegate delegate);
- void revokeTrust();
- void addEscrowToken(in byte[] token, int uid);
- void removeEscrowToken(long handle, int uid);
- void isEscrowTokenActive(long handle, int uid);
-
- /** Token response */
- void setTokenResponseCallback(in ICarTrustAgentTokenResponseCallback callback);
- void onEscrowTokenAdded(in byte[] token, long handle, int uid);
- void onEscrowTokenRemoved(long handle, boolean successful);
- void onEscrowTokenActiveStateChanged(long handle, boolean active);
-
- /** Management */
- int getUserIdByEscrowTokenHandle(long tokenHandle);
-}
diff --git a/car-lib/src/android/car/trust/ICarTrustAgentEnrollment.aidl b/car-lib/src/android/car/trust/ICarTrustAgentEnrollment.aidl
new file mode 100644
index 0000000..0476f70
--- /dev/null
+++ b/car-lib/src/android/car/trust/ICarTrustAgentEnrollment.aidl
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.car.trust;
+
+import android.bluetooth.BluetoothDevice;
+import android.car.trust.ICarTrustAgentBleCallback;
+import android.car.trust.ICarTrustAgentEnrollmentCallback;
+
+/**
+ * Binder interface for CarTrustAgentEnrollmentService. The service implements the functionality
+ * to communicate with the remote device securely to enroll the remote device as a trusted device.
+ *
+ * @hide
+ */
+interface ICarTrustAgentEnrollment {
+ void startEnrollmentAdvertising();
+ void stopEnrollmentAdvertising();
+ void initiateEnrollmentHandshake(in BluetoothDevice device);
+ void enrollmentHandshakeAccepted();
+ void terminateEnrollmentHandshake();
+ void activateToken(in long handle);
+ void revokeTrust(in long handle);
+ int[] getEnrollmentHandlesForUser(in int uid);
+ void registerEnrollmentCallback(in ICarTrustAgentEnrollmentCallback callback);
+ void unregisterEnrollmentCallback(in ICarTrustAgentEnrollmentCallback callback);
+ void registerBleCallback(in ICarTrustAgentBleCallback callback);
+ void unregisterBleCallback(in ICarTrustAgentBleCallback callback);
+}
diff --git a/car-lib/src/android/car/trust/ICarTrustAgentEnrollmentCallback.aidl b/car-lib/src/android/car/trust/ICarTrustAgentEnrollmentCallback.aidl
new file mode 100644
index 0000000..62cef9c
--- /dev/null
+++ b/car-lib/src/android/car/trust/ICarTrustAgentEnrollmentCallback.aidl
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.car.trust;
+
+import android.bluetooth.BluetoothDevice;
+
+/**
+ * Callback interface for state changes during Trusted device enrollment.
+ *
+ * @hide
+ */
+oneway interface ICarTrustAgentEnrollmentCallback {
+ /**
+ * Communicate about failure/timeouts in the handshake process.
+ */
+ void onEnrollmentHandshakeFailure(in BluetoothDevice device, in int errorCode);
+
+ /**
+ * Present the pairing/authentication string to the user.
+ */
+ void onAuthStringAvailable(in BluetoothDevice device, in String authString);
+
+ /**
+ * Escrow token was received and the Trust Agent framework has generated a corresponding handle.
+ */
+ void onEscrowTokenAdded(in long handle);
+
+ /*
+ * Escrow token corresponding to the given handle has been removed.
+ */
+ void onTrustRevoked(in long handle, in boolean success);
+
+ /**
+ * Escrow token's active state changed.
+ */
+ void onEscrowTokenActiveStateChanged(in long handle, in boolean active);
+
+}
diff --git a/car-lib/src/android/car/trust/ICarTrustAgentEnrolmentCallback.aidl b/car-lib/src/android/car/trust/ICarTrustAgentEnrolmentCallback.aidl
deleted file mode 100644
index 7f12404..0000000
--- a/car-lib/src/android/car/trust/ICarTrustAgentEnrolmentCallback.aidl
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.car.trust;
-
-/**
- * Callback interface for CarTrustAgentService enrolment.
- *
- * @hide
- */
-oneway interface ICarTrustAgentEnrolmentCallback {
- /** Called when the enrolment data is received */
- void onEnrolmentDataReceived(in byte[] token);
-}
diff --git a/car-lib/src/android/car/trust/ICarTrustAgentTokenRequestDelegate.aidl b/car-lib/src/android/car/trust/ICarTrustAgentTokenRequestDelegate.aidl
deleted file mode 100644
index 3c61d4b..0000000
--- a/car-lib/src/android/car/trust/ICarTrustAgentTokenRequestDelegate.aidl
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.car.trust;
-
-/**
- * Delegate interface for escrow token exchange request.
- *
- * TrustAgentService uses async pattern and we therefore divide the
- * request and response into two separate AIDL interfaces.
- *
- * CarBleTrustAgent would implement this interface and set itself as a delegate.
- *
- * @hide
- */
-interface ICarTrustAgentTokenRequestDelegate {
- /** Called to revoke trust */
- void revokeTrust();
-
- /** Called to add escrow token for foreground user */
- void addEscrowToken(in byte[] token, int uid);
-
- /** Called to remove escrow token for foreground user */
- void removeEscrowToken(long handle, int uid);
-
- /** Called to query if the foreground user has active escrow token */
- void isEscrowTokenActive(long handle, int uid);
-}
diff --git a/car-lib/src/android/car/trust/ICarTrustAgentTokenResponseCallback.aidl b/car-lib/src/android/car/trust/ICarTrustAgentTokenResponseCallback.aidl
deleted file mode 100644
index 5dbc3bc..0000000
--- a/car-lib/src/android/car/trust/ICarTrustAgentTokenResponseCallback.aidl
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.car.trust;
-
-/**
- * Callback interface for escrow token exchange response.
- *
- * TrustAgentService uses async pattern and we therefore divide the
- * request and response into two separate AIDL interfaces.
- *
- * @hide
- */
-interface ICarTrustAgentTokenResponseCallback {
- /** Called after escrow token is added for foreground user */
- void onEscrowTokenAdded(out byte[] token, long handle, int uid);
-
- /** Called after escrow token is removed for foreground user */
- void onEscrowTokenRemoved(long handle, boolean successful);
-
- /** Called after escrow token active state is changed for foreground user */
- void onEscrowTokenActiveStateChanged(long handle, boolean active);
-}
diff --git a/car-lib/src/android/car/trust/ICarTrustAgentUnlockCallback.aidl b/car-lib/src/android/car/trust/ICarTrustAgentUnlockCallback.aidl
deleted file mode 100644
index e280bf0..0000000
--- a/car-lib/src/android/car/trust/ICarTrustAgentUnlockCallback.aidl
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.car.trust;
-
-/**
- * Callback interface for CarTrustAgentService unlock.
- *
- * @hide
- */
-oneway interface ICarTrustAgentUnlockCallback {
- /** Called when the unlock token is received */
- void onUnlockDataReceived(in byte[] token, long handle);
-}
diff --git a/car-lib/src/android/car/user/CarUserManagerHelper.java b/car-lib/src/android/car/user/CarUserManagerHelper.java
deleted file mode 100644
index 29535fc..0000000
--- a/car-lib/src/android/car/user/CarUserManagerHelper.java
+++ /dev/null
@@ -1,937 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.car.user;
-
-import android.Manifest;
-import android.annotation.Nullable;
-import android.annotation.RequiresPermission;
-import android.app.ActivityManager;
-import android.car.settings.CarSettings;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.pm.UserInfo;
-import android.graphics.Bitmap;
-import android.graphics.drawable.BitmapDrawable;
-import android.graphics.drawable.Drawable;
-import android.os.Bundle;
-import android.os.UserHandle;
-import android.os.UserManager;
-import android.provider.Settings;
-import android.sysprop.CarProperties;
-import android.util.Log;
-
-import com.android.internal.util.UserIcons;
-
-import com.google.android.collect.Sets;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Helper class for {@link UserManager}, this is meant to be used by builds that support
- * Multi-user model with headless user 0. User 0 is not associated with a real person, and
- * can not be brought to foreground.
- *
- * <p>This class provides method for user management, including creating, removing, adding
- * and switching users. Methods related to get users will exclude system user by default.
- *
- * @hide
- */
-public class CarUserManagerHelper {
- private static final String TAG = "CarUserManagerHelper";
- /**
- * Default set of restrictions for Non-Admin users.
- */
- private static final Set<String> DEFAULT_NON_ADMIN_RESTRICTIONS = Sets.newArraySet(
- UserManager.DISALLOW_FACTORY_RESET
- );
- /**
- * Default set of restrictions for Guest users.
- */
- private static final Set<String> DEFAULT_GUEST_RESTRICTIONS = Sets.newArraySet(
- UserManager.DISALLOW_FACTORY_RESET,
- UserManager.DISALLOW_REMOVE_USER,
- UserManager.DISALLOW_MODIFY_ACCOUNTS,
- UserManager.DISALLOW_OUTGOING_CALLS,
- UserManager.DISALLOW_SMS,
- UserManager.DISALLOW_INSTALL_APPS,
- UserManager.DISALLOW_UNINSTALL_APPS
- );
-
- private final Context mContext;
- private final UserManager mUserManager;
- private final ActivityManager mActivityManager;
- private int mLastActiveUser = UserHandle.USER_SYSTEM;
- private Bitmap mDefaultGuestUserIcon;
- private ArrayList<OnUsersUpdateListener> mUpdateListeners;
- private final BroadcastReceiver mUserChangeReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- ArrayList<OnUsersUpdateListener> copyOfUpdateListeners;
- synchronized (mUpdateListeners) {
- copyOfUpdateListeners = new ArrayList(mUpdateListeners);
- }
-
- for (OnUsersUpdateListener listener : copyOfUpdateListeners) {
- listener.onUsersUpdate();
- }
- }
- };
-
- public CarUserManagerHelper(Context context) {
- mUpdateListeners = new ArrayList<>();
- mContext = context.getApplicationContext();
- mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
- mActivityManager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
- }
-
- /**
- * Registers a listener for updates to all users - removing, adding users or changing user info.
- *
- * @param listener Instance of {@link OnUsersUpdateListener}.
- */
- public void registerOnUsersUpdateListener(OnUsersUpdateListener listener) {
- if (listener == null) {
- return;
- }
-
- synchronized (mUpdateListeners) {
- if (mUpdateListeners.isEmpty()) {
- // First listener being added, register receiver.
- registerReceiver();
- }
-
- if (!mUpdateListeners.contains(listener)) {
- mUpdateListeners.add(listener);
- }
- }
- }
-
- /**
- * Unregisters on user update listener.
- * Unregisters {@code BroadcastReceiver} if no listeners remain.
- *
- * @param listener Instance of {@link OnUsersUpdateListener} to unregister.
- */
- public void unregisterOnUsersUpdateListener(OnUsersUpdateListener listener) {
- synchronized (mUpdateListeners) {
- if (mUpdateListeners.contains(listener)) {
- mUpdateListeners.remove(listener);
-
- if (mUpdateListeners.isEmpty()) {
- // No more listeners, unregister broadcast receiver.
- unregisterReceiver();
- }
- }
- }
- }
-
- /**
- * Set default boot into user.
- *
- * @param userId default user id to boot into.
- */
- public void setDefaultBootUser(int userId) {
- Settings.Global.putInt(
- mContext.getContentResolver(),
- CarSettings.Global.DEFAULT_USER_ID_TO_BOOT_INTO, userId);
- }
-
- /**
- * Set last active user.
- *
- * @param userId last active user id.
- * @param skipGlobalSetting whether to skip set the global settings value.
- */
- public void setLastActiveUser(int userId, boolean skipGlobalSetting) {
- mLastActiveUser = userId;
- if (!skipGlobalSetting) {
- Settings.Global.putInt(
- mContext.getContentResolver(), CarSettings.Global.LAST_ACTIVE_USER_ID, userId);
- }
- }
-
- /**
- * Get user id for the default boot into user.
- *
- * @return user id of the default boot into user
- */
- public int getDefaultBootUser() {
- // Make user 10 the original default boot user.
- return Settings.Global.getInt(
- mContext.getContentResolver(), CarSettings.Global.DEFAULT_USER_ID_TO_BOOT_INTO,
- /* default user id= */ 10);
- }
-
- /**
- * Get user id for the last active user.
- *
- * @return user id of the last active user.
- */
- public int getLastActiveUser() {
- if (mLastActiveUser != UserHandle.USER_SYSTEM) {
- return mLastActiveUser;
- }
- return Settings.Global.getInt(
- mContext.getContentResolver(), CarSettings.Global.LAST_ACTIVE_USER_ID,
- /* default user id= */ UserHandle.USER_SYSTEM);
- }
-
- /**
- * Get user id for the initial user to boot into. This is only applicable for headless
- * system user model.
- *
- * <p>If failed to retrieve the id stored in global settings or the retrieved id does not
- * exist on device, then return the user with smallest user id.
- *
- * @return user id of the last active user or the smallest user id on the device.
- */
- public int getInitialUser() {
- int lastActiveUserId = getLastActiveUser();
-
- boolean isUserExist = false;
- List<UserInfo> allUsers = getAllPersistentUsers();
- int smallestUserId = Integer.MAX_VALUE;
- for (UserInfo user : allUsers) {
- if (user.id == lastActiveUserId) {
- isUserExist = true;
- }
- smallestUserId = Math.min(user.id, smallestUserId);
- }
-
- // If the last active user is system user or the user id doesn't exist on device,
- // return the smallest id or all users.
- if (lastActiveUserId == UserHandle.USER_SYSTEM || !isUserExist) {
- Log.e(TAG, "Can't get last active user id or the user no longer exist, user id: ."
- + lastActiveUserId);
- lastActiveUserId = smallestUserId;
- }
-
- return lastActiveUserId;
- }
-
- /**
- * Sets default guest restrictions that will be applied every time a Guest user is created.
- *
- * <p> Restrictions are written to disk and persistent across boots.
- */
- public void initDefaultGuestRestrictions() {
- Bundle defaultGuestRestrictions = new Bundle();
- for (String restriction : DEFAULT_GUEST_RESTRICTIONS) {
- defaultGuestRestrictions.putBoolean(restriction, true);
- }
- mUserManager.setDefaultGuestRestrictions(defaultGuestRestrictions);
- }
-
- /**
- * Returns {@code true} if the system is in the headless user 0 model.
- *
- * @return {@boolean true} if headless system user.
- */
- public boolean isHeadlessSystemUser() {
- return CarProperties.headless_system_user().orElse(false);
- }
-
- /**
- * Gets UserInfo for the system user.
- *
- * @return {@link UserInfo} for the system user.
- */
- public UserInfo getSystemUserInfo() {
- return mUserManager.getUserInfo(UserHandle.USER_SYSTEM);
- }
-
- /**
- * Gets UserInfo for the current foreground user.
- *
- * Concept of foreground user is relevant for the multi-user deployment. Foreground user
- * corresponds to the currently "logged in" user.
- *
- * @return {@link UserInfo} for the foreground user.
- */
- public UserInfo getCurrentForegroundUserInfo() {
- return mUserManager.getUserInfo(getCurrentForegroundUserId());
- }
-
- /**
- * @return Id of the current foreground user.
- */
- public int getCurrentForegroundUserId() {
- return mActivityManager.getCurrentUser();
- }
-
- /**
- * Gets UserInfo for the user running the caller process.
- *
- * <p>Differentiation between foreground user and current process user is relevant for
- * multi-user deployments.
- *
- * <p>Some multi-user aware components (like SystemUI) needs to run a singleton component
- * in system user. Current process user is always the same for that component, even when
- * the foreground user changes.
- *
- * @return {@link UserInfo} for the user running the current process.
- */
- public UserInfo getCurrentProcessUserInfo() {
- return mUserManager.getUserInfo(getCurrentProcessUserId());
- }
-
- /**
- * @return Id for the user running the current process.
- */
- public int getCurrentProcessUserId() {
- return UserHandle.myUserId();
- }
-
- /**
- * Gets all the existing users on the system that are not currently running as
- * the foreground user.
- * These are all the users that can be switched to from the foreground user.
- *
- * @return List of {@code UserInfo} for each user that is not the foreground user.
- */
- public List<UserInfo> getAllSwitchableUsers() {
- if (isHeadlessSystemUser()) {
- return getAllUsersExceptSystemUserAndSpecifiedUser(getCurrentForegroundUserId());
- } else {
- return getAllUsersExceptSpecifiedUser(getCurrentForegroundUserId());
- }
- }
-
- /**
- * Gets all the users that can be brought to the foreground on the system.
- *
- * @return List of {@code UserInfo} for users that associated with a real person.
- */
- public List<UserInfo> getAllUsers() {
- if (isHeadlessSystemUser()) {
- return getAllUsersExceptSystemUserAndSpecifiedUser(UserHandle.USER_SYSTEM);
- } else {
- return mUserManager.getUsers(/* excludeDying= */ true);
- }
- }
-
- /**
- * Gets all the users that are non-ephemeral and can be brought to the foreground on the system.
- *
- * @return List of {@code UserInfo} for non-ephemeral users that associated with a real person.
- */
- public List<UserInfo> getAllPersistentUsers() {
- List<UserInfo> users = getAllUsers();
- for (Iterator<UserInfo> iterator = users.iterator(); iterator.hasNext(); ) {
- UserInfo userInfo = iterator.next();
- if (userInfo.isEphemeral()) {
- // Remove user that is ephemeral.
- iterator.remove();
- }
- }
- return users;
- }
-
- /**
- * Gets all the users that can be brought to the foreground on the system that have admin roles.
- *
- * @return List of {@code UserInfo} for admin users that associated with a real person.
- */
- public List<UserInfo> getAllAdminUsers() {
- List<UserInfo> users = getAllUsers();
-
- for (Iterator<UserInfo> iterator = users.iterator(); iterator.hasNext(); ) {
- UserInfo userInfo = iterator.next();
- if (!userInfo.isAdmin()) {
- // Remove user that is not admin.
- iterator.remove();
- }
- }
- return users;
- }
-
- /**
- * Gets all users that are not guests.
- *
- * @return List of {@code UserInfo} for all users who are not guest users.
- */
- public List<UserInfo> getAllUsersExceptGuests() {
- List<UserInfo> users = getAllUsers();
-
- for (Iterator<UserInfo> iterator = users.iterator(); iterator.hasNext(); ) {
- UserInfo userInfo = iterator.next();
- if (userInfo.isGuest()) {
- // Remove guests.
- iterator.remove();
- }
- }
- return users;
- }
-
- /**
- * Get all the users except the one with userId passed in.
- *
- * @param userId of the user not to be returned.
- * @return All users other than user with userId.
- */
- private List<UserInfo> getAllUsersExceptSpecifiedUser(int userId) {
- List<UserInfo> users = mUserManager.getUsers(/* excludeDying= */true);
-
- for (Iterator<UserInfo> iterator = users.iterator(); iterator.hasNext(); ) {
- UserInfo userInfo = iterator.next();
- if (userInfo.id == userId) {
- // Remove user with userId from the list.
- iterator.remove();
- }
- }
- return users;
- }
-
- /**
- * Get all the users except system user and the one with userId passed in.
- *
- * @param userId of the user not to be returned.
- * @return All users other than system user and user with userId.
- */
- private List<UserInfo> getAllUsersExceptSystemUserAndSpecifiedUser(int userId) {
- List<UserInfo> users = mUserManager.getUsers(/* excludeDying= */true);
-
- for (Iterator<UserInfo> iterator = users.iterator(); iterator.hasNext(); ) {
- UserInfo userInfo = iterator.next();
- if (userInfo.id == userId || userInfo.id == UserHandle.USER_SYSTEM) {
- // Remove user with userId from the list.
- iterator.remove();
- }
- }
- return users;
- }
-
- /**
- * Maximum number of users allowed on the device. This includes real users, managed profiles
- * and restricted users, but excludes guests.
- *
- * <p> It excludes system user in headless system user model.
- *
- * @return Maximum number of users that can be present on the device.
- */
- public int getMaxSupportedUsers() {
- if (isHeadlessSystemUser()) {
- return UserManager.getMaxSupportedUsers() - 1;
- }
- return UserManager.getMaxSupportedUsers();
- }
-
- /**
- * Get the maximum number of real (non-guest, non-managed profile) users that can be created on
- * the device. This is a dynamic value and it decreases with the increase of the number of
- * managed profiles on the device.
- *
- * <p> It excludes system user in headless system user model.
- *
- * @return Maximum number of real users that can be created.
- */
- public int getMaxSupportedRealUsers() {
- return getMaxSupportedUsers() - getManagedProfilesCount();
- }
-
- /**
- * Returns true if the maximum number of users on the device has been reached, false otherwise.
- */
- public boolean isUserLimitReached() {
- int countNonGuestUsers = getAllUsersExceptGuests().size();
- int maxSupportedUsers = getMaxSupportedUsers();
-
- if (countNonGuestUsers > maxSupportedUsers) {
- Log.e(TAG, "There are more users on the device than allowed.");
- return true;
- }
-
- return getAllUsersExceptGuests().size() == maxSupportedUsers;
- }
-
- private int getManagedProfilesCount() {
- List<UserInfo> users = getAllUsers();
-
- // Count all users that are managed profiles of another user.
- int managedProfilesCount = 0;
- for (UserInfo user : users) {
- if (user.isManagedProfile()) {
- managedProfilesCount++;
- }
- }
- return managedProfilesCount;
- }
-
- // User information accessors
-
- /**
- * Checks whether the user is system user.
- *
- * @param userInfo User to check against system user.
- * @return {@code true} if system user, {@code false} otherwise.
- */
- public boolean isSystemUser(UserInfo userInfo) {
- return userInfo.id == UserHandle.USER_SYSTEM;
- }
-
- /**
- * Checks whether the user is default user.
- *
- * @param userInfo User to check against system user.
- * @return {@code true} if is default user, {@code false} otherwise.
- */
- public boolean isDefaultUser(UserInfo userInfo) {
- return userInfo.id == getDefaultBootUser();
- }
-
- /**
- * Checks whether the user is last active user.
- *
- * @param userInfo User to check against last active user.
- * @return {@code true} if is last active user, {@code false} otherwise.
- */
- public boolean isLastActiveUser(UserInfo userInfo) {
- return userInfo.id == getLastActiveUser();
- }
-
- /**
- * Checks whether passed in user is the foreground user.
- *
- * @param userInfo User to check.
- * @return {@code true} if foreground user, {@code false} otherwise.
- */
- public boolean isForegroundUser(UserInfo userInfo) {
- return getCurrentForegroundUserId() == userInfo.id;
- }
-
- /**
- * Checks whether passed in user is the user that's running the current process.
- *
- * @param userInfo User to check.
- * @return {@code true} if user running the process, {@code false} otherwise.
- */
- public boolean isCurrentProcessUser(UserInfo userInfo) {
- return getCurrentProcessUserId() == userInfo.id;
- }
-
- // Foreground user information accessors.
-
- /**
- * Checks if the foreground user is a guest user.
- */
- public boolean isForegroundUserGuest() {
- return getCurrentForegroundUserInfo().isGuest();
- }
-
- /**
- * Checks if the foreground user is ephemeral.
- */
- public boolean isForegroundUserEphemeral() {
- return getCurrentForegroundUserInfo().isEphemeral();
- }
-
- /**
- * Checks if the given user is non-ephemeral.
- *
- * @param userId User to check
- * @return {@code true} if given user is persistent user.
- */
- public boolean isPersistentUser(int userId) {
- UserInfo user = mUserManager.getUserInfo(userId);
- return !user.isEphemeral();
- }
-
- /**
- * Returns whether this user can be removed from the system.
- *
- * @param userInfo User to be removed
- * @return {@code true} if they can be removed, {@code false} otherwise.
- */
- public boolean canUserBeRemoved(UserInfo userInfo) {
- return !isSystemUser(userInfo);
- }
-
- /**
- * Return whether the foreground user has a restriction.
- *
- * @param restriction Restriction to check. Should be a UserManager.* restriction.
- * @return Whether that restriction exists for the foreground user.
- */
- public boolean foregroundUserHasUserRestriction(String restriction) {
- return mUserManager.hasUserRestriction(
- restriction, getCurrentForegroundUserInfo().getUserHandle());
- }
-
- /**
- * Checks if the foreground user can add new users.
- */
- public boolean canForegroundUserAddUsers() {
- return !foregroundUserHasUserRestriction(UserManager.DISALLOW_ADD_USER);
- }
-
- // Current process user information accessors
-
- /**
- * Checks whether this process is running under the system user.
- */
- public boolean isCurrentProcessSystemUser() {
- return mUserManager.isSystemUser();
- }
-
- /**
- * Checks if the calling app is running in a demo user.
- */
- public boolean isCurrentProcessDemoUser() {
- return mUserManager.isDemoUser();
- }
-
- /**
- * Checks if the calling app is running as an admin user.
- */
- public boolean isCurrentProcessAdminUser() {
- return mUserManager.isAdminUser();
- }
-
- /**
- * Checks if the calling app is running as a guest user.
- */
- public boolean isCurrentProcessGuestUser() {
- return mUserManager.isGuestUser();
- }
-
- /**
- * Check is the calling app is running as a restricted profile user (ie. a LinkedUser).
- * Restricted profiles are only available when {@link #isHeadlessSystemUser()} is false.
- */
- public boolean isCurrentProcessRestrictedProfileUser() {
- return mUserManager.isRestrictedProfile();
- }
-
- // Current process user restriction accessors
-
- /**
- * Return whether the user running the current process has a restriction.
- *
- * @param restriction Restriction to check. Should be a UserManager.* restriction.
- * @return Whether that restriction exists for the user running the process.
- */
- public boolean isCurrentProcessUserHasRestriction(String restriction) {
- return mUserManager.hasUserRestriction(restriction);
- }
-
- /**
- * Checks if the current process user can modify accounts. Demo and Guest users cannot modify
- * accounts even if the DISALLOW_MODIFY_ACCOUNTS restriction is not applied.
- */
- public boolean canCurrentProcessModifyAccounts() {
- return !isCurrentProcessUserHasRestriction(UserManager.DISALLOW_MODIFY_ACCOUNTS)
- && !isCurrentProcessDemoUser()
- && !isCurrentProcessGuestUser();
- }
-
- /**
- * Checks if the user running the current process can add new users.
- */
- public boolean canCurrentProcessAddUsers() {
- return !isCurrentProcessUserHasRestriction(UserManager.DISALLOW_ADD_USER);
- }
-
- /**
- * Checks if the user running the current process can remove users.
- */
- public boolean canCurrentProcessRemoveUsers() {
- return !isCurrentProcessUserHasRestriction(UserManager.DISALLOW_REMOVE_USER);
- }
-
- /**
- * Checks if the user running the current process is allowed to switch to another user.
- */
- public boolean canCurrentProcessSwitchUsers() {
- return !isCurrentProcessUserHasRestriction(UserManager.DISALLOW_USER_SWITCH);
- }
-
- /**
- * Assigns admin privileges to the user.
- *
- * @param user User to be upgraded to Admin status.
- */
- @RequiresPermission(allOf = {
- Manifest.permission.INTERACT_ACROSS_USERS_FULL,
- Manifest.permission.MANAGE_USERS
- })
- public void assignAdminPrivileges(UserInfo user) {
- if (!isCurrentProcessAdminUser()) {
- Log.w(TAG, "Only admin users can assign admin privileges.");
- return;
- }
-
- mUserManager.setUserAdmin(user.id);
-
- // Remove restrictions imposed on non-admins.
- setDefaultNonAdminRestrictions(user, /* enable= */ false);
- }
-
- /**
- * Creates a new user on the system, the created user would be granted admin role.
- * Only admins can create other admins.
- *
- * @param userName Name to give to the newly created user.
- * @return Newly created admin user, null if failed to create a user.
- */
- @Nullable
- public UserInfo createNewAdminUser(String userName) {
- if (!(isCurrentProcessAdminUser() || isCurrentProcessSystemUser())) {
- // Only Admins or System user can create other privileged users.
- Log.e(TAG, "Only admin users and system user can create other admins.");
- return null;
- }
-
- UserInfo user = mUserManager.createUser(userName, UserInfo.FLAG_ADMIN);
- if (user == null) {
- // Couldn't create user, most likely because there are too many.
- Log.w(TAG, "can't create admin user.");
- return null;
- }
- assignDefaultIcon(user);
- return user;
- }
-
- /**
- * Creates a new restricted user on the system.
- *
- * @param userName Name to give to the newly created user.
- * @return Newly created restricted user, null if failed to create a user.
- */
- @Nullable
- public UserInfo createNewNonAdminUser(String userName) {
- UserInfo user = mUserManager.createUser(userName, 0);
- if (user == null) {
- // Couldn't create user, most likely because there are too many.
- Log.w(TAG, "can't create non-admin user.");
- return null;
- }
- setDefaultNonAdminRestrictions(user, /* enable= */ true);
-
- // Each non-admin has sms and outgoing call restrictions applied by the UserManager on
- // creation. We want to enable these permissions by default in the car.
- setUserRestriction(user, UserManager.DISALLOW_SMS, /* enable= */ false);
- setUserRestriction(user, UserManager.DISALLOW_OUTGOING_CALLS, /* enable= */ false);
-
- assignDefaultIcon(user);
- return user;
- }
-
- /**
- * Sets the values of default Non-Admin restrictions to the passed in value.
- *
- * @param userInfo User to set restrictions on.
- * @param enable If true, restriction is ON, If false, restriction is OFF.
- */
- private void setDefaultNonAdminRestrictions(UserInfo userInfo, boolean enable) {
- for (String restriction : DEFAULT_NON_ADMIN_RESTRICTIONS) {
- setUserRestriction(userInfo, restriction, enable);
- }
- }
-
- /**
- * Sets the value of the specified restriction for the specified user.
- *
- * @param userInfo the user whose restriction is to be changed
- * @param restriction the key of the restriction
- * @param enable the value for the restriction. if true, turns the restriction ON, if false,
- * turns the restriction OFF.
- */
- public void setUserRestriction(UserInfo userInfo, String restriction, boolean enable) {
- UserHandle userHandle = UserHandle.of(userInfo.id);
- mUserManager.setUserRestriction(restriction, enable, userHandle);
- }
-
- /**
- * Tries to remove the user that's passed in. System user cannot be removed.
- * If the user to be removed is user currently running the process,
- * it switches to the guest user first, and then removes the user.
- *
- * @param userInfo User to be removed
- * @return {@code true} if user is successfully removed, {@code false} otherwise.
- */
- public boolean removeUser(UserInfo userInfo, String guestUserName) {
- if (isSystemUser(userInfo)) {
- Log.w(TAG, "User " + userInfo.id + " is system user, could not be removed.");
- return false;
- }
-
- // Not allow to delete the last admin user on the device for now.
- if (userInfo.isAdmin() && getAllAdminUsers().size() <= 1) {
- Log.w(TAG, "User " + userInfo.id + " is the last admin user on device.");
- return false;
- }
-
- if (!isCurrentProcessAdminUser() && !isCurrentProcessUser(userInfo)) {
- // If the caller is non-admin, they can only delete themselves.
- Log.e(TAG, "Non-admins cannot remove other users.");
- return false;
- }
-
- if (userInfo.id == getCurrentForegroundUserId()) {
- startNewGuestSession(guestUserName);
- }
-
- return mUserManager.removeUser(userInfo.id);
- }
-
- /**
- * Switches (logs in) to another user given user id.
- *
- * @param id User id to switch to.
- * @return {@code true} if user switching succeed.
- */
- public boolean switchToUserId(int id) {
- if (id == UserHandle.USER_SYSTEM && isHeadlessSystemUser()) {
- // System User doesn't associate with real person, can not be switched to.
- return false;
- }
- return mActivityManager.switchUser(id);
- }
-
- /**
- * Switches (logs in) to another user.
- *
- * @param userInfo User to switch to.
- * @return {@code true} if user switching succeed.
- */
- public boolean switchToUser(UserInfo userInfo) {
- if (userInfo.id == getCurrentForegroundUserId()) {
- return false;
- }
-
- return switchToUserId(userInfo.id);
- }
-
- /**
- * Creates a new guest session and switches into the guest session.
- *
- * @param guestName Username for the guest user.
- * @return {@code true} if switch to guest user succeed.
- */
- public boolean startNewGuestSession(String guestName) {
- UserInfo guest = mUserManager.createGuest(mContext, guestName);
- if (guest == null) {
- // Couldn't create user, most likely because there are too many, but we haven't
- // been able to reload the list yet.
- Log.w(TAG, "can't create user.");
- return false;
- }
- assignDefaultIcon(guest);
- return switchToUserId(guest.id);
- }
-
- /**
- * Gets a bitmap representing the user's default avatar.
- *
- * @param userInfo User whose avatar should be returned.
- * @return Default user icon
- */
- public Bitmap getUserDefaultIcon(UserInfo userInfo) {
- return UserIcons.convertToBitmap(
- UserIcons.getDefaultUserIcon(mContext.getResources(), userInfo.id, false));
- }
-
- /**
- * Gets a bitmap representing the default icon for a Guest user.
- *
- * @return Default guest user icon
- */
- public Bitmap getGuestDefaultIcon() {
- if (mDefaultGuestUserIcon == null) {
- mDefaultGuestUserIcon = UserIcons.convertToBitmap(UserIcons.getDefaultUserIcon(
- mContext.getResources(), UserHandle.USER_NULL, false));
- }
- return mDefaultGuestUserIcon;
- }
-
- /**
- * Gets an icon for the user.
- *
- * @param userInfo User for which we want to get the icon.
- * @return a Bitmap for the icon
- */
- public Bitmap getUserIcon(UserInfo userInfo) {
- Bitmap picture = mUserManager.getUserIcon(userInfo.id);
-
- if (picture == null) {
- return assignDefaultIcon(userInfo);
- }
-
- return picture;
- }
-
- /**
- * Method for scaling a Bitmap icon to a desirable size.
- *
- * @param icon Bitmap to scale.
- * @param desiredSize Wanted size for the icon.
- * @return Drawable for the icon, scaled to the new size.
- */
- public Drawable scaleUserIcon(Bitmap icon, int desiredSize) {
- Bitmap scaledIcon = Bitmap.createScaledBitmap(
- icon, desiredSize, desiredSize, true /* filter */);
- return new BitmapDrawable(mContext.getResources(), scaledIcon);
- }
-
- /**
- * Sets new Username for the user.
- *
- * @param user User whose name should be changed.
- * @param name New username.
- */
- public void setUserName(UserInfo user, String name) {
- mUserManager.setUserName(user.id, name);
- }
-
- private void registerReceiver() {
- IntentFilter filter = new IntentFilter();
- filter.addAction(Intent.ACTION_USER_REMOVED);
- filter.addAction(Intent.ACTION_USER_ADDED);
- filter.addAction(Intent.ACTION_USER_INFO_CHANGED);
- filter.addAction(Intent.ACTION_USER_SWITCHED);
- filter.addAction(Intent.ACTION_USER_STOPPED);
- filter.addAction(Intent.ACTION_USER_UNLOCKED);
- mContext.registerReceiverAsUser(mUserChangeReceiver, UserHandle.ALL, filter, null, null);
- }
-
- // Assigns a default icon to a user according to the user's id.
- private Bitmap assignDefaultIcon(UserInfo userInfo) {
- Bitmap bitmap = userInfo.isGuest()
- ? getGuestDefaultIcon() : getUserDefaultIcon(userInfo);
- mUserManager.setUserIcon(userInfo.id, bitmap);
- return bitmap;
- }
-
- private void unregisterReceiver() {
- mContext.unregisterReceiver(mUserChangeReceiver);
- }
-
- /**
- * Interface for listeners that want to register for receiving updates to changes to the users
- * on the system including removing and adding users, and changing user info.
- */
- public interface OnUsersUpdateListener {
- /**
- * Method that will get called when users list has been changed.
- */
- void onUsersUpdate();
- }
-}
diff --git a/car-lib/src/android/car/vms/VmsOperationRecorder.java b/car-lib/src/android/car/vms/VmsOperationRecorder.java
index bfb6055..23a089a 100644
--- a/car-lib/src/android/car/vms/VmsOperationRecorder.java
+++ b/car-lib/src/android/car/vms/VmsOperationRecorder.java
@@ -132,6 +132,7 @@
if (isEnabled()) {
try {
JSONObject args = new JSONObject();
+ args.put("publisherId", layersOffering.getPublisherId());
JSONArray offering = toJson(layersOffering);
if (offering.length() > 0) {
args.put("layerDependency", offering);
diff --git a/car-maps-placeholder/AndroidManifest.xml b/car-maps-placeholder/AndroidManifest.xml
index 38caf38..8c96130 100644
--- a/car-maps-placeholder/AndroidManifest.xml
+++ b/car-maps-placeholder/AndroidManifest.xml
@@ -31,6 +31,8 @@
android:resizeableActivity="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.DEFAULT"/>
+ <category android:name="android.intent.category.APP_MAPS" />
</intent-filter>
</activity>
</application>
diff --git a/car-maps-placeholder/res/values-af/strings.xml b/car-maps-placeholder/res/values-af/strings.xml
new file mode 100644
index 0000000..f7f0fe0
--- /dev/null
+++ b/car-maps-placeholder/res/values-af/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Maps"</string>
+ <string name="error_text" msgid="5575174711944349180">"Geen kaarteprogram is geïnstalleer nie. Kontak asseblief jou motorvervaardiger."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-am/strings.xml b/car-maps-placeholder/res/values-am/strings.xml
new file mode 100644
index 0000000..e0af470
--- /dev/null
+++ b/car-maps-placeholder/res/values-am/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"ካርታዎች"</string>
+ <string name="error_text" msgid="5575174711944349180">"ምንም የካርታዎች መተግበሪያ አልተጫነም። የእርስዎን መኪና አምራች እባክዎ ያነጋግሩ።"</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-ar/strings.xml b/car-maps-placeholder/res/values-ar/strings.xml
new file mode 100644
index 0000000..ccb8e52
--- /dev/null
+++ b/car-maps-placeholder/res/values-ar/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"خرائط"</string>
+ <string name="error_text" msgid="5575174711944349180">"لم يتم تثبيت تطبيقات خرائط. يُرجى التواصل مع الشركة المصنّعة للسيارة."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-as/strings.xml b/car-maps-placeholder/res/values-as/strings.xml
new file mode 100644
index 0000000..e771f6f
--- /dev/null
+++ b/car-maps-placeholder/res/values-as/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Maps"</string>
+ <string name="error_text" msgid="5575174711944349180">"কোনো মেপ এপ্লিকেশ্বন ইনষ্টল কৰি থোৱা হোৱা নাই। অনুগ্ৰহ কৰি আপোনাৰ গাড়ীৰ নিৰ্মাতাৰ সৈতে যোগাযোগ কৰক।"</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-az/strings.xml b/car-maps-placeholder/res/values-az/strings.xml
new file mode 100644
index 0000000..125fbf8
--- /dev/null
+++ b/car-maps-placeholder/res/values-az/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Xəritə"</string>
+ <string name="error_text" msgid="5575174711944349180">"Xəritə tətbiqi quraşdırılmayıb. Avtomobilin istehsalçısı ilə əlaqə saxlayın."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-b+sr+Latn/strings.xml b/car-maps-placeholder/res/values-b+sr+Latn/strings.xml
new file mode 100644
index 0000000..cf1dea2
--- /dev/null
+++ b/car-maps-placeholder/res/values-b+sr+Latn/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Mape"</string>
+ <string name="error_text" msgid="5575174711944349180">"Nije instalirana aplikacija za mape. Kontaktirajte proizvođača automobila."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-be/strings.xml b/car-maps-placeholder/res/values-be/strings.xml
new file mode 100644
index 0000000..9ad9bcd
--- /dev/null
+++ b/car-maps-placeholder/res/values-be/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Карты"</string>
+ <string name="error_text" msgid="5575174711944349180">"Праграма для навігацыі не ўсталявана. Звярніцеся да вытворцы аўтамабіля."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-bg/strings.xml b/car-maps-placeholder/res/values-bg/strings.xml
new file mode 100644
index 0000000..229fbba
--- /dev/null
+++ b/car-maps-placeholder/res/values-bg/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Карти"</string>
+ <string name="error_text" msgid="5575174711944349180">"Няма инсталирано приложение за карти. Моля, свържете се с производителя на автомобила си."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-bn/strings.xml b/car-maps-placeholder/res/values-bn/strings.xml
new file mode 100644
index 0000000..35be0b5
--- /dev/null
+++ b/car-maps-placeholder/res/values-bn/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"ম্যাপ"</string>
+ <string name="error_text" msgid="5575174711944349180">"কোনও ম্যাপ অ্যাপ্লিকেশন ইনস্টল করা নেই। আপনার গাড়ির প্রস্তুতকারকের সাথে যোগাযোগ করুন।"</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-bs/strings.xml b/car-maps-placeholder/res/values-bs/strings.xml
new file mode 100644
index 0000000..cf1dea2
--- /dev/null
+++ b/car-maps-placeholder/res/values-bs/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Mape"</string>
+ <string name="error_text" msgid="5575174711944349180">"Nije instalirana aplikacija za mape. Kontaktirajte proizvođača automobila."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-ca/strings.xml b/car-maps-placeholder/res/values-ca/strings.xml
new file mode 100644
index 0000000..cd33f37
--- /dev/null
+++ b/car-maps-placeholder/res/values-ca/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Mapes"</string>
+ <string name="error_text" msgid="5575174711944349180">"No hi ha cap aplicació de mapes instal·lada. Contacta amb el fabricant del cotxe."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-cs/strings.xml b/car-maps-placeholder/res/values-cs/strings.xml
new file mode 100644
index 0000000..102f151
--- /dev/null
+++ b/car-maps-placeholder/res/values-cs/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Mapy"</string>
+ <string name="error_text" msgid="5575174711944349180">"Není nainstalována žádná mapová aplikace. Kontaktujte výrobce auta."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-da/strings.xml b/car-maps-placeholder/res/values-da/strings.xml
new file mode 100644
index 0000000..7f5d870
--- /dev/null
+++ b/car-maps-placeholder/res/values-da/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Kort"</string>
+ <string name="error_text" msgid="5575174711944349180">"Der er ikke installeret nogen kortapps. Kontakt din bilproducent."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-de/strings.xml b/car-maps-placeholder/res/values-de/strings.xml
new file mode 100644
index 0000000..eb1e434
--- /dev/null
+++ b/car-maps-placeholder/res/values-de/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Karten"</string>
+ <string name="error_text" msgid="5575174711944349180">"Keine Karten-App installiert. Bitte wende dich an den Autohersteller."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-el/strings.xml b/car-maps-placeholder/res/values-el/strings.xml
new file mode 100644
index 0000000..c78cdea
--- /dev/null
+++ b/car-maps-placeholder/res/values-el/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Χάρτες"</string>
+ <string name="error_text" msgid="5575174711944349180">"Δεν έχει εγκατασταθεί εφαρμογή χάρτη. Επικοινωνήστε με τον κατασκευαστή του αυτοκινήτου σας."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-en-rAU/strings.xml b/car-maps-placeholder/res/values-en-rAU/strings.xml
new file mode 100644
index 0000000..684f3e9
--- /dev/null
+++ b/car-maps-placeholder/res/values-en-rAU/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Maps"</string>
+ <string name="error_text" msgid="5575174711944349180">"No maps application installed. Please contact your car manufacturer."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-en-rCA/strings.xml b/car-maps-placeholder/res/values-en-rCA/strings.xml
new file mode 100644
index 0000000..684f3e9
--- /dev/null
+++ b/car-maps-placeholder/res/values-en-rCA/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Maps"</string>
+ <string name="error_text" msgid="5575174711944349180">"No maps application installed. Please contact your car manufacturer."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-en-rGB/strings.xml b/car-maps-placeholder/res/values-en-rGB/strings.xml
new file mode 100644
index 0000000..684f3e9
--- /dev/null
+++ b/car-maps-placeholder/res/values-en-rGB/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Maps"</string>
+ <string name="error_text" msgid="5575174711944349180">"No maps application installed. Please contact your car manufacturer."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-en-rIN/strings.xml b/car-maps-placeholder/res/values-en-rIN/strings.xml
new file mode 100644
index 0000000..684f3e9
--- /dev/null
+++ b/car-maps-placeholder/res/values-en-rIN/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Maps"</string>
+ <string name="error_text" msgid="5575174711944349180">"No maps application installed. Please contact your car manufacturer."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-en-rXC/strings.xml b/car-maps-placeholder/res/values-en-rXC/strings.xml
new file mode 100644
index 0000000..1ac056d
--- /dev/null
+++ b/car-maps-placeholder/res/values-en-rXC/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Maps"</string>
+ <string name="error_text" msgid="5575174711944349180">"No maps application installed. Please contact your car manufacturer."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-es-rUS/strings.xml b/car-maps-placeholder/res/values-es-rUS/strings.xml
new file mode 100644
index 0000000..17938eb
--- /dev/null
+++ b/car-maps-placeholder/res/values-es-rUS/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Maps"</string>
+ <string name="error_text" msgid="5575174711944349180">"No se instaló ninguna aplicación de mapas. Comunícate con el fabricante del auto."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-es/strings.xml b/car-maps-placeholder/res/values-es/strings.xml
new file mode 100644
index 0000000..9e54b75
--- /dev/null
+++ b/car-maps-placeholder/res/values-es/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Maps"</string>
+ <string name="error_text" msgid="5575174711944349180">"Ninguna aplicación de mapas instalada. Ponte en contacto con el frabricante."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-et/strings.xml b/car-maps-placeholder/res/values-et/strings.xml
new file mode 100644
index 0000000..66c5fa9
--- /dev/null
+++ b/car-maps-placeholder/res/values-et/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Maps"</string>
+ <string name="error_text" msgid="5575174711944349180">"Ühtegi kaartide rakendust pole installitud Võtke ühendust oma auto tootjaga."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-eu/strings.xml b/car-maps-placeholder/res/values-eu/strings.xml
new file mode 100644
index 0000000..2bccc99
--- /dev/null
+++ b/car-maps-placeholder/res/values-eu/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Mapak"</string>
+ <string name="error_text" msgid="5575174711944349180">"Ez dago mapa-aplikaziorik instalatuta. Jarri autoaren fabrikatzailearekin harremanetan."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-fa/strings.xml b/car-maps-placeholder/res/values-fa/strings.xml
new file mode 100644
index 0000000..fa0f1a4
--- /dev/null
+++ b/car-maps-placeholder/res/values-fa/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Maps"</string>
+ <string name="error_text" msgid="5575174711944349180">"هیچ برنامه نقشهای نصب نشده است. لطفاً با سازنده خودرو تماس بگیرید."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-fi/strings.xml b/car-maps-placeholder/res/values-fi/strings.xml
new file mode 100644
index 0000000..b4ddba7
--- /dev/null
+++ b/car-maps-placeholder/res/values-fi/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Kartat"</string>
+ <string name="error_text" msgid="5575174711944349180">"Karttasovellusta ei ole asennettu. Ota yhteyttä auton valmistajaan."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-fr-rCA/strings.xml b/car-maps-placeholder/res/values-fr-rCA/strings.xml
new file mode 100644
index 0000000..5b732b2
--- /dev/null
+++ b/car-maps-placeholder/res/values-fr-rCA/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Maps"</string>
+ <string name="error_text" msgid="5575174711944349180">"Aucune application de cartographie n\'est installée. Veuillez communiquer avec le constructeur de la voiture."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-fr/strings.xml b/car-maps-placeholder/res/values-fr/strings.xml
new file mode 100644
index 0000000..c25b876
--- /dev/null
+++ b/car-maps-placeholder/res/values-fr/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Maps"</string>
+ <string name="error_text" msgid="5575174711944349180">"Aucune application de cartographie n\'est installée. Veuillez contacter le fabricant de la voiture."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-gl/strings.xml b/car-maps-placeholder/res/values-gl/strings.xml
new file mode 100644
index 0000000..f0763de
--- /dev/null
+++ b/car-maps-placeholder/res/values-gl/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Mapas"</string>
+ <string name="error_text" msgid="5575174711944349180">"Non se instalou a aplicación de mapas. Contacta co fabricante do coche."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-gu/strings.xml b/car-maps-placeholder/res/values-gu/strings.xml
new file mode 100644
index 0000000..75e3d1a
--- /dev/null
+++ b/car-maps-placeholder/res/values-gu/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"નકશા"</string>
+ <string name="error_text" msgid="5575174711944349180">"કોઈ નકશા એપ્લિકેશન ઇન્સ્ટૉલ કરેલ નથી. કૃપા કરીને તમારી કારના નિર્માતાનો સંપર્ક કરો."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-hi/strings.xml b/car-maps-placeholder/res/values-hi/strings.xml
new file mode 100644
index 0000000..fbb0c4a
--- /dev/null
+++ b/car-maps-placeholder/res/values-hi/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"मैप"</string>
+ <string name="error_text" msgid="5575174711944349180">"कोई मैप ऐप्लिकेशन इंस्टॉल नहीं किया हुआ है. कृपया अपनी कार के निर्माता से संपर्क करें."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-hr/strings.xml b/car-maps-placeholder/res/values-hr/strings.xml
new file mode 100644
index 0000000..8d31092
--- /dev/null
+++ b/car-maps-placeholder/res/values-hr/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Karte"</string>
+ <string name="error_text" msgid="5575174711944349180">"Nije instalirana nijedna aplikacija za karte. Obratite se proizvođaču automobila."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-hu/strings.xml b/car-maps-placeholder/res/values-hu/strings.xml
new file mode 100644
index 0000000..ca61e34
--- /dev/null
+++ b/car-maps-placeholder/res/values-hu/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Térkép"</string>
+ <string name="error_text" msgid="5575174711944349180">"Nincs telepítve térképalkalmazás. Vegye fel a kapcsolatot az autó gyártójával."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-hy/strings.xml b/car-maps-placeholder/res/values-hy/strings.xml
new file mode 100644
index 0000000..8e5db2e
--- /dev/null
+++ b/car-maps-placeholder/res/values-hy/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Քարտեզներ"</string>
+ <string name="error_text" msgid="5575174711944349180">"Նավիգացիայի հավելված չի տեղադրվել: Դիմեք մեքենայի արտադրողին:"</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-in/strings.xml b/car-maps-placeholder/res/values-in/strings.xml
new file mode 100644
index 0000000..573bdc9
--- /dev/null
+++ b/car-maps-placeholder/res/values-in/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Maps"</string>
+ <string name="error_text" msgid="5575174711944349180">"Tidak ada aplikasi peta yang terpasang. Harap hubungi produsen mobil Anda."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-is/strings.xml b/car-maps-placeholder/res/values-is/strings.xml
new file mode 100644
index 0000000..58831c4
--- /dev/null
+++ b/car-maps-placeholder/res/values-is/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Kort"</string>
+ <string name="error_text" msgid="5575174711944349180">"Ekkert kortaforrit er uppsett. Hafðu samband við framleiðanda bílsins."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-it/strings.xml b/car-maps-placeholder/res/values-it/strings.xml
new file mode 100644
index 0000000..539e817
--- /dev/null
+++ b/car-maps-placeholder/res/values-it/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Mappe"</string>
+ <string name="error_text" msgid="5575174711944349180">"Nessuna app di mappe installata. Contatta il produttore dell\'auto."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-iw/strings.xml b/car-maps-placeholder/res/values-iw/strings.xml
new file mode 100644
index 0000000..928c258
--- /dev/null
+++ b/car-maps-placeholder/res/values-iw/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"מפות"</string>
+ <string name="error_text" msgid="5575174711944349180">"לא הותקנה אפליקציית מפות. יש ליצור קשר עם יצרן הרכב."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-ja/strings.xml b/car-maps-placeholder/res/values-ja/strings.xml
new file mode 100644
index 0000000..939fe30
--- /dev/null
+++ b/car-maps-placeholder/res/values-ja/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"マップ"</string>
+ <string name="error_text" msgid="5575174711944349180">"地図アプリがインストールされていません。自動車メーカーにお問い合わせください。"</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-ka/strings.xml b/car-maps-placeholder/res/values-ka/strings.xml
new file mode 100644
index 0000000..5aa2b5f
--- /dev/null
+++ b/car-maps-placeholder/res/values-ka/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Maps"</string>
+ <string name="error_text" msgid="5575174711944349180">"რუკების აპლიკაცია არ არის დაინსტალირებული. გთხოვთ, დაუკავშირდეთ თქვენი მანქანის მწარმოებელს."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-kk/strings.xml b/car-maps-placeholder/res/values-kk/strings.xml
new file mode 100644
index 0000000..db68e40
--- /dev/null
+++ b/car-maps-placeholder/res/values-kk/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Maps"</string>
+ <string name="error_text" msgid="5575174711944349180">"Ешқандай карта қолданбасы орнатылмаған. Көлік жасаушы компанияға хабарласыңыз."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-km/strings.xml b/car-maps-placeholder/res/values-km/strings.xml
new file mode 100644
index 0000000..4d4aedd
--- /dev/null
+++ b/car-maps-placeholder/res/values-km/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"ផែនទី"</string>
+ <string name="error_text" msgid="5575174711944349180">"មិនបានដំឡើងកម្មវិធីផែនទីទេ។ សូមទាក់ទងក្រុមហ៊ុនផលិតរថយន្តរបស់អ្នក។"</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-kn/strings.xml b/car-maps-placeholder/res/values-kn/strings.xml
new file mode 100644
index 0000000..4a94e81
--- /dev/null
+++ b/car-maps-placeholder/res/values-kn/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"ನಕ್ಷೆಗಳು"</string>
+ <string name="error_text" msgid="5575174711944349180">"ನಕ್ಷೆಗಳ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡಿಲ್ಲ. ನಿಮ್ಮ ಕಾರಿನ ತಯಾರಕರನ್ನು ಸಂಪರ್ಕಿಸಿ."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-ko/strings.xml b/car-maps-placeholder/res/values-ko/strings.xml
new file mode 100644
index 0000000..76e9ed5
--- /dev/null
+++ b/car-maps-placeholder/res/values-ko/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"지도"</string>
+ <string name="error_text" msgid="5575174711944349180">"설치된 지도 애플리케이션이 없습니다. 차량 제조업체에 문의하세요."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-ky/strings.xml b/car-maps-placeholder/res/values-ky/strings.xml
new file mode 100644
index 0000000..5ee78fc
--- /dev/null
+++ b/car-maps-placeholder/res/values-ky/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Карталар"</string>
+ <string name="error_text" msgid="5575174711944349180">"Карталар колдонмосу орнотулган эмес. Унааны өндүрүүчүгө кайрылыңыз."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-lo/strings.xml b/car-maps-placeholder/res/values-lo/strings.xml
new file mode 100644
index 0000000..d3ba41f
--- /dev/null
+++ b/car-maps-placeholder/res/values-lo/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"ແຜນທີ່"</string>
+ <string name="error_text" msgid="5575174711944349180">"ບໍ່ໄດ້ຕິດຕັ້ງແອັບພລິເຄຊັນແຜນທີ່ໃດ. ກະລຸນາຕິດຕໍ່ຫາຜູ້ຜະລິດລົດຂອງທ່ານ."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-lt/strings.xml b/car-maps-placeholder/res/values-lt/strings.xml
new file mode 100644
index 0000000..b6e2170
--- /dev/null
+++ b/car-maps-placeholder/res/values-lt/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Žemėlapiai"</string>
+ <string name="error_text" msgid="5575174711944349180">"Neįdiegta jokia žemėlapių programa. Susisiekite su automobilio gamintoju."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-lv/strings.xml b/car-maps-placeholder/res/values-lv/strings.xml
new file mode 100644
index 0000000..842e0f8
--- /dev/null
+++ b/car-maps-placeholder/res/values-lv/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Kartes"</string>
+ <string name="error_text" msgid="5575174711944349180">"Nav instalēta neviena karšu lietojumprogramma. Sazinieties ar automašīnas ražotāju."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-mk/strings.xml b/car-maps-placeholder/res/values-mk/strings.xml
new file mode 100644
index 0000000..842a23d
--- /dev/null
+++ b/car-maps-placeholder/res/values-mk/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Карти"</string>
+ <string name="error_text" msgid="5575174711944349180">"Не се инсталирани апликации за карти. Контактирајте со производителот на автомобилот."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-ml/strings.xml b/car-maps-placeholder/res/values-ml/strings.xml
new file mode 100644
index 0000000..2581753
--- /dev/null
+++ b/car-maps-placeholder/res/values-ml/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"മാപ്സ്"</string>
+ <string name="error_text" msgid="5575174711944349180">"മാപ്സ് ആപ്പ് ഇൻസ്റ്റാൾ ചെയ്തിട്ടില്ല. നിങ്ങളുടെ കാറിന്റെ നിർമ്മാതാവുമായി ബന്ധപ്പെടുക."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-mn/strings.xml b/car-maps-placeholder/res/values-mn/strings.xml
new file mode 100644
index 0000000..6bb7e81
--- /dev/null
+++ b/car-maps-placeholder/res/values-mn/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Газрын зураг"</string>
+ <string name="error_text" msgid="5575174711944349180">"Суулгасан газрын зургийн апп алга. Машиныхаа үйлдвэрлэгчтэй холбогдоно уу."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-mr/strings.xml b/car-maps-placeholder/res/values-mr/strings.xml
new file mode 100644
index 0000000..5e1fd78
--- /dev/null
+++ b/car-maps-placeholder/res/values-mr/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"नकाशे"</string>
+ <string name="error_text" msgid="5575174711944349180">"नकाशे अॅप्लिकेशन इंस्टॉल केलेले नाही. कृपया तुमच्या कार उत्पादकाशी संपर्क साधा."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-ms/strings.xml b/car-maps-placeholder/res/values-ms/strings.xml
new file mode 100644
index 0000000..6b68645
--- /dev/null
+++ b/car-maps-placeholder/res/values-ms/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Peta"</string>
+ <string name="error_text" msgid="5575174711944349180">"Tiada aplikasi peta dipasang. Sila hubungi pengeluar kereta anda."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-my/strings.xml b/car-maps-placeholder/res/values-my/strings.xml
new file mode 100644
index 0000000..88a1273
--- /dev/null
+++ b/car-maps-placeholder/res/values-my/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"မြေပုံများ"</string>
+ <string name="error_text" msgid="5575174711944349180">"အပလီကေးရှင်းမှ တပ်ဆင်ထားသည့် မြေပုံမရှိပါ။ သင့်ကားထုတ်လုပ်သူထံ ဆက်သွယ်ပါ။"</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-nb/strings.xml b/car-maps-placeholder/res/values-nb/strings.xml
new file mode 100644
index 0000000..e081913
--- /dev/null
+++ b/car-maps-placeholder/res/values-nb/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Kart"</string>
+ <string name="error_text" msgid="5575174711944349180">"Ingen kartapper er installert. Kontakt bilprodusenten."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-ne/strings.xml b/car-maps-placeholder/res/values-ne/strings.xml
new file mode 100644
index 0000000..a2aef6c
--- /dev/null
+++ b/car-maps-placeholder/res/values-ne/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"नक्सा"</string>
+ <string name="error_text" msgid="5575174711944349180">"नक्सासम्बन्धी कुनै पनि अनुप्रयोगहरू स्थापना गरिएको छैन। कृपया आफ्नो कार निर्मातालाई सम्पर्क गर्नुहोस्।"</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-nl/strings.xml b/car-maps-placeholder/res/values-nl/strings.xml
new file mode 100644
index 0000000..d7e0bed
--- /dev/null
+++ b/car-maps-placeholder/res/values-nl/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Maps"</string>
+ <string name="error_text" msgid="5575174711944349180">"Geen kaarten-app geïnstalleerd. Neem contact op met de fabrikant van je auto."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-or/strings.xml b/car-maps-placeholder/res/values-or/strings.xml
new file mode 100644
index 0000000..478cbc0
--- /dev/null
+++ b/car-maps-placeholder/res/values-or/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"ମ୍ୟାପ୍ସ"</string>
+ <string name="error_text" msgid="5575174711944349180">"କୌଣସି ମ୍ୟାପ୍ସ ଆପ୍ଲିକେସନ୍ ଇନ୍ଷ୍ଟଲ୍ କରାଯାଇନାହିଁ। ଆପଣଙ୍କ କାର୍ର ଉତ୍ପାଦକଙ୍କ ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ।"</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-pa/strings.xml b/car-maps-placeholder/res/values-pa/strings.xml
new file mode 100644
index 0000000..1b0ef60
--- /dev/null
+++ b/car-maps-placeholder/res/values-pa/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"ਨਕਸ਼ੇ"</string>
+ <string name="error_text" msgid="5575174711944349180">"ਕੋਈ ਨਕਸ਼ਾ ਐਪਲੀਕੇਸ਼ਨ ਸਥਾਪਤ ਨਹੀਂ ਕੀਤੀ ਗਈ। ਕਿਰਪਾ ਕਰਕੇ ਆਪਣੀ ਕਾਰ ਦੇ ਨਿਰਮਾਤਾ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।"</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-pl/strings.xml b/car-maps-placeholder/res/values-pl/strings.xml
new file mode 100644
index 0000000..304dc8f
--- /dev/null
+++ b/car-maps-placeholder/res/values-pl/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Mapy"</string>
+ <string name="error_text" msgid="5575174711944349180">"Brak zainstalowanej aplikacji do obsługi map. Skontaktuj się z producentem samochodu."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-pt-rPT/strings.xml b/car-maps-placeholder/res/values-pt-rPT/strings.xml
new file mode 100644
index 0000000..23107af
--- /dev/null
+++ b/car-maps-placeholder/res/values-pt-rPT/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Maps"</string>
+ <string name="error_text" msgid="5575174711944349180">"Nenhuma aplicação de mapas instalada. Contacte o fabricante do automóvel."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-pt/strings.xml b/car-maps-placeholder/res/values-pt/strings.xml
new file mode 100644
index 0000000..6025535
--- /dev/null
+++ b/car-maps-placeholder/res/values-pt/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Maps"</string>
+ <string name="error_text" msgid="5575174711944349180">"Nenhum app de navegação instalado. Entre em contato com o fabricante do carro."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-ro/strings.xml b/car-maps-placeholder/res/values-ro/strings.xml
new file mode 100644
index 0000000..a088b04
--- /dev/null
+++ b/car-maps-placeholder/res/values-ro/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Maps"</string>
+ <string name="error_text" msgid="5575174711944349180">"Nu s-a instalat nicio aplicație pentru hărți. Contactați producătorul mașinii."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-ru/strings.xml b/car-maps-placeholder/res/values-ru/strings.xml
new file mode 100644
index 0000000..e4bf4b8
--- /dev/null
+++ b/car-maps-placeholder/res/values-ru/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Карты"</string>
+ <string name="error_text" msgid="5575174711944349180">"Приложение для навигации не установлено. Обратитесь к производителю автомобиля."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-si/strings.xml b/car-maps-placeholder/res/values-si/strings.xml
new file mode 100644
index 0000000..8f2a2fc
--- /dev/null
+++ b/car-maps-placeholder/res/values-si/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"සිතියම්"</string>
+ <string name="error_text" msgid="5575174711944349180">"සිතියම් යෙදුම් කිසිවක් ස්ථාපන කර නැත. ඔබේ මෝටර් රථයේ නිෂ්පාදකයා සම්බන්ධ කර ගන්න."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-sk/strings.xml b/car-maps-placeholder/res/values-sk/strings.xml
new file mode 100644
index 0000000..b41447a
--- /dev/null
+++ b/car-maps-placeholder/res/values-sk/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Mapy"</string>
+ <string name="error_text" msgid="5575174711944349180">"Nemáte nainštalované žiadne aplikácie s mapami. Kontaktujte výrobcu auta."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-sl/strings.xml b/car-maps-placeholder/res/values-sl/strings.xml
new file mode 100644
index 0000000..d278251
--- /dev/null
+++ b/car-maps-placeholder/res/values-sl/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Zemljevidi"</string>
+ <string name="error_text" msgid="5575174711944349180">"Ni nameščenih aplikacij za zemljevide. Obrnite se na proizvajalca avtomobila."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-sq/strings.xml b/car-maps-placeholder/res/values-sq/strings.xml
new file mode 100644
index 0000000..c7f1b9d
--- /dev/null
+++ b/car-maps-placeholder/res/values-sq/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Hartat"</string>
+ <string name="error_text" msgid="5575174711944349180">"Nuk ka asnjë aplikacion të hartave të instaluar. Kontakto me prodhuesin e makinës."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-sr/strings.xml b/car-maps-placeholder/res/values-sr/strings.xml
new file mode 100644
index 0000000..6f787b8
--- /dev/null
+++ b/car-maps-placeholder/res/values-sr/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Мапе"</string>
+ <string name="error_text" msgid="5575174711944349180">"Није инсталирана апликација за мапе. Контактирајте произвођача аутомобила."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-sv/strings.xml b/car-maps-placeholder/res/values-sv/strings.xml
new file mode 100644
index 0000000..5dc6bda
--- /dev/null
+++ b/car-maps-placeholder/res/values-sv/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Kartor"</string>
+ <string name="error_text" msgid="5575174711944349180">"Ingen kartapp har installerats. Kontakta bilens tillverkare."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-sw/strings.xml b/car-maps-placeholder/res/values-sw/strings.xml
new file mode 100644
index 0000000..79b3091
--- /dev/null
+++ b/car-maps-placeholder/res/values-sw/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Ramani"</string>
+ <string name="error_text" msgid="5575174711944349180">"Hakuna programu za ramani zilizosakinishwa. Wasiliana na kampuni iliyotengeneza gari lako."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-ta/strings.xml b/car-maps-placeholder/res/values-ta/strings.xml
new file mode 100644
index 0000000..8d5e354
--- /dev/null
+++ b/car-maps-placeholder/res/values-ta/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"வரைபடம்"</string>
+ <string name="error_text" msgid="5575174711944349180">"வரைபட ஆப்ஸ் எதுவும் நிறுவப்படவில்லை. உங்கள் கார் உற்பத்தியாளரைத் தொடர்புகொள்ளவும்."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-te/strings.xml b/car-maps-placeholder/res/values-te/strings.xml
new file mode 100644
index 0000000..987b654
--- /dev/null
+++ b/car-maps-placeholder/res/values-te/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"మ్యాప్స్"</string>
+ <string name="error_text" msgid="5575174711944349180">"మ్యాప్స్ అప్లికేషన్ ఇన్స్టాల్ చేయబడలేదు. దయచేసి మీ కారుని తయారు చేసినవారిని సంప్రదించండి"</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-th/strings.xml b/car-maps-placeholder/res/values-th/strings.xml
new file mode 100644
index 0000000..866a545
--- /dev/null
+++ b/car-maps-placeholder/res/values-th/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Maps"</string>
+ <string name="error_text" msgid="5575174711944349180">"ไม่ได้ติดตั้งแอปพลิเคชันแผนที่ไว้ โปรดติดต่อผู้ผลิตรถ"</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-tl/strings.xml b/car-maps-placeholder/res/values-tl/strings.xml
new file mode 100644
index 0000000..82f1893
--- /dev/null
+++ b/car-maps-placeholder/res/values-tl/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Maps"</string>
+ <string name="error_text" msgid="5575174711944349180">"Walang naka-install na application ng mga mapa. Makipag-ugnayan sa manufacturer ng iyong sasakyan."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-tr/strings.xml b/car-maps-placeholder/res/values-tr/strings.xml
new file mode 100644
index 0000000..4c63a70
--- /dev/null
+++ b/car-maps-placeholder/res/values-tr/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Haritalar"</string>
+ <string name="error_text" msgid="5575174711944349180">"Yüklü harita uygulaması yok. Lütfen aracınızın üreticisine başvurun."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-uk/strings.xml b/car-maps-placeholder/res/values-uk/strings.xml
new file mode 100644
index 0000000..2d4a6ab
--- /dev/null
+++ b/car-maps-placeholder/res/values-uk/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Карти"</string>
+ <string name="error_text" msgid="5575174711944349180">"Додаток із картами не встановлено. Зверніться до виробника автомобіля."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-ur/strings.xml b/car-maps-placeholder/res/values-ur/strings.xml
new file mode 100644
index 0000000..aabe895
--- /dev/null
+++ b/car-maps-placeholder/res/values-ur/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Maps"</string>
+ <string name="error_text" msgid="5575174711944349180">"نقشہ کی کوئی بھی ایپلیکیشن انسٹال نہیں ہے۔ براہ کرم اپنی کار کے مینوفیکچرر سے رابطہ کریں۔"</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-uz/strings.xml b/car-maps-placeholder/res/values-uz/strings.xml
new file mode 100644
index 0000000..d9d5ffd
--- /dev/null
+++ b/car-maps-placeholder/res/values-uz/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Xaritalar"</string>
+ <string name="error_text" msgid="5575174711944349180">"Hech qanday navigatsiya ilovasi oʻrnatilmagan. Avtomobil ishlab chiqaruvchisiga murojaat qiling."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-vi/strings.xml b/car-maps-placeholder/res/values-vi/strings.xml
new file mode 100644
index 0000000..71b52d1
--- /dev/null
+++ b/car-maps-placeholder/res/values-vi/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Bản đồ"</string>
+ <string name="error_text" msgid="5575174711944349180">"Chưa cài đặt ứng dụng bản đồ nào. Vui lòng liên hệ với nhà sản xuất ô tô của bạn."</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-zh-rCN/strings.xml b/car-maps-placeholder/res/values-zh-rCN/strings.xml
new file mode 100644
index 0000000..9be32b1
--- /dev/null
+++ b/car-maps-placeholder/res/values-zh-rCN/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"地图"</string>
+ <string name="error_text" msgid="5575174711944349180">"尚未安装地图应用。请与汽车制造商联系。"</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-zh-rHK/strings.xml b/car-maps-placeholder/res/values-zh-rHK/strings.xml
new file mode 100644
index 0000000..3efe08a
--- /dev/null
+++ b/car-maps-placeholder/res/values-zh-rHK/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"地圖"</string>
+ <string name="error_text" msgid="5575174711944349180">"地圖應用程式尚未安裝。請聯絡您的汽車製造商。"</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-zh-rTW/strings.xml b/car-maps-placeholder/res/values-zh-rTW/strings.xml
new file mode 100644
index 0000000..0b175d4
--- /dev/null
+++ b/car-maps-placeholder/res/values-zh-rTW/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"地圖"</string>
+ <string name="error_text" msgid="5575174711944349180">"為安裝任何地圖應用程式。請與你的車輛製造商聯絡。"</string>
+</resources>
diff --git a/car-maps-placeholder/res/values-zu/strings.xml b/car-maps-placeholder/res/values-zu/strings.xml
new file mode 100644
index 0000000..889e3cd
--- /dev/null
+++ b/car-maps-placeholder/res/values-zu/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6575346965016311017">"Amamephu"</string>
+ <string name="error_text" msgid="5575174711944349180">"Alukho uhlelo lokusebenza lwamamephu olufakiwe. Sicela uxhumane nomkhiqizi wemoto yakho."</string>
+</resources>
diff --git a/car-support-lib/Android.bp b/car-support-lib/Android.bp
deleted file mode 100644
index 18e7b03..0000000
--- a/car-support-lib/Android.bp
+++ /dev/null
@@ -1,103 +0,0 @@
-// Copyright (C) 2018 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-java_library_static {
- name: "android.support.car",
- srcs: [
- "src/**/*.java",
- "src/**/I*.aidl",
- ],
- aidl: {
- include_dirs: [
- "system/bt/binder",
- ],
- },
- libs: [
- "android.car",
- ],
- static_libs: [
- "androidx.annotation_annotation",
- ],
- platform_apis: true,
- product_variables: {
- pdk: {
- enabled: false,
- },
- },
- installable: true,
-}
-
-doc_defaults {
- name: "android.support.car-docs-default",
- srcs: [
- "src/**/*.java",
- ],
- libs: [
- "android.car",
- "android.support.car",
- "androidx.annotation_annotation",
- ],
- custom_template: "droiddoc-templates-sdk",
- product_variables: {
- pdk: {
- enabled: false,
- },
- },
-}
-
-droidstubs {
- name: "android.support.car-stubs-docs",
- defaults: ["android.support.car-docs-default"],
- api_tag_name: "ANDROID_SUPPORT_CAR",
- api_filename: "api.txt",
- removed_api_filename: "removed.txt",
- args: "--hide DeprecationMismatch -hide UnavailableSymbol --hide UnhiddenSystemApi --hide HiddenTypedefConstant --hide ReferencesHidden --no-docs --stub-packages android.support.car* ",
- installable: false,
- check_api: {
- current: {
- api_file: "api/current.txt",
- removed_api_file: "api/removed.txt",
- args: " -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 -hide 113 ",
- },
- },
-}
-
-droiddoc {
- name: "android.support.car-proguard-docs",
- defaults: ["android.support.car-docs-default"],
- api_tag_name: "ANDROID_SUPPORT_CAR_PROGUARD",
- proguard_filename: "keep_list.proguard",
- create_stubs: false,
-}
-
-// TODO(deanh) support lib should be able to be using public APIs only
-droiddoc {
- name: "android.support.car-docs",
- srcs: [
- "src/**/*.java",
- ],
- libs: [
- "android.car",
- "androidx.annotation_annotation",
- ],
- custom_template: "droiddoc-templates-sdk",
- create_stubs: false,
- product_variables: {
- pdk: {
- enabled: false,
- },
- },
-}
diff --git a/car-support-lib/Android.mk b/car-support-lib/Android.mk
deleted file mode 100644
index cfa40be..0000000
--- a/car-support-lib/Android.mk
+++ /dev/null
@@ -1,84 +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.
-#
-#
-
-#disble build in PDK, should add prebuilts/fullsdk to make this work
-ifneq ($(TARGET_BUILD_PDK),true)
-
-LOCAL_PATH:= $(call my-dir)
-
-# Build prebuilt android.support.car library
-# ---------------------------------------------
-include $(CLEAR_VARS)
-
-LOCAL_AAPT_FLAGS := --auto-add-overlay
-LOCAL_MODULE := android.support.car-prebuilt
-LOCAL_MODULE_CLASS := JAVA_LIBRARIES
-
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-
-#TODO(b/72620511) support lib should be able to be using public APIs only
-#LOCAL_SDK_VERSION := current
-LOCAL_PRIVATE_PLATFORM_APIS := true
-
-LOCAL_MANIFEST_FILE := AndroidManifest.xml
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src) $(call all-Iaidl-files-under, src)
-LOCAL_JAVA_LIBRARIES += android.car\
- androidx.annotation_annotation
-
-LOCAL_PROGUARD_ENABLED := custom optimization obfuscation
-LOCAL_PROGUARD_FLAGS := -dontwarn
-LOCAL_PROGUARD_FLAG_FILES := proguard-release.flags proguard-extra-keeps.flags
-
-include $(BUILD_STATIC_JAVA_LIBRARY)
-
-ifeq ($(BOARD_IS_AUTOMOTIVE), true)
- $(call dist-for-goals, dist_files, $(built_aar):android.support.car.aar)
-endif
-
-# Same as above, except without proguard.
-# ---------------------------------------------
-include $(CLEAR_VARS)
-
-LOCAL_AAPT_FLAGS := --auto-add-overlay
-LOCAL_MODULE := android.support.car-1p-prebuilt
-LOCAL_MODULE_CLASS := JAVA_LIBRARIES
-
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-
-#TODO(b/72620511) support lib should be able to be using public APIs only
-#LOCAL_SDK_VERSION := current
-LOCAL_PRIVATE_PLATFORM_APIS := true
-
-LOCAL_MANIFEST_FILE := AndroidManifest.xml
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src) $(call all-Iaidl-files-under, src)
-LOCAL_JAVA_LIBRARIES += android.car\
- androidx.annotation_annotation
-
-LOCAL_PROGUARD_ENABLED := disabled
-include $(BUILD_STATIC_JAVA_LIBRARY)
-
-ifeq ($(BOARD_IS_AUTOMOTIVE), true)
- $(call dist-for-goals, dist_files, $(built_aar):android.support.car-1p.aar)
-endif
-
-.PHONY: update-support-car-proguard-api
-update-support-car-proguard-api: $(INTERNAL_PLATFORM_ANDROID_SUPPORT_CAR_PROGUARD_PROGUARD_FILE) | $(ACP)
- @echo $(PRIVATE_CAR_MODULE) copying $(INTERNAL_PLATFORM_ANDROID_SUPPORT_CAR_PROGUARD_PROGUARD_FILE) to $(LOCAL_PATH)/proguard-release.flags
- $(hide) $(ACP) $(INTERNAL_PLATFORM_ANDROID_SUPPORT_CAR_PROGUARD_PROGUARD_FILE) $(LOCAL_PATH)/proguard-release.flags
-
-endif #TARGET_BUILD_PDK
diff --git a/car-support-lib/AndroidManifest.xml b/car-support-lib/AndroidManifest.xml
deleted file mode 100644
index f92f21b..0000000
--- a/car-support-lib/AndroidManifest.xml
+++ /dev/null
@@ -1,22 +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.
--->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
- package="android.support.car.ui" >
- <uses-sdk android:minSdkVersion="21"
- android:targetSdkVersion="23" />
-</manifest>
diff --git a/car-support-lib/api/current.txt b/car-support-lib/api/current.txt
deleted file mode 100644
index 7cb8bf7..0000000
--- a/car-support-lib/api/current.txt
+++ /dev/null
@@ -1,231 +0,0 @@
-// Signature format: 2.0
-package android.support.car {
-
- public class Car {
- method public void connect() throws java.lang.IllegalStateException;
- method public static android.support.car.Car createCar(android.content.Context, android.support.car.CarConnectionCallback, @Nullable android.os.Handler);
- method public static android.support.car.Car createCar(android.content.Context, android.support.car.CarConnectionCallback);
- method public void disconnect();
- method public Object getCarManager(String) throws android.support.car.CarNotConnectedException;
- method public <T> T getCarManager(Class<T>) throws android.support.car.CarNotConnectedException;
- method public boolean isConnected();
- method public boolean isConnecting();
- field public static final String APP_FOCUS_SERVICE = "app_focus";
- field public static final String AUDIO_SERVICE = "audio";
- field public static final String INFO_SERVICE = "info";
- field public static final String NAVIGATION_STATUS_SERVICE = "car_navigation_service";
- field public static final String PERMISSION_CAR_NAVIGATION_MANAGER = "android.car.permission.PERMISSION_CAR_NAVIGATION_MANAGER";
- field public static final String PERMISSION_VENDOR_EXTENSION = "android.car.permission.CAR_VENDOR_EXTENSION";
- field public static final String SENSOR_SERVICE = "sensor";
- }
-
- public abstract class CarAppFocusManager {
- ctor public CarAppFocusManager();
- method public abstract void abandonAppFocus(android.support.car.CarAppFocusManager.OnAppFocusOwnershipCallback, int);
- method public abstract void abandonAppFocus(android.support.car.CarAppFocusManager.OnAppFocusOwnershipCallback);
- method public abstract void addFocusListener(android.support.car.CarAppFocusManager.OnAppFocusChangedListener, int) throws android.support.car.CarNotConnectedException;
- method public abstract boolean isOwningFocus(int, android.support.car.CarAppFocusManager.OnAppFocusOwnershipCallback) throws android.support.car.CarNotConnectedException;
- method public abstract void removeFocusListener(android.support.car.CarAppFocusManager.OnAppFocusChangedListener, int);
- method public abstract void removeFocusListener(android.support.car.CarAppFocusManager.OnAppFocusChangedListener);
- method public abstract int requestAppFocus(int, android.support.car.CarAppFocusManager.OnAppFocusOwnershipCallback) throws android.support.car.CarNotConnectedException, java.lang.SecurityException;
- field public static final int APP_FOCUS_REQUEST_FAILED = 0; // 0x0
- field public static final int APP_FOCUS_REQUEST_SUCCEEDED = 1; // 0x1
- field public static final int APP_FOCUS_TYPE_NAVIGATION = 1; // 0x1
- }
-
- public static interface CarAppFocusManager.OnAppFocusChangedListener {
- method public void onAppFocusChanged(android.support.car.CarAppFocusManager, int, boolean);
- }
-
- public static interface CarAppFocusManager.OnAppFocusOwnershipCallback {
- method public void onAppFocusOwnershipGranted(android.support.car.CarAppFocusManager, int);
- method public void onAppFocusOwnershipLost(android.support.car.CarAppFocusManager, int);
- }
-
- public abstract class CarConnectionCallback {
- ctor public CarConnectionCallback();
- method public abstract void onConnected(android.support.car.Car);
- method public abstract void onDisconnected(android.support.car.Car);
- }
-
- public abstract class CarInfoManager {
- ctor public CarInfoManager();
- method public abstract int getDriverPosition() throws android.support.car.CarNotConnectedException;
- method public abstract float getEvBatteryCapacity() throws android.support.car.CarNotConnectedException;
- method public abstract int[] getEvConnectorTypes() throws android.support.car.CarNotConnectedException;
- method public abstract float getFuelCapacity() throws android.support.car.CarNotConnectedException;
- method public abstract int[] getFuelTypes() throws android.support.car.CarNotConnectedException;
- method @Nullable public abstract String getHeadunitManufacturer() throws android.support.car.CarNotConnectedException;
- method @Nullable public abstract String getHeadunitModel() throws android.support.car.CarNotConnectedException;
- method @Nullable public abstract String getHeadunitSoftwareBuild() throws android.support.car.CarNotConnectedException;
- method @Nullable public abstract String getHeadunitSoftwareVersion() throws android.support.car.CarNotConnectedException;
- method @Nullable public abstract String getManufacturer() throws android.support.car.CarNotConnectedException;
- method @Nullable public abstract String getModel() throws android.support.car.CarNotConnectedException;
- method @Nullable public abstract String getModelYear() throws android.support.car.CarNotConnectedException;
- method @Nullable public abstract String getVehicleId() throws android.support.car.CarNotConnectedException;
- field public static final int DRIVER_SIDE_CENTER = 3; // 0x3
- field public static final int DRIVER_SIDE_LEFT = 1; // 0x1
- field public static final int DRIVER_SIDE_RIGHT = 2; // 0x2
- field public static final int DRIVER_SIDE_UNKNOWN = 0; // 0x0
- }
-
- public class CarNotConnectedException extends java.lang.Exception {
- ctor public CarNotConnectedException();
- ctor public CarNotConnectedException(String);
- ctor public CarNotConnectedException(String, Throwable);
- ctor public CarNotConnectedException(Exception);
- }
-
-}
-
-package android.support.car.annotation {
-
- @java.lang.annotation.Target(java.lang.annotation.ElementType.FIELD) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public @interface ValueTypeDef {
- method public abstract Class<?> type() default java.lang.Object.class;
- }
-
- @java.lang.annotation.Target(java.lang.annotation.ElementType.FIELD) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public @interface VersionDef {
- method public abstract int version() default 1;
- }
-
-}
-
-package android.support.car.hardware {
-
- public class CarSensorEvent {
- method public android.support.car.hardware.CarSensorEvent.CompassData getCompassData();
- method public android.support.car.hardware.CarSensorEvent.DrivingStatusData getDrivingStatusData();
- method public android.support.car.hardware.CarSensorEvent.NightData getNightData();
- method public android.support.car.hardware.CarSensorEvent.ParkingBrakeData getParkingBrakeData();
- field public static final int DRIVE_STATUS_FULLY_RESTRICTED = 31; // 0x1f
- field public static final int DRIVE_STATUS_LIMIT_MESSAGE_LEN = 16; // 0x10
- field public static final int DRIVE_STATUS_NO_CONFIG = 8; // 0x8
- field public static final int DRIVE_STATUS_NO_KEYBOARD_INPUT = 2; // 0x2
- field public static final int DRIVE_STATUS_NO_VIDEO = 1; // 0x1
- field public static final int DRIVE_STATUS_NO_VOICE_INPUT = 4; // 0x4
- field public static final int DRIVE_STATUS_UNRESTRICTED = 0; // 0x0
- field public static final int INDEX_COMPASS_BEARING = 0; // 0x0
- field public static final int INDEX_COMPASS_PITCH = 1; // 0x1
- field public static final int INDEX_COMPASS_ROLL = 2; // 0x2
- field public static final int INDEX_WHEEL_DISTANCE_FRONT_LEFT = 1; // 0x1
- field public static final int INDEX_WHEEL_DISTANCE_FRONT_RIGHT = 2; // 0x2
- field public static final int INDEX_WHEEL_DISTANCE_REAR_LEFT = 4; // 0x4
- field public static final int INDEX_WHEEL_DISTANCE_REAR_RIGHT = 3; // 0x3
- field public static final int INDEX_WHEEL_DISTANCE_RESET_COUNT = 0; // 0x0
- field public final float[] floatValues;
- field public final int[] intValues;
- field public final long[] longValues;
- field public final int sensorType;
- field public final long timestamp;
- }
-
- public static class CarSensorEvent.CompassData {
- field public final float bearing;
- field public final float pitch;
- field public final float roll;
- field public final long timestamp;
- }
-
- public static class CarSensorEvent.DrivingStatusData {
- method public boolean isConfigurationRestricted();
- method public boolean isFullyRestricted();
- method public boolean isKeyboardRestricted();
- method public boolean isMessageLengthRestricted();
- method public boolean isVideoRestricted();
- method public boolean isVoiceRestricted();
- field public final int status;
- field public final long timestamp;
- }
-
- public static class CarSensorEvent.NightData {
- field public final boolean isNightMode;
- field public final long timestamp;
- }
-
- public static class CarSensorEvent.ParkingBrakeData {
- field public final boolean isEngaged;
- field public final long timestamp;
- }
-
- public abstract class CarSensorManager {
- ctor public CarSensorManager();
- method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_FINE_LOCATION, "android.car.permission.CAR_SPEED", "android.car.permission.CAR_MILEAGE", "android.car.permission.CAR_ENERGY", "android.car.permission.VEHICLE_DYNAMICS_STATE"}, conditional=true) public abstract boolean addListener(android.support.car.hardware.CarSensorManager.OnSensorChangedListener, int, int) throws android.support.car.CarNotConnectedException, java.lang.IllegalArgumentException;
- method public abstract android.support.car.hardware.CarSensorEvent getLatestSensorEvent(int) throws android.support.car.CarNotConnectedException;
- method public abstract int[] getSupportedSensors() throws android.support.car.CarNotConnectedException;
- method public abstract boolean isSensorSupported(int) throws android.support.car.CarNotConnectedException;
- method public abstract void removeListener(android.support.car.hardware.CarSensorManager.OnSensorChangedListener);
- method public abstract void removeListener(android.support.car.hardware.CarSensorManager.OnSensorChangedListener, int);
- field public static final int SENSOR_RATE_FASTEST = 100; // 0x64
- field public static final int SENSOR_RATE_NORMAL = 1; // 0x1
- field public static final int SENSOR_TYPE_ABS_ACTIVE = 24; // 0x18
- field public static final int SENSOR_TYPE_COMPASS = 1; // 0x1
- field public static final int SENSOR_TYPE_DRIVING_STATUS = 11; // 0xb
- field public static final int SENSOR_TYPE_EV_BATTERY_CHARGE_RATE = 31; // 0x1f
- field public static final int SENSOR_TYPE_EV_BATTERY_LEVEL = 28; // 0x1c
- field public static final int SENSOR_TYPE_EV_CHARGE_PORT_CONNECTED = 30; // 0x1e
- field public static final int SENSOR_TYPE_EV_CHARGE_PORT_OPEN = 29; // 0x1d
- field public static final int SENSOR_TYPE_FUEL_DOOR_OPEN = 27; // 0x1b
- field public static final int SENSOR_TYPE_NIGHT = 9; // 0x9
- field public static final int SENSOR_TYPE_PARKING_BRAKE = 6; // 0x6
- field public static final int SENSOR_TYPE_TRACTION_CONTROL_ACTIVE = 25; // 0x19
- field public static final int SENSOR_TYPE_WHEEL_TICK_DISTANCE = 23; // 0x17
- }
-
- public static interface CarSensorManager.OnSensorChangedListener {
- method public void onSensorChanged(android.support.car.hardware.CarSensorManager, android.support.car.hardware.CarSensorEvent);
- }
-
-}
-
-package android.support.car.media {
-
- public abstract class CarAudioManager {
- ctor public CarAudioManager();
- method @RequiresPermission(android.Manifest.permission.RECORD_AUDIO) public abstract android.support.car.media.CarAudioRecord createCarAudioRecord(int) throws android.support.car.CarNotConnectedException, java.lang.SecurityException;
- method public abstract android.media.AudioFormat getAudioRecordAudioFormat() throws android.support.car.CarNotConnectedException;
- method public abstract int getAudioRecordMaxBufferSize() throws android.support.car.CarNotConnectedException;
- method public abstract int getAudioRecordMinBufferSize() throws android.support.car.CarNotConnectedException;
- method public abstract boolean isAudioRecordSupported() throws android.support.car.CarNotConnectedException;
- }
-
- public abstract class CarAudioRecord {
- ctor public CarAudioRecord();
- method public abstract int getAudioSessionId() throws android.support.car.CarNotConnectedException;
- method public abstract int getBufferSize() throws android.support.car.CarNotConnectedException;
- method public abstract int getRecordingState() throws android.support.car.CarNotConnectedException;
- method public abstract int getState() throws android.support.car.CarNotConnectedException;
- method public abstract int read(byte[], int, int) throws android.support.car.CarNotConnectedException, java.lang.IllegalStateException;
- method public abstract void release();
- method public abstract void startRecording() throws android.support.car.CarNotConnectedException;
- method public abstract void stop();
- }
-
-}
-
-package android.support.car.navigation {
-
- public class CarNavigationInstrumentCluster {
- method public int getImageColorDepthBits();
- method public int getImageHeight();
- method public int getImageWidth();
- method public int getMinIntervalMillis();
- method public int getType();
- method public boolean supportsCustomImages();
- field public static final int CLUSTER_TYPE_CUSTOM_IMAGES_SUPPORTED = 1; // 0x1
- field public static final int CLUSTER_TYPE_IMAGE_CODES_ONLY = 2; // 0x2
- }
-
- public abstract class CarNavigationStatusManager {
- ctor public CarNavigationStatusManager();
- method public abstract void addListener(android.support.car.navigation.CarNavigationStatusManager.CarNavigationCallback) throws android.support.car.CarNotConnectedException;
- method public abstract void removeListener();
- method public abstract void sendEvent(int, android.os.Bundle) throws android.support.car.CarNotConnectedException;
- }
-
- public static interface CarNavigationStatusManager.CarNavigationCallback {
- method public void onInstrumentClusterStarted(android.support.car.navigation.CarNavigationStatusManager, android.support.car.navigation.CarNavigationInstrumentCluster);
- method public void onInstrumentClusterStopped(android.support.car.navigation.CarNavigationStatusManager);
- }
-
-}
-
diff --git a/car-support-lib/car-support.mk b/car-support-lib/car-support.mk
deleted file mode 100644
index 7feba67..0000000
--- a/car-support-lib/car-support.mk
+++ /dev/null
@@ -1,30 +0,0 @@
-#
-# Include this make file to build your application with car friendly UI.
-#
-# Make sure to include it after you've set all your desired LOCAL variables.
-# Note that you must explicitly set your LOCAL_RESOURCE_DIR before including this file.
-#
-# For example:
-#
-# LOCAL_RESOURCE_DIR := \
-# $(LOCAL_PATH)/res
-#
-# include packages/services/Car/car-support-lib/car-support.mk
-#
-
-# Check that LOCAL_RESOURCE_DIR is defined
-ifeq (,$(LOCAL_RESOURCE_DIR))
-$(error LOCAL_RESOURCE_DIR must be defined)
-endif
-
-# Add --auto-add-overlay flag if not present
-ifeq (,$(findstring --auto-add-overlay, $(LOCAL_AAPT_FLAGS)))
-LOCAL_AAPT_FLAGS += --auto-add-overlay
-endif
-
-# Include car support library, if not already included
-ifeq (,$(findstring android.support.car, $(LOCAL_STATIC_JAVA_LIBRARIES)))
-LOCAL_STATIC_JAVA_LIBRARIES += android.support.car
-endif
-
-LOCAL_JAVA_LIBRARIES += android.car
diff --git a/car-support-lib/proguard-extra-keeps.flags b/car-support-lib/proguard-extra-keeps.flags
deleted file mode 100644
index 72ea927..0000000
--- a/car-support-lib/proguard-extra-keeps.flags
+++ /dev/null
@@ -1,23 +0,0 @@
--keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,EnclosingMethod,*Annotation*
-
--keep class android.support.car.CarServiceLoader {
- public protected *;
- class CarConnectionCallbackProxy;
-}
-
--keep class android.support.car.CarServiceLoader$CarConnectionCallbackProxy {
- *;
-}
-
--keep class android.support.car.hardware.CarSensorEvent {
- public <init>(...);
-}
-
--keep class android.support.car.navigation.CarNavigationInstrumentCluster {
- public static ... createCluster(...);
- public static ... createCustomImageCluster(...);
-}
-
--keep class android.support.car.CarManagerBase {
- *;
-}
diff --git a/car-support-lib/proguard-release.flags b/car-support-lib/proguard-release.flags
deleted file mode 100644
index 4f5f917..0000000
--- a/car-support-lib/proguard-release.flags
+++ /dev/null
@@ -1,31385 +0,0 @@
--keep class android.accessibilityservice.AccessibilityServiceInfo {
- <init>();
- <init>(android.content.pm.ResolveInfo, android.content.Context);
-
- public static java.lang.String capabilityToString(int);
- public int describeContents();
- public boolean equals(java.lang.Object);
- public static java.lang.String feedbackTypeToString(int);
- public static java.lang.String flagToString(int);
- public boolean getCanRetrieveWindowContent();
- public int getCapabilities();
- public java.util.List getCapabilityInfos();
- public java.util.List getCapabilityInfos(android.content.Context);
- public android.content.ComponentName getComponentName();
- public java.lang.String getDescription();
- public java.lang.String getId();
- public android.content.pm.ResolveInfo getResolveInfo();
- public java.lang.String getSettingsActivityName();
- public int hashCode();
- public boolean isDirectBootAware();
- public java.lang.String loadDescription(android.content.pm.PackageManager);
- public java.lang.CharSequence loadSummary(android.content.pm.PackageManager);
- public void setCapabilities(int);
- public void setComponentName(android.content.ComponentName);
- public java.lang.String toString();
- public void updateDynamicallyConfigurableProperties(android.accessibilityservice.AccessibilityServiceInfo);
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static int CAPABILITY_CAN_CONTROL_MAGNIFICATION;
- public static int CAPABILITY_CAN_PERFORM_GESTURES;
- public static int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY;
- public static int CAPABILITY_CAN_REQUEST_FILTER_KEY_EVENTS;
- public static int CAPABILITY_CAN_REQUEST_FINGERPRINT_GESTURES;
- public static int CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION;
- public static int CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT;
- public static android.os.Parcelable$Creator CREATOR;
- public static int DEFAULT;
- public static int FEEDBACK_ALL_MASK;
- public static int FEEDBACK_AUDIBLE;
- public static int FEEDBACK_BRAILLE;
- public static int FEEDBACK_GENERIC;
- public static int FEEDBACK_HAPTIC;
- public static int FEEDBACK_SPOKEN;
- public static int FEEDBACK_VISUAL;
- public static int FLAG_ENABLE_ACCESSIBILITY_VOLUME;
- public static int FLAG_FORCE_DIRECT_BOOT_AWARE;
- public static int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS;
- public static int FLAG_REPORT_VIEW_IDS;
- public static int FLAG_REQUEST_ACCESSIBILITY_BUTTON;
- public static int FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY;
- public static int FLAG_REQUEST_FILTER_KEY_EVENTS;
- public static int FLAG_REQUEST_FINGERPRINT_GESTURES;
- public static int FLAG_REQUEST_TOUCH_EXPLORATION_MODE;
- public static int FLAG_RETRIEVE_INTERACTIVE_WINDOWS;
- public boolean crashed;
- public int eventTypes;
- public int feedbackType;
- public int flags;
- public long notificationTimeout;
- public java.lang.String[] packageNames;
-}
-
--keep class android.accessibilityservice.AccessibilityServiceInfo$CapabilityInfo {
- <init>(int, int, int);
-
-
-
- public int capability;
- public int descResId;
- public int titleResId;
-}
-
--keep class android.accessibilityservice.IAccessibilityServiceClient {
-
- public abstract void clearAccessibilityCache();
- public abstract void init(android.accessibilityservice.IAccessibilityServiceConnection, int, android.os.IBinder);
- public abstract void onAccessibilityButtonAvailabilityChanged(boolean);
- public abstract void onAccessibilityButtonClicked();
- public abstract void onAccessibilityEvent(android.view.accessibility.AccessibilityEvent, boolean);
- public abstract void onFingerprintCapturingGesturesChanged(boolean);
- public abstract void onFingerprintGesture(int);
- public abstract void onGesture(int);
- public abstract void onInterrupt();
- public abstract void onKeyEvent(android.view.KeyEvent, int);
- public abstract void onMagnificationChanged(android.graphics.Region, float, float, float);
- public abstract void onPerformGestureResult(int, boolean);
- public abstract void onSoftKeyboardShowModeChanged(int);
-
-
-}
-
--keep class android.accessibilityservice.IAccessibilityServiceConnection {
-
- public abstract void disableSelf();
- public abstract java.lang.String[] findAccessibilityNodeInfoByAccessibilityId(int, long, int, android.view.accessibility.IAccessibilityInteractionConnectionCallback, int, long, android.os.Bundle);
- public abstract java.lang.String[] findAccessibilityNodeInfosByText(int, long, java.lang.String, int, android.view.accessibility.IAccessibilityInteractionConnectionCallback, long);
- public abstract java.lang.String[] findAccessibilityNodeInfosByViewId(int, long, java.lang.String, int, android.view.accessibility.IAccessibilityInteractionConnectionCallback, long);
- public abstract java.lang.String[] findFocus(int, long, int, int, android.view.accessibility.IAccessibilityInteractionConnectionCallback, long);
- public abstract java.lang.String[] focusSearch(int, long, int, int, android.view.accessibility.IAccessibilityInteractionConnectionCallback, long);
- public abstract float getMagnificationCenterX();
- public abstract float getMagnificationCenterY();
- public abstract android.graphics.Region getMagnificationRegion();
- public abstract float getMagnificationScale();
- public abstract android.accessibilityservice.AccessibilityServiceInfo getServiceInfo();
- public abstract android.view.accessibility.AccessibilityWindowInfo getWindow(int);
- public abstract java.util.List getWindows();
- public abstract boolean isAccessibilityButtonAvailable();
- public abstract boolean isFingerprintGestureDetectionAvailable();
- public abstract boolean performAccessibilityAction(int, long, int, android.os.Bundle, int, android.view.accessibility.IAccessibilityInteractionConnectionCallback, long);
- public abstract boolean performGlobalAction(int);
- public abstract boolean resetMagnification(boolean);
- public abstract void sendGesture(int, android.content.pm.ParceledListSlice);
- public abstract void setMagnificationCallbackEnabled(boolean);
- public abstract boolean setMagnificationScaleAndCenter(float, float, float, boolean);
- public abstract void setOnKeyEventResult(boolean, int);
- public abstract void setServiceInfo(android.accessibilityservice.AccessibilityServiceInfo);
- public abstract void setSoftKeyboardCallbackEnabled(boolean);
- public abstract boolean setSoftKeyboardShowMode(int);
-
-
-}
-
--keep class android.accounts.Account {
- <init>(java.lang.String, java.lang.String);
- <init>(android.accounts.Account, java.lang.String);
- <init>(java.lang.String, java.lang.String, java.lang.String);
- <init>(android.os.Parcel);
-
- public int describeContents();
- public boolean equals(java.lang.Object);
- public java.lang.String getAccessId();
- public int hashCode();
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public java.lang.String name;
- public java.lang.String type;
-}
-
--keep class android.animation.AnimationHandler {
- <init>();
-
- public void addAnimationFrameCallback(android.animation.AnimationHandler$AnimationFrameCallback, long);
- public void addOneShotCommitCallback(android.animation.AnimationHandler$AnimationFrameCallback);
- public static int getAnimationCount();
- public static long getFrameDelay();
- public static android.animation.AnimationHandler getInstance();
- public void removeCallback(android.animation.AnimationHandler$AnimationFrameCallback);
- public static void setFrameDelay(long);
- public void setProvider(android.animation.AnimationHandler$AnimationFrameCallbackProvider);
-
-
- public static java.lang.ThreadLocal sAnimatorHandler;
-}
-
--keep class android.animation.AnimationHandler$AnimationFrameCallback {
-
- public abstract void commitAnimationFrame(long);
- public abstract boolean doAnimationFrame(long);
-
-
-}
-
--keep class android.animation.AnimationHandler$AnimationFrameCallbackProvider {
-
- public abstract long getFrameDelay();
- public abstract long getFrameTime();
- public abstract void postCommitCallback(java.lang.Runnable);
- public abstract void postFrameCallback(android.view.Choreographer$FrameCallback);
- public abstract void setFrameDelay(long);
-
-
-}
-
--keep class android.animation.Animator {
- <init>();
-
- public void addListener(android.animation.Animator$AnimatorListener);
- public void addPauseListener(android.animation.Animator$AnimatorPauseListener);
- public void appendChangingConfigurations(int);
- public boolean canReverse();
- public void cancel();
- public android.animation.Animator clone();
- public java.lang.Object clone();
- public android.content.res.ConstantState createConstantState();
- public void end();
- public int getChangingConfigurations();
- public abstract long getDuration();
- public android.animation.TimeInterpolator getInterpolator();
- public java.util.ArrayList getListeners();
- public abstract long getStartDelay();
- public long getTotalDuration();
- public boolean isPaused();
- public abstract boolean isRunning();
- public boolean isStarted();
- public void pause();
- public void removeAllListeners();
- public void removeListener(android.animation.Animator$AnimatorListener);
- public void removePauseListener(android.animation.Animator$AnimatorPauseListener);
- public void resume();
- public void reverse();
- public void setAllowRunningAsynchronously(boolean);
- public void setChangingConfigurations(int);
- public abstract android.animation.Animator setDuration(long);
- public abstract void setInterpolator(android.animation.TimeInterpolator);
- public abstract void setStartDelay(long);
- public void setTarget(java.lang.Object);
- public void setupEndValues();
- public void setupStartValues();
- public void start();
-
-
- public static long DURATION_INFINITE;
-}
-
--keep class android.animation.Animator$AnimatorListener {
-
- public abstract void onAnimationCancel(android.animation.Animator);
- public void onAnimationEnd(android.animation.Animator, boolean);
- public abstract void onAnimationEnd(android.animation.Animator);
- public abstract void onAnimationRepeat(android.animation.Animator);
- public void onAnimationStart(android.animation.Animator, boolean);
- public abstract void onAnimationStart(android.animation.Animator);
-
-
-}
-
--keep class android.animation.Animator$AnimatorPauseListener {
-
- public abstract void onAnimationPause(android.animation.Animator);
- public abstract void onAnimationResume(android.animation.Animator);
-
-
-}
-
--keep class android.animation.AnimatorSet {
- <init>();
-
- public boolean canReverse();
- public void cancel();
- public android.animation.AnimatorSet clone();
- public android.animation.Animator clone();
- public java.lang.Object clone();
- public void commitAnimationFrame(long);
- public boolean doAnimationFrame(long);
- public void end();
- public int getChangingConfigurations();
- public java.util.ArrayList getChildAnimations();
- public long getCurrentPlayTime();
- public long getDuration();
- public android.animation.TimeInterpolator getInterpolator();
- public long getStartDelay();
- public long getTotalDuration();
- public boolean isRunning();
- public boolean isStarted();
- public void pause();
- public android.animation.AnimatorSet$Builder play(android.animation.Animator);
- public void playSequentially(android.animation.Animator[]);
- public void playSequentially(java.util.List);
- public void playTogether(android.animation.Animator[]);
- public void playTogether(java.util.Collection);
- public void resume();
- public void reverse();
- public void setCurrentPlayTime(long);
- public android.animation.AnimatorSet setDuration(long);
- public android.animation.Animator setDuration(long);
- public void setInterpolator(android.animation.TimeInterpolator);
- public void setStartDelay(long);
- public void setTarget(java.lang.Object);
- public void setupEndValues();
- public void setupStartValues();
- public boolean shouldPlayTogether();
- public void start();
- public java.lang.String toString();
-
-
-}
-
--keep class android.animation.AnimatorSet$Builder {
-
- public android.animation.AnimatorSet$Builder after(android.animation.Animator);
- public android.animation.AnimatorSet$Builder after(long);
- public android.animation.AnimatorSet$Builder before(android.animation.Animator);
- public android.animation.AnimatorSet$Builder with(android.animation.Animator);
-
-
-}
-
--keep class android.animation.Keyframe {
- <init>();
-
- public abstract android.animation.Keyframe clone();
- public java.lang.Object clone();
- public float getFraction();
- public android.animation.TimeInterpolator getInterpolator();
- public java.lang.Class getType();
- public abstract java.lang.Object getValue();
- public boolean hasValue();
- public static android.animation.Keyframe ofFloat(float, float);
- public static android.animation.Keyframe ofFloat(float);
- public static android.animation.Keyframe ofInt(float, int);
- public static android.animation.Keyframe ofInt(float);
- public static android.animation.Keyframe ofObject(float, java.lang.Object);
- public static android.animation.Keyframe ofObject(float);
- public void setFraction(float);
- public void setInterpolator(android.animation.TimeInterpolator);
- public abstract void setValue(java.lang.Object);
-
-
-}
-
--keep class android.animation.LayoutTransition {
- <init>();
-
- public void addChild(android.view.ViewGroup, android.view.View);
- public void addTransitionListener(android.animation.LayoutTransition$TransitionListener);
- public void cancel();
- public void cancel(int);
- public void disableTransitionType(int);
- public void enableTransitionType(int);
- public void endChangingAnimations();
- public android.animation.Animator getAnimator(int);
- public long getDuration(int);
- public android.animation.TimeInterpolator getInterpolator(int);
- public long getStagger(int);
- public long getStartDelay(int);
- public java.util.List getTransitionListeners();
- public void hideChild(android.view.ViewGroup, android.view.View);
- public void hideChild(android.view.ViewGroup, android.view.View, int);
- public boolean isChangingLayout();
- public boolean isRunning();
- public boolean isTransitionTypeEnabled(int);
- public void layoutChange(android.view.ViewGroup);
- public void removeChild(android.view.ViewGroup, android.view.View);
- public void removeTransitionListener(android.animation.LayoutTransition$TransitionListener);
- public void setAnimateParentHierarchy(boolean);
- public void setAnimator(int, android.animation.Animator);
- public void setDuration(long);
- public void setDuration(int, long);
- public void setInterpolator(int, android.animation.TimeInterpolator);
- public void setStagger(int, long);
- public void setStartDelay(int, long);
- public void showChild(android.view.ViewGroup, android.view.View);
- public void showChild(android.view.ViewGroup, android.view.View, int);
- public void startChangingAnimations();
-
-
- public static int APPEARING;
- public static int CHANGE_APPEARING;
- public static int CHANGE_DISAPPEARING;
- public static int CHANGING;
- public static int DISAPPEARING;
-}
-
--keep class android.animation.LayoutTransition$TransitionListener {
-
- public abstract void endTransition(android.animation.LayoutTransition, android.view.ViewGroup, android.view.View, int);
- public abstract void startTransition(android.animation.LayoutTransition, android.view.ViewGroup, android.view.View, int);
-
-
-}
-
--keep class android.animation.PropertyValuesHolder {
-
- public android.animation.PropertyValuesHolder clone();
- public java.lang.Object clone();
- public java.lang.String getPropertyName();
- public void getPropertyValues(android.animation.PropertyValuesHolder$PropertyValues);
- public java.lang.Class getValueType();
- public static android.animation.PropertyValuesHolder ofFloat(java.lang.String, float[]);
- public static android.animation.PropertyValuesHolder ofFloat(android.util.Property, float[]);
- public static android.animation.PropertyValuesHolder ofInt(java.lang.String, int[]);
- public static android.animation.PropertyValuesHolder ofInt(android.util.Property, int[]);
- public static android.animation.PropertyValuesHolder ofKeyframe(java.lang.String, android.animation.Keyframe[]);
- public static android.animation.PropertyValuesHolder ofKeyframe(android.util.Property, android.animation.Keyframe[]);
- public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, float[][]);
- public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.graphics.Path);
- public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.animation.TypeConverter, android.animation.TypeEvaluator, java.lang.Object[]);
- public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.animation.TypeConverter, android.animation.TypeEvaluator, android.animation.Keyframe[]);
- public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, int[][]);
- public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.graphics.Path);
- public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.animation.TypeConverter, android.animation.TypeEvaluator, java.lang.Object[]);
- public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.animation.TypeConverter, android.animation.TypeEvaluator, android.animation.Keyframe[]);
- public static android.animation.PropertyValuesHolder ofObject(java.lang.String, android.animation.TypeEvaluator, java.lang.Object[]);
- public static android.animation.PropertyValuesHolder ofObject(java.lang.String, android.animation.TypeConverter, android.graphics.Path);
- public static android.animation.PropertyValuesHolder ofObject(android.util.Property, android.animation.TypeEvaluator, java.lang.Object[]);
- public static android.animation.PropertyValuesHolder ofObject(android.util.Property, android.animation.TypeConverter, android.animation.TypeEvaluator, java.lang.Object[]);
- public static android.animation.PropertyValuesHolder ofObject(android.util.Property, android.animation.TypeConverter, android.graphics.Path);
- public void setConverter(android.animation.TypeConverter);
- public void setEvaluator(android.animation.TypeEvaluator);
- public void setFloatValues(float[]);
- public void setIntValues(int[]);
- public void setKeyframes(android.animation.Keyframe[]);
- public void setObjectValues(java.lang.Object[]);
- public void setProperty(android.util.Property);
- public void setPropertyName(java.lang.String);
- public java.lang.String toString();
-
-
- protected android.util.Property mProperty;
-}
-
--keep class android.animation.PropertyValuesHolder$PropertyValues {
- <init>();
-
- public java.lang.String toString();
-
-
- public android.animation.PropertyValuesHolder$PropertyValues$DataSource dataSource;
- public java.lang.Object endValue;
- public java.lang.String propertyName;
- public java.lang.Object startValue;
- public java.lang.Class type;
-}
-
--keep class android.animation.PropertyValuesHolder$PropertyValues$DataSource {
-
- public abstract java.lang.Object getValueAtFraction(float);
-
-
-}
-
--keep class android.animation.StateListAnimator {
- <init>();
-
- public void addState(int[], android.animation.Animator);
- public void appendChangingConfigurations(int);
- public android.animation.StateListAnimator clone();
- public java.lang.Object clone();
- public android.content.res.ConstantState createConstantState();
- public int getChangingConfigurations();
- public android.animation.Animator getRunningAnimator();
- public android.view.View getTarget();
- public java.util.ArrayList getTuples();
- public void jumpToCurrentState();
- public void setChangingConfigurations(int);
- public void setState(int[]);
- public void setTarget(android.view.View);
-
-
-}
-
--keep class android.animation.StateListAnimator$Tuple {
-
- public android.animation.Animator getAnimator();
- public int[] getSpecs();
-
-
-}
-
--keep class android.animation.TimeInterpolator {
-
- public abstract float getInterpolation(float);
-
-
-}
-
--keep class android.animation.TypeConverter {
- <init>(java.lang.Class, java.lang.Class);
-
- public abstract java.lang.Object convert(java.lang.Object);
-
-
-}
-
--keep class android.animation.TypeEvaluator {
-
- public abstract java.lang.Object evaluate(float, java.lang.Object, java.lang.Object);
-
-
-}
-
--keep class android.animation.ValueAnimator {
- <init>();
-
- public void addUpdateListener(android.animation.ValueAnimator$AnimatorUpdateListener);
- public static boolean areAnimatorsEnabled();
- public boolean canReverse();
- public void cancel();
- public android.animation.ValueAnimator clone();
- public android.animation.Animator clone();
- public java.lang.Object clone();
- public void commitAnimationFrame(long);
- public boolean doAnimationFrame(long);
- public void end();
- public float getAnimatedFraction();
- public java.lang.Object getAnimatedValue();
- public java.lang.Object getAnimatedValue(java.lang.String);
- public android.animation.AnimationHandler getAnimationHandler();
- public static int getCurrentAnimationsCount();
- public long getCurrentPlayTime();
- public long getDuration();
- public static float getDurationScale();
- public static long getFrameDelay();
- public android.animation.TimeInterpolator getInterpolator();
- public int getRepeatCount();
- public int getRepeatMode();
- public long getStartDelay();
- public long getTotalDuration();
- public android.animation.PropertyValuesHolder[] getValues();
- public boolean isRunning();
- public boolean isStarted();
- public static android.animation.ValueAnimator ofArgb(int[]);
- public static android.animation.ValueAnimator ofFloat(float[]);
- public static android.animation.ValueAnimator ofInt(int[]);
- public static android.animation.ValueAnimator ofObject(android.animation.TypeEvaluator, java.lang.Object[]);
- public static android.animation.ValueAnimator ofPropertyValuesHolder(android.animation.PropertyValuesHolder[]);
- public void overrideDurationScale(float);
- public void pause();
- public void removeAllUpdateListeners();
- public void removeUpdateListener(android.animation.ValueAnimator$AnimatorUpdateListener);
- public void resume();
- public void reverse();
- public void setAllowRunningAsynchronously(boolean);
- public void setCurrentFraction(float);
- public void setCurrentPlayTime(long);
- public android.animation.ValueAnimator setDuration(long);
- public android.animation.Animator setDuration(long);
- public static void setDurationScale(float);
- public void setEvaluator(android.animation.TypeEvaluator);
- public void setFloatValues(float[]);
- public static void setFrameDelay(long);
- public void setIntValues(int[]);
- public void setInterpolator(android.animation.TimeInterpolator);
- public void setObjectValues(java.lang.Object[]);
- public void setRepeatCount(int);
- public void setRepeatMode(int);
- public void setStartDelay(long);
- public void setValues(android.animation.PropertyValuesHolder[]);
- public void start();
- public java.lang.String toString();
-
-
- public static int INFINITE;
- public static int RESTART;
- public static int REVERSE;
-}
-
--keep class android.animation.ValueAnimator$AnimatorUpdateListener {
-
- public abstract void onAnimationUpdate(android.animation.ValueAnimator);
-
-
-}
-
--keep class android.app.ActionBar {
- <init>();
-
- public abstract void addOnMenuVisibilityListener(android.app.ActionBar$OnMenuVisibilityListener);
- public abstract void addTab(android.app.ActionBar$Tab);
- public abstract void addTab(android.app.ActionBar$Tab, boolean);
- public abstract void addTab(android.app.ActionBar$Tab, int);
- public abstract void addTab(android.app.ActionBar$Tab, int, boolean);
- public boolean closeOptionsMenu();
- public boolean collapseActionView();
- public void dispatchMenuVisibilityChanged(boolean);
- public abstract android.view.View getCustomView();
- public abstract int getDisplayOptions();
- public float getElevation();
- public abstract int getHeight();
- public int getHideOffset();
- public abstract int getNavigationItemCount();
- public abstract int getNavigationMode();
- public abstract int getSelectedNavigationIndex();
- public abstract android.app.ActionBar$Tab getSelectedTab();
- public abstract java.lang.CharSequence getSubtitle();
- public abstract android.app.ActionBar$Tab getTabAt(int);
- public abstract int getTabCount();
- public android.content.Context getThemedContext();
- public abstract java.lang.CharSequence getTitle();
- public abstract void hide();
- public boolean invalidateOptionsMenu();
- public boolean isHideOnContentScrollEnabled();
- public abstract boolean isShowing();
- public boolean isTitleTruncated();
- public abstract android.app.ActionBar$Tab newTab();
- public void onConfigurationChanged(android.content.res.Configuration);
- public void onDestroy();
- public boolean onKeyShortcut(int, android.view.KeyEvent);
- public boolean onMenuKeyEvent(android.view.KeyEvent);
- public boolean openOptionsMenu();
- public abstract void removeAllTabs();
- public abstract void removeOnMenuVisibilityListener(android.app.ActionBar$OnMenuVisibilityListener);
- public abstract void removeTab(android.app.ActionBar$Tab);
- public abstract void removeTabAt(int);
- public abstract void selectTab(android.app.ActionBar$Tab);
- public abstract void setBackgroundDrawable(android.graphics.drawable.Drawable);
- public abstract void setCustomView(android.view.View);
- public abstract void setCustomView(android.view.View, android.app.ActionBar$LayoutParams);
- public abstract void setCustomView(int);
- public void setDefaultDisplayHomeAsUpEnabled(boolean);
- public abstract void setDisplayHomeAsUpEnabled(boolean);
- public abstract void setDisplayOptions(int);
- public abstract void setDisplayOptions(int, int);
- public abstract void setDisplayShowCustomEnabled(boolean);
- public abstract void setDisplayShowHomeEnabled(boolean);
- public abstract void setDisplayShowTitleEnabled(boolean);
- public abstract void setDisplayUseLogoEnabled(boolean);
- public void setElevation(float);
- public void setHideOffset(int);
- public void setHideOnContentScrollEnabled(boolean);
- public void setHomeActionContentDescription(java.lang.CharSequence);
- public void setHomeActionContentDescription(int);
- public void setHomeAsUpIndicator(android.graphics.drawable.Drawable);
- public void setHomeAsUpIndicator(int);
- public void setHomeButtonEnabled(boolean);
- public abstract void setIcon(int);
- public abstract void setIcon(android.graphics.drawable.Drawable);
- public abstract void setListNavigationCallbacks(android.widget.SpinnerAdapter, android.app.ActionBar$OnNavigationListener);
- public abstract void setLogo(int);
- public abstract void setLogo(android.graphics.drawable.Drawable);
- public abstract void setNavigationMode(int);
- public abstract void setSelectedNavigationItem(int);
- public void setShowHideAnimationEnabled(boolean);
- public void setSplitBackgroundDrawable(android.graphics.drawable.Drawable);
- public void setStackedBackgroundDrawable(android.graphics.drawable.Drawable);
- public abstract void setSubtitle(java.lang.CharSequence);
- public abstract void setSubtitle(int);
- public abstract void setTitle(java.lang.CharSequence);
- public abstract void setTitle(int);
- public void setWindowTitle(java.lang.CharSequence);
- public abstract void show();
- public android.view.ActionMode startActionMode(android.view.ActionMode$Callback);
-
-
- public static int DISPLAY_HOME_AS_UP;
- public static int DISPLAY_SHOW_CUSTOM;
- public static int DISPLAY_SHOW_HOME;
- public static int DISPLAY_SHOW_TITLE;
- public static int DISPLAY_TITLE_MULTIPLE_LINES;
- public static int DISPLAY_USE_LOGO;
- public static int NAVIGATION_MODE_LIST;
- public static int NAVIGATION_MODE_STANDARD;
- public static int NAVIGATION_MODE_TABS;
-}
-
--keep class android.app.ActionBar$LayoutParams {
- <init>(android.content.Context, android.util.AttributeSet);
- <init>(int, int);
- <init>(int, int, int);
- <init>(int);
- <init>(android.app.ActionBar$LayoutParams);
- <init>(android.view.ViewGroup$LayoutParams);
-
- protected void encodeProperties(android.view.ViewHierarchyEncoder);
-
-
- public int gravity;
-}
-
--keep class android.app.ActionBar$OnMenuVisibilityListener {
-
- public abstract void onMenuVisibilityChanged(boolean);
-
-
-}
-
--keep class android.app.ActionBar$OnNavigationListener {
-
- public abstract boolean onNavigationItemSelected(int, long);
-
-
-}
-
--keep class android.app.ActionBar$Tab {
- <init>();
-
- public abstract java.lang.CharSequence getContentDescription();
- public abstract android.view.View getCustomView();
- public abstract android.graphics.drawable.Drawable getIcon();
- public abstract int getPosition();
- public abstract java.lang.Object getTag();
- public abstract java.lang.CharSequence getText();
- public abstract void select();
- public abstract android.app.ActionBar$Tab setContentDescription(int);
- public abstract android.app.ActionBar$Tab setContentDescription(java.lang.CharSequence);
- public abstract android.app.ActionBar$Tab setCustomView(android.view.View);
- public abstract android.app.ActionBar$Tab setCustomView(int);
- public abstract android.app.ActionBar$Tab setIcon(android.graphics.drawable.Drawable);
- public abstract android.app.ActionBar$Tab setIcon(int);
- public abstract android.app.ActionBar$Tab setTabListener(android.app.ActionBar$TabListener);
- public abstract android.app.ActionBar$Tab setTag(java.lang.Object);
- public abstract android.app.ActionBar$Tab setText(java.lang.CharSequence);
- public abstract android.app.ActionBar$Tab setText(int);
-
-
- public static int INVALID_POSITION;
-}
-
--keep class android.app.ActionBar$TabListener {
-
- public abstract void onTabReselected(android.app.ActionBar$Tab, android.app.FragmentTransaction);
- public abstract void onTabSelected(android.app.ActionBar$Tab, android.app.FragmentTransaction);
- public abstract void onTabUnselected(android.app.ActionBar$Tab, android.app.FragmentTransaction);
-
-
-}
-
--keep class android.app.Activity {
- <init>();
-
- public void addContentView(android.view.View, android.view.ViewGroup$LayoutParams);
- protected void attachBaseContext(android.content.Context);
- public void autofillClientAuthenticate(int, android.content.IntentSender, android.content.Intent);
- public void autofillClientDispatchUnhandledKey(android.view.View, android.view.KeyEvent);
- public android.view.View autofillClientFindViewByAccessibilityIdTraversal(int, int);
- public android.view.View autofillClientFindViewByAutofillIdTraversal(android.view.autofill.AutofillId);
- public android.view.View[] autofillClientFindViewsByAutofillIdTraversal(android.view.autofill.AutofillId[]);
- public android.os.IBinder autofillClientGetActivityToken();
- public android.content.ComponentName autofillClientGetComponentName();
- public android.view.autofill.AutofillId autofillClientGetNextAutofillId();
- public boolean[] autofillClientGetViewVisibility(android.view.autofill.AutofillId[]);
- public boolean autofillClientIsCompatibilityModeEnabled();
- public boolean autofillClientIsFillUiShowing();
- public boolean autofillClientIsVisibleForAutofill();
- public boolean autofillClientRequestHideFillUi();
- public boolean autofillClientRequestShowFillUi(android.view.View, int, int, android.graphics.Rect, android.view.autofill.IAutofillWindowPresenter);
- public void autofillClientResetableStateAvailable();
- public void autofillClientRunOnUiThread(java.lang.Runnable);
- public boolean canStartActivityForResult();
- public void closeContextMenu();
- public void closeOptionsMenu();
- public void convertFromTranslucent();
- public boolean convertToTranslucent(android.app.Activity$TranslucentConversionListener, android.app.ActivityOptions);
- public android.app.PendingIntent createPendingResult(int, android.content.Intent, int);
- public void dismissDialog(int);
- public void dismissKeyboardShortcutsHelper();
- public void dispatchEnterAnimationComplete();
- public boolean dispatchGenericMotionEvent(android.view.MotionEvent);
- public boolean dispatchKeyEvent(android.view.KeyEvent);
- public boolean dispatchKeyShortcutEvent(android.view.KeyEvent);
- public boolean dispatchPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
- public boolean dispatchTouchEvent(android.view.MotionEvent);
- public boolean dispatchTrackballEvent(android.view.MotionEvent);
- public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
- public void enterPictureInPictureMode();
- public boolean enterPictureInPictureMode(android.app.PictureInPictureArgs);
- public boolean enterPictureInPictureMode(android.app.PictureInPictureParams);
- public void enterPictureInPictureModeIfPossible();
- public void exitFreeformMode();
- public android.view.View findViewById(int);
- public void finish();
- public void finishActivity(int);
- public void finishActivityFromChild(android.app.Activity, int);
- public void finishAffinity();
- public void finishAfterTransition();
- public void finishAndRemoveTask();
- public void finishFromChild(android.app.Activity);
- public android.app.ActionBar getActionBar();
- public android.app.ActivityThread getActivityThread();
- public android.os.IBinder getActivityToken();
- public android.app.Application getApplication();
- public android.view.autofill.AutofillManager$AutofillClient getAutofillClient();
- public android.content.ComponentName getCallingActivity();
- public java.lang.String getCallingPackage();
- public int getChangingConfigurations();
- public android.content.ComponentName getComponentName();
- public android.transition.Scene getContentScene();
- public android.transition.TransitionManager getContentTransitionManager();
- public android.view.View getCurrentFocus();
- public android.app.FragmentManager getFragmentManager();
- public android.content.Intent getIntent();
- public java.lang.Object getLastNonConfigurationInstance();
- public android.view.LayoutInflater getLayoutInflater();
- public android.app.LoaderManager getLoaderManager();
- public java.lang.String getLocalClassName();
- public int getMaxNumPictureInPictureActions();
- public android.media.session.MediaController getMediaController();
- public android.view.MenuInflater getMenuInflater();
- public int getNextAutofillId();
- public android.app.Activity getParent();
- public android.content.Intent getParentActivityIntent();
- public android.content.SharedPreferences getPreferences(int);
- public android.net.Uri getReferrer();
- public int getRequestedOrientation();
- public android.view.SearchEvent getSearchEvent();
- public java.lang.Object getSystemService(java.lang.String);
- public int getTaskId();
- public java.lang.CharSequence getTitle();
- public int getTitleColor();
- public android.app.VoiceInteractor getVoiceInteractor();
- public int getVolumeControlStream();
- public android.view.Window getWindow();
- public android.view.WindowManager getWindowManager();
- public boolean hasWindowFocus();
- public void invalidateOptionsMenu();
- public boolean isActivityTransitionRunning();
- public boolean isBackgroundVisibleBehind();
- public boolean isChangingConfigurations();
- public boolean isChild();
- public boolean isDestroyed();
- public boolean isDisablingEnterExitEventForAutofill();
- public boolean isFinishing();
- public boolean isImmersive();
- public boolean isInMultiWindowMode();
- public boolean isInPictureInPictureMode();
- public boolean isLocalVoiceInteractionSupported();
- public boolean isOverlayWithDecorCaptionEnabled();
- public boolean isResumed();
- public boolean isTaskRoot();
- public boolean isVoiceInteraction();
- public boolean isVoiceInteractionRoot();
- public android.database.Cursor managedQuery(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String);
- public android.database.Cursor managedQuery(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
- public boolean moveTaskToBack(boolean);
- public boolean navigateUpTo(android.content.Intent);
- public boolean navigateUpToFromChild(android.app.Activity, android.content.Intent);
- public void onActionModeFinished(android.view.ActionMode);
- public void onActionModeStarted(android.view.ActionMode);
- public void onActivityReenter(int, android.content.Intent);
- protected void onActivityResult(int, int, android.content.Intent);
- protected void onApplyThemeResource(android.content.res.Resources$Theme, int, boolean);
- public void onAttachFragment(android.app.Fragment);
- public void onAttachedToWindow();
- public void onBackPressed();
- public void onBackgroundVisibleBehindChanged(boolean);
- protected void onChildTitleChanged(android.app.Activity, java.lang.CharSequence);
- public void onConfigurationChanged(android.content.res.Configuration);
- public void onContentChanged();
- public boolean onContextItemSelected(android.view.MenuItem);
- public void onContextMenuClosed(android.view.Menu);
- protected void onCreate(android.os.Bundle);
- public void onCreate(android.os.Bundle, android.os.PersistableBundle);
- public void onCreateContextMenu(android.view.ContextMenu, android.view.View, android.view.ContextMenu$ContextMenuInfo);
- public java.lang.CharSequence onCreateDescription();
- protected android.app.Dialog onCreateDialog(int);
- protected android.app.Dialog onCreateDialog(int, android.os.Bundle);
- public void onCreateNavigateUpTaskStack(android.app.TaskStackBuilder);
- public boolean onCreateOptionsMenu(android.view.Menu);
- public boolean onCreatePanelMenu(int, android.view.Menu);
- public android.view.View onCreatePanelView(int);
- public boolean onCreateThumbnail(android.graphics.Bitmap, android.graphics.Canvas);
- public android.view.View onCreateView(java.lang.String, android.content.Context, android.util.AttributeSet);
- public android.view.View onCreateView(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet);
- protected void onDestroy();
- public void onDetachedFromWindow();
- public void onEnterAnimationComplete();
- public boolean onGenericMotionEvent(android.view.MotionEvent);
- public boolean onKeyDown(int, android.view.KeyEvent);
- public boolean onKeyLongPress(int, android.view.KeyEvent);
- public boolean onKeyMultiple(int, int, android.view.KeyEvent);
- public boolean onKeyShortcut(int, android.view.KeyEvent);
- public boolean onKeyUp(int, android.view.KeyEvent);
- public void onLocalVoiceInteractionStarted();
- public void onLocalVoiceInteractionStopped();
- public void onLowMemory();
- public boolean onMenuItemSelected(int, android.view.MenuItem);
- public boolean onMenuOpened(int, android.view.Menu);
- public void onMovedToDisplay(int, android.content.res.Configuration);
- public void onMultiWindowModeChanged(boolean, android.content.res.Configuration);
- public void onMultiWindowModeChanged(boolean);
- public boolean onNavigateUp();
- public boolean onNavigateUpFromChild(android.app.Activity);
- public void onNewActivityOptions(android.app.ActivityOptions);
- protected void onNewIntent(android.content.Intent);
- public boolean onOptionsItemSelected(android.view.MenuItem);
- public void onOptionsMenuClosed(android.view.Menu);
- public void onPanelClosed(int, android.view.Menu);
- protected void onPause();
- public void onPictureInPictureModeChanged(boolean, android.content.res.Configuration);
- public void onPictureInPictureModeChanged(boolean);
- protected void onPostCreate(android.os.Bundle);
- public void onPostCreate(android.os.Bundle, android.os.PersistableBundle);
- protected void onPostResume();
- protected void onPrepareDialog(int, android.app.Dialog);
- protected void onPrepareDialog(int, android.app.Dialog, android.os.Bundle);
- public void onPrepareNavigateUpTaskStack(android.app.TaskStackBuilder);
- public boolean onPrepareOptionsMenu(android.view.Menu);
- public boolean onPreparePanel(int, android.view.View, android.view.Menu);
- public void onProvideAssistContent(android.app.assist.AssistContent);
- public void onProvideAssistData(android.os.Bundle);
- public void onProvideKeyboardShortcuts(java.util.List, android.view.Menu, int);
- public android.net.Uri onProvideReferrer();
- public void onRequestPermissionsResult(int, java.lang.String[], int[]);
- protected void onRestart();
- protected void onRestoreInstanceState(android.os.Bundle);
- public void onRestoreInstanceState(android.os.Bundle, android.os.PersistableBundle);
- protected void onResume();
- public java.lang.Object onRetainNonConfigurationInstance();
- protected void onSaveInstanceState(android.os.Bundle);
- public void onSaveInstanceState(android.os.Bundle, android.os.PersistableBundle);
- public boolean onSearchRequested(android.view.SearchEvent);
- public boolean onSearchRequested();
- protected void onStart();
- public void onStateNotSaved();
- protected void onStop();
- protected void onTitleChanged(java.lang.CharSequence, int);
- public boolean onTouchEvent(android.view.MotionEvent);
- public boolean onTrackballEvent(android.view.MotionEvent);
- public void onTrimMemory(int);
- public void onUserInteraction();
- protected void onUserLeaveHint();
- public void onVisibleBehindCanceled();
- public void onWindowAttributesChanged(android.view.WindowManager$LayoutParams);
- public void onWindowDismissed(boolean, boolean);
- public void onWindowFocusChanged(boolean);
- public android.view.ActionMode onWindowStartingActionMode(android.view.ActionMode$Callback);
- public android.view.ActionMode onWindowStartingActionMode(android.view.ActionMode$Callback, int);
- public void openContextMenu(android.view.View);
- public void openOptionsMenu();
- public void overridePendingTransition(int, int);
- public void postponeEnterTransition();
- public void recreate();
- public void registerForContextMenu(android.view.View);
- public void registerRemoteAnimations(android.view.RemoteAnimationDefinition);
- public boolean releaseInstance();
- public void removeDialog(int);
- public void reportFullyDrawn();
- public android.view.DragAndDropPermissions requestDragAndDropPermissions(android.view.DragEvent);
- public void requestPermissions(java.lang.String[], int);
- public void requestShowKeyboardShortcuts();
- public boolean requestVisibleBehind(boolean);
- public boolean requestWindowFeature(int);
- public android.view.View requireViewById(int);
- public void runOnUiThread(java.lang.Runnable);
- public void setActionBar(android.widget.Toolbar);
- public void setContentTransitionManager(android.transition.TransitionManager);
- public void setContentView(int);
- public void setContentView(android.view.View);
- public void setContentView(android.view.View, android.view.ViewGroup$LayoutParams);
- public void setDefaultKeyMode(int);
- public void setDisablePreviewScreenshots(boolean);
- public void setEnterSharedElementCallback(android.app.SharedElementCallback);
- public void setExitSharedElementCallback(android.app.SharedElementCallback);
- public void setFeatureDrawable(int, android.graphics.drawable.Drawable);
- public void setFeatureDrawableAlpha(int, int);
- public void setFeatureDrawableResource(int, int);
- public void setFeatureDrawableUri(int, android.net.Uri);
- public void setFinishOnTouchOutside(boolean);
- public void setImmersive(boolean);
- public void setIntent(android.content.Intent);
- public void setMediaController(android.media.session.MediaController);
- public void setOverlayWithDecorCaptionEnabled(boolean);
- public void setPersistent(boolean);
- public void setPictureInPictureArgs(android.app.PictureInPictureArgs);
- public void setPictureInPictureParams(android.app.PictureInPictureParams);
- public void setProgress(int);
- public void setProgressBarIndeterminate(boolean);
- public void setProgressBarIndeterminateVisibility(boolean);
- public void setProgressBarVisibility(boolean);
- public void setRequestedOrientation(int);
- public void setResult(int);
- public void setResult(int, android.content.Intent);
- public void setSecondaryProgress(int);
- public void setShowWhenLocked(boolean);
- public void setTaskDescription(android.app.ActivityManager$TaskDescription);
- public void setTheme(int);
- public void setTitle(java.lang.CharSequence);
- public void setTitle(int);
- public void setTitleColor(int);
- public void setTurnScreenOn(boolean);
- public void setVisible(boolean);
- public void setVolumeControlStream(int);
- public void setVrModeEnabled(boolean, android.content.ComponentName);
- public boolean shouldShowRequestPermissionRationale(java.lang.String);
- public boolean shouldUpRecreateTask(android.content.Intent);
- public boolean showAssist(android.os.Bundle);
- public void showDialog(int);
- public boolean showDialog(int, android.os.Bundle);
- public void showLockTaskEscapeMessage();
- public android.view.ActionMode startActionMode(android.view.ActionMode$Callback);
- public android.view.ActionMode startActionMode(android.view.ActionMode$Callback, int);
- public void startActivities(android.content.Intent[]);
- public void startActivities(android.content.Intent[], android.os.Bundle);
- public void startActivity(android.content.Intent);
- public void startActivity(android.content.Intent, android.os.Bundle);
- public void startActivityAsCaller(android.content.Intent, android.os.Bundle, boolean, int);
- public void startActivityAsUser(android.content.Intent, android.os.UserHandle);
- public void startActivityAsUser(android.content.Intent, android.os.Bundle, android.os.UserHandle);
- public void startActivityAsUserFromFragment(android.app.Fragment, android.content.Intent, int, android.os.Bundle, android.os.UserHandle);
- public void startActivityForResult(android.content.Intent, int);
- public void startActivityForResult(android.content.Intent, int, android.os.Bundle);
- public void startActivityForResult(java.lang.String, android.content.Intent, int, android.os.Bundle);
- public void startActivityForResultAsUser(android.content.Intent, int, android.os.UserHandle);
- public void startActivityForResultAsUser(android.content.Intent, int, android.os.Bundle, android.os.UserHandle);
- public void startActivityForResultAsUser(android.content.Intent, java.lang.String, int, android.os.Bundle, android.os.UserHandle);
- public void startActivityFromChild(android.app.Activity, android.content.Intent, int);
- public void startActivityFromChild(android.app.Activity, android.content.Intent, int, android.os.Bundle);
- public void startActivityFromFragment(android.app.Fragment, android.content.Intent, int);
- public void startActivityFromFragment(android.app.Fragment, android.content.Intent, int, android.os.Bundle);
- public boolean startActivityIfNeeded(android.content.Intent, int);
- public boolean startActivityIfNeeded(android.content.Intent, int, android.os.Bundle);
- public void startIntentSender(android.content.IntentSender, android.content.Intent, int, int, int);
- public void startIntentSender(android.content.IntentSender, android.content.Intent, int, int, int, android.os.Bundle);
- public void startIntentSenderForResult(android.content.IntentSender, int, android.content.Intent, int, int, int);
- public void startIntentSenderForResult(android.content.IntentSender, int, android.content.Intent, int, int, int, android.os.Bundle);
- public void startIntentSenderFromChild(android.app.Activity, android.content.IntentSender, int, android.content.Intent, int, int, int);
- public void startIntentSenderFromChild(android.app.Activity, android.content.IntentSender, int, android.content.Intent, int, int, int, android.os.Bundle);
- public void startIntentSenderFromChildFragment(android.app.Fragment, android.content.IntentSender, int, android.content.Intent, int, int, int, android.os.Bundle);
- public void startLocalVoiceInteraction(android.os.Bundle);
- public void startLockTask();
- public void startManagingCursor(android.database.Cursor);
- public boolean startNextMatchingActivity(android.content.Intent);
- public boolean startNextMatchingActivity(android.content.Intent, android.os.Bundle);
- public void startPostponedEnterTransition();
- public void startSearch(java.lang.String, boolean, android.os.Bundle, boolean);
- public void stopLocalVoiceInteraction();
- public void stopLockTask();
- public void stopManagingCursor(android.database.Cursor);
- public void takeKeyEvents(boolean);
- public void triggerSearch(java.lang.String, android.os.Bundle);
- public void unregisterForContextMenu(android.view.View);
-
-
- public static int DEFAULT_KEYS_DIALER;
- public static int DEFAULT_KEYS_DISABLE;
- public static int DEFAULT_KEYS_SEARCH_GLOBAL;
- public static int DEFAULT_KEYS_SEARCH_LOCAL;
- public static int DEFAULT_KEYS_SHORTCUT;
- public static int DONT_FINISH_TASK_WITH_ACTIVITY;
- public static int FINISH_TASK_WITH_ACTIVITY;
- public static int FINISH_TASK_WITH_ROOT_ACTIVITY;
- protected static int[] FOCUSED_STATE_SET;
- public static int RESULT_CANCELED;
- public static int RESULT_FIRST_USER;
- public static int RESULT_OK;
-}
-
--keep class android.app.Activity$NonConfigurationInstances {
-
-
-
-}
-
--keep class android.app.Activity$TranslucentConversionListener {
-
- public abstract void onTranslucentConversionComplete(boolean);
-
-
-}
-
--keep class android.app.ActivityManager {
-
- public int addAppTask(android.app.Activity, android.content.Intent, android.app.ActivityManager$TaskDescription, android.graphics.Bitmap);
- public void addOnUidImportanceListener(android.app.ActivityManager$OnUidImportanceListener, int);
- public void alwaysShowUnsupportedCompileSdkWarning(android.content.ComponentName);
- public static void broadcastStickyIntent(android.content.Intent, int);
- public static void broadcastStickyIntent(android.content.Intent, int, int);
- public static int checkComponentPermission(java.lang.String, int, int, boolean);
- public static int checkUidPermission(java.lang.String, int);
- public boolean clearApplicationUserData(java.lang.String, android.content.pm.IPackageDataObserver);
- public boolean clearApplicationUserData();
- public void clearGrantedUriPermissions(java.lang.String);
- public void clearWatchHeapLimit();
- public void dumpPackageState(java.io.FileDescriptor, java.lang.String);
- public static void dumpPackageStateStatic(java.io.FileDescriptor, java.lang.String);
- public void forceStopPackage(java.lang.String);
- public void forceStopPackageAsUser(java.lang.String, int);
- public android.util.Size getAppTaskThumbnailSize();
- public java.util.List getAppTasks();
- public static int getCurrentUser();
- public static int getDefaultAppRecentsLimitStatic();
- public android.content.pm.ConfigurationInfo getDeviceConfigurationInfo();
- public int getFrontActivityScreenCompatMode();
- public android.content.pm.ParceledListSlice getGrantedUriPermissions(java.lang.String);
- public int getLargeMemoryClass();
- public int getLauncherLargeIconDensity();
- public int getLauncherLargeIconSize();
- public int getLockTaskModeState();
- public static int getMaxAppRecentsLimitStatic();
- public static int getMaxNumPictureInPictureActions();
- public static int getMaxRecentTasksStatic();
- public int getMemoryClass();
- public void getMemoryInfo(android.app.ActivityManager$MemoryInfo);
- public static void getMyMemoryState(android.app.ActivityManager$RunningAppProcessInfo);
- public boolean getPackageAskScreenCompat(java.lang.String);
- public int getPackageImportance(java.lang.String);
- public int getPackageScreenCompatMode(java.lang.String);
- public android.os.Debug$MemoryInfo[] getProcessMemoryInfo(int[]);
- public java.util.List getProcessesInErrorState();
- public java.util.List getRecentTasks(int, int);
- public java.util.List getRunningAppProcesses();
- public java.util.List getRunningExternalApplications();
- public android.app.PendingIntent getRunningServiceControlPanel(android.content.ComponentName);
- public java.util.List getRunningServices(int);
- public java.util.List getRunningTasks(int);
- public static android.app.IActivityManager getService();
- public long getTotalRam();
- public int getUidImportance(int);
- public static int handleIncomingUser(int, int, int, boolean, boolean, java.lang.String, java.lang.String);
- public boolean isBackgroundRestricted();
- public static boolean isHighEndGfx();
- public boolean isInLockTaskMode();
- public boolean isLowRamDevice();
- public static boolean isLowRamDeviceStatic();
- public static boolean isProcStateBackground(int);
- public static boolean isRunningInTestHarness();
- public static boolean isSmallBatteryDevice();
- public static boolean isStartResultFatalError(int);
- public static boolean isStartResultSuccessful(int);
- public static boolean isSystemReady();
- public static boolean isUserAMonkey();
- public boolean isUserRunning(int);
- public boolean isVrModePackageEnabled(android.content.ComponentName);
- public void killBackgroundProcesses(java.lang.String);
- public void killUid(int, java.lang.String);
- public static void logoutCurrentUser();
- public void moveTaskToFront(int, int);
- public void moveTaskToFront(int, int, android.os.Bundle);
- public static void noteAlarmFinish(android.app.PendingIntent, android.os.WorkSource, int, java.lang.String);
- public static void noteAlarmStart(android.app.PendingIntent, android.os.WorkSource, int, java.lang.String);
- public static void noteWakeupAlarm(android.app.PendingIntent, android.os.WorkSource, int, java.lang.String, java.lang.String);
- public static int processStateAmToProto(int);
- public void removeOnUidImportanceListener(android.app.ActivityManager$OnUidImportanceListener);
- public void removeStacksInWindowingModes(int[]);
- public void removeStacksWithActivityTypes(int[]);
- public void resizeStack(int, android.graphics.Rect);
- public void restartPackage(java.lang.String);
- public void setFrontActivityScreenCompatMode(int);
- public void setPackageAskScreenCompat(java.lang.String, boolean);
- public void setPackageScreenCompatMode(java.lang.String, int);
- public static void setPersistentVrThread(int);
- public boolean setProcessMemoryTrimLevel(java.lang.String, int, int);
- public void setTaskWindowingMode(int, int, boolean);
- public void setTaskWindowingModeSplitScreenPrimary(int, int, boolean, boolean, android.graphics.Rect, boolean);
- public static void setVrThread(int);
- public void setWatchHeapLimit(long);
- public static int staticGetLargeMemoryClass();
- public static int staticGetMemoryClass();
- public static boolean supportsMultiWindow(android.content.Context);
- public static boolean supportsSplitScreenMultiWindow(android.content.Context);
- public boolean switchUser(int);
-
-
- public static java.lang.String ACTION_REPORT_HEAP_LIMIT;
- public static int APP_START_MODE_DELAYED;
- public static int APP_START_MODE_DELAYED_RIGID;
- public static int APP_START_MODE_DISABLED;
- public static int APP_START_MODE_NORMAL;
- public static int ASSIST_CONTEXT_AUTOFILL;
- public static int ASSIST_CONTEXT_BASIC;
- public static int ASSIST_CONTEXT_FULL;
- public static int BROADCAST_FAILED_USER_STOPPED;
- public static int BROADCAST_STICKY_CANT_HAVE_PERMISSION;
- public static int BROADCAST_SUCCESS;
- public static int BUGREPORT_OPTION_FULL;
- public static int BUGREPORT_OPTION_INTERACTIVE;
- public static int BUGREPORT_OPTION_REMOTE;
- public static int BUGREPORT_OPTION_TELEPHONY;
- public static int BUGREPORT_OPTION_WEAR;
- public static int BUGREPORT_OPTION_WIFI;
- public static int COMPAT_MODE_ALWAYS;
- public static int COMPAT_MODE_DISABLED;
- public static int COMPAT_MODE_ENABLED;
- public static int COMPAT_MODE_NEVER;
- public static int COMPAT_MODE_TOGGLE;
- public static int COMPAT_MODE_UNKNOWN;
- public static int FLAG_AND_LOCKED;
- public static int FLAG_AND_UNLOCKED;
- public static int FLAG_AND_UNLOCKING_OR_UNLOCKED;
- public static int FLAG_OR_STOPPED;
- public static int INTENT_SENDER_ACTIVITY;
- public static int INTENT_SENDER_ACTIVITY_RESULT;
- public static int INTENT_SENDER_BROADCAST;
- public static int INTENT_SENDER_FOREGROUND_SERVICE;
- public static int INTENT_SENDER_SERVICE;
- public static int LOCK_TASK_MODE_LOCKED;
- public static int LOCK_TASK_MODE_NONE;
- public static int LOCK_TASK_MODE_PINNED;
- public static int MAX_PROCESS_STATE;
- public static java.lang.String META_HOME_ALTERNATE;
- public static int MIN_PROCESS_STATE;
- public static int MOVE_TASK_NO_USER_ACTION;
- public static int MOVE_TASK_WITH_HOME;
- public static int PROCESS_STATE_BACKUP;
- public static int PROCESS_STATE_BOUND_FOREGROUND_SERVICE;
- public static int PROCESS_STATE_CACHED_ACTIVITY;
- public static int PROCESS_STATE_CACHED_ACTIVITY_CLIENT;
- public static int PROCESS_STATE_CACHED_EMPTY;
- public static int PROCESS_STATE_CACHED_RECENT;
- public static int PROCESS_STATE_FOREGROUND_SERVICE;
- public static int PROCESS_STATE_HEAVY_WEIGHT;
- public static int PROCESS_STATE_HOME;
- public static int PROCESS_STATE_IMPORTANT_BACKGROUND;
- public static int PROCESS_STATE_IMPORTANT_FOREGROUND;
- public static int PROCESS_STATE_LAST_ACTIVITY;
- public static int PROCESS_STATE_NONEXISTENT;
- public static int PROCESS_STATE_PERSISTENT;
- public static int PROCESS_STATE_PERSISTENT_UI;
- public static int PROCESS_STATE_RECEIVER;
- public static int PROCESS_STATE_SERVICE;
- public static int PROCESS_STATE_TOP;
- public static int PROCESS_STATE_TOP_SLEEPING;
- public static int PROCESS_STATE_TRANSIENT_BACKGROUND;
- public static int PROCESS_STATE_UNKNOWN;
- public static int RECENT_IGNORE_UNAVAILABLE;
- public static int RECENT_WITH_EXCLUDED;
- public static int RESIZE_MODE_FORCED;
- public static int RESIZE_MODE_PRESERVE_WINDOW;
- public static int RESIZE_MODE_SYSTEM;
- public static int RESIZE_MODE_SYSTEM_SCREEN_ROTATION;
- public static int RESIZE_MODE_USER;
- public static int RESIZE_MODE_USER_FORCED;
- public static int SPLIT_SCREEN_CREATE_MODE_BOTTOM_OR_RIGHT;
- public static int SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT;
- public static int START_ABORTED;
- public static int START_ASSISTANT_HIDDEN_SESSION;
- public static int START_ASSISTANT_NOT_ACTIVE_SESSION;
- public static int START_CANCELED;
- public static int START_CLASS_NOT_FOUND;
- public static int START_DELIVERED_TO_TOP;
- public static int START_FLAG_DEBUG;
- public static int START_FLAG_NATIVE_DEBUGGING;
- public static int START_FLAG_ONLY_IF_NEEDED;
- public static int START_FLAG_TRACK_ALLOCATION;
- public static int START_FORWARD_AND_REQUEST_CONFLICT;
- public static int START_INTENT_NOT_RESOLVED;
- public static int START_NOT_ACTIVITY;
- public static int START_NOT_CURRENT_USER_ACTIVITY;
- public static int START_NOT_VOICE_COMPATIBLE;
- public static int START_PERMISSION_DENIED;
- public static int START_RETURN_INTENT_TO_CALLER;
- public static int START_RETURN_LOCK_TASK_MODE_VIOLATION;
- public static int START_SUCCESS;
- public static int START_SWITCHES_CANCELED;
- public static int START_TASK_TO_FRONT;
- public static int START_VOICE_HIDDEN_SESSION;
- public static int START_VOICE_NOT_ACTIVE_SESSION;
- public static int UID_OBSERVER_ACTIVE;
- public static int UID_OBSERVER_CACHED;
- public static int UID_OBSERVER_GONE;
- public static int UID_OBSERVER_IDLE;
- public static int UID_OBSERVER_PROCSTATE;
- public static int USER_OP_ERROR_IS_SYSTEM;
- public static int USER_OP_ERROR_RELATED_USERS_CANNOT_STOP;
- public static int USER_OP_IS_CURRENT;
- public static int USER_OP_SUCCESS;
- public static int USER_OP_UNKNOWN_USER;
-}
-
--keep class android.app.ActivityManager$AppTask {
- <init>(android.app.IAppTask);
-
- public void finishAndRemoveTask();
- public android.app.ActivityManager$RecentTaskInfo getTaskInfo();
- public void moveToFront();
- public void setExcludeFromRecents(boolean);
- public void startActivity(android.content.Context, android.content.Intent, android.os.Bundle);
-
-
-}
-
--keep class android.app.ActivityManager$MemoryInfo {
- <init>();
-
- public int describeContents();
- public void readFromParcel(android.os.Parcel);
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public long availMem;
- public long foregroundAppThreshold;
- public long hiddenAppThreshold;
- public boolean lowMemory;
- public long secondaryServerThreshold;
- public long threshold;
- public long totalMem;
- public long visibleAppThreshold;
-}
-
--keep class android.app.ActivityManager$OnUidImportanceListener {
-
- public abstract void onUidImportance(int, int);
-
-
-}
-
--keep class android.app.ActivityManager$ProcessErrorStateInfo {
- <init>();
-
- public int describeContents();
- public void readFromParcel(android.os.Parcel);
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static int CRASHED;
- public static android.os.Parcelable$Creator CREATOR;
- public static int NOT_RESPONDING;
- public static int NO_ERROR;
- public int condition;
- public byte[] crashData;
- public java.lang.String longMsg;
- public int pid;
- public java.lang.String processName;
- public java.lang.String shortMsg;
- public java.lang.String stackTrace;
- public java.lang.String tag;
- public int uid;
-}
-
--keep class android.app.ActivityManager$RecentTaskInfo {
- <init>();
-
- public int describeContents();
- public void readFromParcel(android.os.Parcel);
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public int affiliatedTaskColor;
- public int affiliatedTaskId;
- public android.content.ComponentName baseActivity;
- public android.content.Intent baseIntent;
- public android.graphics.Rect bounds;
- public android.content.res.Configuration configuration;
- public java.lang.CharSequence description;
- public long firstActiveTime;
- public int id;
- public long lastActiveTime;
- public int numActivities;
- public android.content.ComponentName origActivity;
- public int persistentId;
- public android.content.ComponentName realActivity;
- public int resizeMode;
- public int stackId;
- public boolean supportsSplitScreenMultiWindow;
- public android.app.ActivityManager$TaskDescription taskDescription;
- public android.content.ComponentName topActivity;
- public int userId;
-}
-
--keep class android.app.ActivityManager$RunningAppProcessInfo {
- <init>();
- <init>(java.lang.String, int, java.lang.String[]);
-
- public int describeContents();
- public static int importanceToProcState(int);
- public static int procStateToImportance(int);
- public static int procStateToImportanceForClient(int, android.content.Context);
- public static int procStateToImportanceForTargetSdk(int, int);
- public void readFromParcel(android.os.Parcel);
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public static int FLAG_CANT_SAVE_STATE;
- public static int FLAG_HAS_ACTIVITIES;
- public static int FLAG_PERSISTENT;
- public static int IMPORTANCE_BACKGROUND;
- public static int IMPORTANCE_CACHED;
- public static int IMPORTANCE_CANT_SAVE_STATE;
- public static int IMPORTANCE_CANT_SAVE_STATE_PRE_26;
- public static int IMPORTANCE_EMPTY;
- public static int IMPORTANCE_FOREGROUND;
- public static int IMPORTANCE_FOREGROUND_SERVICE;
- public static int IMPORTANCE_GONE;
- public static int IMPORTANCE_PERCEPTIBLE;
- public static int IMPORTANCE_PERCEPTIBLE_PRE_26;
- public static int IMPORTANCE_SERVICE;
- public static int IMPORTANCE_TOP_SLEEPING;
- public static int IMPORTANCE_TOP_SLEEPING_PRE_28;
- public static int IMPORTANCE_VISIBLE;
- public static int REASON_PROVIDER_IN_USE;
- public static int REASON_SERVICE_IN_USE;
- public static int REASON_UNKNOWN;
- public int flags;
- public int importance;
- public int importanceReasonCode;
- public android.content.ComponentName importanceReasonComponent;
- public int importanceReasonImportance;
- public int importanceReasonPid;
- public int lastTrimLevel;
- public int lru;
- public int pid;
- public java.lang.String[] pkgList;
- public java.lang.String processName;
- public int processState;
- public int uid;
-}
-
--keep class android.app.ActivityManager$RunningServiceInfo {
- <init>();
-
- public int describeContents();
- public void readFromParcel(android.os.Parcel);
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public static int FLAG_FOREGROUND;
- public static int FLAG_PERSISTENT_PROCESS;
- public static int FLAG_STARTED;
- public static int FLAG_SYSTEM_PROCESS;
- public long activeSince;
- public int clientCount;
- public int clientLabel;
- public java.lang.String clientPackage;
- public int crashCount;
- public int flags;
- public boolean foreground;
- public long lastActivityTime;
- public int pid;
- public java.lang.String process;
- public long restarting;
- public android.content.ComponentName service;
- public boolean started;
- public int uid;
-}
-
--keep class android.app.ActivityManager$RunningTaskInfo {
- <init>();
-
- public int describeContents();
- public void readFromParcel(android.os.Parcel);
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public android.content.ComponentName baseActivity;
- public android.content.res.Configuration configuration;
- public java.lang.CharSequence description;
- public int id;
- public long lastActiveTime;
- public int numActivities;
- public int numRunning;
- public int resizeMode;
- public int stackId;
- public boolean supportsSplitScreenMultiWindow;
- public android.graphics.Bitmap thumbnail;
- public android.content.ComponentName topActivity;
-}
-
--keep class android.app.ActivityManager$StackInfo {
- <init>();
-
- public int describeContents();
- public void readFromParcel(android.os.Parcel);
- public java.lang.String toString(java.lang.String);
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public android.graphics.Rect bounds;
- public android.content.res.Configuration configuration;
- public int displayId;
- public int position;
- public int stackId;
- public android.graphics.Rect[] taskBounds;
- public int[] taskIds;
- public java.lang.String[] taskNames;
- public int[] taskUserIds;
- public android.content.ComponentName topActivity;
- public int userId;
- public boolean visible;
-}
-
--keep class android.app.ActivityManager$TaskDescription {
- <init>(java.lang.String, android.graphics.Bitmap, int);
- <init>(java.lang.String, int, int);
- <init>(java.lang.String, android.graphics.Bitmap);
- <init>(java.lang.String, int);
- <init>(java.lang.String);
- <init>();
- <init>(java.lang.String, android.graphics.Bitmap, int, java.lang.String, int, int, int, int);
- <init>(android.app.ActivityManager$TaskDescription);
-
- public void copyFrom(android.app.ActivityManager$TaskDescription);
- public void copyFromPreserveHiddenFields(android.app.ActivityManager$TaskDescription);
- public int describeContents();
- public int getBackgroundColor();
- public android.graphics.Bitmap getIcon();
- public java.lang.String getIconFilename();
- public int getIconResource();
- public android.graphics.Bitmap getInMemoryIcon();
- public java.lang.String getLabel();
- public int getNavigationBarColor();
- public int getPrimaryColor();
- public int getStatusBarColor();
- public static android.graphics.Bitmap loadTaskDescriptionIcon(java.lang.String, int);
- public void readFromParcel(android.os.Parcel);
- public void restoreFromXml(java.lang.String, java.lang.String);
- public void saveToXml(org.xmlpull.v1.XmlSerializer);
- public void setBackgroundColor(int);
- public void setIcon(android.graphics.Bitmap);
- public void setIcon(int);
- public void setIconFilename(java.lang.String);
- public void setLabel(java.lang.String);
- public void setNavigationBarColor(int);
- public void setPrimaryColor(int);
- public void setStatusBarColor(int);
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static java.lang.String ATTR_TASKDESCRIPTION_PREFIX;
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.app.ActivityManager$TaskSnapshot {
- <init>(android.graphics.GraphicBuffer, int, android.graphics.Rect, boolean, float, boolean, int, int, boolean);
-
- public int describeContents();
- public android.graphics.Rect getContentInsets();
- public int getOrientation();
- public float getScale();
- public android.graphics.GraphicBuffer getSnapshot();
- public int getSystemUiVisibility();
- public int getWindowingMode();
- public boolean isRealSnapshot();
- public boolean isReducedResolution();
- public boolean isTranslucent();
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.app.ActivityOptions {
- <init>(android.os.Bundle);
-
- public void abort();
- public static void abort(android.app.ActivityOptions);
- public boolean canTaskOverlayResume();
- public boolean disallowEnterPictureInPictureWhileLaunching();
- public android.app.ActivityOptions forTargetActivity();
- public static android.app.ActivityOptions fromBundle(android.os.Bundle);
- public android.view.AppTransitionAnimationSpec[] getAnimSpecs();
- public android.os.IRemoteCallback getAnimationFinishedListener();
- public int getAnimationType();
- public boolean getAvoidMoveToFront();
- public int getCustomEnterResId();
- public int getCustomExitResId();
- public int getCustomInPlaceResId();
- public int getExitCoordinatorKey();
- public int getHeight();
- public int getLaunchActivityType();
- public android.graphics.Rect getLaunchBounds();
- public int getLaunchDisplayId();
- public boolean getLaunchTaskBehind();
- public int getLaunchTaskId();
- public int getLaunchWindowingMode();
- public boolean getLockTaskMode();
- public android.os.IRemoteCallback getOnAnimationStartListener();
- public java.lang.String getPackageName();
- public android.view.RemoteAnimationAdapter getRemoteAnimationAdapter();
- public int getResultCode();
- public android.content.Intent getResultData();
- public android.os.ResultReceiver getResultReceiver();
- public int getRotationAnimationHint();
- public java.util.ArrayList getSharedElementNames();
- public android.view.IAppTransitionAnimationSpecsFuture getSpecsFuture();
- public int getSplitScreenCreateMode();
- public int getStartX();
- public int getStartY();
- public boolean getTaskOverlay();
- public android.graphics.GraphicBuffer getThumbnail();
- public android.app.PendingIntent getUsageTimeReport();
- public int getWidth();
- public boolean isReturning();
- public static android.app.ActivityOptions makeBasic();
- public static android.app.ActivityOptions makeClipRevealAnimation(android.view.View, int, int, int, int);
- public static android.app.ActivityOptions makeCustomAnimation(android.content.Context, int, int);
- public static android.app.ActivityOptions makeCustomAnimation(android.content.Context, int, int, android.os.Handler, android.app.ActivityOptions$OnAnimationStartedListener);
- public static android.app.ActivityOptions makeCustomInPlaceAnimation(android.content.Context, int);
- public static android.app.ActivityOptions makeMultiThumbFutureAspectScaleAnimation(android.content.Context, android.os.Handler, android.view.IAppTransitionAnimationSpecsFuture, android.app.ActivityOptions$OnAnimationStartedListener, boolean);
- public static android.app.ActivityOptions makeOpenCrossProfileAppsAnimation();
- public static android.app.ActivityOptions makeRemoteAnimation(android.view.RemoteAnimationAdapter);
- public static android.app.ActivityOptions makeScaleUpAnimation(android.view.View, int, int, int, int);
- public static android.app.ActivityOptions makeSceneTransitionAnimation(android.app.Activity, android.view.View, java.lang.String);
- public static android.app.ActivityOptions makeSceneTransitionAnimation(android.app.Activity, android.util.Pair[]);
- public static android.app.ActivityOptions makeTaskLaunchBehind();
- public static android.app.ActivityOptions makeThumbnailAspectScaleDownAnimation(android.view.View, android.graphics.Bitmap, int, int, int, int, android.os.Handler, android.app.ActivityOptions$OnAnimationStartedListener);
- public static android.app.ActivityOptions makeThumbnailAspectScaleDownAnimation(android.view.View, android.view.AppTransitionAnimationSpec[], android.os.Handler, android.app.ActivityOptions$OnAnimationStartedListener, android.app.ActivityOptions$OnAnimationFinishedListener);
- public static android.app.ActivityOptions makeThumbnailScaleUpAnimation(android.view.View, android.graphics.Bitmap, int, int);
- public android.os.Bundle popAppVerificationBundle();
- public void requestUsageTimeReport(android.app.PendingIntent);
- public android.app.ActivityOptions setAppVerificationBundle(android.os.Bundle);
- public void setAvoidMoveToFront();
- public void setDisallowEnterPictureInPictureWhileLaunching(boolean);
- public void setLaunchActivityType(int);
- public android.app.ActivityOptions setLaunchBounds(android.graphics.Rect);
- public android.app.ActivityOptions setLaunchDisplayId(int);
- public void setLaunchTaskId(int);
- public void setLaunchWindowingMode(int);
- public android.app.ActivityOptions setLockTaskEnabled(boolean);
- public void setRemoteAnimationAdapter(android.view.RemoteAnimationAdapter);
- public void setRotationAnimationHint(int);
- public void setSplitScreenCreateMode(int);
- public void setTaskOverlay(boolean, boolean);
- public static android.app.ActivityOptions startSharedElementAnimation(android.view.Window, android.util.Pair[]);
- public static void stopSharedElementAnimation(android.view.Window);
- public android.os.Bundle toBundle();
- public java.lang.String toString();
- public void update(android.app.ActivityOptions);
-
-
- public static int ANIM_CLIP_REVEAL;
- public static int ANIM_CUSTOM;
- public static int ANIM_CUSTOM_IN_PLACE;
- public static int ANIM_DEFAULT;
- public static int ANIM_LAUNCH_TASK_BEHIND;
- public static int ANIM_NONE;
- public static int ANIM_OPEN_CROSS_PROFILE_APPS;
- public static int ANIM_REMOTE_ANIMATION;
- public static int ANIM_SCALE_UP;
- public static int ANIM_SCENE_TRANSITION;
- public static int ANIM_THUMBNAIL_ASPECT_SCALE_DOWN;
- public static int ANIM_THUMBNAIL_ASPECT_SCALE_UP;
- public static int ANIM_THUMBNAIL_SCALE_DOWN;
- public static int ANIM_THUMBNAIL_SCALE_UP;
- public static java.lang.String EXTRA_USAGE_TIME_REPORT;
- public static java.lang.String EXTRA_USAGE_TIME_REPORT_PACKAGES;
- public static java.lang.String KEY_ANIM_ENTER_RES_ID;
- public static java.lang.String KEY_ANIM_EXIT_RES_ID;
- public static java.lang.String KEY_ANIM_HEIGHT;
- public static java.lang.String KEY_ANIM_IN_PLACE_RES_ID;
- public static java.lang.String KEY_ANIM_START_LISTENER;
- public static java.lang.String KEY_ANIM_START_X;
- public static java.lang.String KEY_ANIM_START_Y;
- public static java.lang.String KEY_ANIM_THUMBNAIL;
- public static java.lang.String KEY_ANIM_TYPE;
- public static java.lang.String KEY_ANIM_WIDTH;
- public static java.lang.String KEY_LAUNCH_BOUNDS;
- public static java.lang.String KEY_PACKAGE_NAME;
-}
-
--keep class android.app.ActivityOptions$OnAnimationFinishedListener {
-
- public abstract void onAnimationFinished();
-
-
-}
-
--keep class android.app.ActivityOptions$OnAnimationStartedListener {
-
- public abstract void onAnimationStarted();
-
-
-}
-
--keep class android.app.ActivityThread {
-
- public android.content.IContentProvider acquireExistingProvider(android.content.Context, java.lang.String, int, boolean);
- public android.content.IContentProvider acquireProvider(android.content.Context, java.lang.String, int, boolean);
- public void applyConfigurationToResources(android.content.res.Configuration);
- public static android.app.ActivityThread currentActivityThread();
- public static android.app.Application currentApplication();
- public static java.lang.String currentOpPackageName();
- public static java.lang.String currentPackageName();
- public static java.lang.String currentProcessName();
- public static void dumpMemInfoTable(java.io.PrintWriter, android.os.Debug$MemoryInfo, boolean, boolean, boolean, boolean, int, java.lang.String, long, long, long, long, long, long);
- public static void dumpMemInfoTable(android.util.proto.ProtoOutputStream, android.os.Debug$MemoryInfo, boolean, boolean, long, long, long, long, long, long);
- public android.app.Activity getActivity(android.os.IBinder);
- public android.app.ActivityThread$ActivityClientRecord getActivityClient(android.os.IBinder);
- public android.app.Application getApplication();
- public android.app.ActivityThread$ApplicationThread getApplicationThread();
- public java.util.concurrent.Executor getExecutor();
- public android.app.Instrumentation getInstrumentation();
- public int getIntCoreSetting(java.lang.String, int);
- public static android.content.Intent getIntentBeingBroadcast();
- public android.os.Looper getLooper();
- public android.app.LoadedApk getPackageInfo(java.lang.String, android.content.res.CompatibilityInfo, int);
- public android.app.LoadedApk getPackageInfo(java.lang.String, android.content.res.CompatibilityInfo, int, int);
- public android.app.LoadedApk getPackageInfo(android.content.pm.ApplicationInfo, android.content.res.CompatibilityInfo, int);
- public android.app.LoadedApk getPackageInfoNoCheck(android.content.pm.ApplicationInfo, android.content.res.CompatibilityInfo);
- public static android.content.pm.IPackageManager getPackageManager();
- public java.lang.String getProcessName();
- public java.lang.String getProfileFilePath();
- public android.app.ContextImpl getSystemContext();
- public android.app.ContextImpl getSystemUiContext();
- public void handleActivityConfigurationChanged(android.os.IBinder, android.content.res.Configuration, int);
- public void handleConfigurationChanged(android.content.res.Configuration);
- public void handleDestroyActivity(android.os.IBinder, boolean, int, boolean, java.lang.String);
- public void handleInstallProvider(android.content.pm.ProviderInfo);
- public android.app.Activity handleLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.app.servertransaction.PendingTransactionActions, android.content.Intent);
- public void handleMultiWindowModeChanged(android.os.IBinder, boolean, android.content.res.Configuration);
- public void handleNewIntent(android.os.IBinder, java.util.List, boolean);
- public void handlePauseActivity(android.os.IBinder, boolean, boolean, int, android.app.servertransaction.PendingTransactionActions, java.lang.String);
- public void handlePictureInPictureModeChanged(android.os.IBinder, boolean, android.content.res.Configuration);
- public void handleRelaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.app.servertransaction.PendingTransactionActions);
- public void handleRequestAssistContextExtras(android.app.ActivityThread$RequestAssistContextExtras);
- public void handleResumeActivity(android.os.IBinder, boolean, boolean, java.lang.String);
- public void handleSendResult(android.os.IBinder, java.util.List, java.lang.String);
- public void handleStartActivity(android.app.ActivityThread$ActivityClientRecord, android.app.servertransaction.PendingTransactionActions);
- public void handleStopActivity(android.os.IBinder, boolean, int, android.app.servertransaction.PendingTransactionActions, boolean, java.lang.String);
- public void handleTranslucentConversionComplete(android.os.IBinder, boolean);
- public void handleWindowVisibility(android.os.IBinder, boolean);
- public void installSystemApplicationInfo(android.content.pm.ApplicationInfo, java.lang.ClassLoader);
- public void installSystemProviders(java.util.List);
- public boolean isProfiling();
- public static boolean isSystem();
- public static void main(java.lang.String[]);
- public void onNewActivityOptions(android.os.IBinder, android.app.ActivityOptions);
- public android.app.LoadedApk peekPackageInfo(java.lang.String, boolean);
- public void performRestartActivity(android.os.IBinder, boolean);
- public android.app.ActivityThread$ActivityClientRecord performResumeActivity(android.os.IBinder, boolean, java.lang.String);
- public android.app.ActivityThread$ActivityClientRecord prepareRelaunchActivity(android.os.IBinder, java.util.List, java.util.List, int, android.util.MergedConfiguration, boolean);
- public void registerOnActivityPausedListener(android.app.Activity, android.app.OnActivityPausedListener);
- public boolean releaseProvider(android.content.IContentProvider, boolean);
- public void reportRelaunch(android.os.IBinder, android.app.servertransaction.PendingTransactionActions);
- public void reportStop(android.app.servertransaction.PendingTransactionActions);
- public android.content.pm.ActivityInfo resolveActivityInfo(android.content.Intent);
- public void sendActivityResult(android.os.IBinder, java.lang.String, int, int, android.content.Intent);
- public android.app.Activity startActivityNow(android.app.Activity, java.lang.String, android.content.Intent, android.content.pm.ActivityInfo, android.os.IBinder, android.os.Bundle, android.app.Activity$NonConfigurationInstances);
- public void stopProfiling();
- public static android.app.ActivityThread systemMain();
- public void unregisterOnActivityPausedListener(android.app.Activity, android.app.OnActivityPausedListener);
- public void updatePendingConfiguration(android.content.res.Configuration);
- public void updateProcessState(int, boolean);
-
-
- public static boolean DEBUG_BROADCAST;
- public static boolean DEBUG_CONFIGURATION;
- public static boolean DEBUG_MEMORY_TRIM;
- public static boolean DEBUG_ORDER;
- public static long INVALID_PROC_STATE_SEQ;
- public static java.lang.String PROC_START_SEQ_IDENT;
- public static int SERVICE_DONE_EXECUTING_ANON;
- public static int SERVICE_DONE_EXECUTING_START;
- public static int SERVICE_DONE_EXECUTING_STOP;
- public static java.lang.String TAG;
-}
-
--keep class android.app.ActivityThread$ActivityClientRecord {
- <init>();
- <init>(android.os.IBinder, android.content.Intent, int, android.content.pm.ActivityInfo, android.content.res.Configuration, android.content.res.CompatibilityInfo, java.lang.String, com.android.internal.app.IVoiceInteractor, android.os.Bundle, android.os.PersistableBundle, java.util.List, java.util.List, boolean, android.app.ProfilerInfo, android.app.ClientTransactionHandler);
-
- public int getLifecycleState();
- public java.lang.String getStateString();
- public boolean isPersistable();
- public boolean isVisibleFromServer();
- public void setState(int);
- public java.lang.String toString();
-
-
- public boolean isForward;
- public android.app.LoadedApk packageInfo;
- public android.os.IBinder token;
-}
-
--keep class android.app.ActivityThread$ApplicationThread {
-
- public void attachAgent(java.lang.String);
- public void bindApplication(java.lang.String, android.content.pm.ApplicationInfo, java.util.List, android.content.ComponentName, android.app.ProfilerInfo, android.os.Bundle, android.app.IInstrumentationWatcher, android.app.IUiAutomationConnection, int, boolean, boolean, boolean, boolean, android.content.res.Configuration, android.content.res.CompatibilityInfo, java.util.Map, android.os.Bundle, java.lang.String, boolean);
- public void clearDnsCache();
- public void dispatchPackageBroadcast(int, java.lang.String[]);
- public void dumpActivity(android.os.ParcelFileDescriptor, android.os.IBinder, java.lang.String, java.lang.String[]);
- public void dumpDbInfo(android.os.ParcelFileDescriptor, java.lang.String[]);
- public void dumpGfxInfo(android.os.ParcelFileDescriptor, java.lang.String[]);
- public void dumpHeap(boolean, boolean, boolean, java.lang.String, android.os.ParcelFileDescriptor);
- public void dumpMemInfo(android.os.ParcelFileDescriptor, android.os.Debug$MemoryInfo, boolean, boolean, boolean, boolean, boolean, java.lang.String[]);
- public void dumpMemInfoProto(android.os.ParcelFileDescriptor, android.os.Debug$MemoryInfo, boolean, boolean, boolean, boolean, java.lang.String[]);
- public void dumpProvider(android.os.ParcelFileDescriptor, android.os.IBinder, java.lang.String[]);
- public void dumpService(android.os.ParcelFileDescriptor, android.os.IBinder, java.lang.String[]);
- public void handleTrustStorageUpdate();
- public void notifyCleartextNetwork(byte[]);
- public void processInBackground();
- public void profilerControl(boolean, android.app.ProfilerInfo, int);
- public void requestAssistContextExtras(android.os.IBinder, android.os.IBinder, int, int, int);
- public void runIsolatedEntryPoint(java.lang.String, java.lang.String[]);
- public void scheduleApplicationInfoChanged(android.content.pm.ApplicationInfo);
- public void scheduleBindService(android.os.IBinder, android.content.Intent, boolean, int);
- public void scheduleCrash(java.lang.String);
- public void scheduleCreateBackupAgent(android.content.pm.ApplicationInfo, android.content.res.CompatibilityInfo, int);
- public void scheduleCreateService(android.os.IBinder, android.content.pm.ServiceInfo, android.content.res.CompatibilityInfo, int);
- public void scheduleDestroyBackupAgent(android.content.pm.ApplicationInfo, android.content.res.CompatibilityInfo);
- public void scheduleEnterAnimationComplete(android.os.IBinder);
- public void scheduleExit();
- public void scheduleInstallProvider(android.content.pm.ProviderInfo);
- public void scheduleLocalVoiceInteractionStarted(android.os.IBinder, com.android.internal.app.IVoiceInteractor);
- public void scheduleLowMemory();
- public void scheduleOnNewActivityOptions(android.os.IBinder, android.os.Bundle);
- public void scheduleReceiver(android.content.Intent, android.content.pm.ActivityInfo, android.content.res.CompatibilityInfo, int, java.lang.String, android.os.Bundle, boolean, int, int);
- public void scheduleRegisteredReceiver(android.content.IIntentReceiver, android.content.Intent, int, java.lang.String, android.os.Bundle, boolean, boolean, int, int);
- public void scheduleServiceArgs(android.os.IBinder, android.content.pm.ParceledListSlice);
- public void scheduleSleeping(android.os.IBinder, boolean);
- public void scheduleStopService(android.os.IBinder);
- public void scheduleSuicide();
- public void scheduleTransaction(android.app.servertransaction.ClientTransaction);
- public void scheduleTranslucentConversionComplete(android.os.IBinder, boolean);
- public void scheduleTrimMemory(int);
- public void scheduleUnbindService(android.os.IBinder, android.content.Intent);
- public void setCoreSettings(android.os.Bundle);
- public void setHttpProxy(java.lang.String, java.lang.String, java.lang.String, android.net.Uri);
- public void setNetworkBlockSeq(long);
- public void setProcessState(int);
- public void setSchedulingGroup(int);
- public void startBinderTracking();
- public void stopBinderTrackingAndDump(android.os.ParcelFileDescriptor);
- public void unstableProviderDied(android.os.IBinder);
- public void updatePackageCompatibilityInfo(java.lang.String, android.content.res.CompatibilityInfo);
- public void updateProcessState(int, boolean);
- public void updateTimePrefs(int);
- public void updateTimeZone();
-
-
-}
-
--keep class android.app.ActivityThread$RequestAssistContextExtras {
-
-
-
-}
-
--keep class android.app.AppComponentFactory {
- <init>();
-
- public android.app.Activity instantiateActivity(java.lang.ClassLoader, java.lang.String, android.content.Intent);
- public android.app.Application instantiateApplication(java.lang.ClassLoader, java.lang.String);
- public android.content.ContentProvider instantiateProvider(java.lang.ClassLoader, java.lang.String);
- public android.content.BroadcastReceiver instantiateReceiver(java.lang.ClassLoader, java.lang.String, android.content.Intent);
- public android.app.Service instantiateService(java.lang.ClassLoader, java.lang.String, android.content.Intent);
-
-
- public static android.app.AppComponentFactory DEFAULT;
-}
-
--keep class android.app.AppOpsManager {
-
- public int checkAudioOp(int, int, int, java.lang.String);
- public int checkAudioOpNoThrow(int, int, int, java.lang.String);
- public int checkOp(java.lang.String, int, java.lang.String);
- public int checkOp(int, int, java.lang.String);
- public int checkOpNoThrow(java.lang.String, int, java.lang.String);
- public int checkOpNoThrow(int, int, java.lang.String);
- public void checkPackage(int, java.lang.String);
- public void finishOp(java.lang.String, int, java.lang.String);
- public void finishOp(int, int, java.lang.String);
- public void finishOp(int);
- public static java.lang.String[] getOpStrs();
- public java.util.List getOpsForPackage(int, java.lang.String, int[]);
- public java.util.List getPackagesForOps(int[]);
- public static android.os.IBinder getToken(com.android.internal.app.IAppOpsService);
- public boolean isOperationActive(int, int, java.lang.String);
- public static long maxTime(long[], int, int);
- public static java.lang.String modeToName(int);
- public int noteOp(java.lang.String, int, java.lang.String);
- public int noteOp(int, int, java.lang.String);
- public int noteOp(int);
- public int noteOpNoThrow(java.lang.String, int, java.lang.String);
- public int noteOpNoThrow(int, int, java.lang.String);
- public int noteProxyOp(java.lang.String, java.lang.String);
- public int noteProxyOp(int, java.lang.String);
- public int noteProxyOpNoThrow(java.lang.String, java.lang.String);
- public int noteProxyOpNoThrow(int, java.lang.String);
- public static boolean opAllowSystemBypassRestriction(int);
- public static boolean opAllowsReset(int);
- public static int opToDefaultMode(int);
- public static java.lang.String opToName(int);
- public static java.lang.String opToPermission(int);
- public static java.lang.String opToRestriction(int);
- public static int opToSwitch(int);
- public static java.lang.String permissionToOp(java.lang.String);
- public static int permissionToOpCode(java.lang.String);
- public void resetAllModes();
- public void setMode(int, int, java.lang.String, int);
- public void setMode(java.lang.String, int, java.lang.String, int);
- public void setRestriction(int, int, int, java.lang.String[]);
- public void setUidMode(int, int, int);
- public void setUidMode(java.lang.String, int, int);
- public void setUserRestriction(int, boolean, android.os.IBinder);
- public void setUserRestriction(int, boolean, android.os.IBinder, java.lang.String[]);
- public void setUserRestrictionForUser(int, boolean, android.os.IBinder, java.lang.String[], int);
- public int startOp(java.lang.String, int, java.lang.String);
- public int startOp(int);
- public int startOp(int, int, java.lang.String);
- public int startOp(int, int, java.lang.String, boolean);
- public int startOpNoThrow(java.lang.String, int, java.lang.String);
- public int startOpNoThrow(int, int, java.lang.String);
- public int startOpNoThrow(int, int, java.lang.String, boolean);
- public void startWatchingActive(int[], android.app.AppOpsManager$OnOpActiveChangedListener);
- public void startWatchingMode(java.lang.String, java.lang.String, android.app.AppOpsManager$OnOpChangedListener);
- public void startWatchingMode(java.lang.String, java.lang.String, int, android.app.AppOpsManager$OnOpChangedListener);
- public void startWatchingMode(int, java.lang.String, android.app.AppOpsManager$OnOpChangedListener);
- public void startWatchingMode(int, java.lang.String, int, android.app.AppOpsManager$OnOpChangedListener);
- public void stopWatchingActive(android.app.AppOpsManager$OnOpActiveChangedListener);
- public void stopWatchingMode(android.app.AppOpsManager$OnOpChangedListener);
- public static int strDebugOpToOp(java.lang.String);
- public static int strOpToOp(java.lang.String);
- public int unsafeCheckOpRaw(java.lang.String, int, java.lang.String);
-
-
- public static int MODE_ALLOWED;
- public static int MODE_DEFAULT;
- public static int MODE_ERRORED;
- public static int MODE_FOREGROUND;
- public static int MODE_IGNORED;
- public static java.lang.String[] MODE_NAMES;
- public static java.lang.String OPSTR_ACCEPT_HANDOVER;
- public static java.lang.String OPSTR_ACCESS_NOTIFICATIONS;
- public static java.lang.String OPSTR_ACTIVATE_VPN;
- public static java.lang.String OPSTR_ADD_VOICEMAIL;
- public static java.lang.String OPSTR_ANSWER_PHONE_CALLS;
- public static java.lang.String OPSTR_ASSIST_SCREENSHOT;
- public static java.lang.String OPSTR_ASSIST_STRUCTURE;
- public static java.lang.String OPSTR_AUDIO_ACCESSIBILITY_VOLUME;
- public static java.lang.String OPSTR_AUDIO_ALARM_VOLUME;
- public static java.lang.String OPSTR_AUDIO_BLUETOOTH_VOLUME;
- public static java.lang.String OPSTR_AUDIO_MASTER_VOLUME;
- public static java.lang.String OPSTR_AUDIO_MEDIA_VOLUME;
- public static java.lang.String OPSTR_AUDIO_NOTIFICATION_VOLUME;
- public static java.lang.String OPSTR_AUDIO_RING_VOLUME;
- public static java.lang.String OPSTR_AUDIO_VOICE_VOLUME;
- public static java.lang.String OPSTR_BIND_ACCESSIBILITY_SERVICE;
- public static java.lang.String OPSTR_BLUETOOTH_SCAN;
- public static java.lang.String OPSTR_BODY_SENSORS;
- public static java.lang.String OPSTR_CALL_PHONE;
- public static java.lang.String OPSTR_CAMERA;
- public static java.lang.String OPSTR_CHANGE_WIFI_STATE;
- public static java.lang.String OPSTR_COARSE_LOCATION;
- public static java.lang.String OPSTR_FINE_LOCATION;
- public static java.lang.String OPSTR_GET_ACCOUNTS;
- public static java.lang.String OPSTR_GET_USAGE_STATS;
- public static java.lang.String OPSTR_GPS;
- public static java.lang.String OPSTR_INSTANT_APP_START_FOREGROUND;
- public static java.lang.String OPSTR_MANAGE_IPSEC_TUNNELS;
- public static java.lang.String OPSTR_MOCK_LOCATION;
- public static java.lang.String OPSTR_MONITOR_HIGH_POWER_LOCATION;
- public static java.lang.String OPSTR_MONITOR_LOCATION;
- public static java.lang.String OPSTR_MUTE_MICROPHONE;
- public static java.lang.String OPSTR_NEIGHBORING_CELLS;
- public static java.lang.String OPSTR_PICTURE_IN_PICTURE;
- public static java.lang.String OPSTR_PLAY_AUDIO;
- public static java.lang.String OPSTR_POST_NOTIFICATION;
- public static java.lang.String OPSTR_PROCESS_OUTGOING_CALLS;
- public static java.lang.String OPSTR_PROJECT_MEDIA;
- public static java.lang.String OPSTR_READ_CALENDAR;
- public static java.lang.String OPSTR_READ_CALL_LOG;
- public static java.lang.String OPSTR_READ_CELL_BROADCASTS;
- public static java.lang.String OPSTR_READ_CLIPBOARD;
- public static java.lang.String OPSTR_READ_CONTACTS;
- public static java.lang.String OPSTR_READ_EXTERNAL_STORAGE;
- public static java.lang.String OPSTR_READ_ICC_SMS;
- public static java.lang.String OPSTR_READ_PHONE_NUMBERS;
- public static java.lang.String OPSTR_READ_PHONE_STATE;
- public static java.lang.String OPSTR_READ_SMS;
- public static java.lang.String OPSTR_RECEIVE_EMERGENCY_BROADCAST;
- public static java.lang.String OPSTR_RECEIVE_MMS;
- public static java.lang.String OPSTR_RECEIVE_SMS;
- public static java.lang.String OPSTR_RECEIVE_WAP_PUSH;
- public static java.lang.String OPSTR_RECORD_AUDIO;
- public static java.lang.String OPSTR_REQUEST_DELETE_PACKAGES;
- public static java.lang.String OPSTR_REQUEST_INSTALL_PACKAGES;
- public static java.lang.String OPSTR_RUN_ANY_IN_BACKGROUND;
- public static java.lang.String OPSTR_RUN_IN_BACKGROUND;
- public static java.lang.String OPSTR_SEND_SMS;
- public static java.lang.String OPSTR_START_FOREGROUND;
- public static java.lang.String OPSTR_SYSTEM_ALERT_WINDOW;
- public static java.lang.String OPSTR_TAKE_AUDIO_FOCUS;
- public static java.lang.String OPSTR_TAKE_MEDIA_BUTTONS;
- public static java.lang.String OPSTR_TOAST_WINDOW;
- public static java.lang.String OPSTR_TURN_SCREEN_ON;
- public static java.lang.String OPSTR_USE_FINGERPRINT;
- public static java.lang.String OPSTR_USE_SIP;
- public static java.lang.String OPSTR_VIBRATE;
- public static java.lang.String OPSTR_WAKE_LOCK;
- public static java.lang.String OPSTR_WIFI_SCAN;
- public static java.lang.String OPSTR_WRITE_CALENDAR;
- public static java.lang.String OPSTR_WRITE_CALL_LOG;
- public static java.lang.String OPSTR_WRITE_CLIPBOARD;
- public static java.lang.String OPSTR_WRITE_CONTACTS;
- public static java.lang.String OPSTR_WRITE_EXTERNAL_STORAGE;
- public static java.lang.String OPSTR_WRITE_ICC_SMS;
- public static java.lang.String OPSTR_WRITE_SETTINGS;
- public static java.lang.String OPSTR_WRITE_SMS;
- public static java.lang.String OPSTR_WRITE_WALLPAPER;
- public static int OP_ACCEPT_HANDOVER;
- public static int OP_ACCESS_NOTIFICATIONS;
- public static int OP_ACTIVATE_VPN;
- public static int OP_ADD_VOICEMAIL;
- public static int OP_ANSWER_PHONE_CALLS;
- public static int OP_ASSIST_SCREENSHOT;
- public static int OP_ASSIST_STRUCTURE;
- public static int OP_AUDIO_ACCESSIBILITY_VOLUME;
- public static int OP_AUDIO_ALARM_VOLUME;
- public static int OP_AUDIO_BLUETOOTH_VOLUME;
- public static int OP_AUDIO_MASTER_VOLUME;
- public static int OP_AUDIO_MEDIA_VOLUME;
- public static int OP_AUDIO_NOTIFICATION_VOLUME;
- public static int OP_AUDIO_RING_VOLUME;
- public static int OP_AUDIO_VOICE_VOLUME;
- public static int OP_BIND_ACCESSIBILITY_SERVICE;
- public static int OP_BLUETOOTH_SCAN;
- public static int OP_BODY_SENSORS;
- public static int OP_CALL_PHONE;
- public static int OP_CAMERA;
- public static int OP_CHANGE_WIFI_STATE;
- public static int OP_COARSE_LOCATION;
- public static int OP_FINE_LOCATION;
- public static int OP_GET_ACCOUNTS;
- public static int OP_GET_USAGE_STATS;
- public static int OP_GPS;
- public static int OP_INSTANT_APP_START_FOREGROUND;
- public static int OP_MANAGE_IPSEC_TUNNELS;
- public static int OP_MOCK_LOCATION;
- public static int OP_MONITOR_HIGH_POWER_LOCATION;
- public static int OP_MONITOR_LOCATION;
- public static int OP_MUTE_MICROPHONE;
- public static int OP_NEIGHBORING_CELLS;
- public static int OP_NONE;
- public static int OP_PICTURE_IN_PICTURE;
- public static int OP_PLAY_AUDIO;
- public static int OP_POST_NOTIFICATION;
- public static int OP_PROCESS_OUTGOING_CALLS;
- public static int OP_PROJECT_MEDIA;
- public static int OP_READ_CALENDAR;
- public static int OP_READ_CALL_LOG;
- public static int OP_READ_CELL_BROADCASTS;
- public static int OP_READ_CLIPBOARD;
- public static int OP_READ_CONTACTS;
- public static int OP_READ_EXTERNAL_STORAGE;
- public static int OP_READ_ICC_SMS;
- public static int OP_READ_PHONE_NUMBERS;
- public static int OP_READ_PHONE_STATE;
- public static int OP_READ_SMS;
- public static int OP_RECEIVE_EMERGECY_SMS;
- public static int OP_RECEIVE_MMS;
- public static int OP_RECEIVE_SMS;
- public static int OP_RECEIVE_WAP_PUSH;
- public static int OP_RECORD_AUDIO;
- public static int OP_REQUEST_DELETE_PACKAGES;
- public static int OP_REQUEST_INSTALL_PACKAGES;
- public static int OP_RUN_ANY_IN_BACKGROUND;
- public static int OP_RUN_IN_BACKGROUND;
- public static int OP_SEND_SMS;
- public static int OP_START_FOREGROUND;
- public static int OP_SYSTEM_ALERT_WINDOW;
- public static int OP_TAKE_AUDIO_FOCUS;
- public static int OP_TAKE_MEDIA_BUTTONS;
- public static int OP_TOAST_WINDOW;
- public static int OP_TURN_SCREEN_ON;
- public static int OP_USE_FINGERPRINT;
- public static int OP_USE_SIP;
- public static int OP_VIBRATE;
- public static int OP_WAKE_LOCK;
- public static int OP_WIFI_SCAN;
- public static int OP_WRITE_CALENDAR;
- public static int OP_WRITE_CALL_LOG;
- public static int OP_WRITE_CLIPBOARD;
- public static int OP_WRITE_CONTACTS;
- public static int OP_WRITE_EXTERNAL_STORAGE;
- public static int OP_WRITE_ICC_SMS;
- public static int OP_WRITE_SETTINGS;
- public static int OP_WRITE_SMS;
- public static int OP_WRITE_WALLPAPER;
- public static int UID_STATE_BACKGROUND;
- public static int UID_STATE_CACHED;
- public static int UID_STATE_FOREGROUND;
- public static int UID_STATE_FOREGROUND_SERVICE;
- public static int UID_STATE_LAST_NON_RESTRICTED;
- public static int UID_STATE_PERSISTENT;
- public static int UID_STATE_TOP;
- public static int WATCH_FOREGROUND_CHANGES;
- public static int _NUM_OP;
- public static int _NUM_UID_STATE;
-}
-
--keep class android.app.AppOpsManager$OnOpActiveChangedListener {
-
- public abstract void onOpActiveChanged(int, int, java.lang.String, boolean);
-
-
-}
-
--keep class android.app.AppOpsManager$OnOpChangedListener {
-
- public abstract void onOpChanged(java.lang.String, java.lang.String);
-
-
-}
-
--keep class android.app.AppOpsManager$OpEntry {
- <init>(int, int, long, long, int, int, java.lang.String);
- <init>(int, int, long[], long[], int, boolean, int, java.lang.String);
- <init>(int, int, long[], long[], int, int, java.lang.String);
-
- public int describeContents();
- public int getDuration();
- public long getLastAccessBackgroundTime();
- public long getLastAccessForegroundTime();
- public long getLastAccessTime();
- public long getLastRejectBackgroundTime();
- public long getLastRejectForegroundTime();
- public long getLastRejectTime();
- public long getLastRejectTimeFor(int);
- public long getLastTimeFor(int);
- public int getMode();
- public int getOp();
- public java.lang.String getProxyPackageName();
- public int getProxyUid();
- public long getRejectTime();
- public long getTime();
- public boolean isRunning();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.app.AppOpsManager$PackageOps {
- <init>(java.lang.String, int, java.util.List);
-
- public int describeContents();
- public java.util.List getOps();
- public java.lang.String getPackageName();
- public int getUid();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.app.Application {
- <init>();
-
- public android.view.autofill.AutofillManager$AutofillClient getAutofillClient();
- public static java.lang.String getProcessName();
- public void onConfigurationChanged(android.content.res.Configuration);
- public void onCreate();
- public void onLowMemory();
- public void onTerminate();
- public void onTrimMemory(int);
- public void registerActivityLifecycleCallbacks(android.app.Application$ActivityLifecycleCallbacks);
- public void registerComponentCallbacks(android.content.ComponentCallbacks);
- public void registerOnProvideAssistDataListener(android.app.Application$OnProvideAssistDataListener);
- public void unregisterActivityLifecycleCallbacks(android.app.Application$ActivityLifecycleCallbacks);
- public void unregisterComponentCallbacks(android.content.ComponentCallbacks);
- public void unregisterOnProvideAssistDataListener(android.app.Application$OnProvideAssistDataListener);
-
-
- public android.app.LoadedApk mLoadedApk;
-}
-
--keep class android.app.Application$ActivityLifecycleCallbacks {
-
- public abstract void onActivityCreated(android.app.Activity, android.os.Bundle);
- public abstract void onActivityDestroyed(android.app.Activity);
- public abstract void onActivityPaused(android.app.Activity);
- public abstract void onActivityResumed(android.app.Activity);
- public abstract void onActivitySaveInstanceState(android.app.Activity, android.os.Bundle);
- public abstract void onActivityStarted(android.app.Activity);
- public abstract void onActivityStopped(android.app.Activity);
-
-
-}
-
--keep class android.app.Application$OnProvideAssistDataListener {
-
- public abstract void onProvideAssistData(android.app.Activity, android.os.Bundle);
-
-
-}
-
--keep class android.app.ApplicationErrorReport {
- <init>();
-
- public int describeContents();
- public void dump(android.util.Printer, java.lang.String);
- public static android.content.ComponentName getErrorReportReceiver(android.content.Context, java.lang.String, int);
- public void readFromParcel(android.os.Parcel);
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public static int TYPE_ANR;
- public static int TYPE_BATTERY;
- public static int TYPE_CRASH;
- public static int TYPE_NONE;
- public static int TYPE_RUNNING_SERVICE;
- public android.app.ApplicationErrorReport$AnrInfo anrInfo;
- public android.app.ApplicationErrorReport$BatteryInfo batteryInfo;
- public android.app.ApplicationErrorReport$CrashInfo crashInfo;
- public java.lang.String installerPackageName;
- public java.lang.String packageName;
- public java.lang.String processName;
- public android.app.ApplicationErrorReport$RunningServiceInfo runningServiceInfo;
- public boolean systemApp;
- public long time;
- public int type;
-}
-
--keep class android.app.ApplicationErrorReport$AnrInfo {
- <init>();
- <init>(android.os.Parcel);
-
- public void dump(android.util.Printer, java.lang.String);
- public void writeToParcel(android.os.Parcel, int);
-
-
- public java.lang.String activity;
- public java.lang.String cause;
- public java.lang.String info;
-}
-
--keep class android.app.ApplicationErrorReport$BatteryInfo {
- <init>();
- <init>(android.os.Parcel);
-
- public void dump(android.util.Printer, java.lang.String);
- public void writeToParcel(android.os.Parcel, int);
-
-
- public java.lang.String checkinDetails;
- public long durationMicros;
- public java.lang.String usageDetails;
- public int usagePercent;
-}
-
--keep class android.app.ApplicationErrorReport$CrashInfo {
- <init>();
- <init>(java.lang.Throwable);
- <init>(android.os.Parcel);
-
- public void appendStackTrace(java.lang.String);
- public void dump(android.util.Printer, java.lang.String);
- public void writeToParcel(android.os.Parcel, int);
-
-
- public java.lang.String exceptionClassName;
- public java.lang.String exceptionMessage;
- public java.lang.String stackTrace;
- public java.lang.String throwClassName;
- public java.lang.String throwFileName;
- public int throwLineNumber;
- public java.lang.String throwMethodName;
-}
-
--keep class android.app.ApplicationErrorReport$ParcelableCrashInfo {
- <init>();
- <init>(java.lang.Throwable);
- <init>(android.os.Parcel);
-
- public int describeContents();
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.app.ApplicationErrorReport$RunningServiceInfo {
- <init>();
- <init>(android.os.Parcel);
-
- public void dump(android.util.Printer, java.lang.String);
- public void writeToParcel(android.os.Parcel, int);
-
-
- public long durationMillis;
- public java.lang.String serviceDetails;
-}
-
--keep class android.app.ClientTransactionHandler {
- <init>();
-
- public void executeTransaction(android.app.servertransaction.ClientTransaction);
- public abstract android.app.ActivityThread$ActivityClientRecord getActivityClient(android.os.IBinder);
- public abstract android.app.LoadedApk getPackageInfoNoCheck(android.content.pm.ApplicationInfo, android.content.res.CompatibilityInfo);
- public abstract void handleActivityConfigurationChanged(android.os.IBinder, android.content.res.Configuration, int);
- public abstract void handleConfigurationChanged(android.content.res.Configuration);
- public abstract void handleDestroyActivity(android.os.IBinder, boolean, int, boolean, java.lang.String);
- public abstract android.app.Activity handleLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.app.servertransaction.PendingTransactionActions, android.content.Intent);
- public abstract void handleMultiWindowModeChanged(android.os.IBinder, boolean, android.content.res.Configuration);
- public abstract void handleNewIntent(android.os.IBinder, java.util.List, boolean);
- public abstract void handlePauseActivity(android.os.IBinder, boolean, boolean, int, android.app.servertransaction.PendingTransactionActions, java.lang.String);
- public abstract void handlePictureInPictureModeChanged(android.os.IBinder, boolean, android.content.res.Configuration);
- public abstract void handleRelaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.app.servertransaction.PendingTransactionActions);
- public abstract void handleResumeActivity(android.os.IBinder, boolean, boolean, java.lang.String);
- public abstract void handleSendResult(android.os.IBinder, java.util.List, java.lang.String);
- public abstract void handleStartActivity(android.app.ActivityThread$ActivityClientRecord, android.app.servertransaction.PendingTransactionActions);
- public abstract void handleStopActivity(android.os.IBinder, boolean, int, android.app.servertransaction.PendingTransactionActions, boolean, java.lang.String);
- public abstract void handleWindowVisibility(android.os.IBinder, boolean);
- public abstract void performRestartActivity(android.os.IBinder, boolean);
- public abstract android.app.ActivityThread$ActivityClientRecord prepareRelaunchActivity(android.os.IBinder, java.util.List, java.util.List, int, android.util.MergedConfiguration, boolean);
- public abstract void reportRelaunch(android.os.IBinder, android.app.servertransaction.PendingTransactionActions);
- public abstract void reportStop(android.app.servertransaction.PendingTransactionActions);
- public abstract void updatePendingConfiguration(android.content.res.Configuration);
- public abstract void updateProcessState(int, boolean);
-
-
-}
-
--keep class android.app.ContentProviderHolder {
- <init>(android.content.pm.ProviderInfo);
-
- public int describeContents();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public android.os.IBinder connection;
- public android.content.pm.ProviderInfo info;
- public boolean noReleaseNeeded;
- public android.content.IContentProvider provider;
-}
-
--keep class android.app.ContextImpl {
-
- public boolean bindService(android.content.Intent, android.content.ServiceConnection, int);
- public boolean bindServiceAsUser(android.content.Intent, android.content.ServiceConnection, int, android.os.UserHandle);
- public boolean bindServiceAsUser(android.content.Intent, android.content.ServiceConnection, int, android.os.Handler, android.os.UserHandle);
- public boolean canLoadUnsafeResources();
- public int checkCallingOrSelfPermission(java.lang.String);
- public int checkCallingOrSelfUriPermission(android.net.Uri, int);
- public int checkCallingPermission(java.lang.String);
- public int checkCallingUriPermission(android.net.Uri, int);
- public int checkPermission(java.lang.String, int, int);
- public int checkPermission(java.lang.String, int, int, android.os.IBinder);
- public int checkSelfPermission(java.lang.String);
- public int checkUriPermission(android.net.Uri, int, int, int);
- public int checkUriPermission(android.net.Uri, int, int, int, android.os.IBinder);
- public int checkUriPermission(android.net.Uri, java.lang.String, java.lang.String, int, int, int);
- public void clearWallpaper();
- public android.content.Context createApplicationContext(android.content.pm.ApplicationInfo, int);
- public android.content.Context createConfigurationContext(android.content.res.Configuration);
- public android.content.Context createContextForSplit(java.lang.String);
- public android.content.Context createCredentialProtectedStorageContext();
- public android.content.Context createDeviceProtectedStorageContext();
- public android.content.Context createDisplayContext(android.view.Display);
- public android.content.Context createPackageContext(java.lang.String, int);
- public android.content.Context createPackageContextAsUser(java.lang.String, int, android.os.UserHandle);
- public java.lang.String[] databaseList();
- public boolean deleteDatabase(java.lang.String);
- public boolean deleteFile(java.lang.String);
- public boolean deleteSharedPreferences(java.lang.String);
- public void enforceCallingOrSelfPermission(java.lang.String, java.lang.String);
- public void enforceCallingOrSelfUriPermission(android.net.Uri, int, java.lang.String);
- public void enforceCallingPermission(java.lang.String, java.lang.String);
- public void enforceCallingUriPermission(android.net.Uri, int, java.lang.String);
- public void enforcePermission(java.lang.String, int, int, java.lang.String);
- public void enforceUriPermission(android.net.Uri, int, int, int, java.lang.String);
- public void enforceUriPermission(android.net.Uri, java.lang.String, java.lang.String, int, int, int, java.lang.String);
- public java.lang.String[] fileList();
- public android.os.IBinder getActivityToken();
- public android.content.Context getApplicationContext();
- public android.content.pm.ApplicationInfo getApplicationInfo();
- public android.content.res.AssetManager getAssets();
- public android.view.autofill.AutofillManager$AutofillClient getAutofillClient();
- public java.lang.String getBasePackageName();
- public java.io.File getCacheDir();
- public java.lang.ClassLoader getClassLoader();
- public java.io.File getCodeCacheDir();
- public android.content.ContentResolver getContentResolver();
- public java.io.File getDataDir();
- public java.io.File getDatabasePath(java.lang.String);
- public java.io.File getDir(java.lang.String, int);
- public android.view.Display getDisplay();
- public android.view.DisplayAdjustments getDisplayAdjustments(int);
- public java.io.File getExternalCacheDir();
- public java.io.File[] getExternalCacheDirs();
- public java.io.File getExternalFilesDir(java.lang.String);
- public java.io.File[] getExternalFilesDirs(java.lang.String);
- public java.io.File[] getExternalMediaDirs();
- public java.io.File getFileStreamPath(java.lang.String);
- public java.io.File getFilesDir();
- public android.app.IApplicationThread getIApplicationThread();
- public java.util.concurrent.Executor getMainExecutor();
- public android.os.Looper getMainLooper();
- public android.os.Handler getMainThreadHandler();
- public java.io.File getNoBackupFilesDir();
- public java.io.File getObbDir();
- public java.io.File[] getObbDirs();
- public java.lang.String getOpPackageName();
- public java.lang.String getPackageCodePath();
- public android.content.pm.PackageManager getPackageManager();
- public java.lang.String getPackageName();
- public java.lang.String getPackageResourcePath();
- public java.io.File getPreloadsFileCache();
- public android.content.res.Resources getResources();
- public android.app.IServiceConnection getServiceDispatcher(android.content.ServiceConnection, android.os.Handler, int);
- public android.content.SharedPreferences getSharedPreferences(java.lang.String, int);
- public android.content.SharedPreferences getSharedPreferences(java.io.File, int);
- public java.io.File getSharedPreferencesPath(java.lang.String);
- public java.lang.Object getSystemService(java.lang.String);
- public java.lang.String getSystemServiceName(java.lang.Class);
- public android.content.res.Resources$Theme getTheme();
- public int getThemeResId();
- public android.os.UserHandle getUser();
- public int getUserId();
- public android.graphics.drawable.Drawable getWallpaper();
- public int getWallpaperDesiredMinimumHeight();
- public int getWallpaperDesiredMinimumWidth();
- public void grantUriPermission(java.lang.String, android.net.Uri, int);
- public boolean isAutofillCompatibilityEnabled();
- public boolean isCredentialProtectedStorage();
- public boolean isDeviceProtectedStorage();
- public boolean isRestricted();
- public boolean moveDatabaseFrom(android.content.Context, java.lang.String);
- public boolean moveSharedPreferencesFrom(android.content.Context, java.lang.String);
- public java.io.FileInputStream openFileInput(java.lang.String);
- public java.io.FileOutputStream openFileOutput(java.lang.String, int);
- public android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory);
- public android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory, android.database.DatabaseErrorHandler);
- public android.graphics.drawable.Drawable peekWallpaper();
- public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
- public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, int);
- public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler);
- public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler, int);
- public android.content.Intent registerReceiverAsUser(android.content.BroadcastReceiver, android.os.UserHandle, android.content.IntentFilter, java.lang.String, android.os.Handler);
- public void reloadSharedPreferences();
- public void removeStickyBroadcast(android.content.Intent);
- public void removeStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle);
- public void revokeUriPermission(android.net.Uri, int);
- public void revokeUriPermission(java.lang.String, android.net.Uri, int);
- public void sendBroadcast(android.content.Intent);
- public void sendBroadcast(android.content.Intent, java.lang.String);
- public void sendBroadcast(android.content.Intent, java.lang.String, android.os.Bundle);
- public void sendBroadcast(android.content.Intent, java.lang.String, int);
- public void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle);
- public void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String);
- public void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, android.os.Bundle);
- public void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, int);
- public void sendBroadcastAsUserMultiplePermissions(android.content.Intent, android.os.UserHandle, java.lang.String[]);
- public void sendBroadcastMultiplePermissions(android.content.Intent, java.lang.String[]);
- public void sendOrderedBroadcast(android.content.Intent, java.lang.String);
- public void sendOrderedBroadcast(android.content.Intent, java.lang.String, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
- 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);
- public void sendOrderedBroadcast(android.content.Intent, java.lang.String, int, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
- 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);
- 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);
- 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);
- public void sendStickyBroadcast(android.content.Intent);
- public void sendStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle);
- public void sendStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle, android.os.Bundle);
- public void sendStickyOrderedBroadcast(android.content.Intent, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
- public void sendStickyOrderedBroadcastAsUser(android.content.Intent, android.os.UserHandle, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
- public void setAutofillClient(android.view.autofill.AutofillManager$AutofillClient);
- public void setAutofillCompatibilityEnabled(boolean);
- public void setTheme(int);
- public void setWallpaper(android.graphics.Bitmap);
- public void setWallpaper(java.io.InputStream);
- public void startActivities(android.content.Intent[]);
- public void startActivities(android.content.Intent[], android.os.Bundle);
- public int startActivitiesAsUser(android.content.Intent[], android.os.Bundle, android.os.UserHandle);
- public void startActivity(android.content.Intent);
- public void startActivity(android.content.Intent, android.os.Bundle);
- public void startActivityAsUser(android.content.Intent, android.os.UserHandle);
- public void startActivityAsUser(android.content.Intent, android.os.Bundle, android.os.UserHandle);
- public android.content.ComponentName startForegroundService(android.content.Intent);
- public android.content.ComponentName startForegroundServiceAsUser(android.content.Intent, android.os.UserHandle);
- public boolean startInstrumentation(android.content.ComponentName, java.lang.String, android.os.Bundle);
- public void startIntentSender(android.content.IntentSender, android.content.Intent, int, int, int);
- public void startIntentSender(android.content.IntentSender, android.content.Intent, int, int, int, android.os.Bundle);
- public android.content.ComponentName startService(android.content.Intent);
- public android.content.ComponentName startServiceAsUser(android.content.Intent, android.os.UserHandle);
- public boolean stopService(android.content.Intent);
- public boolean stopServiceAsUser(android.content.Intent, android.os.UserHandle);
- public void unbindService(android.content.ServiceConnection);
- public void unregisterReceiver(android.content.BroadcastReceiver);
- public void updateDisplay(int);
-
-
-}
-
--keep class android.app.Dialog {
- <init>(android.content.Context);
- <init>(android.content.Context, int);
- <init>(android.content.Context, boolean, android.os.Message);
- <init>(android.content.Context, boolean, android.content.DialogInterface$OnCancelListener);
-
- public void addContentView(android.view.View, android.view.ViewGroup$LayoutParams);
- public void cancel();
- public void closeOptionsMenu();
- public void create();
- public void dismiss();
- public boolean dispatchGenericMotionEvent(android.view.MotionEvent);
- public boolean dispatchKeyEvent(android.view.KeyEvent);
- public boolean dispatchKeyShortcutEvent(android.view.KeyEvent);
- public boolean dispatchPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
- public boolean dispatchTouchEvent(android.view.MotionEvent);
- public boolean dispatchTrackballEvent(android.view.MotionEvent);
- public android.view.View findViewById(int);
- public android.app.ActionBar getActionBar();
- public android.content.Context getContext();
- public android.view.View getCurrentFocus();
- public android.view.LayoutInflater getLayoutInflater();
- public android.app.Activity getOwnerActivity();
- public android.view.SearchEvent getSearchEvent();
- public int getVolumeControlStream();
- public android.view.Window getWindow();
- public void hide();
- public void invalidateOptionsMenu();
- public boolean isShowing();
- public void onActionModeFinished(android.view.ActionMode);
- public void onActionModeStarted(android.view.ActionMode);
- public void onAttachedToWindow();
- public void onBackPressed();
- public void onContentChanged();
- public boolean onContextItemSelected(android.view.MenuItem);
- public void onContextMenuClosed(android.view.Menu);
- protected void onCreate(android.os.Bundle);
- public void onCreateContextMenu(android.view.ContextMenu, android.view.View, android.view.ContextMenu$ContextMenuInfo);
- public boolean onCreateOptionsMenu(android.view.Menu);
- public boolean onCreatePanelMenu(int, android.view.Menu);
- public android.view.View onCreatePanelView(int);
- public void onDetachedFromWindow();
- public boolean onGenericMotionEvent(android.view.MotionEvent);
- public boolean onKeyDown(int, android.view.KeyEvent);
- public boolean onKeyLongPress(int, android.view.KeyEvent);
- public boolean onKeyMultiple(int, int, android.view.KeyEvent);
- public boolean onKeyShortcut(int, android.view.KeyEvent);
- public boolean onKeyUp(int, android.view.KeyEvent);
- public boolean onMenuItemSelected(int, android.view.MenuItem);
- public boolean onMenuOpened(int, android.view.Menu);
- public boolean onOptionsItemSelected(android.view.MenuItem);
- public void onOptionsMenuClosed(android.view.Menu);
- public void onPanelClosed(int, android.view.Menu);
- public boolean onPrepareOptionsMenu(android.view.Menu);
- public boolean onPreparePanel(int, android.view.View, android.view.Menu);
- public void onRestoreInstanceState(android.os.Bundle);
- public android.os.Bundle onSaveInstanceState();
- public boolean onSearchRequested(android.view.SearchEvent);
- public boolean onSearchRequested();
- protected void onStart();
- protected void onStop();
- public boolean onTouchEvent(android.view.MotionEvent);
- public boolean onTrackballEvent(android.view.MotionEvent);
- public void onWindowAttributesChanged(android.view.WindowManager$LayoutParams);
- public void onWindowDismissed(boolean, boolean);
- public void onWindowFocusChanged(boolean);
- public android.view.ActionMode onWindowStartingActionMode(android.view.ActionMode$Callback);
- public android.view.ActionMode onWindowStartingActionMode(android.view.ActionMode$Callback, int);
- public void openContextMenu(android.view.View);
- public void openOptionsMenu();
- public void registerForContextMenu(android.view.View);
- public boolean requestWindowFeature(int);
- public android.view.View requireViewById(int);
- public void setCancelMessage(android.os.Message);
- public void setCancelable(boolean);
- public void setCanceledOnTouchOutside(boolean);
- public void setContentView(int);
- public void setContentView(android.view.View);
- public void setContentView(android.view.View, android.view.ViewGroup$LayoutParams);
- public void setDismissMessage(android.os.Message);
- public void setFeatureDrawable(int, android.graphics.drawable.Drawable);
- public void setFeatureDrawableAlpha(int, int);
- public void setFeatureDrawableResource(int, int);
- public void setFeatureDrawableUri(int, android.net.Uri);
- public void setOnCancelListener(android.content.DialogInterface$OnCancelListener);
- public void setOnDismissListener(android.content.DialogInterface$OnDismissListener);
- public void setOnKeyListener(android.content.DialogInterface$OnKeyListener);
- public void setOnShowListener(android.content.DialogInterface$OnShowListener);
- public void setOwnerActivity(android.app.Activity);
- public void setTitle(java.lang.CharSequence);
- public void setTitle(int);
- public void setVolumeControlStream(int);
- public void show();
- public boolean takeCancelAndDismissListeners(java.lang.String, android.content.DialogInterface$OnCancelListener, android.content.DialogInterface$OnDismissListener);
- public void takeKeyEvents(boolean);
- public void unregisterForContextMenu(android.view.View);
-
-
- protected boolean mCancelable;
-}
-
--keep class android.app.Fragment {
- <init>();
-
- public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
- public boolean equals(java.lang.Object);
- public android.app.Activity getActivity();
- public boolean getAllowEnterTransitionOverlap();
- public boolean getAllowReturnTransitionOverlap();
- public android.os.Bundle getArguments();
- public android.app.FragmentManager getChildFragmentManager();
- public android.content.Context getContext();
- public android.transition.Transition getEnterTransition();
- public android.transition.Transition getExitTransition();
- public android.app.FragmentManager getFragmentManager();
- public java.lang.Object getHost();
- public int getId();
- public android.view.LayoutInflater getLayoutInflater();
- public android.app.LoaderManager getLoaderManager();
- public android.app.Fragment getParentFragment();
- public android.transition.Transition getReenterTransition();
- public android.content.res.Resources getResources();
- public boolean getRetainInstance();
- public android.transition.Transition getReturnTransition();
- public android.transition.Transition getSharedElementEnterTransition();
- public android.transition.Transition getSharedElementReturnTransition();
- public java.lang.String getString(int);
- public java.lang.String getString(int, java.lang.Object[]);
- public java.lang.String getTag();
- public android.app.Fragment getTargetFragment();
- public int getTargetRequestCode();
- public java.lang.CharSequence getText(int);
- public boolean getUserVisibleHint();
- public android.view.View getView();
- public int hashCode();
- public static android.app.Fragment instantiate(android.content.Context, java.lang.String);
- public static android.app.Fragment instantiate(android.content.Context, java.lang.String, android.os.Bundle);
- public boolean isAdded();
- public boolean isDetached();
- public boolean isHidden();
- public boolean isInLayout();
- public boolean isRemoving();
- public boolean isResumed();
- public boolean isStateSaved();
- public boolean isVisible();
- public void onActivityCreated(android.os.Bundle);
- public void onActivityResult(int, int, android.content.Intent);
- public void onAttach(android.content.Context);
- public void onAttach(android.app.Activity);
- public void onAttachFragment(android.app.Fragment);
- public void onConfigurationChanged(android.content.res.Configuration);
- public boolean onContextItemSelected(android.view.MenuItem);
- public void onCreate(android.os.Bundle);
- public android.animation.Animator onCreateAnimator(int, boolean, int);
- public void onCreateContextMenu(android.view.ContextMenu, android.view.View, android.view.ContextMenu$ContextMenuInfo);
- public void onCreateOptionsMenu(android.view.Menu, android.view.MenuInflater);
- public android.view.View onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
- public void onDestroy();
- public void onDestroyOptionsMenu();
- public void onDestroyView();
- public void onDetach();
- public android.view.LayoutInflater onGetLayoutInflater(android.os.Bundle);
- public void onHiddenChanged(boolean);
- public void onInflate(android.util.AttributeSet, android.os.Bundle);
- public void onInflate(android.content.Context, android.util.AttributeSet, android.os.Bundle);
- public void onInflate(android.app.Activity, android.util.AttributeSet, android.os.Bundle);
- public void onLowMemory();
- public void onMultiWindowModeChanged(boolean, android.content.res.Configuration);
- public void onMultiWindowModeChanged(boolean);
- public boolean onOptionsItemSelected(android.view.MenuItem);
- public void onOptionsMenuClosed(android.view.Menu);
- public void onPause();
- public void onPictureInPictureModeChanged(boolean, android.content.res.Configuration);
- public void onPictureInPictureModeChanged(boolean);
- public void onPrepareOptionsMenu(android.view.Menu);
- public void onRequestPermissionsResult(int, java.lang.String[], int[]);
- public void onResume();
- public void onSaveInstanceState(android.os.Bundle);
- public void onStart();
- public void onStop();
- public void onTrimMemory(int);
- public void onViewCreated(android.view.View, android.os.Bundle);
- public void onViewStateRestored(android.os.Bundle);
- public void postponeEnterTransition();
- public void registerForContextMenu(android.view.View);
- public void requestPermissions(java.lang.String[], int);
- public void setAllowEnterTransitionOverlap(boolean);
- public void setAllowReturnTransitionOverlap(boolean);
- public void setArguments(android.os.Bundle);
- public void setEnterSharedElementCallback(android.app.SharedElementCallback);
- public void setEnterTransition(android.transition.Transition);
- public void setExitSharedElementCallback(android.app.SharedElementCallback);
- public void setExitTransition(android.transition.Transition);
- public void setHasOptionsMenu(boolean);
- public void setInitialSavedState(android.app.Fragment$SavedState);
- public void setMenuVisibility(boolean);
- public void setReenterTransition(android.transition.Transition);
- public void setRetainInstance(boolean);
- public void setReturnTransition(android.transition.Transition);
- public void setSharedElementEnterTransition(android.transition.Transition);
- public void setSharedElementReturnTransition(android.transition.Transition);
- public void setTargetFragment(android.app.Fragment, int);
- public void setUserVisibleHint(boolean);
- public boolean shouldShowRequestPermissionRationale(java.lang.String);
- public void startActivity(android.content.Intent);
- public void startActivity(android.content.Intent, android.os.Bundle);
- public void startActivityForResult(android.content.Intent, int);
- public void startActivityForResult(android.content.Intent, int, android.os.Bundle);
- public void startActivityForResultAsUser(android.content.Intent, int, android.os.Bundle, android.os.UserHandle);
- public void startIntentSenderForResult(android.content.IntentSender, int, android.content.Intent, int, int, int, android.os.Bundle);
- public void startPostponedEnterTransition();
- public java.lang.String toString();
- public void unregisterForContextMenu(android.view.View);
-
-
-}
-
--keep class android.app.Fragment$SavedState {
-
- public int describeContents();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$ClassLoaderCreator CREATOR;
-}
-
--keep class android.app.FragmentContainer {
- <init>();
-
- public android.app.Fragment instantiate(android.content.Context, java.lang.String, android.os.Bundle);
- public abstract android.view.View onFindViewById(int);
- public abstract boolean onHasView();
-
-
-}
-
--keep class android.app.FragmentHostCallback {
- <init>(android.content.Context, android.os.Handler, int);
-
- public void onAttachFragment(android.app.Fragment);
- public void onDump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
- public android.view.View onFindViewById(int);
- public abstract java.lang.Object onGetHost();
- public android.view.LayoutInflater onGetLayoutInflater();
- public int onGetWindowAnimations();
- public boolean onHasView();
- public boolean onHasWindowAnimations();
- public void onInvalidateOptionsMenu();
- public void onRequestPermissionsFromFragment(android.app.Fragment, java.lang.String[], int);
- public boolean onShouldSaveFragmentState(android.app.Fragment);
- public void onStartActivityAsUserFromFragment(android.app.Fragment, android.content.Intent, int, android.os.Bundle, android.os.UserHandle);
- public void onStartActivityFromFragment(android.app.Fragment, android.content.Intent, int, android.os.Bundle);
- public void onStartIntentSenderFromFragment(android.app.Fragment, android.content.IntentSender, int, android.content.Intent, int, int, int, android.os.Bundle);
- public boolean onUseFragmentManagerInflaterFactory();
-
-
-}
-
--keep class android.app.FragmentManager {
- <init>();
-
- public abstract void addOnBackStackChangedListener(android.app.FragmentManager$OnBackStackChangedListener);
- public abstract android.app.FragmentTransaction beginTransaction();
- public abstract void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
- public static void enableDebugLogging(boolean);
- public abstract boolean executePendingTransactions();
- public abstract android.app.Fragment findFragmentById(int);
- public abstract android.app.Fragment findFragmentByTag(java.lang.String);
- public abstract android.app.FragmentManager$BackStackEntry getBackStackEntryAt(int);
- public abstract int getBackStackEntryCount();
- public abstract android.app.Fragment getFragment(android.os.Bundle, java.lang.String);
- public abstract java.util.List getFragments();
- public abstract android.app.Fragment getPrimaryNavigationFragment();
- public void invalidateOptionsMenu();
- public abstract boolean isDestroyed();
- public abstract boolean isStateSaved();
- public android.app.FragmentTransaction openTransaction();
- public abstract void popBackStack();
- public abstract void popBackStack(java.lang.String, int);
- public abstract void popBackStack(int, int);
- public abstract boolean popBackStackImmediate();
- public abstract boolean popBackStackImmediate(java.lang.String, int);
- public abstract boolean popBackStackImmediate(int, int);
- public abstract void putFragment(android.os.Bundle, java.lang.String, android.app.Fragment);
- public abstract void registerFragmentLifecycleCallbacks(android.app.FragmentManager$FragmentLifecycleCallbacks, boolean);
- public abstract void removeOnBackStackChangedListener(android.app.FragmentManager$OnBackStackChangedListener);
- public abstract android.app.Fragment$SavedState saveFragmentInstanceState(android.app.Fragment);
- public abstract void unregisterFragmentLifecycleCallbacks(android.app.FragmentManager$FragmentLifecycleCallbacks);
-
-
- public static int POP_BACK_STACK_INCLUSIVE;
-}
-
--keep class android.app.FragmentManager$BackStackEntry {
-
- public abstract java.lang.CharSequence getBreadCrumbShortTitle();
- public abstract int getBreadCrumbShortTitleRes();
- public abstract java.lang.CharSequence getBreadCrumbTitle();
- public abstract int getBreadCrumbTitleRes();
- public abstract int getId();
- public abstract java.lang.String getName();
-
-
-}
-
--keep class android.app.FragmentManager$FragmentLifecycleCallbacks {
- <init>();
-
- public void onFragmentActivityCreated(android.app.FragmentManager, android.app.Fragment, android.os.Bundle);
- public void onFragmentAttached(android.app.FragmentManager, android.app.Fragment, android.content.Context);
- public void onFragmentCreated(android.app.FragmentManager, android.app.Fragment, android.os.Bundle);
- public void onFragmentDestroyed(android.app.FragmentManager, android.app.Fragment);
- public void onFragmentDetached(android.app.FragmentManager, android.app.Fragment);
- public void onFragmentPaused(android.app.FragmentManager, android.app.Fragment);
- public void onFragmentPreAttached(android.app.FragmentManager, android.app.Fragment, android.content.Context);
- public void onFragmentPreCreated(android.app.FragmentManager, android.app.Fragment, android.os.Bundle);
- public void onFragmentResumed(android.app.FragmentManager, android.app.Fragment);
- public void onFragmentSaveInstanceState(android.app.FragmentManager, android.app.Fragment, android.os.Bundle);
- public void onFragmentStarted(android.app.FragmentManager, android.app.Fragment);
- public void onFragmentStopped(android.app.FragmentManager, android.app.Fragment);
- public void onFragmentViewCreated(android.app.FragmentManager, android.app.Fragment, android.view.View, android.os.Bundle);
- public void onFragmentViewDestroyed(android.app.FragmentManager, android.app.Fragment);
-
-
-}
-
--keep class android.app.FragmentManager$OnBackStackChangedListener {
-
- public abstract void onBackStackChanged();
-
-
-}
-
--keep class android.app.FragmentTransaction {
- <init>();
-
- public abstract android.app.FragmentTransaction add(android.app.Fragment, java.lang.String);
- public abstract android.app.FragmentTransaction add(int, android.app.Fragment);
- public abstract android.app.FragmentTransaction add(int, android.app.Fragment, java.lang.String);
- public abstract android.app.FragmentTransaction addSharedElement(android.view.View, java.lang.String);
- public abstract android.app.FragmentTransaction addToBackStack(java.lang.String);
- public abstract android.app.FragmentTransaction attach(android.app.Fragment);
- public abstract int commit();
- public abstract int commitAllowingStateLoss();
- public abstract void commitNow();
- public abstract void commitNowAllowingStateLoss();
- public abstract android.app.FragmentTransaction detach(android.app.Fragment);
- public abstract android.app.FragmentTransaction disallowAddToBackStack();
- public abstract android.app.FragmentTransaction hide(android.app.Fragment);
- public abstract boolean isAddToBackStackAllowed();
- public abstract boolean isEmpty();
- public abstract android.app.FragmentTransaction remove(android.app.Fragment);
- public abstract android.app.FragmentTransaction replace(int, android.app.Fragment);
- public abstract android.app.FragmentTransaction replace(int, android.app.Fragment, java.lang.String);
- public abstract android.app.FragmentTransaction runOnCommit(java.lang.Runnable);
- public abstract android.app.FragmentTransaction setBreadCrumbShortTitle(int);
- public abstract android.app.FragmentTransaction setBreadCrumbShortTitle(java.lang.CharSequence);
- public abstract android.app.FragmentTransaction setBreadCrumbTitle(int);
- public abstract android.app.FragmentTransaction setBreadCrumbTitle(java.lang.CharSequence);
- public abstract android.app.FragmentTransaction setCustomAnimations(int, int);
- public abstract android.app.FragmentTransaction setCustomAnimations(int, int, int, int);
- public abstract android.app.FragmentTransaction setPrimaryNavigationFragment(android.app.Fragment);
- public abstract android.app.FragmentTransaction setReorderingAllowed(boolean);
- public abstract android.app.FragmentTransaction setTransition(int);
- public abstract android.app.FragmentTransaction setTransitionStyle(int);
- public abstract android.app.FragmentTransaction show(android.app.Fragment);
-
-
- public static int TRANSIT_ENTER_MASK;
- public static int TRANSIT_EXIT_MASK;
- public static int TRANSIT_FRAGMENT_CLOSE;
- public static int TRANSIT_FRAGMENT_FADE;
- public static int TRANSIT_FRAGMENT_OPEN;
- public static int TRANSIT_NONE;
- public static int TRANSIT_UNSET;
-}
-
--keep class android.app.GrantedUriPermission {
- <init>(android.net.Uri, java.lang.String);
-
- public int describeContents();
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public java.lang.String packageName;
- public android.net.Uri uri;
-}
-
--keep class android.app.IActivityController {
-
- public abstract boolean activityResuming(java.lang.String);
- public abstract boolean activityStarting(android.content.Intent, java.lang.String);
- public abstract boolean appCrashed(java.lang.String, int, java.lang.String, java.lang.String, long, java.lang.String);
- public abstract int appEarlyNotResponding(java.lang.String, int, java.lang.String);
- public abstract int appNotResponding(java.lang.String, int, java.lang.String);
- public abstract int systemNotResponding(java.lang.String);
-
-
-}
-
--keep class android.app.IActivityManager {
-
- public abstract void activityDestroyed(android.os.IBinder);
- public abstract void activityIdle(android.os.IBinder, android.content.res.Configuration, boolean);
- public abstract void activityPaused(android.os.IBinder);
- public abstract void activityRelaunched(android.os.IBinder);
- public abstract void activityResumed(android.os.IBinder);
- public abstract void activitySlept(android.os.IBinder);
- public abstract void activityStopped(android.os.IBinder, android.os.Bundle, android.os.PersistableBundle, java.lang.CharSequence);
- public abstract int addAppTask(android.os.IBinder, android.content.Intent, android.app.ActivityManager$TaskDescription, android.graphics.Bitmap);
- public abstract void addInstrumentationResults(android.app.IApplicationThread, android.os.Bundle);
- public abstract void addPackageDependency(java.lang.String);
- public abstract void alwaysShowUnsupportedCompileSdkWarning(android.content.ComponentName);
- public abstract void appNotRespondingViaProvider(android.os.IBinder);
- public abstract void attachApplication(android.app.IApplicationThread, long);
- public abstract void backgroundWhitelistUid(int);
- public abstract void backupAgentCreated(java.lang.String, android.os.IBinder);
- public abstract boolean bindBackupAgent(java.lang.String, int, int);
- public abstract int bindService(android.app.IApplicationThread, android.os.IBinder, android.content.Intent, java.lang.String, android.app.IServiceConnection, int, java.lang.String, int);
- public abstract void bootAnimationComplete();
- public abstract int broadcastIntent(android.app.IApplicationThread, android.content.Intent, java.lang.String, android.content.IIntentReceiver, int, java.lang.String, android.os.Bundle, java.lang.String[], int, android.os.Bundle, boolean, boolean, int);
- public abstract void cancelIntentSender(android.content.IIntentSender);
- public abstract void cancelRecentsAnimation(boolean);
- public abstract void cancelTaskWindowTransition(int);
- public abstract int checkGrantUriPermission(int, java.lang.String, android.net.Uri, int, int);
- public abstract int checkPermission(java.lang.String, int, int);
- public abstract int checkPermissionWithToken(java.lang.String, int, int, android.os.IBinder);
- public abstract int checkUriPermission(android.net.Uri, int, int, int, int, android.os.IBinder);
- public abstract boolean clearApplicationUserData(java.lang.String, boolean, android.content.pm.IPackageDataObserver, int);
- public abstract void clearGrantedUriPermissions(java.lang.String, int);
- public abstract void clearPendingBackup();
- public abstract void closeSystemDialogs(java.lang.String);
- public abstract boolean convertFromTranslucent(android.os.IBinder);
- public abstract boolean convertToTranslucent(android.os.IBinder, android.os.Bundle);
- public abstract void crashApplication(int, int, java.lang.String, int, java.lang.String);
- public abstract int createStackOnDisplay(int);
- public abstract void dismissKeyguard(android.os.IBinder, com.android.internal.policy.IKeyguardDismissCallback, java.lang.CharSequence);
- public abstract void dismissPip(boolean, int);
- public abstract void dismissSplitScreenMode(boolean);
- public abstract boolean dumpHeap(java.lang.String, int, boolean, boolean, boolean, java.lang.String, android.os.ParcelFileDescriptor);
- public abstract void dumpHeapFinished(java.lang.String);
- public abstract boolean enterPictureInPictureMode(android.os.IBinder, android.app.PictureInPictureParams);
- public abstract void enterSafeMode();
- public abstract void exitFreeformMode(android.os.IBinder);
- public abstract boolean finishActivity(android.os.IBinder, int, android.content.Intent, int);
- public abstract boolean finishActivityAffinity(android.os.IBinder);
- public abstract void finishHeavyWeightApp();
- public abstract void finishInstrumentation(android.app.IApplicationThread, int, android.os.Bundle);
- public abstract void finishReceiver(android.os.IBinder, int, java.lang.String, android.os.Bundle, boolean, int);
- public abstract void finishSubActivity(android.os.IBinder, java.lang.String, int);
- public abstract void finishVoiceTask(android.service.voice.IVoiceInteractionSession);
- public abstract void forceStopPackage(java.lang.String, int);
- public abstract android.content.ComponentName getActivityClassForToken(android.os.IBinder);
- public abstract int getActivityDisplayId(android.os.IBinder);
- public abstract android.os.Bundle getActivityOptions(android.os.IBinder);
- public abstract java.util.List getAllStackInfos();
- public abstract android.graphics.Point getAppTaskThumbnailSize();
- public abstract java.util.List getAppTasks(java.lang.String);
- public abstract android.os.Bundle getAssistContextExtras(int);
- public abstract android.content.ComponentName getCallingActivity(android.os.IBinder);
- public abstract java.lang.String getCallingPackage(android.os.IBinder);
- public abstract android.content.res.Configuration getConfiguration();
- public abstract android.app.ContentProviderHolder getContentProvider(android.app.IApplicationThread, java.lang.String, int, boolean);
- public abstract android.app.ContentProviderHolder getContentProviderExternal(java.lang.String, int, android.os.IBinder);
- public abstract android.content.pm.UserInfo getCurrentUser();
- public abstract android.content.pm.ConfigurationInfo getDeviceConfigurationInfo();
- public abstract java.util.List getFilteredTasks(int, int, int);
- public abstract android.app.ActivityManager$StackInfo getFocusedStackInfo();
- public abstract int getFrontActivityScreenCompatMode();
- public abstract android.content.pm.ParceledListSlice getGrantedUriPermissions(java.lang.String, int);
- public abstract android.content.Intent getIntentForIntentSender(android.content.IIntentSender);
- public abstract android.content.IIntentSender getIntentSender(int, java.lang.String, android.os.IBinder, java.lang.String, int, android.content.Intent[], java.lang.String[], int, android.os.Bundle, int);
- public abstract int getLastResumedActivityUserId();
- public abstract java.lang.String getLaunchedFromPackage(android.os.IBinder);
- public abstract int getLaunchedFromUid(android.os.IBinder);
- public abstract int getLockTaskModeState();
- public abstract int getMaxNumPictureInPictureActions(android.os.IBinder);
- public abstract void getMemoryInfo(android.app.ActivityManager$MemoryInfo);
- public abstract int getMemoryTrimLevel();
- public abstract void getMyMemoryState(android.app.ActivityManager$RunningAppProcessInfo);
- public abstract boolean getPackageAskScreenCompat(java.lang.String);
- public abstract java.lang.String getPackageForIntentSender(android.content.IIntentSender);
- public abstract java.lang.String getPackageForToken(android.os.IBinder);
- public abstract int getPackageProcessState(java.lang.String, java.lang.String);
- public abstract int getPackageScreenCompatMode(java.lang.String);
- public abstract android.content.pm.ParceledListSlice getPersistedUriPermissions(java.lang.String, boolean);
- public abstract int getProcessLimit();
- public abstract android.os.Debug$MemoryInfo[] getProcessMemoryInfo(int[]);
- public abstract long[] getProcessPss(int[]);
- public abstract java.util.List getProcessesInErrorState();
- public abstract java.lang.String getProviderMimeType(android.net.Uri, int);
- public abstract android.content.pm.ParceledListSlice getRecentTasks(int, int, int);
- public abstract int getRequestedOrientation(android.os.IBinder);
- public abstract java.util.List getRunningAppProcesses();
- public abstract java.util.List getRunningExternalApplications();
- public abstract android.app.PendingIntent getRunningServiceControlPanel(android.content.ComponentName);
- public abstract int[] getRunningUserIds();
- public abstract java.util.List getServices(int, int);
- public abstract android.app.ActivityManager$StackInfo getStackInfo(int, int);
- public abstract java.lang.String getTagForIntentSender(android.content.IIntentSender, java.lang.String);
- public abstract android.graphics.Rect getTaskBounds(int);
- public abstract android.app.ActivityManager$TaskDescription getTaskDescription(int);
- public abstract android.graphics.Bitmap getTaskDescriptionIcon(java.lang.String, int);
- public abstract int getTaskForActivity(android.os.IBinder, boolean);
- public abstract android.app.ActivityManager$TaskSnapshot getTaskSnapshot(int, boolean);
- public abstract java.util.List getTasks(int);
- public abstract int getUidForIntentSender(android.content.IIntentSender);
- public abstract int getUidProcessState(int, java.lang.String);
- public abstract android.os.IBinder getUriPermissionOwnerForActivity(android.os.IBinder);
- public abstract void grantUriPermission(android.app.IApplicationThread, java.lang.String, android.net.Uri, int, int);
- public abstract void grantUriPermissionFromOwner(android.os.IBinder, int, java.lang.String, android.net.Uri, int, int, int);
- public abstract void handleApplicationCrash(android.os.IBinder, android.app.ApplicationErrorReport$ParcelableCrashInfo);
- public abstract void handleApplicationStrictModeViolation(android.os.IBinder, int, android.os.StrictMode$ViolationInfo);
- public abstract boolean handleApplicationWtf(android.os.IBinder, java.lang.String, boolean, android.app.ApplicationErrorReport$ParcelableCrashInfo);
- public abstract int handleIncomingUser(int, int, int, boolean, boolean, java.lang.String, java.lang.String);
- public abstract void hang(android.os.IBinder, boolean);
- public abstract long inputDispatchingTimedOut(int, boolean, java.lang.String);
- public abstract boolean isAppForeground(int);
- public abstract boolean isAppStartModeDisabled(int, java.lang.String);
- public abstract boolean isAssistDataAllowedOnCurrentActivity();
- public abstract boolean isBackgroundRestricted(java.lang.String);
- public abstract boolean isImmersive(android.os.IBinder);
- public abstract boolean isInLockTaskMode();
- public abstract boolean isInMultiWindowMode(android.os.IBinder);
- public abstract boolean isInPictureInPictureMode(android.os.IBinder);
- public abstract boolean isIntentSenderAForegroundService(android.content.IIntentSender);
- public abstract boolean isIntentSenderAnActivity(android.content.IIntentSender);
- public abstract boolean isIntentSenderTargetedToPackage(android.content.IIntentSender);
- public abstract boolean isRootVoiceInteraction(android.os.IBinder);
- public abstract boolean isTopActivityImmersive();
- public abstract boolean isTopOfTask(android.os.IBinder);
- public abstract boolean isUidActive(int, java.lang.String);
- public abstract boolean isUserAMonkey();
- public abstract boolean isUserRunning(int, int);
- public abstract boolean isVrModePackageEnabled(android.content.ComponentName);
- public abstract void keyguardGoingAway(int);
- public abstract void killAllBackgroundProcesses();
- public abstract void killApplication(java.lang.String, int, int, java.lang.String);
- public abstract void killApplicationProcess(java.lang.String, int);
- public abstract void killBackgroundProcesses(java.lang.String, int);
- public abstract void killPackageDependents(java.lang.String, int);
- public abstract boolean killPids(int[], java.lang.String, boolean);
- public abstract boolean killProcessesBelowForeground(java.lang.String);
- public abstract void killUid(int, int, java.lang.String);
- public abstract boolean launchAssistIntent(android.content.Intent, int, java.lang.String, int, android.os.Bundle);
- public abstract void makePackageIdle(java.lang.String, int);
- public abstract boolean moveActivityTaskToBack(android.os.IBinder, boolean);
- public abstract void moveStackToDisplay(int, int);
- public abstract void moveTaskBackwards(int);
- public abstract void moveTaskToFront(int, int, android.os.Bundle);
- public abstract void moveTaskToStack(int, int, boolean);
- public abstract void moveTasksToFullscreenStack(int, boolean);
- public abstract boolean moveTopActivityToPinnedStack(int, android.graphics.Rect);
- public abstract boolean navigateUpTo(android.os.IBinder, android.content.Intent, int, android.content.Intent);
- public abstract android.os.IBinder newUriPermissionOwner(java.lang.String);
- public abstract void noteAlarmFinish(android.content.IIntentSender, android.os.WorkSource, int, java.lang.String);
- public abstract void noteAlarmStart(android.content.IIntentSender, android.os.WorkSource, int, java.lang.String);
- public abstract void noteWakeupAlarm(android.content.IIntentSender, android.os.WorkSource, int, java.lang.String, java.lang.String);
- public abstract void notifyActivityDrawn(android.os.IBinder);
- public abstract void notifyCleartextNetwork(int, byte[]);
- public abstract void notifyEnterAnimationComplete(android.os.IBinder);
- public abstract void notifyLaunchTaskBehindComplete(android.os.IBinder);
- public abstract void notifyLockedProfile(int);
- public abstract void notifyPinnedStackAnimationEnded();
- public abstract void notifyPinnedStackAnimationStarted();
- public abstract android.os.ParcelFileDescriptor openContentUri(java.lang.String);
- public abstract void overridePendingTransition(android.os.IBinder, java.lang.String, int, int);
- public abstract android.os.IBinder peekService(android.content.Intent, java.lang.String, java.lang.String);
- public abstract void performIdleMaintenance();
- public abstract void positionTaskInStack(int, int, int);
- public abstract boolean profileControl(java.lang.String, int, boolean, android.app.ProfilerInfo, int);
- public abstract void publishContentProviders(android.app.IApplicationThread, java.util.List);
- public abstract void publishService(android.os.IBinder, android.content.Intent, android.os.IBinder);
- public abstract boolean refContentProvider(android.os.IBinder, int, int);
- public abstract void registerIntentSenderCancelListener(android.content.IIntentSender, com.android.internal.os.IResultReceiver);
- public abstract void registerProcessObserver(android.app.IProcessObserver);
- public abstract android.content.Intent registerReceiver(android.app.IApplicationThread, java.lang.String, android.content.IIntentReceiver, android.content.IntentFilter, java.lang.String, int, int);
- public abstract void registerRemoteAnimationForNextActivityStart(java.lang.String, android.view.RemoteAnimationAdapter);
- public abstract void registerRemoteAnimations(android.os.IBinder, android.view.RemoteAnimationDefinition);
- public abstract void registerTaskStackListener(android.app.ITaskStackListener);
- public abstract void registerUidObserver(android.app.IUidObserver, int, int, java.lang.String);
- public abstract void registerUserSwitchObserver(android.app.IUserSwitchObserver, java.lang.String);
- public abstract boolean releaseActivityInstance(android.os.IBinder);
- public abstract void releasePersistableUriPermission(android.net.Uri, int, java.lang.String, int);
- public abstract void releaseSomeActivities(android.app.IApplicationThread);
- public abstract void removeContentProvider(android.os.IBinder, boolean);
- public abstract void removeContentProviderExternal(java.lang.String, android.os.IBinder);
- public abstract void removeStack(int);
- public abstract void removeStacksInWindowingModes(int[]);
- public abstract void removeStacksWithActivityTypes(int[]);
- public abstract boolean removeTask(int);
- public abstract void reportActivityFullyDrawn(android.os.IBinder, boolean);
- public abstract void reportAssistContextExtras(android.os.IBinder, android.os.Bundle, android.app.assist.AssistStructure, android.app.assist.AssistContent, android.net.Uri);
- public abstract void reportSizeConfigurations(android.os.IBinder, int[], int[], int[]);
- public abstract boolean requestAssistContextExtras(int, android.app.IAssistDataReceiver, android.os.Bundle, android.os.IBinder, boolean, boolean);
- public abstract boolean requestAutofillData(android.app.IAssistDataReceiver, android.os.Bundle, android.os.IBinder, int);
- public abstract void requestBugReport(int);
- public abstract void requestTelephonyBugReport(java.lang.String, java.lang.String);
- public abstract void requestWifiBugReport(java.lang.String, java.lang.String);
- public abstract void resizeDockedStack(android.graphics.Rect, android.graphics.Rect, android.graphics.Rect, android.graphics.Rect, android.graphics.Rect);
- public abstract void resizePinnedStack(android.graphics.Rect, android.graphics.Rect);
- public abstract void resizeStack(int, android.graphics.Rect, boolean, boolean, boolean, int);
- public abstract void resizeTask(int, android.graphics.Rect, int);
- public abstract void restart();
- public abstract int restartUserInBackground(int);
- public abstract void resumeAppSwitches();
- public abstract void revokeUriPermission(android.app.IApplicationThread, java.lang.String, android.net.Uri, int, int);
- public abstract void revokeUriPermissionFromOwner(android.os.IBinder, android.net.Uri, int, int);
- public abstract void scheduleApplicationInfoChanged(java.util.List, int);
- public abstract void sendIdleJobTrigger();
- public abstract int sendIntentSender(android.content.IIntentSender, android.os.IBinder, int, android.content.Intent, java.lang.String, android.content.IIntentReceiver, java.lang.String, android.os.Bundle);
- public abstract void serviceDoneExecuting(android.os.IBinder, int, int, int);
- public abstract void setActivityController(android.app.IActivityController, boolean);
- public abstract void setAgentApp(java.lang.String, java.lang.String);
- public abstract void setAlwaysFinish(boolean);
- public abstract void setDebugApp(java.lang.String, boolean, boolean);
- public abstract void setDisablePreviewScreenshots(android.os.IBinder, boolean);
- public abstract void setDumpHeapDebugLimit(java.lang.String, int, long, java.lang.String);
- public abstract void setFocusedStack(int);
- public abstract void setFocusedTask(int);
- public abstract void setFrontActivityScreenCompatMode(int);
- public abstract void setHasTopUi(boolean);
- public abstract void setImmersive(android.os.IBinder, boolean);
- public abstract void setLockScreenShown(boolean, boolean, int);
- public abstract void setPackageAskScreenCompat(java.lang.String, boolean);
- public abstract void setPackageScreenCompatMode(java.lang.String, int);
- public abstract void setPersistentVrThread(int);
- public abstract void setPictureInPictureParams(android.os.IBinder, android.app.PictureInPictureParams);
- public abstract void setProcessImportant(android.os.IBinder, int, boolean, java.lang.String);
- public abstract void setProcessLimit(int);
- public abstract boolean setProcessMemoryTrimLevel(java.lang.String, int, int);
- public abstract void setRenderThread(int);
- public abstract void setRequestedOrientation(android.os.IBinder, int);
- public abstract void setServiceForeground(android.content.ComponentName, android.os.IBinder, int, android.app.Notification, int);
- public abstract void setShowWhenLocked(android.os.IBinder, boolean);
- public abstract void setSplitScreenResizing(boolean);
- public abstract void setTaskDescription(android.os.IBinder, android.app.ActivityManager$TaskDescription);
- public abstract void setTaskResizeable(int, int);
- public abstract void setTaskWindowingMode(int, int, boolean);
- public abstract boolean setTaskWindowingModeSplitScreenPrimary(int, int, boolean, boolean, android.graphics.Rect, boolean);
- public abstract void setTurnScreenOn(android.os.IBinder, boolean);
- public abstract void setUserIsMonkey(boolean);
- public abstract void setVoiceKeepAwake(android.service.voice.IVoiceInteractionSession, boolean);
- public abstract int setVrMode(android.os.IBinder, boolean, android.content.ComponentName);
- public abstract void setVrThread(int);
- public abstract boolean shouldUpRecreateTask(android.os.IBinder, java.lang.String);
- public abstract boolean showAssistFromActivity(android.os.IBinder, android.os.Bundle);
- public abstract void showBootMessage(java.lang.CharSequence, boolean);
- public abstract void showLockTaskEscapeMessage(android.os.IBinder);
- public abstract void showWaitingForDebugger(android.app.IApplicationThread, boolean);
- public abstract boolean shutdown(int);
- public abstract void signalPersistentProcesses(int);
- public abstract int startActivities(android.app.IApplicationThread, java.lang.String, android.content.Intent[], java.lang.String[], android.os.IBinder, android.os.Bundle, int);
- public abstract int startActivity(android.app.IApplicationThread, java.lang.String, android.content.Intent, java.lang.String, android.os.IBinder, java.lang.String, int, int, android.app.ProfilerInfo, android.os.Bundle);
- public abstract android.app.WaitResult startActivityAndWait(android.app.IApplicationThread, java.lang.String, android.content.Intent, java.lang.String, android.os.IBinder, java.lang.String, int, int, android.app.ProfilerInfo, android.os.Bundle, int);
- public abstract int startActivityAsCaller(android.app.IApplicationThread, java.lang.String, android.content.Intent, java.lang.String, android.os.IBinder, java.lang.String, int, int, android.app.ProfilerInfo, android.os.Bundle, boolean, int);
- public abstract int startActivityAsUser(android.app.IApplicationThread, java.lang.String, android.content.Intent, java.lang.String, android.os.IBinder, java.lang.String, int, int, android.app.ProfilerInfo, android.os.Bundle, int);
- public abstract int startActivityFromRecents(int, android.os.Bundle);
- public abstract int startActivityIntentSender(android.app.IApplicationThread, android.content.IIntentSender, android.os.IBinder, android.content.Intent, java.lang.String, android.os.IBinder, java.lang.String, int, int, int, android.os.Bundle);
- public abstract int startActivityWithConfig(android.app.IApplicationThread, java.lang.String, android.content.Intent, java.lang.String, android.os.IBinder, java.lang.String, int, int, android.content.res.Configuration, android.os.Bundle, int);
- public abstract int startAssistantActivity(java.lang.String, int, int, android.content.Intent, java.lang.String, android.os.Bundle, int);
- public abstract boolean startBinderTracking();
- public abstract void startConfirmDeviceCredentialIntent(android.content.Intent, android.os.Bundle);
- public abstract void startInPlaceAnimationOnFrontMostApplication(android.os.Bundle);
- public abstract boolean startInstrumentation(android.content.ComponentName, java.lang.String, int, android.os.Bundle, android.app.IInstrumentationWatcher, android.app.IUiAutomationConnection, int, java.lang.String);
- public abstract void startLocalVoiceInteraction(android.os.IBinder, android.os.Bundle);
- public abstract void startLockTaskModeByToken(android.os.IBinder);
- public abstract boolean startNextMatchingActivity(android.os.IBinder, android.content.Intent, android.os.Bundle);
- public abstract void startRecentsActivity(android.content.Intent, android.app.IAssistDataReceiver, android.view.IRecentsAnimationRunner);
- public abstract android.content.ComponentName startService(android.app.IApplicationThread, android.content.Intent, java.lang.String, boolean, java.lang.String, int);
- public abstract void startSystemLockTaskMode(int);
- public abstract boolean startUserInBackground(int);
- public abstract boolean startUserInBackgroundWithListener(int, android.os.IProgressListener);
- public abstract int startVoiceActivity(java.lang.String, int, int, android.content.Intent, java.lang.String, android.service.voice.IVoiceInteractionSession, com.android.internal.app.IVoiceInteractor, int, android.app.ProfilerInfo, android.os.Bundle, int);
- public abstract void stopAppSwitches();
- public abstract boolean stopBinderTrackingAndDump(android.os.ParcelFileDescriptor);
- public abstract void stopLocalVoiceInteraction(android.os.IBinder);
- public abstract void stopLockTaskModeByToken(android.os.IBinder);
- public abstract int stopService(android.app.IApplicationThread, android.content.Intent, java.lang.String, int);
- public abstract boolean stopServiceToken(android.content.ComponentName, android.os.IBinder, int);
- public abstract void stopSystemLockTaskMode();
- public abstract int stopUser(int, boolean, android.app.IStopUserCallback);
- public abstract boolean supportsLocalVoiceInteraction();
- public abstract void suppressResizeConfigChanges(boolean);
- public abstract boolean switchUser(int);
- public abstract void takePersistableUriPermission(android.net.Uri, int, java.lang.String, int);
- public abstract void unbindBackupAgent(android.content.pm.ApplicationInfo);
- public abstract void unbindFinished(android.os.IBinder, android.content.Intent, boolean);
- public abstract boolean unbindService(android.app.IServiceConnection);
- public abstract void unbroadcastIntent(android.app.IApplicationThread, android.content.Intent, int);
- public abstract void unhandledBack();
- public abstract boolean unlockUser(int, byte[], byte[], android.os.IProgressListener);
- public abstract void unregisterIntentSenderCancelListener(android.content.IIntentSender, com.android.internal.os.IResultReceiver);
- public abstract void unregisterProcessObserver(android.app.IProcessObserver);
- public abstract void unregisterReceiver(android.content.IIntentReceiver);
- public abstract void unregisterTaskStackListener(android.app.ITaskStackListener);
- public abstract void unregisterUidObserver(android.app.IUidObserver);
- public abstract void unregisterUserSwitchObserver(android.app.IUserSwitchObserver);
- public abstract void unstableProviderDied(android.os.IBinder);
- public abstract boolean updateConfiguration(android.content.res.Configuration);
- public abstract void updateDeviceOwner(java.lang.String);
- public abstract boolean updateDisplayOverrideConfiguration(android.content.res.Configuration, int);
- public abstract void updateLockTaskFeatures(int, int);
- public abstract void updateLockTaskPackages(int, java.lang.String[]);
- public abstract void updatePersistentConfiguration(android.content.res.Configuration);
- public abstract void waitForNetworkStateUpdate(long);
- public abstract boolean willActivityBeVisible(android.os.IBinder);
-
-
-}
-
--keep class android.app.IAppTask {
-
- public abstract void finishAndRemoveTask();
- public abstract android.app.ActivityManager$RecentTaskInfo getTaskInfo();
- public abstract void moveToFront();
- public abstract void setExcludeFromRecents(boolean);
- public abstract int startActivity(android.os.IBinder, java.lang.String, android.content.Intent, java.lang.String, android.os.Bundle);
-
-
-}
-
--keep class android.app.IApplicationThread {
-
- public abstract void attachAgent(java.lang.String);
- public abstract void bindApplication(java.lang.String, android.content.pm.ApplicationInfo, java.util.List, android.content.ComponentName, android.app.ProfilerInfo, android.os.Bundle, android.app.IInstrumentationWatcher, android.app.IUiAutomationConnection, int, boolean, boolean, boolean, boolean, android.content.res.Configuration, android.content.res.CompatibilityInfo, java.util.Map, android.os.Bundle, java.lang.String, boolean);
- public abstract void clearDnsCache();
- public abstract void dispatchPackageBroadcast(int, java.lang.String[]);
- public abstract void dumpActivity(android.os.ParcelFileDescriptor, android.os.IBinder, java.lang.String, java.lang.String[]);
- public abstract void dumpDbInfo(android.os.ParcelFileDescriptor, java.lang.String[]);
- public abstract void dumpGfxInfo(android.os.ParcelFileDescriptor, java.lang.String[]);
- public abstract void dumpHeap(boolean, boolean, boolean, java.lang.String, android.os.ParcelFileDescriptor);
- public abstract void dumpMemInfo(android.os.ParcelFileDescriptor, android.os.Debug$MemoryInfo, boolean, boolean, boolean, boolean, boolean, java.lang.String[]);
- public abstract void dumpMemInfoProto(android.os.ParcelFileDescriptor, android.os.Debug$MemoryInfo, boolean, boolean, boolean, boolean, java.lang.String[]);
- public abstract void dumpProvider(android.os.ParcelFileDescriptor, android.os.IBinder, java.lang.String[]);
- public abstract void dumpService(android.os.ParcelFileDescriptor, android.os.IBinder, java.lang.String[]);
- public abstract void handleTrustStorageUpdate();
- public abstract void notifyCleartextNetwork(byte[]);
- public abstract void processInBackground();
- public abstract void profilerControl(boolean, android.app.ProfilerInfo, int);
- public abstract void requestAssistContextExtras(android.os.IBinder, android.os.IBinder, int, int, int);
- public abstract void runIsolatedEntryPoint(java.lang.String, java.lang.String[]);
- public abstract void scheduleApplicationInfoChanged(android.content.pm.ApplicationInfo);
- public abstract void scheduleBindService(android.os.IBinder, android.content.Intent, boolean, int);
- public abstract void scheduleCrash(java.lang.String);
- public abstract void scheduleCreateBackupAgent(android.content.pm.ApplicationInfo, android.content.res.CompatibilityInfo, int);
- public abstract void scheduleCreateService(android.os.IBinder, android.content.pm.ServiceInfo, android.content.res.CompatibilityInfo, int);
- public abstract void scheduleDestroyBackupAgent(android.content.pm.ApplicationInfo, android.content.res.CompatibilityInfo);
- public abstract void scheduleEnterAnimationComplete(android.os.IBinder);
- public abstract void scheduleExit();
- public abstract void scheduleInstallProvider(android.content.pm.ProviderInfo);
- public abstract void scheduleLocalVoiceInteractionStarted(android.os.IBinder, com.android.internal.app.IVoiceInteractor);
- public abstract void scheduleLowMemory();
- public abstract void scheduleOnNewActivityOptions(android.os.IBinder, android.os.Bundle);
- public abstract void scheduleReceiver(android.content.Intent, android.content.pm.ActivityInfo, android.content.res.CompatibilityInfo, int, java.lang.String, android.os.Bundle, boolean, int, int);
- public abstract void scheduleRegisteredReceiver(android.content.IIntentReceiver, android.content.Intent, int, java.lang.String, android.os.Bundle, boolean, boolean, int, int);
- public abstract void scheduleServiceArgs(android.os.IBinder, android.content.pm.ParceledListSlice);
- public abstract void scheduleSleeping(android.os.IBinder, boolean);
- public abstract void scheduleStopService(android.os.IBinder);
- public abstract void scheduleSuicide();
- public abstract void scheduleTransaction(android.app.servertransaction.ClientTransaction);
- public abstract void scheduleTranslucentConversionComplete(android.os.IBinder, boolean);
- public abstract void scheduleTrimMemory(int);
- public abstract void scheduleUnbindService(android.os.IBinder, android.content.Intent);
- public abstract void setCoreSettings(android.os.Bundle);
- public abstract void setHttpProxy(java.lang.String, java.lang.String, java.lang.String, android.net.Uri);
- public abstract void setNetworkBlockSeq(long);
- public abstract void setProcessState(int);
- public abstract void setSchedulingGroup(int);
- public abstract void startBinderTracking();
- public abstract void stopBinderTrackingAndDump(android.os.ParcelFileDescriptor);
- public abstract void unstableProviderDied(android.os.IBinder);
- public abstract void updatePackageCompatibilityInfo(java.lang.String, android.content.res.CompatibilityInfo);
- public abstract void updateTimePrefs(int);
- public abstract void updateTimeZone();
-
-
-}
-
--keep class android.app.IApplicationThread$Stub {
- <init>();
-
- public android.os.IBinder asBinder();
- public static android.app.IApplicationThread asInterface(android.os.IBinder);
- public boolean onTransact(int, android.os.Parcel, android.os.Parcel, int);
-
-
-}
-
--keep class android.app.IAssistDataReceiver {
-
- public abstract void onHandleAssistData(android.os.Bundle);
- public abstract void onHandleAssistScreenshot(android.graphics.Bitmap);
-
-
-}
-
--keep class android.app.IInstrumentationWatcher {
-
- public abstract void instrumentationFinished(android.content.ComponentName, int, android.os.Bundle);
- public abstract void instrumentationStatus(android.content.ComponentName, int, android.os.Bundle);
-
-
-}
-
--keep class android.app.IProcessObserver {
-
- public abstract void onForegroundActivitiesChanged(int, int, boolean);
- public abstract void onProcessDied(int, int);
-
-
-}
-
--keep class android.app.IServiceConnection {
-
- public abstract void connected(android.content.ComponentName, android.os.IBinder, boolean);
-
-
-}
-
--keep class android.app.IStopUserCallback {
-
- public abstract void userStopAborted(int);
- public abstract void userStopped(int);
-
-
-}
-
--keep class android.app.ITaskStackListener {
-
- public abstract void onActivityDismissingDockedStack();
- public abstract void onActivityForcedResizable(java.lang.String, int, int);
- public abstract void onActivityLaunchOnSecondaryDisplayFailed();
- public abstract void onActivityPinned(java.lang.String, int, int, int);
- public abstract void onActivityRequestedOrientationChanged(int, int);
- public abstract void onActivityUnpinned();
- public abstract void onPinnedActivityRestartAttempt(boolean);
- public abstract void onPinnedStackAnimationEnded();
- public abstract void onPinnedStackAnimationStarted();
- public abstract void onTaskCreated(int, android.content.ComponentName);
- public abstract void onTaskDescriptionChanged(int, android.app.ActivityManager$TaskDescription);
- public abstract void onTaskMovedToFront(int);
- public abstract void onTaskProfileLocked(int, int);
- public abstract void onTaskRemovalStarted(int);
- public abstract void onTaskRemoved(int);
- public abstract void onTaskSnapshotChanged(int, android.app.ActivityManager$TaskSnapshot);
- public abstract void onTaskStackChanged();
-
-
- public static int FORCED_RESIZEABLE_REASON_SECONDARY_DISPLAY;
- public static int FORCED_RESIZEABLE_REASON_SPLIT_SCREEN;
-}
-
--keep class android.app.IUiAutomationConnection {
-
- public abstract void clearWindowAnimationFrameStats();
- public abstract boolean clearWindowContentFrameStats(int);
- public abstract void connect(android.accessibilityservice.IAccessibilityServiceClient, int);
- public abstract void disconnect();
- public abstract void executeShellCommand(java.lang.String, android.os.ParcelFileDescriptor, android.os.ParcelFileDescriptor);
- public abstract android.view.WindowAnimationFrameStats getWindowAnimationFrameStats();
- public abstract android.view.WindowContentFrameStats getWindowContentFrameStats(int);
- public abstract void grantRuntimePermission(java.lang.String, java.lang.String, int);
- public abstract boolean injectInputEvent(android.view.InputEvent, boolean);
- public abstract void revokeRuntimePermission(java.lang.String, java.lang.String, int);
- public abstract boolean setRotation(int);
- public abstract void shutdown();
- public abstract android.graphics.Bitmap takeScreenshot(android.graphics.Rect, int);
-
-
-}
-
--keep class android.app.IUidObserver {
-
- public abstract void onUidActive(int);
- public abstract void onUidCachedChanged(int, boolean);
- public abstract void onUidGone(int, boolean);
- public abstract void onUidIdle(int, boolean);
- public abstract void onUidStateChanged(int, int, long);
-
-
-}
-
--keep class android.app.IUserSwitchObserver {
-
- public abstract void onForegroundProfileSwitch(int);
- public abstract void onLockedBootComplete(int);
- public abstract void onUserSwitchComplete(int);
- public abstract void onUserSwitching(int, android.os.IRemoteCallback);
-
-
-}
-
--keep class android.app.Instrumentation {
- <init>();
-
- public android.os.TestLooperManager acquireLooperManager(android.os.Looper);
- public void addMonitor(android.app.Instrumentation$ActivityMonitor);
- public android.app.Instrumentation$ActivityMonitor addMonitor(android.content.IntentFilter, android.app.Instrumentation$ActivityResult, boolean);
- public android.app.Instrumentation$ActivityMonitor addMonitor(java.lang.String, android.app.Instrumentation$ActivityResult, boolean);
- public void addResults(android.os.Bundle);
- public void callActivityOnCreate(android.app.Activity, android.os.Bundle);
- public void callActivityOnCreate(android.app.Activity, android.os.Bundle, android.os.PersistableBundle);
- public void callActivityOnDestroy(android.app.Activity);
- public void callActivityOnNewIntent(android.app.Activity, android.content.Intent);
- public void callActivityOnNewIntent(android.app.Activity, com.android.internal.content.ReferrerIntent);
- public void callActivityOnPause(android.app.Activity);
- public void callActivityOnPostCreate(android.app.Activity, android.os.Bundle);
- public void callActivityOnPostCreate(android.app.Activity, android.os.Bundle, android.os.PersistableBundle);
- public void callActivityOnRestart(android.app.Activity);
- public void callActivityOnRestoreInstanceState(android.app.Activity, android.os.Bundle);
- public void callActivityOnRestoreInstanceState(android.app.Activity, android.os.Bundle, android.os.PersistableBundle);
- public void callActivityOnResume(android.app.Activity);
- public void callActivityOnSaveInstanceState(android.app.Activity, android.os.Bundle);
- public void callActivityOnSaveInstanceState(android.app.Activity, android.os.Bundle, android.os.PersistableBundle);
- public void callActivityOnStart(android.app.Activity);
- public void callActivityOnStop(android.app.Activity);
- public void callActivityOnUserLeaving(android.app.Activity);
- public void callApplicationOnCreate(android.app.Application);
- public boolean checkMonitorHit(android.app.Instrumentation$ActivityMonitor, int);
- public static void checkStartActivityResult(int, java.lang.Object);
- public void endPerformanceSnapshot();
- public void execStartActivities(android.content.Context, android.os.IBinder, android.os.IBinder, android.app.Activity, android.content.Intent[], android.os.Bundle);
- public int execStartActivitiesAsUser(android.content.Context, android.os.IBinder, android.os.IBinder, android.app.Activity, android.content.Intent[], android.os.Bundle, int);
- public android.app.Instrumentation$ActivityResult execStartActivity(android.content.Context, android.os.IBinder, android.os.IBinder, android.app.Activity, android.content.Intent, int, android.os.Bundle);
- public android.app.Instrumentation$ActivityResult execStartActivity(android.content.Context, android.os.IBinder, android.os.IBinder, java.lang.String, android.content.Intent, int, android.os.Bundle);
- public android.app.Instrumentation$ActivityResult execStartActivity(android.content.Context, android.os.IBinder, android.os.IBinder, java.lang.String, android.content.Intent, int, android.os.Bundle, android.os.UserHandle);
- public android.app.Instrumentation$ActivityResult execStartActivityAsCaller(android.content.Context, android.os.IBinder, android.os.IBinder, android.app.Activity, android.content.Intent, int, android.os.Bundle, boolean, int);
- public void execStartActivityFromAppTask(android.content.Context, android.os.IBinder, android.app.IAppTask, android.content.Intent, android.os.Bundle);
- public void finish(int, android.os.Bundle);
- public android.os.Bundle getAllocCounts();
- public android.os.Bundle getBinderCounts();
- public android.content.ComponentName getComponentName();
- public android.content.Context getContext();
- public java.lang.String getProcessName();
- public android.content.Context getTargetContext();
- public android.app.UiAutomation getUiAutomation();
- public android.app.UiAutomation getUiAutomation(int);
- public boolean invokeContextMenuAction(android.app.Activity, int, int);
- public boolean invokeMenuActionSync(android.app.Activity, int, int);
- public boolean isProfiling();
- public android.app.Activity newActivity(java.lang.Class, android.content.Context, android.os.IBinder, android.app.Application, android.content.Intent, android.content.pm.ActivityInfo, java.lang.CharSequence, android.app.Activity, java.lang.String, java.lang.Object);
- public android.app.Activity newActivity(java.lang.ClassLoader, java.lang.String, android.content.Intent);
- public android.app.Application newApplication(java.lang.ClassLoader, java.lang.String, android.content.Context);
- public static android.app.Application newApplication(java.lang.Class, android.content.Context);
- public void onCreate(android.os.Bundle);
- public void onDestroy();
- public boolean onException(java.lang.Object, java.lang.Throwable);
- public void onStart();
- public void removeMonitor(android.app.Instrumentation$ActivityMonitor);
- public void runOnMainSync(java.lang.Runnable);
- public void sendCharacterSync(int);
- public void sendKeyDownUpSync(int);
- public void sendKeySync(android.view.KeyEvent);
- public void sendPointerSync(android.view.MotionEvent);
- public void sendStatus(int, android.os.Bundle);
- public void sendStringSync(java.lang.String);
- public void sendTrackballEventSync(android.view.MotionEvent);
- public void setAutomaticPerformanceSnapshots();
- public void setInTouchMode(boolean);
- public void start();
- public android.app.Activity startActivitySync(android.content.Intent);
- public android.app.Activity startActivitySync(android.content.Intent, android.os.Bundle);
- public void startAllocCounting();
- public void startPerformanceSnapshot();
- public void startProfiling();
- public void stopAllocCounting();
- public void stopProfiling();
- public void waitForIdle(java.lang.Runnable);
- public void waitForIdleSync();
- public android.app.Activity waitForMonitor(android.app.Instrumentation$ActivityMonitor);
- public android.app.Activity waitForMonitorWithTimeout(android.app.Instrumentation$ActivityMonitor, long);
-
-
- public static java.lang.String REPORT_KEY_IDENTIFIER;
- public static java.lang.String REPORT_KEY_STREAMRESULT;
-}
-
--keep class android.app.Instrumentation$ActivityMonitor {
- <init>(android.content.IntentFilter, android.app.Instrumentation$ActivityResult, boolean);
- <init>(java.lang.String, android.app.Instrumentation$ActivityResult, boolean);
- <init>();
-
- public android.content.IntentFilter getFilter();
- public int getHits();
- public android.app.Activity getLastActivity();
- public android.app.Instrumentation$ActivityResult getResult();
- public boolean isBlocking();
- public android.app.Instrumentation$ActivityResult onStartActivity(android.content.Intent);
- public android.app.Activity waitForActivity();
- public android.app.Activity waitForActivityWithTimeout(long);
-
-
-}
-
--keep class android.app.Instrumentation$ActivityResult {
- <init>(int, android.content.Intent);
-
- public int getResultCode();
- public android.content.Intent getResultData();
-
-
-}
-
--keep class android.app.LoadedApk {
- <init>(android.app.ActivityThread, android.content.pm.ApplicationInfo, android.content.res.CompatibilityInfo, java.lang.ClassLoader, boolean, boolean, boolean);
-
- public android.content.IIntentReceiver forgetReceiverDispatcher(android.content.Context, android.content.BroadcastReceiver);
- public android.app.IServiceConnection forgetServiceDispatcher(android.content.Context, android.content.ServiceConnection);
- public java.lang.String getAppDir();
- public android.app.AppComponentFactory getAppFactory();
- public android.content.pm.ApplicationInfo getApplicationInfo();
- public android.content.res.AssetManager getAssets();
- public java.lang.ClassLoader getClassLoader();
- public android.content.res.CompatibilityInfo getCompatibilityInfo();
- public java.io.File getCredentialProtectedDataDirFile();
- public java.lang.String getDataDir();
- public java.io.File getDataDirFile();
- public java.io.File getDeviceProtectedDataDirFile();
- public java.lang.String getLibDir();
- public java.lang.String[] getOverlayDirs();
- public java.lang.String getPackageName();
- public android.content.IIntentReceiver getReceiverDispatcher(android.content.BroadcastReceiver, android.content.Context, android.os.Handler, android.app.Instrumentation, boolean);
- public java.lang.String getResDir();
- public android.content.res.Resources getResources();
- public android.app.IServiceConnection getServiceDispatcher(android.content.ServiceConnection, android.content.Context, android.os.Handler, int);
- public java.lang.String[] getSplitAppDirs();
- public java.lang.String[] getSplitResDirs();
- public int getTargetSdkVersion();
- public boolean isSecurityViolation();
- public android.app.Application makeApplication(boolean, android.app.Instrumentation);
- public static void makePaths(android.app.ActivityThread, android.content.pm.ApplicationInfo, java.util.List);
- public static void makePaths(android.app.ActivityThread, boolean, android.content.pm.ApplicationInfo, java.util.List, java.util.List);
- public void removeContextRegistrations(android.content.Context, java.lang.String, java.lang.String);
- public void setCompatibilityInfo(android.content.res.CompatibilityInfo);
- public void updateApplicationInfo(android.content.pm.ApplicationInfo, java.util.List);
-
-
-}
-
--keep class android.app.LoaderManager {
- <init>();
-
- public abstract void destroyLoader(int);
- public abstract void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
- public static void enableDebugLogging(boolean);
- public android.app.FragmentHostCallback getFragmentHostCallback();
- public abstract android.content.Loader getLoader(int);
- public abstract android.content.Loader initLoader(int, android.os.Bundle, android.app.LoaderManager$LoaderCallbacks);
- public abstract android.content.Loader restartLoader(int, android.os.Bundle, android.app.LoaderManager$LoaderCallbacks);
-
-
-}
-
--keep class android.app.LoaderManager$LoaderCallbacks {
-
- public abstract android.content.Loader onCreateLoader(int, android.os.Bundle);
- public abstract void onLoadFinished(android.content.Loader, java.lang.Object);
- public abstract void onLoaderReset(android.content.Loader);
-
-
-}
-
--keep class android.app.Notification {
- <init>();
- <init>(android.content.Context, int, java.lang.CharSequence, long, java.lang.CharSequence, java.lang.CharSequence, android.content.Intent);
- <init>(int, java.lang.CharSequence, long);
- <init>(android.os.Parcel);
-
- public static void addFieldsFromContext(android.content.Context, android.app.Notification);
- public static void addFieldsFromContext(android.content.pm.ApplicationInfo, android.app.Notification);
- public static boolean areActionsVisiblyDifferent(android.app.Notification, android.app.Notification);
- public static boolean areRemoteViewsChanged(android.app.Notification$Builder, android.app.Notification$Builder);
- public static boolean areStyledNotificationsVisiblyDifferent(android.app.Notification$Builder, android.app.Notification$Builder);
- public android.app.Notification clone();
- public java.lang.Object clone();
- public void cloneInto(android.app.Notification, boolean);
- public int describeContents();
- public int getBadgeIconType();
- public java.lang.String getChannel();
- public java.lang.String getChannelId();
- public java.lang.String getGroup();
- public int getGroupAlertBehavior();
- public android.graphics.drawable.Icon getLargeIcon();
- public java.lang.Class getNotificationStyle();
- public static java.lang.Class getNotificationStyleClass(java.lang.String);
- public java.lang.CharSequence getSettingsText();
- public java.lang.String getShortcutId();
- public android.graphics.drawable.Icon getSmallIcon();
- public java.lang.String getSortKey();
- public long getTimeout();
- public long getTimeoutAfter();
- public boolean hasCompletedProgress();
- public boolean hasMediaSession();
- public boolean isColorized();
- public boolean isColorizedMedia();
- public boolean isGroupChild();
- public boolean isGroupSummary();
- public boolean isMediaNotification();
- public void lightenPayload();
- public static java.lang.String priorityToString(int);
- public static java.lang.CharSequence safeCharSequence(java.lang.CharSequence);
- public void setLatestEventInfo(android.content.Context, java.lang.CharSequence, java.lang.CharSequence, android.app.PendingIntent);
- public void setSmallIcon(android.graphics.drawable.Icon);
- public boolean showsChronometer();
- public boolean showsTime();
- public boolean suppressAlertingDueToGrouping();
- public java.lang.String toString();
- public static java.lang.String visibilityToString(int);
- public void visitUris(java.util.function.Consumer);
- public void writeToParcel(android.os.Parcel, int);
- public void writeToProto(android.util.proto.ProtoOutputStream, long);
-
-
- public static android.media.AudioAttributes AUDIO_ATTRIBUTES_DEFAULT;
- public static int BADGE_ICON_LARGE;
- public static int BADGE_ICON_NONE;
- public static int BADGE_ICON_SMALL;
- public static java.lang.String CATEGORY_ALARM;
- public static java.lang.String CATEGORY_CALL;
- public static java.lang.String CATEGORY_CAR_EMERGENCY;
- public static java.lang.String CATEGORY_CAR_INFORMATION;
- public static java.lang.String CATEGORY_CAR_WARNING;
- public static java.lang.String CATEGORY_EMAIL;
- public static java.lang.String CATEGORY_ERROR;
- public static java.lang.String CATEGORY_EVENT;
- public static java.lang.String CATEGORY_MESSAGE;
- public static java.lang.String CATEGORY_NAVIGATION;
- public static java.lang.String CATEGORY_PROGRESS;
- public static java.lang.String CATEGORY_PROMO;
- public static java.lang.String CATEGORY_RECOMMENDATION;
- public static java.lang.String CATEGORY_REMINDER;
- public static java.lang.String CATEGORY_SERVICE;
- public static java.lang.String CATEGORY_SOCIAL;
- public static java.lang.String CATEGORY_STATUS;
- public static java.lang.String CATEGORY_SYSTEM;
- public static java.lang.String CATEGORY_TRANSPORT;
- public static int COLOR_DEFAULT;
- public static int COLOR_INVALID;
- public static android.os.Parcelable$Creator CREATOR;
- public static int DEFAULT_ALL;
- public static int DEFAULT_LIGHTS;
- public static int DEFAULT_SOUND;
- public static int DEFAULT_VIBRATE;
- public static java.lang.String EXTRA_ALLOW_DURING_SETUP;
- public static java.lang.String EXTRA_AUDIO_CONTENTS_URI;
- public static java.lang.String EXTRA_BACKGROUND_IMAGE_URI;
- public static java.lang.String EXTRA_BIG_TEXT;
- public static java.lang.String EXTRA_BUILDER_APPLICATION_INFO;
- public static java.lang.String EXTRA_CHANNEL_GROUP_ID;
- public static java.lang.String EXTRA_CHANNEL_ID;
- public static java.lang.String EXTRA_CHRONOMETER_COUNT_DOWN;
- public static java.lang.String EXTRA_COLORIZED;
- public static java.lang.String EXTRA_COMPACT_ACTIONS;
- public static java.lang.String EXTRA_CONTAINS_CUSTOM_VIEW;
- public static java.lang.String EXTRA_CONVERSATION_TITLE;
- public static java.lang.String EXTRA_FOREGROUND_APPS;
- public static java.lang.String EXTRA_HIDE_SMART_REPLIES;
- public static java.lang.String EXTRA_HISTORIC_MESSAGES;
- public static java.lang.String EXTRA_INFO_TEXT;
- public static java.lang.String EXTRA_IS_GROUP_CONVERSATION;
- public static java.lang.String EXTRA_LARGE_ICON;
- public static java.lang.String EXTRA_LARGE_ICON_BIG;
- public static java.lang.String EXTRA_MEDIA_SESSION;
- public static java.lang.String EXTRA_MESSAGES;
- public static java.lang.String EXTRA_MESSAGING_PERSON;
- public static java.lang.String EXTRA_NOTIFICATION_ID;
- public static java.lang.String EXTRA_NOTIFICATION_TAG;
- public static java.lang.String EXTRA_PEOPLE;
- public static java.lang.String EXTRA_PEOPLE_LIST;
- public static java.lang.String EXTRA_PICTURE;
- public static java.lang.String EXTRA_PROGRESS;
- public static java.lang.String EXTRA_PROGRESS_INDETERMINATE;
- public static java.lang.String EXTRA_PROGRESS_MAX;
- public static java.lang.String EXTRA_REDUCED_IMAGES;
- public static java.lang.String EXTRA_REMOTE_INPUT_DRAFT;
- public static java.lang.String EXTRA_REMOTE_INPUT_HISTORY;
- public static java.lang.String EXTRA_SELF_DISPLAY_NAME;
- public static java.lang.String EXTRA_SHOW_CHRONOMETER;
- public static java.lang.String EXTRA_SHOW_REMOTE_INPUT_SPINNER;
- public static java.lang.String EXTRA_SHOW_WHEN;
- public static java.lang.String EXTRA_SMALL_ICON;
- public static java.lang.String EXTRA_SUBSTITUTE_APP_NAME;
- public static java.lang.String EXTRA_SUB_TEXT;
- public static java.lang.String EXTRA_SUMMARY_TEXT;
- public static java.lang.String EXTRA_TEMPLATE;
- public static java.lang.String EXTRA_TEXT;
- public static java.lang.String EXTRA_TEXT_LINES;
- public static java.lang.String EXTRA_TITLE;
- public static java.lang.String EXTRA_TITLE_BIG;
- public static int FLAG_AUTOGROUP_SUMMARY;
- public static int FLAG_AUTO_CANCEL;
- public static int FLAG_CAN_COLORIZE;
- public static int FLAG_FOREGROUND_SERVICE;
- public static int FLAG_GROUP_SUMMARY;
- public static int FLAG_HIGH_PRIORITY;
- public static int FLAG_INSISTENT;
- public static int FLAG_LOCAL_ONLY;
- public static int FLAG_NO_CLEAR;
- public static int FLAG_ONGOING_EVENT;
- public static int FLAG_ONLY_ALERT_ONCE;
- public static int FLAG_SHOW_LIGHTS;
- public static int GROUP_ALERT_ALL;
- public static int GROUP_ALERT_CHILDREN;
- public static int GROUP_ALERT_SUMMARY;
- public static java.lang.String INTENT_CATEGORY_NOTIFICATION_PREFERENCES;
- public static int PRIORITY_DEFAULT;
- public static int PRIORITY_HIGH;
- public static int PRIORITY_LOW;
- public static int PRIORITY_MAX;
- public static int PRIORITY_MIN;
- public static int STREAM_DEFAULT;
- public static int VISIBILITY_PRIVATE;
- public static int VISIBILITY_PUBLIC;
- public static int VISIBILITY_SECRET;
- public android.app.Notification$Action[] actions;
- public android.util.ArraySet allPendingIntents;
- public android.media.AudioAttributes audioAttributes;
- public int audioStreamType;
- public android.widget.RemoteViews bigContentView;
- public java.lang.String category;
- public int color;
- public android.app.PendingIntent contentIntent;
- public android.widget.RemoteViews contentView;
- public int defaults;
- public android.app.PendingIntent deleteIntent;
- public android.os.Bundle extras;
- public int flags;
- public android.app.PendingIntent fullScreenIntent;
- public android.widget.RemoteViews headsUpContentView;
- public int icon;
- public int iconLevel;
- public android.graphics.Bitmap largeIcon;
- public int ledARGB;
- public int ledOffMS;
- public int ledOnMS;
- public int number;
- public int priority;
- public static android.os.IBinder processWhitelistToken;
- public android.app.Notification publicVersion;
- public android.net.Uri sound;
- public java.lang.CharSequence tickerText;
- public android.widget.RemoteViews tickerView;
- public long[] vibrate;
- public int visibility;
- public long when;
-}
-
--keep class android.app.Notification$Action {
- <init>(int, java.lang.CharSequence, android.app.PendingIntent);
-
- public android.app.Notification$Action clone();
- public java.lang.Object clone();
- public int describeContents();
- public boolean getAllowGeneratedReplies();
- public android.app.RemoteInput[] getDataOnlyRemoteInputs();
- public android.os.Bundle getExtras();
- public android.graphics.drawable.Icon getIcon();
- public android.app.RemoteInput[] getRemoteInputs();
- public int getSemanticAction();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public static int SEMANTIC_ACTION_ARCHIVE;
- public static int SEMANTIC_ACTION_CALL;
- public static int SEMANTIC_ACTION_DELETE;
- public static int SEMANTIC_ACTION_MARK_AS_READ;
- public static int SEMANTIC_ACTION_MARK_AS_UNREAD;
- public static int SEMANTIC_ACTION_MUTE;
- public static int SEMANTIC_ACTION_NONE;
- public static int SEMANTIC_ACTION_REPLY;
- public static int SEMANTIC_ACTION_THUMBS_DOWN;
- public static int SEMANTIC_ACTION_THUMBS_UP;
- public static int SEMANTIC_ACTION_UNMUTE;
- public android.app.PendingIntent actionIntent;
- public int icon;
- public java.lang.CharSequence title;
-}
-
--keep class android.app.Notification$Builder {
- <init>(android.content.Context, java.lang.String);
- <init>(android.content.Context);
- <init>(android.content.Context, android.app.Notification);
-
- public android.app.Notification$Builder addAction(int, java.lang.CharSequence, android.app.PendingIntent);
- public android.app.Notification$Builder addAction(android.app.Notification$Action);
- public android.app.Notification$Builder addExtras(android.os.Bundle);
- public android.app.Notification$Builder addPerson(java.lang.String);
- public android.app.Notification$Builder addPerson(android.app.Person);
- public android.app.Notification build();
- public android.app.Notification buildInto(android.app.Notification);
- public android.app.Notification buildUnstyled();
- public android.widget.RemoteViews createBigContentView();
- public android.widget.RemoteViews createContentView();
- public android.widget.RemoteViews createContentView(boolean);
- public android.widget.RemoteViews createHeadsUpContentView(boolean);
- public android.widget.RemoteViews createHeadsUpContentView();
- public android.app.Notification$Builder extend(android.app.Notification$Extender);
- public android.os.Bundle getExtras();
- public java.lang.CharSequence getHeadsUpStatusBarText(boolean);
- public android.app.Notification getNotification();
- public int getPrimaryTextColor();
- public int getSecondaryTextColor();
- public android.app.Notification$Style getStyle();
- public java.lang.String loadHeaderAppName();
- public android.widget.RemoteViews makeAmbientNotification();
- public static void makeHeaderExpanded(android.widget.RemoteViews);
- public android.widget.RemoteViews makeLowPriorityContentView(boolean);
- public android.widget.RemoteViews makeNotificationHeader(boolean);
- public android.widget.RemoteViews makePublicAmbientNotification();
- public android.widget.RemoteViews makePublicContentView();
- public static android.app.Notification maybeCloneStrippedForDelivery(android.app.Notification, boolean, android.content.Context);
- public static android.app.Notification$Builder recoverBuilder(android.content.Context, android.app.Notification);
- public android.app.Notification$Builder setActions(android.app.Notification$Action[]);
- public android.app.Notification$Builder setAutoCancel(boolean);
- public android.app.Notification$Builder setBadgeIconType(int);
- public android.app.Notification$Builder setCategory(java.lang.String);
- public android.app.Notification$Builder setChannel(java.lang.String);
- public android.app.Notification$Builder setChannelId(java.lang.String);
- public android.app.Notification$Builder setChronometerCountDown(boolean);
- public android.app.Notification$Builder setColor(int);
- public void setColorPalette(int, int);
- public android.app.Notification$Builder setColorized(boolean);
- public android.app.Notification$Builder setContent(android.widget.RemoteViews);
- public android.app.Notification$Builder setContentInfo(java.lang.CharSequence);
- public android.app.Notification$Builder setContentIntent(android.app.PendingIntent);
- public android.app.Notification$Builder setContentText(java.lang.CharSequence);
- public android.app.Notification$Builder setContentTitle(java.lang.CharSequence);
- public android.app.Notification$Builder setCustomBigContentView(android.widget.RemoteViews);
- public android.app.Notification$Builder setCustomContentView(android.widget.RemoteViews);
- public android.app.Notification$Builder setCustomHeadsUpContentView(android.widget.RemoteViews);
- public android.app.Notification$Builder setDefaults(int);
- public android.app.Notification$Builder setDeleteIntent(android.app.PendingIntent);
- public android.app.Notification$Builder setExtras(android.os.Bundle);
- public android.app.Notification$Builder setFlag(int, boolean);
- public android.app.Notification$Builder setFullScreenIntent(android.app.PendingIntent, boolean);
- public android.app.Notification$Builder setGroup(java.lang.String);
- public android.app.Notification$Builder setGroupAlertBehavior(int);
- public android.app.Notification$Builder setGroupSummary(boolean);
- public android.app.Notification$Builder setHideSmartReplies(boolean);
- public android.app.Notification$Builder setLargeIcon(android.graphics.Bitmap);
- public android.app.Notification$Builder setLargeIcon(android.graphics.drawable.Icon);
- public android.app.Notification$Builder setLights(int, int, int);
- public android.app.Notification$Builder setLocalOnly(boolean);
- public android.app.Notification$Builder setNumber(int);
- public android.app.Notification$Builder setOngoing(boolean);
- public android.app.Notification$Builder setOnlyAlertOnce(boolean);
- public android.app.Notification$Builder setPriority(int);
- public android.app.Notification$Builder setProgress(int, int, boolean);
- public android.app.Notification$Builder setPublicVersion(android.app.Notification);
- public void setRebuildStyledRemoteViews(boolean);
- public android.app.Notification$Builder setRemoteInputHistory(java.lang.CharSequence[]);
- public android.app.Notification$Builder setSettingsText(java.lang.CharSequence);
- public android.app.Notification$Builder setShortcutId(java.lang.String);
- public android.app.Notification$Builder setShowRemoteInputSpinner(boolean);
- public android.app.Notification$Builder setShowWhen(boolean);
- public android.app.Notification$Builder setSmallIcon(int);
- public android.app.Notification$Builder setSmallIcon(int, int);
- public android.app.Notification$Builder setSmallIcon(android.graphics.drawable.Icon);
- public android.app.Notification$Builder setSortKey(java.lang.String);
- public android.app.Notification$Builder setSound(android.net.Uri);
- public android.app.Notification$Builder setSound(android.net.Uri, int);
- public android.app.Notification$Builder setSound(android.net.Uri, android.media.AudioAttributes);
- public android.app.Notification$Builder setStyle(android.app.Notification$Style);
- public android.app.Notification$Builder setSubText(java.lang.CharSequence);
- public android.app.Notification$Builder setTicker(java.lang.CharSequence);
- public android.app.Notification$Builder setTicker(java.lang.CharSequence, android.widget.RemoteViews);
- public android.app.Notification$Builder setTimeout(long);
- public android.app.Notification$Builder setTimeoutAfter(long);
- public android.app.Notification$Builder setUsesChronometer(boolean);
- public android.app.Notification$Builder setVibrate(long[]);
- public android.app.Notification$Builder setVisibility(int);
- public android.app.Notification$Builder setWhen(long);
- public boolean usesStandardHeader();
-
-
- public static java.lang.String EXTRA_REBUILD_BIG_CONTENT_VIEW_ACTION_COUNT;
- public static java.lang.String EXTRA_REBUILD_CONTENT_VIEW_ACTION_COUNT;
- public static java.lang.String EXTRA_REBUILD_HEADS_UP_CONTENT_VIEW_ACTION_COUNT;
-}
-
--keep class android.app.Notification$Extender {
-
- public abstract android.app.Notification$Builder extend(android.app.Notification$Builder);
-
-
-}
-
--keep class android.app.Notification$Style {
- <init>();
-
- public void addExtras(android.os.Bundle);
- public abstract boolean areNotificationsVisiblyDifferent(android.app.Notification$Style);
- public android.app.Notification build();
- public android.app.Notification buildStyled(android.app.Notification);
- protected void checkBuilder();
- public boolean displayCustomViewInline();
- public java.lang.CharSequence getHeadsUpStatusBarText();
- protected android.widget.RemoteViews getStandardView(int);
- protected android.widget.RemoteViews getStandardView(int, android.app.Notification$TemplateBindResult);
- protected boolean hasProgress();
- public boolean hasSummaryInHeader();
- protected void internalSetBigContentTitle(java.lang.CharSequence);
- protected void internalSetSummaryText(java.lang.CharSequence);
- public android.widget.RemoteViews makeBigContentView();
- public android.widget.RemoteViews makeContentView(boolean);
- public android.widget.RemoteViews makeHeadsUpContentView(boolean);
- public void purgeResources();
- public void reduceImageSizes(android.content.Context);
- protected void restoreFromExtras(android.os.Bundle);
- public void setBuilder(android.app.Notification$Builder);
- public void validate(android.content.Context);
-
-
- protected android.app.Notification$Builder mBuilder;
- protected java.lang.CharSequence mSummaryText;
- protected boolean mSummaryTextSet;
-}
-
--keep class android.app.Notification$TemplateBindResult {
-
- public int getIconMarginEnd();
- public void setIconMarginEnd(int);
-
-
-}
-
--keep class android.app.OnActivityPausedListener {
-
- public abstract void onPaused(android.app.Activity);
-
-
-}
-
--keep class android.app.PendingIntent {
-
- public void cancel();
- public int describeContents();
- public boolean equals(java.lang.Object);
- public static android.app.PendingIntent getActivities(android.content.Context, int, android.content.Intent[], int);
- public static android.app.PendingIntent getActivities(android.content.Context, int, android.content.Intent[], int, android.os.Bundle);
- public static android.app.PendingIntent getActivitiesAsUser(android.content.Context, int, android.content.Intent[], int, android.os.Bundle, android.os.UserHandle);
- public static android.app.PendingIntent getActivity(android.content.Context, int, android.content.Intent, int);
- public static android.app.PendingIntent getActivity(android.content.Context, int, android.content.Intent, int, android.os.Bundle);
- public static android.app.PendingIntent getActivityAsUser(android.content.Context, int, android.content.Intent, int, android.os.Bundle, android.os.UserHandle);
- public static android.app.PendingIntent getBroadcast(android.content.Context, int, android.content.Intent, int);
- public static android.app.PendingIntent getBroadcastAsUser(android.content.Context, int, android.content.Intent, int, android.os.UserHandle);
- public java.lang.String getCreatorPackage();
- public int getCreatorUid();
- public android.os.UserHandle getCreatorUserHandle();
- public static android.app.PendingIntent getForegroundService(android.content.Context, int, android.content.Intent, int);
- public android.content.Intent getIntent();
- public android.content.IntentSender getIntentSender();
- public static android.app.PendingIntent getService(android.content.Context, int, android.content.Intent, int);
- public java.lang.String getTag(java.lang.String);
- public android.content.IIntentSender getTarget();
- public java.lang.String getTargetPackage();
- public android.os.IBinder getWhitelistToken();
- public int hashCode();
- public boolean isActivity();
- public boolean isForegroundService();
- public boolean isTargetedToPackage();
- public static android.app.PendingIntent readPendingIntentOrNullFromParcel(android.os.Parcel);
- public void registerCancelListener(android.app.PendingIntent$CancelListener);
- public void send();
- public void send(int);
- public void send(android.content.Context, int, android.content.Intent);
- public void send(int, android.app.PendingIntent$OnFinished, android.os.Handler);
- public void send(android.content.Context, int, android.content.Intent, android.app.PendingIntent$OnFinished, android.os.Handler);
- public void send(android.content.Context, int, android.content.Intent, android.app.PendingIntent$OnFinished, android.os.Handler, java.lang.String);
- public void send(android.content.Context, int, android.content.Intent, android.app.PendingIntent$OnFinished, android.os.Handler, java.lang.String, android.os.Bundle);
- public int sendAndReturnResult(android.content.Context, int, android.content.Intent, android.app.PendingIntent$OnFinished, android.os.Handler, java.lang.String, android.os.Bundle);
- public static void setOnMarshaledListener(android.app.PendingIntent$OnMarshaledListener);
- public java.lang.String toString();
- public void unregisterCancelListener(android.app.PendingIntent$CancelListener);
- public static void writePendingIntentOrNullToParcel(android.app.PendingIntent, android.os.Parcel);
- public void writeToParcel(android.os.Parcel, int);
- public void writeToProto(android.util.proto.ProtoOutputStream, long);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public static int FLAG_CANCEL_CURRENT;
- public static int FLAG_IMMUTABLE;
- public static int FLAG_NO_CREATE;
- public static int FLAG_ONE_SHOT;
- public static int FLAG_UPDATE_CURRENT;
-}
-
--keep class android.app.PendingIntent$CancelListener {
-
- public abstract void onCancelled(android.app.PendingIntent);
-
-
-}
-
--keep class android.app.PendingIntent$CanceledException {
- <init>();
- <init>(java.lang.String);
- <init>(java.lang.Exception);
-
-
-
-}
-
--keep class android.app.PendingIntent$OnFinished {
-
- public abstract void onSendFinished(android.app.PendingIntent, android.content.Intent, int, java.lang.String, android.os.Bundle);
-
-
-}
-
--keep class android.app.PendingIntent$OnMarshaledListener {
-
- public abstract void onMarshaled(android.app.PendingIntent, android.os.Parcel, int);
-
-
-}
-
--keep class android.app.Person {
-
- public int describeContents();
- public android.graphics.drawable.Icon getIcon();
- public java.lang.String getKey();
- public java.lang.CharSequence getName();
- public java.lang.String getUri();
- public boolean isBot();
- public boolean isImportant();
- public java.lang.String resolveToLegacyUri();
- public android.app.Person$Builder toBuilder();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.app.Person$Builder {
- <init>();
-
- public android.app.Person build();
- public android.app.Person$Builder setBot(boolean);
- public android.app.Person$Builder setIcon(android.graphics.drawable.Icon);
- public android.app.Person$Builder setImportant(boolean);
- public android.app.Person$Builder setKey(java.lang.String);
- public android.app.Person$Builder setName(java.lang.CharSequence);
- public android.app.Person$Builder setUri(java.lang.String);
-
-
-}
-
--keep class android.app.PictureInPictureArgs {
- <init>();
- <init>(float, java.util.List);
-
- public static android.app.PictureInPictureArgs convert(android.app.PictureInPictureParams);
- public static android.app.PictureInPictureParams convert(android.app.PictureInPictureArgs);
- public void copyOnlySet(android.app.PictureInPictureArgs);
- public int describeContents();
- public java.util.List getActions();
- public float getAspectRatio();
- public android.util.Rational getAspectRatioRational();
- public android.graphics.Rect getSourceRectHint();
- public android.graphics.Rect getSourceRectHintInsets();
- public boolean hasSetActions();
- public boolean hasSetAspectRatio();
- public boolean hasSourceBoundsHint();
- public boolean hasSourceBoundsHintInsets();
- public void setActions(java.util.List);
- public void setAspectRatio(float);
- public void setSourceRectHint(android.graphics.Rect);
- public void setSourceRectHintInsets(android.graphics.Rect);
- public void truncateActions(int);
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.app.PictureInPictureParams {
-
- public void copyOnlySet(android.app.PictureInPictureParams);
- public int describeContents();
- public java.util.List getActions();
- public float getAspectRatio();
- public android.util.Rational getAspectRatioRational();
- public android.graphics.Rect getSourceRectHint();
- public boolean hasSetActions();
- public boolean hasSetAspectRatio();
- public boolean hasSourceBoundsHint();
- public void truncateActions(int);
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.app.ProfilerInfo {
- <init>(java.lang.String, android.os.ParcelFileDescriptor, int, boolean, boolean, java.lang.String, boolean);
- <init>(android.app.ProfilerInfo);
-
- public void closeFd();
- public int describeContents();
- public boolean equals(java.lang.Object);
- public int hashCode();
- public android.app.ProfilerInfo setAgent(java.lang.String, boolean);
- public void writeToParcel(android.os.Parcel, int);
- public void writeToProto(android.util.proto.ProtoOutputStream, long);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public java.lang.String agent;
- public boolean attachAgentDuringBind;
- public boolean autoStopProfiler;
- public android.os.ParcelFileDescriptor profileFd;
- public java.lang.String profileFile;
- public int samplingInterval;
- public boolean streamingOutput;
-}
-
--keep class android.app.RemoteAction {
- <init>(android.graphics.drawable.Icon, java.lang.CharSequence, java.lang.CharSequence, android.app.PendingIntent);
-
- public android.app.RemoteAction clone();
- public java.lang.Object clone();
- public int describeContents();
- public void dump(java.lang.String, java.io.PrintWriter);
- public android.app.PendingIntent getActionIntent();
- public java.lang.CharSequence getContentDescription();
- public android.graphics.drawable.Icon getIcon();
- public java.lang.CharSequence getTitle();
- public boolean isEnabled();
- public void setEnabled(boolean);
- public void setShouldShowIcon(boolean);
- public boolean shouldShowIcon();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.app.RemoteInput {
-
- public static void addDataResultToIntent(android.app.RemoteInput, android.content.Intent, java.util.Map);
- public static void addResultsToIntent(android.app.RemoteInput[], android.content.Intent, android.os.Bundle);
- public int describeContents();
- public boolean getAllowFreeFormInput();
- public java.util.Set getAllowedDataTypes();
- public java.lang.CharSequence[] getChoices();
- public static java.util.Map getDataResultsFromIntent(android.content.Intent, java.lang.String);
- public android.os.Bundle getExtras();
- public java.lang.CharSequence getLabel();
- public java.lang.String getResultKey();
- public static android.os.Bundle getResultsFromIntent(android.content.Intent);
- public static int getResultsSource(android.content.Intent);
- public boolean isDataOnly();
- public static void setResultsSource(android.content.Intent, int);
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public static java.lang.String EXTRA_RESULTS_DATA;
- public static java.lang.String RESULTS_CLIP_LABEL;
- public static int SOURCE_CHOICE;
- public static int SOURCE_FREE_FORM_INPUT;
-}
-
--keep class android.app.ResultInfo {
- <init>(java.lang.String, int, int, android.content.Intent);
- <init>(android.os.Parcel);
-
- public int describeContents();
- public boolean equals(java.lang.Object);
- public int hashCode();
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public android.content.Intent mData;
- public int mRequestCode;
- public int mResultCode;
- public java.lang.String mResultWho;
-}
-
--keep class android.app.Service {
- <init>();
-
- public void attach(android.content.Context, android.app.ActivityThread, java.lang.String, android.os.IBinder, android.app.Application, java.lang.Object);
- public void detachAndCleanUp();
- protected void dump(java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
- public android.app.Application getApplication();
- public abstract android.os.IBinder onBind(android.content.Intent);
- public void onConfigurationChanged(android.content.res.Configuration);
- public void onCreate();
- public void onDestroy();
- public void onLowMemory();
- public void onRebind(android.content.Intent);
- public void onStart(android.content.Intent, int);
- public int onStartCommand(android.content.Intent, int, int);
- public void onTaskRemoved(android.content.Intent);
- public void onTrimMemory(int);
- public boolean onUnbind(android.content.Intent);
- public void setForeground(boolean);
- public void startForeground(int, android.app.Notification);
- public void stopForeground(boolean);
- public void stopForeground(int);
- public void stopSelf();
- public void stopSelf(int);
- public boolean stopSelfResult(int);
-
-
- public static int START_CONTINUATION_MASK;
- public static int START_FLAG_REDELIVERY;
- public static int START_FLAG_RETRY;
- public static int START_NOT_STICKY;
- public static int START_REDELIVER_INTENT;
- public static int START_STICKY;
- public static int START_STICKY_COMPATIBILITY;
- public static int START_TASK_REMOVED_COMPLETE;
- public static int STOP_FOREGROUND_DETACH;
- public static int STOP_FOREGROUND_REMOVE;
-}
-
--keep class android.app.SharedElementCallback {
- <init>();
-
- public android.os.Parcelable onCaptureSharedElementSnapshot(android.view.View, android.graphics.Matrix, android.graphics.RectF);
- public android.view.View onCreateSnapshotView(android.content.Context, android.os.Parcelable);
- public void onMapSharedElements(java.util.List, java.util.Map);
- public void onRejectSharedElements(java.util.List);
- public void onSharedElementEnd(java.util.List, java.util.List, java.util.List);
- public void onSharedElementStart(java.util.List, java.util.List, java.util.List);
- public void onSharedElementsArrived(java.util.List, java.util.List, android.app.SharedElementCallback$OnSharedElementsReadyListener);
-
-
-}
-
--keep class android.app.SharedElementCallback$OnSharedElementsReadyListener {
-
- public abstract void onSharedElementsReady();
-
-
-}
-
--keep class android.app.TaskStackBuilder {
-
- public android.app.TaskStackBuilder addNextIntent(android.content.Intent);
- public android.app.TaskStackBuilder addNextIntentWithParentStack(android.content.Intent);
- public android.app.TaskStackBuilder addParentStack(android.app.Activity);
- public android.app.TaskStackBuilder addParentStack(java.lang.Class);
- public android.app.TaskStackBuilder addParentStack(android.content.ComponentName);
- public static android.app.TaskStackBuilder create(android.content.Context);
- public android.content.Intent editIntentAt(int);
- public int getIntentCount();
- public android.content.Intent[] getIntents();
- public android.app.PendingIntent getPendingIntent(int, int);
- public android.app.PendingIntent getPendingIntent(int, int, android.os.Bundle);
- public android.app.PendingIntent getPendingIntent(int, int, android.os.Bundle, android.os.UserHandle);
- public void startActivities();
- public int startActivities(android.os.Bundle, android.os.UserHandle);
- public void startActivities(android.os.Bundle);
-
-
-}
-
--keep class android.app.UiAutomation {
- <init>(android.os.Looper, android.app.IUiAutomationConnection);
-
- public void clearWindowAnimationFrameStats();
- public boolean clearWindowContentFrameStats(int);
- public void connect();
- public void connect(int);
- public void destroy();
- public void disconnect();
- public android.view.accessibility.AccessibilityEvent executeAndWaitForEvent(java.lang.Runnable, android.app.UiAutomation$AccessibilityEventFilter, long);
- public android.os.ParcelFileDescriptor executeShellCommand(java.lang.String);
- public android.os.ParcelFileDescriptor[] executeShellCommandRw(java.lang.String);
- public android.view.accessibility.AccessibilityNodeInfo findFocus(int);
- public int getConnectionId();
- public int getFlags();
- public android.view.accessibility.AccessibilityNodeInfo getRootInActiveWindow();
- public android.accessibilityservice.AccessibilityServiceInfo getServiceInfo();
- public android.view.WindowAnimationFrameStats getWindowAnimationFrameStats();
- public android.view.WindowContentFrameStats getWindowContentFrameStats(int);
- public java.util.List getWindows();
- public void grantRuntimePermission(java.lang.String, java.lang.String);
- public boolean grantRuntimePermission(java.lang.String, java.lang.String, android.os.UserHandle);
- public void grantRuntimePermissionAsUser(java.lang.String, java.lang.String, android.os.UserHandle);
- public boolean injectInputEvent(android.view.InputEvent, boolean);
- public boolean isDestroyed();
- public boolean performGlobalAction(int);
- public void revokeRuntimePermission(java.lang.String, java.lang.String);
- public boolean revokeRuntimePermission(java.lang.String, java.lang.String, android.os.UserHandle);
- public void revokeRuntimePermissionAsUser(java.lang.String, java.lang.String, android.os.UserHandle);
- public void setOnAccessibilityEventListener(android.app.UiAutomation$OnAccessibilityEventListener);
- public boolean setRotation(int);
- public void setRunAsMonkey(boolean);
- public void setServiceInfo(android.accessibilityservice.AccessibilityServiceInfo);
- public android.graphics.Bitmap takeScreenshot();
- public void waitForIdle(long, long);
-
-
- public static int FLAG_DONT_SUPPRESS_ACCESSIBILITY_SERVICES;
- public static int ROTATION_FREEZE_0;
- public static int ROTATION_FREEZE_180;
- public static int ROTATION_FREEZE_270;
- public static int ROTATION_FREEZE_90;
- public static int ROTATION_FREEZE_CURRENT;
- public static int ROTATION_UNFREEZE;
-}
-
--keep class android.app.UiAutomation$AccessibilityEventFilter {
-
- public abstract boolean accept(android.view.accessibility.AccessibilityEvent);
-
-
-}
-
--keep class android.app.UiAutomation$OnAccessibilityEventListener {
-
- public abstract void onAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
-
-
-}
-
--keep class android.app.VoiceInteractor {
-
- public android.app.VoiceInteractor$Request getActiveRequest(java.lang.String);
- public android.app.VoiceInteractor$Request[] getActiveRequests();
- public boolean submitRequest(android.app.VoiceInteractor$Request);
- public boolean submitRequest(android.app.VoiceInteractor$Request, java.lang.String);
- public boolean[] supportsCommands(java.lang.String[]);
-
-
-}
-
--keep class android.app.VoiceInteractor$PickOptionRequest {
- <init>(android.app.VoiceInteractor$Prompt, android.app.VoiceInteractor$PickOptionRequest$Option[], android.os.Bundle);
- <init>(java.lang.CharSequence, android.app.VoiceInteractor$PickOptionRequest$Option[], android.os.Bundle);
-
- public void onPickOptionResult(boolean, android.app.VoiceInteractor$PickOptionRequest$Option[], android.os.Bundle);
-
-
-}
-
--keep class android.app.VoiceInteractor$PickOptionRequest$Option {
- <init>(java.lang.CharSequence);
- <init>(java.lang.CharSequence, int);
-
- public android.app.VoiceInteractor$PickOptionRequest$Option addSynonym(java.lang.CharSequence);
- public int countSynonyms();
- public int describeContents();
- public android.os.Bundle getExtras();
- public int getIndex();
- public java.lang.CharSequence getLabel();
- public java.lang.CharSequence getSynonymAt(int);
- public void setExtras(android.os.Bundle);
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.app.VoiceInteractor$Prompt {
- <init>(java.lang.CharSequence[], java.lang.CharSequence);
- <init>(java.lang.CharSequence);
-
- public int countVoicePrompts();
- public int describeContents();
- public java.lang.CharSequence getVisualPrompt();
- public java.lang.CharSequence getVoicePromptAt(int);
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.app.VoiceInteractor$Request {
-
- public void cancel();
- public android.app.Activity getActivity();
- public android.content.Context getContext();
- public java.lang.String getName();
- public void onAttached(android.app.Activity);
- public void onCancel();
- public void onDetached();
- public java.lang.String toString();
-
-
-}
-
--keep class android.app.WaitResult {
- <init>();
-
- public int describeContents();
- public void dump(java.io.PrintWriter, java.lang.String);
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public int result;
- public long thisTime;
- public boolean timeout;
- public long totalTime;
- public android.content.ComponentName who;
-}
-
--keep class android.app.WindowConfiguration {
- <init>();
- <init>(android.app.WindowConfiguration);
-
- public static java.lang.String activityTypeToString(int);
- public boolean canReceiveKeys();
- public boolean canResizeTask();
- public int compareTo(android.app.WindowConfiguration);
- public int compareTo(java.lang.Object);
- public int describeContents();
- public long diff(android.app.WindowConfiguration, boolean);
- public boolean equals(java.lang.Object);
- public int getActivityType();
- public android.graphics.Rect getAppBounds();
- public android.graphics.Rect getBounds();
- public int getWindowingMode();
- public boolean hasMovementAnimations();
- public boolean hasWindowDecorCaption();
- public boolean hasWindowShadow();
- public int hashCode();
- public boolean isAlwaysOnTop();
- public static boolean isFloating(int);
- public boolean keepVisibleDeadAppWindowOnScreen();
- public boolean persistTaskBounds();
- public void setActivityType(int);
- public void setAppBounds(android.graphics.Rect);
- public void setAppBounds(int, int, int, int);
- public void setBounds(android.graphics.Rect);
- public void setTo(android.app.WindowConfiguration);
- public void setToDefaults();
- public void setWindowingMode(int);
- public boolean supportSplitScreenWindowingMode();
- public static boolean supportSplitScreenWindowingMode(int);
- public boolean tasksAreFloating();
- public java.lang.String toString();
- public void unset();
- public int updateFrom(android.app.WindowConfiguration);
- public boolean useWindowFrameForBackdrop();
- public static java.lang.String windowingModeToString(int);
- public boolean windowsAreScaleable();
- public void writeToParcel(android.os.Parcel, int);
- public void writeToProto(android.util.proto.ProtoOutputStream, long);
-
-
- public static int ACTIVITY_TYPE_ASSISTANT;
- public static int ACTIVITY_TYPE_HOME;
- public static int ACTIVITY_TYPE_RECENTS;
- public static int ACTIVITY_TYPE_STANDARD;
- public static int ACTIVITY_TYPE_UNDEFINED;
- public static android.os.Parcelable$Creator CREATOR;
- public static int PINNED_WINDOWING_MODE_ELEVATION_IN_DIP;
- public static int WINDOWING_MODE_FREEFORM;
- public static int WINDOWING_MODE_FULLSCREEN;
- public static int WINDOWING_MODE_FULLSCREEN_OR_SPLIT_SCREEN_SECONDARY;
- public static int WINDOWING_MODE_PINNED;
- public static int WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
- public static int WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
- public static int WINDOWING_MODE_UNDEFINED;
- public static int WINDOW_CONFIG_ACTIVITY_TYPE;
- public static int WINDOW_CONFIG_APP_BOUNDS;
- public static int WINDOW_CONFIG_BOUNDS;
- public static int WINDOW_CONFIG_WINDOWING_MODE;
-}
-
--keep class android.app.assist.AssistContent {
- <init>();
-
- public int describeContents();
- public android.content.ClipData getClipData();
- public android.os.Bundle getExtras();
- public android.content.Intent getIntent();
- public java.lang.String getStructuredData();
- public android.net.Uri getWebUri();
- public boolean isAppProvidedIntent();
- public boolean isAppProvidedWebUri();
- public void setClipData(android.content.ClipData);
- public void setDefaultIntent(android.content.Intent);
- public void setIntent(android.content.Intent);
- public void setStructuredData(java.lang.String);
- public void setWebUri(android.net.Uri);
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.app.assist.AssistStructure {
- <init>(android.app.Activity, boolean, int);
- <init>();
- <init>(android.os.Parcel);
-
- public void clearSendChannel();
- public int describeContents();
- public void dump(boolean);
- public void ensureData();
- public void ensureDataForAutofill();
- public long getAcquisitionEndTime();
- public long getAcquisitionStartTime();
- public android.content.ComponentName getActivityComponent();
- public int getFlags();
- public android.app.assist.AssistStructure$WindowNode getWindowNodeAt(int);
- public int getWindowNodeCount();
- public boolean isHomeActivity();
- public void sanitizeForParceling(boolean);
- public void setAcquisitionEndTime(long);
- public void setAcquisitionStartTime(long);
- public void setActivityComponent(android.content.ComponentName);
- public void setHomeActivity(boolean);
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.app.assist.AssistStructure$AutofillOverlay {
- <init>();
-
-
-
- public boolean focused;
- public android.view.autofill.AutofillValue value;
-}
-
--keep class android.app.assist.AssistStructure$ViewNode {
-
- public float getAlpha();
- public java.lang.String[] getAutofillHints();
- public android.view.autofill.AutofillId getAutofillId();
- public java.lang.CharSequence[] getAutofillOptions();
- public int getAutofillType();
- public android.view.autofill.AutofillValue getAutofillValue();
- public android.app.assist.AssistStructure$ViewNode getChildAt(int);
- public int getChildCount();
- public java.lang.String getClassName();
- public java.lang.CharSequence getContentDescription();
- public float getElevation();
- public android.os.Bundle getExtras();
- public int getHeight();
- public java.lang.String getHint();
- public android.view.ViewStructure$HtmlInfo getHtmlInfo();
- public int getId();
- public java.lang.String getIdEntry();
- public java.lang.String getIdPackage();
- public java.lang.String getIdType();
- public int getImportantForAutofill();
- public int getInputType();
- public int getLeft();
- public android.os.LocaleList getLocaleList();
- public int getMaxTextEms();
- public int getMaxTextLength();
- public int getMinTextEms();
- public int getScrollX();
- public int getScrollY();
- public java.lang.CharSequence getText();
- public int getTextBackgroundColor();
- public int getTextColor();
- public java.lang.String getTextIdEntry();
- public int[] getTextLineBaselines();
- public int[] getTextLineCharOffsets();
- public int getTextSelectionEnd();
- public int getTextSelectionStart();
- public float getTextSize();
- public int getTextStyle();
- public int getTop();
- public android.graphics.Matrix getTransformation();
- public int getVisibility();
- public java.lang.String getWebDomain();
- public java.lang.String getWebScheme();
- public int getWidth();
- public boolean isAccessibilityFocused();
- public boolean isActivated();
- public boolean isAssistBlocked();
- public boolean isCheckable();
- public boolean isChecked();
- public boolean isClickable();
- public boolean isContextClickable();
- public boolean isEnabled();
- public boolean isFocusable();
- public boolean isFocused();
- public boolean isLongClickable();
- public boolean isOpaque();
- public boolean isSanitized();
- public boolean isSelected();
- public void setAutofillOverlay(android.app.assist.AssistStructure$AutofillOverlay);
- public void setWebDomain(java.lang.String);
- public void updateAutofillValue(android.view.autofill.AutofillValue);
-
-
- public static int TEXT_COLOR_UNDEFINED;
- public static int TEXT_STYLE_BOLD;
- public static int TEXT_STYLE_ITALIC;
- public static int TEXT_STYLE_STRIKE_THRU;
- public static int TEXT_STYLE_UNDERLINE;
-}
-
--keep class android.app.assist.AssistStructure$WindowNode {
-
- public int getDisplayId();
- public int getHeight();
- public int getLeft();
- public android.app.assist.AssistStructure$ViewNode getRootViewNode();
- public java.lang.CharSequence getTitle();
- public int getTop();
- public int getWidth();
-
-
-}
-
--keep class android.app.servertransaction.ActivityLifecycleItem {
- <init>();
-
- public abstract int getTargetState();
- public void recycle();
-
-
- public static int ON_CREATE;
- public static int ON_DESTROY;
- public static int ON_PAUSE;
- public static int ON_RESTART;
- public static int ON_RESUME;
- public static int ON_START;
- public static int ON_STOP;
- public static int PRE_ON_CREATE;
- public static int UNDEFINED;
-}
-
--keep class android.app.servertransaction.ClientTransaction {
-
- public void addCallback(android.app.servertransaction.ClientTransactionItem);
- public int describeContents();
- public boolean equals(java.lang.Object);
- public android.os.IBinder getActivityToken();
- public android.app.IApplicationThread getClient();
- public android.app.servertransaction.ActivityLifecycleItem getLifecycleStateRequest();
- public int hashCode();
- public static android.app.servertransaction.ClientTransaction obtain(android.app.IApplicationThread, android.os.IBinder);
- public void preExecute(android.app.ClientTransactionHandler);
- public void recycle();
- public void schedule();
- public void setLifecycleStateRequest(android.app.servertransaction.ActivityLifecycleItem);
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.app.servertransaction.ClientTransactionItem {
- <init>();
-
- public int describeContents();
- public int getPostExecutionState();
-
-
-}
-
--keep class android.app.servertransaction.PendingTransactionActions {
- <init>();
-
- public void clear();
- public android.os.Bundle getOldState();
- public android.app.servertransaction.PendingTransactionActions$StopInfo getStopInfo();
- public void setCallOnPostCreate(boolean);
- public void setOldState(android.os.Bundle);
- public void setReportRelaunchToWindowManager(boolean);
- public void setRestoreInstanceState(boolean);
- public void setStopInfo(android.app.servertransaction.PendingTransactionActions$StopInfo);
- public boolean shouldCallOnPostCreate();
- public boolean shouldReportRelaunchToWindowManager();
- public boolean shouldRestoreInstanceState();
-
-
-}
-
--keep class android.app.servertransaction.PendingTransactionActions$StopInfo {
- <init>();
-
- public void run();
- public void setActivity(android.app.ActivityThread$ActivityClientRecord);
- public void setDescription(java.lang.CharSequence);
- public void setPersistentState(android.os.PersistableBundle);
- public void setState(android.os.Bundle);
-
-
-}
-
--keep class android.content.BroadcastReceiver {
- <init>();
-
- public void abortBroadcast();
- public void clearAbortBroadcast();
- public boolean getAbortBroadcast();
- public boolean getDebugUnregister();
- public android.content.BroadcastReceiver$PendingResult getPendingResult();
- public int getResultCode();
- public java.lang.String getResultData();
- public android.os.Bundle getResultExtras(boolean);
- public int getSendingUserId();
- public android.content.BroadcastReceiver$PendingResult goAsync();
- public boolean isInitialStickyBroadcast();
- public boolean isOrderedBroadcast();
- public abstract void onReceive(android.content.Context, android.content.Intent);
- public android.os.IBinder peekService(android.content.Context, android.content.Intent);
- public void setDebugUnregister(boolean);
- public void setOrderedHint(boolean);
- public void setPendingResult(android.content.BroadcastReceiver$PendingResult);
- public void setResult(int, java.lang.String, android.os.Bundle);
- public void setResultCode(int);
- public void setResultData(java.lang.String);
- public void setResultExtras(android.os.Bundle);
-
-
-}
-
--keep class android.content.BroadcastReceiver$PendingResult {
- <init>(int, java.lang.String, android.os.Bundle, int, boolean, boolean, android.os.IBinder, int, int);
-
- public void abortBroadcast();
- public void clearAbortBroadcast();
- public void finish();
- public boolean getAbortBroadcast();
- public int getResultCode();
- public java.lang.String getResultData();
- public android.os.Bundle getResultExtras(boolean);
- public int getSendingUserId();
- public void sendFinished(android.app.IActivityManager);
- public void setExtrasClassLoader(java.lang.ClassLoader);
- public void setResult(int, java.lang.String, android.os.Bundle);
- public void setResultCode(int);
- public void setResultData(java.lang.String);
- public void setResultExtras(android.os.Bundle);
-
-
- public static int TYPE_COMPONENT;
- public static int TYPE_REGISTERED;
- public static int TYPE_UNREGISTERED;
-}
-
--keep class android.content.ClipData {
- <init>(java.lang.CharSequence, java.lang.String[], android.content.ClipData$Item);
- <init>(android.content.ClipDescription, android.content.ClipData$Item);
- <init>(android.content.ClipDescription, java.util.ArrayList);
- <init>(android.content.ClipData);
-
- public void addItem(android.content.ClipData$Item);
- public void addItem(android.content.ClipData$Item, android.content.ContentResolver);
- public void addItem(android.content.ContentResolver, android.content.ClipData$Item);
- public void collectUris(java.util.List);
- public int describeContents();
- public void fixUris(int);
- public void fixUrisLight(int);
- public android.content.ClipDescription getDescription();
- public android.graphics.Bitmap getIcon();
- public android.content.ClipData$Item getItemAt(int);
- public int getItemCount();
- public static android.content.ClipData newHtmlText(java.lang.CharSequence, java.lang.CharSequence, java.lang.String);
- public static android.content.ClipData newIntent(java.lang.CharSequence, android.content.Intent);
- public static android.content.ClipData newPlainText(java.lang.CharSequence, java.lang.CharSequence);
- public static android.content.ClipData newRawUri(java.lang.CharSequence, android.net.Uri);
- public static android.content.ClipData newUri(android.content.ContentResolver, java.lang.CharSequence, android.net.Uri);
- public void prepareToEnterProcess();
- public void prepareToLeaveProcess(boolean);
- public void prepareToLeaveProcess(boolean, int);
- public void setItemAt(int, android.content.ClipData$Item);
- public void toShortString(java.lang.StringBuilder);
- public void toShortStringShortItems(java.lang.StringBuilder, boolean);
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
- public void writeToProto(android.util.proto.ProtoOutputStream, long);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.content.ClipData$Item {
- <init>(android.content.ClipData$Item);
- <init>(java.lang.CharSequence);
- <init>(java.lang.CharSequence, java.lang.String);
- <init>(android.content.Intent);
- <init>(android.net.Uri);
- <init>(java.lang.CharSequence, android.content.Intent, android.net.Uri);
- <init>(java.lang.CharSequence, java.lang.String, android.content.Intent, android.net.Uri);
-
- public java.lang.String coerceToHtmlText(android.content.Context);
- public java.lang.CharSequence coerceToStyledText(android.content.Context);
- public java.lang.CharSequence coerceToText(android.content.Context);
- public java.lang.String getHtmlText();
- public android.content.Intent getIntent();
- public java.lang.CharSequence getText();
- public android.net.Uri getUri();
- public void toShortString(java.lang.StringBuilder);
- public void toShortSummaryString(java.lang.StringBuilder);
- public java.lang.String toString();
- public void writeToProto(android.util.proto.ProtoOutputStream, long);
-
-
-}
-
--keep class android.content.ClipDescription {
- <init>(java.lang.CharSequence, java.lang.String[]);
- <init>(android.content.ClipDescription);
-
- public static boolean compareMimeTypes(java.lang.String, java.lang.String);
- public int describeContents();
- public java.lang.String[] filterMimeTypes(java.lang.String);
- public android.os.PersistableBundle getExtras();
- public java.lang.CharSequence getLabel();
- public java.lang.String getMimeType(int);
- public int getMimeTypeCount();
- public long getTimestamp();
- public boolean hasMimeType(java.lang.String);
- public void setExtras(android.os.PersistableBundle);
- public void setTimestamp(long);
- public boolean toShortString(java.lang.StringBuilder);
- public boolean toShortStringTypesOnly(java.lang.StringBuilder);
- public java.lang.String toString();
- public void validate();
- public void writeToParcel(android.os.Parcel, int);
- public void writeToProto(android.util.proto.ProtoOutputStream, long);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public static java.lang.String EXTRA_TARGET_COMPONENT_NAME;
- public static java.lang.String EXTRA_USER_SERIAL_NUMBER;
- public static java.lang.String MIMETYPE_TEXT_HTML;
- public static java.lang.String MIMETYPE_TEXT_INTENT;
- public static java.lang.String MIMETYPE_TEXT_PLAIN;
- public static java.lang.String MIMETYPE_TEXT_URILIST;
-}
-
--keep class android.content.ComponentCallbacks {
-
- public abstract void onConfigurationChanged(android.content.res.Configuration);
- public abstract void onLowMemory();
-
-
-}
-
--keep class android.content.ComponentName {
- <init>(java.lang.String, java.lang.String);
- <init>(android.content.Context, java.lang.String);
- <init>(android.content.Context, java.lang.Class);
- <init>(android.os.Parcel);
-
- public void appendShortString(java.lang.StringBuilder);
- public static void appendShortString(java.lang.StringBuilder, java.lang.String, java.lang.String);
- public android.content.ComponentName clone();
- public java.lang.Object clone();
- public int compareTo(android.content.ComponentName);
- public int compareTo(java.lang.Object);
- public static android.content.ComponentName createRelative(java.lang.String, java.lang.String);
- public static android.content.ComponentName createRelative(android.content.Context, java.lang.String);
- public int describeContents();
- public boolean equals(java.lang.Object);
- public java.lang.String flattenToShortString();
- public java.lang.String flattenToString();
- public java.lang.String getClassName();
- public java.lang.String getPackageName();
- public java.lang.String getShortClassName();
- public int hashCode();
- public static void printShortString(java.io.PrintWriter, java.lang.String, java.lang.String);
- public static android.content.ComponentName readFromParcel(android.os.Parcel);
- public java.lang.String toShortString();
- public java.lang.String toString();
- public static android.content.ComponentName unflattenFromString(java.lang.String);
- public void writeToParcel(android.os.Parcel, int);
- public static void writeToParcel(android.content.ComponentName, android.os.Parcel);
- public void writeToProto(android.util.proto.ProtoOutputStream, long);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.content.ContentProvider {
- <init>();
- <init>(android.content.Context, java.lang.String, java.lang.String, android.content.pm.PathPermission[]);
-
- public android.content.ContentProviderResult[] applyBatch(java.util.ArrayList);
- public void attachInfo(android.content.Context, android.content.pm.ProviderInfo);
- public void attachInfoForTesting(android.content.Context, android.content.pm.ProviderInfo);
- public int bulkInsert(android.net.Uri, android.content.ContentValues[]);
- public android.os.Bundle call(java.lang.String, java.lang.String, android.os.Bundle);
- public android.net.Uri canonicalize(android.net.Uri);
- public static android.content.ContentProvider coerceToLocalContentProvider(android.content.IContentProvider);
- public abstract int delete(android.net.Uri, java.lang.String, java.lang.String[]);
- public void dump(java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
- protected int enforceReadPermissionInner(android.net.Uri, java.lang.String, android.os.IBinder);
- protected int enforceWritePermissionInner(android.net.Uri, java.lang.String, android.os.IBinder);
- public android.app.AppOpsManager getAppOpsManager();
- public static java.lang.String getAuthorityWithoutUserId(java.lang.String);
- public java.lang.String getCallingPackage();
- public android.content.Context getContext();
- public android.content.IContentProvider getIContentProvider();
- public android.content.pm.PathPermission[] getPathPermissions();
- public java.lang.String getReadPermission();
- public java.lang.String[] getStreamTypes(android.net.Uri, java.lang.String);
- public abstract java.lang.String getType(android.net.Uri);
- public static android.net.Uri getUriWithoutUserId(android.net.Uri);
- public static int getUserIdFromAuthority(java.lang.String, int);
- public static int getUserIdFromAuthority(java.lang.String);
- public static int getUserIdFromUri(android.net.Uri, int);
- public static int getUserIdFromUri(android.net.Uri);
- public java.lang.String getWritePermission();
- public abstract android.net.Uri insert(android.net.Uri, android.content.ContentValues);
- protected boolean isTemporary();
- protected boolean matchesOurAuthorities(java.lang.String);
- public static android.net.Uri maybeAddUserId(android.net.Uri, int);
- public void onConfigurationChanged(android.content.res.Configuration);
- public abstract boolean onCreate();
- public void onLowMemory();
- public void onTrimMemory(int);
- public android.content.res.AssetFileDescriptor openAssetFile(android.net.Uri, java.lang.String);
- public android.content.res.AssetFileDescriptor openAssetFile(android.net.Uri, java.lang.String, android.os.CancellationSignal);
- public android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String);
- public android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String, android.os.CancellationSignal);
- protected android.os.ParcelFileDescriptor openFileHelper(android.net.Uri, java.lang.String);
- public android.os.ParcelFileDescriptor openPipeHelper(android.net.Uri, java.lang.String, android.os.Bundle, java.lang.Object, android.content.ContentProvider$PipeDataWriter);
- public android.content.res.AssetFileDescriptor openTypedAssetFile(android.net.Uri, java.lang.String, android.os.Bundle);
- public android.content.res.AssetFileDescriptor openTypedAssetFile(android.net.Uri, java.lang.String, android.os.Bundle, android.os.CancellationSignal);
- public abstract android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
- public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, android.os.CancellationSignal);
- public android.database.Cursor query(android.net.Uri, java.lang.String[], android.os.Bundle, android.os.CancellationSignal);
- public boolean refresh(android.net.Uri, android.os.Bundle, android.os.CancellationSignal);
- public android.net.Uri rejectInsert(android.net.Uri, android.content.ContentValues);
- public void setAppOps(int, int);
- protected void setAuthorities(java.lang.String);
- protected void setPathPermissions(android.content.pm.PathPermission[]);
- protected void setReadPermission(java.lang.String);
- protected void setWritePermission(java.lang.String);
- public void shutdown();
- public android.net.Uri uncanonicalize(android.net.Uri);
- public abstract int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);
- public static boolean uriHasUserId(android.net.Uri);
-
-
-}
-
--keep class android.content.ContentProvider$PipeDataWriter {
-
- public abstract void writeDataToPipe(android.os.ParcelFileDescriptor, android.net.Uri, java.lang.String, android.os.Bundle, java.lang.Object);
-
-
-}
-
--keep class android.content.ContentProviderClient {
- <init>(android.content.ContentResolver, android.content.IContentProvider, boolean);
-
- public android.content.ContentProviderResult[] applyBatch(java.util.ArrayList);
- public int bulkInsert(android.net.Uri, android.content.ContentValues[]);
- public android.os.Bundle call(java.lang.String, java.lang.String, android.os.Bundle);
- public android.net.Uri canonicalize(android.net.Uri);
- public void close();
- public int delete(android.net.Uri, java.lang.String, java.lang.String[]);
- protected void finalize();
- public android.content.ContentProvider getLocalContentProvider();
- public java.lang.String[] getStreamTypes(android.net.Uri, java.lang.String);
- public java.lang.String getType(android.net.Uri);
- public android.net.Uri insert(android.net.Uri, android.content.ContentValues);
- public android.content.res.AssetFileDescriptor openAssetFile(android.net.Uri, java.lang.String);
- public android.content.res.AssetFileDescriptor openAssetFile(android.net.Uri, java.lang.String, android.os.CancellationSignal);
- public android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String);
- public android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String, android.os.CancellationSignal);
- public android.content.res.AssetFileDescriptor openTypedAssetFileDescriptor(android.net.Uri, java.lang.String, android.os.Bundle);
- public android.content.res.AssetFileDescriptor openTypedAssetFileDescriptor(android.net.Uri, java.lang.String, android.os.Bundle, android.os.CancellationSignal);
- public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
- public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, android.os.CancellationSignal);
- public android.database.Cursor query(android.net.Uri, java.lang.String[], android.os.Bundle, android.os.CancellationSignal);
- public boolean refresh(android.net.Uri, android.os.Bundle, android.os.CancellationSignal);
- public boolean release();
- public static void releaseQuietly(android.content.ContentProviderClient);
- public void setDetectNotResponding(long);
- public android.net.Uri uncanonicalize(android.net.Uri);
- public int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);
-
-
-}
-
--keep class android.content.ContentProviderOperation {
- <init>(android.content.ContentProviderOperation, boolean);
-
- public android.content.ContentProviderResult apply(android.content.ContentProvider, android.content.ContentProviderResult[], int);
- public int describeContents();
- public int getType();
- public android.net.Uri getUri();
- public android.content.ContentProviderOperation getWithoutUserIdInUri();
- public boolean isAssertQuery();
- public boolean isDelete();
- public boolean isInsert();
- public boolean isReadOperation();
- public boolean isUpdate();
- public boolean isWriteOperation();
- public boolean isYieldAllowed();
- public static android.content.ContentProviderOperation$Builder newAssertQuery(android.net.Uri);
- public static android.content.ContentProviderOperation$Builder newDelete(android.net.Uri);
- public static android.content.ContentProviderOperation$Builder newInsert(android.net.Uri);
- public static android.content.ContentProviderOperation$Builder newUpdate(android.net.Uri);
- public java.lang.String[] resolveSelectionArgsBackReferences(android.content.ContentProviderResult[], int);
- public android.content.ContentValues resolveValueBackReferences(android.content.ContentProviderResult[], int);
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public static int TYPE_ASSERT;
- public static int TYPE_DELETE;
- public static int TYPE_INSERT;
- public static int TYPE_UPDATE;
-}
-
--keep class android.content.ContentProviderOperation$Builder {
-
- public android.content.ContentProviderOperation build();
- public android.content.ContentProviderOperation$Builder withExpectedCount(int);
- public android.content.ContentProviderOperation$Builder withSelection(java.lang.String, java.lang.String[]);
- public android.content.ContentProviderOperation$Builder withSelectionBackReference(int, int);
- public android.content.ContentProviderOperation$Builder withValue(java.lang.String, java.lang.Object);
- public android.content.ContentProviderOperation$Builder withValueBackReference(java.lang.String, int);
- public android.content.ContentProviderOperation$Builder withValueBackReferences(android.content.ContentValues);
- public android.content.ContentProviderOperation$Builder withValues(android.content.ContentValues);
- public android.content.ContentProviderOperation$Builder withYieldAllowed(boolean);
-
-
-}
-
--keep class android.content.ContentProviderResult {
- <init>(android.net.Uri);
- <init>(int);
- <init>(android.os.Parcel);
- <init>(android.content.ContentProviderResult, int);
-
- public int describeContents();
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public java.lang.Integer count;
- public android.net.Uri uri;
-}
-
--keep class android.content.ContentResolver {
- <init>(android.content.Context);
-
- public android.content.ContentProviderClient acquireContentProviderClient(android.net.Uri);
- public android.content.ContentProviderClient acquireContentProviderClient(java.lang.String);
- protected android.content.IContentProvider acquireExistingProvider(android.content.Context, java.lang.String);
- public android.content.IContentProvider acquireExistingProvider(android.net.Uri);
- protected abstract android.content.IContentProvider acquireProvider(android.content.Context, java.lang.String);
- public android.content.IContentProvider acquireProvider(android.net.Uri);
- public android.content.IContentProvider acquireProvider(java.lang.String);
- public android.content.ContentProviderClient acquireUnstableContentProviderClient(android.net.Uri);
- public android.content.ContentProviderClient acquireUnstableContentProviderClient(java.lang.String);
- protected abstract android.content.IContentProvider acquireUnstableProvider(android.content.Context, java.lang.String);
- public android.content.IContentProvider acquireUnstableProvider(android.net.Uri);
- public android.content.IContentProvider acquireUnstableProvider(java.lang.String);
- public static void addPeriodicSync(android.accounts.Account, java.lang.String, android.os.Bundle, long);
- public static java.lang.Object addStatusChangeListener(int, android.content.SyncStatusObserver);
- public void appNotRespondingViaProvider(android.content.IContentProvider);
- public android.content.ContentProviderResult[] applyBatch(java.lang.String, java.util.ArrayList);
- public int bulkInsert(android.net.Uri, android.content.ContentValues[]);
- public android.os.Bundle call(android.net.Uri, java.lang.String, java.lang.String, android.os.Bundle);
- public void cancelSync(android.net.Uri);
- public static void cancelSync(android.accounts.Account, java.lang.String);
- public static void cancelSync(android.content.SyncRequest);
- public static void cancelSyncAsUser(android.accounts.Account, java.lang.String, int);
- public android.net.Uri canonicalize(android.net.Uri);
- public static android.os.Bundle createSqlQueryBundle(java.lang.String, java.lang.String[], java.lang.String);
- public static java.lang.String createSqlSortClause(android.os.Bundle);
- public int delete(android.net.Uri, java.lang.String, java.lang.String[]);
- public android.os.Bundle getCache(android.net.Uri);
- public static android.content.IContentService getContentService();
- public static android.content.SyncInfo getCurrentSync();
- public static java.util.List getCurrentSyncs();
- public static java.util.List getCurrentSyncsAsUser(int);
- public static int getIsSyncable(android.accounts.Account, java.lang.String);
- public static int getIsSyncableAsUser(android.accounts.Account, java.lang.String, int);
- public static boolean getMasterSyncAutomatically();
- public static boolean getMasterSyncAutomaticallyAsUser(int);
- public java.util.List getOutgoingPersistedUriPermissions();
- public java.lang.String getPackageName();
- public static java.util.List getPeriodicSyncs(android.accounts.Account, java.lang.String);
- public java.util.List getPersistedUriPermissions();
- public android.content.ContentResolver$OpenResourceIdResult getResourceId(android.net.Uri);
- public java.lang.String[] getStreamTypes(android.net.Uri, java.lang.String);
- public static java.lang.String[] getSyncAdapterPackagesForAuthorityAsUser(java.lang.String, int);
- public static android.content.SyncAdapterType[] getSyncAdapterTypes();
- public static android.content.SyncAdapterType[] getSyncAdapterTypesAsUser(int);
- public static boolean getSyncAutomatically(android.accounts.Account, java.lang.String);
- public static boolean getSyncAutomaticallyAsUser(android.accounts.Account, java.lang.String, int);
- public static android.content.SyncStatusInfo getSyncStatus(android.accounts.Account, java.lang.String);
- public static android.content.SyncStatusInfo getSyncStatusAsUser(android.accounts.Account, java.lang.String, int);
- public int getTargetSdkVersion();
- public java.lang.String getType(android.net.Uri);
- public android.graphics.drawable.Drawable getTypeDrawable(java.lang.String);
- public int getUserId();
- public android.net.Uri insert(android.net.Uri, android.content.ContentValues);
- public static boolean invalidPeriodicExtras(android.os.Bundle);
- public static boolean isSyncActive(android.accounts.Account, java.lang.String);
- public static boolean isSyncPending(android.accounts.Account, java.lang.String);
- public static boolean isSyncPendingAsUser(android.accounts.Account, java.lang.String, int);
- public void notifyChange(android.net.Uri, android.database.ContentObserver);
- public void notifyChange(android.net.Uri, android.database.ContentObserver, boolean);
- public void notifyChange(android.net.Uri, android.database.ContentObserver, int);
- public void notifyChange(android.net.Uri, android.database.ContentObserver, boolean, int);
- public void notifyChange(android.net.Uri, android.database.ContentObserver, int, int);
- public android.content.res.AssetFileDescriptor openAssetFileDescriptor(android.net.Uri, java.lang.String);
- public android.content.res.AssetFileDescriptor openAssetFileDescriptor(android.net.Uri, java.lang.String, android.os.CancellationSignal);
- public android.os.ParcelFileDescriptor openFileDescriptor(android.net.Uri, java.lang.String);
- public android.os.ParcelFileDescriptor openFileDescriptor(android.net.Uri, java.lang.String, android.os.CancellationSignal);
- public java.io.InputStream openInputStream(android.net.Uri);
- public java.io.OutputStream openOutputStream(android.net.Uri);
- public java.io.OutputStream openOutputStream(android.net.Uri, java.lang.String);
- public android.content.res.AssetFileDescriptor openTypedAssetFileDescriptor(android.net.Uri, java.lang.String, android.os.Bundle);
- public android.content.res.AssetFileDescriptor openTypedAssetFileDescriptor(android.net.Uri, java.lang.String, android.os.Bundle, android.os.CancellationSignal);
- public void putCache(android.net.Uri, android.os.Bundle);
- public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
- public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, android.os.CancellationSignal);
- public android.database.Cursor query(android.net.Uri, java.lang.String[], android.os.Bundle, android.os.CancellationSignal);
- public boolean refresh(android.net.Uri, android.os.Bundle, android.os.CancellationSignal);
- public void registerContentObserver(android.net.Uri, boolean, android.database.ContentObserver);
- public void registerContentObserver(android.net.Uri, boolean, android.database.ContentObserver, int);
- public void releasePersistableUriPermission(android.net.Uri, int);
- public abstract boolean releaseProvider(android.content.IContentProvider);
- public abstract boolean releaseUnstableProvider(android.content.IContentProvider);
- public static void removePeriodicSync(android.accounts.Account, java.lang.String, android.os.Bundle);
- public static void removeStatusChangeListener(java.lang.Object);
- public static void requestSync(android.accounts.Account, java.lang.String, android.os.Bundle);
- public static void requestSync(android.content.SyncRequest);
- public static void requestSyncAsUser(android.accounts.Account, java.lang.String, int, android.os.Bundle);
- public int resolveUserId(android.net.Uri);
- public static void setIsSyncable(android.accounts.Account, java.lang.String, int);
- public static void setMasterSyncAutomatically(boolean);
- public static void setMasterSyncAutomaticallyAsUser(boolean, int);
- public static void setSyncAutomatically(android.accounts.Account, java.lang.String, boolean);
- public static void setSyncAutomaticallyAsUser(android.accounts.Account, java.lang.String, boolean, int);
- public void startSync(android.net.Uri, android.os.Bundle);
- public static int syncErrorStringToInt(java.lang.String);
- public static java.lang.String syncErrorToString(int);
- public void takePersistableUriPermission(android.net.Uri, int);
- public void takePersistableUriPermission(java.lang.String, android.net.Uri, int);
- public android.net.Uri uncanonicalize(android.net.Uri);
- public void unregisterContentObserver(android.database.ContentObserver);
- public abstract void unstableProviderDied(android.content.IContentProvider);
- public int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);
- public static void validateSyncExtrasBundle(android.os.Bundle);
-
-
- public static android.content.Intent ACTION_SYNC_CONN_STATUS_CHANGED;
- public static java.lang.String ANY_CURSOR_ITEM_TYPE;
- public static java.lang.String CONTENT_SERVICE_NAME;
- public static java.lang.String CURSOR_DIR_BASE_TYPE;
- public static java.lang.String CURSOR_ITEM_BASE_TYPE;
- public static java.lang.String EXTRA_HONORED_ARGS;
- public static java.lang.String EXTRA_REFRESH_SUPPORTED;
- public static java.lang.String EXTRA_SIZE;
- public static java.lang.String EXTRA_TOTAL_COUNT;
- public static int NOTIFY_SKIP_NOTIFY_FOR_DESCENDANTS;
- public static int NOTIFY_SYNC_TO_NETWORK;
- public static java.lang.String QUERY_ARG_LIMIT;
- public static java.lang.String QUERY_ARG_OFFSET;
- public static java.lang.String QUERY_ARG_SORT_COLLATION;
- public static java.lang.String QUERY_ARG_SORT_COLUMNS;
- public static java.lang.String QUERY_ARG_SORT_DIRECTION;
- public static java.lang.String QUERY_ARG_SQL_SELECTION;
- public static java.lang.String QUERY_ARG_SQL_SELECTION_ARGS;
- public static java.lang.String QUERY_ARG_SQL_SORT_ORDER;
- public static int QUERY_SORT_DIRECTION_ASCENDING;
- public static int QUERY_SORT_DIRECTION_DESCENDING;
- public static java.lang.String SCHEME_ANDROID_RESOURCE;
- public static java.lang.String SCHEME_CONTENT;
- public static java.lang.String SCHEME_FILE;
- public static int SYNC_ERROR_AUTHENTICATION;
- public static int SYNC_ERROR_CONFLICT;
- public static int SYNC_ERROR_INTERNAL;
- public static int SYNC_ERROR_IO;
- public static int SYNC_ERROR_PARSE;
- public static int SYNC_ERROR_SYNC_ALREADY_IN_PROGRESS;
- public static int SYNC_ERROR_TOO_MANY_DELETIONS;
- public static int SYNC_ERROR_TOO_MANY_RETRIES;
- public static int SYNC_EXEMPTION_NONE;
- public static int SYNC_EXEMPTION_PROMOTE_BUCKET;
- public static int SYNC_EXEMPTION_PROMOTE_BUCKET_WITH_TEMP;
- public static java.lang.String SYNC_EXTRAS_ACCOUNT;
- public static java.lang.String SYNC_EXTRAS_DISALLOW_METERED;
- public static java.lang.String SYNC_EXTRAS_DISCARD_LOCAL_DELETIONS;
- public static java.lang.String SYNC_EXTRAS_DO_NOT_RETRY;
- public static java.lang.String SYNC_EXTRAS_EXPECTED_DOWNLOAD;
- public static java.lang.String SYNC_EXTRAS_EXPECTED_UPLOAD;
- public static java.lang.String SYNC_EXTRAS_EXPEDITED;
- public static java.lang.String SYNC_EXTRAS_FORCE;
- public static java.lang.String SYNC_EXTRAS_IGNORE_BACKOFF;
- public static java.lang.String SYNC_EXTRAS_IGNORE_SETTINGS;
- public static java.lang.String SYNC_EXTRAS_INITIALIZE;
- public static java.lang.String SYNC_EXTRAS_MANUAL;
- public static java.lang.String SYNC_EXTRAS_OVERRIDE_TOO_MANY_DELETIONS;
- public static java.lang.String SYNC_EXTRAS_PRIORITY;
- public static java.lang.String SYNC_EXTRAS_REQUIRE_CHARGING;
- public static java.lang.String SYNC_EXTRAS_UPLOAD;
- public static int SYNC_OBSERVER_TYPE_ACTIVE;
- public static int SYNC_OBSERVER_TYPE_ALL;
- public static int SYNC_OBSERVER_TYPE_PENDING;
- public static int SYNC_OBSERVER_TYPE_SETTINGS;
- public static int SYNC_OBSERVER_TYPE_STATUS;
- public static java.lang.String SYNC_VIRTUAL_EXTRAS_EXEMPTION_FLAG;
-}
-
--keep class android.content.ContentResolver$OpenResourceIdResult {
- <init>();
-
-
-
- public int id;
- public android.content.res.Resources r;
-}
-
--keep class android.content.ContentValues {
- <init>();
- <init>(int);
- <init>(android.content.ContentValues);
-
- public void clear();
- public boolean containsKey(java.lang.String);
- public int describeContents();
- public boolean equals(java.lang.Object);
- public java.lang.Object get(java.lang.String);
- public java.lang.Boolean getAsBoolean(java.lang.String);
- public java.lang.Byte getAsByte(java.lang.String);
- public byte[] getAsByteArray(java.lang.String);
- public java.lang.Double getAsDouble(java.lang.String);
- public java.lang.Float getAsFloat(java.lang.String);
- public java.lang.Integer getAsInteger(java.lang.String);
- public java.lang.Long getAsLong(java.lang.String);
- public java.lang.Short getAsShort(java.lang.String);
- public java.lang.String getAsString(java.lang.String);
- public java.util.ArrayList getStringArrayList(java.lang.String);
- public int hashCode();
- public boolean isEmpty();
- public java.util.Set keySet();
- public void put(java.lang.String, java.lang.String);
- public void put(java.lang.String, java.lang.Byte);
- public void put(java.lang.String, java.lang.Short);
- public void put(java.lang.String, java.lang.Integer);
- public void put(java.lang.String, java.lang.Long);
- public void put(java.lang.String, java.lang.Float);
- public void put(java.lang.String, java.lang.Double);
- public void put(java.lang.String, java.lang.Boolean);
- public void put(java.lang.String, byte[]);
- public void putAll(android.content.ContentValues);
- public void putNull(java.lang.String);
- public void putStringArrayList(java.lang.String, java.util.ArrayList);
- public void remove(java.lang.String);
- public int size();
- public java.lang.String toString();
- public java.util.Set valueSet();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public static java.lang.String TAG;
-}
-
--keep class android.content.Context {
- <init>();
-
- public void assertRuntimeOverlayThemable();
- public abstract boolean bindService(android.content.Intent, android.content.ServiceConnection, int);
- public boolean bindServiceAsUser(android.content.Intent, android.content.ServiceConnection, int, android.os.UserHandle);
- public boolean bindServiceAsUser(android.content.Intent, android.content.ServiceConnection, int, android.os.Handler, android.os.UserHandle);
- public abstract boolean canLoadUnsafeResources();
- public boolean canStartActivityForResult();
- public abstract int checkCallingOrSelfPermission(java.lang.String);
- public abstract int checkCallingOrSelfUriPermission(android.net.Uri, int);
- public abstract int checkCallingPermission(java.lang.String);
- public abstract int checkCallingUriPermission(android.net.Uri, int);
- public abstract int checkPermission(java.lang.String, int, int);
- public abstract int checkPermission(java.lang.String, int, int, android.os.IBinder);
- public abstract int checkSelfPermission(java.lang.String);
- public abstract int checkUriPermission(android.net.Uri, int, int, int);
- public abstract int checkUriPermission(android.net.Uri, int, int, int, android.os.IBinder);
- public abstract int checkUriPermission(android.net.Uri, java.lang.String, java.lang.String, int, int, int);
- public abstract void clearWallpaper();
- public abstract android.content.Context createApplicationContext(android.content.pm.ApplicationInfo, int);
- public abstract android.content.Context createConfigurationContext(android.content.res.Configuration);
- public abstract android.content.Context createContextForSplit(java.lang.String);
- public abstract android.content.Context createCredentialProtectedStorageContext();
- public abstract android.content.Context createDeviceProtectedStorageContext();
- public abstract android.content.Context createDisplayContext(android.view.Display);
- public abstract android.content.Context createPackageContext(java.lang.String, int);
- public android.content.Context createPackageContextAsUser(java.lang.String, int, android.os.UserHandle);
- public abstract java.lang.String[] databaseList();
- public abstract boolean deleteDatabase(java.lang.String);
- public abstract boolean deleteFile(java.lang.String);
- public abstract boolean deleteSharedPreferences(java.lang.String);
- public abstract void enforceCallingOrSelfPermission(java.lang.String, java.lang.String);
- public abstract void enforceCallingOrSelfUriPermission(android.net.Uri, int, java.lang.String);
- public abstract void enforceCallingPermission(java.lang.String, java.lang.String);
- public abstract void enforceCallingUriPermission(android.net.Uri, int, java.lang.String);
- public abstract void enforcePermission(java.lang.String, int, int, java.lang.String);
- public abstract void enforceUriPermission(android.net.Uri, int, int, int, java.lang.String);
- public abstract void enforceUriPermission(android.net.Uri, java.lang.String, java.lang.String, int, int, int, java.lang.String);
- public abstract java.lang.String[] fileList();
- public android.os.IBinder getActivityToken();
- public abstract android.content.Context getApplicationContext();
- public abstract android.content.pm.ApplicationInfo getApplicationInfo();
- public abstract android.content.res.AssetManager getAssets();
- public android.view.autofill.AutofillManager$AutofillClient getAutofillClient();
- public abstract java.lang.String getBasePackageName();
- public abstract java.io.File getCacheDir();
- public abstract java.lang.ClassLoader getClassLoader();
- public abstract java.io.File getCodeCacheDir();
- public int getColor(int);
- public android.content.res.ColorStateList getColorStateList(int);
- public abstract android.content.ContentResolver getContentResolver();
- public abstract java.io.File getDataDir();
- public abstract java.io.File getDatabasePath(java.lang.String);
- public abstract java.io.File getDir(java.lang.String, int);
- public abstract android.view.Display getDisplay();
- public abstract android.view.DisplayAdjustments getDisplayAdjustments(int);
- public android.graphics.drawable.Drawable getDrawable(int);
- public abstract java.io.File getExternalCacheDir();
- public abstract java.io.File[] getExternalCacheDirs();
- public abstract java.io.File getExternalFilesDir(java.lang.String);
- public abstract java.io.File[] getExternalFilesDirs(java.lang.String);
- public abstract java.io.File[] getExternalMediaDirs();
- public abstract java.io.File getFileStreamPath(java.lang.String);
- public abstract java.io.File getFilesDir();
- public android.app.IApplicationThread getIApplicationThread();
- public java.util.concurrent.Executor getMainExecutor();
- public abstract android.os.Looper getMainLooper();
- public android.os.Handler getMainThreadHandler();
- public int getNextAutofillId();
- public abstract java.io.File getNoBackupFilesDir();
- public abstract java.io.File getObbDir();
- public abstract java.io.File[] getObbDirs();
- public abstract java.lang.String getOpPackageName();
- public abstract java.lang.String getPackageCodePath();
- public abstract android.content.pm.PackageManager getPackageManager();
- public abstract java.lang.String getPackageName();
- public abstract java.lang.String getPackageResourcePath();
- public abstract java.io.File getPreloadsFileCache();
- public abstract android.content.res.Resources getResources();
- public android.app.IServiceConnection getServiceDispatcher(android.content.ServiceConnection, android.os.Handler, int);
- public abstract android.content.SharedPreferences getSharedPreferences(java.lang.String, int);
- public abstract android.content.SharedPreferences getSharedPreferences(java.io.File, int);
- public abstract java.io.File getSharedPreferencesPath(java.lang.String);
- public java.io.File getSharedPrefsFile(java.lang.String);
- public java.lang.String getString(int);
- public java.lang.String getString(int, java.lang.Object[]);
- public abstract java.lang.Object getSystemService(java.lang.String);
- public java.lang.Object getSystemService(java.lang.Class);
- public abstract java.lang.String getSystemServiceName(java.lang.Class);
- public java.lang.CharSequence getText(int);
- public abstract android.content.res.Resources$Theme getTheme();
- public int getThemeResId();
- public android.os.UserHandle getUser();
- public int getUserId();
- public abstract android.graphics.drawable.Drawable getWallpaper();
- public abstract int getWallpaperDesiredMinimumHeight();
- public abstract int getWallpaperDesiredMinimumWidth();
- public abstract void grantUriPermission(java.lang.String, android.net.Uri, int);
- public boolean isAutofillCompatibilityEnabled();
- public abstract boolean isCredentialProtectedStorage();
- public abstract boolean isDeviceProtectedStorage();
- public boolean isRestricted();
- public abstract boolean moveDatabaseFrom(android.content.Context, java.lang.String);
- public abstract boolean moveSharedPreferencesFrom(android.content.Context, java.lang.String);
- public android.content.res.TypedArray obtainStyledAttributes(int[]);
- public android.content.res.TypedArray obtainStyledAttributes(int, int[]);
- public android.content.res.TypedArray obtainStyledAttributes(android.util.AttributeSet, int[]);
- public android.content.res.TypedArray obtainStyledAttributes(android.util.AttributeSet, int[], int, int);
- public abstract java.io.FileInputStream openFileInput(java.lang.String);
- public abstract java.io.FileOutputStream openFileOutput(java.lang.String, int);
- public abstract android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory);
- public abstract android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory, android.database.DatabaseErrorHandler);
- public abstract android.graphics.drawable.Drawable peekWallpaper();
- public void registerComponentCallbacks(android.content.ComponentCallbacks);
- public abstract android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
- public abstract android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, int);
- public abstract android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler);
- public abstract android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler, int);
- public abstract android.content.Intent registerReceiverAsUser(android.content.BroadcastReceiver, android.os.UserHandle, android.content.IntentFilter, java.lang.String, android.os.Handler);
- public abstract void reloadSharedPreferences();
- public abstract void removeStickyBroadcast(android.content.Intent);
- public abstract void removeStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle);
- public abstract void revokeUriPermission(android.net.Uri, int);
- public abstract void revokeUriPermission(java.lang.String, android.net.Uri, int);
- public abstract void sendBroadcast(android.content.Intent);
- public abstract void sendBroadcast(android.content.Intent, java.lang.String);
- public abstract void sendBroadcast(android.content.Intent, java.lang.String, android.os.Bundle);
- public abstract void sendBroadcast(android.content.Intent, java.lang.String, int);
- public abstract void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle);
- public abstract void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String);
- public abstract void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, android.os.Bundle);
- public abstract void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, int);
- public abstract void sendBroadcastAsUserMultiplePermissions(android.content.Intent, android.os.UserHandle, java.lang.String[]);
- public abstract void sendBroadcastMultiplePermissions(android.content.Intent, java.lang.String[]);
- public abstract void sendOrderedBroadcast(android.content.Intent, java.lang.String);
- public abstract void sendOrderedBroadcast(android.content.Intent, java.lang.String, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
- public abstract void sendOrderedBroadcast(android.content.Intent, java.lang.String, android.os.Bundle, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
- public abstract void sendOrderedBroadcast(android.content.Intent, java.lang.String, int, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
- public abstract void sendOrderedBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
- public abstract 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);
- public abstract 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);
- public abstract void sendStickyBroadcast(android.content.Intent);
- public abstract void sendStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle);
- public abstract void sendStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle, android.os.Bundle);
- public abstract void sendStickyOrderedBroadcast(android.content.Intent, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
- public abstract void sendStickyOrderedBroadcastAsUser(android.content.Intent, android.os.UserHandle, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
- public void setAutofillClient(android.view.autofill.AutofillManager$AutofillClient);
- public void setAutofillCompatibilityEnabled(boolean);
- public abstract void setTheme(int);
- public abstract void setWallpaper(android.graphics.Bitmap);
- public abstract void setWallpaper(java.io.InputStream);
- public abstract void startActivities(android.content.Intent[]);
- public abstract void startActivities(android.content.Intent[], android.os.Bundle);
- public int startActivitiesAsUser(android.content.Intent[], android.os.Bundle, android.os.UserHandle);
- public abstract void startActivity(android.content.Intent);
- public abstract void startActivity(android.content.Intent, android.os.Bundle);
- public void startActivityAsUser(android.content.Intent, android.os.UserHandle);
- public void startActivityAsUser(android.content.Intent, android.os.Bundle, android.os.UserHandle);
- public void startActivityForResult(java.lang.String, android.content.Intent, int, android.os.Bundle);
- public abstract android.content.ComponentName startForegroundService(android.content.Intent);
- public abstract android.content.ComponentName startForegroundServiceAsUser(android.content.Intent, android.os.UserHandle);
- public abstract boolean startInstrumentation(android.content.ComponentName, java.lang.String, android.os.Bundle);
- public abstract void startIntentSender(android.content.IntentSender, android.content.Intent, int, int, int);
- public abstract void startIntentSender(android.content.IntentSender, android.content.Intent, int, int, int, android.os.Bundle);
- public abstract android.content.ComponentName startService(android.content.Intent);
- public abstract android.content.ComponentName startServiceAsUser(android.content.Intent, android.os.UserHandle);
- public abstract boolean stopService(android.content.Intent);
- public abstract boolean stopServiceAsUser(android.content.Intent, android.os.UserHandle);
- public abstract void unbindService(android.content.ServiceConnection);
- public void unregisterComponentCallbacks(android.content.ComponentCallbacks);
- public abstract void unregisterReceiver(android.content.BroadcastReceiver);
- public abstract void updateDisplay(int);
-
-
- public static java.lang.String ACCESSIBILITY_SERVICE;
- public static java.lang.String ACCOUNT_SERVICE;
- public static java.lang.String ACTIVITY_SERVICE;
- public static java.lang.String ALARM_SERVICE;
- public static java.lang.String APPWIDGET_SERVICE;
- public static java.lang.String APP_OPS_SERVICE;
- public static java.lang.String AUDIO_SERVICE;
- public static java.lang.String AUTOFILL_MANAGER_SERVICE;
- public static java.lang.String BACKUP_SERVICE;
- public static java.lang.String BATTERY_SERVICE;
- public static int BIND_ABOVE_CLIENT;
- public static int BIND_ADJUST_WITH_ACTIVITY;
- public static int BIND_ALLOW_INSTANT;
- public static int BIND_ALLOW_OOM_MANAGEMENT;
- public static int BIND_ALLOW_WHITELIST_MANAGEMENT;
- public static int BIND_AUTO_CREATE;
- public static int BIND_DEBUG_UNBIND;
- public static int BIND_EXTERNAL_SERVICE;
- public static int BIND_FOREGROUND_SERVICE;
- public static int BIND_FOREGROUND_SERVICE_WHILE_AWAKE;
- public static int BIND_IMPORTANT;
- public static int BIND_IMPORTANT_BACKGROUND;
- public static int BIND_NOT_FOREGROUND;
- public static int BIND_NOT_VISIBLE;
- public static int BIND_SHOWING_UI;
- public static int BIND_TREAT_LIKE_ACTIVITY;
- public static int BIND_VISIBLE;
- public static int BIND_WAIVE_PRIORITY;
- public static java.lang.String BLUETOOTH_SERVICE;
- public static java.lang.String CAMERA_SERVICE;
- public static java.lang.String CAPTIONING_SERVICE;
- public static java.lang.String CARRIER_CONFIG_SERVICE;
- public static java.lang.String CLIPBOARD_SERVICE;
- public static java.lang.String COMPANION_DEVICE_SERVICE;
- public static java.lang.String CONNECTIVITY_SERVICE;
- public static java.lang.String CONSUMER_IR_SERVICE;
- public static java.lang.String CONTEXTHUB_SERVICE;
- public static int CONTEXT_CREDENTIAL_PROTECTED_STORAGE;
- public static int CONTEXT_DEVICE_PROTECTED_STORAGE;
- public static int CONTEXT_IGNORE_SECURITY;
- public static int CONTEXT_INCLUDE_CODE;
- public static int CONTEXT_REGISTER_PACKAGE;
- public static int CONTEXT_RESTRICTED;
- public static java.lang.String COUNTRY_DETECTOR;
- public static java.lang.String CROSS_PROFILE_APPS_SERVICE;
- public static java.lang.String DEVICE_IDENTIFIERS_SERVICE;
- public static java.lang.String DEVICE_IDLE_CONTROLLER;
- public static java.lang.String DEVICE_POLICY_SERVICE;
- public static java.lang.String DISPLAY_SERVICE;
- public static java.lang.String DOWNLOAD_SERVICE;
- public static java.lang.String DROPBOX_SERVICE;
- public static java.lang.String ETHERNET_SERVICE;
- public static java.lang.String EUICC_CARD_SERVICE;
- public static java.lang.String EUICC_SERVICE;
- public static java.lang.String FINGERPRINT_SERVICE;
- public static java.lang.String GATEKEEPER_SERVICE;
- public static java.lang.String HARDWARE_PROPERTIES_SERVICE;
- public static java.lang.String HDMI_CONTROL_SERVICE;
- public static java.lang.String INCIDENT_SERVICE;
- public static java.lang.String INPUT_METHOD_SERVICE;
- public static java.lang.String INPUT_SERVICE;
- public static java.lang.String IPSEC_SERVICE;
- public static java.lang.String JOB_SCHEDULER_SERVICE;
- public static java.lang.String KEYGUARD_SERVICE;
- public static java.lang.String LAUNCHER_APPS_SERVICE;
- public static java.lang.String LAYOUT_INFLATER_SERVICE;
- public static java.lang.String LOCATION_SERVICE;
- public static java.lang.String LOWPAN_SERVICE;
- public static java.lang.String MEDIA_PROJECTION_SERVICE;
- public static java.lang.String MEDIA_ROUTER_SERVICE;
- public static java.lang.String MEDIA_SESSION_SERVICE;
- public static java.lang.String MIDI_SERVICE;
- public static int MODE_APPEND;
- public static int MODE_ENABLE_WRITE_AHEAD_LOGGING;
- public static int MODE_MULTI_PROCESS;
- public static int MODE_NO_LOCALIZED_COLLATORS;
- public static int MODE_PRIVATE;
- public static int MODE_WORLD_READABLE;
- public static int MODE_WORLD_WRITEABLE;
- public static java.lang.String NETWORKMANAGEMENT_SERVICE;
- public static java.lang.String NETWORK_POLICY_SERVICE;
- public static java.lang.String NETWORK_SCORE_SERVICE;
- public static java.lang.String NETWORK_STATS_SERVICE;
- public static java.lang.String NETWORK_WATCHLIST_SERVICE;
- public static java.lang.String NFC_SERVICE;
- public static java.lang.String NOTIFICATION_SERVICE;
- public static java.lang.String NSD_SERVICE;
- public static java.lang.String OEM_LOCK_SERVICE;
- public static java.lang.String OVERLAY_SERVICE;
- public static java.lang.String PERSISTENT_DATA_BLOCK_SERVICE;
- public static java.lang.String POWER_SERVICE;
- public static java.lang.String PRINT_SERVICE;
- public static java.lang.String RADIO_SERVICE;
- public static int RECEIVER_VISIBLE_TO_INSTANT_APPS;
- public static java.lang.String RECOVERY_SERVICE;
- public static java.lang.String RESTRICTIONS_SERVICE;
- public static java.lang.String SEARCH_SERVICE;
- public static java.lang.String SECURE_ELEMENT_SERVICE;
- public static java.lang.String SENSOR_SERVICE;
- public static java.lang.String SERIAL_SERVICE;
- public static java.lang.String SHORTCUT_SERVICE;
- public static java.lang.String SIP_SERVICE;
- public static java.lang.String SLICE_SERVICE;
- public static java.lang.String SOUND_TRIGGER_SERVICE;
- public static java.lang.String STATS_COMPANION_SERVICE;
- public static java.lang.String STATS_MANAGER;
- public static java.lang.String STATUS_BAR_SERVICE;
- public static java.lang.String STORAGE_SERVICE;
- public static java.lang.String STORAGE_STATS_SERVICE;
- public static java.lang.String SYSTEM_HEALTH_SERVICE;
- public static java.lang.String SYSTEM_UPDATE_SERVICE;
- public static java.lang.String TELECOM_SERVICE;
- public static java.lang.String TELEPHONY_SERVICE;
- public static java.lang.String TELEPHONY_SUBSCRIPTION_SERVICE;
- public static java.lang.String TEXT_CLASSIFICATION_SERVICE;
- public static java.lang.String TEXT_SERVICES_MANAGER_SERVICE;
- public static java.lang.String TIME_ZONE_RULES_MANAGER_SERVICE;
- public static java.lang.String TRUST_SERVICE;
- public static java.lang.String TV_INPUT_SERVICE;
- public static java.lang.String UI_MODE_SERVICE;
- public static java.lang.String UPDATE_LOCK_SERVICE;
- public static java.lang.String USAGE_STATS_SERVICE;
- public static java.lang.String USB_SERVICE;
- public static java.lang.String USER_SERVICE;
- public static java.lang.String VIBRATOR_SERVICE;
- public static java.lang.String VOICE_INTERACTION_MANAGER_SERVICE;
- public static java.lang.String VR_SERVICE;
- public static java.lang.String WALLPAPER_SERVICE;
- public static java.lang.String WIFI_AWARE_SERVICE;
- public static java.lang.String WIFI_P2P_SERVICE;
- public static java.lang.String WIFI_RTT_RANGING_SERVICE;
- public static java.lang.String WIFI_RTT_SERVICE;
- public static java.lang.String WIFI_SCANNING_SERVICE;
- public static java.lang.String WIFI_SERVICE;
- public static java.lang.String WINDOW_SERVICE;
-}
-
--keep class android.content.ContextWrapper {
- <init>(android.content.Context);
-
- protected void attachBaseContext(android.content.Context);
- public boolean bindService(android.content.Intent, android.content.ServiceConnection, int);
- public boolean bindServiceAsUser(android.content.Intent, android.content.ServiceConnection, int, android.os.UserHandle);
- public boolean bindServiceAsUser(android.content.Intent, android.content.ServiceConnection, int, android.os.Handler, android.os.UserHandle);
- public boolean canLoadUnsafeResources();
- public boolean canStartActivityForResult();
- public int checkCallingOrSelfPermission(java.lang.String);
- public int checkCallingOrSelfUriPermission(android.net.Uri, int);
- public int checkCallingPermission(java.lang.String);
- public int checkCallingUriPermission(android.net.Uri, int);
- public int checkPermission(java.lang.String, int, int);
- public int checkPermission(java.lang.String, int, int, android.os.IBinder);
- public int checkSelfPermission(java.lang.String);
- public int checkUriPermission(android.net.Uri, int, int, int);
- public int checkUriPermission(android.net.Uri, int, int, int, android.os.IBinder);
- public int checkUriPermission(android.net.Uri, java.lang.String, java.lang.String, int, int, int);
- public void clearWallpaper();
- public android.content.Context createApplicationContext(android.content.pm.ApplicationInfo, int);
- public android.content.Context createConfigurationContext(android.content.res.Configuration);
- public android.content.Context createContextForSplit(java.lang.String);
- public android.content.Context createCredentialProtectedStorageContext();
- public android.content.Context createDeviceProtectedStorageContext();
- public android.content.Context createDisplayContext(android.view.Display);
- public android.content.Context createPackageContext(java.lang.String, int);
- public android.content.Context createPackageContextAsUser(java.lang.String, int, android.os.UserHandle);
- public java.lang.String[] databaseList();
- public boolean deleteDatabase(java.lang.String);
- public boolean deleteFile(java.lang.String);
- public boolean deleteSharedPreferences(java.lang.String);
- public void enforceCallingOrSelfPermission(java.lang.String, java.lang.String);
- public void enforceCallingOrSelfUriPermission(android.net.Uri, int, java.lang.String);
- public void enforceCallingPermission(java.lang.String, java.lang.String);
- public void enforceCallingUriPermission(android.net.Uri, int, java.lang.String);
- public void enforcePermission(java.lang.String, int, int, java.lang.String);
- public void enforceUriPermission(android.net.Uri, int, int, int, java.lang.String);
- public void enforceUriPermission(android.net.Uri, java.lang.String, java.lang.String, int, int, int, java.lang.String);
- public java.lang.String[] fileList();
- public android.os.IBinder getActivityToken();
- public android.content.Context getApplicationContext();
- public android.content.pm.ApplicationInfo getApplicationInfo();
- public android.content.res.AssetManager getAssets();
- public android.view.autofill.AutofillManager$AutofillClient getAutofillClient();
- public android.content.Context getBaseContext();
- public java.lang.String getBasePackageName();
- public java.io.File getCacheDir();
- public java.lang.ClassLoader getClassLoader();
- public java.io.File getCodeCacheDir();
- public android.content.ContentResolver getContentResolver();
- public java.io.File getDataDir();
- public java.io.File getDatabasePath(java.lang.String);
- public java.io.File getDir(java.lang.String, int);
- public android.view.Display getDisplay();
- public android.view.DisplayAdjustments getDisplayAdjustments(int);
- public java.io.File getExternalCacheDir();
- public java.io.File[] getExternalCacheDirs();
- public java.io.File getExternalFilesDir(java.lang.String);
- public java.io.File[] getExternalFilesDirs(java.lang.String);
- public java.io.File[] getExternalMediaDirs();
- public java.io.File getFileStreamPath(java.lang.String);
- public java.io.File getFilesDir();
- public android.app.IApplicationThread getIApplicationThread();
- public java.util.concurrent.Executor getMainExecutor();
- public android.os.Looper getMainLooper();
- public android.os.Handler getMainThreadHandler();
- public int getNextAutofillId();
- public java.io.File getNoBackupFilesDir();
- public java.io.File getObbDir();
- public java.io.File[] getObbDirs();
- public java.lang.String getOpPackageName();
- public java.lang.String getPackageCodePath();
- public android.content.pm.PackageManager getPackageManager();
- public java.lang.String getPackageName();
- public java.lang.String getPackageResourcePath();
- public java.io.File getPreloadsFileCache();
- public android.content.res.Resources getResources();
- public android.app.IServiceConnection getServiceDispatcher(android.content.ServiceConnection, android.os.Handler, int);
- public android.content.SharedPreferences getSharedPreferences(java.lang.String, int);
- public android.content.SharedPreferences getSharedPreferences(java.io.File, int);
- public java.io.File getSharedPreferencesPath(java.lang.String);
- public java.lang.Object getSystemService(java.lang.String);
- public java.lang.String getSystemServiceName(java.lang.Class);
- public android.content.res.Resources$Theme getTheme();
- public int getThemeResId();
- public int getUserId();
- public android.graphics.drawable.Drawable getWallpaper();
- public int getWallpaperDesiredMinimumHeight();
- public int getWallpaperDesiredMinimumWidth();
- public void grantUriPermission(java.lang.String, android.net.Uri, int);
- public boolean isAutofillCompatibilityEnabled();
- public boolean isCredentialProtectedStorage();
- public boolean isDeviceProtectedStorage();
- public boolean isRestricted();
- public boolean moveDatabaseFrom(android.content.Context, java.lang.String);
- public boolean moveSharedPreferencesFrom(android.content.Context, java.lang.String);
- public java.io.FileInputStream openFileInput(java.lang.String);
- public java.io.FileOutputStream openFileOutput(java.lang.String, int);
- public android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory);
- public android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory, android.database.DatabaseErrorHandler);
- public android.graphics.drawable.Drawable peekWallpaper();
- public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
- public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, int);
- public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler);
- public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler, int);
- public android.content.Intent registerReceiverAsUser(android.content.BroadcastReceiver, android.os.UserHandle, android.content.IntentFilter, java.lang.String, android.os.Handler);
- public void reloadSharedPreferences();
- public void removeStickyBroadcast(android.content.Intent);
- public void removeStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle);
- public void revokeUriPermission(android.net.Uri, int);
- public void revokeUriPermission(java.lang.String, android.net.Uri, int);
- public void sendBroadcast(android.content.Intent);
- public void sendBroadcast(android.content.Intent, java.lang.String);
- public void sendBroadcast(android.content.Intent, java.lang.String, android.os.Bundle);
- public void sendBroadcast(android.content.Intent, java.lang.String, int);
- public void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle);
- public void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String);
- public void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, android.os.Bundle);
- public void sendBroadcastAsUser(android.content.Intent, android.os.UserHandle, java.lang.String, int);
- public void sendBroadcastAsUserMultiplePermissions(android.content.Intent, android.os.UserHandle, java.lang.String[]);
- public void sendBroadcastMultiplePermissions(android.content.Intent, java.lang.String[]);
- public void sendOrderedBroadcast(android.content.Intent, java.lang.String);
- public void sendOrderedBroadcast(android.content.Intent, java.lang.String, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
- 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);
- public void sendOrderedBroadcast(android.content.Intent, java.lang.String, int, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
- 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);
- 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);
- 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);
- public void sendStickyBroadcast(android.content.Intent);
- public void sendStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle);
- public void sendStickyBroadcastAsUser(android.content.Intent, android.os.UserHandle, android.os.Bundle);
- public void sendStickyOrderedBroadcast(android.content.Intent, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
- public void sendStickyOrderedBroadcastAsUser(android.content.Intent, android.os.UserHandle, android.content.BroadcastReceiver, android.os.Handler, int, java.lang.String, android.os.Bundle);
- public void setAutofillClient(android.view.autofill.AutofillManager$AutofillClient);
- public void setAutofillCompatibilityEnabled(boolean);
- public void setTheme(int);
- public void setWallpaper(android.graphics.Bitmap);
- public void setWallpaper(java.io.InputStream);
- public void startActivities(android.content.Intent[]);
- public void startActivities(android.content.Intent[], android.os.Bundle);
- public int startActivitiesAsUser(android.content.Intent[], android.os.Bundle, android.os.UserHandle);
- public void startActivity(android.content.Intent);
- public void startActivity(android.content.Intent, android.os.Bundle);
- public void startActivityAsUser(android.content.Intent, android.os.UserHandle);
- public void startActivityAsUser(android.content.Intent, android.os.Bundle, android.os.UserHandle);
- public void startActivityForResult(java.lang.String, android.content.Intent, int, android.os.Bundle);
- public android.content.ComponentName startForegroundService(android.content.Intent);
- public android.content.ComponentName startForegroundServiceAsUser(android.content.Intent, android.os.UserHandle);
- public boolean startInstrumentation(android.content.ComponentName, java.lang.String, android.os.Bundle);
- public void startIntentSender(android.content.IntentSender, android.content.Intent, int, int, int);
- public void startIntentSender(android.content.IntentSender, android.content.Intent, int, int, int, android.os.Bundle);
- public android.content.ComponentName startService(android.content.Intent);
- public android.content.ComponentName startServiceAsUser(android.content.Intent, android.os.UserHandle);
- public boolean stopService(android.content.Intent);
- public boolean stopServiceAsUser(android.content.Intent, android.os.UserHandle);
- public void unbindService(android.content.ServiceConnection);
- public void unregisterReceiver(android.content.BroadcastReceiver);
- public void updateDisplay(int);
-
-
-}
-
--keep class android.content.DialogInterface {
-
- public abstract void cancel();
- public abstract void dismiss();
-
-
- public static int BUTTON1;
- public static int BUTTON2;
- public static int BUTTON3;
- public static int BUTTON_NEGATIVE;
- public static int BUTTON_NEUTRAL;
- public static int BUTTON_POSITIVE;
-}
-
--keep class android.content.DialogInterface$OnCancelListener {
-
- public abstract void onCancel(android.content.DialogInterface);
-
-
-}
-
--keep class android.content.DialogInterface$OnDismissListener {
-
- public abstract void onDismiss(android.content.DialogInterface);
-
-
-}
-
--keep class android.content.DialogInterface$OnKeyListener {
-
- public abstract boolean onKey(android.content.DialogInterface, int, android.view.KeyEvent);
-
-
-}
-
--keep class android.content.DialogInterface$OnShowListener {
-
- public abstract void onShow(android.content.DialogInterface);
-
-
-}
-
--keep class android.content.IContentProvider {
-
- public abstract android.content.ContentProviderResult[] applyBatch(java.lang.String, java.util.ArrayList);
- public abstract int bulkInsert(java.lang.String, android.net.Uri, android.content.ContentValues[]);
- public abstract android.os.Bundle call(java.lang.String, java.lang.String, java.lang.String, android.os.Bundle);
- public abstract android.net.Uri canonicalize(java.lang.String, android.net.Uri);
- public abstract android.os.ICancellationSignal createCancellationSignal();
- public abstract int delete(java.lang.String, android.net.Uri, java.lang.String, java.lang.String[]);
- public abstract java.lang.String[] getStreamTypes(android.net.Uri, java.lang.String);
- public abstract java.lang.String getType(android.net.Uri);
- public abstract android.net.Uri insert(java.lang.String, android.net.Uri, android.content.ContentValues);
- public abstract android.content.res.AssetFileDescriptor openAssetFile(java.lang.String, android.net.Uri, java.lang.String, android.os.ICancellationSignal);
- public abstract android.os.ParcelFileDescriptor openFile(java.lang.String, android.net.Uri, java.lang.String, android.os.ICancellationSignal, android.os.IBinder);
- public abstract android.content.res.AssetFileDescriptor openTypedAssetFile(java.lang.String, android.net.Uri, java.lang.String, android.os.Bundle, android.os.ICancellationSignal);
- public abstract android.database.Cursor query(java.lang.String, android.net.Uri, java.lang.String[], android.os.Bundle, android.os.ICancellationSignal);
- public abstract boolean refresh(java.lang.String, android.net.Uri, android.os.Bundle, android.os.ICancellationSignal);
- public abstract android.net.Uri uncanonicalize(java.lang.String, android.net.Uri);
- public abstract int update(java.lang.String, android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);
-
-
- public static int APPLY_BATCH_TRANSACTION;
- public static int BULK_INSERT_TRANSACTION;
- public static int CALL_TRANSACTION;
- public static int CANONICALIZE_TRANSACTION;
- public static int CREATE_CANCELATION_SIGNAL_TRANSACTION;
- public static int DELETE_TRANSACTION;
- public static int GET_STREAM_TYPES_TRANSACTION;
- public static int GET_TYPE_TRANSACTION;
- public static int INSERT_TRANSACTION;
- public static int OPEN_ASSET_FILE_TRANSACTION;
- public static int OPEN_FILE_TRANSACTION;
- public static int OPEN_TYPED_ASSET_FILE_TRANSACTION;
- public static int QUERY_TRANSACTION;
- public static int REFRESH_TRANSACTION;
- public static int UNCANONICALIZE_TRANSACTION;
- public static int UPDATE_TRANSACTION;
- public static java.lang.String descriptor;
-}
-
--keep class android.content.IContentService {
-
- public abstract void addPeriodicSync(android.accounts.Account, java.lang.String, android.os.Bundle, long);
- public abstract void addStatusChangeListener(int, android.content.ISyncStatusObserver);
- public abstract void cancelRequest(android.content.SyncRequest);
- public abstract void cancelSync(android.accounts.Account, java.lang.String, android.content.ComponentName);
- public abstract void cancelSyncAsUser(android.accounts.Account, java.lang.String, android.content.ComponentName, int);
- public abstract android.os.Bundle getCache(java.lang.String, android.net.Uri, int);
- public abstract java.util.List getCurrentSyncs();
- public abstract java.util.List getCurrentSyncsAsUser(int);
- public abstract int getIsSyncable(android.accounts.Account, java.lang.String);
- public abstract int getIsSyncableAsUser(android.accounts.Account, java.lang.String, int);
- public abstract boolean getMasterSyncAutomatically();
- public abstract boolean getMasterSyncAutomaticallyAsUser(int);
- public abstract java.util.List getPeriodicSyncs(android.accounts.Account, java.lang.String, android.content.ComponentName);
- public abstract java.lang.String[] getSyncAdapterPackagesForAuthorityAsUser(java.lang.String, int);
- public abstract android.content.SyncAdapterType[] getSyncAdapterTypes();
- public abstract android.content.SyncAdapterType[] getSyncAdapterTypesAsUser(int);
- public abstract boolean getSyncAutomatically(android.accounts.Account, java.lang.String);
- public abstract boolean getSyncAutomaticallyAsUser(android.accounts.Account, java.lang.String, int);
- public abstract android.content.SyncStatusInfo getSyncStatus(android.accounts.Account, java.lang.String, android.content.ComponentName);
- public abstract android.content.SyncStatusInfo getSyncStatusAsUser(android.accounts.Account, java.lang.String, android.content.ComponentName, int);
- public abstract boolean isSyncActive(android.accounts.Account, java.lang.String, android.content.ComponentName);
- public abstract boolean isSyncPending(android.accounts.Account, java.lang.String, android.content.ComponentName);
- public abstract boolean isSyncPendingAsUser(android.accounts.Account, java.lang.String, android.content.ComponentName, int);
- public abstract void notifyChange(android.net.Uri, android.database.IContentObserver, boolean, int, int, int);
- public abstract void putCache(java.lang.String, android.net.Uri, android.os.Bundle, int);
- public abstract void registerContentObserver(android.net.Uri, boolean, android.database.IContentObserver, int, int);
- public abstract void removePeriodicSync(android.accounts.Account, java.lang.String, android.os.Bundle);
- public abstract void removeStatusChangeListener(android.content.ISyncStatusObserver);
- public abstract void requestSync(android.accounts.Account, java.lang.String, android.os.Bundle);
- public abstract void resetTodayStats();
- public abstract void setIsSyncable(android.accounts.Account, java.lang.String, int);
- public abstract void setMasterSyncAutomatically(boolean);
- public abstract void setMasterSyncAutomaticallyAsUser(boolean, int);
- public abstract void setSyncAutomatically(android.accounts.Account, java.lang.String, boolean);
- public abstract void setSyncAutomaticallyAsUser(android.accounts.Account, java.lang.String, boolean, int);
- public abstract void sync(android.content.SyncRequest);
- public abstract void syncAsUser(android.content.SyncRequest, int);
- public abstract void unregisterContentObserver(android.database.IContentObserver);
-
-
-}
-
--keep class android.content.IIntentReceiver {
-
- public abstract void performReceive(android.content.Intent, int, java.lang.String, android.os.Bundle, boolean, boolean, int);
-
-
-}
-
--keep class android.content.IIntentSender {
-
- public abstract void send(int, android.content.Intent, java.lang.String, android.os.IBinder, android.content.IIntentReceiver, java.lang.String, android.os.Bundle);
-
-
-}
-
--keep class android.content.ISyncStatusObserver {
-
- public abstract void onStatusChanged(int);
-
-
-}
-
--keep class android.content.Intent {
- <init>();
- <init>(android.content.Intent);
- <init>(java.lang.String);
- <init>(java.lang.String, android.net.Uri);
- <init>(android.content.Context, java.lang.Class);
- <init>(java.lang.String, android.net.Uri, android.content.Context, java.lang.Class);
- <init>(android.os.Parcel);
-
- public android.content.Intent addCategory(java.lang.String);
- public android.content.Intent addFlags(int);
- public boolean canStripForHistory();
- public java.lang.Object clone();
- public android.content.Intent cloneFilter();
- public static android.content.Intent createChooser(android.content.Intent, java.lang.CharSequence);
- public static android.content.Intent createChooser(android.content.Intent, java.lang.CharSequence, android.content.IntentSender);
- public int describeContents();
- public static java.lang.String dockStateToString(int);
- public int fillIn(android.content.Intent, int);
- public boolean filterEquals(android.content.Intent);
- public int filterHashCode();
- public void fixUris(int);
- public java.lang.String getAction();
- public boolean[] getBooleanArrayExtra(java.lang.String);
- public boolean getBooleanExtra(java.lang.String, boolean);
- public android.os.Bundle getBundleExtra(java.lang.String);
- public byte[] getByteArrayExtra(java.lang.String);
- public byte getByteExtra(java.lang.String, byte);
- public java.util.Set getCategories();
- public char[] getCharArrayExtra(java.lang.String);
- public char getCharExtra(java.lang.String, char);
- public java.lang.CharSequence[] getCharSequenceArrayExtra(java.lang.String);
- public java.util.ArrayList getCharSequenceArrayListExtra(java.lang.String);
- public java.lang.CharSequence getCharSequenceExtra(java.lang.String);
- public android.content.ClipData getClipData();
- public android.content.ComponentName getComponent();
- public int getContentUserHint();
- public android.net.Uri getData();
- public java.lang.String getDataString();
- public double[] getDoubleArrayExtra(java.lang.String);
- public double getDoubleExtra(java.lang.String, double);
- public java.lang.Object getExtra(java.lang.String);
- public java.lang.Object getExtra(java.lang.String, java.lang.Object);
- public android.os.Bundle getExtras();
- public int getFlags();
- public float[] getFloatArrayExtra(java.lang.String);
- public float getFloatExtra(java.lang.String, float);
- public android.os.IBinder getIBinderExtra(java.lang.String);
- public int[] getIntArrayExtra(java.lang.String);
- public int getIntExtra(java.lang.String, int);
- public java.util.ArrayList getIntegerArrayListExtra(java.lang.String);
- public static android.content.Intent getIntent(java.lang.String);
- public static android.content.Intent getIntentOld(java.lang.String);
- public java.lang.String getLaunchToken();
- public long[] getLongArrayExtra(java.lang.String);
- public long getLongExtra(java.lang.String, long);
- public java.lang.String getPackage();
- public android.os.Parcelable[] getParcelableArrayExtra(java.lang.String);
- public java.util.ArrayList getParcelableArrayListExtra(java.lang.String);
- public android.os.Parcelable getParcelableExtra(java.lang.String);
- public java.lang.String getScheme();
- public android.content.Intent getSelector();
- public java.io.Serializable getSerializableExtra(java.lang.String);
- public short[] getShortArrayExtra(java.lang.String);
- public short getShortExtra(java.lang.String, short);
- public android.graphics.Rect getSourceBounds();
- public java.lang.String[] getStringArrayExtra(java.lang.String);
- public java.util.ArrayList getStringArrayListExtra(java.lang.String);
- public java.lang.String getStringExtra(java.lang.String);
- public java.lang.String getType();
- public boolean hasCategory(java.lang.String);
- public boolean hasExtra(java.lang.String);
- public boolean hasFileDescriptors();
- public boolean hasWebURI();
- public static boolean isAccessUriMode(int);
- public boolean isDocument();
- public boolean isExcludingStopped();
- public boolean isWebIntent();
- public static android.content.Intent makeMainActivity(android.content.ComponentName);
- public static android.content.Intent makeMainSelectorActivity(java.lang.String, java.lang.String);
- public static android.content.Intent makeRestartActivityTask(android.content.ComponentName);
- public android.content.Intent maybeStripForHistory();
- public boolean migrateExtraStreamToClipData();
- public static java.lang.String normalizeMimeType(java.lang.String);
- public static android.content.Intent parseCommandArgs(android.os.ShellCommand, android.content.Intent$CommandOptionHandler);
- public static android.content.Intent parseIntent(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet);
- public static android.content.Intent parseUri(java.lang.String, int);
- public void prepareToEnterProcess();
- public void prepareToLeaveProcess(android.content.Context);
- public void prepareToLeaveProcess(boolean);
- public void prepareToLeaveUser(int);
- public static void printIntentArgsHelp(java.io.PrintWriter, java.lang.String);
- public android.content.Intent putCharSequenceArrayListExtra(java.lang.String, java.util.ArrayList);
- public android.content.Intent putExtra(java.lang.String, boolean);
- public android.content.Intent putExtra(java.lang.String, byte);
- public android.content.Intent putExtra(java.lang.String, char);
- public android.content.Intent putExtra(java.lang.String, short);
- public android.content.Intent putExtra(java.lang.String, int);
- public android.content.Intent putExtra(java.lang.String, long);
- public android.content.Intent putExtra(java.lang.String, float);
- public android.content.Intent putExtra(java.lang.String, double);
- public android.content.Intent putExtra(java.lang.String, java.lang.String);
- public android.content.Intent putExtra(java.lang.String, java.lang.CharSequence);
- public android.content.Intent putExtra(java.lang.String, android.os.Parcelable);
- public android.content.Intent putExtra(java.lang.String, android.os.Parcelable[]);
- public android.content.Intent putExtra(java.lang.String, java.io.Serializable);
- public android.content.Intent putExtra(java.lang.String, boolean[]);
- public android.content.Intent putExtra(java.lang.String, byte[]);
- public android.content.Intent putExtra(java.lang.String, short[]);
- public android.content.Intent putExtra(java.lang.String, char[]);
- public android.content.Intent putExtra(java.lang.String, int[]);
- public android.content.Intent putExtra(java.lang.String, long[]);
- public android.content.Intent putExtra(java.lang.String, float[]);
- public android.content.Intent putExtra(java.lang.String, double[]);
- public android.content.Intent putExtra(java.lang.String, java.lang.String[]);
- public android.content.Intent putExtra(java.lang.String, java.lang.CharSequence[]);
- public android.content.Intent putExtra(java.lang.String, android.os.Bundle);
- public android.content.Intent putExtra(java.lang.String, android.os.IBinder);
- public android.content.Intent putExtras(android.content.Intent);
- public android.content.Intent putExtras(android.os.Bundle);
- public android.content.Intent putIntegerArrayListExtra(java.lang.String, java.util.ArrayList);
- public android.content.Intent putParcelableArrayListExtra(java.lang.String, java.util.ArrayList);
- public android.content.Intent putStringArrayListExtra(java.lang.String, java.util.ArrayList);
- public void readFromParcel(android.os.Parcel);
- public void removeCategory(java.lang.String);
- public void removeExtra(java.lang.String);
- public void removeFlags(int);
- public void removeUnsafeExtras();
- public android.content.Intent replaceExtras(android.content.Intent);
- public android.content.Intent replaceExtras(android.os.Bundle);
- public android.content.ComponentName resolveActivity(android.content.pm.PackageManager);
- public android.content.pm.ActivityInfo resolveActivityInfo(android.content.pm.PackageManager, int);
- public android.content.ComponentName resolveSystemService(android.content.pm.PackageManager, int);
- public java.lang.String resolveType(android.content.Context);
- public java.lang.String resolveType(android.content.ContentResolver);
- public java.lang.String resolveTypeIfNeeded(android.content.ContentResolver);
- public static android.content.Intent restoreFromXml(org.xmlpull.v1.XmlPullParser);
- public void saveToXml(org.xmlpull.v1.XmlSerializer);
- public android.content.Intent setAction(java.lang.String);
- public void setAllowFds(boolean);
- public android.content.Intent setClass(android.content.Context, java.lang.Class);
- public android.content.Intent setClassName(android.content.Context, java.lang.String);
- public android.content.Intent setClassName(java.lang.String, java.lang.String);
- public void setClipData(android.content.ClipData);
- public android.content.Intent setComponent(android.content.ComponentName);
- public android.content.Intent setData(android.net.Uri);
- public android.content.Intent setDataAndNormalize(android.net.Uri);
- public android.content.Intent setDataAndType(android.net.Uri, java.lang.String);
- public android.content.Intent setDataAndTypeAndNormalize(android.net.Uri, java.lang.String);
- public void setDefusable(boolean);
- public void setExtrasClassLoader(java.lang.ClassLoader);
- public android.content.Intent setFlags(int);
- public void setLaunchToken(java.lang.String);
- public android.content.Intent setPackage(java.lang.String);
- public void setSelector(android.content.Intent);
- public void setSourceBounds(android.graphics.Rect);
- public android.content.Intent setType(java.lang.String);
- public android.content.Intent setTypeAndNormalize(java.lang.String);
- public java.lang.String toInsecureString();
- public java.lang.String toInsecureStringWithClip();
- public java.lang.String toShortString(boolean, boolean, boolean, boolean);
- public void toShortString(java.lang.StringBuilder, boolean, boolean, boolean, boolean);
- public java.lang.String toString();
- public java.lang.String toURI();
- public java.lang.String toUri(int);
- public void writeToParcel(android.os.Parcel, int);
- public void writeToProto(android.util.proto.ProtoOutputStream, long);
- public void writeToProto(android.util.proto.ProtoOutputStream, long, boolean, boolean, boolean, boolean);
-
-
- public static java.lang.String ACTION_ADVANCED_SETTINGS_CHANGED;
- public static java.lang.String ACTION_AIRPLANE_MODE_CHANGED;
- public static java.lang.String ACTION_ALARM_CHANGED;
- public static java.lang.String ACTION_ALL_APPS;
- public static java.lang.String ACTION_ANSWER;
- public static java.lang.String ACTION_APPLICATION_PREFERENCES;
- public static java.lang.String ACTION_APPLICATION_RESTRICTIONS_CHANGED;
- public static java.lang.String ACTION_APP_ERROR;
- public static java.lang.String ACTION_ASSIST;
- public static java.lang.String ACTION_ATTACH_DATA;
- public static java.lang.String ACTION_BATTERY_CHANGED;
- public static java.lang.String ACTION_BATTERY_LEVEL_CHANGED;
- public static java.lang.String ACTION_BATTERY_LOW;
- public static java.lang.String ACTION_BATTERY_OKAY;
- public static java.lang.String ACTION_BOOT_COMPLETED;
- public static java.lang.String ACTION_BUG_REPORT;
- public static java.lang.String ACTION_CALL;
- public static java.lang.String ACTION_CALL_BUTTON;
- public static java.lang.String ACTION_CALL_EMERGENCY;
- public static java.lang.String ACTION_CALL_PRIVILEGED;
- public static java.lang.String ACTION_CAMERA_BUTTON;
- public static java.lang.String ACTION_CARRIER_SETUP;
- public static java.lang.String ACTION_CHOOSER;
- public static java.lang.String ACTION_CLEAR_DNS_CACHE;
- public static java.lang.String ACTION_CLOSE_SYSTEM_DIALOGS;
- public static java.lang.String ACTION_CONFIGURATION_CHANGED;
- public static java.lang.String ACTION_CREATE_DOCUMENT;
- public static java.lang.String ACTION_CREATE_SHORTCUT;
- public static java.lang.String ACTION_DATE_CHANGED;
- public static java.lang.String ACTION_DEFAULT;
- public static java.lang.String ACTION_DELETE;
- public static java.lang.String ACTION_DEVICE_INITIALIZATION_WIZARD;
- public static java.lang.String ACTION_DEVICE_LOCKED_CHANGED;
- public static java.lang.String ACTION_DEVICE_STORAGE_FULL;
- public static java.lang.String ACTION_DEVICE_STORAGE_LOW;
- public static java.lang.String ACTION_DEVICE_STORAGE_NOT_FULL;
- public static java.lang.String ACTION_DEVICE_STORAGE_OK;
- public static java.lang.String ACTION_DIAL;
- public static java.lang.String ACTION_DISMISS_KEYBOARD_SHORTCUTS;
- public static java.lang.String ACTION_DOCK_ACTIVE;
- public static java.lang.String ACTION_DOCK_EVENT;
- public static java.lang.String ACTION_DOCK_IDLE;
- public static java.lang.String ACTION_DREAMING_STARTED;
- public static java.lang.String ACTION_DREAMING_STOPPED;
- public static java.lang.String ACTION_DYNAMIC_SENSOR_CHANGED;
- public static java.lang.String ACTION_EDIT;
- public static java.lang.String ACTION_EXTERNAL_APPLICATIONS_AVAILABLE;
- public static java.lang.String ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE;
- public static java.lang.String ACTION_FACTORY_RESET;
- public static java.lang.String ACTION_FACTORY_TEST;
- public static java.lang.String ACTION_GET_CONTENT;
- public static java.lang.String ACTION_GET_RESTRICTION_ENTRIES;
- public static java.lang.String ACTION_GLOBAL_BUTTON;
- public static java.lang.String ACTION_GTALK_SERVICE_CONNECTED;
- public static java.lang.String ACTION_GTALK_SERVICE_DISCONNECTED;
- public static java.lang.String ACTION_HEADSET_PLUG;
- public static java.lang.String ACTION_IDLE_MAINTENANCE_END;
- public static java.lang.String ACTION_IDLE_MAINTENANCE_START;
- public static java.lang.String ACTION_INPUT_METHOD_CHANGED;
- public static java.lang.String ACTION_INSERT;
- public static java.lang.String ACTION_INSERT_OR_EDIT;
- public static java.lang.String ACTION_INSTALL_FAILURE;
- public static java.lang.String ACTION_INSTALL_INSTANT_APP_PACKAGE;
- public static java.lang.String ACTION_INSTALL_PACKAGE;
- public static java.lang.String ACTION_INSTANT_APP_RESOLVER_SETTINGS;
- public static java.lang.String ACTION_INTENT_FILTER_NEEDS_VERIFICATION;
- public static java.lang.String ACTION_LOCALE_CHANGED;
- public static java.lang.String ACTION_LOCKED_BOOT_COMPLETED;
- public static java.lang.String ACTION_MAIN;
- public static java.lang.String ACTION_MANAGED_PROFILE_ADDED;
- public static java.lang.String ACTION_MANAGED_PROFILE_AVAILABLE;
- public static java.lang.String ACTION_MANAGED_PROFILE_REMOVED;
- public static java.lang.String ACTION_MANAGED_PROFILE_UNAVAILABLE;
- public static java.lang.String ACTION_MANAGED_PROFILE_UNLOCKED;
- public static java.lang.String ACTION_MANAGE_APP_PERMISSIONS;
- public static java.lang.String ACTION_MANAGE_NETWORK_USAGE;
- public static java.lang.String ACTION_MANAGE_PACKAGE_STORAGE;
- public static java.lang.String ACTION_MANAGE_PERMISSIONS;
- public static java.lang.String ACTION_MANAGE_PERMISSION_APPS;
- public static java.lang.String ACTION_MASTER_CLEAR;
- public static java.lang.String ACTION_MASTER_CLEAR_NOTIFICATION;
- public static java.lang.String ACTION_MEDIA_BAD_REMOVAL;
- public static java.lang.String ACTION_MEDIA_BUTTON;
- public static java.lang.String ACTION_MEDIA_CHECKING;
- public static java.lang.String ACTION_MEDIA_EJECT;
- public static java.lang.String ACTION_MEDIA_MOUNTED;
- public static java.lang.String ACTION_MEDIA_NOFS;
- public static java.lang.String ACTION_MEDIA_REMOVED;
- public static java.lang.String ACTION_MEDIA_RESOURCE_GRANTED;
- public static java.lang.String ACTION_MEDIA_SCANNER_FINISHED;
- public static java.lang.String ACTION_MEDIA_SCANNER_SCAN_FILE;
- public static java.lang.String ACTION_MEDIA_SCANNER_STARTED;
- public static java.lang.String ACTION_MEDIA_SHARED;
- public static java.lang.String ACTION_MEDIA_UNMOUNTABLE;
- public static java.lang.String ACTION_MEDIA_UNMOUNTED;
- public static java.lang.String ACTION_MEDIA_UNSHARED;
- public static java.lang.String ACTION_MY_PACKAGE_REPLACED;
- public static java.lang.String ACTION_MY_PACKAGE_SUSPENDED;
- public static java.lang.String ACTION_MY_PACKAGE_UNSUSPENDED;
- public static java.lang.String ACTION_NEW_OUTGOING_CALL;
- public static java.lang.String ACTION_OPEN_DOCUMENT;
- public static java.lang.String ACTION_OPEN_DOCUMENT_TREE;
- public static java.lang.String ACTION_OVERLAY_CHANGED;
- public static java.lang.String ACTION_PACKAGES_SUSPENDED;
- public static java.lang.String ACTION_PACKAGES_UNSUSPENDED;
- public static java.lang.String ACTION_PACKAGE_ADDED;
- public static java.lang.String ACTION_PACKAGE_CHANGED;
- public static java.lang.String ACTION_PACKAGE_DATA_CLEARED;
- public static java.lang.String ACTION_PACKAGE_FIRST_LAUNCH;
- public static java.lang.String ACTION_PACKAGE_FULLY_REMOVED;
- public static java.lang.String ACTION_PACKAGE_INSTALL;
- public static java.lang.String ACTION_PACKAGE_NEEDS_VERIFICATION;
- public static java.lang.String ACTION_PACKAGE_REMOVED;
- public static java.lang.String ACTION_PACKAGE_REPLACED;
- public static java.lang.String ACTION_PACKAGE_RESTARTED;
- public static java.lang.String ACTION_PACKAGE_VERIFIED;
- public static java.lang.String ACTION_PASTE;
- public static java.lang.String ACTION_PICK;
- public static java.lang.String ACTION_PICK_ACTIVITY;
- public static java.lang.String ACTION_POWER_CONNECTED;
- public static java.lang.String ACTION_POWER_DISCONNECTED;
- public static java.lang.String ACTION_POWER_USAGE_SUMMARY;
- public static java.lang.String ACTION_PREFERRED_ACTIVITY_CHANGED;
- public static java.lang.String ACTION_PRE_BOOT_COMPLETED;
- public static java.lang.String ACTION_PROCESS_TEXT;
- public static java.lang.String ACTION_PROVIDER_CHANGED;
- public static java.lang.String ACTION_QUERY_PACKAGE_RESTART;
- public static java.lang.String ACTION_QUICK_CLOCK;
- public static java.lang.String ACTION_QUICK_VIEW;
- public static java.lang.String ACTION_REBOOT;
- public static java.lang.String ACTION_REMOTE_INTENT;
- public static java.lang.String ACTION_REQUEST_SHUTDOWN;
- public static java.lang.String ACTION_RESOLVE_INSTANT_APP_PACKAGE;
- public static java.lang.String ACTION_REVIEW_PERMISSIONS;
- public static java.lang.String ACTION_RUN;
- public static java.lang.String ACTION_SCREEN_OFF;
- public static java.lang.String ACTION_SCREEN_ON;
- public static java.lang.String ACTION_SEARCH;
- public static java.lang.String ACTION_SEARCH_LONG_PRESS;
- public static java.lang.String ACTION_SEND;
- public static java.lang.String ACTION_SENDTO;
- public static java.lang.String ACTION_SEND_MULTIPLE;
- public static java.lang.String ACTION_SERVICE_STATE;
- public static java.lang.String ACTION_SETTING_RESTORED;
- public static java.lang.String ACTION_SET_WALLPAPER;
- public static java.lang.String ACTION_SHOW_APP_INFO;
- public static java.lang.String ACTION_SHOW_BRIGHTNESS_DIALOG;
- public static java.lang.String ACTION_SHOW_KEYBOARD_SHORTCUTS;
- public static java.lang.String ACTION_SHOW_SUSPENDED_APP_DETAILS;
- public static java.lang.String ACTION_SHUTDOWN;
- public static java.lang.String ACTION_SIM_STATE_CHANGED;
- public static java.lang.String ACTION_SPLIT_CONFIGURATION_CHANGED;
- public static java.lang.String ACTION_SYNC;
- public static java.lang.String ACTION_SYSTEM_TUTORIAL;
- public static java.lang.String ACTION_THERMAL_EVENT;
- public static java.lang.String ACTION_TIMEZONE_CHANGED;
- public static java.lang.String ACTION_TIME_CHANGED;
- public static java.lang.String ACTION_TIME_TICK;
- public static java.lang.String ACTION_UID_REMOVED;
- public static java.lang.String ACTION_UMS_CONNECTED;
- public static java.lang.String ACTION_UMS_DISCONNECTED;
- public static java.lang.String ACTION_UNINSTALL_PACKAGE;
- public static java.lang.String ACTION_UPGRADE_SETUP;
- public static java.lang.String ACTION_USER_ADDED;
- public static java.lang.String ACTION_USER_BACKGROUND;
- public static java.lang.String ACTION_USER_FOREGROUND;
- public static java.lang.String ACTION_USER_INFO_CHANGED;
- public static java.lang.String ACTION_USER_INITIALIZE;
- public static java.lang.String ACTION_USER_PRESENT;
- public static java.lang.String ACTION_USER_REMOVED;
- public static java.lang.String ACTION_USER_STARTED;
- public static java.lang.String ACTION_USER_STARTING;
- public static java.lang.String ACTION_USER_STOPPED;
- public static java.lang.String ACTION_USER_STOPPING;
- public static java.lang.String ACTION_USER_SWITCHED;
- public static java.lang.String ACTION_USER_UNLOCKED;
- public static java.lang.String ACTION_VIEW;
- public static java.lang.String ACTION_VOICE_ASSIST;
- public static java.lang.String ACTION_VOICE_COMMAND;
- public static java.lang.String ACTION_WALLPAPER_CHANGED;
- public static java.lang.String ACTION_WEB_SEARCH;
- public static java.lang.String CATEGORY_ALTERNATIVE;
- public static java.lang.String CATEGORY_APP_BROWSER;
- public static java.lang.String CATEGORY_APP_CALCULATOR;
- public static java.lang.String CATEGORY_APP_CALENDAR;
- public static java.lang.String CATEGORY_APP_CONTACTS;
- public static java.lang.String CATEGORY_APP_EMAIL;
- public static java.lang.String CATEGORY_APP_GALLERY;
- public static java.lang.String CATEGORY_APP_MAPS;
- public static java.lang.String CATEGORY_APP_MARKET;
- public static java.lang.String CATEGORY_APP_MESSAGING;
- public static java.lang.String CATEGORY_APP_MUSIC;
- public static java.lang.String CATEGORY_BROWSABLE;
- public static java.lang.String CATEGORY_CAR_DOCK;
- public static java.lang.String CATEGORY_CAR_LAUNCHER;
- public static java.lang.String CATEGORY_CAR_MODE;
- public static java.lang.String CATEGORY_DEFAULT;
- public static java.lang.String CATEGORY_DESK_DOCK;
- public static java.lang.String CATEGORY_DEVELOPMENT_PREFERENCE;
- public static java.lang.String CATEGORY_EMBED;
- public static java.lang.String CATEGORY_FRAMEWORK_INSTRUMENTATION_TEST;
- public static java.lang.String CATEGORY_HE_DESK_DOCK;
- public static java.lang.String CATEGORY_HOME;
- public static java.lang.String CATEGORY_HOME_MAIN;
- public static java.lang.String CATEGORY_INFO;
- public static java.lang.String CATEGORY_LAUNCHER;
- public static java.lang.String CATEGORY_LAUNCHER_APP;
- public static java.lang.String CATEGORY_LEANBACK_LAUNCHER;
- public static java.lang.String CATEGORY_LEANBACK_SETTINGS;
- public static java.lang.String CATEGORY_LE_DESK_DOCK;
- public static java.lang.String CATEGORY_MONKEY;
- public static java.lang.String CATEGORY_OPENABLE;
- public static java.lang.String CATEGORY_PREFERENCE;
- public static java.lang.String CATEGORY_SAMPLE_CODE;
- public static java.lang.String CATEGORY_SELECTED_ALTERNATIVE;
- public static java.lang.String CATEGORY_SETUP_WIZARD;
- public static java.lang.String CATEGORY_TAB;
- public static java.lang.String CATEGORY_TEST;
- public static java.lang.String CATEGORY_TYPED_OPENABLE;
- public static java.lang.String CATEGORY_UNIT_TEST;
- public static java.lang.String CATEGORY_VOICE;
- public static java.lang.String CATEGORY_VR_HOME;
- public static android.os.Parcelable$Creator CREATOR;
- public static java.lang.String EXTRA_ALARM_COUNT;
- public static java.lang.String EXTRA_ALLOW_MULTIPLE;
- public static java.lang.String EXTRA_ALLOW_REPLACE;
- public static java.lang.String EXTRA_ALTERNATE_INTENTS;
- public static java.lang.String EXTRA_ASSIST_CONTEXT;
- public static java.lang.String EXTRA_ASSIST_INPUT_DEVICE_ID;
- public static java.lang.String EXTRA_ASSIST_INPUT_HINT_KEYBOARD;
- public static java.lang.String EXTRA_ASSIST_PACKAGE;
- public static java.lang.String EXTRA_ASSIST_UID;
- public static java.lang.String EXTRA_AUTO_LAUNCH_SINGLE_CHOICE;
- public static java.lang.String EXTRA_BCC;
- public static java.lang.String EXTRA_BUG_REPORT;
- public static java.lang.String EXTRA_CALLING_PACKAGE;
- public static java.lang.String EXTRA_CC;
- public static java.lang.String EXTRA_CDMA_DEFAULT_ROAMING_INDICATOR;
- public static java.lang.String EXTRA_CDMA_ROAMING_INDICATOR;
- public static java.lang.String EXTRA_CHANGED_COMPONENT_NAME;
- public static java.lang.String EXTRA_CHANGED_COMPONENT_NAME_LIST;
- public static java.lang.String EXTRA_CHANGED_PACKAGE_LIST;
- public static java.lang.String EXTRA_CHANGED_UID_LIST;
- public static java.lang.String EXTRA_CHOOSER_REFINEMENT_INTENT_SENDER;
- public static java.lang.String EXTRA_CHOOSER_TARGETS;
- public static java.lang.String EXTRA_CHOSEN_COMPONENT;
- public static java.lang.String EXTRA_CHOSEN_COMPONENT_INTENT_SENDER;
- public static java.lang.String EXTRA_CLIENT_INTENT;
- public static java.lang.String EXTRA_CLIENT_LABEL;
- public static java.lang.String EXTRA_COMPONENT_NAME;
- public static java.lang.String EXTRA_CONTENT_ANNOTATIONS;
- public static java.lang.String EXTRA_CSS_INDICATOR;
- public static java.lang.String EXTRA_DATA_OPERATOR_ALPHA_LONG;
- public static java.lang.String EXTRA_DATA_OPERATOR_ALPHA_SHORT;
- public static java.lang.String EXTRA_DATA_OPERATOR_NUMERIC;
- public static java.lang.String EXTRA_DATA_RADIO_TECH;
- public static java.lang.String EXTRA_DATA_REG_STATE;
- public static java.lang.String EXTRA_DATA_REMOVED;
- public static java.lang.String EXTRA_DATA_ROAMING_TYPE;
- public static java.lang.String EXTRA_DOCK_STATE;
- public static int EXTRA_DOCK_STATE_CAR;
- public static int EXTRA_DOCK_STATE_DESK;
- public static int EXTRA_DOCK_STATE_HE_DESK;
- public static int EXTRA_DOCK_STATE_LE_DESK;
- public static int EXTRA_DOCK_STATE_UNDOCKED;
- public static java.lang.String EXTRA_DONT_KILL_APP;
- public static java.lang.String EXTRA_EMAIL;
- public static java.lang.String EXTRA_EMERGENCY_ONLY;
- public static java.lang.String EXTRA_EPHEMERAL_FAILURE;
- public static java.lang.String EXTRA_EPHEMERAL_HOSTNAME;
- public static java.lang.String EXTRA_EPHEMERAL_SUCCESS;
- public static java.lang.String EXTRA_EPHEMERAL_TOKEN;
- public static java.lang.String EXTRA_EXCLUDE_COMPONENTS;
- public static java.lang.String EXTRA_FORCE_FACTORY_RESET;
- public static java.lang.String EXTRA_FORCE_MASTER_CLEAR;
- public static java.lang.String EXTRA_FROM_STORAGE;
- public static java.lang.String EXTRA_HTML_TEXT;
- public static java.lang.String EXTRA_INDEX;
- public static java.lang.String EXTRA_INITIAL_INTENTS;
- public static java.lang.String EXTRA_INSTALLER_PACKAGE_NAME;
- public static java.lang.String EXTRA_INSTALL_RESULT;
- public static java.lang.String EXTRA_INSTANT_APP_ACTION;
- public static java.lang.String EXTRA_INSTANT_APP_BUNDLES;
- public static java.lang.String EXTRA_INSTANT_APP_EXTRAS;
- public static java.lang.String EXTRA_INSTANT_APP_FAILURE;
- public static java.lang.String EXTRA_INSTANT_APP_HOSTNAME;
- public static java.lang.String EXTRA_INSTANT_APP_SUCCESS;
- public static java.lang.String EXTRA_INSTANT_APP_TOKEN;
- public static java.lang.String EXTRA_INTENT;
- public static java.lang.String EXTRA_IS_DATA_ROAMING_FROM_REGISTRATION;
- public static java.lang.String EXTRA_IS_USING_CARRIER_AGGREGATION;
- public static java.lang.String EXTRA_KEY_CONFIRM;
- public static java.lang.String EXTRA_KEY_EVENT;
- public static java.lang.String EXTRA_LAUNCHER_EXTRAS;
- public static java.lang.String EXTRA_LOCAL_ONLY;
- public static java.lang.String EXTRA_LONG_VERSION_CODE;
- public static java.lang.String EXTRA_LTE_EARFCN_RSRP_BOOST;
- public static java.lang.String EXTRA_MANUAL;
- public static java.lang.String EXTRA_MEDIA_RESOURCE_TYPE;
- public static int EXTRA_MEDIA_RESOURCE_TYPE_AUDIO_CODEC;
- public static int EXTRA_MEDIA_RESOURCE_TYPE_VIDEO_CODEC;
- public static java.lang.String EXTRA_MIME_TYPES;
- public static java.lang.String EXTRA_NETWORK_ID;
- public static java.lang.String EXTRA_NOT_UNKNOWN_SOURCE;
- public static java.lang.String EXTRA_OPERATOR_ALPHA_LONG;
- public static java.lang.String EXTRA_OPERATOR_ALPHA_SHORT;
- public static java.lang.String EXTRA_OPERATOR_NUMERIC;
- public static java.lang.String EXTRA_ORIGINATING_UID;
- public static java.lang.String EXTRA_ORIGINATING_URI;
- public static java.lang.String EXTRA_PACKAGES;
- public static java.lang.String EXTRA_PACKAGE_NAME;
- public static java.lang.String EXTRA_PERMISSION_NAME;
- public static java.lang.String EXTRA_PHONE_NUMBER;
- public static java.lang.String EXTRA_PROCESS_TEXT;
- public static java.lang.String EXTRA_PROCESS_TEXT_READONLY;
- public static java.lang.String EXTRA_QUICK_VIEW_ADVANCED;
- public static java.lang.String EXTRA_QUICK_VIEW_FEATURES;
- public static java.lang.String EXTRA_QUIET_MODE;
- public static java.lang.String EXTRA_REASON;
- public static java.lang.String EXTRA_REFERRER;
- public static java.lang.String EXTRA_REFERRER_NAME;
- public static java.lang.String EXTRA_REMOTE_CALLBACK;
- public static java.lang.String EXTRA_REMOTE_INTENT_TOKEN;
- public static java.lang.String EXTRA_REMOVED_FOR_ALL_USERS;
- public static java.lang.String EXTRA_REPLACEMENT_EXTRAS;
- public static java.lang.String EXTRA_REPLACING;
- public static java.lang.String EXTRA_RESTRICTIONS_BUNDLE;
- public static java.lang.String EXTRA_RESTRICTIONS_INTENT;
- public static java.lang.String EXTRA_RESTRICTIONS_LIST;
- public static java.lang.String EXTRA_RESULT_NEEDED;
- public static java.lang.String EXTRA_RESULT_RECEIVER;
- public static java.lang.String EXTRA_RETURN_RESULT;
- public static java.lang.String EXTRA_SETTING_NAME;
- public static java.lang.String EXTRA_SETTING_NEW_VALUE;
- public static java.lang.String EXTRA_SETTING_PREVIOUS_VALUE;
- public static java.lang.String EXTRA_SETTING_RESTORED_FROM_SDK_INT;
- public static java.lang.String EXTRA_SHORTCUT_ICON;
- public static java.lang.String EXTRA_SHORTCUT_ICON_RESOURCE;
- public static java.lang.String EXTRA_SHORTCUT_INTENT;
- public static java.lang.String EXTRA_SHORTCUT_NAME;
- public static java.lang.String EXTRA_SHUTDOWN_USERSPACE_ONLY;
- public static java.lang.String EXTRA_SIM_ACTIVATION_RESPONSE;
- public static java.lang.String EXTRA_SPLIT_NAME;
- public static java.lang.String EXTRA_STREAM;
- public static java.lang.String EXTRA_SUBJECT;
- public static java.lang.String EXTRA_SUSPENDED_PACKAGE_EXTRAS;
- public static java.lang.String EXTRA_SYSTEM_ID;
- public static java.lang.String EXTRA_TASK_ID;
- public static java.lang.String EXTRA_TEMPLATE;
- public static java.lang.String EXTRA_TEXT;
- public static java.lang.String EXTRA_THERMAL_STATE;
- public static int EXTRA_THERMAL_STATE_EXCEEDED;
- public static int EXTRA_THERMAL_STATE_NORMAL;
- public static int EXTRA_THERMAL_STATE_WARNING;
- public static java.lang.String EXTRA_TIME_PREF_24_HOUR_FORMAT;
- public static int EXTRA_TIME_PREF_VALUE_USE_12_HOUR;
- public static int EXTRA_TIME_PREF_VALUE_USE_24_HOUR;
- public static int EXTRA_TIME_PREF_VALUE_USE_LOCALE_DEFAULT;
- public static java.lang.String EXTRA_TITLE;
- public static java.lang.String EXTRA_UID;
- public static java.lang.String EXTRA_UNINSTALL_ALL_USERS;
- public static java.lang.String EXTRA_UNKNOWN_INSTANT_APP;
- public static java.lang.String EXTRA_USER;
- public static java.lang.String EXTRA_USER_HANDLE;
- public static java.lang.String EXTRA_USER_ID;
- public static java.lang.String EXTRA_USER_REQUESTED_SHUTDOWN;
- public static java.lang.String EXTRA_VERIFICATION_BUNDLE;
- public static java.lang.String EXTRA_VERSION_CODE;
- public static java.lang.String EXTRA_VOICE_RADIO_TECH;
- public static java.lang.String EXTRA_VOICE_REG_STATE;
- public static java.lang.String EXTRA_VOICE_ROAMING_TYPE;
- public static java.lang.String EXTRA_WIPE_ESIMS;
- public static java.lang.String EXTRA_WIPE_EXTERNAL_STORAGE;
- public static int FILL_IN_ACTION;
- public static int FILL_IN_CATEGORIES;
- public static int FILL_IN_CLIP_DATA;
- public static int FILL_IN_COMPONENT;
- public static int FILL_IN_DATA;
- public static int FILL_IN_PACKAGE;
- public static int FILL_IN_SELECTOR;
- public static int FILL_IN_SOURCE_BOUNDS;
- public static int FLAG_ACTIVITY_BROUGHT_TO_FRONT;
- public static int FLAG_ACTIVITY_CLEAR_TASK;
- public static int FLAG_ACTIVITY_CLEAR_TOP;
- public static int FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET;
- public static int FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS;
- public static int FLAG_ACTIVITY_FORWARD_RESULT;
- public static int FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY;
- public static int FLAG_ACTIVITY_LAUNCH_ADJACENT;
- public static int FLAG_ACTIVITY_MATCH_EXTERNAL;
- public static int FLAG_ACTIVITY_MULTIPLE_TASK;
- public static int FLAG_ACTIVITY_NEW_DOCUMENT;
- public static int FLAG_ACTIVITY_NEW_TASK;
- public static int FLAG_ACTIVITY_NO_ANIMATION;
- public static int FLAG_ACTIVITY_NO_HISTORY;
- public static int FLAG_ACTIVITY_NO_USER_ACTION;
- public static int FLAG_ACTIVITY_PREVIOUS_IS_TOP;
- public static int FLAG_ACTIVITY_REORDER_TO_FRONT;
- public static int FLAG_ACTIVITY_RESET_TASK_IF_NEEDED;
- public static int FLAG_ACTIVITY_RETAIN_IN_RECENTS;
- public static int FLAG_ACTIVITY_SINGLE_TOP;
- public static int FLAG_ACTIVITY_TASK_ON_HOME;
- public static int FLAG_DEBUG_LOG_RESOLUTION;
- public static int FLAG_DEBUG_TRIAGED_MISSING;
- public static int FLAG_EXCLUDE_STOPPED_PACKAGES;
- public static int FLAG_FROM_BACKGROUND;
- public static int FLAG_GRANT_PERSISTABLE_URI_PERMISSION;
- public static int FLAG_GRANT_PREFIX_URI_PERMISSION;
- public static int FLAG_GRANT_READ_URI_PERMISSION;
- public static int FLAG_GRANT_WRITE_URI_PERMISSION;
- public static int FLAG_IGNORE_EPHEMERAL;
- public static int FLAG_INCLUDE_STOPPED_PACKAGES;
- public static int FLAG_RECEIVER_BOOT_UPGRADE;
- public static int FLAG_RECEIVER_EXCLUDE_BACKGROUND;
- public static int FLAG_RECEIVER_FOREGROUND;
- public static int FLAG_RECEIVER_FROM_SHELL;
- public static int FLAG_RECEIVER_INCLUDE_BACKGROUND;
- public static int FLAG_RECEIVER_NO_ABORT;
- public static int FLAG_RECEIVER_REGISTERED_ONLY;
- public static int FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT;
- public static int FLAG_RECEIVER_REPLACE_PENDING;
- public static int FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS;
- public static int IMMUTABLE_FLAGS;
- public static java.lang.String METADATA_DOCK_HOME;
- public static java.lang.String METADATA_SETUP_VERSION;
- public static int URI_ALLOW_UNSAFE;
- public static int URI_ANDROID_APP_SCHEME;
- public static int URI_INTENT_SCHEME;
-}
-
--keep class android.content.Intent$CommandOptionHandler {
-
- public abstract boolean handleOption(java.lang.String, android.os.ShellCommand);
-
-
-}
-
--keep class android.content.IntentFilter {
- <init>();
- <init>(java.lang.String);
- <init>(java.lang.String, java.lang.String);
- <init>(android.content.IntentFilter);
- <init>(android.os.Parcel);
-
- public java.util.Iterator actionsIterator();
- public void addAction(java.lang.String);
- public void addCategory(java.lang.String);
- public void addDataAuthority(java.lang.String, java.lang.String);
- public void addDataAuthority(android.content.IntentFilter$AuthorityEntry);
- public void addDataPath(java.lang.String, int);
- public void addDataPath(android.os.PatternMatcher);
- public void addDataScheme(java.lang.String);
- public void addDataSchemeSpecificPart(java.lang.String, int);
- public void addDataSchemeSpecificPart(android.os.PatternMatcher);
- public void addDataType(java.lang.String);
- public java.util.Iterator authoritiesIterator();
- public java.util.Iterator categoriesIterator();
- public int countActions();
- public int countCategories();
- public int countDataAuthorities();
- public int countDataPaths();
- public int countDataSchemeSpecificParts();
- public int countDataSchemes();
- public int countDataTypes();
- public static android.content.IntentFilter create(java.lang.String, java.lang.String);
- public boolean debugCheck();
- public int describeContents();
- public void dump(android.util.Printer, java.lang.String);
- public java.lang.String getAction(int);
- public boolean getAutoVerify();
- public java.lang.String getCategory(int);
- public android.content.IntentFilter$AuthorityEntry getDataAuthority(int);
- public android.os.PatternMatcher getDataPath(int);
- public java.lang.String getDataScheme(int);
- public android.os.PatternMatcher getDataSchemeSpecificPart(int);
- public java.lang.String getDataType(int);
- public java.lang.String[] getHosts();
- public java.util.ArrayList getHostsList();
- public int getOrder();
- public int getPriority();
- public int getVisibilityToInstantApp();
- public boolean handleAllWebDataURI();
- public boolean handlesWebUris(boolean);
- public boolean hasAction(java.lang.String);
- public boolean hasCategory(java.lang.String);
- public boolean hasDataAuthority(android.net.Uri);
- public boolean hasDataAuthority(android.content.IntentFilter$AuthorityEntry);
- public boolean hasDataPath(java.lang.String);
- public boolean hasDataPath(android.os.PatternMatcher);
- public boolean hasDataScheme(java.lang.String);
- public boolean hasDataSchemeSpecificPart(java.lang.String);
- public boolean hasDataSchemeSpecificPart(android.os.PatternMatcher);
- public boolean hasDataType(java.lang.String);
- public boolean hasExactDataType(java.lang.String);
- public boolean isExplicitlyVisibleToInstantApp();
- public boolean isImplicitlyVisibleToInstantApp();
- public boolean isVerified();
- public boolean isVisibleToInstantApp();
- public int match(android.content.ContentResolver, android.content.Intent, boolean, java.lang.String);
- public int match(java.lang.String, java.lang.String, java.lang.String, android.net.Uri, java.util.Set, java.lang.String);
- public boolean matchAction(java.lang.String);
- public java.lang.String matchCategories(java.util.Set);
- public int matchData(java.lang.String, java.lang.String, android.net.Uri);
- public int matchDataAuthority(android.net.Uri);
- public boolean needsVerification();
- public java.util.Iterator pathsIterator();
- public void readFromXml(org.xmlpull.v1.XmlPullParser);
- public java.util.Iterator schemeSpecificPartsIterator();
- public java.util.Iterator schemesIterator();
- public void setAutoVerify(boolean);
- public void setOrder(int);
- public void setPriority(int);
- public void setVerified(boolean);
- public void setVisibilityToInstantApp(int);
- public java.util.Iterator typesIterator();
- public void writeToParcel(android.os.Parcel, int);
- public void writeToProto(android.util.proto.ProtoOutputStream, long);
- public void writeToXml(org.xmlpull.v1.XmlSerializer);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public static int MATCH_ADJUSTMENT_MASK;
- public static int MATCH_ADJUSTMENT_NORMAL;
- public static int MATCH_CATEGORY_EMPTY;
- public static int MATCH_CATEGORY_HOST;
- public static int MATCH_CATEGORY_MASK;
- public static int MATCH_CATEGORY_PATH;
- public static int MATCH_CATEGORY_PORT;
- public static int MATCH_CATEGORY_SCHEME;
- public static int MATCH_CATEGORY_SCHEME_SPECIFIC_PART;
- public static int MATCH_CATEGORY_TYPE;
- public static int NO_MATCH_ACTION;
- public static int NO_MATCH_CATEGORY;
- public static int NO_MATCH_DATA;
- public static int NO_MATCH_TYPE;
- public static java.lang.String SCHEME_HTTP;
- public static java.lang.String SCHEME_HTTPS;
- public static int SYSTEM_HIGH_PRIORITY;
- public static int SYSTEM_LOW_PRIORITY;
- public static int VISIBILITY_EXPLICIT;
- public static int VISIBILITY_IMPLICIT;
- public static int VISIBILITY_NONE;
-}
-
--keep class android.content.IntentFilter$AuthorityEntry {
- <init>(java.lang.String, java.lang.String);
-
- public boolean equals(java.lang.Object);
- public java.lang.String getHost();
- public int getPort();
- public boolean match(android.content.IntentFilter$AuthorityEntry);
- public int match(android.net.Uri);
-
-
-}
-
--keep class android.content.IntentFilter$MalformedMimeTypeException {
- <init>();
- <init>(java.lang.String);
-
-
-
-}
-
--keep class android.content.IntentSender {
- <init>(android.content.IIntentSender);
- <init>(android.content.IIntentSender, android.os.IBinder);
- <init>(android.os.IBinder);
-
- public int describeContents();
- public boolean equals(java.lang.Object);
- public java.lang.String getCreatorPackage();
- public int getCreatorUid();
- public android.os.UserHandle getCreatorUserHandle();
- public android.content.IIntentSender getTarget();
- public java.lang.String getTargetPackage();
- public android.os.IBinder getWhitelistToken();
- public int hashCode();
- public static android.content.IntentSender readIntentSenderOrNullFromParcel(android.os.Parcel);
- public void sendIntent(android.content.Context, int, android.content.Intent, android.content.IntentSender$OnFinished, android.os.Handler);
- public void sendIntent(android.content.Context, int, android.content.Intent, android.content.IntentSender$OnFinished, android.os.Handler, java.lang.String);
- public java.lang.String toString();
- public static void writeIntentSenderOrNullToParcel(android.content.IntentSender, android.os.Parcel);
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.content.IntentSender$OnFinished {
-
- public abstract void onSendFinished(android.content.IntentSender, android.content.Intent, int, java.lang.String, android.os.Bundle);
-
-
-}
-
--keep class android.content.IntentSender$SendIntentException {
- <init>();
- <init>(java.lang.String);
- <init>(java.lang.Exception);
-
-
-
-}
-
--keep class android.content.Loader {
- <init>(android.content.Context);
-
- public void abandon();
- public boolean cancelLoad();
- public void commitContentChanged();
- public java.lang.String dataToString(java.lang.Object);
- public void deliverCancellation();
- public void deliverResult(java.lang.Object);
- public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
- public void forceLoad();
- public android.content.Context getContext();
- public int getId();
- public boolean isAbandoned();
- public boolean isReset();
- public boolean isStarted();
- protected void onAbandon();
- protected boolean onCancelLoad();
- public void onContentChanged();
- protected void onForceLoad();
- protected void onReset();
- protected void onStartLoading();
- protected void onStopLoading();
- public void registerListener(int, android.content.Loader$OnLoadCompleteListener);
- public void registerOnLoadCanceledListener(android.content.Loader$OnLoadCanceledListener);
- public void reset();
- public void rollbackContentChanged();
- public void startLoading();
- public void stopLoading();
- public boolean takeContentChanged();
- public java.lang.String toString();
- public void unregisterListener(android.content.Loader$OnLoadCompleteListener);
- public void unregisterOnLoadCanceledListener(android.content.Loader$OnLoadCanceledListener);
-
-
-}
-
--keep class android.content.Loader$OnLoadCanceledListener {
-
- public abstract void onLoadCanceled(android.content.Loader);
-
-
-}
-
--keep class android.content.Loader$OnLoadCompleteListener {
-
- public abstract void onLoadComplete(android.content.Loader, java.lang.Object);
-
-
-}
-
--keep class android.content.OperationApplicationException {
- <init>();
- <init>(java.lang.String);
- <init>(java.lang.String, java.lang.Throwable);
- <init>(java.lang.Throwable);
- <init>(int);
- <init>(java.lang.String, int);
-
- public int getNumSuccessfulYieldPoints();
-
-
-}
-
--keep class android.content.PeriodicSync {
- <init>(android.accounts.Account, java.lang.String, android.os.Bundle, long);
- <init>(android.content.PeriodicSync);
- <init>(android.accounts.Account, java.lang.String, android.os.Bundle, long, long);
-
- public int describeContents();
- public boolean equals(java.lang.Object);
- public static boolean syncExtrasEquals(android.os.Bundle, android.os.Bundle);
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public android.accounts.Account account;
- public java.lang.String authority;
- public android.os.Bundle extras;
- public long flexTime;
- public long period;
-}
-
--keep class android.content.ServiceConnection {
-
- public void onBindingDied(android.content.ComponentName);
- public void onNullBinding(android.content.ComponentName);
- public abstract void onServiceConnected(android.content.ComponentName, android.os.IBinder);
- public abstract void onServiceDisconnected(android.content.ComponentName);
-
-
-}
-
--keep class android.content.SharedPreferences {
-
- public abstract boolean contains(java.lang.String);
- public abstract android.content.SharedPreferences$Editor edit();
- public abstract java.util.Map getAll();
- public abstract boolean getBoolean(java.lang.String, boolean);
- public abstract float getFloat(java.lang.String, float);
- public abstract int getInt(java.lang.String, int);
- public abstract long getLong(java.lang.String, long);
- public abstract java.lang.String getString(java.lang.String, java.lang.String);
- public abstract java.util.Set getStringSet(java.lang.String, java.util.Set);
- public abstract void registerOnSharedPreferenceChangeListener(android.content.SharedPreferences$OnSharedPreferenceChangeListener);
- public abstract void unregisterOnSharedPreferenceChangeListener(android.content.SharedPreferences$OnSharedPreferenceChangeListener);
-
-
-}
-
--keep class android.content.SharedPreferences$Editor {
-
- public abstract void apply();
- public abstract android.content.SharedPreferences$Editor clear();
- public abstract boolean commit();
- public abstract android.content.SharedPreferences$Editor putBoolean(java.lang.String, boolean);
- public abstract android.content.SharedPreferences$Editor putFloat(java.lang.String, float);
- public abstract android.content.SharedPreferences$Editor putInt(java.lang.String, int);
- public abstract android.content.SharedPreferences$Editor putLong(java.lang.String, long);
- public abstract android.content.SharedPreferences$Editor putString(java.lang.String, java.lang.String);
- public abstract android.content.SharedPreferences$Editor putStringSet(java.lang.String, java.util.Set);
- public abstract android.content.SharedPreferences$Editor remove(java.lang.String);
-
-
-}
-
--keep class android.content.SharedPreferences$OnSharedPreferenceChangeListener {
-
- public abstract void onSharedPreferenceChanged(android.content.SharedPreferences, java.lang.String);
-
-
-}
-
--keep class android.content.SyncAdapterType {
- <init>(java.lang.String, java.lang.String, boolean, boolean);
- <init>(java.lang.String, java.lang.String, boolean, boolean, boolean, boolean, java.lang.String, java.lang.String);
- <init>(android.os.Parcel);
-
- public boolean allowParallelSyncs();
- public int describeContents();
- public boolean equals(java.lang.Object);
- public java.lang.String getPackageName();
- public java.lang.String getSettingsActivity();
- public int hashCode();
- public boolean isAlwaysSyncable();
- public boolean isUserVisible();
- public static android.content.SyncAdapterType newKey(java.lang.String, java.lang.String);
- public boolean supportsUploading();
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public java.lang.String accountType;
- public java.lang.String authority;
- public boolean isKey;
-}
-
--keep class android.content.SyncInfo {
- <init>(int, android.accounts.Account, java.lang.String, long);
- <init>(android.content.SyncInfo);
-
- public static android.content.SyncInfo createAccountRedacted(int, java.lang.String, long);
- public int describeContents();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public android.accounts.Account account;
- public java.lang.String authority;
- public int authorityId;
- public long startTime;
-}
-
--keep class android.content.SyncRequest {
- <init>(android.content.SyncRequest$Builder);
-
- public int describeContents();
- public android.accounts.Account getAccount();
- public android.os.Bundle getBundle();
- public java.lang.String getProvider();
- public long getSyncFlexTime();
- public long getSyncRunTime();
- public boolean isExpedited();
- public boolean isPeriodic();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.content.SyncRequest$Builder {
- <init>();
-
- public android.content.SyncRequest build();
- public android.content.SyncRequest$Builder setDisallowMetered(boolean);
- public android.content.SyncRequest$Builder setExpedited(boolean);
- public android.content.SyncRequest$Builder setExtras(android.os.Bundle);
- public android.content.SyncRequest$Builder setIgnoreBackoff(boolean);
- public android.content.SyncRequest$Builder setIgnoreSettings(boolean);
- public android.content.SyncRequest$Builder setManual(boolean);
- public android.content.SyncRequest$Builder setNoRetry(boolean);
- public android.content.SyncRequest$Builder setRequiresCharging(boolean);
- public android.content.SyncRequest$Builder setSyncAdapter(android.accounts.Account, java.lang.String);
- public android.content.SyncRequest$Builder syncOnce();
- public android.content.SyncRequest$Builder syncPeriodic(long, long);
-
-
-}
-
--keep class android.content.SyncStatusInfo {
- <init>(int);
- <init>(android.os.Parcel);
- <init>(android.content.SyncStatusInfo);
-
- public void addEvent(java.lang.String);
- public int describeContents();
- public java.lang.String getEvent(int);
- public int getEventCount();
- public long getEventTime(int);
- public int getLastFailureMesgAsInt(int);
- public long getPeriodicSyncTime(int);
- public void maybeResetTodayStats(boolean, boolean);
- public void removePeriodicSyncTime(int);
- public void setLastFailure(int, long, java.lang.String);
- public void setLastSuccess(int, long);
- public void setPeriodicSyncTime(int, long);
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public int authorityId;
- public long initialFailureTime;
- public boolean initialize;
- public java.lang.String lastFailureMesg;
- public int lastFailureSource;
- public long lastFailureTime;
- public int lastSuccessSource;
- public long lastSuccessTime;
- public long lastTodayResetTime;
- public boolean pending;
- public long[] perSourceLastFailureTimes;
- public long[] perSourceLastSuccessTimes;
- public android.content.SyncStatusInfo$Stats todayStats;
- public android.content.SyncStatusInfo$Stats totalStats;
- public android.content.SyncStatusInfo$Stats yesterdayStats;
-}
-
--keep class android.content.SyncStatusInfo$Stats {
- <init>();
-
- public void clear();
- public void copyTo(android.content.SyncStatusInfo$Stats);
- public void readFromParcel(android.os.Parcel);
- public void writeToParcel(android.os.Parcel);
-
-
- public int numCancels;
- public int numFailures;
- public int numSourceFeed;
- public int numSourceLocal;
- public int numSourceOther;
- public int numSourcePeriodic;
- public int numSourcePoll;
- public int numSourceUser;
- public int numSyncs;
- public long totalElapsedTime;
-}
-
--keep class android.content.SyncStatusObserver {
-
- public abstract void onStatusChanged(int);
-
-
-}
-
--keep class android.content.UriPermission {
- <init>(android.net.Uri, int, long);
- <init>(android.os.Parcel);
-
- public int describeContents();
- public long getPersistedTime();
- public android.net.Uri getUri();
- public boolean isReadPermission();
- public boolean isWritePermission();
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public static long INVALID_TIME;
-}
-
--keep class android.content.pm.ActivityInfo {
- <init>();
- <init>(android.content.pm.ActivityInfo);
-
- public static int activityInfoConfigJavaToNative(int);
- public static int activityInfoConfigNativeToJava(int);
- public static java.lang.String colorModeToString(int);
- public int describeContents();
- public void dump(android.util.Printer, java.lang.String);
- public void dump(android.util.Printer, java.lang.String, int);
- public int getRealConfigChanged();
- public int getThemeResource();
- public static boolean isFixedOrientationLandscape(int);
- public static boolean isFixedOrientationPortrait(int);
- public static boolean isPreserveOrientationMode(int);
- public static boolean isResizeableMode(int);
- public static boolean isTranslucentOrFloating(android.content.res.TypedArray);
- public static java.lang.String lockTaskLaunchModeToString(int);
- public static java.lang.String resizeModeToString(int);
- public static java.lang.String screenOrientationToString(int);
- public boolean supportsPictureInPicture();
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static int COLOR_MODE_DEFAULT;
- public static int COLOR_MODE_HDR;
- public static int COLOR_MODE_WIDE_COLOR_GAMUT;
- public static int CONFIG_ASSETS_PATHS;
- public static int CONFIG_COLOR_MODE;
- public static int CONFIG_DENSITY;
- public static int CONFIG_FONT_SCALE;
- public static int CONFIG_KEYBOARD;
- public static int CONFIG_KEYBOARD_HIDDEN;
- public static int CONFIG_LAYOUT_DIRECTION;
- public static int CONFIG_LOCALE;
- public static int CONFIG_MCC;
- public static int CONFIG_MNC;
- public static int[] CONFIG_NATIVE_BITS;
- public static int CONFIG_NAVIGATION;
- public static int CONFIG_ORIENTATION;
- public static int CONFIG_SCREEN_LAYOUT;
- public static int CONFIG_SCREEN_SIZE;
- public static int CONFIG_SMALLEST_SCREEN_SIZE;
- public static int CONFIG_TOUCHSCREEN;
- public static int CONFIG_UI_MODE;
- public static int CONFIG_WINDOW_CONFIGURATION;
- public static android.os.Parcelable$Creator CREATOR;
- public static int DOCUMENT_LAUNCH_ALWAYS;
- public static int DOCUMENT_LAUNCH_INTO_EXISTING;
- public static int DOCUMENT_LAUNCH_NEVER;
- public static int DOCUMENT_LAUNCH_NONE;
- public static int FLAG_ALLOW_EMBEDDED;
- public static int FLAG_ALLOW_TASK_REPARENTING;
- public static int FLAG_ALWAYS_FOCUSABLE;
- public static int FLAG_ALWAYS_RETAIN_TASK_STATE;
- public static int FLAG_AUTO_REMOVE_FROM_RECENTS;
- public static int FLAG_CLEAR_TASK_ON_LAUNCH;
- public static int FLAG_ENABLE_VR_MODE;
- public static int FLAG_EXCLUDE_FROM_RECENTS;
- public static int FLAG_FINISH_ON_CLOSE_SYSTEM_DIALOGS;
- public static int FLAG_FINISH_ON_TASK_LAUNCH;
- public static int FLAG_HARDWARE_ACCELERATED;
- public static int FLAG_IMMERSIVE;
- public static int FLAG_IMPLICITLY_VISIBLE_TO_INSTANT_APP;
- public static int FLAG_MULTIPROCESS;
- public static int FLAG_NO_HISTORY;
- public static int FLAG_RELINQUISH_TASK_IDENTITY;
- public static int FLAG_RESUME_WHILE_PAUSING;
- public static int FLAG_SHOW_FOR_ALL_USERS;
- public static int FLAG_SHOW_WHEN_LOCKED;
- public static int FLAG_SINGLE_USER;
- public static int FLAG_STATE_NOT_NEEDED;
- public static int FLAG_SUPPORTS_PICTURE_IN_PICTURE;
- public static int FLAG_SYSTEM_USER_ONLY;
- public static int FLAG_TURN_SCREEN_ON;
- public static int FLAG_VISIBLE_TO_INSTANT_APP;
- public static int LAUNCH_MULTIPLE;
- public static int LAUNCH_SINGLE_INSTANCE;
- public static int LAUNCH_SINGLE_TASK;
- public static int LAUNCH_SINGLE_TOP;
- public static int LOCK_TASK_LAUNCH_MODE_ALWAYS;
- public static int LOCK_TASK_LAUNCH_MODE_DEFAULT;
- public static int LOCK_TASK_LAUNCH_MODE_IF_WHITELISTED;
- public static int LOCK_TASK_LAUNCH_MODE_NEVER;
- public static int PERSIST_ACROSS_REBOOTS;
- public static int PERSIST_NEVER;
- public static int PERSIST_ROOT_ONLY;
- public static int RESIZE_MODE_FORCE_RESIZABLE_LANDSCAPE_ONLY;
- public static int RESIZE_MODE_FORCE_RESIZABLE_PORTRAIT_ONLY;
- public static int RESIZE_MODE_FORCE_RESIZABLE_PRESERVE_ORIENTATION;
- public static int RESIZE_MODE_FORCE_RESIZEABLE;
- public static int RESIZE_MODE_RESIZEABLE;
- public static int RESIZE_MODE_RESIZEABLE_AND_PIPABLE_DEPRECATED;
- public static int RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION;
- public static int RESIZE_MODE_UNRESIZEABLE;
- public static int SCREEN_ORIENTATION_BEHIND;
- public static int SCREEN_ORIENTATION_FULL_SENSOR;
- public static int SCREEN_ORIENTATION_FULL_USER;
- public static int SCREEN_ORIENTATION_LANDSCAPE;
- public static int SCREEN_ORIENTATION_LOCKED;
- public static int SCREEN_ORIENTATION_NOSENSOR;
- public static int SCREEN_ORIENTATION_PORTRAIT;
- public static int SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
- public static int SCREEN_ORIENTATION_REVERSE_PORTRAIT;
- public static int SCREEN_ORIENTATION_SENSOR;
- public static int SCREEN_ORIENTATION_SENSOR_LANDSCAPE;
- public static int SCREEN_ORIENTATION_SENSOR_PORTRAIT;
- public static int SCREEN_ORIENTATION_UNSET;
- public static int SCREEN_ORIENTATION_UNSPECIFIED;
- public static int SCREEN_ORIENTATION_USER;
- public static int SCREEN_ORIENTATION_USER_LANDSCAPE;
- public static int SCREEN_ORIENTATION_USER_PORTRAIT;
- public static int UIOPTION_SPLIT_ACTION_BAR_WHEN_NARROW;
- public int colorMode;
- public int configChanges;
- public int documentLaunchMode;
- public int flags;
- public int launchMode;
- public java.lang.String launchToken;
- public int lockTaskLaunchMode;
- public float maxAspectRatio;
- public int maxRecents;
- public java.lang.String parentActivityName;
- public java.lang.String permission;
- public int persistableMode;
- public java.lang.String requestedVrComponent;
- public int resizeMode;
- public int rotationAnimation;
- public int screenOrientation;
- public int softInputMode;
- public java.lang.String targetActivity;
- public java.lang.String taskAffinity;
- public int theme;
- public int uiOptions;
- public android.content.pm.ActivityInfo$WindowLayout windowLayout;
-}
-
--keep class android.content.pm.ActivityInfo$WindowLayout {
- <init>(int, float, int, float, int, int, int);
-
-
-
- public int gravity;
- public int height;
- public float heightFraction;
- public int minHeight;
- public int minWidth;
- public int width;
- public float widthFraction;
-}
-
--keep class android.content.pm.ApplicationInfo {
- <init>();
- <init>(android.content.pm.ApplicationInfo);
-
- public int describeContents();
- public void disableCompatibilityMode();
- public void dump(android.util.Printer, java.lang.String);
- public void dump(android.util.Printer, java.lang.String, int);
- protected android.content.pm.ApplicationInfo getApplicationInfo();
- public java.lang.String getBaseCodePath();
- public java.lang.String getBaseResourcePath();
- public static java.lang.CharSequence getCategoryTitle(android.content.Context, int);
- public java.lang.String getCodePath();
- public int getHiddenApiEnforcementPolicy();
- public java.lang.String getResourcePath();
- public java.lang.String[] getSplitCodePaths();
- public java.lang.String[] getSplitResourcePaths();
- public boolean hasCode();
- public boolean hasRtlSupport();
- public void initForUser(int);
- public boolean isDefaultToDeviceProtectedStorage();
- public boolean isDirectBootAware();
- public boolean isEncryptionAware();
- public boolean isExternal();
- public boolean isExternalAsec();
- public boolean isForwardLocked();
- public boolean isInstantApp();
- public boolean isInternal();
- public boolean isOem();
- public boolean isPartiallyDirectBootAware();
- public boolean isPrivilegedApp();
- public boolean isProduct();
- public boolean isRequiredForSystemUser();
- public boolean isSignedWithPlatformKey();
- public boolean isStaticSharedLibrary();
- public boolean isSystemApp();
- public boolean isUpdatedSystemApp();
- public static boolean isValidHiddenApiEnforcementPolicy(int);
- public boolean isVendor();
- public boolean isVirtualPreload();
- public android.graphics.drawable.Drawable loadDefaultIcon(android.content.pm.PackageManager);
- public java.lang.CharSequence loadDescription(android.content.pm.PackageManager);
- public void maybeUpdateHiddenApiEnforcementPolicy(int, int);
- public boolean requestsIsolatedSplitLoading();
- public void setBaseCodePath(java.lang.String);
- public void setBaseResourcePath(java.lang.String);
- public void setCodePath(java.lang.String);
- public void setHiddenApiEnforcementPolicy(int);
- public void setResourcePath(java.lang.String);
- public void setSplitCodePaths(java.lang.String[]);
- public void setSplitResourcePaths(java.lang.String[]);
- public void setVersionCode(long);
- public java.lang.String toString();
- public boolean usesCompatibilityMode();
- public void writeToParcel(android.os.Parcel, int);
- public void writeToProto(android.util.proto.ProtoOutputStream, long, int);
-
-
- public static int CATEGORY_AUDIO;
- public static int CATEGORY_GAME;
- public static int CATEGORY_IMAGE;
- public static int CATEGORY_MAPS;
- public static int CATEGORY_NEWS;
- public static int CATEGORY_PRODUCTIVITY;
- public static int CATEGORY_SOCIAL;
- public static int CATEGORY_UNDEFINED;
- public static int CATEGORY_VIDEO;
- public static android.os.Parcelable$Creator CREATOR;
- public static int FLAG_ALLOW_BACKUP;
- public static int FLAG_ALLOW_CLEAR_USER_DATA;
- public static int FLAG_ALLOW_TASK_REPARENTING;
- public static int FLAG_DEBUGGABLE;
- public static int FLAG_EXTERNAL_STORAGE;
- public static int FLAG_EXTRACT_NATIVE_LIBS;
- public static int FLAG_FACTORY_TEST;
- public static int FLAG_FULL_BACKUP_ONLY;
- public static int FLAG_HARDWARE_ACCELERATED;
- public static int FLAG_HAS_CODE;
- public static int FLAG_INSTALLED;
- public static int FLAG_IS_DATA_ONLY;
- public static int FLAG_IS_GAME;
- public static int FLAG_KILL_AFTER_RESTORE;
- public static int FLAG_LARGE_HEAP;
- public static int FLAG_MULTIARCH;
- public static int FLAG_PERSISTENT;
- public static int FLAG_RESIZEABLE_FOR_SCREENS;
- public static int FLAG_RESTORE_ANY_VERSION;
- public static int FLAG_STOPPED;
- public static int FLAG_SUPPORTS_LARGE_SCREENS;
- public static int FLAG_SUPPORTS_NORMAL_SCREENS;
- public static int FLAG_SUPPORTS_RTL;
- public static int FLAG_SUPPORTS_SCREEN_DENSITIES;
- public static int FLAG_SUPPORTS_SMALL_SCREENS;
- public static int FLAG_SUPPORTS_XLARGE_SCREENS;
- public static int FLAG_SUSPENDED;
- public static int FLAG_SYSTEM;
- public static int FLAG_TEST_ONLY;
- public static int FLAG_UPDATED_SYSTEM_APP;
- public static int FLAG_USES_CLEARTEXT_TRAFFIC;
- public static int FLAG_VM_SAFE_MODE;
- public static int HIDDEN_API_ENFORCEMENT_BLACK;
- public static int HIDDEN_API_ENFORCEMENT_DARK_GREY_AND_BLACK;
- public static int HIDDEN_API_ENFORCEMENT_DEFAULT;
- public static int HIDDEN_API_ENFORCEMENT_JUST_WARN;
- public static int HIDDEN_API_ENFORCEMENT_NONE;
- public static java.lang.String METADATA_PRELOADED_FONTS;
- public static int PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE;
- public static int PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION;
- public static int PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_UNRESIZEABLE;
- public static int PRIVATE_FLAG_BACKUP_IN_FOREGROUND;
- public static int PRIVATE_FLAG_CANT_SAVE_STATE;
- public static int PRIVATE_FLAG_DEFAULT_TO_DEVICE_PROTECTED_STORAGE;
- public static int PRIVATE_FLAG_DIRECT_BOOT_AWARE;
- public static int PRIVATE_FLAG_FORWARD_LOCK;
- public static int PRIVATE_FLAG_HAS_DOMAIN_URLS;
- public static int PRIVATE_FLAG_HIDDEN;
- public static int PRIVATE_FLAG_INSTANT;
- public static int PRIVATE_FLAG_ISOLATED_SPLIT_LOADING;
- public static int PRIVATE_FLAG_OEM;
- public static int PRIVATE_FLAG_PARTIALLY_DIRECT_BOOT_AWARE;
- public static int PRIVATE_FLAG_PRIVILEGED;
- public static int PRIVATE_FLAG_PRODUCT;
- public static int PRIVATE_FLAG_REQUIRED_FOR_SYSTEM_USER;
- public static int PRIVATE_FLAG_SIGNED_WITH_PLATFORM_KEY;
- public static int PRIVATE_FLAG_STATIC_SHARED_LIBRARY;
- public static int PRIVATE_FLAG_VENDOR;
- public static int PRIVATE_FLAG_VIRTUAL_PRELOAD;
- public java.lang.String appComponentFactory;
- public java.lang.String backupAgentName;
- public int category;
- public java.lang.String classLoaderName;
- public java.lang.String className;
- public int compatibleWidthLimitDp;
- public int compileSdkVersion;
- public java.lang.String compileSdkVersionCodename;
- public java.lang.String credentialProtectedDataDir;
- public java.lang.String dataDir;
- public int descriptionRes;
- public java.lang.String deviceProtectedDataDir;
- public boolean enabled;
- public int enabledSetting;
- public int flags;
- public int fullBackupContent;
- public boolean hiddenUntilInstalled;
- public int installLocation;
- public int largestWidthLimitDp;
- public long longVersionCode;
- public java.lang.String manageSpaceActivityName;
- public float maxAspectRatio;
- public int minSdkVersion;
- public java.lang.String nativeLibraryDir;
- public java.lang.String nativeLibraryRootDir;
- public boolean nativeLibraryRootRequiresIsa;
- public int networkSecurityConfigRes;
- public java.lang.String permission;
- public java.lang.String primaryCpuAbi;
- public int privateFlags;
- public java.lang.String processName;
- public java.lang.String publicSourceDir;
- public int requiresSmallestWidthDp;
- public java.lang.String[] resourceDirs;
- public java.lang.String scanPublicSourceDir;
- public java.lang.String scanSourceDir;
- public java.lang.String seInfo;
- public java.lang.String seInfoUser;
- public java.lang.String secondaryCpuAbi;
- public java.lang.String secondaryNativeLibraryDir;
- public java.lang.String[] sharedLibraryFiles;
- public java.lang.String sourceDir;
- public java.lang.String[] splitClassLoaderNames;
- public android.util.SparseArray splitDependencies;
- public java.lang.String[] splitNames;
- public java.lang.String[] splitPublicSourceDirs;
- public java.lang.String[] splitSourceDirs;
- public java.util.UUID storageUuid;
- public int targetSandboxVersion;
- public int targetSdkVersion;
- public java.lang.String taskAffinity;
- public int theme;
- public int uiOptions;
- public int uid;
- public int versionCode;
- public java.lang.String volumeUuid;
-}
-
--keep class android.content.pm.AuxiliaryResolveInfo {
- <init>(java.lang.String, boolean, android.content.Intent, java.util.List);
- <init>(android.content.ComponentName, android.content.Intent, java.util.List);
- <init>(android.content.ComponentName, java.lang.String, long, java.lang.String);
-
-
-
- public android.content.Intent failureIntent;
- public java.util.List filters;
- public android.content.ComponentName installFailureActivity;
- public boolean needsPhaseTwo;
- public java.lang.String token;
-}
-
--keep class android.content.pm.AuxiliaryResolveInfo$AuxiliaryFilter {
- <init>(android.content.IntentFilter, android.content.pm.InstantAppResolveInfo, java.lang.String, android.os.Bundle);
- <init>(android.content.pm.InstantAppResolveInfo, java.lang.String, android.os.Bundle);
- <init>(java.lang.String, long, java.lang.String);
-
- public java.lang.String toString();
-
-
- public android.os.Bundle extras;
- public java.lang.String packageName;
- public android.content.pm.InstantAppResolveInfo resolveInfo;
- public java.lang.String splitName;
- public long versionCode;
-}
-
--keep class android.content.pm.BaseParceledListSlice {
- <init>(java.util.List);
-
- public java.util.List getList();
- protected abstract android.os.Parcelable$Creator readParcelableCreator(android.os.Parcel, java.lang.ClassLoader);
- public void setInlineCountLimit(int);
- protected abstract void writeElement(java.lang.Object, android.os.Parcel, int);
- protected abstract void writeParcelableCreator(java.lang.Object, android.os.Parcel);
- public void writeToParcel(android.os.Parcel, int);
-
-
-}
-
--keep class android.content.pm.ChangedPackages {
- <init>(int, java.util.List);
- <init>(android.os.Parcel);
-
- public int describeContents();
- public java.util.List getPackageNames();
- public int getSequenceNumber();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.content.pm.ComponentInfo {
- <init>();
- <init>(android.content.pm.ComponentInfo);
- <init>(android.os.Parcel);
-
- protected void dumpBack(android.util.Printer, java.lang.String);
- protected void dumpFront(android.util.Printer, java.lang.String);
- protected android.content.pm.ApplicationInfo getApplicationInfo();
- public int getBannerResource();
- public android.content.ComponentName getComponentName();
- public int getIconResource();
- public int getLogoResource();
- public boolean isEnabled();
- protected android.graphics.drawable.Drawable loadDefaultBanner(android.content.pm.PackageManager);
- public android.graphics.drawable.Drawable loadDefaultIcon(android.content.pm.PackageManager);
- protected android.graphics.drawable.Drawable loadDefaultLogo(android.content.pm.PackageManager);
- public java.lang.CharSequence loadUnsafeLabel(android.content.pm.PackageManager);
- public void writeToParcel(android.os.Parcel, int);
-
-
- public android.content.pm.ApplicationInfo applicationInfo;
- public int descriptionRes;
- public boolean directBootAware;
- public boolean enabled;
- public boolean encryptionAware;
- public boolean exported;
- public java.lang.String processName;
- public java.lang.String splitName;
-}
-
--keep class android.content.pm.ConfigurationInfo {
- <init>();
- <init>(android.content.pm.ConfigurationInfo);
-
- public int describeContents();
- public java.lang.String getGlEsVersion();
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public static int GL_ES_VERSION_UNDEFINED;
- public static int INPUT_FEATURE_FIVE_WAY_NAV;
- public static int INPUT_FEATURE_HARD_KEYBOARD;
- public int reqGlEsVersion;
- public int reqInputFeatures;
- public int reqKeyboardType;
- public int reqNavigation;
- public int reqTouchScreen;
-}
-
--keep class android.content.pm.FeatureGroupInfo {
- <init>();
- <init>(android.content.pm.FeatureGroupInfo);
-
- public int describeContents();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public android.content.pm.FeatureInfo[] features;
-}
-
--keep class android.content.pm.FeatureInfo {
- <init>();
- <init>(android.content.pm.FeatureInfo);
-
- public int describeContents();
- public java.lang.String getGlEsVersion();
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
- public void writeToProto(android.util.proto.ProtoOutputStream, long);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public static int FLAG_REQUIRED;
- public static int GL_ES_VERSION_UNDEFINED;
- public int flags;
- public java.lang.String name;
- public int reqGlEsVersion;
- public int version;
-}
-
--keep class android.content.pm.IDexModuleRegisterCallback {
-
- public abstract void onDexModuleRegistered(java.lang.String, boolean, java.lang.String);
-
-
-}
-
--keep class android.content.pm.IOnPermissionsChangeListener {
-
- public abstract void onPermissionsChanged(int);
-
-
-}
-
--keep class android.content.pm.IPackageDataObserver {
-
- public abstract void onRemoveCompleted(java.lang.String, boolean);
-
-
-}
-
--keep class android.content.pm.IPackageDeleteObserver {
-
- public abstract void packageDeleted(java.lang.String, int);
-
-
-}
-
--keep class android.content.pm.IPackageDeleteObserver2 {
-
- public abstract void onPackageDeleted(java.lang.String, int, java.lang.String);
- public abstract void onUserActionRequired(android.content.Intent);
-
-
-}
-
--keep class android.content.pm.IPackageInstaller {
-
- public abstract void abandonSession(int);
- public abstract int createSession(android.content.pm.PackageInstaller$SessionParams, java.lang.String, int);
- public abstract android.content.pm.ParceledListSlice getAllSessions(int);
- public abstract android.content.pm.ParceledListSlice getMySessions(java.lang.String, int);
- public abstract android.content.pm.PackageInstaller$SessionInfo getSessionInfo(int);
- public abstract android.content.pm.IPackageInstallerSession openSession(int);
- public abstract void registerCallback(android.content.pm.IPackageInstallerCallback, int);
- public abstract void setPermissionsResult(int, boolean);
- public abstract void uninstall(android.content.pm.VersionedPackage, java.lang.String, int, android.content.IntentSender, int);
- public abstract void unregisterCallback(android.content.pm.IPackageInstallerCallback);
- public abstract void updateSessionAppIcon(int, android.graphics.Bitmap);
- public abstract void updateSessionAppLabel(int, java.lang.String);
-
-
-}
-
--keep class android.content.pm.IPackageInstallerCallback {
-
- public abstract void onSessionActiveChanged(int, boolean);
- public abstract void onSessionBadgingChanged(int);
- public abstract void onSessionCreated(int);
- public abstract void onSessionFinished(int, boolean);
- public abstract void onSessionProgressChanged(int, float);
-
-
-}
-
--keep class android.content.pm.IPackageInstallerSession {
-
- public abstract void abandon();
- public abstract void addClientProgress(float);
- public abstract void close();
- public abstract void commit(android.content.IntentSender, boolean);
- public abstract java.lang.String[] getNames();
- public abstract android.os.ParcelFileDescriptor openRead(java.lang.String);
- public abstract android.os.ParcelFileDescriptor openWrite(java.lang.String, long, long);
- public abstract void removeSplit(java.lang.String);
- public abstract void setClientProgress(float);
- public abstract void transfer(java.lang.String);
- public abstract void write(java.lang.String, long, long, android.os.ParcelFileDescriptor);
-
-
-}
-
--keep class android.content.pm.IPackageManager {
-
- public abstract boolean activitySupportsIntent(android.content.ComponentName, android.content.Intent, java.lang.String);
- public abstract void addCrossProfileIntentFilter(android.content.IntentFilter, java.lang.String, int, int, int);
- public abstract void addOnPermissionsChangeListener(android.content.pm.IOnPermissionsChangeListener);
- public abstract boolean addPermission(android.content.pm.PermissionInfo);
- public abstract boolean addPermissionAsync(android.content.pm.PermissionInfo);
- public abstract void addPersistentPreferredActivity(android.content.IntentFilter, android.content.ComponentName, int);
- public abstract void addPreferredActivity(android.content.IntentFilter, int, android.content.ComponentName[], android.content.ComponentName, int);
- public abstract boolean canForwardTo(android.content.Intent, java.lang.String, int, int);
- public abstract boolean canRequestPackageInstalls(java.lang.String, int);
- public abstract java.lang.String[] canonicalToCurrentPackageNames(java.lang.String[]);
- public abstract void checkPackageStartable(java.lang.String, int);
- public abstract int checkPermission(java.lang.String, java.lang.String, int);
- public abstract int checkSignatures(java.lang.String, java.lang.String);
- public abstract int checkUidPermission(java.lang.String, int);
- public abstract int checkUidSignatures(int, int);
- public abstract void clearApplicationProfileData(java.lang.String);
- public abstract void clearApplicationUserData(java.lang.String, android.content.pm.IPackageDataObserver, int);
- public abstract void clearCrossProfileIntentFilters(int, java.lang.String);
- public abstract void clearPackagePersistentPreferredActivities(java.lang.String, int);
- public abstract void clearPackagePreferredActivities(java.lang.String);
- public abstract java.lang.String[] currentToCanonicalPackageNames(java.lang.String[]);
- public abstract void deleteApplicationCacheFiles(java.lang.String, android.content.pm.IPackageDataObserver);
- public abstract void deleteApplicationCacheFilesAsUser(java.lang.String, int, android.content.pm.IPackageDataObserver);
- public abstract void deletePackageAsUser(java.lang.String, int, android.content.pm.IPackageDeleteObserver, int, int);
- public abstract void deletePackageVersioned(android.content.pm.VersionedPackage, android.content.pm.IPackageDeleteObserver2, int, int);
- public abstract void deletePreloadsFileCache();
- public abstract void dumpProfiles(java.lang.String);
- public abstract void enterSafeMode();
- public abstract void extendVerificationTimeout(int, int, long);
- public abstract android.content.pm.ResolveInfo findPersistentPreferredActivity(android.content.Intent, int);
- public abstract void finishPackageInstall(int, boolean);
- public abstract void flushPackageRestrictionsAsUser(int);
- public abstract void forceDexOpt(java.lang.String);
- public abstract void freeStorage(java.lang.String, long, int, android.content.IntentSender);
- public abstract void freeStorageAndNotify(java.lang.String, long, int, android.content.pm.IPackageDataObserver);
- public abstract android.content.pm.ActivityInfo getActivityInfo(android.content.ComponentName, int, int);
- public abstract android.content.pm.ParceledListSlice getAllIntentFilters(java.lang.String);
- public abstract java.util.List getAllPackages();
- public abstract android.content.pm.ParceledListSlice getAllPermissionGroups(int);
- public abstract java.lang.String[] getAppOpPermissionPackages(java.lang.String);
- public abstract int getApplicationEnabledSetting(java.lang.String, int);
- public abstract boolean getApplicationHiddenSettingAsUser(java.lang.String, int);
- public abstract android.content.pm.ApplicationInfo getApplicationInfo(java.lang.String, int, int);
- public abstract android.content.pm.dex.IArtManager getArtManager();
- public abstract boolean getBlockUninstallForUser(java.lang.String, int);
- public abstract android.content.pm.ChangedPackages getChangedPackages(int, int);
- public abstract int getComponentEnabledSetting(android.content.ComponentName, int);
- public abstract byte[] getDefaultAppsBackup(int);
- public abstract java.lang.String getDefaultBrowserPackageName(int);
- public abstract int getFlagsForUid(int);
- public abstract java.lang.CharSequence getHarmfulAppWarning(java.lang.String, int);
- public abstract android.content.ComponentName getHomeActivities(java.util.List);
- public abstract int getInstallLocation();
- public abstract int getInstallReason(java.lang.String, int);
- public abstract android.content.pm.ParceledListSlice getInstalledApplications(int, int);
- public abstract android.content.pm.ParceledListSlice getInstalledPackages(int, int);
- public abstract java.lang.String getInstallerPackageName(java.lang.String);
- public abstract java.lang.String getInstantAppAndroidId(java.lang.String, int);
- public abstract byte[] getInstantAppCookie(java.lang.String, int);
- public abstract android.graphics.Bitmap getInstantAppIcon(java.lang.String, int);
- public abstract android.content.ComponentName getInstantAppInstallerComponent();
- public abstract android.content.ComponentName getInstantAppResolverComponent();
- public abstract android.content.ComponentName getInstantAppResolverSettingsComponent();
- public abstract android.content.pm.ParceledListSlice getInstantApps(int);
- public abstract android.content.pm.InstrumentationInfo getInstrumentationInfo(android.content.ComponentName, int);
- public abstract byte[] getIntentFilterVerificationBackup(int);
- public abstract android.content.pm.ParceledListSlice getIntentFilterVerifications(java.lang.String);
- public abstract int getIntentVerificationStatus(java.lang.String, int);
- public abstract android.content.pm.KeySet getKeySetByAlias(java.lang.String, java.lang.String);
- public abstract android.content.pm.ResolveInfo getLastChosenActivity(android.content.Intent, java.lang.String, int);
- public abstract int getMoveStatus(int);
- public abstract java.lang.String getNameForUid(int);
- public abstract java.lang.String[] getNamesForUids(int[]);
- public abstract int[] getPackageGids(java.lang.String, int, int);
- public abstract android.content.pm.PackageInfo getPackageInfo(java.lang.String, int, int);
- public abstract android.content.pm.PackageInfo getPackageInfoVersioned(android.content.pm.VersionedPackage, int, int);
- public abstract android.content.pm.IPackageInstaller getPackageInstaller();
- public abstract void getPackageSizeInfo(java.lang.String, int, android.content.pm.IPackageStatsObserver);
- public abstract int getPackageUid(java.lang.String, int, int);
- public abstract java.lang.String[] getPackagesForUid(int);
- public abstract android.content.pm.ParceledListSlice getPackagesHoldingPermissions(java.lang.String[], int, int);
- public abstract java.lang.String getPermissionControllerPackageName();
- public abstract int getPermissionFlags(java.lang.String, java.lang.String, int);
- public abstract byte[] getPermissionGrantBackup(int);
- public abstract android.content.pm.PermissionGroupInfo getPermissionGroupInfo(java.lang.String, int);
- public abstract android.content.pm.PermissionInfo getPermissionInfo(java.lang.String, java.lang.String, int);
- public abstract android.content.pm.ParceledListSlice getPersistentApplications(int);
- public abstract int getPreferredActivities(java.util.List, java.util.List, java.lang.String);
- public abstract byte[] getPreferredActivityBackup(int);
- public abstract int getPrivateFlagsForUid(int);
- public abstract android.content.pm.ProviderInfo getProviderInfo(android.content.ComponentName, int, int);
- public abstract android.content.pm.ActivityInfo getReceiverInfo(android.content.ComponentName, int, int);
- public abstract android.content.pm.ServiceInfo getServiceInfo(android.content.ComponentName, int, int);
- public abstract java.lang.String getServicesSystemSharedLibraryPackageName();
- public abstract android.content.pm.ParceledListSlice getSharedLibraries(java.lang.String, int, int);
- public abstract java.lang.String getSharedSystemSharedLibraryPackageName();
- public abstract android.content.pm.KeySet getSigningKeySet(java.lang.String);
- public abstract android.os.PersistableBundle getSuspendedPackageAppExtras(java.lang.String, int);
- public abstract android.content.pm.ParceledListSlice getSystemAvailableFeatures();
- public abstract java.lang.String[] getSystemSharedLibraryNames();
- public abstract java.lang.String getSystemTextClassifierPackageName();
- public abstract int getUidForSharedUser(java.lang.String);
- public abstract android.content.pm.VerifierDeviceIdentity getVerifierDeviceIdentity();
- public abstract void grantDefaultPermissionsToActiveLuiApp(java.lang.String, int);
- public abstract void grantDefaultPermissionsToEnabledCarrierApps(java.lang.String[], int);
- public abstract void grantDefaultPermissionsToEnabledImsServices(java.lang.String[], int);
- public abstract void grantDefaultPermissionsToEnabledTelephonyDataServices(java.lang.String[], int);
- public abstract void grantRuntimePermission(java.lang.String, java.lang.String, int);
- public abstract boolean hasSigningCertificate(java.lang.String, byte[], int);
- public abstract boolean hasSystemFeature(java.lang.String, int);
- public abstract boolean hasSystemUidErrors();
- public abstract boolean hasUidSigningCertificate(int, byte[], int);
- public abstract int installExistingPackageAsUser(java.lang.String, int, int, int);
- public abstract boolean isFirstBoot();
- public abstract boolean isInstantApp(java.lang.String, int);
- public abstract boolean isOnlyCoreApps();
- public abstract boolean isPackageAvailable(java.lang.String, int);
- public abstract boolean isPackageDeviceAdminOnAnyUser(java.lang.String);
- public abstract boolean isPackageSignedByKeySet(java.lang.String, android.content.pm.KeySet);
- public abstract boolean isPackageSignedByKeySetExactly(java.lang.String, android.content.pm.KeySet);
- public abstract boolean isPackageStateProtected(java.lang.String, int);
- public abstract boolean isPackageSuspendedForUser(java.lang.String, int);
- public abstract boolean isPermissionEnforced(java.lang.String);
- public abstract boolean isPermissionRevokedByPolicy(java.lang.String, java.lang.String, int);
- public abstract boolean isProtectedBroadcast(java.lang.String);
- public abstract boolean isSafeMode();
- public abstract boolean isStorageLow();
- public abstract boolean isUidPrivileged(int);
- public abstract boolean isUpgrade();
- public abstract void logAppProcessStartIfNeeded(java.lang.String, int, java.lang.String, java.lang.String, int);
- public abstract int movePackage(java.lang.String, java.lang.String);
- public abstract int movePrimaryStorage(java.lang.String);
- public abstract android.content.pm.PackageCleanItem nextPackageToClean(android.content.pm.PackageCleanItem);
- public abstract void notifyDexLoad(java.lang.String, java.util.List, java.util.List, java.lang.String);
- public abstract void notifyPackageUse(java.lang.String, int);
- public abstract boolean performDexOptMode(java.lang.String, boolean, java.lang.String, boolean, boolean, java.lang.String);
- public abstract boolean performDexOptSecondary(java.lang.String, java.lang.String, boolean);
- public abstract void performFstrimIfNeeded();
- public abstract android.content.pm.ParceledListSlice queryContentProviders(java.lang.String, int, int, java.lang.String);
- public abstract android.content.pm.ParceledListSlice queryInstrumentation(java.lang.String, int);
- public abstract android.content.pm.ParceledListSlice queryIntentActivities(android.content.Intent, java.lang.String, int, int);
- public abstract android.content.pm.ParceledListSlice queryIntentActivityOptions(android.content.ComponentName, android.content.Intent[], java.lang.String[], android.content.Intent, java.lang.String, int, int);
- public abstract android.content.pm.ParceledListSlice queryIntentContentProviders(android.content.Intent, java.lang.String, int, int);
- public abstract android.content.pm.ParceledListSlice queryIntentReceivers(android.content.Intent, java.lang.String, int, int);
- public abstract android.content.pm.ParceledListSlice queryIntentServices(android.content.Intent, java.lang.String, int, int);
- public abstract android.content.pm.ParceledListSlice queryPermissionsByGroup(java.lang.String, int);
- public abstract void querySyncProviders(java.util.List, java.util.List);
- public abstract void reconcileSecondaryDexFiles(java.lang.String);
- public abstract void registerDexModule(java.lang.String, java.lang.String, boolean, android.content.pm.IDexModuleRegisterCallback);
- public abstract void registerMoveCallback(android.content.pm.IPackageMoveObserver);
- public abstract void removeOnPermissionsChangeListener(android.content.pm.IOnPermissionsChangeListener);
- public abstract void removePermission(java.lang.String);
- public abstract void replacePreferredActivity(android.content.IntentFilter, int, android.content.ComponentName[], android.content.ComponentName, int);
- public abstract void resetApplicationPreferences(int);
- public abstract void resetRuntimePermissions();
- public abstract android.content.pm.ProviderInfo resolveContentProvider(java.lang.String, int, int);
- public abstract android.content.pm.ResolveInfo resolveIntent(android.content.Intent, java.lang.String, int, int);
- public abstract android.content.pm.ResolveInfo resolveService(android.content.Intent, java.lang.String, int, int);
- public abstract void restoreDefaultApps(byte[], int);
- public abstract void restoreIntentFilterVerification(byte[], int);
- public abstract void restorePermissionGrants(byte[], int);
- public abstract void restorePreferredActivities(byte[], int);
- public abstract void revokeDefaultPermissionsFromDisabledTelephonyDataServices(java.lang.String[], int);
- public abstract void revokeDefaultPermissionsFromLuiApps(java.lang.String[], int);
- public abstract void revokeRuntimePermission(java.lang.String, java.lang.String, int);
- public abstract boolean runBackgroundDexoptJob(java.util.List);
- public abstract void setApplicationCategoryHint(java.lang.String, int, java.lang.String);
- public abstract void setApplicationEnabledSetting(java.lang.String, int, int, int, java.lang.String);
- public abstract boolean setApplicationHiddenSettingAsUser(java.lang.String, boolean, int);
- public abstract boolean setBlockUninstallForUser(java.lang.String, boolean, int);
- public abstract void setComponentEnabledSetting(android.content.ComponentName, int, int, int);
- public abstract boolean setDefaultBrowserPackageName(java.lang.String, int);
- public abstract void setHarmfulAppWarning(java.lang.String, java.lang.CharSequence, int);
- public abstract void setHomeActivity(android.content.ComponentName, int);
- public abstract boolean setInstallLocation(int);
- public abstract void setInstallerPackageName(java.lang.String, java.lang.String);
- public abstract boolean setInstantAppCookie(java.lang.String, byte[], int);
- public abstract void setLastChosenActivity(android.content.Intent, java.lang.String, int, android.content.IntentFilter, int, android.content.ComponentName);
- public abstract void setPackageStoppedState(java.lang.String, boolean, int);
- public abstract java.lang.String[] setPackagesSuspendedAsUser(java.lang.String[], boolean, android.os.PersistableBundle, android.os.PersistableBundle, java.lang.String, java.lang.String, int);
- public abstract void setPermissionEnforced(java.lang.String, boolean);
- public abstract boolean setRequiredForSystemUser(java.lang.String, boolean);
- public abstract void setSystemAppHiddenUntilInstalled(java.lang.String, boolean);
- public abstract boolean setSystemAppInstallState(java.lang.String, boolean, int);
- public abstract void setUpdateAvailable(java.lang.String, boolean);
- public abstract boolean shouldShowRequestPermissionRationale(java.lang.String, java.lang.String, int);
- public abstract void systemReady();
- public abstract void unregisterMoveCallback(android.content.pm.IPackageMoveObserver);
- public abstract boolean updateIntentVerificationStatus(java.lang.String, int, int);
- public abstract void updatePackagesIfNeeded();
- public abstract void updatePermissionFlags(java.lang.String, java.lang.String, int, int, int);
- public abstract void updatePermissionFlagsForAllApps(int, int, int);
- public abstract void verifyIntentFilter(int, int, java.util.List);
- public abstract void verifyPendingInstall(int, int);
-
-
-}
-
--keep class android.content.pm.IPackageMoveObserver {
-
- public abstract void onCreated(int, android.os.Bundle);
- public abstract void onStatusChanged(int, int, long);
-
-
-}
-
--keep class android.content.pm.IPackageStatsObserver {
-
- public abstract void onGetStatsCompleted(android.content.pm.PackageStats, boolean);
-
-
-}
-
--keep class android.content.pm.InstantAppInfo {
- <init>(android.content.pm.ApplicationInfo, java.lang.String[], java.lang.String[]);
- <init>(java.lang.String, java.lang.CharSequence, java.lang.String[], java.lang.String[]);
-
- public int describeContents();
- public android.content.pm.ApplicationInfo getApplicationInfo();
- public java.lang.String[] getGrantedPermissions();
- public java.lang.String getPackageName();
- public java.lang.String[] getRequestedPermissions();
- public android.graphics.drawable.Drawable loadIcon(android.content.pm.PackageManager);
- public java.lang.CharSequence loadLabel(android.content.pm.PackageManager);
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.content.pm.InstantAppIntentFilter {
- <init>(java.lang.String, java.util.List);
-
- public int describeContents();
- public java.util.List getFilters();
- public java.lang.String getSplitName();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.content.pm.InstantAppResolveInfo {
- <init>(android.content.pm.InstantAppResolveInfo$InstantAppDigest, java.lang.String, java.util.List, int);
- <init>(android.content.pm.InstantAppResolveInfo$InstantAppDigest, java.lang.String, java.util.List, long, android.os.Bundle);
- <init>(java.lang.String, java.lang.String, java.util.List);
- <init>(android.os.Bundle);
-
- public int describeContents();
- public byte[] getDigestBytes();
- public int getDigestPrefix();
- public android.os.Bundle getExtras();
- public java.util.List getIntentFilters();
- public long getLongVersionCode();
- public java.lang.String getPackageName();
- public int getVersionCode();
- public boolean shouldLetInstallerDecide();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.content.pm.InstantAppResolveInfo$InstantAppDigest {
- <init>(java.lang.String);
- <init>(java.lang.String, int);
-
- public int describeContents();
- public byte[][] getDigestBytes();
- public int[] getDigestPrefix();
- public int[] getDigestPrefixSecure();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public static android.content.pm.InstantAppResolveInfo$InstantAppDigest UNDEFINED;
-}
-
--keep class android.content.pm.InstrumentationInfo {
- <init>();
- <init>(android.content.pm.InstrumentationInfo);
-
- public void copyTo(android.content.pm.ApplicationInfo);
- public int describeContents();
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public java.lang.String credentialProtectedDataDir;
- public java.lang.String dataDir;
- public java.lang.String deviceProtectedDataDir;
- public boolean functionalTest;
- public boolean handleProfiling;
- public java.lang.String nativeLibraryDir;
- public java.lang.String primaryCpuAbi;
- public java.lang.String publicSourceDir;
- public java.lang.String secondaryCpuAbi;
- public java.lang.String secondaryNativeLibraryDir;
- public java.lang.String sourceDir;
- public android.util.SparseArray splitDependencies;
- public java.lang.String[] splitNames;
- public java.lang.String[] splitPublicSourceDirs;
- public java.lang.String[] splitSourceDirs;
- public java.lang.String targetPackage;
- public java.lang.String targetProcesses;
-}
-
--keep class android.content.pm.IntentFilterVerificationInfo {
- <init>();
- <init>(java.lang.String, android.util.ArraySet);
- <init>(org.xmlpull.v1.XmlPullParser);
- <init>(android.os.Parcel);
-
- public int describeContents();
- public java.util.Set getDomains();
- public java.lang.String getDomainsString();
- public java.lang.String getPackageName();
- public int getStatus();
- public java.lang.String getStatusString();
- public static java.lang.String getStatusStringFromValue(long);
- public void readFromXml(org.xmlpull.v1.XmlPullParser);
- public void setDomains(android.util.ArraySet);
- public void setStatus(int);
- public void writeToParcel(android.os.Parcel, int);
- public void writeToXml(org.xmlpull.v1.XmlSerializer);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.content.pm.KeySet {
- <init>(android.os.IBinder);
-
- public int describeContents();
- public boolean equals(java.lang.Object);
- public android.os.IBinder getToken();
- public int hashCode();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.content.pm.PackageCleanItem {
- <init>(int, java.lang.String, boolean);
-
- public int describeContents();
- public boolean equals(java.lang.Object);
- public int hashCode();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public boolean andCode;
- public java.lang.String packageName;
- public int userId;
-}
-
--keep class android.content.pm.PackageInfo {
- <init>();
-
- public static long composeLongVersionCode(int, int);
- public int describeContents();
- public long getLongVersionCode();
- public boolean isOverlayPackage();
- public boolean isStaticOverlayPackage();
- public void setLongVersionCode(long);
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public static int INSTALL_LOCATION_AUTO;
- public static int INSTALL_LOCATION_INTERNAL_ONLY;
- public static int INSTALL_LOCATION_PREFER_EXTERNAL;
- public static int INSTALL_LOCATION_UNSPECIFIED;
- public static int REQUESTED_PERMISSION_GRANTED;
- public static int REQUESTED_PERMISSION_REQUIRED;
- public android.content.pm.ActivityInfo[] activities;
- public android.content.pm.ApplicationInfo applicationInfo;
- public int baseRevisionCode;
- public int compileSdkVersion;
- public java.lang.String compileSdkVersionCodename;
- public android.content.pm.ConfigurationInfo[] configPreferences;
- public boolean coreApp;
- public android.content.pm.FeatureGroupInfo[] featureGroups;
- public long firstInstallTime;
- public int[] gids;
- public int installLocation;
- public android.content.pm.InstrumentationInfo[] instrumentation;
- public boolean isStub;
- public long lastUpdateTime;
- public java.lang.String overlayCategory;
- public int overlayPriority;
- public java.lang.String overlayTarget;
- public java.lang.String packageName;
- public android.content.pm.PermissionInfo[] permissions;
- public android.content.pm.ProviderInfo[] providers;
- public android.content.pm.ActivityInfo[] receivers;
- public android.content.pm.FeatureInfo[] reqFeatures;
- public java.lang.String[] requestedPermissions;
- public int[] requestedPermissionsFlags;
- public java.lang.String requiredAccountType;
- public boolean requiredForAllUsers;
- public java.lang.String restrictedAccountType;
- public android.content.pm.ServiceInfo[] services;
- public java.lang.String sharedUserId;
- public int sharedUserLabel;
- public android.content.pm.Signature[] signatures;
- public android.content.pm.SigningInfo signingInfo;
- public java.lang.String[] splitNames;
- public int[] splitRevisionCodes;
- public int versionCode;
- public int versionCodeMajor;
- public java.lang.String versionName;
-}
-
--keep class android.content.pm.PackageInstaller {
- <init>(android.content.pm.IPackageInstaller, java.lang.String, int);
-
- public void abandonSession(int);
- public void addSessionCallback(android.content.pm.PackageInstaller$SessionCallback);
- public void addSessionCallback(android.content.pm.PackageInstaller$SessionCallback, android.os.Handler);
- public int createSession(android.content.pm.PackageInstaller$SessionParams);
- public java.util.List getAllSessions();
- public java.util.List getMySessions();
- public android.content.pm.PackageInstaller$SessionInfo getSessionInfo(int);
- public android.content.pm.PackageInstaller$Session openSession(int);
- public void registerSessionCallback(android.content.pm.PackageInstaller$SessionCallback);
- public void registerSessionCallback(android.content.pm.PackageInstaller$SessionCallback, android.os.Handler);
- public void removeSessionCallback(android.content.pm.PackageInstaller$SessionCallback);
- public void setPermissionsResult(int, boolean);
- public void uninstall(java.lang.String, android.content.IntentSender);
- public void uninstall(java.lang.String, int, android.content.IntentSender);
- public void uninstall(android.content.pm.VersionedPackage, android.content.IntentSender);
- public void uninstall(android.content.pm.VersionedPackage, int, android.content.IntentSender);
- public void unregisterSessionCallback(android.content.pm.PackageInstaller$SessionCallback);
- public void updateSessionAppIcon(int, android.graphics.Bitmap);
- public void updateSessionAppLabel(int, java.lang.CharSequence);
-
-
- public static java.lang.String ACTION_CONFIRM_PERMISSIONS;
- public static java.lang.String ACTION_SESSION_COMMITTED;
- public static java.lang.String ACTION_SESSION_DETAILS;
- public static boolean ENABLE_REVOCABLE_FD;
- public static java.lang.String EXTRA_CALLBACK;
- public static java.lang.String EXTRA_LEGACY_BUNDLE;
- public static java.lang.String EXTRA_LEGACY_STATUS;
- public static java.lang.String EXTRA_OTHER_PACKAGE_NAME;
- public static java.lang.String EXTRA_PACKAGE_NAME;
- public static java.lang.String EXTRA_PACKAGE_NAMES;
- public static java.lang.String EXTRA_SESSION;
- public static java.lang.String EXTRA_SESSION_ID;
- public static java.lang.String EXTRA_STATUS;
- public static java.lang.String EXTRA_STATUS_MESSAGE;
- public static java.lang.String EXTRA_STORAGE_PATH;
- public static int STATUS_FAILURE;
- public static int STATUS_FAILURE_ABORTED;
- public static int STATUS_FAILURE_BLOCKED;
- public static int STATUS_FAILURE_CONFLICT;
- public static int STATUS_FAILURE_INCOMPATIBLE;
- public static int STATUS_FAILURE_INVALID;
- public static int STATUS_FAILURE_STORAGE;
- public static int STATUS_PENDING_USER_ACTION;
- public static int STATUS_SUCCESS;
-}
-
--keep class android.content.pm.PackageInstaller$Session {
- <init>(android.content.pm.IPackageInstallerSession);
-
- public void abandon();
- public void addProgress(float);
- public void close();
- public void commit(android.content.IntentSender);
- public void commitTransferred(android.content.IntentSender);
- public void fsync(java.io.OutputStream);
- public java.lang.String[] getNames();
- public java.io.InputStream openRead(java.lang.String);
- public java.io.OutputStream openWrite(java.lang.String, long, long);
- public void removeSplit(java.lang.String);
- public void setProgress(float);
- public void setStagingProgress(float);
- public void transfer(java.lang.String);
- public void write(java.lang.String, long, long, android.os.ParcelFileDescriptor);
-
-
-}
-
--keep class android.content.pm.PackageInstaller$SessionCallback {
- <init>();
-
- public abstract void onActiveChanged(int, boolean);
- public abstract void onBadgingChanged(int);
- public abstract void onCreated(int);
- public abstract void onFinished(int, boolean);
- public abstract void onProgressChanged(int, float);
-
-
-}
-
--keep class android.content.pm.PackageInstaller$SessionInfo {
- <init>();
- <init>(android.os.Parcel);
-
- public android.content.Intent createDetailsIntent();
- public int describeContents();
- public boolean getAllocateAggressive();
- public boolean getAllowDowngrade();
- public android.graphics.Bitmap getAppIcon();
- public java.lang.CharSequence getAppLabel();
- public java.lang.String getAppPackageName();
- public android.content.Intent getDetailsIntent();
- public boolean getDontKillApp();
- public java.lang.String[] getGrantedRuntimePermissions();
- public boolean getInstallAsFullApp(boolean);
- public boolean getInstallAsInstantApp(boolean);
- public boolean getInstallAsVirtualPreload();
- public int getInstallLocation();
- public int getInstallReason();
- public java.lang.String getInstallerPackageName();
- public int getMode();
- public int getOriginatingUid();
- public android.net.Uri getOriginatingUri();
- public float getProgress();
- public android.net.Uri getReferrerUri();
- public int getSessionId();
- public long getSize();
- public boolean isActive();
- public boolean isOpen();
- public boolean isSealed();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public boolean active;
- public android.graphics.Bitmap appIcon;
- public java.lang.CharSequence appLabel;
- public java.lang.String appPackageName;
- public java.lang.String[] grantedRuntimePermissions;
- public int installFlags;
- public int installLocation;
- public int installReason;
- public java.lang.String installerPackageName;
- public int mode;
- public int originatingUid;
- public android.net.Uri originatingUri;
- public float progress;
- public android.net.Uri referrerUri;
- public java.lang.String resolvedBaseCodePath;
- public boolean sealed;
- public int sessionId;
- public long sizeBytes;
-}
-
--keep class android.content.pm.PackageInstaller$SessionParams {
- <init>(int);
- <init>(android.os.Parcel);
-
- public boolean areHiddenOptionsSet();
- public int describeContents();
- public void dump(com.android.internal.util.IndentingPrintWriter);
- public void setAllocateAggressive(boolean);
- public void setAllowDowngrade(boolean);
- public void setAppIcon(android.graphics.Bitmap);
- public void setAppLabel(java.lang.CharSequence);
- public void setAppPackageName(java.lang.String);
- public void setDontKillApp(boolean);
- public void setGrantedRuntimePermissions(java.lang.String[]);
- public void setInstallAsInstantApp(boolean);
- public void setInstallAsVirtualPreload();
- public void setInstallFlagsExternal();
- public void setInstallFlagsForcePermissionPrompt();
- public void setInstallFlagsInternal();
- public void setInstallLocation(int);
- public void setInstallReason(int);
- public void setInstallerPackageName(java.lang.String);
- public void setOriginatingUid(int);
- public void setOriginatingUri(android.net.Uri);
- public void setReferrerUri(android.net.Uri);
- public void setSize(long);
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public static int MODE_FULL_INSTALL;
- public static int MODE_INHERIT_EXISTING;
- public static int MODE_INVALID;
- public static int UID_UNKNOWN;
- public java.lang.String abiOverride;
- public android.graphics.Bitmap appIcon;
- public long appIconLastModified;
- public java.lang.String appLabel;
- public java.lang.String appPackageName;
- public java.lang.String[] grantedRuntimePermissions;
- public int installFlags;
- public int installLocation;
- public int installReason;
- public java.lang.String installerPackageName;
- public int mode;
- public int originatingUid;
- public android.net.Uri originatingUri;
- public android.net.Uri referrerUri;
- public long sizeBytes;
- public java.lang.String volumeUuid;
-}
-
--keep class android.content.pm.PackageItemInfo {
- <init>();
- <init>(android.content.pm.PackageItemInfo);
- <init>(android.os.Parcel);
-
- protected void dumpBack(android.util.Printer, java.lang.String);
- protected void dumpFront(android.util.Printer, java.lang.String);
- protected android.content.pm.ApplicationInfo getApplicationInfo();
- public android.graphics.drawable.Drawable loadBanner(android.content.pm.PackageManager);
- protected android.graphics.drawable.Drawable loadDefaultBanner(android.content.pm.PackageManager);
- public android.graphics.drawable.Drawable loadDefaultIcon(android.content.pm.PackageManager);
- protected android.graphics.drawable.Drawable loadDefaultLogo(android.content.pm.PackageManager);
- public android.graphics.drawable.Drawable loadIcon(android.content.pm.PackageManager);
- public java.lang.CharSequence loadLabel(android.content.pm.PackageManager);
- public android.graphics.drawable.Drawable loadLogo(android.content.pm.PackageManager);
- public java.lang.CharSequence loadSafeLabel(android.content.pm.PackageManager);
- public java.lang.CharSequence loadSafeLabel(android.content.pm.PackageManager, float, int);
- public android.graphics.drawable.Drawable loadUnbadgedIcon(android.content.pm.PackageManager);
- public java.lang.CharSequence loadUnsafeLabel(android.content.pm.PackageManager);
- public android.content.res.XmlResourceParser loadXmlMetaData(android.content.pm.PackageManager, java.lang.String);
- public static void setForceSafeLabels(boolean);
- public void writeToParcel(android.os.Parcel, int);
- public void writeToProto(android.util.proto.ProtoOutputStream, long);
-
-
- public static int DUMP_FLAG_ALL;
- public static int DUMP_FLAG_APPLICATION;
- public static int DUMP_FLAG_DETAILS;
- public static int SAFE_LABEL_FLAG_FIRST_LINE;
- public static int SAFE_LABEL_FLAG_SINGLE_LINE;
- public static int SAFE_LABEL_FLAG_TRIM;
- public int banner;
- public int icon;
- public int labelRes;
- public int logo;
- public android.os.Bundle metaData;
- public java.lang.String name;
- public java.lang.CharSequence nonLocalizedLabel;
- public java.lang.String packageName;
- public int showUserIcon;
-}
-
--keep class android.content.pm.PackageManager {
- <init>();
-
- public abstract void addCrossProfileIntentFilter(android.content.IntentFilter, int, int, int);
- public abstract void addOnPermissionsChangeListener(android.content.pm.PackageManager$OnPermissionsChangedListener);
- public abstract void addPackageToPreferred(java.lang.String);
- public abstract boolean addPermission(android.content.pm.PermissionInfo);
- public abstract boolean addPermissionAsync(android.content.pm.PermissionInfo);
- public abstract void addPreferredActivity(android.content.IntentFilter, int, android.content.ComponentName[], android.content.ComponentName);
- public void addPreferredActivityAsUser(android.content.IntentFilter, int, android.content.ComponentName[], android.content.ComponentName, int);
- public android.content.Intent buildRequestPermissionsIntent(java.lang.String[]);
- public abstract boolean canRequestPackageInstalls();
- public abstract java.lang.String[] canonicalToCurrentPackageNames(java.lang.String[]);
- public abstract int checkPermission(java.lang.String, java.lang.String);
- public abstract int checkSignatures(java.lang.String, java.lang.String);
- public abstract int checkSignatures(int, int);
- public abstract void clearApplicationUserData(java.lang.String, android.content.pm.IPackageDataObserver);
- public abstract void clearCrossProfileIntentFilters(int);
- public abstract void clearInstantAppCookie();
- public abstract void clearPackagePreferredActivities(java.lang.String);
- public abstract java.lang.String[] currentToCanonicalPackageNames(java.lang.String[]);
- public abstract void deleteApplicationCacheFiles(java.lang.String, android.content.pm.IPackageDataObserver);
- public abstract void deleteApplicationCacheFilesAsUser(java.lang.String, int, android.content.pm.IPackageDataObserver);
- public abstract void deletePackage(java.lang.String, android.content.pm.IPackageDeleteObserver, int);
- public abstract void deletePackageAsUser(java.lang.String, android.content.pm.IPackageDeleteObserver, int, int);
- public static int deleteStatusToPublicStatus(int);
- public static java.lang.String deleteStatusToString(int, java.lang.String);
- public static java.lang.String deleteStatusToString(int);
- public abstract void extendVerificationTimeout(int, int, long);
- public abstract void flushPackageRestrictionsAsUser(int);
- public void freeStorage(long, android.content.IntentSender);
- public abstract void freeStorage(java.lang.String, long, android.content.IntentSender);
- public void freeStorageAndNotify(long, android.content.pm.IPackageDataObserver);
- public abstract void freeStorageAndNotify(java.lang.String, long, android.content.pm.IPackageDataObserver);
- public abstract android.graphics.drawable.Drawable getActivityBanner(android.content.ComponentName);
- public abstract android.graphics.drawable.Drawable getActivityBanner(android.content.Intent);
- public abstract android.graphics.drawable.Drawable getActivityIcon(android.content.ComponentName);
- public abstract android.graphics.drawable.Drawable getActivityIcon(android.content.Intent);
- public abstract android.content.pm.ActivityInfo getActivityInfo(android.content.ComponentName, int);
- public abstract android.graphics.drawable.Drawable getActivityLogo(android.content.ComponentName);
- public abstract android.graphics.drawable.Drawable getActivityLogo(android.content.Intent);
- public abstract java.util.List getAllIntentFilters(java.lang.String);
- public abstract java.util.List getAllPermissionGroups(int);
- public abstract android.graphics.drawable.Drawable getApplicationBanner(android.content.pm.ApplicationInfo);
- public abstract android.graphics.drawable.Drawable getApplicationBanner(java.lang.String);
- public abstract int getApplicationEnabledSetting(java.lang.String);
- public abstract boolean getApplicationHiddenSettingAsUser(java.lang.String, android.os.UserHandle);
- public abstract android.graphics.drawable.Drawable getApplicationIcon(android.content.pm.ApplicationInfo);
- public abstract android.graphics.drawable.Drawable getApplicationIcon(java.lang.String);
- public abstract android.content.pm.ApplicationInfo getApplicationInfo(java.lang.String, int);
- public abstract android.content.pm.ApplicationInfo getApplicationInfoAsUser(java.lang.String, int, int);
- public abstract java.lang.CharSequence getApplicationLabel(android.content.pm.ApplicationInfo);
- public abstract android.graphics.drawable.Drawable getApplicationLogo(android.content.pm.ApplicationInfo);
- public abstract android.graphics.drawable.Drawable getApplicationLogo(java.lang.String);
- public android.content.pm.dex.ArtManager getArtManager();
- public abstract android.content.Intent getCarLaunchIntentForPackage(java.lang.String);
- public abstract android.content.pm.ChangedPackages getChangedPackages(int);
- public abstract int getComponentEnabledSetting(android.content.ComponentName);
- public abstract android.graphics.drawable.Drawable getDefaultActivityIcon();
- public abstract java.lang.String getDefaultBrowserPackageNameAsUser(int);
- public abstract android.graphics.drawable.Drawable getDrawable(java.lang.String, int, android.content.pm.ApplicationInfo);
- public java.lang.CharSequence getHarmfulAppWarning(java.lang.String);
- public abstract android.content.ComponentName getHomeActivities(java.util.List);
- public abstract int getInstallReason(java.lang.String, android.os.UserHandle);
- public abstract java.util.List getInstalledApplications(int);
- public abstract java.util.List getInstalledApplicationsAsUser(int, int);
- public abstract java.util.List getInstalledPackages(int);
- public abstract java.util.List getInstalledPackagesAsUser(int, int);
- public abstract java.lang.String getInstallerPackageName(java.lang.String);
- public abstract java.lang.String getInstantAppAndroidId(java.lang.String, android.os.UserHandle);
- public abstract byte[] getInstantAppCookie();
- public abstract int getInstantAppCookieMaxBytes();
- public abstract int getInstantAppCookieMaxSize();
- public abstract android.graphics.drawable.Drawable getInstantAppIcon(java.lang.String);
- public abstract android.content.ComponentName getInstantAppInstallerComponent();
- public abstract android.content.ComponentName getInstantAppResolverSettingsComponent();
- public abstract java.util.List getInstantApps();
- public abstract android.content.pm.InstrumentationInfo getInstrumentationInfo(android.content.ComponentName, int);
- public abstract java.util.List getIntentFilterVerifications(java.lang.String);
- public abstract int getIntentVerificationStatusAsUser(java.lang.String, int);
- public abstract android.content.pm.KeySet getKeySetByAlias(java.lang.String, java.lang.String);
- public abstract android.content.Intent getLaunchIntentForPackage(java.lang.String);
- public abstract android.content.Intent getLeanbackLaunchIntentForPackage(java.lang.String);
- public abstract int getMoveStatus(int);
- public abstract java.lang.String getNameForUid(int);
- public abstract java.lang.String[] getNamesForUids(int[]);
- public android.content.pm.PackageInfo getPackageArchiveInfo(java.lang.String, int);
- public abstract java.util.List getPackageCandidateVolumes(android.content.pm.ApplicationInfo);
- public abstract android.os.storage.VolumeInfo getPackageCurrentVolume(android.content.pm.ApplicationInfo);
- public abstract int[] getPackageGids(java.lang.String);
- public abstract int[] getPackageGids(java.lang.String, int);
- public abstract android.content.pm.PackageInfo getPackageInfo(java.lang.String, int);
- public abstract android.content.pm.PackageInfo getPackageInfo(android.content.pm.VersionedPackage, int);
- public abstract android.content.pm.PackageInfo getPackageInfoAsUser(java.lang.String, int, int);
- public abstract android.content.pm.PackageInstaller getPackageInstaller();
- public void getPackageSizeInfo(java.lang.String, android.content.pm.IPackageStatsObserver);
- public abstract void getPackageSizeInfoAsUser(java.lang.String, int, android.content.pm.IPackageStatsObserver);
- public abstract int getPackageUid(java.lang.String, int);
- public abstract int getPackageUidAsUser(java.lang.String, int);
- public abstract int getPackageUidAsUser(java.lang.String, int, int);
- public abstract java.lang.String[] getPackagesForUid(int);
- public abstract java.util.List getPackagesHoldingPermissions(java.lang.String[], int);
- public abstract java.lang.String getPermissionControllerPackageName();
- public abstract int getPermissionFlags(java.lang.String, java.lang.String, android.os.UserHandle);
- public abstract android.content.pm.PermissionGroupInfo getPermissionGroupInfo(java.lang.String, int);
- public abstract android.content.pm.PermissionInfo getPermissionInfo(java.lang.String, int);
- public abstract int getPreferredActivities(java.util.List, java.util.List, java.lang.String);
- public abstract java.util.List getPreferredPackages(int);
- public abstract java.util.List getPrimaryStorageCandidateVolumes();
- public abstract android.os.storage.VolumeInfo getPrimaryStorageCurrentVolume();
- public abstract android.content.pm.ProviderInfo getProviderInfo(android.content.ComponentName, int);
- public abstract android.content.pm.ActivityInfo getReceiverInfo(android.content.ComponentName, int);
- public abstract android.content.res.Resources getResourcesForActivity(android.content.ComponentName);
- public abstract android.content.res.Resources getResourcesForApplication(android.content.pm.ApplicationInfo);
- public abstract android.content.res.Resources getResourcesForApplication(java.lang.String);
- public abstract android.content.res.Resources getResourcesForApplicationAsUser(java.lang.String, int);
- public abstract android.content.pm.ServiceInfo getServiceInfo(android.content.ComponentName, int);
- public abstract java.lang.String getServicesSystemSharedLibraryPackageName();
- public abstract java.util.List getSharedLibraries(int);
- public abstract java.util.List getSharedLibrariesAsUser(int, int);
- public abstract java.lang.String getSharedSystemSharedLibraryPackageName();
- public abstract android.content.pm.KeySet getSigningKeySet(java.lang.String);
- public android.os.Bundle getSuspendedPackageAppExtras();
- public abstract android.content.pm.FeatureInfo[] getSystemAvailableFeatures();
- public abstract java.lang.String[] getSystemSharedLibraryNames();
- public java.lang.String getSystemTextClassifierPackageName();
- public abstract java.lang.CharSequence getText(java.lang.String, int, android.content.pm.ApplicationInfo);
- public abstract int getUidForSharedUser(java.lang.String);
- public abstract android.graphics.drawable.Drawable getUserBadgeForDensity(android.os.UserHandle, int);
- public abstract android.graphics.drawable.Drawable getUserBadgeForDensityNoBackground(android.os.UserHandle, int);
- public abstract android.graphics.drawable.Drawable getUserBadgedDrawableForDensity(android.graphics.drawable.Drawable, android.os.UserHandle, android.graphics.Rect, int);
- public abstract android.graphics.drawable.Drawable getUserBadgedIcon(android.graphics.drawable.Drawable, android.os.UserHandle);
- public abstract java.lang.CharSequence getUserBadgedLabel(java.lang.CharSequence, android.os.UserHandle);
- public int getUserId();
- public abstract android.content.pm.VerifierDeviceIdentity getVerifierDeviceIdentity();
- public abstract android.content.res.XmlResourceParser getXml(java.lang.String, int, android.content.pm.ApplicationInfo);
- public abstract void grantRuntimePermission(java.lang.String, java.lang.String, android.os.UserHandle);
- public boolean hasSigningCertificate(java.lang.String, byte[], int);
- public boolean hasSigningCertificate(int, byte[], int);
- public abstract boolean hasSystemFeature(java.lang.String);
- public abstract boolean hasSystemFeature(java.lang.String, int);
- public abstract int installExistingPackage(java.lang.String);
- public abstract int installExistingPackage(java.lang.String, int);
- public abstract int installExistingPackageAsUser(java.lang.String, int);
- public static int installStatusToPublicStatus(int);
- public static java.lang.String installStatusToString(int, java.lang.String);
- public static java.lang.String installStatusToString(int);
- public abstract boolean isInstantApp();
- public abstract boolean isInstantApp(java.lang.String);
- public static boolean isMoveStatusFinished(int);
- public abstract boolean isPackageAvailable(java.lang.String);
- public boolean isPackageStateProtected(java.lang.String, int);
- public boolean isPackageSuspended(java.lang.String);
- public boolean isPackageSuspended();
- public abstract boolean isPackageSuspendedForUser(java.lang.String, int);
- public abstract boolean isPermissionReviewModeEnabled();
- public abstract boolean isPermissionRevokedByPolicy(java.lang.String, java.lang.String);
- public abstract boolean isSafeMode();
- public abstract boolean isSignedBy(java.lang.String, android.content.pm.KeySet);
- public abstract boolean isSignedByExactly(java.lang.String, android.content.pm.KeySet);
- public abstract boolean isUpgrade();
- public abstract android.graphics.drawable.Drawable loadItemIcon(android.content.pm.PackageItemInfo, android.content.pm.ApplicationInfo);
- public abstract android.graphics.drawable.Drawable loadUnbadgedItemIcon(android.content.pm.PackageItemInfo, android.content.pm.ApplicationInfo);
- public abstract int movePackage(java.lang.String, android.os.storage.VolumeInfo);
- public abstract int movePrimaryStorage(android.os.storage.VolumeInfo);
- public static java.lang.String permissionFlagToString(int);
- public abstract java.util.List queryBroadcastReceivers(android.content.Intent, int);
- public java.util.List queryBroadcastReceivers(android.content.Intent, int, int);
- public java.util.List queryBroadcastReceiversAsUser(android.content.Intent, int, android.os.UserHandle);
- public abstract java.util.List queryBroadcastReceiversAsUser(android.content.Intent, int, int);
- public abstract java.util.List queryContentProviders(java.lang.String, int, int);
- public java.util.List queryContentProviders(java.lang.String, int, int, java.lang.String);
- public abstract java.util.List queryInstrumentation(java.lang.String, int);
- public abstract java.util.List queryIntentActivities(android.content.Intent, int);
- public abstract java.util.List queryIntentActivitiesAsUser(android.content.Intent, int, int);
- public abstract java.util.List queryIntentActivityOptions(android.content.ComponentName, android.content.Intent[], android.content.Intent, int);
- public abstract java.util.List queryIntentContentProviders(android.content.Intent, int);
- public abstract java.util.List queryIntentContentProvidersAsUser(android.content.Intent, int, int);
- public abstract java.util.List queryIntentServices(android.content.Intent, int);
- public abstract java.util.List queryIntentServicesAsUser(android.content.Intent, int, int);
- public abstract java.util.List queryPermissionsByGroup(java.lang.String, int);
- public abstract void registerDexModule(java.lang.String, android.content.pm.PackageManager$DexModuleRegisterCallback);
- public abstract void registerMoveCallback(android.content.pm.PackageManager$MoveCallback, android.os.Handler);
- public abstract void removeOnPermissionsChangeListener(android.content.pm.PackageManager$OnPermissionsChangedListener);
- public abstract void removePackageFromPreferred(java.lang.String);
- public abstract void removePermission(java.lang.String);
- public abstract void replacePreferredActivity(android.content.IntentFilter, int, android.content.ComponentName[], android.content.ComponentName);
- public void replacePreferredActivityAsUser(android.content.IntentFilter, int, android.content.ComponentName[], android.content.ComponentName, int);
- public abstract android.content.pm.ResolveInfo resolveActivity(android.content.Intent, int);
- public abstract android.content.pm.ResolveInfo resolveActivityAsUser(android.content.Intent, int, int);
- public abstract android.content.pm.ProviderInfo resolveContentProvider(java.lang.String, int);
- public abstract android.content.pm.ProviderInfo resolveContentProviderAsUser(java.lang.String, int, int);
- public abstract android.content.pm.ResolveInfo resolveService(android.content.Intent, int);
- public abstract android.content.pm.ResolveInfo resolveServiceAsUser(android.content.Intent, int, int);
- public abstract void revokeRuntimePermission(java.lang.String, java.lang.String, android.os.UserHandle);
- public abstract void setApplicationCategoryHint(java.lang.String, int);
- public abstract void setApplicationEnabledSetting(java.lang.String, int, int);
- public abstract boolean setApplicationHiddenSettingAsUser(java.lang.String, boolean, android.os.UserHandle);
- public abstract void setComponentEnabledSetting(android.content.ComponentName, int, int);
- public abstract boolean setDefaultBrowserPackageNameAsUser(java.lang.String, int);
- public void setHarmfulAppWarning(java.lang.String, java.lang.CharSequence);
- public abstract void setInstallerPackageName(java.lang.String, java.lang.String);
- public abstract boolean setInstantAppCookie(byte[]);
- public java.lang.String[] setPackagesSuspended(java.lang.String[], boolean, android.os.PersistableBundle, android.os.PersistableBundle, java.lang.String);
- public abstract void setUpdateAvailable(java.lang.String, boolean);
- public abstract boolean shouldShowRequestPermissionRationale(java.lang.String);
- public abstract void unregisterMoveCallback(android.content.pm.PackageManager$MoveCallback);
- public abstract void updateInstantAppCookie(byte[]);
- public abstract boolean updateIntentVerificationStatusAsUser(java.lang.String, int, int);
- public abstract void updatePermissionFlags(java.lang.String, java.lang.String, int, int, android.os.UserHandle);
- public abstract void verifyIntentFilter(int, int, java.util.List);
- public abstract void verifyPendingInstall(int, int);
-
-
- public static java.lang.String ACTION_CLEAN_EXTERNAL_STORAGE;
- public static java.lang.String ACTION_REQUEST_PERMISSIONS;
- public static boolean APPLY_DEFAULT_TO_DEVICE_PROTECTED_STORAGE;
- public static int CERT_INPUT_RAW_X509;
- public static int CERT_INPUT_SHA256;
- public static int COMPONENT_ENABLED_STATE_DEFAULT;
- public static int COMPONENT_ENABLED_STATE_DISABLED;
- public static int COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED;
- public static int COMPONENT_ENABLED_STATE_DISABLED_USER;
- public static int COMPONENT_ENABLED_STATE_ENABLED;
- public static int DELETE_ALL_USERS;
- public static int DELETE_CHATTY;
- public static int DELETE_DONT_KILL_APP;
- public static int DELETE_FAILED_ABORTED;
- public static int DELETE_FAILED_DEVICE_POLICY_MANAGER;
- public static int DELETE_FAILED_INTERNAL_ERROR;
- public static int DELETE_FAILED_OWNER_BLOCKED;
- public static int DELETE_FAILED_USED_SHARED_LIBRARY;
- public static int DELETE_FAILED_USER_RESTRICTED;
- public static int DELETE_KEEP_DATA;
- public static int DELETE_SUCCEEDED;
- public static int DELETE_SYSTEM_APP;
- public static int DONT_KILL_APP;
- public static java.lang.String EXTRA_FAILURE_EXISTING_PACKAGE;
- public static java.lang.String EXTRA_FAILURE_EXISTING_PERMISSION;
- public static java.lang.String EXTRA_INTENT_FILTER_VERIFICATION_HOSTS;
- public static java.lang.String EXTRA_INTENT_FILTER_VERIFICATION_ID;
- public static java.lang.String EXTRA_INTENT_FILTER_VERIFICATION_PACKAGE_NAME;
- public static java.lang.String EXTRA_INTENT_FILTER_VERIFICATION_URI_SCHEME;
- public static java.lang.String EXTRA_MOVE_ID;
- public static java.lang.String EXTRA_REQUEST_PERMISSIONS_NAMES;
- public static java.lang.String EXTRA_REQUEST_PERMISSIONS_RESULTS;
- public static java.lang.String EXTRA_VERIFICATION_ID;
- public static java.lang.String EXTRA_VERIFICATION_INSTALLER_PACKAGE;
- public static java.lang.String EXTRA_VERIFICATION_INSTALLER_UID;
- public static java.lang.String EXTRA_VERIFICATION_INSTALL_FLAGS;
- public static java.lang.String EXTRA_VERIFICATION_LONG_VERSION_CODE;
- public static java.lang.String EXTRA_VERIFICATION_PACKAGE_NAME;
- public static java.lang.String EXTRA_VERIFICATION_RESULT;
- public static java.lang.String EXTRA_VERIFICATION_URI;
- public static java.lang.String EXTRA_VERIFICATION_VERSION_CODE;
- public static java.lang.String FEATURE_ACTIVITIES_ON_SECONDARY_DISPLAYS;
- public static java.lang.String FEATURE_ADOPTABLE_STORAGE;
- public static java.lang.String FEATURE_APP_WIDGETS;
- public static java.lang.String FEATURE_ASSIST_GESTURE;
- public static java.lang.String FEATURE_AUDIO_LOW_LATENCY;
- public static java.lang.String FEATURE_AUDIO_OUTPUT;
- public static java.lang.String FEATURE_AUDIO_PRO;
- public static java.lang.String FEATURE_AUTOFILL;
- public static java.lang.String FEATURE_AUTOMOTIVE;
- public static java.lang.String FEATURE_BACKUP;
- public static java.lang.String FEATURE_BLUETOOTH;
- public static java.lang.String FEATURE_BLUETOOTH_LE;
- public static java.lang.String FEATURE_BROADCAST_RADIO;
- public static java.lang.String FEATURE_CAMERA;
- public static java.lang.String FEATURE_CAMERA_ANY;
- public static java.lang.String FEATURE_CAMERA_AR;
- public static java.lang.String FEATURE_CAMERA_AUTOFOCUS;
- public static java.lang.String FEATURE_CAMERA_CAPABILITY_MANUAL_POST_PROCESSING;
- public static java.lang.String FEATURE_CAMERA_CAPABILITY_MANUAL_SENSOR;
- public static java.lang.String FEATURE_CAMERA_CAPABILITY_RAW;
- public static java.lang.String FEATURE_CAMERA_EXTERNAL;
- public static java.lang.String FEATURE_CAMERA_FLASH;
- public static java.lang.String FEATURE_CAMERA_FRONT;
- public static java.lang.String FEATURE_CAMERA_LEVEL_FULL;
- public static java.lang.String FEATURE_CANT_SAVE_STATE;
- public static java.lang.String FEATURE_COMPANION_DEVICE_SETUP;
- public static java.lang.String FEATURE_CONNECTION_SERVICE;
- public static java.lang.String FEATURE_CONSUMER_IR;
- public static java.lang.String FEATURE_CTS;
- public static java.lang.String FEATURE_DEVICE_ADMIN;
- public static java.lang.String FEATURE_DEVICE_ID_ATTESTATION;
- public static java.lang.String FEATURE_EMBEDDED;
- public static java.lang.String FEATURE_ETHERNET;
- public static java.lang.String FEATURE_FAKETOUCH;
- public static java.lang.String FEATURE_FAKETOUCH_MULTITOUCH_DISTINCT;
- public static java.lang.String FEATURE_FAKETOUCH_MULTITOUCH_JAZZHAND;
- public static java.lang.String FEATURE_FILE_BASED_ENCRYPTION;
- public static java.lang.String FEATURE_FINGERPRINT;
- public static java.lang.String FEATURE_FREEFORM_WINDOW_MANAGEMENT;
- public static java.lang.String FEATURE_GAMEPAD;
- public static java.lang.String FEATURE_HDMI_CEC;
- public static java.lang.String FEATURE_HIFI_SENSORS;
- public static java.lang.String FEATURE_HOME_SCREEN;
- public static java.lang.String FEATURE_INPUT_METHODS;
- public static java.lang.String FEATURE_LEANBACK;
- public static java.lang.String FEATURE_LEANBACK_ONLY;
- public static java.lang.String FEATURE_LIVE_TV;
- public static java.lang.String FEATURE_LIVE_WALLPAPER;
- public static java.lang.String FEATURE_LOCATION;
- public static java.lang.String FEATURE_LOCATION_GPS;
- public static java.lang.String FEATURE_LOCATION_NETWORK;
- public static java.lang.String FEATURE_LOWPAN;
- public static java.lang.String FEATURE_MANAGED_PROFILES;
- public static java.lang.String FEATURE_MANAGED_USERS;
- public static java.lang.String FEATURE_MICROPHONE;
- public static java.lang.String FEATURE_MIDI;
- public static java.lang.String FEATURE_NFC;
- public static java.lang.String FEATURE_NFC_ANY;
- public static java.lang.String FEATURE_NFC_HCE;
- public static java.lang.String FEATURE_NFC_HOST_CARD_EMULATION;
- public static java.lang.String FEATURE_NFC_HOST_CARD_EMULATION_NFCF;
- public static java.lang.String FEATURE_OPENGLES_EXTENSION_PACK;
- public static java.lang.String FEATURE_PC;
- public static java.lang.String FEATURE_PICTURE_IN_PICTURE;
- public static java.lang.String FEATURE_PRINTING;
- public static java.lang.String FEATURE_RAM_LOW;
- public static java.lang.String FEATURE_RAM_NORMAL;
- public static java.lang.String FEATURE_SCREEN_LANDSCAPE;
- public static java.lang.String FEATURE_SCREEN_PORTRAIT;
- public static java.lang.String FEATURE_SECURELY_REMOVES_USERS;
- public static java.lang.String FEATURE_SENSOR_ACCELEROMETER;
- public static java.lang.String FEATURE_SENSOR_AMBIENT_TEMPERATURE;
- public static java.lang.String FEATURE_SENSOR_BAROMETER;
- public static java.lang.String FEATURE_SENSOR_COMPASS;
- public static java.lang.String FEATURE_SENSOR_GYROSCOPE;
- public static java.lang.String FEATURE_SENSOR_HEART_RATE;
- public static java.lang.String FEATURE_SENSOR_HEART_RATE_ECG;
- public static java.lang.String FEATURE_SENSOR_LIGHT;
- public static java.lang.String FEATURE_SENSOR_PROXIMITY;
- public static java.lang.String FEATURE_SENSOR_RELATIVE_HUMIDITY;
- public static java.lang.String FEATURE_SENSOR_STEP_COUNTER;
- public static java.lang.String FEATURE_SENSOR_STEP_DETECTOR;
- public static java.lang.String FEATURE_SIP;
- public static java.lang.String FEATURE_SIP_VOIP;
- public static java.lang.String FEATURE_STRONGBOX_KEYSTORE;
- public static java.lang.String FEATURE_TELEPHONY;
- public static java.lang.String FEATURE_TELEPHONY_CARRIERLOCK;
- public static java.lang.String FEATURE_TELEPHONY_CDMA;
- public static java.lang.String FEATURE_TELEPHONY_EUICC;
- public static java.lang.String FEATURE_TELEPHONY_GSM;
- public static java.lang.String FEATURE_TELEPHONY_MBMS;
- public static java.lang.String FEATURE_TELEVISION;
- public static java.lang.String FEATURE_TOUCHSCREEN;
- public static java.lang.String FEATURE_TOUCHSCREEN_MULTITOUCH;
- public static java.lang.String FEATURE_TOUCHSCREEN_MULTITOUCH_DISTINCT;
- public static java.lang.String FEATURE_TOUCHSCREEN_MULTITOUCH_JAZZHAND;
- public static java.lang.String FEATURE_USB_ACCESSORY;
- public static java.lang.String FEATURE_USB_HOST;
- public static java.lang.String FEATURE_VERIFIED_BOOT;
- public static java.lang.String FEATURE_VOICE_RECOGNIZERS;
- public static java.lang.String FEATURE_VR_HEADTRACKING;
- public static java.lang.String FEATURE_VR_MODE;
- public static java.lang.String FEATURE_VR_MODE_HIGH_PERFORMANCE;
- public static java.lang.String FEATURE_VULKAN_HARDWARE_COMPUTE;
- public static java.lang.String FEATURE_VULKAN_HARDWARE_LEVEL;
- public static java.lang.String FEATURE_VULKAN_HARDWARE_VERSION;
- public static java.lang.String FEATURE_WATCH;
- public static java.lang.String FEATURE_WEBVIEW;
- public static java.lang.String FEATURE_WIFI;
- public static java.lang.String FEATURE_WIFI_AWARE;
- public static java.lang.String FEATURE_WIFI_DIRECT;
- public static java.lang.String FEATURE_WIFI_PASSPOINT;
- public static java.lang.String FEATURE_WIFI_RTT;
- public static int FLAG_PERMISSION_GRANTED_BY_DEFAULT;
- public static int FLAG_PERMISSION_POLICY_FIXED;
- public static int FLAG_PERMISSION_REVIEW_REQUIRED;
- public static int FLAG_PERMISSION_REVOKE_ON_UPGRADE;
- public static int FLAG_PERMISSION_SYSTEM_FIXED;
- public static int FLAG_PERMISSION_USER_FIXED;
- public static int FLAG_PERMISSION_USER_SET;
- public static int GET_ACTIVITIES;
- public static int GET_CONFIGURATIONS;
- public static int GET_DISABLED_COMPONENTS;
- public static int GET_DISABLED_UNTIL_USED_COMPONENTS;
- public static int GET_GIDS;
- public static int GET_INSTRUMENTATION;
- public static int GET_INTENT_FILTERS;
- public static int GET_META_DATA;
- public static int GET_PERMISSIONS;
- public static int GET_PROVIDERS;
- public static int GET_RECEIVERS;
- public static int GET_RESOLVED_FILTER;
- public static int GET_SERVICES;
- public static int GET_SHARED_LIBRARY_FILES;
- public static int GET_SIGNATURES;
- public static int GET_SIGNING_CERTIFICATES;
- public static int GET_UNINSTALLED_PACKAGES;
- public static int GET_URI_PERMISSION_PATTERNS;
- public static int INSTALL_ALLOCATE_AGGRESSIVE;
- public static int INSTALL_ALLOW_DOWNGRADE;
- public static int INSTALL_ALLOW_TEST;
- public static int INSTALL_ALL_USERS;
- public static int INSTALL_DONT_KILL_APP;
- public static int INSTALL_EXTERNAL;
- public static int INSTALL_FAILED_ABORTED;
- public static int INSTALL_FAILED_ALREADY_EXISTS;
- public static int INSTALL_FAILED_BAD_DEX_METADATA;
- public static int INSTALL_FAILED_CONFLICTING_PROVIDER;
- public static int INSTALL_FAILED_CONTAINER_ERROR;
- public static int INSTALL_FAILED_CPU_ABI_INCOMPATIBLE;
- public static int INSTALL_FAILED_DEXOPT;
- public static int INSTALL_FAILED_DUPLICATE_PACKAGE;
- public static int INSTALL_FAILED_DUPLICATE_PERMISSION;
- public static int INSTALL_FAILED_INSTANT_APP_INVALID;
- public static int INSTALL_FAILED_INSUFFICIENT_STORAGE;
- public static int INSTALL_FAILED_INTERNAL_ERROR;
- public static int INSTALL_FAILED_INVALID_APK;
- public static int INSTALL_FAILED_INVALID_INSTALL_LOCATION;
- public static int INSTALL_FAILED_INVALID_URI;
- public static int INSTALL_FAILED_MEDIA_UNAVAILABLE;
- public static int INSTALL_FAILED_MISSING_FEATURE;
- public static int INSTALL_FAILED_MISSING_SHARED_LIBRARY;
- public static int INSTALL_FAILED_NEWER_SDK;
- public static int INSTALL_FAILED_NO_MATCHING_ABIS;
- public static int INSTALL_FAILED_NO_SHARED_USER;
- public static int INSTALL_FAILED_OLDER_SDK;
- public static int INSTALL_FAILED_PACKAGE_CHANGED;
- public static int INSTALL_FAILED_PERMISSION_MODEL_DOWNGRADE;
- public static int INSTALL_FAILED_REPLACE_COULDNT_DELETE;
- public static int INSTALL_FAILED_SANDBOX_VERSION_DOWNGRADE;
- public static int INSTALL_FAILED_SHARED_USER_INCOMPATIBLE;
- public static int INSTALL_FAILED_TEST_ONLY;
- public static int INSTALL_FAILED_UID_CHANGED;
- public static int INSTALL_FAILED_UPDATE_INCOMPATIBLE;
- public static int INSTALL_FAILED_USER_RESTRICTED;
- public static int INSTALL_FAILED_VERIFICATION_FAILURE;
- public static int INSTALL_FAILED_VERIFICATION_TIMEOUT;
- public static int INSTALL_FAILED_VERSION_DOWNGRADE;
- public static int INSTALL_FORCE_PERMISSION_PROMPT;
- public static int INSTALL_FORCE_SDK;
- public static int INSTALL_FORCE_VOLUME_UUID;
- public static int INSTALL_FORWARD_LOCK;
- public static int INSTALL_FROM_ADB;
- public static int INSTALL_FULL_APP;
- public static int INSTALL_GRANT_RUNTIME_PERMISSIONS;
- public static int INSTALL_INSTANT_APP;
- public static int INSTALL_INTERNAL;
- public static int INSTALL_PARSE_FAILED_BAD_MANIFEST;
- public static int INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME;
- public static int INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID;
- public static int INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING;
- public static int INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES;
- public static int INSTALL_PARSE_FAILED_MANIFEST_EMPTY;
- public static int INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
- public static int INSTALL_PARSE_FAILED_NOT_APK;
- public static int INSTALL_PARSE_FAILED_NO_CERTIFICATES;
- public static int INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION;
- public static int INSTALL_REASON_DEVICE_RESTORE;
- public static int INSTALL_REASON_DEVICE_SETUP;
- public static int INSTALL_REASON_POLICY;
- public static int INSTALL_REASON_UNKNOWN;
- public static int INSTALL_REASON_USER;
- public static int INSTALL_REPLACE_EXISTING;
- public static int INSTALL_SUCCEEDED;
- public static int INSTALL_VIRTUAL_PRELOAD;
- public static int INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS;
- public static int INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK;
- public static int INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ASK;
- public static int INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER;
- public static int INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED;
- public static int INTENT_FILTER_VERIFICATION_FAILURE;
- public static int INTENT_FILTER_VERIFICATION_SUCCESS;
- public static int MASK_PERMISSION_FLAGS;
- public static int MATCH_ALL;
- public static int MATCH_ANY_USER;
- public static int MATCH_DEBUG_TRIAGED_MISSING;
- public static int MATCH_DEFAULT_ONLY;
- public static int MATCH_DIRECT_BOOT_AWARE;
- public static int MATCH_DIRECT_BOOT_UNAWARE;
- public static int MATCH_DISABLED_COMPONENTS;
- public static int MATCH_DISABLED_UNTIL_USED_COMPONENTS;
- public static int MATCH_EXPLICITLY_VISIBLE_ONLY;
- public static int MATCH_FACTORY_ONLY;
- public static int MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS;
- public static int MATCH_INSTANT;
- public static int MATCH_KNOWN_PACKAGES;
- public static int MATCH_STATIC_SHARED_LIBRARIES;
- public static int MATCH_SYSTEM_ONLY;
- public static int MATCH_UNINSTALLED_PACKAGES;
- public static int MATCH_VISIBLE_TO_INSTANT_APP_ONLY;
- public static long MAXIMUM_VERIFICATION_TIMEOUT;
- public static int MOVE_EXTERNAL_MEDIA;
- public static int MOVE_FAILED_3RD_PARTY_NOT_ALLOWED_ON_INTERNAL;
- public static int MOVE_FAILED_DEVICE_ADMIN;
- public static int MOVE_FAILED_DOESNT_EXIST;
- public static int MOVE_FAILED_FORWARD_LOCKED;
- public static int MOVE_FAILED_INSUFFICIENT_STORAGE;
- public static int MOVE_FAILED_INTERNAL_ERROR;
- public static int MOVE_FAILED_INVALID_LOCATION;
- public static int MOVE_FAILED_LOCKED_USER;
- public static int MOVE_FAILED_OPERATION_PENDING;
- public static int MOVE_FAILED_SYSTEM_PACKAGE;
- public static int MOVE_INTERNAL;
- public static int MOVE_SUCCEEDED;
- public static int NOTIFY_PACKAGE_USE_ACTIVITY;
- public static int NOTIFY_PACKAGE_USE_BACKUP;
- public static int NOTIFY_PACKAGE_USE_BROADCAST_RECEIVER;
- public static int NOTIFY_PACKAGE_USE_CONTENT_PROVIDER;
- public static int NOTIFY_PACKAGE_USE_CROSS_PACKAGE;
- public static int NOTIFY_PACKAGE_USE_FOREGROUND_SERVICE;
- public static int NOTIFY_PACKAGE_USE_INSTRUMENTATION;
- public static int NOTIFY_PACKAGE_USE_REASONS_COUNT;
- public static int NOTIFY_PACKAGE_USE_SERVICE;
- public static int NO_NATIVE_LIBRARIES;
- public static int ONLY_IF_NO_MATCH_FOUND;
- public static int PERMISSION_DENIED;
- public static int PERMISSION_GRANTED;
- public static int SIGNATURE_FIRST_NOT_SIGNED;
- public static int SIGNATURE_MATCH;
- public static int SIGNATURE_NEITHER_SIGNED;
- public static int SIGNATURE_NO_MATCH;
- public static int SIGNATURE_SECOND_NOT_SIGNED;
- public static int SIGNATURE_UNKNOWN_PACKAGE;
- public static int SKIP_CURRENT_PROFILE;
- public static java.lang.String SYSTEM_SHARED_LIBRARY_SERVICES;
- public static java.lang.String SYSTEM_SHARED_LIBRARY_SHARED;
- public static int VERIFICATION_ALLOW;
- public static int VERIFICATION_ALLOW_WITHOUT_SUFFICIENT;
- public static int VERIFICATION_REJECT;
- public static int VERSION_CODE_HIGHEST;
-}
-
--keep class android.content.pm.PackageManager$DexModuleRegisterCallback {
- <init>();
-
- public abstract void onDexModuleRegistered(java.lang.String, boolean, java.lang.String);
-
-
-}
-
--keep class android.content.pm.PackageManager$MoveCallback {
- <init>();
-
- public void onCreated(int, android.os.Bundle);
- public abstract void onStatusChanged(int, int, long);
-
-
-}
-
--keep class android.content.pm.PackageManager$NameNotFoundException {
- <init>();
- <init>(java.lang.String);
-
-
-
-}
-
--keep class android.content.pm.PackageManager$OnPermissionsChangedListener {
-
- public abstract void onPermissionsChanged(int);
-
-
-}
-
--keep class android.content.pm.PackageParser {
- <init>();
-
- public static void collectCertificates(android.content.pm.PackageParser$Package, boolean);
- public static int computeMinSdkVersion(int, java.lang.String, int, java.lang.String[], java.lang.String[]);
- public static int computeTargetSdkVersion(int, java.lang.String, java.lang.String[], java.lang.String[], boolean);
- protected android.content.pm.PackageParser$Package fromCacheEntry(byte[]);
- public static android.content.pm.PackageParser$Package fromCacheEntryStatic(byte[]);
- public static android.content.pm.ActivityInfo generateActivityInfo(android.content.pm.PackageParser$Activity, int, android.content.pm.PackageUserState, int);
- public static android.content.pm.ActivityInfo generateActivityInfo(android.content.pm.ActivityInfo, int, android.content.pm.PackageUserState, int);
- public static android.content.pm.ApplicationInfo generateApplicationInfo(android.content.pm.PackageParser$Package, int, android.content.pm.PackageUserState);
- public static android.content.pm.ApplicationInfo generateApplicationInfo(android.content.pm.PackageParser$Package, int, android.content.pm.PackageUserState, int);
- public static android.content.pm.ApplicationInfo generateApplicationInfo(android.content.pm.ApplicationInfo, int, android.content.pm.PackageUserState, int);
- public static android.content.pm.InstrumentationInfo generateInstrumentationInfo(android.content.pm.PackageParser$Instrumentation, int);
- public static android.content.pm.PackageInfo generatePackageInfo(android.content.pm.PackageParser$Package, int[], int, long, long, java.util.Set, android.content.pm.PackageUserState);
- public static android.content.pm.PackageInfo generatePackageInfo(android.content.pm.PackageParser$Package, int[], int, long, long, java.util.Set, android.content.pm.PackageUserState, int);
- public static android.content.pm.PermissionGroupInfo generatePermissionGroupInfo(android.content.pm.PackageParser$PermissionGroup, int);
- public static android.content.pm.PermissionInfo generatePermissionInfo(android.content.pm.PackageParser$Permission, int);
- public static android.content.pm.ProviderInfo generateProviderInfo(android.content.pm.PackageParser$Provider, int, android.content.pm.PackageUserState, int);
- public static android.content.pm.ServiceInfo generateServiceInfo(android.content.pm.PackageParser$Service, int, android.content.pm.PackageUserState, int);
- public static int getActivityConfigChanges(int, int);
- public static boolean isApkFile(java.io.File);
- public static boolean isApkPath(java.lang.String);
- public static boolean isAvailable(android.content.pm.PackageUserState);
- public static android.content.pm.PackageParser$ApkLite parseApkLite(java.io.File, int);
- public static android.content.pm.PackageParser$ApkLite parseApkLite(java.io.FileDescriptor, java.lang.String, int);
- public android.content.pm.PackageParser$Package parseMonolithicPackage(java.io.File, int);
- public android.content.pm.PackageParser$Package parsePackage(java.io.File, int, boolean);
- public android.content.pm.PackageParser$Package parsePackage(java.io.File, int);
- public static android.content.pm.PackageParser$PackageLite parsePackageLite(java.io.File, int);
- public static java.security.PublicKey parsePublicKey(java.lang.String);
- public void setCacheDir(java.io.File);
- public void setCallback(android.content.pm.PackageParser$Callback);
- public static void setCompatibilityModeEnabled(boolean);
- public void setDisplayMetrics(android.util.DisplayMetrics);
- public void setOnlyCoreApps(boolean);
- public void setSeparateProcesses(java.lang.String[]);
- protected byte[] toCacheEntry(android.content.pm.PackageParser$Package);
- public static byte[] toCacheEntryStatic(android.content.pm.PackageParser$Package);
- public static android.util.ArraySet toSigningKeys(android.content.pm.Signature[]);
-
-
- public static java.lang.String ANDROID_MANIFEST_FILENAME;
- public static java.lang.String APK_FILE_EXTENSION;
- public static android.content.pm.PackageParser$NewPermissionInfo[] NEW_PERMISSIONS;
- public static int PARSE_CHATTY;
- public static int PARSE_COLLECT_CERTIFICATES;
- public static int PARSE_ENFORCE_CODE;
- public static int PARSE_EXTERNAL_STORAGE;
- public static int PARSE_FORCE_SDK;
- public static int PARSE_FORWARD_LOCK;
- public static int PARSE_IGNORE_PROCESSES;
- public static int PARSE_IS_SYSTEM_DIR;
- public static int PARSE_MUST_BE_APK;
- public static android.content.pm.PackageParser$SplitPermissionInfo[] SPLIT_PERMISSIONS;
- public static java.util.concurrent.atomic.AtomicInteger sCachedPackageReadCount;
-}
-
--keep class android.content.pm.PackageParser$Activity {
- <init>(android.content.pm.PackageParser$ParseComponentArgs, android.content.pm.ActivityInfo);
-
- public int describeContents();
- public void setPackageName(java.lang.String);
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public android.content.pm.ActivityInfo info;
-}
-
--keep class android.content.pm.PackageParser$ActivityIntentInfo {
- <init>(android.content.pm.PackageParser$Activity);
- <init>(android.os.Parcel);
-
- public java.lang.String toString();
-
-
- public android.content.pm.PackageParser$Activity activity;
-}
-
--keep class android.content.pm.PackageParser$ApkLite {
- <init>(java.lang.String, java.lang.String, java.lang.String, boolean, java.lang.String, java.lang.String, int, int, int, int, java.util.List, android.content.pm.PackageParser$SigningDetails, boolean, boolean, boolean, boolean, boolean, boolean);
-
- public long getLongVersionCode();
-
-
- public java.lang.String codePath;
- public java.lang.String configForSplit;
- public boolean coreApp;
- public boolean debuggable;
- public boolean extractNativeLibs;
- public int installLocation;
- public boolean isFeatureSplit;
- public boolean isolatedSplits;
- public boolean multiArch;
- public java.lang.String packageName;
- public int revisionCode;
- public android.content.pm.PackageParser$SigningDetails signingDetails;
- public java.lang.String splitName;
- public boolean use32bitAbi;
- public java.lang.String usesSplitName;
- public android.content.pm.VerifierInfo[] verifiers;
- public int versionCode;
- public int versionCodeMajor;
-}
-
--keep class android.content.pm.PackageParser$Callback {
-
- public abstract java.lang.String[] getOverlayApks(java.lang.String);
- public abstract java.lang.String[] getOverlayPaths(java.lang.String, java.lang.String);
- public abstract boolean hasFeature(java.lang.String);
-
-
-}
-
--keep class android.content.pm.PackageParser$Component {
- <init>(android.content.pm.PackageParser$Package);
- <init>(android.content.pm.PackageParser$ParsePackageItemArgs, android.content.pm.PackageItemInfo);
- <init>(android.content.pm.PackageParser$ParseComponentArgs, android.content.pm.ComponentInfo);
- <init>(android.content.pm.PackageParser$Component);
- <init>(android.os.Parcel);
-
- public void appendComponentShortName(java.lang.StringBuilder);
- public android.content.ComponentName getComponentName();
- public void printComponentShortName(java.io.PrintWriter);
- public void setPackageName(java.lang.String);
- protected void writeToParcel(android.os.Parcel, int);
-
-
- public java.lang.String className;
- public java.util.ArrayList intents;
- public android.os.Bundle metaData;
- public int order;
- public android.content.pm.PackageParser$Package owner;
-}
-
--keep class android.content.pm.PackageParser$Instrumentation {
- <init>(android.content.pm.PackageParser$ParsePackageItemArgs, android.content.pm.InstrumentationInfo);
-
- public int describeContents();
- public void setPackageName(java.lang.String);
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public android.content.pm.InstrumentationInfo info;
-}
-
--keep class android.content.pm.PackageParser$IntentInfo {
- <init>();
- <init>(android.os.Parcel);
-
- public void writeIntentInfoToParcel(android.os.Parcel, int);
-
-
- public int banner;
- public boolean hasDefault;
- public int icon;
- public int labelRes;
- public int logo;
- public java.lang.CharSequence nonLocalizedLabel;
- public int preferred;
-}
-
--keep class android.content.pm.PackageParser$NewPermissionInfo {
- <init>(java.lang.String, int, int);
-
-
-
- public int fileVersion;
- public java.lang.String name;
- public int sdkVersion;
-}
-
--keep class android.content.pm.PackageParser$Package {
- <init>(java.lang.String);
- <init>(android.os.Parcel);
-
- public boolean canHaveOatDir();
- public int describeContents();
- public java.util.List getAllCodePaths();
- public java.util.List getAllCodePathsExcludingResourceOnly();
- public java.util.List getChildPackageNames();
- public long getLatestForegroundPackageUseTimeInMills();
- public long getLatestPackageUseTimeInMills();
- public long getLongVersionCode();
- public boolean hasChildPackage(java.lang.String);
- public boolean hasComponentClassName(java.lang.String);
- public boolean isExternal();
- public boolean isForwardLocked();
- public boolean isLibrary();
- public boolean isMatch(int);
- public boolean isOem();
- public boolean isPrivileged();
- public boolean isProduct();
- public boolean isSystem();
- public boolean isUpdatedSystemApp();
- public boolean isVendor();
- public void setApplicationInfoBaseCodePath(java.lang.String);
- public void setApplicationInfoBaseResourcePath(java.lang.String);
- public void setApplicationInfoCodePath(java.lang.String);
- public void setApplicationInfoFlags(int, int);
- public void setApplicationInfoResourcePath(java.lang.String);
- public void setApplicationInfoSplitCodePaths(java.lang.String[]);
- public void setApplicationInfoSplitResourcePaths(java.lang.String[]);
- public void setApplicationVolumeUuid(java.lang.String);
- public void setBaseCodePath(java.lang.String);
- public void setCodePath(java.lang.String);
- public void setPackageName(java.lang.String);
- public void setSigningDetails(android.content.pm.PackageParser$SigningDetails);
- public void setSplitCodePaths(java.lang.String[]);
- public void setUse32bitAbi(boolean);
- public void setVolumeUuid(java.lang.String);
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public java.util.ArrayList activities;
- public android.content.pm.ApplicationInfo applicationInfo;
- public java.lang.String baseCodePath;
- public boolean baseHardwareAccelerated;
- public int baseRevisionCode;
- public java.util.ArrayList childPackages;
- public java.lang.String codePath;
- public java.util.ArrayList configPreferences;
- public boolean coreApp;
- public java.lang.String cpuAbiOverride;
- public java.util.ArrayList featureGroups;
- public int installLocation;
- public java.util.ArrayList instrumentation;
- public boolean isStub;
- public java.util.ArrayList libraryNames;
- public java.util.ArrayList mAdoptPermissions;
- public android.os.Bundle mAppMetaData;
- public int mCompileSdkVersion;
- public java.lang.String mCompileSdkVersionCodename;
- public java.lang.Object mExtras;
- public android.util.ArrayMap mKeySetMapping;
- public long[] mLastPackageUsageTimeInMills;
- public java.util.ArrayList mOriginalPackages;
- public java.lang.String mOverlayCategory;
- public boolean mOverlayIsStatic;
- public int mOverlayPriority;
- public java.lang.String mOverlayTarget;
- public int mPreferredOrder;
- public java.lang.String mRealPackage;
- public java.lang.String mRequiredAccountType;
- public boolean mRequiredForAllUsers;
- public java.lang.String mRestrictedAccountType;
- public java.lang.String mSharedUserId;
- public int mSharedUserLabel;
- public android.content.pm.PackageParser$SigningDetails mSigningDetails;
- public android.util.ArraySet mUpgradeKeySets;
- public int mVersionCode;
- public int mVersionCodeMajor;
- public java.lang.String mVersionName;
- public java.lang.String manifestPackageName;
- public java.lang.String packageName;
- public android.content.pm.PackageParser$Package parentPackage;
- public java.util.ArrayList permissionGroups;
- public java.util.ArrayList permissions;
- public java.util.ArrayList preferredActivityFilters;
- public java.util.ArrayList protectedBroadcasts;
- public java.util.ArrayList providers;
- public java.util.ArrayList receivers;
- public java.util.ArrayList reqFeatures;
- public java.util.ArrayList requestedPermissions;
- public byte[] restrictUpdateHash;
- public java.util.ArrayList services;
- public java.lang.String[] splitCodePaths;
- public int[] splitFlags;
- public java.lang.String[] splitNames;
- public int[] splitPrivateFlags;
- public int[] splitRevisionCodes;
- public java.lang.String staticSharedLibName;
- public long staticSharedLibVersion;
- public boolean use32bitAbi;
- public java.util.ArrayList usesLibraries;
- public java.lang.String[] usesLibraryFiles;
- public java.util.ArrayList usesOptionalLibraries;
- public java.util.ArrayList usesStaticLibraries;
- public java.lang.String[][] usesStaticLibrariesCertDigests;
- public long[] usesStaticLibrariesVersions;
- public boolean visibleToInstantApps;
- public java.lang.String volumeUuid;
-}
-
--keep class android.content.pm.PackageParser$PackageLite {
- <init>(java.lang.String, android.content.pm.PackageParser$ApkLite, java.lang.String[], boolean[], java.lang.String[], java.lang.String[], java.lang.String[], int[]);
-
- public java.util.List getAllCodePaths();
-
-
- public java.lang.String baseCodePath;
- public int baseRevisionCode;
- public java.lang.String codePath;
- public java.lang.String[] configForSplit;
- public boolean coreApp;
- public boolean debuggable;
- public boolean extractNativeLibs;
- public int installLocation;
- public boolean[] isFeatureSplits;
- public boolean isolatedSplits;
- public boolean multiArch;
- public java.lang.String packageName;
- public java.lang.String[] splitCodePaths;
- public java.lang.String[] splitNames;
- public int[] splitRevisionCodes;
- public boolean use32bitAbi;
- public java.lang.String[] usesSplitNames;
- public android.content.pm.VerifierInfo[] verifiers;
- public int versionCode;
- public int versionCodeMajor;
-}
-
--keep class android.content.pm.PackageParser$PackageParserException {
- <init>(int, java.lang.String);
- <init>(int, java.lang.String, java.lang.Throwable);
-
-
-
- public int error;
-}
-
--keep class android.content.pm.PackageParser$ParseComponentArgs {
- <init>(android.content.pm.PackageParser$Package, java.lang.String[], int, int, int, int, int, int, java.lang.String[], int, int, int);
-
-
-
-}
-
--keep class android.content.pm.PackageParser$ParsePackageItemArgs {
-
-
-
-}
-
--keep class android.content.pm.PackageParser$Permission {
- <init>(android.content.pm.PackageParser$Package);
- <init>(android.content.pm.PackageParser$Package, android.content.pm.PermissionInfo);
-
- public int describeContents();
- public boolean isAppOp();
- public void setPackageName(java.lang.String);
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public android.content.pm.PackageParser$PermissionGroup group;
- public android.content.pm.PermissionInfo info;
- public boolean tree;
-}
-
--keep class android.content.pm.PackageParser$PermissionGroup {
- <init>(android.content.pm.PackageParser$Package);
- <init>(android.content.pm.PackageParser$Package, android.content.pm.PermissionGroupInfo);
-
- public int describeContents();
- public void setPackageName(java.lang.String);
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public android.content.pm.PermissionGroupInfo info;
-}
-
--keep class android.content.pm.PackageParser$Provider {
- <init>(android.content.pm.PackageParser$ParseComponentArgs, android.content.pm.ProviderInfo);
- <init>(android.content.pm.PackageParser$Provider);
-
- public int describeContents();
- public void setPackageName(java.lang.String);
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public android.content.pm.ProviderInfo info;
- public boolean syncable;
-}
-
--keep class android.content.pm.PackageParser$Service {
- <init>(android.content.pm.PackageParser$ParseComponentArgs, android.content.pm.ServiceInfo);
-
- public int describeContents();
- public void setPackageName(java.lang.String);
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public android.content.pm.ServiceInfo info;
-}
-
--keep class android.content.pm.PackageParser$SigningDetails {
- <init>(android.content.pm.Signature[], int, android.util.ArraySet, android.content.pm.Signature[], int[]);
- <init>(android.content.pm.Signature[], int, android.content.pm.Signature[], int[]);
- <init>(android.content.pm.Signature[], int);
- <init>(android.content.pm.PackageParser$SigningDetails);
- <init>(android.os.Parcel);
-
- public boolean checkCapability(android.content.pm.PackageParser$SigningDetails, int);
- public boolean checkCapability(java.lang.String, int);
- public boolean checkCapabilityRecover(android.content.pm.PackageParser$SigningDetails, int);
- public int describeContents();
- public boolean equals(java.lang.Object);
- public boolean hasAncestor(android.content.pm.PackageParser$SigningDetails);
- public boolean hasAncestorOrSelf(android.content.pm.PackageParser$SigningDetails);
- public boolean hasCertificate(android.content.pm.Signature);
- public boolean hasCertificate(android.content.pm.Signature, int);
- public boolean hasCertificate(byte[]);
- public boolean hasPastSigningCertificates();
- public boolean hasSha256Certificate(byte[]);
- public boolean hasSha256Certificate(byte[], int);
- public boolean hasSignatures();
- public int hashCode();
- public boolean signaturesMatchExactly(android.content.pm.PackageParser$SigningDetails);
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public static android.content.pm.PackageParser$SigningDetails UNKNOWN;
- public android.content.pm.Signature[] pastSigningCertificates;
- public int[] pastSigningCertificatesFlags;
- public android.util.ArraySet publicKeys;
- public int signatureSchemeVersion;
- public android.content.pm.Signature[] signatures;
-}
-
--keep class android.content.pm.PackageParser$SplitPermissionInfo {
- <init>(java.lang.String, java.lang.String[], int);
-
-
-
- public java.lang.String[] newPerms;
- public java.lang.String rootPerm;
- public int targetSdk;
-}
-
--keep class android.content.pm.PackageStats {
- <init>(java.lang.String);
- <init>(java.lang.String, int);
- <init>(android.os.Parcel);
- <init>(android.content.pm.PackageStats);
-
- public int describeContents();
- public boolean equals(java.lang.Object);
- public int hashCode();
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public long cacheSize;
- public long codeSize;
- public long dataSize;
- public long externalCacheSize;
- public long externalCodeSize;
- public long externalDataSize;
- public long externalMediaSize;
- public long externalObbSize;
- public java.lang.String packageName;
- public int userHandle;
-}
-
--keep class android.content.pm.PackageUserState {
- <init>();
- <init>(android.content.pm.PackageUserState);
-
- public boolean equals(java.lang.Object);
- public boolean isAvailable(int);
- public boolean isEnabled(android.content.pm.ComponentInfo, int);
- public boolean isMatch(android.content.pm.ComponentInfo, int);
-
-
- public int appLinkGeneration;
- public int categoryHint;
- public long ceDataInode;
- public java.lang.String dialogMessage;
- public android.util.ArraySet disabledComponents;
- public int domainVerificationStatus;
- public int enabled;
- public android.util.ArraySet enabledComponents;
- public java.lang.String harmfulAppWarning;
- public boolean hidden;
- public int installReason;
- public boolean installed;
- public boolean instantApp;
- public java.lang.String lastDisableAppCaller;
- public boolean notLaunched;
- public java.lang.String[] overlayPaths;
- public boolean stopped;
- public boolean suspended;
- public android.os.PersistableBundle suspendedAppExtras;
- public android.os.PersistableBundle suspendedLauncherExtras;
- public java.lang.String suspendingPackage;
- public boolean virtualPreload;
-}
-
--keep class android.content.pm.ParceledListSlice {
- <init>(java.util.List);
-
- public int describeContents();
- public static android.content.pm.ParceledListSlice emptyList();
- public java.util.List getList();
- protected android.os.Parcelable$Creator readParcelableCreator(android.os.Parcel, java.lang.ClassLoader);
- public void setInlineCountLimit(int);
- protected void writeElement(android.os.Parcelable, android.os.Parcel, int);
- protected void writeElement(java.lang.Object, android.os.Parcel, int);
- protected void writeParcelableCreator(android.os.Parcelable, android.os.Parcel);
- protected void writeParcelableCreator(java.lang.Object, android.os.Parcel);
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$ClassLoaderCreator CREATOR;
-}
-
--keep class android.content.pm.PathPermission {
- <init>(java.lang.String, int, java.lang.String, java.lang.String);
- <init>(android.os.Parcel);
-
- public java.lang.String getReadPermission();
- public java.lang.String getWritePermission();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.content.pm.PermissionGroupInfo {
- <init>();
- <init>(android.content.pm.PermissionGroupInfo);
-
- public int describeContents();
- public java.lang.CharSequence loadDescription(android.content.pm.PackageManager);
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public static int FLAG_PERSONAL_INFO;
- public int descriptionRes;
- public int flags;
- public java.lang.CharSequence nonLocalizedDescription;
- public int priority;
- public int requestRes;
-}
-
--keep class android.content.pm.PermissionInfo {
- <init>();
- <init>(android.content.pm.PermissionInfo);
-
- public int calculateFootprint();
- public int describeContents();
- public static int fixProtectionLevel(int);
- public int getProtection();
- public int getProtectionFlags();
- public boolean isAppOp();
- public java.lang.CharSequence loadDescription(android.content.pm.PackageManager);
- public static java.lang.String protectionToString(int);
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public static int FLAG_COSTS_MONEY;
- public static int FLAG_INSTALLED;
- public static int FLAG_REMOVED;
- public static int PROTECTION_DANGEROUS;
- public static int PROTECTION_FLAG_APPOP;
- public static int PROTECTION_FLAG_DEVELOPMENT;
- public static int PROTECTION_FLAG_INSTALLER;
- public static int PROTECTION_FLAG_INSTANT;
- public static int PROTECTION_FLAG_OEM;
- public static int PROTECTION_FLAG_PRE23;
- public static int PROTECTION_FLAG_PREINSTALLED;
- public static int PROTECTION_FLAG_PRIVILEGED;
- public static int PROTECTION_FLAG_RUNTIME_ONLY;
- public static int PROTECTION_FLAG_SETUP;
- public static int PROTECTION_FLAG_SYSTEM;
- public static int PROTECTION_FLAG_SYSTEM_TEXT_CLASSIFIER;
- public static int PROTECTION_FLAG_VENDOR_PRIVILEGED;
- public static int PROTECTION_FLAG_VERIFIER;
- public static int PROTECTION_MASK_BASE;
- public static int PROTECTION_MASK_FLAGS;
- public static int PROTECTION_NORMAL;
- public static int PROTECTION_SIGNATURE;
- public static int PROTECTION_SIGNATURE_OR_SYSTEM;
- public int descriptionRes;
- public int flags;
- public java.lang.String group;
- public java.lang.CharSequence nonLocalizedDescription;
- public int protectionLevel;
- public int requestRes;
-}
-
--keep class android.content.pm.ProviderInfo {
- <init>();
- <init>(android.content.pm.ProviderInfo);
-
- public int describeContents();
- public void dump(android.util.Printer, java.lang.String);
- public void dump(android.util.Printer, java.lang.String, int);
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public static int FLAG_SINGLE_USER;
- public static int FLAG_VISIBLE_TO_INSTANT_APP;
- public java.lang.String authority;
- public int flags;
- public boolean grantUriPermissions;
- public int initOrder;
- public boolean isSyncable;
- public boolean multiprocess;
- public android.content.pm.PathPermission[] pathPermissions;
- public java.lang.String readPermission;
- public android.os.PatternMatcher[] uriPermissionPatterns;
- public java.lang.String writePermission;
-}
-
--keep class android.content.pm.ResolveInfo {
- <init>();
- <init>(android.content.pm.ResolveInfo);
-
- public int describeContents();
- public void dump(android.util.Printer, java.lang.String);
- public void dump(android.util.Printer, java.lang.String, int);
- public android.content.pm.ComponentInfo getComponentInfo();
- public int getIconResource();
- public android.graphics.drawable.Drawable loadIcon(android.content.pm.PackageManager);
- public java.lang.CharSequence loadLabel(android.content.pm.PackageManager);
- public int resolveIconResId();
- public int resolveLabelResId();
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public android.content.pm.ActivityInfo activityInfo;
- public android.content.pm.AuxiliaryResolveInfo auxiliaryInfo;
- public android.content.IntentFilter filter;
- public boolean handleAllWebDataURI;
- public int icon;
- public int iconResourceId;
- public boolean instantAppAvailable;
- public boolean isDefault;
- public boolean isInstantAppAvailable;
- public int labelRes;
- public int match;
- public boolean noResourceId;
- public java.lang.CharSequence nonLocalizedLabel;
- public int preferredOrder;
- public int priority;
- public android.content.pm.ProviderInfo providerInfo;
- public java.lang.String resolvePackageName;
- public android.content.pm.ServiceInfo serviceInfo;
- public int specificIndex;
- public boolean system;
- public int targetUserId;
-}
-
--keep class android.content.pm.ServiceInfo {
- <init>();
- <init>(android.content.pm.ServiceInfo);
-
- public int describeContents();
- public void dump(android.util.Printer, java.lang.String);
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public static int FLAG_EXTERNAL_SERVICE;
- public static int FLAG_ISOLATED_PROCESS;
- public static int FLAG_SINGLE_USER;
- public static int FLAG_STOP_WITH_TASK;
- public static int FLAG_VISIBLE_TO_INSTANT_APP;
- public int flags;
- public java.lang.String permission;
-}
-
--keep class android.content.pm.SharedLibraryInfo {
- <init>(java.lang.String, long, int, android.content.pm.VersionedPackage, java.util.List);
-
- public int describeContents();
- public android.content.pm.VersionedPackage getDeclaringPackage();
- public java.util.List getDependentPackages();
- public long getLongVersion();
- public java.lang.String getName();
- public int getType();
- public int getVersion();
- public boolean isBuiltin();
- public boolean isDynamic();
- public boolean isStatic();
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public static int TYPE_BUILTIN;
- public static int TYPE_DYNAMIC;
- public static int TYPE_STATIC;
- public static int VERSION_UNDEFINED;
-}
-
--keep class android.content.pm.Signature {
- <init>(byte[]);
- <init>(java.security.cert.Certificate[]);
- <init>(java.lang.String);
-
- public static boolean areEffectiveMatch(android.content.pm.Signature[], android.content.pm.Signature[]);
- public static boolean areEffectiveMatch(android.content.pm.Signature, android.content.pm.Signature);
- public static boolean areExactMatch(android.content.pm.Signature[], android.content.pm.Signature[]);
- public static android.content.pm.Signature bounce(java.security.cert.CertificateFactory, android.content.pm.Signature);
- public int describeContents();
- public boolean equals(java.lang.Object);
- public android.content.pm.Signature[] getChainSignatures();
- public java.security.PublicKey getPublicKey();
- public int hashCode();
- public byte[] toByteArray();
- public char[] toChars();
- public char[] toChars(char[], int[]);
- public java.lang.String toCharsString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.content.pm.SigningInfo {
- <init>();
- <init>(android.content.pm.PackageParser$SigningDetails);
- <init>(android.content.pm.SigningInfo);
-
- public int describeContents();
- public android.content.pm.Signature[] getApkContentsSigners();
- public android.content.pm.Signature[] getSigningCertificateHistory();
- public boolean hasMultipleSigners();
- public boolean hasPastSigningCertificates();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.content.pm.UserInfo {
- <init>(int, java.lang.String, int);
- <init>(int, java.lang.String, java.lang.String, int);
- <init>();
- <init>(android.content.pm.UserInfo);
-
- public boolean canHaveProfile();
- public int describeContents();
- public android.os.UserHandle getUserHandle();
- public boolean isAdmin();
- public boolean isDemo();
- public boolean isEnabled();
- public boolean isEphemeral();
- public boolean isGuest();
- public boolean isInitialized();
- public boolean isManagedProfile();
- public boolean isPrimary();
- public boolean isQuietModeEnabled();
- public boolean isRestricted();
- public boolean isSystemOnly();
- public static boolean isSystemOnly(int);
- public boolean supportsSwitchTo();
- public boolean supportsSwitchToByUser();
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public static int FLAG_ADMIN;
- public static int FLAG_DEMO;
- public static int FLAG_DISABLED;
- public static int FLAG_EPHEMERAL;
- public static int FLAG_GUEST;
- public static int FLAG_INITIALIZED;
- public static int FLAG_MANAGED_PROFILE;
- public static int FLAG_MASK_USER_TYPE;
- public static int FLAG_PRIMARY;
- public static int FLAG_QUIET_MODE;
- public static int FLAG_RESTRICTED;
- public static int NO_PROFILE_GROUP_ID;
- public long creationTime;
- public int flags;
- public boolean guestToRemove;
- public java.lang.String iconPath;
- public int id;
- public java.lang.String lastLoggedInFingerprint;
- public long lastLoggedInTime;
- public java.lang.String name;
- public boolean partial;
- public int profileBadge;
- public int profileGroupId;
- public int restrictedProfileParentId;
- public int serialNumber;
-}
-
--keep class android.content.pm.VerifierDeviceIdentity {
- <init>(long);
-
- public int describeContents();
- public boolean equals(java.lang.Object);
- public static android.content.pm.VerifierDeviceIdentity generate();
- public int hashCode();
- public static android.content.pm.VerifierDeviceIdentity parse(java.lang.String);
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.content.pm.VerifierInfo {
- <init>(java.lang.String, java.security.PublicKey);
-
- public int describeContents();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public java.lang.String packageName;
- public java.security.PublicKey publicKey;
-}
-
--keep class android.content.pm.VersionedPackage {
- <init>(java.lang.String, int);
- <init>(java.lang.String, long);
-
- public int describeContents();
- public long getLongVersionCode();
- public java.lang.String getPackageName();
- public int getVersionCode();
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.content.pm.dex.ArtManager {
- <init>(android.content.Context, android.content.pm.dex.IArtManager);
-
- public static java.lang.String getCurrentProfilePath(java.lang.String, int, java.lang.String);
- public static java.lang.String getProfileName(java.lang.String);
- public static java.io.File getProfileSnapshotFileForName(java.lang.String, java.lang.String);
- public boolean isRuntimeProfilingEnabled(int);
- public void snapshotRuntimeProfile(int, java.lang.String, java.lang.String, java.util.concurrent.Executor, android.content.pm.dex.ArtManager$SnapshotRuntimeProfileCallback);
-
-
- public static int PROFILE_APPS;
- public static int PROFILE_BOOT_IMAGE;
- public static int SNAPSHOT_FAILED_CODE_PATH_NOT_FOUND;
- public static int SNAPSHOT_FAILED_INTERNAL_ERROR;
- public static int SNAPSHOT_FAILED_PACKAGE_NOT_FOUND;
-}
-
--keep class android.content.pm.dex.ArtManager$SnapshotRuntimeProfileCallback {
- <init>();
-
- public abstract void onError(int);
- public abstract void onSuccess(android.os.ParcelFileDescriptor);
-
-
-}
-
--keep class android.content.pm.dex.IArtManager {
-
- public abstract boolean isRuntimeProfilingEnabled(int, java.lang.String);
- public abstract void snapshotRuntimeProfile(int, java.lang.String, java.lang.String, android.content.pm.dex.ISnapshotRuntimeProfileCallback, java.lang.String);
-
-
-}
-
--keep class android.content.pm.dex.ISnapshotRuntimeProfileCallback {
-
- public abstract void onError(int);
- public abstract void onSuccess(android.os.ParcelFileDescriptor);
-
-
-}
-
--keep class android.content.res.ApkAssets {
-
- protected void finalize();
- public java.lang.String getAssetPath();
- public boolean isUpToDate();
- public static android.content.res.ApkAssets loadFromFd(java.io.FileDescriptor, java.lang.String, boolean, boolean);
- public static android.content.res.ApkAssets loadFromPath(java.lang.String);
- public static android.content.res.ApkAssets loadFromPath(java.lang.String, boolean);
- public static android.content.res.ApkAssets loadFromPath(java.lang.String, boolean, boolean);
- public static android.content.res.ApkAssets loadOverlayFromPath(java.lang.String, boolean);
- public android.content.res.XmlResourceParser openXml(java.lang.String);
- public java.lang.String toString();
-
-
-}
-
--keep class android.content.res.AssetFileDescriptor {
- <init>(android.os.ParcelFileDescriptor, long, long);
- <init>(android.os.ParcelFileDescriptor, long, long, android.os.Bundle);
-
- public void close();
- public java.io.FileInputStream createInputStream();
- public java.io.FileOutputStream createOutputStream();
- public int describeContents();
- public long getDeclaredLength();
- public android.os.Bundle getExtras();
- public java.io.FileDescriptor getFileDescriptor();
- public long getLength();
- public android.os.ParcelFileDescriptor getParcelFileDescriptor();
- public long getStartOffset();
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public static long UNKNOWN_LENGTH;
-}
-
--keep class android.content.res.AssetManager {
- <init>();
-
- public int addAssetPath(java.lang.String);
- public int addAssetPathAsSharedLibrary(java.lang.String);
- public int addOverlayPath(java.lang.String);
- public void close();
- protected void finalize();
- public int findCookieForPath(java.lang.String);
- public android.content.res.ApkAssets[] getApkAssets();
- public static java.lang.String getAssetAllocations();
- public android.util.SparseArray getAssignedPackageIdentifiers();
- public static int getGlobalAssetCount();
- public static int getGlobalAssetManagerCount();
- public java.lang.String[] getLocales();
- public java.lang.String[] getNonSystemLocales();
- public static android.content.res.AssetManager getSystem();
- public boolean isUpToDate();
- public java.lang.String[] list(java.lang.String);
- public java.io.InputStream open(java.lang.String);
- public java.io.InputStream open(java.lang.String, int);
- public android.content.res.AssetFileDescriptor openFd(java.lang.String);
- public java.io.InputStream openNonAsset(java.lang.String);
- public java.io.InputStream openNonAsset(java.lang.String, int);
- public java.io.InputStream openNonAsset(int, java.lang.String);
- public java.io.InputStream openNonAsset(int, java.lang.String, int);
- public android.content.res.AssetFileDescriptor openNonAssetFd(java.lang.String);
- public android.content.res.AssetFileDescriptor openNonAssetFd(int, java.lang.String);
- public android.content.res.XmlResourceParser openXmlResourceParser(java.lang.String);
- public android.content.res.XmlResourceParser openXmlResourceParser(int, java.lang.String);
- public void setApkAssets(android.content.res.ApkAssets[], boolean);
- public void setConfiguration(int, int, java.lang.String, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int);
-
-
- public static int ACCESS_BUFFER;
- public static int ACCESS_RANDOM;
- public static int ACCESS_STREAMING;
- public static int ACCESS_UNKNOWN;
-}
-
--keep class android.content.res.ColorStateList {
- <init>(int[][], int[]);
-
- public boolean canApplyTheme();
- public static android.content.res.ColorStateList createFromXml(android.content.res.Resources, org.xmlpull.v1.XmlPullParser);
- public static android.content.res.ColorStateList createFromXml(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.content.res.Resources$Theme);
- public int describeContents();
- public int getChangingConfigurations();
- public int getColorForState(int[], int);
- public int[] getColors();
- public android.content.res.ConstantState getConstantState();
- public int getDefaultColor();
- public int[][] getStates();
- public boolean hasFocusStateSpecified();
- public boolean hasState(int);
- public boolean isOpaque();
- public boolean isStateful();
- public android.content.res.ColorStateList obtainForTheme(android.content.res.Resources$Theme);
- public android.content.res.ComplexColor obtainForTheme(android.content.res.Resources$Theme);
- public java.lang.String toString();
- public static android.content.res.ColorStateList valueOf(int);
- public android.content.res.ColorStateList withAlpha(int);
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.content.res.CompatibilityInfo {
- <init>(android.content.pm.ApplicationInfo, int, int, boolean);
-
- public boolean alwaysSupportsScreen();
- public void applyToConfiguration(int, android.content.res.Configuration);
- public void applyToDisplayMetrics(android.util.DisplayMetrics);
- public static float computeCompatibleScaling(android.util.DisplayMetrics, android.util.DisplayMetrics);
- public int describeContents();
- public boolean equals(java.lang.Object);
- public android.content.res.CompatibilityInfo$Translator getTranslator();
- public int hashCode();
- public boolean isScalingRequired();
- public boolean needsCompatResources();
- public boolean neverSupportsScreen();
- public boolean supportsScreen();
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public static android.content.res.CompatibilityInfo DEFAULT_COMPATIBILITY_INFO;
- public static int DEFAULT_NORMAL_SHORT_DIMENSION;
- public static float MAXIMUM_ASPECT_RATIO;
- public int applicationDensity;
- public float applicationInvertedScale;
- public float applicationScale;
-}
-
--keep class android.content.res.CompatibilityInfo$Translator {
-
- public android.graphics.Rect getTranslatedContentInsets(android.graphics.Rect);
- public android.graphics.Region getTranslatedTouchableArea(android.graphics.Region);
- public android.graphics.Rect getTranslatedVisibleInsets(android.graphics.Rect);
- public void translateCanvas(android.graphics.Canvas);
- public void translateEventInScreenToAppWindow(android.view.MotionEvent);
- public void translateLayoutParamsInAppWindowToScreen(android.view.WindowManager$LayoutParams);
- public void translatePointInScreenToAppWindow(android.graphics.PointF);
- public void translateRectInAppWindowToScreen(android.graphics.Rect);
- public void translateRectInScreenToAppWinFrame(android.graphics.Rect);
- public void translateRectInScreenToAppWindow(android.graphics.Rect);
- public void translateRegionInWindowToScreen(android.graphics.Region);
- public void translateWindowLayout(android.view.WindowManager$LayoutParams);
-
-
- public float applicationInvertedScale;
- public float applicationScale;
-}
-
--keep class android.content.res.ComplexColor {
- <init>();
-
- public abstract boolean canApplyTheme();
- public int getChangingConfigurations();
- public abstract android.content.res.ConstantState getConstantState();
- public abstract int getDefaultColor();
- public boolean isStateful();
- public abstract android.content.res.ComplexColor obtainForTheme(android.content.res.Resources$Theme);
-
-
-}
-
--keep class android.content.res.Configuration {
- <init>();
- <init>(android.content.res.Configuration);
-
- public void clearLocales();
- public int compareTo(android.content.res.Configuration);
- public int compareTo(java.lang.Object);
- public static java.lang.String configurationDiffToString(int);
- public int describeContents();
- public int diff(android.content.res.Configuration);
- public int diff(android.content.res.Configuration, boolean, boolean);
- public int diffPublicOnly(android.content.res.Configuration);
- public boolean equals(android.content.res.Configuration);
- public boolean equals(java.lang.Object);
- public static android.content.res.Configuration generateDelta(android.content.res.Configuration, android.content.res.Configuration);
- public int getLayoutDirection();
- public android.os.LocaleList getLocales();
- public int hashCode();
- public boolean isLayoutSizeAtLeast(int);
- public boolean isOtherSeqNewer(android.content.res.Configuration);
- public boolean isScreenHdr();
- public boolean isScreenRound();
- public boolean isScreenWideColorGamut();
- public static java.lang.String localesToResourceQualifier(android.os.LocaleList);
- public void makeDefault();
- public static boolean needNewResources(int, int);
- public void readFromParcel(android.os.Parcel);
- public static void readXmlAttrs(org.xmlpull.v1.XmlPullParser, android.content.res.Configuration);
- public static int reduceScreenLayout(int, int, int);
- public static int resetScreenLayout(int);
- public static java.lang.String resourceQualifierString(android.content.res.Configuration);
- public static java.lang.String resourceQualifierString(android.content.res.Configuration, android.util.DisplayMetrics);
- public void setLayoutDirection(java.util.Locale);
- public void setLocale(java.util.Locale);
- public void setLocales(android.os.LocaleList);
- public void setTo(android.content.res.Configuration);
- public void setToDefaults();
- public java.lang.String toString();
- public static java.lang.String uiModeToString(int);
- public void unset();
- public int updateFrom(android.content.res.Configuration);
- public void writeResConfigToProto(android.util.proto.ProtoOutputStream, long, android.util.DisplayMetrics);
- public void writeToParcel(android.os.Parcel, int);
- public void writeToProto(android.util.proto.ProtoOutputStream, long);
- public static void writeXmlAttrs(org.xmlpull.v1.XmlSerializer, android.content.res.Configuration);
-
-
- public static int ASSETS_SEQ_UNDEFINED;
- public static int COLOR_MODE_HDR_MASK;
- public static int COLOR_MODE_HDR_NO;
- public static int COLOR_MODE_HDR_SHIFT;
- public static int COLOR_MODE_HDR_UNDEFINED;
- public static int COLOR_MODE_HDR_YES;
- public static int COLOR_MODE_UNDEFINED;
- public static int COLOR_MODE_WIDE_COLOR_GAMUT_MASK;
- public static int COLOR_MODE_WIDE_COLOR_GAMUT_NO;
- public static int COLOR_MODE_WIDE_COLOR_GAMUT_UNDEFINED;
- public static int COLOR_MODE_WIDE_COLOR_GAMUT_YES;
- public static android.os.Parcelable$Creator CREATOR;
- public static int DENSITY_DPI_ANY;
- public static int DENSITY_DPI_NONE;
- public static int DENSITY_DPI_UNDEFINED;
- public static android.content.res.Configuration EMPTY;
- public static int HARDKEYBOARDHIDDEN_NO;
- public static int HARDKEYBOARDHIDDEN_UNDEFINED;
- public static int HARDKEYBOARDHIDDEN_YES;
- public static int KEYBOARDHIDDEN_NO;
- public static int KEYBOARDHIDDEN_SOFT;
- public static int KEYBOARDHIDDEN_UNDEFINED;
- public static int KEYBOARDHIDDEN_YES;
- public static int KEYBOARD_12KEY;
- public static int KEYBOARD_NOKEYS;
- public static int KEYBOARD_QWERTY;
- public static int KEYBOARD_UNDEFINED;
- public static int MNC_ZERO;
- public static int NATIVE_CONFIG_COLOR_MODE;
- public static int NATIVE_CONFIG_DENSITY;
- public static int NATIVE_CONFIG_KEYBOARD;
- public static int NATIVE_CONFIG_KEYBOARD_HIDDEN;
- public static int NATIVE_CONFIG_LAYOUTDIR;
- public static int NATIVE_CONFIG_LOCALE;
- public static int NATIVE_CONFIG_MCC;
- public static int NATIVE_CONFIG_MNC;
- public static int NATIVE_CONFIG_NAVIGATION;
- public static int NATIVE_CONFIG_ORIENTATION;
- public static int NATIVE_CONFIG_SCREEN_LAYOUT;
- public static int NATIVE_CONFIG_SCREEN_SIZE;
- public static int NATIVE_CONFIG_SMALLEST_SCREEN_SIZE;
- public static int NATIVE_CONFIG_TOUCHSCREEN;
- public static int NATIVE_CONFIG_UI_MODE;
- public static int NATIVE_CONFIG_VERSION;
- public static int NAVIGATIONHIDDEN_NO;
- public static int NAVIGATIONHIDDEN_UNDEFINED;
- public static int NAVIGATIONHIDDEN_YES;
- public static int NAVIGATION_DPAD;
- public static int NAVIGATION_NONAV;
- public static int NAVIGATION_TRACKBALL;
- public static int NAVIGATION_UNDEFINED;
- public static int NAVIGATION_WHEEL;
- public static int ORIENTATION_LANDSCAPE;
- public static int ORIENTATION_PORTRAIT;
- public static int ORIENTATION_SQUARE;
- public static int ORIENTATION_UNDEFINED;
- public static int SCREENLAYOUT_COMPAT_NEEDED;
- public static int SCREENLAYOUT_LAYOUTDIR_LTR;
- public static int SCREENLAYOUT_LAYOUTDIR_MASK;
- public static int SCREENLAYOUT_LAYOUTDIR_RTL;
- public static int SCREENLAYOUT_LAYOUTDIR_SHIFT;
- public static int SCREENLAYOUT_LAYOUTDIR_UNDEFINED;
- public static int SCREENLAYOUT_LONG_MASK;
- public static int SCREENLAYOUT_LONG_NO;
- public static int SCREENLAYOUT_LONG_UNDEFINED;
- public static int SCREENLAYOUT_LONG_YES;
- public static int SCREENLAYOUT_ROUND_MASK;
- public static int SCREENLAYOUT_ROUND_NO;
- public static int SCREENLAYOUT_ROUND_SHIFT;
- public static int SCREENLAYOUT_ROUND_UNDEFINED;
- public static int SCREENLAYOUT_ROUND_YES;
- public static int SCREENLAYOUT_SIZE_LARGE;
- public static int SCREENLAYOUT_SIZE_MASK;
- public static int SCREENLAYOUT_SIZE_NORMAL;
- public static int SCREENLAYOUT_SIZE_SMALL;
- public static int SCREENLAYOUT_SIZE_UNDEFINED;
- public static int SCREENLAYOUT_SIZE_XLARGE;
- public static int SCREENLAYOUT_UNDEFINED;
- public static int SCREEN_HEIGHT_DP_UNDEFINED;
- public static int SCREEN_WIDTH_DP_UNDEFINED;
- public static int SMALLEST_SCREEN_WIDTH_DP_UNDEFINED;
- public static int TOUCHSCREEN_FINGER;
- public static int TOUCHSCREEN_NOTOUCH;
- public static int TOUCHSCREEN_STYLUS;
- public static int TOUCHSCREEN_UNDEFINED;
- public static int UI_MODE_NIGHT_MASK;
- public static int UI_MODE_NIGHT_NO;
- public static int UI_MODE_NIGHT_UNDEFINED;
- public static int UI_MODE_NIGHT_YES;
- public static int UI_MODE_TYPE_APPLIANCE;
- public static int UI_MODE_TYPE_CAR;
- public static int UI_MODE_TYPE_DESK;
- public static int UI_MODE_TYPE_MASK;
- public static int UI_MODE_TYPE_NORMAL;
- public static int UI_MODE_TYPE_TELEVISION;
- public static int UI_MODE_TYPE_UNDEFINED;
- public static int UI_MODE_TYPE_VR_HEADSET;
- public static int UI_MODE_TYPE_WATCH;
- public int assetsSeq;
- public int colorMode;
- public int compatScreenHeightDp;
- public int compatScreenWidthDp;
- public int compatSmallestScreenWidthDp;
- public int densityDpi;
- public float fontScale;
- public int hardKeyboardHidden;
- public int keyboard;
- public int keyboardHidden;
- public java.util.Locale locale;
- public int mcc;
- public int mnc;
- public int navigation;
- public int navigationHidden;
- public int orientation;
- public int screenHeightDp;
- public int screenLayout;
- public int screenWidthDp;
- public int seq;
- public int smallestScreenWidthDp;
- public int touchscreen;
- public int uiMode;
- public boolean userSetLocale;
- public android.app.WindowConfiguration windowConfiguration;
-}
-
--keep class android.content.res.ConfigurationBoundResourceCache {
- <init>();
-
- public java.lang.Object getInstance(long, android.content.res.Resources, android.content.res.Resources$Theme);
- public void onConfigurationChange(int);
- public boolean shouldInvalidateEntry(android.content.res.ConstantState, int);
- public boolean shouldInvalidateEntry(java.lang.Object, int);
-
-
-}
-
--keep class android.content.res.ConstantState {
- <init>();
-
- public abstract int getChangingConfigurations();
- public abstract java.lang.Object newInstance();
- public java.lang.Object newInstance(android.content.res.Resources);
- public java.lang.Object newInstance(android.content.res.Resources, android.content.res.Resources$Theme);
-
-
-}
-
--keep class android.content.res.FontResourcesParser {
- <init>();
-
- public static android.content.res.FontResourcesParser$FamilyResourceEntry parse(org.xmlpull.v1.XmlPullParser, android.content.res.Resources);
-
-
-}
-
--keep class android.content.res.FontResourcesParser$FamilyResourceEntry {
-
-
-
-}
-
--keep class android.content.res.Resources {
- <init>(android.content.res.AssetManager, android.util.DisplayMetrics, android.content.res.Configuration);
- <init>(java.lang.ClassLoader);
-
- public int calcConfigChanges(android.content.res.Configuration);
- public void finishPreloading();
- public void flushLayoutCache();
- public android.content.res.XmlResourceParser getAnimation(int);
- public android.content.res.ConfigurationBoundResourceCache getAnimatorCache();
- public android.content.res.AssetManager getAssets();
- public boolean getBoolean(int);
- public java.lang.ClassLoader getClassLoader();
- public int getColor(int);
- public int getColor(int, android.content.res.Resources$Theme);
- public android.content.res.ColorStateList getColorStateList(int);
- public android.content.res.ColorStateList getColorStateList(int, android.content.res.Resources$Theme);
- public android.content.res.CompatibilityInfo getCompatibilityInfo();
- public android.content.res.Configuration getConfiguration();
- public float getDimension(int);
- public int getDimensionPixelOffset(int);
- public int getDimensionPixelSize(int);
- public android.view.DisplayAdjustments getDisplayAdjustments();
- public android.util.DisplayMetrics getDisplayMetrics();
- public android.graphics.drawable.Drawable getDrawable(int);
- public android.graphics.drawable.Drawable getDrawable(int, android.content.res.Resources$Theme);
- public android.graphics.drawable.Drawable getDrawableForDensity(int, int);
- public android.graphics.drawable.Drawable getDrawableForDensity(int, int, android.content.res.Resources$Theme);
- public android.graphics.drawable.DrawableInflater getDrawableInflater();
- public float getFloat(int);
- public android.graphics.Typeface getFont(int);
- public float getFraction(int, int, int);
- public int getIdentifier(java.lang.String, java.lang.String, java.lang.String);
- public android.content.res.ResourcesImpl getImpl();
- public int[] getIntArray(int);
- public int getInteger(int);
- public android.content.res.XmlResourceParser getLayout(int);
- public android.graphics.Movie getMovie(int);
- public android.util.LongSparseArray getPreloadedDrawables();
- public java.lang.String getQuantityString(int, int, java.lang.Object[]);
- public java.lang.String getQuantityString(int, int);
- public java.lang.CharSequence getQuantityText(int, int);
- public java.lang.String getResourceEntryName(int);
- public java.lang.String getResourceName(int);
- public java.lang.String getResourcePackageName(int);
- public java.lang.String getResourceTypeName(int);
- public android.content.res.Configuration[] getSizeConfigurations();
- public android.content.res.ConfigurationBoundResourceCache getStateListAnimatorCache();
- public java.lang.String getString(int);
- public java.lang.String getString(int, java.lang.Object[]);
- public java.lang.String[] getStringArray(int);
- public static android.content.res.Resources getSystem();
- public java.lang.CharSequence getText(int);
- public java.lang.CharSequence getText(int, java.lang.CharSequence);
- public java.lang.CharSequence[] getTextArray(int);
- public void getValue(int, android.util.TypedValue, boolean);
- public void getValue(java.lang.String, android.util.TypedValue, boolean);
- public void getValueForDensity(int, int, android.util.TypedValue, boolean);
- public android.content.res.XmlResourceParser getXml(int);
- public android.content.res.ComplexColor loadComplexColor(android.util.TypedValue, int, android.content.res.Resources$Theme);
- public android.content.res.Resources$Theme newTheme();
- public android.content.res.TypedArray obtainAttributes(android.util.AttributeSet, int[]);
- public static android.content.res.TypedArray obtainAttributes(android.content.res.Resources, android.content.res.Resources$Theme, android.util.AttributeSet, int[]);
- public android.content.res.TypedArray obtainTypedArray(int);
- public java.io.InputStream openRawResource(int);
- public java.io.InputStream openRawResource(int, android.util.TypedValue);
- public android.content.res.AssetFileDescriptor openRawResourceFd(int);
- public void parseBundleExtra(java.lang.String, android.util.AttributeSet, android.os.Bundle);
- public void parseBundleExtras(android.content.res.XmlResourceParser, android.os.Bundle);
- public void preloadFonts(int);
- public static boolean resourceHasPackage(int);
- public static int selectDefaultTheme(int, int);
- public static int selectSystemTheme(int, int, int, int, int, int);
- public void setCompatibilityInfo(android.content.res.CompatibilityInfo);
- public void setImpl(android.content.res.ResourcesImpl);
- public void startPreloading();
- public void updateConfiguration(android.content.res.Configuration, android.util.DisplayMetrics);
- public void updateConfiguration(android.content.res.Configuration, android.util.DisplayMetrics, android.content.res.CompatibilityInfo);
- public static void updateSystemConfiguration(android.content.res.Configuration, android.util.DisplayMetrics, android.content.res.CompatibilityInfo);
-
-
-}
-
--keep class android.content.res.Resources$NotFoundException {
- <init>();
- <init>(java.lang.String);
- <init>(java.lang.String, java.lang.Exception);
-
-
-
-}
-
--keep class android.content.res.Resources$Theme {
-
- public void applyStyle(int, boolean);
- public void dump(int, java.lang.String, java.lang.String);
- public void encode(android.view.ViewHierarchyEncoder);
- public int[] getAllAttributes();
- public int getChangingConfigurations();
- public android.graphics.drawable.Drawable getDrawable(int);
- public android.content.res.Resources$ThemeKey getKey();
- public android.content.res.Resources getResources();
- public java.lang.String[] getTheme();
- public android.content.res.TypedArray obtainStyledAttributes(int[]);
- public android.content.res.TypedArray obtainStyledAttributes(int, int[]);
- public android.content.res.TypedArray obtainStyledAttributes(android.util.AttributeSet, int[], int, int);
- public void rebase();
- public boolean resolveAttribute(int, android.util.TypedValue, boolean);
- public android.content.res.TypedArray resolveAttributes(int[], int[]);
- public void setTo(android.content.res.Resources$Theme);
-
-
-}
-
--keep class android.content.res.Resources$ThemeKey {
-
- public void append(int, boolean);
- public android.content.res.Resources$ThemeKey clone();
- public java.lang.Object clone();
- public boolean equals(java.lang.Object);
- public int hashCode();
- public void setTo(android.content.res.Resources$ThemeKey);
-
-
-}
-
--keep class android.content.res.ResourcesImpl {
- <init>(android.content.res.AssetManager, android.util.DisplayMetrics, android.content.res.Configuration, android.view.DisplayAdjustments);
-
- public int calcConfigChanges(android.content.res.Configuration);
- public void flushLayoutCache();
- public android.content.res.AssetManager getAssets();
- public android.view.DisplayAdjustments getDisplayAdjustments();
- public android.graphics.Typeface loadFont(android.content.res.Resources, android.util.TypedValue, int);
- public void startPreloading();
- public void updateConfiguration(android.content.res.Configuration, android.util.DisplayMetrics, android.content.res.CompatibilityInfo);
-
-
- public static boolean TRACE_FOR_DETAILED_PRELOAD;
-}
-
--keep class android.content.res.ThemedResourceCache {
-
- public java.lang.Object get(long, android.content.res.Resources$Theme);
- public void onConfigurationChange(int);
- public void put(long, android.content.res.Resources$Theme, java.lang.Object);
- public void put(long, android.content.res.Resources$Theme, java.lang.Object, boolean);
- protected abstract boolean shouldInvalidateEntry(java.lang.Object, int);
-
-
-}
-
--keep class android.content.res.TypedArray {
- <init>(android.content.res.Resources);
-
- public int[] extractThemeAttrs();
- public int[] extractThemeAttrs(int[]);
- public boolean getBoolean(int, boolean);
- public int getChangingConfigurations();
- public int getColor(int, int);
- public android.content.res.ColorStateList getColorStateList(int);
- public android.content.res.ComplexColor getComplexColor(int);
- public float getDimension(int, float);
- public int getDimensionPixelOffset(int, int);
- public int getDimensionPixelSize(int, int);
- public android.graphics.drawable.Drawable getDrawable(int);
- public android.graphics.drawable.Drawable getDrawableForDensity(int, int);
- public float getFloat(int, float);
- public android.graphics.Typeface getFont(int);
- public float getFraction(int, int, int, float);
- public int getIndex(int);
- public int getIndexCount();
- public int getInt(int, int);
- public int getInteger(int, int);
- public int getLayoutDimension(int, java.lang.String);
- public int getLayoutDimension(int, int);
- public java.lang.String getNonConfigurationString(int, int);
- public java.lang.String getNonResourceString(int);
- public java.lang.String getPositionDescription();
- public int getResourceId(int, int);
- public android.content.res.Resources getResources();
- public java.lang.String getString(int);
- public java.lang.CharSequence getText(int);
- public java.lang.CharSequence[] getTextArray(int);
- public int getThemeAttributeId(int, int);
- public int getType(int);
- public boolean getValue(int, android.util.TypedValue);
- public boolean hasValue(int);
- public boolean hasValueOrEmpty(int);
- public int length();
- public android.util.TypedValue peekValue(int);
- public void recycle();
- public java.lang.String toString();
-
-
-}
-
--keep class android.content.res.XmlResourceParser {
-
- public abstract void close();
- public abstract java.lang.String getAttributeNamespace(int);
-
-
-}
-
--keep class android.database.CharArrayBuffer {
- <init>(int);
- <init>(char[]);
-
-
-
- public char[] data;
- public int sizeCopied;
-}
-
--keep class android.database.ContentObserver {
- <init>(android.os.Handler);
-
- public boolean deliverSelfNotifications();
- public void dispatchChange(boolean);
- public void dispatchChange(boolean, android.net.Uri);
- public android.database.IContentObserver getContentObserver();
- public void onChange(boolean);
- public void onChange(boolean, android.net.Uri);
- public void onChange(boolean, android.net.Uri, int);
- public android.database.IContentObserver releaseContentObserver();
-
-
-}
-
--keep class android.database.Cursor {
-
- public abstract void close();
- public abstract void copyStringToBuffer(int, android.database.CharArrayBuffer);
- public abstract void deactivate();
- public abstract byte[] getBlob(int);
- public abstract int getColumnCount();
- public abstract int getColumnIndex(java.lang.String);
- public abstract int getColumnIndexOrThrow(java.lang.String);
- public abstract java.lang.String getColumnName(int);
- public abstract java.lang.String[] getColumnNames();
- public abstract int getCount();
- public abstract double getDouble(int);
- public abstract android.os.Bundle getExtras();
- public abstract float getFloat(int);
- public abstract int getInt(int);
- public abstract long getLong(int);
- public abstract android.net.Uri getNotificationUri();
- public abstract int getPosition();
- public abstract short getShort(int);
- public abstract java.lang.String getString(int);
- public abstract int getType(int);
- public abstract boolean getWantsAllOnMoveCalls();
- public abstract boolean isAfterLast();
- public abstract boolean isBeforeFirst();
- public abstract boolean isClosed();
- public abstract boolean isFirst();
- public abstract boolean isLast();
- public abstract boolean isNull(int);
- public abstract boolean move(int);
- public abstract boolean moveToFirst();
- public abstract boolean moveToLast();
- public abstract boolean moveToNext();
- public abstract boolean moveToPosition(int);
- public abstract boolean moveToPrevious();
- public abstract void registerContentObserver(android.database.ContentObserver);
- public abstract void registerDataSetObserver(android.database.DataSetObserver);
- public abstract boolean requery();
- public abstract android.os.Bundle respond(android.os.Bundle);
- public abstract void setExtras(android.os.Bundle);
- public abstract void setNotificationUri(android.content.ContentResolver, android.net.Uri);
- public abstract void unregisterContentObserver(android.database.ContentObserver);
- public abstract void unregisterDataSetObserver(android.database.DataSetObserver);
-
-
- public static int FIELD_TYPE_BLOB;
- public static int FIELD_TYPE_FLOAT;
- public static int FIELD_TYPE_INTEGER;
- public static int FIELD_TYPE_NULL;
- public static int FIELD_TYPE_STRING;
-}
-
--keep class android.database.CursorWindow {
- <init>(java.lang.String);
- <init>(java.lang.String, long);
- <init>(boolean);
-
- public boolean allocRow();
- public void clear();
- public void copyStringToBuffer(int, int, android.database.CharArrayBuffer);
- public int describeContents();
- protected void finalize();
- public void freeLastRow();
- public byte[] getBlob(int, int);
- public double getDouble(int, int);
- public float getFloat(int, int);
- public int getInt(int, int);
- public long getLong(int, int);
- public java.lang.String getName();
- public int getNumRows();
- public short getShort(int, int);
- public int getStartPosition();
- public java.lang.String getString(int, int);
- public int getType(int, int);
- public boolean isBlob(int, int);
- public boolean isFloat(int, int);
- public boolean isLong(int, int);
- public boolean isNull(int, int);
- public boolean isString(int, int);
- public static android.database.CursorWindow newFromParcel(android.os.Parcel);
- protected void onAllReferencesReleased();
- public boolean putBlob(byte[], int, int);
- public boolean putDouble(double, int, int);
- public boolean putLong(long, int, int);
- public boolean putNull(int, int);
- public boolean putString(java.lang.String, int, int);
- public boolean setNumColumns(int);
- public void setStartPosition(int);
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public long mWindowPtr;
-}
-
--keep class android.database.DataSetObserver {
- <init>();
-
- public void onChanged();
- public void onInvalidated();
-
-
-}
-
--keep class android.database.DatabaseErrorHandler {
-
- public abstract void onCorruption(android.database.sqlite.SQLiteDatabase);
-
-
-}
-
--keep class android.database.IContentObserver {
-
- public abstract void onChange(boolean, android.net.Uri, int);
-
-
-}
-
--keep class android.database.SQLException {
- <init>();
- <init>(java.lang.String);
- <init>(java.lang.String, java.lang.Throwable);
-
-
-
-}
-
--keep class android.database.sqlite.SQLiteClosable {
- <init>();
-
- public void acquireReference();
- public void close();
- protected abstract void onAllReferencesReleased();
- protected void onAllReferencesReleasedFromContainer();
- public void releaseReference();
- public void releaseReferenceFromContainer();
-
-
-}
-
--keep class android.database.sqlite.SQLiteConnection {
-
- public void dump(android.util.Printer, boolean);
- public void execute(java.lang.String, java.lang.Object[], android.os.CancellationSignal);
- public android.os.ParcelFileDescriptor executeForBlobFileDescriptor(java.lang.String, java.lang.Object[], android.os.CancellationSignal);
- public int executeForChangedRowCount(java.lang.String, java.lang.Object[], android.os.CancellationSignal);
- public int executeForCursorWindow(java.lang.String, java.lang.Object[], android.database.CursorWindow, int, int, boolean, android.os.CancellationSignal);
- public long executeForLastInsertedRowId(java.lang.String, java.lang.Object[], android.os.CancellationSignal);
- public long executeForLong(java.lang.String, java.lang.Object[], android.os.CancellationSignal);
- public java.lang.String executeForString(java.lang.String, java.lang.Object[], android.os.CancellationSignal);
- protected void finalize();
- public int getConnectionId();
- public boolean isPrimaryConnection();
- public void onCancel();
- public void prepare(java.lang.String, android.database.sqlite.SQLiteStatementInfo);
- public java.lang.String toString();
-
-
-}
-
--keep class android.database.sqlite.SQLiteConnectionPool {
-
- public android.database.sqlite.SQLiteConnection acquireConnection(java.lang.String, int, android.os.CancellationSignal);
- public void close();
- public void collectDbStats(java.util.ArrayList);
- public void dump(android.util.Printer, boolean);
- protected void finalize();
- public static android.database.sqlite.SQLiteConnectionPool open(android.database.sqlite.SQLiteDatabaseConfiguration);
- public void reconfigure(android.database.sqlite.SQLiteDatabaseConfiguration);
- public void releaseConnection(android.database.sqlite.SQLiteConnection);
- public void setupIdleConnectionHandler(android.os.Looper, long);
- public boolean shouldYieldConnection(android.database.sqlite.SQLiteConnection, int);
- public java.lang.String toString();
-
-
- public static int CONNECTION_FLAG_INTERACTIVE;
- public static int CONNECTION_FLAG_PRIMARY_CONNECTION_AFFINITY;
- public static int CONNECTION_FLAG_READ_ONLY;
-}
-
--keep class android.database.sqlite.SQLiteCursorDriver {
-
- public abstract void cursorClosed();
- public abstract void cursorDeactivated();
- public abstract void cursorRequeried(android.database.Cursor);
- public abstract android.database.Cursor query(android.database.sqlite.SQLiteDatabase$CursorFactory, java.lang.String[]);
- public abstract void setBindArguments(java.lang.String[]);
-
-
-}
-
--keep class android.database.sqlite.SQLiteCustomFunction {
- <init>(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CustomFunction);
-
-
-
- public android.database.sqlite.SQLiteDatabase$CustomFunction callback;
- public java.lang.String name;
- public int numArgs;
-}
-
--keep class android.database.sqlite.SQLiteDatabase {
-
- public void addCustomFunction(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CustomFunction);
- public void beginTransaction();
- public void beginTransactionNonExclusive();
- public void beginTransactionWithListener(android.database.sqlite.SQLiteTransactionListener);
- public void beginTransactionWithListenerNonExclusive(android.database.sqlite.SQLiteTransactionListener);
- public android.database.sqlite.SQLiteStatement compileStatement(java.lang.String);
- public static android.database.sqlite.SQLiteDatabase create(android.database.sqlite.SQLiteDatabase$CursorFactory);
- public static android.database.sqlite.SQLiteDatabase createInMemory(android.database.sqlite.SQLiteDatabase$OpenParams);
- public int delete(java.lang.String, java.lang.String, java.lang.String[]);
- public static boolean deleteDatabase(java.io.File);
- public void disableWriteAheadLogging();
- public boolean enableWriteAheadLogging();
- public void endTransaction();
- public void execSQL(java.lang.String);
- public void execSQL(java.lang.String, java.lang.Object[]);
- protected void finalize();
- public static java.lang.String findEditTable(java.lang.String);
- public java.util.List getAttachedDbs();
- public long getMaximumSize();
- public long getPageSize();
- public java.lang.String getPath();
- public java.util.Map getSyncedTables();
- public int getVersion();
- public boolean inTransaction();
- public long insert(java.lang.String, java.lang.String, android.content.ContentValues);
- public long insertOrThrow(java.lang.String, java.lang.String, android.content.ContentValues);
- public long insertWithOnConflict(java.lang.String, java.lang.String, android.content.ContentValues, int);
- public boolean isDatabaseIntegrityOk();
- public boolean isDbLockedByCurrentThread();
- public boolean isDbLockedByOtherThreads();
- public boolean isInMemoryDatabase();
- public boolean isOpen();
- public boolean isReadOnly();
- public boolean isWriteAheadLoggingEnabled();
- public void markTableSyncable(java.lang.String, java.lang.String);
- public void markTableSyncable(java.lang.String, java.lang.String, java.lang.String);
- public boolean needUpgrade(int);
- protected void onAllReferencesReleased();
- public static android.database.sqlite.SQLiteDatabase openDatabase(java.lang.String, android.database.sqlite.SQLiteDatabase$CursorFactory, int);
- public static android.database.sqlite.SQLiteDatabase openDatabase(java.io.File, android.database.sqlite.SQLiteDatabase$OpenParams);
- public static android.database.sqlite.SQLiteDatabase openDatabase(java.lang.String, android.database.sqlite.SQLiteDatabase$CursorFactory, int, android.database.DatabaseErrorHandler);
- public static android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.io.File, android.database.sqlite.SQLiteDatabase$CursorFactory);
- public static android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, android.database.sqlite.SQLiteDatabase$CursorFactory);
- public static android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, android.database.sqlite.SQLiteDatabase$CursorFactory, android.database.DatabaseErrorHandler);
- public android.database.Cursor query(boolean, java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String);
- public android.database.Cursor query(boolean, java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String, android.os.CancellationSignal);
- public android.database.Cursor query(java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String);
- public android.database.Cursor query(java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String);
- public android.database.Cursor queryWithFactory(android.database.sqlite.SQLiteDatabase$CursorFactory, boolean, java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String);
- public android.database.Cursor queryWithFactory(android.database.sqlite.SQLiteDatabase$CursorFactory, boolean, java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String, android.os.CancellationSignal);
- public android.database.Cursor rawQuery(java.lang.String, java.lang.String[]);
- public android.database.Cursor rawQuery(java.lang.String, java.lang.String[], android.os.CancellationSignal);
- public android.database.Cursor rawQueryWithFactory(android.database.sqlite.SQLiteDatabase$CursorFactory, java.lang.String, java.lang.String[], java.lang.String);
- public android.database.Cursor rawQueryWithFactory(android.database.sqlite.SQLiteDatabase$CursorFactory, java.lang.String, java.lang.String[], java.lang.String, android.os.CancellationSignal);
- public static int releaseMemory();
- public void reopenReadWrite();
- public long replace(java.lang.String, java.lang.String, android.content.ContentValues);
- public long replaceOrThrow(java.lang.String, java.lang.String, android.content.ContentValues);
- public void setForeignKeyConstraintsEnabled(boolean);
- public void setLocale(java.util.Locale);
- public void setLockingEnabled(boolean);
- public void setMaxSqlCacheSize(int);
- public long setMaximumSize(long);
- public void setPageSize(long);
- public void setTransactionSuccessful();
- public void setVersion(int);
- public java.lang.String toString();
- public int update(java.lang.String, android.content.ContentValues, java.lang.String, java.lang.String[]);
- public int updateWithOnConflict(java.lang.String, android.content.ContentValues, java.lang.String, java.lang.String[], int);
- public void validateSql(java.lang.String, android.os.CancellationSignal);
- public boolean yieldIfContended();
- public boolean yieldIfContendedSafely();
- public boolean yieldIfContendedSafely(long);
-
-
- public static int CONFLICT_ABORT;
- public static int CONFLICT_FAIL;
- public static int CONFLICT_IGNORE;
- public static int CONFLICT_NONE;
- public static int CONFLICT_REPLACE;
- public static int CONFLICT_ROLLBACK;
- public static int CREATE_IF_NECESSARY;
- public static int DISABLE_COMPATIBILITY_WAL;
- public static int ENABLE_WRITE_AHEAD_LOGGING;
- public static int MAX_SQL_CACHE_SIZE;
- public static int NO_LOCALIZED_COLLATORS;
- public static int OPEN_READONLY;
- public static int OPEN_READWRITE;
- public static int SQLITE_MAX_LIKE_PATTERN_LENGTH;
-}
-
--keep class android.database.sqlite.SQLiteDatabase$CursorFactory {
-
- public abstract android.database.Cursor newCursor(android.database.sqlite.SQLiteDatabase, android.database.sqlite.SQLiteCursorDriver, java.lang.String, android.database.sqlite.SQLiteQuery);
-
-
-}
-
--keep class android.database.sqlite.SQLiteDatabase$CustomFunction {
-
- public abstract void callback(java.lang.String[]);
-
-
-}
-
--keep class android.database.sqlite.SQLiteDatabase$OpenParams {
-
- public android.database.sqlite.SQLiteDatabase$CursorFactory getCursorFactory();
- public android.database.DatabaseErrorHandler getErrorHandler();
- public long getIdleConnectionTimeout();
- public java.lang.String getJournalMode();
- public int getLookasideSlotCount();
- public int getLookasideSlotSize();
- public int getOpenFlags();
- public java.lang.String getSynchronousMode();
- public android.database.sqlite.SQLiteDatabase$OpenParams$Builder toBuilder();
-
-
-}
-
--keep class android.database.sqlite.SQLiteDatabase$OpenParams$Builder {
- <init>();
- <init>(android.database.sqlite.SQLiteDatabase$OpenParams);
-
- public android.database.sqlite.SQLiteDatabase$OpenParams$Builder addOpenFlags(int);
- public android.database.sqlite.SQLiteDatabase$OpenParams build();
- public boolean isWriteAheadLoggingEnabled();
- public android.database.sqlite.SQLiteDatabase$OpenParams$Builder removeOpenFlags(int);
- public android.database.sqlite.SQLiteDatabase$OpenParams$Builder setCursorFactory(android.database.sqlite.SQLiteDatabase$CursorFactory);
- public android.database.sqlite.SQLiteDatabase$OpenParams$Builder setErrorHandler(android.database.DatabaseErrorHandler);
- public android.database.sqlite.SQLiteDatabase$OpenParams$Builder setIdleConnectionTimeout(long);
- public android.database.sqlite.SQLiteDatabase$OpenParams$Builder setJournalMode(java.lang.String);
- public android.database.sqlite.SQLiteDatabase$OpenParams$Builder setLookasideConfig(int, int);
- public android.database.sqlite.SQLiteDatabase$OpenParams$Builder setOpenFlags(int);
- public android.database.sqlite.SQLiteDatabase$OpenParams$Builder setSynchronousMode(java.lang.String);
- public void setWriteAheadLoggingEnabled(boolean);
-
-
-}
-
--keep class android.database.sqlite.SQLiteDatabaseConfiguration {
- <init>(java.lang.String, int);
- <init>(android.database.sqlite.SQLiteDatabaseConfiguration);
-
- public boolean isInMemoryDb();
- public void updateParametersFrom(android.database.sqlite.SQLiteDatabaseConfiguration);
-
-
- public static java.lang.String MEMORY_DB_PATH;
- public java.util.ArrayList customFunctions;
- public boolean foreignKeyConstraintsEnabled;
- public long idleConnectionTimeoutMs;
- public java.lang.String journalMode;
- public java.lang.String label;
- public java.util.Locale locale;
- public int lookasideSlotCount;
- public int lookasideSlotSize;
- public int maxSqlCacheSize;
- public int openFlags;
- public java.lang.String path;
- public java.lang.String syncMode;
-}
-
--keep class android.database.sqlite.SQLiteDebug {
-
- public static void dump(android.util.Printer, java.lang.String[]);
- public static android.database.sqlite.SQLiteDebug$PagerStats getDatabaseInfo();
- public static boolean shouldLogSlowQuery(long);
-
-
- public static boolean DEBUG_LOG_SLOW_QUERIES;
- public static boolean DEBUG_SQL_LOG;
- public static boolean DEBUG_SQL_STATEMENTS;
- public static boolean DEBUG_SQL_TIME;
-}
-
--keep class android.database.sqlite.SQLiteDebug$DbStats {
- <init>(java.lang.String, long, long, int, int, int, int);
-
-
-
- public java.lang.String cache;
- public java.lang.String dbName;
- public long dbSize;
- public int lookaside;
- public long pageSize;
-}
-
--keep class android.database.sqlite.SQLiteDebug$PagerStats {
- <init>();
-
-
-
- public java.util.ArrayList dbStats;
- public int largestMemAlloc;
- public int memoryUsed;
- public int pageCacheOverflow;
-}
-
--keep class android.database.sqlite.SQLiteProgram {
-
- public void bindAllArgsAsStrings(java.lang.String[]);
- public void bindBlob(int, byte[]);
- public void bindDouble(int, double);
- public void bindLong(int, long);
- public void bindNull(int);
- public void bindString(int, java.lang.String);
- public void clearBindings();
- protected int getConnectionFlags();
- protected android.database.sqlite.SQLiteSession getSession();
- public int getUniqueId();
- protected void onAllReferencesReleased();
- protected void onCorruption();
-
-
-}
-
--keep class android.database.sqlite.SQLiteQuery {
-
- public java.lang.String toString();
-
-
-}
-
--keep class android.database.sqlite.SQLiteSession {
- <init>(android.database.sqlite.SQLiteConnectionPool);
-
- public void beginTransaction(int, android.database.sqlite.SQLiteTransactionListener, int, android.os.CancellationSignal);
- public void endTransaction(android.os.CancellationSignal);
- public void execute(java.lang.String, java.lang.Object[], int, android.os.CancellationSignal);
- public android.os.ParcelFileDescriptor executeForBlobFileDescriptor(java.lang.String, java.lang.Object[], int, android.os.CancellationSignal);
- public int executeForChangedRowCount(java.lang.String, java.lang.Object[], int, android.os.CancellationSignal);
- public int executeForCursorWindow(java.lang.String, java.lang.Object[], android.database.CursorWindow, int, int, boolean, int, android.os.CancellationSignal);
- public long executeForLastInsertedRowId(java.lang.String, java.lang.Object[], int, android.os.CancellationSignal);
- public long executeForLong(java.lang.String, java.lang.Object[], int, android.os.CancellationSignal);
- public java.lang.String executeForString(java.lang.String, java.lang.Object[], int, android.os.CancellationSignal);
- public boolean hasConnection();
- public boolean hasNestedTransaction();
- public boolean hasTransaction();
- public void prepare(java.lang.String, int, android.os.CancellationSignal, android.database.sqlite.SQLiteStatementInfo);
- public void setTransactionSuccessful();
- public boolean yieldTransaction(long, boolean, android.os.CancellationSignal);
-
-
- public static int TRANSACTION_MODE_DEFERRED;
- public static int TRANSACTION_MODE_EXCLUSIVE;
- public static int TRANSACTION_MODE_IMMEDIATE;
-}
-
--keep class android.database.sqlite.SQLiteStatement {
-
- public void execute();
- public long executeInsert();
- public int executeUpdateDelete();
- public android.os.ParcelFileDescriptor simpleQueryForBlobFileDescriptor();
- public long simpleQueryForLong();
- public java.lang.String simpleQueryForString();
- public java.lang.String toString();
-
-
-}
-
--keep class android.database.sqlite.SQLiteStatementInfo {
- <init>();
-
-
-
- public java.lang.String[] columnNames;
- public int numParameters;
- public boolean readOnly;
-}
-
--keep class android.database.sqlite.SQLiteTransactionListener {
-
- public abstract void onBegin();
- public abstract void onCommit();
- public abstract void onRollback();
-
-
-}
-
--keep class android.graphics.BaseCanvas {
- <init>();
-
- protected static void checkRange(int, int, int);
- public void drawARGB(int, int, int, int);
- public void drawArc(float, float, float, float, float, float, boolean, android.graphics.Paint);
- public void drawArc(android.graphics.RectF, float, float, boolean, android.graphics.Paint);
- public void drawBitmap(android.graphics.Bitmap, float, float, android.graphics.Paint);
- public void drawBitmap(android.graphics.Bitmap, android.graphics.Matrix, android.graphics.Paint);
- public void drawBitmap(android.graphics.Bitmap, android.graphics.Rect, android.graphics.Rect, android.graphics.Paint);
- public void drawBitmap(android.graphics.Bitmap, android.graphics.Rect, android.graphics.RectF, android.graphics.Paint);
- public void drawBitmap(int[], int, int, float, float, int, int, boolean, android.graphics.Paint);
- public void drawBitmap(int[], int, int, int, int, int, int, boolean, android.graphics.Paint);
- public void drawBitmapMesh(android.graphics.Bitmap, int, int, float[], int, int[], int, android.graphics.Paint);
- public void drawCircle(float, float, float, android.graphics.Paint);
- public void drawColor(int);
- public void drawColor(int, android.graphics.PorterDuff$Mode);
- public void drawLine(float, float, float, float, android.graphics.Paint);
- public void drawLines(float[], int, int, android.graphics.Paint);
- public void drawLines(float[], android.graphics.Paint);
- public void drawOval(float, float, float, float, android.graphics.Paint);
- public void drawOval(android.graphics.RectF, android.graphics.Paint);
- public void drawPaint(android.graphics.Paint);
- public void drawPatch(android.graphics.NinePatch, android.graphics.Rect, android.graphics.Paint);
- public void drawPatch(android.graphics.NinePatch, android.graphics.RectF, android.graphics.Paint);
- public void drawPath(android.graphics.Path, android.graphics.Paint);
- public void drawPoint(float, float, android.graphics.Paint);
- public void drawPoints(float[], int, int, android.graphics.Paint);
- public void drawPoints(float[], android.graphics.Paint);
- public void drawPosText(char[], int, int, float[], android.graphics.Paint);
- public void drawPosText(java.lang.String, float[], android.graphics.Paint);
- public void drawRGB(int, int, int);
- public void drawRect(float, float, float, float, android.graphics.Paint);
- public void drawRect(android.graphics.Rect, android.graphics.Paint);
- public void drawRect(android.graphics.RectF, android.graphics.Paint);
- public void drawRoundRect(float, float, float, float, float, float, android.graphics.Paint);
- public void drawRoundRect(android.graphics.RectF, float, float, android.graphics.Paint);
- public void drawText(char[], int, int, float, float, android.graphics.Paint);
- public void drawText(java.lang.CharSequence, int, int, float, float, android.graphics.Paint);
- public void drawText(java.lang.String, float, float, android.graphics.Paint);
- public void drawText(java.lang.String, int, int, float, float, android.graphics.Paint);
- public void drawTextOnPath(char[], int, int, android.graphics.Path, float, float, android.graphics.Paint);
- public void drawTextOnPath(java.lang.String, android.graphics.Path, float, float, android.graphics.Paint);
- public void drawTextRun(char[], int, int, int, int, float, float, boolean, android.graphics.Paint);
- public void drawTextRun(java.lang.CharSequence, int, int, int, int, float, float, boolean, android.graphics.Paint);
- public void drawVertices(android.graphics.Canvas$VertexMode, int, float[], int, float[], int, int[], int, short[], int, int, android.graphics.Paint);
- public boolean isHardwareAccelerated();
- public boolean isHwBitmapsInSwModeEnabled();
- protected void onHwBitmapInSwMode();
- public void setHwBitmapsInSwModeEnabled(boolean);
- protected void throwIfCannotDraw(android.graphics.Bitmap);
-
-
- protected int mDensity;
- protected long mNativeCanvasWrapper;
- protected int mScreenDensity;
-}
-
--keep class android.graphics.Bitmap {
-
- public boolean compress(android.graphics.Bitmap$CompressFormat, int, java.io.OutputStream);
- public android.graphics.Bitmap copy(android.graphics.Bitmap$Config, boolean);
- public void copyPixelsFromBuffer(java.nio.Buffer);
- public void copyPixelsToBuffer(java.nio.Buffer);
- public android.graphics.Bitmap createAshmemBitmap();
- public android.graphics.Bitmap createAshmemBitmap(android.graphics.Bitmap$Config);
- public static android.graphics.Bitmap createBitmap(android.graphics.Bitmap);
- public static android.graphics.Bitmap createBitmap(android.graphics.Bitmap, int, int, int, int);
- public static android.graphics.Bitmap createBitmap(android.graphics.Bitmap, int, int, int, int, android.graphics.Matrix, boolean);
- public static android.graphics.Bitmap createBitmap(int, int, android.graphics.Bitmap$Config);
- public static android.graphics.Bitmap createBitmap(android.util.DisplayMetrics, int, int, android.graphics.Bitmap$Config);
- public static android.graphics.Bitmap createBitmap(int, int, android.graphics.Bitmap$Config, boolean);
- public static android.graphics.Bitmap createBitmap(int, int, android.graphics.Bitmap$Config, boolean, android.graphics.ColorSpace);
- public static android.graphics.Bitmap createBitmap(android.util.DisplayMetrics, int, int, android.graphics.Bitmap$Config, boolean);
- public static android.graphics.Bitmap createBitmap(android.util.DisplayMetrics, int, int, android.graphics.Bitmap$Config, boolean, android.graphics.ColorSpace);
- public static android.graphics.Bitmap createBitmap(int[], int, int, int, int, android.graphics.Bitmap$Config);
- public static android.graphics.Bitmap createBitmap(android.util.DisplayMetrics, int[], int, int, int, int, android.graphics.Bitmap$Config);
- public static android.graphics.Bitmap createBitmap(int[], int, int, android.graphics.Bitmap$Config);
- public static android.graphics.Bitmap createBitmap(android.util.DisplayMetrics, int[], int, int, android.graphics.Bitmap$Config);
- public static android.graphics.Bitmap createBitmap(android.graphics.Picture);
- public static android.graphics.Bitmap createBitmap(android.graphics.Picture, int, int, android.graphics.Bitmap$Config);
- public android.graphics.GraphicBuffer createGraphicBufferHandle();
- public static android.graphics.Bitmap createHardwareBitmap(android.graphics.GraphicBuffer);
- public static android.graphics.Bitmap createScaledBitmap(android.graphics.Bitmap, int, int, boolean);
- public int describeContents();
- public void eraseColor(int);
- public android.graphics.Bitmap extractAlpha();
- public android.graphics.Bitmap extractAlpha(android.graphics.Paint, int[]);
- public int getAllocationByteCount();
- public int getByteCount();
- public android.graphics.ColorSpace getColorSpace();
- public android.graphics.Bitmap$Config getConfig();
- public int getDensity();
- public int getGenerationId();
- public int getHeight();
- public long getNativeInstance();
- public byte[] getNinePatchChunk();
- public android.graphics.NinePatch$InsetStruct getNinePatchInsets();
- public void getOpticalInsets(android.graphics.Rect);
- public int getPixel(int, int);
- public void getPixels(int[], int, int, int, int, int, int);
- public int getRowBytes();
- public int getScaledHeight(android.graphics.Canvas);
- public int getScaledHeight(android.util.DisplayMetrics);
- public int getScaledHeight(int);
- public int getScaledWidth(android.graphics.Canvas);
- public int getScaledWidth(android.util.DisplayMetrics);
- public int getScaledWidth(int);
- public int getWidth();
- public boolean hasAlpha();
- public boolean hasMipMap();
- public boolean isMutable();
- public boolean isPremultiplied();
- public boolean isRecycled();
- public void makeImmutable();
- public void prepareToDraw();
- public void reconfigure(int, int, android.graphics.Bitmap$Config);
- public void recycle();
- public boolean sameAs(android.graphics.Bitmap);
- public static int scaleFromDensity(int, int, int);
- public void setConfig(android.graphics.Bitmap$Config);
- public static void setDefaultDensity(int);
- public void setDensity(int);
- public void setHasAlpha(boolean);
- public void setHasMipMap(boolean);
- public void setHeight(int);
- public void setNinePatchChunk(byte[]);
- public void setPixel(int, int, int);
- public void setPixels(int[], int, int, int, int, int, int);
- public void setPremultiplied(boolean);
- public void setWidth(int);
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public static int DENSITY_NONE;
- public int mDensity;
- public static volatile int sPreloadTracingNumInstantiatedBitmaps;
- public static volatile long sPreloadTracingTotalBitmapsSize;
-}
-
--keep class android.graphics.Bitmap$CompressFormat {
-
- public static android.graphics.Bitmap$CompressFormat valueOf(java.lang.String);
- public static android.graphics.Bitmap$CompressFormat[] values();
-
- public static android.graphics.Bitmap$CompressFormat JPEG;
- public static android.graphics.Bitmap$CompressFormat PNG;
- public static android.graphics.Bitmap$CompressFormat WEBP;
-
-}
-
--keep class android.graphics.Bitmap$Config {
-
- public static android.graphics.Bitmap$Config valueOf(java.lang.String);
- public static android.graphics.Bitmap$Config[] values();
-
- public static android.graphics.Bitmap$Config ALPHA_8;
- public static android.graphics.Bitmap$Config ARGB_4444;
- public static android.graphics.Bitmap$Config ARGB_8888;
- public static android.graphics.Bitmap$Config HARDWARE;
- public static android.graphics.Bitmap$Config RGBA_F16;
- public static android.graphics.Bitmap$Config RGB_565;
-
-}
-
--keep class android.graphics.BitmapFactory {
- <init>();
-
- public static android.graphics.Bitmap decodeByteArray(byte[], int, int, android.graphics.BitmapFactory$Options);
- public static android.graphics.Bitmap decodeByteArray(byte[], int, int);
- public static android.graphics.Bitmap decodeFile(java.lang.String, android.graphics.BitmapFactory$Options);
- public static android.graphics.Bitmap decodeFile(java.lang.String);
- public static android.graphics.Bitmap decodeFileDescriptor(java.io.FileDescriptor, android.graphics.Rect, android.graphics.BitmapFactory$Options);
- public static android.graphics.Bitmap decodeFileDescriptor(java.io.FileDescriptor);
- public static android.graphics.Bitmap decodeResource(android.content.res.Resources, int, android.graphics.BitmapFactory$Options);
- public static android.graphics.Bitmap decodeResource(android.content.res.Resources, int);
- public static android.graphics.Bitmap decodeResourceStream(android.content.res.Resources, android.util.TypedValue, java.io.InputStream, android.graphics.Rect, android.graphics.BitmapFactory$Options);
- public static android.graphics.Bitmap decodeStream(java.io.InputStream, android.graphics.Rect, android.graphics.BitmapFactory$Options);
- public static android.graphics.Bitmap decodeStream(java.io.InputStream);
-
-
-}
-
--keep class android.graphics.BitmapFactory$Options {
- <init>();
-
- public void requestCancelDecode();
-
-
- public android.graphics.Bitmap inBitmap;
- public int inDensity;
- public boolean inDither;
- public boolean inInputShareable;
- public boolean inJustDecodeBounds;
- public boolean inMutable;
- public boolean inPreferQualityOverSpeed;
- public android.graphics.ColorSpace inPreferredColorSpace;
- public android.graphics.Bitmap$Config inPreferredConfig;
- public boolean inPremultiplied;
- public boolean inPurgeable;
- public int inSampleSize;
- public boolean inScaled;
- public int inScreenDensity;
- public int inTargetDensity;
- public byte[] inTempStorage;
- public boolean mCancel;
- public android.graphics.ColorSpace outColorSpace;
- public android.graphics.Bitmap$Config outConfig;
- public int outHeight;
- public java.lang.String outMimeType;
- public int outWidth;
-}
-
--keep class android.graphics.Canvas {
- <init>();
- <init>(android.graphics.Bitmap);
- <init>(long);
-
- public boolean clipOutPath(android.graphics.Path);
- public boolean clipOutRect(android.graphics.RectF);
- public boolean clipOutRect(android.graphics.Rect);
- public boolean clipOutRect(float, float, float, float);
- public boolean clipOutRect(int, int, int, int);
- public boolean clipPath(android.graphics.Path, android.graphics.Region$Op);
- public boolean clipPath(android.graphics.Path);
- public boolean clipRect(android.graphics.RectF, android.graphics.Region$Op);
- public boolean clipRect(android.graphics.Rect, android.graphics.Region$Op);
- public boolean clipRect(android.graphics.RectF);
- public boolean clipRect(android.graphics.Rect);
- public boolean clipRect(float, float, float, float, android.graphics.Region$Op);
- public boolean clipRect(float, float, float, float);
- public boolean clipRect(int, int, int, int);
- public boolean clipRectUnion(android.graphics.Rect);
- public boolean clipRegion(android.graphics.Region, android.graphics.Region$Op);
- public boolean clipRegion(android.graphics.Region);
- public void concat(android.graphics.Matrix);
- public void drawARGB(int, int, int, int);
- public void drawArc(android.graphics.RectF, float, float, boolean, android.graphics.Paint);
- public void drawArc(float, float, float, float, float, float, boolean, android.graphics.Paint);
- public void drawBitmap(android.graphics.Bitmap, float, float, android.graphics.Paint);
- public void drawBitmap(android.graphics.Bitmap, android.graphics.Rect, android.graphics.RectF, android.graphics.Paint);
- public void drawBitmap(android.graphics.Bitmap, android.graphics.Rect, android.graphics.Rect, android.graphics.Paint);
- public void drawBitmap(int[], int, int, float, float, int, int, boolean, android.graphics.Paint);
- public void drawBitmap(int[], int, int, int, int, int, int, boolean, android.graphics.Paint);
- public void drawBitmap(android.graphics.Bitmap, android.graphics.Matrix, android.graphics.Paint);
- public void drawBitmapMesh(android.graphics.Bitmap, int, int, float[], int, int[], int, android.graphics.Paint);
- public void drawCircle(float, float, float, android.graphics.Paint);
- public void drawColor(int);
- public void drawColor(int, android.graphics.PorterDuff$Mode);
- public void drawLine(float, float, float, float, android.graphics.Paint);
- public void drawLines(float[], int, int, android.graphics.Paint);
- public void drawLines(float[], android.graphics.Paint);
- public void drawOval(android.graphics.RectF, android.graphics.Paint);
- public void drawOval(float, float, float, float, android.graphics.Paint);
- public void drawPaint(android.graphics.Paint);
- public void drawPatch(android.graphics.NinePatch, android.graphics.Rect, android.graphics.Paint);
- public void drawPatch(android.graphics.NinePatch, android.graphics.RectF, android.graphics.Paint);
- public void drawPath(android.graphics.Path, android.graphics.Paint);
- public void drawPicture(android.graphics.Picture);
- public void drawPicture(android.graphics.Picture, android.graphics.RectF);
- public void drawPicture(android.graphics.Picture, android.graphics.Rect);
- public void drawPoint(float, float, android.graphics.Paint);
- public void drawPoints(float[], int, int, android.graphics.Paint);
- public void drawPoints(float[], android.graphics.Paint);
- public void drawPosText(char[], int, int, float[], android.graphics.Paint);
- public void drawPosText(java.lang.String, float[], android.graphics.Paint);
- public void drawRGB(int, int, int);
- public void drawRect(android.graphics.RectF, android.graphics.Paint);
- public void drawRect(android.graphics.Rect, android.graphics.Paint);
- public void drawRect(float, float, float, float, android.graphics.Paint);
- public void drawRoundRect(android.graphics.RectF, float, float, android.graphics.Paint);
- public void drawRoundRect(float, float, float, float, float, float, android.graphics.Paint);
- public void drawText(char[], int, int, float, float, android.graphics.Paint);
- public void drawText(java.lang.String, float, float, android.graphics.Paint);
- public void drawText(java.lang.String, int, int, float, float, android.graphics.Paint);
- public void drawText(java.lang.CharSequence, int, int, float, float, android.graphics.Paint);
- public void drawTextOnPath(char[], int, int, android.graphics.Path, float, float, android.graphics.Paint);
- public void drawTextOnPath(java.lang.String, android.graphics.Path, float, float, android.graphics.Paint);
- public void drawTextRun(char[], int, int, int, int, float, float, boolean, android.graphics.Paint);
- public void drawTextRun(java.lang.CharSequence, int, int, int, int, float, float, boolean, android.graphics.Paint);
- public void drawVertices(android.graphics.Canvas$VertexMode, int, float[], int, float[], int, int[], int, short[], int, int, android.graphics.Paint);
- public static void freeCaches();
- public static void freeTextLayoutCaches();
- public boolean getClipBounds(android.graphics.Rect);
- public android.graphics.Rect getClipBounds();
- public int getDensity();
- public android.graphics.DrawFilter getDrawFilter();
- protected javax.microedition.khronos.opengles.GL getGL();
- public int getHeight();
- public void getMatrix(android.graphics.Matrix);
- public android.graphics.Matrix getMatrix();
- public int getMaximumBitmapHeight();
- public int getMaximumBitmapWidth();
- public long getNativeCanvasWrapper();
- public int getSaveCount();
- public int getWidth();
- public void insertInorderBarrier();
- public void insertReorderBarrier();
- public boolean isHardwareAccelerated();
- public boolean isOpaque();
- public boolean isRecordingFor(java.lang.Object);
- public boolean quickReject(android.graphics.RectF, android.graphics.Canvas$EdgeType);
- public boolean quickReject(android.graphics.Path, android.graphics.Canvas$EdgeType);
- public boolean quickReject(float, float, float, float, android.graphics.Canvas$EdgeType);
- public void release();
- public void restore();
- public void restoreToCount(int);
- public void rotate(float);
- public void rotate(float, float, float);
- public int save();
- public int save(int);
- public int saveLayer(android.graphics.RectF, android.graphics.Paint, int);
- public int saveLayer(android.graphics.RectF, android.graphics.Paint);
- public int saveLayer(float, float, float, float, android.graphics.Paint, int);
- public int saveLayer(float, float, float, float, android.graphics.Paint);
- public int saveLayerAlpha(android.graphics.RectF, int, int);
- public int saveLayerAlpha(android.graphics.RectF, int);
- public int saveLayerAlpha(float, float, float, float, int, int);
- public int saveLayerAlpha(float, float, float, float, int);
- public int saveUnclippedLayer(int, int, int, int);
- public void scale(float, float);
- public void scale(float, float, float, float);
- public void setBitmap(android.graphics.Bitmap);
- public static void setCompatibilityVersion(int);
- public void setDensity(int);
- public void setDrawFilter(android.graphics.DrawFilter);
- public void setMatrix(android.graphics.Matrix);
- public void setScreenDensity(int);
- public void skew(float, float);
- public void translate(float, float);
-
-
- public static int ALL_SAVE_FLAG;
- public static int CLIP_SAVE_FLAG;
- public static int CLIP_TO_LAYER_SAVE_FLAG;
- public static int FULL_COLOR_LAYER_SAVE_FLAG;
- public static int HAS_ALPHA_LAYER_SAVE_FLAG;
- public static int MATRIX_SAVE_FLAG;
- public static boolean sCompatibilityRestore;
- public static boolean sCompatibilitySetBitmap;
-}
-
--keep class android.graphics.Canvas$EdgeType {
-
- public static android.graphics.Canvas$EdgeType valueOf(java.lang.String);
- public static android.graphics.Canvas$EdgeType[] values();
-
- public static android.graphics.Canvas$EdgeType AA;
- public static android.graphics.Canvas$EdgeType BW;
-
- public int nativeInt;
-}
-
--keep class android.graphics.Canvas$VertexMode {
-
- public static android.graphics.Canvas$VertexMode valueOf(java.lang.String);
- public static android.graphics.Canvas$VertexMode[] values();
-
- public static android.graphics.Canvas$VertexMode TRIANGLES;
- public static android.graphics.Canvas$VertexMode TRIANGLE_FAN;
- public static android.graphics.Canvas$VertexMode TRIANGLE_STRIP;
-
- public int nativeInt;
-}
-
--keep class android.graphics.CanvasProperty {
-
- public static android.graphics.CanvasProperty createFloat(float);
- public static android.graphics.CanvasProperty createPaint(android.graphics.Paint);
- public long getNativeContainer();
-
-
-}
-
--keep class android.graphics.ColorFilter {
- <init>();
-
- public long getNativeInstance();
-
-
-}
-
--keep class android.graphics.ColorSpace {
-
- public static android.graphics.ColorSpace adapt(android.graphics.ColorSpace, float[]);
- public static android.graphics.ColorSpace adapt(android.graphics.ColorSpace, float[], android.graphics.ColorSpace$Adaptation);
- public static android.graphics.ColorSpace$Connector connect(android.graphics.ColorSpace, android.graphics.ColorSpace);
- public static android.graphics.ColorSpace$Connector connect(android.graphics.ColorSpace, android.graphics.ColorSpace, android.graphics.ColorSpace$RenderIntent);
- public static android.graphics.ColorSpace$Connector connect(android.graphics.ColorSpace);
- public static android.graphics.ColorSpace$Connector connect(android.graphics.ColorSpace, android.graphics.ColorSpace$RenderIntent);
- public static android.graphics.ColorSpace$Renderer createRenderer();
- public boolean equals(java.lang.Object);
- public float[] fromXyz(float, float, float);
- public abstract float[] fromXyz(float[]);
- public static android.graphics.ColorSpace get(android.graphics.ColorSpace$Named);
- public int getComponentCount();
- public int getId();
- public abstract float getMaxValue(int);
- public abstract float getMinValue(int);
- public android.graphics.ColorSpace$Model getModel();
- public java.lang.String getName();
- public int hashCode();
- public boolean isSrgb();
- public abstract boolean isWideGamut();
- public static android.graphics.ColorSpace match(float[], android.graphics.ColorSpace$Rgb$TransferParameters);
- public java.lang.String toString();
- public float[] toXyz(float, float, float);
- public abstract float[] toXyz(float[]);
-
-
- public static float[] ILLUMINANT_A;
- public static float[] ILLUMINANT_B;
- public static float[] ILLUMINANT_C;
- public static float[] ILLUMINANT_D50;
- public static float[] ILLUMINANT_D55;
- public static float[] ILLUMINANT_D60;
- public static float[] ILLUMINANT_D65;
- public static float[] ILLUMINANT_D75;
- public static float[] ILLUMINANT_E;
- public static int MAX_ID;
- public static int MIN_ID;
-}
-
--keep class android.graphics.ColorSpace$Adaptation {
-
- public static android.graphics.ColorSpace$Adaptation valueOf(java.lang.String);
- public static android.graphics.ColorSpace$Adaptation[] values();
-
- public static android.graphics.ColorSpace$Adaptation BRADFORD;
- public static android.graphics.ColorSpace$Adaptation CIECAT02;
- public static android.graphics.ColorSpace$Adaptation VON_KRIES;
-
-}
-
--keep class android.graphics.ColorSpace$Connector {
-
- public android.graphics.ColorSpace getDestination();
- public android.graphics.ColorSpace$RenderIntent getRenderIntent();
- public android.graphics.ColorSpace getSource();
- public float[] transform(float, float, float);
- public float[] transform(float[]);
-
-
-}
-
--keep class android.graphics.ColorSpace$Model {
-
- public int getComponentCount();
- public static android.graphics.ColorSpace$Model valueOf(java.lang.String);
- public static android.graphics.ColorSpace$Model[] values();
-
- public static android.graphics.ColorSpace$Model CMYK;
- public static android.graphics.ColorSpace$Model LAB;
- public static android.graphics.ColorSpace$Model RGB;
- public static android.graphics.ColorSpace$Model XYZ;
-
-}
-
--keep class android.graphics.ColorSpace$Named {
-
- public static android.graphics.ColorSpace$Named valueOf(java.lang.String);
- public static android.graphics.ColorSpace$Named[] values();
-
- public static android.graphics.ColorSpace$Named ACES;
- public static android.graphics.ColorSpace$Named ACESCG;
- public static android.graphics.ColorSpace$Named ADOBE_RGB;
- public static android.graphics.ColorSpace$Named BT2020;
- public static android.graphics.ColorSpace$Named BT709;
- public static android.graphics.ColorSpace$Named CIE_LAB;
- public static android.graphics.ColorSpace$Named CIE_XYZ;
- public static android.graphics.ColorSpace$Named DCI_P3;
- public static android.graphics.ColorSpace$Named DISPLAY_P3;
- public static android.graphics.ColorSpace$Named EXTENDED_SRGB;
- public static android.graphics.ColorSpace$Named LINEAR_EXTENDED_SRGB;
- public static android.graphics.ColorSpace$Named LINEAR_SRGB;
- public static android.graphics.ColorSpace$Named NTSC_1953;
- public static android.graphics.ColorSpace$Named PRO_PHOTO_RGB;
- public static android.graphics.ColorSpace$Named SMPTE_C;
- public static android.graphics.ColorSpace$Named SRGB;
-
-}
-
--keep class android.graphics.ColorSpace$RenderIntent {
-
- public static android.graphics.ColorSpace$RenderIntent valueOf(java.lang.String);
- public static android.graphics.ColorSpace$RenderIntent[] values();
-
- public static android.graphics.ColorSpace$RenderIntent ABSOLUTE;
- public static android.graphics.ColorSpace$RenderIntent PERCEPTUAL;
- public static android.graphics.ColorSpace$RenderIntent RELATIVE;
- public static android.graphics.ColorSpace$RenderIntent SATURATION;
-
-}
-
--keep class android.graphics.ColorSpace$Renderer {
-
- public android.graphics.ColorSpace$Renderer add(android.graphics.ColorSpace, int);
- public android.graphics.ColorSpace$Renderer add(android.graphics.ColorSpace, float, float, float, int);
- public android.graphics.ColorSpace$Renderer clip(boolean);
- public android.graphics.Bitmap render();
- public android.graphics.ColorSpace$Renderer showWhitePoint(boolean);
- public android.graphics.ColorSpace$Renderer size(int);
- public android.graphics.ColorSpace$Renderer uniformChromaticityScale(boolean);
-
-
-}
-
--keep class android.graphics.ColorSpace$Rgb {
- <init>(java.lang.String, float[], java.util.function.DoubleUnaryOperator, java.util.function.DoubleUnaryOperator);
- <init>(java.lang.String, float[], float[], java.util.function.DoubleUnaryOperator, java.util.function.DoubleUnaryOperator, float, float);
- <init>(java.lang.String, float[], android.graphics.ColorSpace$Rgb$TransferParameters);
- <init>(java.lang.String, float[], float[], android.graphics.ColorSpace$Rgb$TransferParameters);
- <init>(java.lang.String, float[], double);
- <init>(java.lang.String, float[], float[], double);
-
- public boolean equals(java.lang.Object);
- public float[] fromLinear(float, float, float);
- public float[] fromLinear(float[]);
- public float[] fromXyz(float[]);
- public java.util.function.DoubleUnaryOperator getEotf();
- public float[] getInverseTransform(float[]);
- public float[] getInverseTransform();
- public float getMaxValue(int);
- public float getMinValue(int);
- public java.util.function.DoubleUnaryOperator getOetf();
- public float[] getPrimaries(float[]);
- public float[] getPrimaries();
- public android.graphics.ColorSpace$Rgb$TransferParameters getTransferParameters();
- public float[] getTransform(float[]);
- public float[] getTransform();
- public float[] getWhitePoint(float[]);
- public float[] getWhitePoint();
- public int hashCode();
- public boolean isSrgb();
- public boolean isWideGamut();
- public float[] toLinear(float, float, float);
- public float[] toLinear(float[]);
- public float[] toXyz(float[]);
-
-
-}
-
--keep class android.graphics.ColorSpace$Rgb$TransferParameters {
- <init>(double, double, double, double, double);
- <init>(double, double, double, double, double, double, double);
-
- public boolean equals(java.lang.Object);
- public int hashCode();
-
-
- public double a;
- public double b;
- public double c;
- public double d;
- public double e;
- public double f;
- public double g;
-}
-
--keep class android.graphics.DrawFilter {
- <init>();
-
- protected void finalize();
-
-
- public long mNativeInt;
-}
-
--keep class android.graphics.FontFamily {
- <init>();
- <init>(java.lang.String[], int);
-
- public void abortCreation();
- public boolean addFont(java.lang.String, int, android.graphics.fonts.FontVariationAxis[], int, int);
- public boolean addFontFromAssetManager(android.content.res.AssetManager, java.lang.String, int, boolean, int, int, int, android.graphics.fonts.FontVariationAxis[]);
- public boolean addFontFromBuffer(java.nio.ByteBuffer, int, android.graphics.fonts.FontVariationAxis[], int, int);
- public boolean freeze();
-
-
- public long mNativePtr;
-}
-
--keep class android.graphics.GraphicBuffer {
-
- public static android.graphics.GraphicBuffer create(int, int, int, int);
- public static android.graphics.GraphicBuffer createFromExisting(int, int, int, int, long);
- public int describeContents();
- public void destroy();
- protected void finalize();
- public int getFormat();
- public int getHeight();
- public int getUsage();
- public int getWidth();
- public boolean isDestroyed();
- public android.graphics.Canvas lockCanvas();
- public android.graphics.Canvas lockCanvas(android.graphics.Rect);
- public void unlockCanvasAndPost(android.graphics.Canvas);
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public static int USAGE_HW_2D;
- public static int USAGE_HW_COMPOSER;
- public static int USAGE_HW_MASK;
- public static int USAGE_HW_RENDER;
- public static int USAGE_HW_TEXTURE;
- public static int USAGE_HW_VIDEO_ENCODER;
- public static int USAGE_PROTECTED;
- public static int USAGE_SOFTWARE_MASK;
- public static int USAGE_SW_READ_MASK;
- public static int USAGE_SW_READ_NEVER;
- public static int USAGE_SW_READ_OFTEN;
- public static int USAGE_SW_READ_RARELY;
- public static int USAGE_SW_WRITE_MASK;
- public static int USAGE_SW_WRITE_NEVER;
- public static int USAGE_SW_WRITE_OFTEN;
- public static int USAGE_SW_WRITE_RARELY;
-}
-
--keep class android.graphics.Insets {
-
- public boolean equals(java.lang.Object);
- public int hashCode();
- public static android.graphics.Insets of(int, int, int, int);
- public static android.graphics.Insets of(android.graphics.Rect);
- public java.lang.String toString();
-
-
- public static android.graphics.Insets NONE;
- public int bottom;
- public int left;
- public int right;
- public int top;
-}
-
--keep class android.graphics.MaskFilter {
- <init>();
-
- protected void finalize();
-
-
-}
-
--keep class android.graphics.Matrix {
- <init>();
- <init>(android.graphics.Matrix);
-
- public boolean equals(java.lang.Object);
- public void getValues(float[]);
- public int hashCode();
- public boolean invert(android.graphics.Matrix);
- public boolean isAffine();
- public boolean isIdentity();
- public void mapPoints(float[], int, float[], int, int);
- public void mapPoints(float[], float[]);
- public void mapPoints(float[]);
- public float mapRadius(float);
- public boolean mapRect(android.graphics.RectF, android.graphics.RectF);
- public boolean mapRect(android.graphics.RectF);
- public void mapVectors(float[], int, float[], int, int);
- public void mapVectors(float[], float[]);
- public void mapVectors(float[]);
- public long ni();
- public boolean postConcat(android.graphics.Matrix);
- public boolean postRotate(float, float, float);
- public boolean postRotate(float);
- public boolean postScale(float, float, float, float);
- public boolean postScale(float, float);
- public boolean postSkew(float, float, float, float);
- public boolean postSkew(float, float);
- public boolean postTranslate(float, float);
- public boolean preConcat(android.graphics.Matrix);
- public boolean preRotate(float, float, float);
- public boolean preRotate(float);
- public boolean preScale(float, float, float, float);
- public boolean preScale(float, float);
- public boolean preSkew(float, float, float, float);
- public boolean preSkew(float, float);
- public boolean preTranslate(float, float);
- public void printShortString(java.io.PrintWriter);
- public boolean rectStaysRect();
- public void reset();
- public void set(android.graphics.Matrix);
- public boolean setConcat(android.graphics.Matrix, android.graphics.Matrix);
- public boolean setPolyToPoly(float[], int, float[], int, int);
- public boolean setRectToRect(android.graphics.RectF, android.graphics.RectF, android.graphics.Matrix$ScaleToFit);
- public void setRotate(float, float, float);
- public void setRotate(float);
- public void setScale(float, float, float, float);
- public void setScale(float, float);
- public void setSinCos(float, float, float, float);
- public void setSinCos(float, float);
- public void setSkew(float, float, float, float);
- public void setSkew(float, float);
- public void setTranslate(float, float);
- public void setValues(float[]);
- public java.lang.String toShortString();
- public void toShortString(java.lang.StringBuilder);
- public java.lang.String toString();
-
-
- public static android.graphics.Matrix IDENTITY_MATRIX;
- public static int MPERSP_0;
- public static int MPERSP_1;
- public static int MPERSP_2;
- public static int MSCALE_X;
- public static int MSCALE_Y;
- public static int MSKEW_X;
- public static int MSKEW_Y;
- public static int MTRANS_X;
- public static int MTRANS_Y;
- public long native_instance;
-}
-
--keep class android.graphics.Matrix$ScaleToFit {
-
- public static android.graphics.Matrix$ScaleToFit valueOf(java.lang.String);
- public static android.graphics.Matrix$ScaleToFit[] values();
-
- public static android.graphics.Matrix$ScaleToFit CENTER;
- public static android.graphics.Matrix$ScaleToFit END;
- public static android.graphics.Matrix$ScaleToFit FILL;
- public static android.graphics.Matrix$ScaleToFit START;
-
-}
-
--keep class android.graphics.Movie {
-
- public static android.graphics.Movie decodeByteArray(byte[], int, int);
- public static android.graphics.Movie decodeFile(java.lang.String);
- public static android.graphics.Movie decodeStream(java.io.InputStream);
- public void draw(android.graphics.Canvas, float, float, android.graphics.Paint);
- public void draw(android.graphics.Canvas, float, float);
- public int duration();
- protected void finalize();
- public int height();
- public boolean isOpaque();
- public boolean setTime(int);
- public int width();
-
-
-}
-
--keep class android.graphics.NinePatch {
- <init>(android.graphics.Bitmap, byte[]);
- <init>(android.graphics.Bitmap, byte[], java.lang.String);
- <init>(android.graphics.NinePatch);
-
- public void draw(android.graphics.Canvas, android.graphics.RectF);
- public void draw(android.graphics.Canvas, android.graphics.Rect);
- public void draw(android.graphics.Canvas, android.graphics.Rect, android.graphics.Paint);
- protected void finalize();
- public android.graphics.Bitmap getBitmap();
- public int getDensity();
- public int getHeight();
- public java.lang.String getName();
- public android.graphics.Paint getPaint();
- public android.graphics.Region getTransparentRegion(android.graphics.Rect);
- public int getWidth();
- public boolean hasAlpha();
- public static boolean isNinePatchChunk(byte[]);
- public void setPaint(android.graphics.Paint);
-
-
- public long mNativeChunk;
-}
-
--keep class android.graphics.NinePatch$InsetStruct {
-
- public static android.graphics.Rect scaleInsets(int, int, int, int, float);
-
-
- public android.graphics.Rect opticalRect;
- public float outlineAlpha;
- public float outlineRadius;
- public android.graphics.Rect outlineRect;
-}
-
--keep class android.graphics.Outline {
- <init>();
- <init>(android.graphics.Outline);
-
- public boolean canClip();
- public float getAlpha();
- public float getRadius();
- public boolean getRect(android.graphics.Rect);
- public boolean isEmpty();
- public void offset(int, int);
- public void set(android.graphics.Outline);
- public void setAlpha(float);
- public void setConvexPath(android.graphics.Path);
- public void setEmpty();
- public void setOval(int, int, int, int);
- public void setOval(android.graphics.Rect);
- public void setRect(int, int, int, int);
- public void setRect(android.graphics.Rect);
- public void setRoundRect(int, int, int, int, float);
- public void setRoundRect(android.graphics.Rect, float);
-
-
- public static int MODE_CONVEX_PATH;
- public static int MODE_EMPTY;
- public static int MODE_ROUND_RECT;
- public float mAlpha;
- public int mMode;
- public android.graphics.Path mPath;
- public float mRadius;
- public android.graphics.Rect mRect;
-}
-
--keep class android.graphics.Paint {
- <init>();
- <init>(int);
- <init>(android.graphics.Paint);
-
- public float ascent();
- public int breakText(char[], int, int, float, float[]);
- public int breakText(java.lang.CharSequence, int, int, boolean, float, float[]);
- public int breakText(java.lang.String, boolean, float, float[]);
- public void clearShadowLayer();
- public float descent();
- public boolean equalsForTextMeasurement(android.graphics.Paint);
- public int getAlpha();
- public int getBidiFlags();
- public int getColor();
- public android.graphics.ColorFilter getColorFilter();
- public boolean getFillPath(android.graphics.Path, android.graphics.Path);
- public int getFlags();
- public java.lang.String getFontFeatureSettings();
- public float getFontMetrics(android.graphics.Paint$FontMetrics);
- public android.graphics.Paint$FontMetrics getFontMetrics();
- public int getFontMetricsInt(android.graphics.Paint$FontMetricsInt);
- public android.graphics.Paint$FontMetricsInt getFontMetricsInt();
- public float getFontSpacing();
- public java.lang.String getFontVariationSettings();
- public int getHinting();
- public int getHyphenEdit();
- public float getLetterSpacing();
- public android.graphics.MaskFilter getMaskFilter();
- public long getNativeInstance();
- public int getOffsetForAdvance(char[], int, int, int, int, boolean, float);
- public int getOffsetForAdvance(java.lang.CharSequence, int, int, int, int, boolean, float);
- public android.graphics.PathEffect getPathEffect();
- public android.graphics.Rasterizer getRasterizer();
- public float getRunAdvance(char[], int, int, int, int, boolean, int);
- public float getRunAdvance(java.lang.CharSequence, int, int, int, int, boolean, int);
- public android.graphics.Shader getShader();
- public float getStrikeThruPosition();
- public float getStrikeThruThickness();
- public android.graphics.Paint$Cap getStrokeCap();
- public android.graphics.Paint$Join getStrokeJoin();
- public float getStrokeMiter();
- public float getStrokeWidth();
- public android.graphics.Paint$Style getStyle();
- public android.graphics.Paint$Align getTextAlign();
- public void getTextBounds(java.lang.String, int, int, android.graphics.Rect);
- public void getTextBounds(java.lang.CharSequence, int, int, android.graphics.Rect);
- public void getTextBounds(char[], int, int, android.graphics.Rect);
- public java.util.Locale getTextLocale();
- public android.os.LocaleList getTextLocales();
- public void getTextPath(char[], int, int, float, float, android.graphics.Path);
- public void getTextPath(java.lang.String, int, int, float, float, android.graphics.Path);
- public float getTextRunAdvances(char[], int, int, int, int, boolean, float[], int);
- public float getTextRunAdvances(java.lang.CharSequence, int, int, int, int, boolean, float[], int);
- public float getTextRunAdvances(java.lang.String, int, int, int, int, boolean, float[], int);
- public int getTextRunCursor(char[], int, int, int, int, int);
- public int getTextRunCursor(java.lang.CharSequence, int, int, int, int, int);
- public int getTextRunCursor(java.lang.String, int, int, int, int, int);
- public float getTextScaleX();
- public float getTextSize();
- public float getTextSkewX();
- public int getTextWidths(char[], int, int, float[]);
- public int getTextWidths(java.lang.CharSequence, int, int, float[]);
- public int getTextWidths(java.lang.String, int, int, float[]);
- public int getTextWidths(java.lang.String, float[]);
- public android.graphics.Typeface getTypeface();
- public float getUnderlinePosition();
- public float getUnderlineThickness();
- public float getWordSpacing();
- public android.graphics.Xfermode getXfermode();
- public boolean hasEqualAttributes(android.graphics.Paint);
- public boolean hasGlyph(java.lang.String);
- public boolean hasShadowLayer();
- public boolean isAntiAlias();
- public boolean isDither();
- public boolean isElegantTextHeight();
- public boolean isFakeBoldText();
- public boolean isFilterBitmap();
- public boolean isLinearText();
- public boolean isStrikeThruText();
- public boolean isSubpixelText();
- public boolean isUnderlineText();
- public float measureText(char[], int, int);
- public float measureText(java.lang.String, int, int);
- public float measureText(java.lang.String);
- public float measureText(java.lang.CharSequence, int, int);
- public void reset();
- public void set(android.graphics.Paint);
- public void setARGB(int, int, int, int);
- public void setAlpha(int);
- public void setAntiAlias(boolean);
- public void setBidiFlags(int);
- public void setColor(int);
- public android.graphics.ColorFilter setColorFilter(android.graphics.ColorFilter);
- public void setCompatibilityScaling(float);
- public void setDither(boolean);
- public void setElegantTextHeight(boolean);
- public void setFakeBoldText(boolean);
- public void setFilterBitmap(boolean);
- public void setFlags(int);
- public void setFontFeatureSettings(java.lang.String);
- public boolean setFontVariationSettings(java.lang.String);
- public void setHinting(int);
- public void setHyphenEdit(int);
- public void setLetterSpacing(float);
- public void setLinearText(boolean);
- public android.graphics.MaskFilter setMaskFilter(android.graphics.MaskFilter);
- public android.graphics.PathEffect setPathEffect(android.graphics.PathEffect);
- public android.graphics.Rasterizer setRasterizer(android.graphics.Rasterizer);
- public android.graphics.Shader setShader(android.graphics.Shader);
- public void setShadowLayer(float, float, float, int);
- public void setStrikeThruText(boolean);
- public void setStrokeCap(android.graphics.Paint$Cap);
- public void setStrokeJoin(android.graphics.Paint$Join);
- public void setStrokeMiter(float);
- public void setStrokeWidth(float);
- public void setStyle(android.graphics.Paint$Style);
- public void setSubpixelText(boolean);
- public void setTextAlign(android.graphics.Paint$Align);
- public void setTextLocale(java.util.Locale);
- public void setTextLocales(android.os.LocaleList);
- public void setTextScaleX(float);
- public void setTextSize(float);
- public void setTextSkewX(float);
- public android.graphics.Typeface setTypeface(android.graphics.Typeface);
- public void setUnderlineText(boolean);
- public void setWordSpacing(float);
- public android.graphics.Xfermode setXfermode(android.graphics.Xfermode);
-
-
- public static int ANTI_ALIAS_FLAG;
- public static int AUTO_HINTING_TEXT_FLAG;
- public static int BIDI_DEFAULT_LTR;
- public static int BIDI_DEFAULT_RTL;
- public static int BIDI_FORCE_LTR;
- public static int BIDI_FORCE_RTL;
- public static int BIDI_LTR;
- public static int BIDI_RTL;
- public static int CURSOR_AFTER;
- public static int CURSOR_AT;
- public static int CURSOR_AT_OR_AFTER;
- public static int CURSOR_AT_OR_BEFORE;
- public static int CURSOR_BEFORE;
- public static int DEV_KERN_TEXT_FLAG;
- public static int DIRECTION_LTR;
- public static int DIRECTION_RTL;
- public static int DITHER_FLAG;
- public static int EMBEDDED_BITMAP_TEXT_FLAG;
- public static int FAKE_BOLD_TEXT_FLAG;
- public static int FILTER_BITMAP_FLAG;
- public static int HINTING_OFF;
- public static int HINTING_ON;
- public static int HYPHENEDIT_MASK_END_OF_LINE;
- public static int HYPHENEDIT_MASK_START_OF_LINE;
- public static int LCD_RENDER_TEXT_FLAG;
- public static int LINEAR_TEXT_FLAG;
- public static int STRIKE_THRU_TEXT_FLAG;
- public static int SUBPIXEL_TEXT_FLAG;
- public static int UNDERLINE_TEXT_FLAG;
- public static int VERTICAL_TEXT_FLAG;
- public int mBidiFlags;
-}
-
--keep class android.graphics.Paint$Align {
-
- public static android.graphics.Paint$Align valueOf(java.lang.String);
- public static android.graphics.Paint$Align[] values();
-
- public static android.graphics.Paint$Align CENTER;
- public static android.graphics.Paint$Align LEFT;
- public static android.graphics.Paint$Align RIGHT;
-
-}
-
--keep class android.graphics.Paint$Cap {
-
- public static android.graphics.Paint$Cap valueOf(java.lang.String);
- public static android.graphics.Paint$Cap[] values();
-
- public static android.graphics.Paint$Cap BUTT;
- public static android.graphics.Paint$Cap ROUND;
- public static android.graphics.Paint$Cap SQUARE;
-
-}
-
--keep class android.graphics.Paint$FontMetrics {
- <init>();
-
-
-
- public float ascent;
- public float bottom;
- public float descent;
- public float leading;
- public float top;
-}
-
--keep class android.graphics.Paint$FontMetricsInt {
- <init>();
-
- public java.lang.String toString();
-
-
- public int ascent;
- public int bottom;
- public int descent;
- public int leading;
- public int top;
-}
-
--keep class android.graphics.Paint$Join {
-
- public static android.graphics.Paint$Join valueOf(java.lang.String);
- public static android.graphics.Paint$Join[] values();
-
- public static android.graphics.Paint$Join BEVEL;
- public static android.graphics.Paint$Join MITER;
- public static android.graphics.Paint$Join ROUND;
-
-}
-
--keep class android.graphics.Paint$Style {
-
- public static android.graphics.Paint$Style valueOf(java.lang.String);
- public static android.graphics.Paint$Style[] values();
-
- public static android.graphics.Paint$Style FILL;
- public static android.graphics.Paint$Style FILL_AND_STROKE;
- public static android.graphics.Paint$Style STROKE;
-
-}
-
--keep class android.graphics.Path {
- <init>();
- <init>(android.graphics.Path);
-
- public void addArc(android.graphics.RectF, float, float);
- public void addArc(float, float, float, float, float, float);
- public void addCircle(float, float, float, android.graphics.Path$Direction);
- public void addOval(android.graphics.RectF, android.graphics.Path$Direction);
- public void addOval(float, float, float, float, android.graphics.Path$Direction);
- public void addPath(android.graphics.Path, float, float);
- public void addPath(android.graphics.Path);
- public void addPath(android.graphics.Path, android.graphics.Matrix);
- public void addRect(android.graphics.RectF, android.graphics.Path$Direction);
- public void addRect(float, float, float, float, android.graphics.Path$Direction);
- public void addRoundRect(android.graphics.RectF, float, float, android.graphics.Path$Direction);
- public void addRoundRect(float, float, float, float, float, float, android.graphics.Path$Direction);
- public void addRoundRect(android.graphics.RectF, float[], android.graphics.Path$Direction);
- public void addRoundRect(float, float, float, float, float[], android.graphics.Path$Direction);
- public float[] approximate(float);
- public void arcTo(android.graphics.RectF, float, float, boolean);
- public void arcTo(android.graphics.RectF, float, float);
- public void arcTo(float, float, float, float, float, float, boolean);
- public void close();
- public void computeBounds(android.graphics.RectF, boolean);
- public void cubicTo(float, float, float, float, float, float);
- public android.graphics.Path$FillType getFillType();
- public void incReserve(int);
- public boolean isConvex();
- public boolean isEmpty();
- public boolean isInverseFillType();
- public boolean isRect(android.graphics.RectF);
- public void lineTo(float, float);
- public void moveTo(float, float);
- public void offset(float, float, android.graphics.Path);
- public void offset(float, float);
- public boolean op(android.graphics.Path, android.graphics.Path$Op);
- public boolean op(android.graphics.Path, android.graphics.Path, android.graphics.Path$Op);
- public void quadTo(float, float, float, float);
- public void rCubicTo(float, float, float, float, float, float);
- public void rLineTo(float, float);
- public void rMoveTo(float, float);
- public void rQuadTo(float, float, float, float);
- public long readOnlyNI();
- public void reset();
- public void rewind();
- public void set(android.graphics.Path);
- public void setFillType(android.graphics.Path$FillType);
- public void setLastPoint(float, float);
- public void toggleInverseFillType();
- public void transform(android.graphics.Matrix, android.graphics.Path);
- public void transform(android.graphics.Matrix);
-
-
- public boolean isSimplePath;
- public long mNativePath;
- public android.graphics.Region rects;
-}
-
--keep class android.graphics.Path$Direction {
-
- public static android.graphics.Path$Direction valueOf(java.lang.String);
- public static android.graphics.Path$Direction[] values();
-
- public static android.graphics.Path$Direction CCW;
- public static android.graphics.Path$Direction CW;
-
-}
-
--keep class android.graphics.Path$FillType {
-
- public static android.graphics.Path$FillType valueOf(java.lang.String);
- public static android.graphics.Path$FillType[] values();
-
- public static android.graphics.Path$FillType EVEN_ODD;
- public static android.graphics.Path$FillType INVERSE_EVEN_ODD;
- public static android.graphics.Path$FillType INVERSE_WINDING;
- public static android.graphics.Path$FillType WINDING;
-
-}
-
--keep class android.graphics.Path$Op {
-
- public static android.graphics.Path$Op valueOf(java.lang.String);
- public static android.graphics.Path$Op[] values();
-
- public static android.graphics.Path$Op DIFFERENCE;
- public static android.graphics.Path$Op INTERSECT;
- public static android.graphics.Path$Op REVERSE_DIFFERENCE;
- public static android.graphics.Path$Op UNION;
- public static android.graphics.Path$Op XOR;
-
-}
-
--keep class android.graphics.PathEffect {
- <init>();
-
- protected void finalize();
-
-
-}
-
--keep class android.graphics.Picture {
- <init>();
- <init>(android.graphics.Picture);
-
- public android.graphics.Canvas beginRecording(int, int);
- public static android.graphics.Picture createFromStream(java.io.InputStream);
- public void draw(android.graphics.Canvas);
- public void endRecording();
- protected void finalize();
- public int getHeight();
- public int getWidth();
- public boolean requiresHardwareAcceleration();
- public void writeToStream(java.io.OutputStream);
-
-
-}
-
--keep class android.graphics.Point {
- <init>();
- <init>(int, int);
- <init>(android.graphics.Point);
-
- public int describeContents();
- public boolean equals(int, int);
- public boolean equals(java.lang.Object);
- public int hashCode();
- public void negate();
- public void offset(int, int);
- public void printShortString(java.io.PrintWriter);
- public void readFromParcel(android.os.Parcel);
- public void set(int, int);
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
- public void writeToProto(android.util.proto.ProtoOutputStream, long);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public int x;
- public int y;
-}
-
--keep class android.graphics.PointF {
- <init>();
- <init>(float, float);
- <init>(android.graphics.Point);
-
- public int describeContents();
- public boolean equals(float, float);
- public boolean equals(java.lang.Object);
- public int hashCode();
- public float length();
- public static float length(float, float);
- public void negate();
- public void offset(float, float);
- public void readFromParcel(android.os.Parcel);
- public void set(float, float);
- public void set(android.graphics.PointF);
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public float x;
- public float y;
-}
-
--keep class android.graphics.PorterDuff {
- <init>();
-
- public static android.graphics.PorterDuff$Mode intToMode(int);
- public static int modeToInt(android.graphics.PorterDuff$Mode);
-
-
-}
-
--keep class android.graphics.PorterDuff$Mode {
-
- public static android.graphics.PorterDuff$Mode valueOf(java.lang.String);
- public static android.graphics.PorterDuff$Mode[] values();
-
- public static android.graphics.PorterDuff$Mode ADD;
- public static android.graphics.PorterDuff$Mode CLEAR;
- public static android.graphics.PorterDuff$Mode DARKEN;
- public static android.graphics.PorterDuff$Mode DST;
- public static android.graphics.PorterDuff$Mode DST_ATOP;
- public static android.graphics.PorterDuff$Mode DST_IN;
- public static android.graphics.PorterDuff$Mode DST_OUT;
- public static android.graphics.PorterDuff$Mode DST_OVER;
- public static android.graphics.PorterDuff$Mode LIGHTEN;
- public static android.graphics.PorterDuff$Mode MULTIPLY;
- public static android.graphics.PorterDuff$Mode OVERLAY;
- public static android.graphics.PorterDuff$Mode SCREEN;
- public static android.graphics.PorterDuff$Mode SRC;
- public static android.graphics.PorterDuff$Mode SRC_ATOP;
- public static android.graphics.PorterDuff$Mode SRC_IN;
- public static android.graphics.PorterDuff$Mode SRC_OUT;
- public static android.graphics.PorterDuff$Mode SRC_OVER;
- public static android.graphics.PorterDuff$Mode XOR;
-
- public int nativeInt;
-}
-
--keep class android.graphics.Rasterizer {
- <init>();
-
- protected void finalize();
-
-
-}
-
--keep class android.graphics.Rect {
- <init>();
- <init>(int, int, int, int);
- <init>(android.graphics.Rect);
-
- public int centerX();
- public int centerY();
- public boolean contains(int, int);
- public boolean contains(int, int, int, int);
- public boolean contains(android.graphics.Rect);
- public static android.graphics.Rect copyOrNull(android.graphics.Rect);
- public int describeContents();
- public boolean equals(java.lang.Object);
- public float exactCenterX();
- public float exactCenterY();
- public java.lang.String flattenToString();
- public int hashCode();
- public int height();
- public void inset(int, int);
- public void inset(android.graphics.Rect);
- public void inset(int, int, int, int);
- public boolean intersect(int, int, int, int);
- public boolean intersect(android.graphics.Rect);
- public void intersectUnchecked(android.graphics.Rect);
- public boolean intersects(int, int, int, int);
- public static boolean intersects(android.graphics.Rect, android.graphics.Rect);
- public boolean isEmpty();
- public void offset(int, int);
- public void offsetTo(int, int);
- public void printShortString(java.io.PrintWriter);
- public void readFromParcel(android.os.Parcel);
- public void scale(float);
- public void set(int, int, int, int);
- public void set(android.graphics.Rect);
- public void setEmpty();
- public boolean setIntersect(android.graphics.Rect, android.graphics.Rect);
- public void sort();
- public java.lang.String toShortString();
- public java.lang.String toShortString(java.lang.StringBuilder);
- public java.lang.String toString();
- public static android.graphics.Rect unflattenFromString(java.lang.String);
- public void union(int, int, int, int);
- public void union(android.graphics.Rect);
- public void union(int, int);
- public int width();
- public void writeToParcel(android.os.Parcel, int);
- public void writeToProto(android.util.proto.ProtoOutputStream, long);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public int bottom;
- public int left;
- public int right;
- public int top;
-}
-
--keep class android.graphics.RectF {
- <init>();
- <init>(float, float, float, float);
- <init>(android.graphics.RectF);
- <init>(android.graphics.Rect);
-
- public float centerX();
- public float centerY();
- public boolean contains(float, float);
- public boolean contains(float, float, float, float);
- public boolean contains(android.graphics.RectF);
- public int describeContents();
- public boolean equals(java.lang.Object);
- public int hashCode();
- public float height();
- public void inset(float, float);
- public boolean intersect(float, float, float, float);
- public boolean intersect(android.graphics.RectF);
- public boolean intersects(float, float, float, float);
- public static boolean intersects(android.graphics.RectF, android.graphics.RectF);
- public boolean isEmpty();
- public void offset(float, float);
- public void offsetTo(float, float);
- public void printShortString(java.io.PrintWriter);
- public void readFromParcel(android.os.Parcel);
- public void round(android.graphics.Rect);
- public void roundOut(android.graphics.Rect);
- public void scale(float);
- public void set(float, float, float, float);
- public void set(android.graphics.RectF);
- public void set(android.graphics.Rect);
- public void setEmpty();
- public boolean setIntersect(android.graphics.RectF, android.graphics.RectF);
- public void sort();
- public java.lang.String toShortString();
- public java.lang.String toShortString(java.lang.StringBuilder);
- public java.lang.String toString();
- public void union(float, float, float, float);
- public void union(android.graphics.RectF);
- public void union(float, float);
- public float width();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public float bottom;
- public float left;
- public float right;
- public float top;
-}
-
--keep class android.graphics.Region {
- <init>();
- <init>(android.graphics.Region);
- <init>(android.graphics.Rect);
- <init>(int, int, int, int);
-
- public boolean contains(int, int);
- public int describeContents();
- public boolean equals(java.lang.Object);
- protected void finalize();
- public android.graphics.Path getBoundaryPath();
- public boolean getBoundaryPath(android.graphics.Path);
- public android.graphics.Rect getBounds();
- public boolean getBounds(android.graphics.Rect);
- public boolean isComplex();
- public boolean isEmpty();
- public boolean isRect();
- public static android.graphics.Region obtain();
- public static android.graphics.Region obtain(android.graphics.Region);
- public boolean op(android.graphics.Rect, android.graphics.Region$Op);
- public boolean op(int, int, int, int, android.graphics.Region$Op);
- public boolean op(android.graphics.Region, android.graphics.Region$Op);
- public boolean op(android.graphics.Rect, android.graphics.Region, android.graphics.Region$Op);
- public boolean op(android.graphics.Region, android.graphics.Region, android.graphics.Region$Op);
- public boolean quickContains(android.graphics.Rect);
- public boolean quickContains(int, int, int, int);
- public boolean quickReject(android.graphics.Rect);
- public boolean quickReject(int, int, int, int);
- public boolean quickReject(android.graphics.Region);
- public void recycle();
- public void scale(float);
- public void scale(float, android.graphics.Region);
- public boolean set(android.graphics.Region);
- public boolean set(android.graphics.Rect);
- public boolean set(int, int, int, int);
- public void setEmpty();
- public boolean setPath(android.graphics.Path, android.graphics.Region);
- public java.lang.String toString();
- public void translate(int, int);
- public void translate(int, int, android.graphics.Region);
- public boolean union(android.graphics.Rect);
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public long mNativeRegion;
-}
-
--keep class android.graphics.Region$Op {
-
- public static android.graphics.Region$Op valueOf(java.lang.String);
- public static android.graphics.Region$Op[] values();
-
- public static android.graphics.Region$Op DIFFERENCE;
- public static android.graphics.Region$Op INTERSECT;
- public static android.graphics.Region$Op REPLACE;
- public static android.graphics.Region$Op REVERSE_DIFFERENCE;
- public static android.graphics.Region$Op UNION;
- public static android.graphics.Region$Op XOR;
-
- public int nativeInt;
-}
-
--keep class android.graphics.Shader {
- <init>();
-
- protected android.graphics.Shader copy();
- protected void copyLocalMatrix(android.graphics.Shader);
- protected void discardNativeInstance();
- public boolean getLocalMatrix(android.graphics.Matrix);
- public long getNativeInstance();
- public void setLocalMatrix(android.graphics.Matrix);
- protected void verifyNativeInstance();
-
-
-}
-
--keep class android.graphics.SurfaceTexture {
- <init>(int);
- <init>(int, boolean);
- <init>(boolean);
-
- public void attachToGLContext(int);
- public void detachFromGLContext();
- protected void finalize();
- public long getTimestamp();
- public void getTransformMatrix(float[]);
- public boolean isReleased();
- public boolean isSingleBuffered();
- public void release();
- public void releaseTexImage();
- public void setDefaultBufferSize(int, int);
- public void setOnFrameAvailableListener(android.graphics.SurfaceTexture$OnFrameAvailableListener);
- public void setOnFrameAvailableListener(android.graphics.SurfaceTexture$OnFrameAvailableListener, android.os.Handler);
- public void updateTexImage();
-
-
-}
-
--keep class android.graphics.SurfaceTexture$OnFrameAvailableListener {
-
- public abstract void onFrameAvailable(android.graphics.SurfaceTexture);
-
-
-}
-
--keep class android.graphics.Typeface {
-
- public static void buildSystemFallback(java.lang.String, java.lang.String, android.util.ArrayMap, android.util.ArrayMap);
- public static android.graphics.Typeface create(java.lang.String, int);
- public static android.graphics.Typeface create(android.graphics.Typeface, int);
- public static android.graphics.Typeface create(android.graphics.Typeface, int, boolean);
- public static android.graphics.Typeface createFromAsset(android.content.res.AssetManager, java.lang.String);
- public static android.graphics.Typeface createFromFile(java.io.File);
- public static android.graphics.Typeface createFromFile(java.lang.String);
- public static android.graphics.Typeface createFromResources(android.content.res.AssetManager, java.lang.String, int);
- public static android.graphics.Typeface createFromResources(android.content.res.FontResourcesParser$FamilyResourceEntry, android.content.res.AssetManager, java.lang.String);
- public static android.graphics.Typeface createFromTypefaceWithVariation(android.graphics.Typeface, java.util.List);
- public static android.graphics.Typeface defaultFromStyle(int);
- public boolean equals(java.lang.Object);
- public static android.graphics.Typeface findFromCache(android.content.res.AssetManager, java.lang.String);
- public int getStyle();
- public int getWeight();
- public int hashCode();
- public boolean isBold();
- public boolean isItalic();
- public boolean isSupportedAxes(int);
-
-
- public static int BOLD;
- public static int BOLD_ITALIC;
- public static android.graphics.Typeface DEFAULT;
- public static android.graphics.Typeface DEFAULT_BOLD;
- public static int ITALIC;
- public static int MAX_WEIGHT;
- public static android.graphics.Typeface MONOSPACE;
- public static int NORMAL;
- public static int RESOLVE_BY_FONT_TABLE;
- public static android.graphics.Typeface SANS_SERIF;
- public static android.graphics.Typeface SERIF;
- public static int STYLE_MASK;
- public long native_instance;
-}
-
--keep class android.graphics.Xfermode {
- <init>();
-
-
-
-}
-
--keep class android.graphics.drawable.Animatable2 {
-
- public abstract void clearAnimationCallbacks();
- public abstract void registerAnimationCallback(android.graphics.drawable.Animatable2$AnimationCallback);
- public abstract boolean unregisterAnimationCallback(android.graphics.drawable.Animatable2$AnimationCallback);
-
-
-}
-
--keep class android.graphics.drawable.Animatable2$AnimationCallback {
- <init>();
-
- public void onAnimationEnd(android.graphics.drawable.Drawable);
- public void onAnimationStart(android.graphics.drawable.Drawable);
-
-
-}
-
--keep class android.graphics.drawable.AnimatedVectorDrawable {
- <init>();
-
- public void applyTheme(android.content.res.Resources$Theme);
- public boolean canApplyTheme();
- public boolean canReverse();
- public void clearAnimationCallbacks();
- public void clearMutated();
- public void draw(android.graphics.Canvas);
- public void forceAnimationOnUI();
- public int getAlpha();
- public int getChangingConfigurations();
- public android.graphics.ColorFilter getColorFilter();
- public android.graphics.drawable.Drawable$ConstantState getConstantState();
- public int getIntrinsicHeight();
- public int getIntrinsicWidth();
- public int getOpacity();
- public android.graphics.Insets getOpticalInsets();
- public void getOutline(android.graphics.Outline);
- public void inflate(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources$Theme);
- public boolean isRunning();
- public boolean isStateful();
- public android.graphics.drawable.Drawable mutate();
- protected void onBoundsChange(android.graphics.Rect);
- public boolean onLayoutDirectionChanged(int);
- protected boolean onLevelChange(int);
- protected boolean onStateChange(int[]);
- public void registerAnimationCallback(android.graphics.drawable.Animatable2$AnimationCallback);
- public void reset();
- public void reverse();
- public void setAlpha(int);
- public void setColorFilter(android.graphics.ColorFilter);
- public void setHotspot(float, float);
- public void setHotspotBounds(int, int, int, int);
- public void setTintList(android.content.res.ColorStateList);
- public void setTintMode(android.graphics.PorterDuff$Mode);
- public boolean setVisible(boolean, boolean);
- public void start();
- public void stop();
- public boolean unregisterAnimationCallback(android.graphics.drawable.Animatable2$AnimationCallback);
-
-
-}
-
--keep class android.graphics.drawable.AnimatedVectorDrawable$VectorDrawableAnimatorRT {
-
- public boolean canReverse();
- public void end();
- public long getAnimatorNativePtr();
- public void init(android.animation.AnimatorSet);
- public boolean isInfinite();
- public boolean isRunning();
- public boolean isStarted();
- public void onDraw(android.graphics.Canvas);
- public void pause();
- protected void recordLastSeenTarget(android.view.DisplayListCanvas);
- public void removeListener(android.animation.Animator$AnimatorListener);
- public void reset();
- public void resume();
- public void reverse();
- public void setListener(android.animation.Animator$AnimatorListener);
- public void start();
-
-
-}
-
--keep class android.graphics.drawable.Drawable {
- <init>();
-
- public void applyTheme(android.content.res.Resources$Theme);
- public boolean canApplyTheme();
- public void clearColorFilter();
- public void clearMutated();
- public void copyBounds(android.graphics.Rect);
- public android.graphics.Rect copyBounds();
- public static android.graphics.drawable.Drawable createFromPath(java.lang.String);
- public static android.graphics.drawable.Drawable createFromResourceStream(android.content.res.Resources, android.util.TypedValue, java.io.InputStream, java.lang.String);
- public static android.graphics.drawable.Drawable createFromResourceStream(android.content.res.Resources, android.util.TypedValue, java.io.InputStream, java.lang.String, android.graphics.BitmapFactory$Options);
- public static android.graphics.drawable.Drawable createFromStream(java.io.InputStream, java.lang.String);
- public static android.graphics.drawable.Drawable createFromXml(android.content.res.Resources, org.xmlpull.v1.XmlPullParser);
- public static android.graphics.drawable.Drawable createFromXml(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.content.res.Resources$Theme);
- public static android.graphics.drawable.Drawable createFromXmlForDensity(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, int, android.content.res.Resources$Theme);
- public static android.graphics.drawable.Drawable createFromXmlInner(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet);
- public static android.graphics.drawable.Drawable createFromXmlInner(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources$Theme);
- public abstract void draw(android.graphics.Canvas);
- public int getAlpha();
- public android.graphics.Rect getBounds();
- public android.graphics.drawable.Drawable$Callback getCallback();
- public int getChangingConfigurations();
- public android.graphics.ColorFilter getColorFilter();
- public android.graphics.drawable.Drawable$ConstantState getConstantState();
- public android.graphics.drawable.Drawable getCurrent();
- public android.graphics.Rect getDirtyBounds();
- public void getHotspotBounds(android.graphics.Rect);
- public int getIntrinsicHeight();
- public int getIntrinsicWidth();
- public int getLayoutDirection();
- public int getLevel();
- public int getMinimumHeight();
- public int getMinimumWidth();
- public abstract int getOpacity();
- public android.graphics.Insets getOpticalInsets();
- public void getOutline(android.graphics.Outline);
- public boolean getPadding(android.graphics.Rect);
- public int[] getState();
- public android.graphics.Region getTransparentRegion();
- public boolean hasFocusStateSpecified();
- public void inflate(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet);
- public void inflate(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources$Theme);
- public void invalidateSelf();
- public boolean isAutoMirrored();
- public boolean isFilterBitmap();
- public boolean isProjected();
- public boolean isStateful();
- public boolean isVisible();
- public void jumpToCurrentState();
- public android.graphics.drawable.Drawable mutate();
- protected static android.content.res.TypedArray obtainAttributes(android.content.res.Resources, android.content.res.Resources$Theme, android.util.AttributeSet, int[]);
- protected void onBoundsChange(android.graphics.Rect);
- public boolean onLayoutDirectionChanged(int);
- protected boolean onLevelChange(int);
- protected boolean onStateChange(int[]);
- public static android.graphics.PorterDuff$Mode parseTintMode(int, android.graphics.PorterDuff$Mode);
- public static int resolveOpacity(int, int);
- public void scheduleSelf(java.lang.Runnable, long);
- public abstract void setAlpha(int);
- public void setAutoMirrored(boolean);
- public void setBounds(int, int, int, int);
- public void setBounds(android.graphics.Rect);
- public void setCallback(android.graphics.drawable.Drawable$Callback);
- public void setChangingConfigurations(int);
- public abstract void setColorFilter(android.graphics.ColorFilter);
- public void setColorFilter(int, android.graphics.PorterDuff$Mode);
- public void setDither(boolean);
- public void setFilterBitmap(boolean);
- public void setHotspot(float, float);
- public void setHotspotBounds(int, int, int, int);
- public boolean setLayoutDirection(int);
- public boolean setLevel(int);
- public boolean setState(int[]);
- public void setTint(int);
- public void setTintList(android.content.res.ColorStateList);
- public void setTintMode(android.graphics.PorterDuff$Mode);
- public boolean setVisible(boolean, boolean);
- public void setXfermode(android.graphics.Xfermode);
- public void unscheduleSelf(java.lang.Runnable);
-
-
- protected int mSrcDensityOverride;
-}
-
--keep class android.graphics.drawable.Drawable$Callback {
-
- public abstract void invalidateDrawable(android.graphics.drawable.Drawable);
- public abstract void scheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable, long);
- public abstract void unscheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable);
-
-
-}
-
--keep class android.graphics.drawable.Drawable$ConstantState {
- <init>();
-
- public boolean canApplyTheme();
- public abstract int getChangingConfigurations();
- public abstract android.graphics.drawable.Drawable newDrawable();
- public android.graphics.drawable.Drawable newDrawable(android.content.res.Resources);
- public android.graphics.drawable.Drawable newDrawable(android.content.res.Resources, android.content.res.Resources$Theme);
-
-
-}
-
--keep class android.graphics.drawable.DrawableInflater {
- <init>(android.content.res.Resources, java.lang.ClassLoader);
-
- public android.graphics.drawable.Drawable inflateFromXml(java.lang.String, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources$Theme);
- public static android.graphics.drawable.Drawable loadDrawable(android.content.Context, int);
- public static android.graphics.drawable.Drawable loadDrawable(android.content.res.Resources, android.content.res.Resources$Theme, int);
-
-
-}
-
--keep class android.graphics.drawable.Icon {
-
- public void convertToAshmem();
- public static android.graphics.drawable.Icon createFromStream(java.io.InputStream);
- public static android.graphics.drawable.Icon createWithAdaptiveBitmap(android.graphics.Bitmap);
- public static android.graphics.drawable.Icon createWithBitmap(android.graphics.Bitmap);
- public static android.graphics.drawable.Icon createWithContentUri(java.lang.String);
- public static android.graphics.drawable.Icon createWithContentUri(android.net.Uri);
- public static android.graphics.drawable.Icon createWithData(byte[], int, int);
- public static android.graphics.drawable.Icon createWithFilePath(java.lang.String);
- public static android.graphics.drawable.Icon createWithResource(android.content.Context, int);
- public static android.graphics.drawable.Icon createWithResource(android.content.res.Resources, int);
- public static android.graphics.drawable.Icon createWithResource(java.lang.String, int);
- public int describeContents();
- public android.graphics.Bitmap getBitmap();
- public byte[] getDataBytes();
- public int getDataLength();
- public int getDataOffset();
- public int getResId();
- public java.lang.String getResPackage();
- public android.content.res.Resources getResources();
- public int getType();
- public android.net.Uri getUri();
- public java.lang.String getUriString();
- public boolean hasTint();
- public android.graphics.drawable.Drawable loadDrawable(android.content.Context);
- public android.graphics.drawable.Drawable loadDrawableAsUser(android.content.Context, int);
- public void loadDrawableAsync(android.content.Context, android.os.Message);
- public void loadDrawableAsync(android.content.Context, android.graphics.drawable.Icon$OnDrawableLoadedListener, android.os.Handler);
- public boolean sameAs(android.graphics.drawable.Icon);
- public static android.graphics.Bitmap scaleDownIfNecessary(android.graphics.Bitmap, int, int);
- public void scaleDownIfNecessary(int, int);
- public android.graphics.drawable.Icon setTint(int);
- public android.graphics.drawable.Icon setTintList(android.content.res.ColorStateList);
- public android.graphics.drawable.Icon setTintMode(android.graphics.PorterDuff$Mode);
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
- public void writeToStream(java.io.OutputStream);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public static int MIN_ASHMEM_ICON_SIZE;
- public static int TYPE_ADAPTIVE_BITMAP;
- public static int TYPE_BITMAP;
- public static int TYPE_DATA;
- public static int TYPE_RESOURCE;
- public static int TYPE_URI;
-}
-
--keep class android.graphics.drawable.Icon$OnDrawableLoadedListener {
-
- public abstract void onDrawableLoaded(android.graphics.drawable.Drawable);
-
-
-}
-
--keep class android.graphics.fonts.FontVariationAxis {
- <init>(java.lang.String, float);
-
- public static android.graphics.fonts.FontVariationAxis[] fromFontVariationSettings(java.lang.String);
- public int getOpenTypeTagValue();
- public float getStyleValue();
- public java.lang.String getTag();
- public static int makeTag(java.lang.String);
- public static java.lang.String toFontVariationSettings(android.graphics.fonts.FontVariationAxis[]);
- public java.lang.String toString();
-
-
-}
-
--keep class android.hardware.display.AmbientBrightnessDayStats {
- <init>(java.time.LocalDate, float[]);
- <init>(java.time.LocalDate, float[], float[]);
-
- public int describeContents();
- public boolean equals(java.lang.Object);
- public float[] getBucketBoundaries();
- public java.time.LocalDate getLocalDate();
- public float[] getStats();
- public int hashCode();
- public void log(float, float);
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.hardware.display.BrightnessChangeEvent {
- <init>(android.hardware.display.BrightnessChangeEvent, boolean);
-
- public int describeContents();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public float batteryLevel;
- public float brightness;
- public int colorTemperature;
- public boolean isDefaultBrightnessConfig;
- public boolean isUserSetBrightness;
- public float lastBrightness;
- public long[] luxTimestamps;
- public float[] luxValues;
- public boolean nightMode;
- public java.lang.String packageName;
- public float powerBrightnessFactor;
- public long timeStamp;
- public int userId;
-}
-
--keep class android.hardware.display.BrightnessConfiguration {
-
- public int describeContents();
- public boolean equals(java.lang.Object);
- public android.util.Pair getCurve();
- public java.lang.String getDescription();
- public int hashCode();
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.hardware.display.DisplayManager {
- <init>(android.content.Context);
-
- public void connectWifiDisplay(java.lang.String);
- public android.hardware.display.VirtualDisplay createVirtualDisplay(java.lang.String, int, int, int, android.view.Surface, int);
- public android.hardware.display.VirtualDisplay createVirtualDisplay(java.lang.String, int, int, int, android.view.Surface, int, android.hardware.display.VirtualDisplay$Callback, android.os.Handler);
- public android.hardware.display.VirtualDisplay createVirtualDisplay(android.media.projection.MediaProjection, java.lang.String, int, int, int, android.view.Surface, int, android.hardware.display.VirtualDisplay$Callback, android.os.Handler, java.lang.String);
- public void disconnectWifiDisplay();
- public void forgetWifiDisplay(java.lang.String);
- public java.util.List getAmbientBrightnessStats();
- public android.hardware.display.BrightnessConfiguration getBrightnessConfiguration();
- public android.hardware.display.BrightnessConfiguration getBrightnessConfigurationForUser(int);
- public java.util.List getBrightnessEvents();
- public android.hardware.display.BrightnessConfiguration getDefaultBrightnessConfiguration();
- public android.view.Display getDisplay(int);
- public android.view.Display[] getDisplays();
- public android.view.Display[] getDisplays(java.lang.String);
- public android.util.Pair getMinimumBrightnessCurve();
- public android.graphics.Point getStableDisplaySize();
- public android.hardware.display.WifiDisplayStatus getWifiDisplayStatus();
- public void pauseWifiDisplay();
- public void registerDisplayListener(android.hardware.display.DisplayManager$DisplayListener, android.os.Handler);
- public void renameWifiDisplay(java.lang.String, java.lang.String);
- public void resumeWifiDisplay();
- public void setBrightnessConfiguration(android.hardware.display.BrightnessConfiguration);
- public void setBrightnessConfigurationForUser(android.hardware.display.BrightnessConfiguration, int, java.lang.String);
- public void setSaturationLevel(float);
- public void setTemporaryAutoBrightnessAdjustment(float);
- public void setTemporaryBrightness(int);
- public void startWifiDisplayScan();
- public void stopWifiDisplayScan();
- public void unregisterDisplayListener(android.hardware.display.DisplayManager$DisplayListener);
-
-
- public static java.lang.String ACTION_WIFI_DISPLAY_STATUS_CHANGED;
- public static java.lang.String DISPLAY_CATEGORY_PRESENTATION;
- public static java.lang.String EXTRA_WIFI_DISPLAY_STATUS;
- public static int VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR;
- public static int VIRTUAL_DISPLAY_FLAG_CAN_SHOW_WITH_INSECURE_KEYGUARD;
- public static int VIRTUAL_DISPLAY_FLAG_DESTROY_CONTENT_ON_REMOVAL;
- public static int VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY;
- public static int VIRTUAL_DISPLAY_FLAG_PRESENTATION;
- public static int VIRTUAL_DISPLAY_FLAG_PUBLIC;
- public static int VIRTUAL_DISPLAY_FLAG_ROTATES_WITH_CONTENT;
- public static int VIRTUAL_DISPLAY_FLAG_SECURE;
- public static int VIRTUAL_DISPLAY_FLAG_SUPPORTS_TOUCH;
-}
-
--keep class android.hardware.display.DisplayManager$DisplayListener {
-
- public abstract void onDisplayAdded(int);
- public abstract void onDisplayChanged(int);
- public abstract void onDisplayRemoved(int);
-
-
-}
-
--keep class android.hardware.display.DisplayManagerGlobal {
-
- public void connectWifiDisplay(java.lang.String);
- public android.hardware.display.VirtualDisplay createVirtualDisplay(android.content.Context, android.media.projection.MediaProjection, java.lang.String, int, int, int, android.view.Surface, int, android.hardware.display.VirtualDisplay$Callback, android.os.Handler, java.lang.String);
- public void disconnectWifiDisplay();
- public void forgetWifiDisplay(java.lang.String);
- public java.util.List getAmbientBrightnessStats();
- public android.hardware.display.BrightnessConfiguration getBrightnessConfigurationForUser(int);
- public java.util.List getBrightnessEvents(java.lang.String);
- public android.view.Display getCompatibleDisplay(int, android.view.DisplayAdjustments);
- public android.view.Display getCompatibleDisplay(int, android.content.res.Resources);
- public android.hardware.display.BrightnessConfiguration getDefaultBrightnessConfiguration();
- public int[] getDisplayIds();
- public android.view.DisplayInfo getDisplayInfo(int);
- public static android.hardware.display.DisplayManagerGlobal getInstance();
- public android.util.Pair getMinimumBrightnessCurve();
- public android.view.Display getRealDisplay(int);
- public android.graphics.Point getStableDisplaySize();
- public android.hardware.display.WifiDisplayStatus getWifiDisplayStatus();
- public void pauseWifiDisplay();
- public void registerDisplayListener(android.hardware.display.DisplayManager$DisplayListener, android.os.Handler);
- public void releaseVirtualDisplay(android.hardware.display.IVirtualDisplayCallback);
- public void renameWifiDisplay(java.lang.String, java.lang.String);
- public void requestColorMode(int, int);
- public void resizeVirtualDisplay(android.hardware.display.IVirtualDisplayCallback, int, int, int);
- public void resumeWifiDisplay();
- public void setBrightnessConfigurationForUser(android.hardware.display.BrightnessConfiguration, int, java.lang.String);
- public void setSaturationLevel(float);
- public void setTemporaryAutoBrightnessAdjustment(float);
- public void setTemporaryBrightness(int);
- public void setVirtualDisplaySurface(android.hardware.display.IVirtualDisplayCallback, android.view.Surface);
- public void startWifiDisplayScan();
- public void stopWifiDisplayScan();
- public void unregisterDisplayListener(android.hardware.display.DisplayManager$DisplayListener);
-
-
- public static int EVENT_DISPLAY_ADDED;
- public static int EVENT_DISPLAY_CHANGED;
- public static int EVENT_DISPLAY_REMOVED;
-}
-
--keep class android.hardware.display.IVirtualDisplayCallback {
-
- public abstract void onPaused();
- public abstract void onResumed();
- public abstract void onStopped();
-
-
-}
-
--keep class android.hardware.display.VirtualDisplay {
-
- public android.view.Display getDisplay();
- public android.view.Surface getSurface();
- public void release();
- public void resize(int, int, int);
- public void setSurface(android.view.Surface);
- public java.lang.String toString();
-
-
-}
-
--keep class android.hardware.display.VirtualDisplay$Callback {
- <init>();
-
- public void onPaused();
- public void onResumed();
- public void onStopped();
-
-
-}
-
--keep class android.hardware.display.WifiDisplay {
- <init>(java.lang.String, java.lang.String, java.lang.String, boolean, boolean, boolean);
-
- public boolean canConnect();
- public int describeContents();
- public boolean equals(java.lang.Object);
- public boolean equals(android.hardware.display.WifiDisplay);
- public java.lang.String getDeviceAddress();
- public java.lang.String getDeviceAlias();
- public java.lang.String getDeviceName();
- public java.lang.String getFriendlyDisplayName();
- public boolean hasSameAddress(android.hardware.display.WifiDisplay);
- public int hashCode();
- public boolean isAvailable();
- public boolean isRemembered();
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public static android.hardware.display.WifiDisplay[] EMPTY_ARRAY;
-}
-
--keep class android.hardware.display.WifiDisplaySessionInfo {
- <init>();
- <init>(boolean, int, java.lang.String, java.lang.String, java.lang.String);
-
- public int describeContents();
- public java.lang.String getGroupId();
- public java.lang.String getIP();
- public java.lang.String getPassphrase();
- public int getSessionId();
- public boolean isClient();
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.hardware.display.WifiDisplayStatus {
- <init>();
- <init>(int, int, int, android.hardware.display.WifiDisplay, android.hardware.display.WifiDisplay[], android.hardware.display.WifiDisplaySessionInfo);
-
- public int describeContents();
- public android.hardware.display.WifiDisplay getActiveDisplay();
- public int getActiveDisplayState();
- public android.hardware.display.WifiDisplay[] getDisplays();
- public int getFeatureState();
- public int getScanState();
- public android.hardware.display.WifiDisplaySessionInfo getSessionInfo();
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public static int DISPLAY_STATE_CONNECTED;
- public static int DISPLAY_STATE_CONNECTING;
- public static int DISPLAY_STATE_NOT_CONNECTED;
- public static int FEATURE_STATE_DISABLED;
- public static int FEATURE_STATE_OFF;
- public static int FEATURE_STATE_ON;
- public static int FEATURE_STATE_UNAVAILABLE;
- public static int SCAN_STATE_NOT_SCANNING;
- public static int SCAN_STATE_SCANNING;
-}
-
--keep class android.hardware.input.InputDeviceIdentifier {
- <init>(java.lang.String, int, int);
-
- public int describeContents();
- public boolean equals(java.lang.Object);
- public java.lang.String getDescriptor();
- public int getProductId();
- public int getVendorId();
- public int hashCode();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.media.AudioAttributes {
-
- public java.lang.String contentTypeToString();
- public int describeContents();
- public boolean equals(java.lang.Object);
- public int getAllFlags();
- public android.os.Bundle getBundle();
- public int getCapturePreset();
- public int getContentType();
- public int getFlags();
- public java.util.Set getTags();
- public int getUsage();
- public int getVolumeControlStream();
- public int hashCode();
- public static int toLegacyStreamType(android.media.AudioAttributes);
- public java.lang.String toString();
- public java.lang.String usageToString();
- public static java.lang.String usageToString(int);
- public void writeToParcel(android.os.Parcel, int);
- public void writeToProto(android.util.proto.ProtoOutputStream, long);
-
-
- public static int CONTENT_TYPE_MOVIE;
- public static int CONTENT_TYPE_MUSIC;
- public static int CONTENT_TYPE_SONIFICATION;
- public static int CONTENT_TYPE_SPEECH;
- public static int CONTENT_TYPE_UNKNOWN;
- public static android.os.Parcelable$Creator CREATOR;
- public static int FLAG_AUDIBILITY_ENFORCED;
- public static int FLAG_BEACON;
- public static int FLAG_BYPASS_INTERRUPTION_POLICY;
- public static int FLAG_BYPASS_MUTE;
- public static int FLAG_DEEP_BUFFER;
- public static int FLAG_HW_AV_SYNC;
- public static int FLAG_HW_HOTWORD;
- public static int FLAG_LOW_LATENCY;
- public static int FLAG_SCO;
- public static int FLAG_SECURE;
- public static int FLATTEN_TAGS;
- public static int[] SDK_USAGES;
- public static int SUPPRESSIBLE_ALARM;
- public static int SUPPRESSIBLE_CALL;
- public static int SUPPRESSIBLE_MEDIA;
- public static int SUPPRESSIBLE_NEVER;
- public static int SUPPRESSIBLE_NOTIFICATION;
- public static int SUPPRESSIBLE_SYSTEM;
- public static android.util.SparseIntArray SUPPRESSIBLE_USAGES;
- public static int USAGE_ALARM;
- public static int USAGE_ASSISTANCE_ACCESSIBILITY;
- public static int USAGE_ASSISTANCE_NAVIGATION_GUIDANCE;
- public static int USAGE_ASSISTANCE_SONIFICATION;
- public static int USAGE_ASSISTANT;
- public static int USAGE_GAME;
- public static int USAGE_MEDIA;
- public static int USAGE_NOTIFICATION;
- public static int USAGE_NOTIFICATION_COMMUNICATION_DELAYED;
- public static int USAGE_NOTIFICATION_COMMUNICATION_INSTANT;
- public static int USAGE_NOTIFICATION_COMMUNICATION_REQUEST;
- public static int USAGE_NOTIFICATION_EVENT;
- public static int USAGE_NOTIFICATION_RINGTONE;
- public static int USAGE_UNKNOWN;
- public static int USAGE_VIRTUAL_SOURCE;
- public static int USAGE_VOICE_COMMUNICATION;
- public static int USAGE_VOICE_COMMUNICATION_SIGNALLING;
-}
-
--keep class android.media.AudioDeviceInfo {
-
- public static int convertDeviceTypeToInternalDevice(int);
- public static int convertInternalDeviceToDeviceType(int);
- public boolean equals(java.lang.Object);
- public java.lang.String getAddress();
- public int[] getChannelCounts();
- public int[] getChannelIndexMasks();
- public int[] getChannelMasks();
- public int[] getEncodings();
- public int getId();
- public android.media.AudioDevicePort getPort();
- public java.lang.CharSequence getProductName();
- public int[] getSampleRates();
- public int getType();
- public int hashCode();
- public boolean isSink();
- public boolean isSource();
-
-
- public static int TYPE_AUX_LINE;
- public static int TYPE_BLUETOOTH_A2DP;
- public static int TYPE_BLUETOOTH_SCO;
- public static int TYPE_BUILTIN_EARPIECE;
- public static int TYPE_BUILTIN_MIC;
- public static int TYPE_BUILTIN_SPEAKER;
- public static int TYPE_BUS;
- public static int TYPE_DOCK;
- public static int TYPE_FM;
- public static int TYPE_FM_TUNER;
- public static int TYPE_HDMI;
- public static int TYPE_HDMI_ARC;
- public static int TYPE_HEARING_AID;
- public static int TYPE_IP;
- public static int TYPE_LINE_ANALOG;
- public static int TYPE_LINE_DIGITAL;
- public static int TYPE_TELEPHONY;
- public static int TYPE_TV_TUNER;
- public static int TYPE_UNKNOWN;
- public static int TYPE_USB_ACCESSORY;
- public static int TYPE_USB_DEVICE;
- public static int TYPE_USB_HEADSET;
- public static int TYPE_WIRED_HEADPHONES;
- public static int TYPE_WIRED_HEADSET;
-}
-
--keep class android.media.AudioDevicePort {
-
- public java.lang.String address();
- public android.media.AudioDevicePortConfig buildConfig(int, int, int, android.media.AudioGainConfig);
- public android.media.AudioPortConfig buildConfig(int, int, int, android.media.AudioGainConfig);
- public boolean equals(java.lang.Object);
- public java.lang.String toString();
- public int type();
-
-
-}
-
--keep class android.media.AudioDevicePortConfig {
-
- public android.media.AudioDevicePort port();
- public android.media.AudioPort port();
-
-
-}
-
--keep class android.media.AudioFormat {
- <init>();
-
- public static int channelCountFromInChannelMask(int);
- public static int channelCountFromOutChannelMask(int);
- public static int convertChannelOutMaskToNativeMask(int);
- public static int convertNativeChannelMaskToOutMask(int);
- public int describeContents();
- public boolean equals(java.lang.Object);
- public static int[] filterPublicFormats(int[]);
- public static int getBytesPerSample(int);
- public int getChannelCount();
- public int getChannelIndexMask();
- public int getChannelMask();
- public int getEncoding();
- public int getPropertySetMask();
- public int getSampleRate();
- public int hashCode();
- public static int inChannelMaskFromOutChannelMask(int);
- public static boolean isEncodingLinearFrames(int);
- public static boolean isEncodingLinearPcm(int);
- public static boolean isPublicEncoding(int);
- public static boolean isValidEncoding(int);
- public static java.lang.String toDisplayName(int);
- public static java.lang.String toLogFriendlyEncoding(int);
- public java.lang.String toLogFriendlyString();
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static int AUDIO_FORMAT_HAS_PROPERTY_CHANNEL_INDEX_MASK;
- public static int AUDIO_FORMAT_HAS_PROPERTY_CHANNEL_MASK;
- public static int AUDIO_FORMAT_HAS_PROPERTY_ENCODING;
- public static int AUDIO_FORMAT_HAS_PROPERTY_NONE;
- public static int AUDIO_FORMAT_HAS_PROPERTY_SAMPLE_RATE;
- public static int CHANNEL_CONFIGURATION_DEFAULT;
- public static int CHANNEL_CONFIGURATION_INVALID;
- public static int CHANNEL_CONFIGURATION_MONO;
- public static int CHANNEL_CONFIGURATION_STEREO;
- public static int CHANNEL_INVALID;
- public static int CHANNEL_IN_BACK;
- public static int CHANNEL_IN_BACK_PROCESSED;
- public static int CHANNEL_IN_DEFAULT;
- public static int CHANNEL_IN_FRONT;
- public static int CHANNEL_IN_FRONT_BACK;
- public static int CHANNEL_IN_FRONT_PROCESSED;
- public static int CHANNEL_IN_LEFT;
- public static int CHANNEL_IN_LEFT_PROCESSED;
- public static int CHANNEL_IN_MONO;
- public static int CHANNEL_IN_PRESSURE;
- public static int CHANNEL_IN_RIGHT;
- public static int CHANNEL_IN_RIGHT_PROCESSED;
- public static int CHANNEL_IN_STEREO;
- public static int CHANNEL_IN_VOICE_DNLINK;
- public static int CHANNEL_IN_VOICE_UPLINK;
- public static int CHANNEL_IN_X_AXIS;
- public static int CHANNEL_IN_Y_AXIS;
- public static int CHANNEL_IN_Z_AXIS;
- public static int CHANNEL_OUT_5POINT1;
- public static int CHANNEL_OUT_5POINT1_SIDE;
- public static int CHANNEL_OUT_7POINT1;
- public static int CHANNEL_OUT_7POINT1_SURROUND;
- public static int CHANNEL_OUT_BACK_CENTER;
- public static int CHANNEL_OUT_BACK_LEFT;
- public static int CHANNEL_OUT_BACK_RIGHT;
- public static int CHANNEL_OUT_DEFAULT;
- public static int CHANNEL_OUT_FRONT_CENTER;
- public static int CHANNEL_OUT_FRONT_LEFT;
- public static int CHANNEL_OUT_FRONT_LEFT_OF_CENTER;
- public static int CHANNEL_OUT_FRONT_RIGHT;
- public static int CHANNEL_OUT_FRONT_RIGHT_OF_CENTER;
- public static int CHANNEL_OUT_LOW_FREQUENCY;
- public static int CHANNEL_OUT_MONO;
- public static int CHANNEL_OUT_QUAD;
- public static int CHANNEL_OUT_QUAD_SIDE;
- public static int CHANNEL_OUT_SIDE_LEFT;
- public static int CHANNEL_OUT_SIDE_RIGHT;
- public static int CHANNEL_OUT_STEREO;
- public static int CHANNEL_OUT_SURROUND;
- public static int CHANNEL_OUT_TOP_BACK_CENTER;
- public static int CHANNEL_OUT_TOP_BACK_LEFT;
- public static int CHANNEL_OUT_TOP_BACK_RIGHT;
- public static int CHANNEL_OUT_TOP_CENTER;
- public static int CHANNEL_OUT_TOP_FRONT_CENTER;
- public static int CHANNEL_OUT_TOP_FRONT_LEFT;
- public static int CHANNEL_OUT_TOP_FRONT_RIGHT;
- public static android.os.Parcelable$Creator CREATOR;
- public static int ENCODING_AAC_ELD;
- public static int ENCODING_AAC_HE_V1;
- public static int ENCODING_AAC_HE_V2;
- public static int ENCODING_AAC_LC;
- public static int ENCODING_AAC_XHE;
- public static int ENCODING_AC3;
- public static int ENCODING_AC4;
- public static int ENCODING_DEFAULT;
- public static int ENCODING_DOLBY_TRUEHD;
- public static int ENCODING_DTS;
- public static int ENCODING_DTS_HD;
- public static int ENCODING_E_AC3;
- public static int ENCODING_E_AC3_JOC;
- public static int ENCODING_IEC61937;
- public static int ENCODING_INVALID;
- public static int ENCODING_MP3;
- public static int ENCODING_PCM_16BIT;
- public static int ENCODING_PCM_8BIT;
- public static int ENCODING_PCM_FLOAT;
- public static int SAMPLE_RATE_HZ_MAX;
- public static int SAMPLE_RATE_HZ_MIN;
- public static int SAMPLE_RATE_UNSPECIFIED;
- public static int[] SURROUND_SOUND_ENCODING;
-}
-
--keep class android.media.AudioGain {
-
- public android.media.AudioGainConfig buildConfig(int, int, int[], int);
- public int channelMask();
- public int defaultValue();
- public int maxValue();
- public int minValue();
- public int mode();
- public int rampDurationMaxMs();
- public int rampDurationMinMs();
- public int stepValue();
-
-
- public static int MODE_CHANNELS;
- public static int MODE_JOINT;
- public static int MODE_RAMP;
-}
-
--keep class android.media.AudioGainConfig {
-
- public int channelMask();
- public int mode();
- public int rampDurationMs();
- public int[] values();
-
-
-}
-
--keep class android.media.AudioPort {
-
- public android.media.AudioPortConfig activeConfig();
- public android.media.AudioPortConfig buildConfig(int, int, int, android.media.AudioGainConfig);
- public int[] channelIndexMasks();
- public int[] channelMasks();
- public boolean equals(java.lang.Object);
- public int[] formats();
- public android.media.AudioGain[] gains();
- public int hashCode();
- public int id();
- public java.lang.String name();
- public int role();
- public int[] samplingRates();
- public java.lang.String toString();
-
-
- public static int ROLE_NONE;
- public static int ROLE_SINK;
- public static int ROLE_SOURCE;
- public static int TYPE_DEVICE;
- public static int TYPE_NONE;
- public static int TYPE_SESSION;
- public static int TYPE_SUBMIX;
- protected int mRole;
-}
-
--keep class android.media.AudioPortConfig {
-
- public int channelMask();
- public int format();
- public android.media.AudioGainConfig gain();
- public android.media.AudioPort port();
- public int samplingRate();
- public java.lang.String toString();
-
-
-}
-
--keep class android.media.AudioRecord {
- <init>(int, int, int, int, int);
- <init>(android.media.AudioAttributes, android.media.AudioFormat, int, int);
-
- public void addOnRoutingChangedListener(android.media.AudioRouting$OnRoutingChangedListener, android.os.Handler);
- public void addOnRoutingChangedListener(android.media.AudioRecord$OnRoutingChangedListener, android.os.Handler);
- protected void finalize();
- public java.util.List getActiveMicrophones();
- public int getAudioFormat();
- public int getAudioSessionId();
- public int getAudioSource();
- public int getBufferSizeInFrames();
- public int getChannelConfiguration();
- public int getChannelCount();
- public android.media.AudioFormat getFormat();
- public android.os.PersistableBundle getMetrics();
- public static int getMinBufferSize(int, int, int);
- public int getNotificationMarkerPosition();
- public int getPositionNotificationPeriod();
- public android.media.AudioDeviceInfo getPreferredDevice();
- public int getRecordingState();
- public android.media.AudioDeviceInfo getRoutedDevice();
- public int getSampleRate();
- public int getState();
- public int getTimestamp(android.media.AudioTimestamp, int);
- public void native_release();
- public int read(byte[], int, int);
- public int read(byte[], int, int, int);
- public int read(short[], int, int);
- public int read(short[], int, int, int);
- public int read(float[], int, int, int);
- public int read(java.nio.ByteBuffer, int);
- public int read(java.nio.ByteBuffer, int, int);
- public void release();
- public void removeOnRoutingChangedListener(android.media.AudioRouting$OnRoutingChangedListener);
- public void removeOnRoutingChangedListener(android.media.AudioRecord$OnRoutingChangedListener);
- public int setNotificationMarkerPosition(int);
- public int setPositionNotificationPeriod(int);
- public boolean setPreferredDevice(android.media.AudioDeviceInfo);
- public void setRecordPositionUpdateListener(android.media.AudioRecord$OnRecordPositionUpdateListener);
- public void setRecordPositionUpdateListener(android.media.AudioRecord$OnRecordPositionUpdateListener, android.os.Handler);
- public void startRecording();
- public void startRecording(android.media.MediaSyncEvent);
- public void stop();
-
-
- public static int ERROR;
- public static int ERROR_BAD_VALUE;
- public static int ERROR_DEAD_OBJECT;
- public static int ERROR_INVALID_OPERATION;
- public static int READ_BLOCKING;
- public static int READ_NON_BLOCKING;
- public static int RECORDSTATE_RECORDING;
- public static int RECORDSTATE_STOPPED;
- public static int STATE_INITIALIZED;
- public static int STATE_UNINITIALIZED;
- public static java.lang.String SUBMIX_FIXED_VOLUME;
- public static int SUCCESS;
-}
-
--keep class android.media.AudioRecord$OnRecordPositionUpdateListener {
-
- public abstract void onMarkerReached(android.media.AudioRecord);
- public abstract void onPeriodicNotification(android.media.AudioRecord);
-
-
-}
-
--keep class android.media.AudioRecord$OnRoutingChangedListener {
-
- public abstract void onRoutingChanged(android.media.AudioRecord);
- public void onRoutingChanged(android.media.AudioRouting);
-
-
-}
-
--keep class android.media.AudioRouting {
-
- public abstract void addOnRoutingChangedListener(android.media.AudioRouting$OnRoutingChangedListener, android.os.Handler);
- public abstract android.media.AudioDeviceInfo getPreferredDevice();
- public abstract android.media.AudioDeviceInfo getRoutedDevice();
- public abstract void removeOnRoutingChangedListener(android.media.AudioRouting$OnRoutingChangedListener);
- public abstract boolean setPreferredDevice(android.media.AudioDeviceInfo);
-
-
-}
-
--keep class android.media.AudioRouting$OnRoutingChangedListener {
-
- public abstract void onRoutingChanged(android.media.AudioRouting);
-
-
-}
-
--keep class android.media.AudioTimestamp {
- <init>();
-
-
-
- public static int TIMEBASE_BOOTTIME;
- public static int TIMEBASE_MONOTONIC;
- public long framePosition;
- public long nanoTime;
-}
-
--keep class android.media.IRemoteVolumeController {
-
- public abstract void remoteVolumeChanged(android.media.session.ISessionController, int);
- public abstract void updateRemoteController(android.media.session.ISessionController);
-
-
-}
-
--keep class android.media.MediaDescription {
-
- public int describeContents();
- public boolean equals(java.lang.Object);
- public java.lang.CharSequence getDescription();
- public android.os.Bundle getExtras();
- public android.graphics.Bitmap getIconBitmap();
- public android.net.Uri getIconUri();
- public java.lang.String getMediaId();
- public android.net.Uri getMediaUri();
- public java.lang.CharSequence getSubtitle();
- public java.lang.CharSequence getTitle();
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static long BT_FOLDER_TYPE_ALBUMS;
- public static long BT_FOLDER_TYPE_ARTISTS;
- public static long BT_FOLDER_TYPE_GENRES;
- public static long BT_FOLDER_TYPE_MIXED;
- public static long BT_FOLDER_TYPE_PLAYLISTS;
- public static long BT_FOLDER_TYPE_TITLES;
- public static long BT_FOLDER_TYPE_YEARS;
- public static android.os.Parcelable$Creator CREATOR;
- public static java.lang.String EXTRA_BT_FOLDER_TYPE;
-}
-
--keep class android.media.MediaMetadata {
-
- public boolean containsKey(java.lang.String);
- public int describeContents();
- public boolean equals(java.lang.Object);
- public android.graphics.Bitmap getBitmap(java.lang.String);
- public android.media.MediaDescription getDescription();
- public static java.lang.String getKeyFromMetadataEditorKey(int);
- public long getLong(java.lang.String);
- public android.media.Rating getRating(java.lang.String);
- public java.lang.String getString(java.lang.String);
- public java.lang.CharSequence getText(java.lang.String);
- public int hashCode();
- public java.util.Set keySet();
- public int size();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public static java.lang.String METADATA_KEY_ALBUM;
- public static java.lang.String METADATA_KEY_ALBUM_ART;
- public static java.lang.String METADATA_KEY_ALBUM_ARTIST;
- public static java.lang.String METADATA_KEY_ALBUM_ART_URI;
- public static java.lang.String METADATA_KEY_ART;
- public static java.lang.String METADATA_KEY_ARTIST;
- public static java.lang.String METADATA_KEY_ART_URI;
- public static java.lang.String METADATA_KEY_AUTHOR;
- public static java.lang.String METADATA_KEY_BT_FOLDER_TYPE;
- public static java.lang.String METADATA_KEY_COMPILATION;
- public static java.lang.String METADATA_KEY_COMPOSER;
- public static java.lang.String METADATA_KEY_DATE;
- public static java.lang.String METADATA_KEY_DISC_NUMBER;
- public static java.lang.String METADATA_KEY_DISPLAY_DESCRIPTION;
- public static java.lang.String METADATA_KEY_DISPLAY_ICON;
- public static java.lang.String METADATA_KEY_DISPLAY_ICON_URI;
- public static java.lang.String METADATA_KEY_DISPLAY_SUBTITLE;
- public static java.lang.String METADATA_KEY_DISPLAY_TITLE;
- public static java.lang.String METADATA_KEY_DURATION;
- public static java.lang.String METADATA_KEY_GENRE;
- public static java.lang.String METADATA_KEY_MEDIA_ID;
- public static java.lang.String METADATA_KEY_MEDIA_URI;
- public static java.lang.String METADATA_KEY_NUM_TRACKS;
- public static java.lang.String METADATA_KEY_RATING;
- public static java.lang.String METADATA_KEY_TITLE;
- public static java.lang.String METADATA_KEY_TRACK_NUMBER;
- public static java.lang.String METADATA_KEY_USER_RATING;
- public static java.lang.String METADATA_KEY_WRITER;
- public static java.lang.String METADATA_KEY_YEAR;
-}
-
--keep class android.media.MediaSyncEvent {
-
- public static android.media.MediaSyncEvent createEvent(int);
- public int getAudioSessionId();
- public int getType();
- public android.media.MediaSyncEvent setAudioSessionId(int);
-
-
- public static int SYNC_EVENT_NONE;
- public static int SYNC_EVENT_PRESENTATION_COMPLETE;
-}
-
--keep class android.media.MicrophoneInfo {
-
- public java.lang.String getAddress();
- public java.util.List getChannelMapping();
- public java.lang.String getDescription();
- public int getDirectionality();
- public java.util.List getFrequencyResponse();
- public int getGroup();
- public int getId();
- public int getIndexInTheGroup();
- public int getInternalDeviceType();
- public int getLocation();
- public float getMaxSpl();
- public float getMinSpl();
- public android.media.MicrophoneInfo$Coordinate3F getOrientation();
- public android.media.MicrophoneInfo$Coordinate3F getPosition();
- public float getSensitivity();
- public int getType();
- public void setChannelMapping(java.util.List);
- public void setId(int);
-
-
- public static int CHANNEL_MAPPING_DIRECT;
- public static int CHANNEL_MAPPING_PROCESSED;
- public static int DIRECTIONALITY_BI_DIRECTIONAL;
- public static int DIRECTIONALITY_CARDIOID;
- public static int DIRECTIONALITY_HYPER_CARDIOID;
- public static int DIRECTIONALITY_OMNI;
- public static int DIRECTIONALITY_SUPER_CARDIOID;
- public static int DIRECTIONALITY_UNKNOWN;
- public static int GROUP_UNKNOWN;
- public static int INDEX_IN_THE_GROUP_UNKNOWN;
- public static int LOCATION_MAINBODY;
- public static int LOCATION_MAINBODY_MOVABLE;
- public static int LOCATION_PERIPHERAL;
- public static int LOCATION_UNKNOWN;
- public static android.media.MicrophoneInfo$Coordinate3F ORIENTATION_UNKNOWN;
- public static android.media.MicrophoneInfo$Coordinate3F POSITION_UNKNOWN;
- public static float SENSITIVITY_UNKNOWN;
- public static float SPL_UNKNOWN;
-}
-
--keep class android.media.MicrophoneInfo$Coordinate3F {
-
- public boolean equals(java.lang.Object);
-
-
- public float x;
- public float y;
- public float z;
-}
-
--keep class android.media.Rating {
-
- public int describeContents();
- public float getPercentRating();
- public int getRatingStyle();
- public float getStarRating();
- public boolean hasHeart();
- public boolean isRated();
- public boolean isThumbUp();
- public static android.media.Rating newHeartRating(boolean);
- public static android.media.Rating newPercentageRating(float);
- public static android.media.Rating newStarRating(int, float);
- public static android.media.Rating newThumbRating(boolean);
- public static android.media.Rating newUnratedRating(int);
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public static int RATING_3_STARS;
- public static int RATING_4_STARS;
- public static int RATING_5_STARS;
- public static int RATING_HEART;
- public static int RATING_NONE;
- public static int RATING_PERCENTAGE;
- public static int RATING_THUMB_UP_DOWN;
-}
-
--keep class android.media.SessionToken2 {
- <init>(android.content.Context, java.lang.String, java.lang.String);
- <init>(android.content.Context, java.lang.String, java.lang.String, int);
- <init>(android.media.update.SessionToken2Provider);
-
- public boolean equals(java.lang.Object);
- public static android.media.SessionToken2 fromBundle(android.os.Bundle);
- public java.lang.String getId();
- public java.lang.String getPackageName();
- public android.media.update.SessionToken2Provider getProvider();
- public int getType();
- public int getUid();
- public int hashCode();
- public android.os.Bundle toBundle();
- public java.lang.String toString();
-
-
- public static int TYPE_LIBRARY_SERVICE;
- public static int TYPE_SESSION;
- public static int TYPE_SESSION_SERVICE;
-}
-
--keep class android.media.VolumeProvider {
- <init>(int, int, int);
-
- public int getCurrentVolume();
- public int getMaxVolume();
- public int getVolumeControl();
- public void onAdjustVolume(int);
- public void onSetVolumeTo(int);
- public void setCallback(android.media.VolumeProvider$Callback);
- public void setCurrentVolume(int);
-
-
- public static int VOLUME_CONTROL_ABSOLUTE;
- public static int VOLUME_CONTROL_FIXED;
- public static int VOLUME_CONTROL_RELATIVE;
-}
-
--keep class android.media.VolumeProvider$Callback {
- <init>();
-
- public abstract void onVolumeChanged(android.media.VolumeProvider);
-
-
-}
-
--keep class android.media.projection.IMediaProjection {
-
- public abstract int applyVirtualDisplayFlags(int);
- public abstract boolean canProjectAudio();
- public abstract boolean canProjectSecureVideo();
- public abstract boolean canProjectVideo();
- public abstract void registerCallback(android.media.projection.IMediaProjectionCallback);
- public abstract void start(android.media.projection.IMediaProjectionCallback);
- public abstract void stop();
- public abstract void unregisterCallback(android.media.projection.IMediaProjectionCallback);
-
-
-}
-
--keep class android.media.projection.IMediaProjectionCallback {
-
- public abstract void onStop();
-
-
-}
-
--keep class android.media.projection.MediaProjection {
- <init>(android.content.Context, android.media.projection.IMediaProjection);
-
- public android.media.AudioRecord createAudioRecord(int, int, int, int);
- public android.hardware.display.VirtualDisplay createVirtualDisplay(java.lang.String, int, int, int, boolean, android.view.Surface, android.hardware.display.VirtualDisplay$Callback, android.os.Handler);
- public android.hardware.display.VirtualDisplay createVirtualDisplay(java.lang.String, int, int, int, int, android.view.Surface, android.hardware.display.VirtualDisplay$Callback, android.os.Handler);
- public android.media.projection.IMediaProjection getProjection();
- public void registerCallback(android.media.projection.MediaProjection$Callback, android.os.Handler);
- public void stop();
- public void unregisterCallback(android.media.projection.MediaProjection$Callback);
-
-
-}
-
--keep class android.media.projection.MediaProjection$Callback {
- <init>();
-
- public void onStop();
-
-
-}
-
--keep class android.media.session.ISession {
-
- public abstract void destroy();
- public abstract android.media.session.ISessionController getController();
- public abstract void sendEvent(java.lang.String, android.os.Bundle);
- public abstract void setActive(boolean);
- public abstract void setCurrentVolume(int);
- public abstract void setExtras(android.os.Bundle);
- public abstract void setFlags(int);
- public abstract void setLaunchPendingIntent(android.app.PendingIntent);
- public abstract void setMediaButtonReceiver(android.app.PendingIntent);
- public abstract void setMetadata(android.media.MediaMetadata);
- public abstract void setPlaybackState(android.media.session.PlaybackState);
- public abstract void setPlaybackToLocal(android.media.AudioAttributes);
- public abstract void setPlaybackToRemote(int, int);
- public abstract void setQueue(android.content.pm.ParceledListSlice);
- public abstract void setQueueTitle(java.lang.CharSequence);
- public abstract void setRatingType(int);
-
-
-}
-
--keep class android.media.session.ISessionCallback {
-
- public abstract void onAdjustVolume(java.lang.String, int, int, android.media.session.ISessionControllerCallback, int);
- public abstract void onCommand(java.lang.String, int, int, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle, android.os.ResultReceiver);
- public abstract void onCustomAction(java.lang.String, int, int, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle);
- public abstract void onFastForward(java.lang.String, int, int, android.media.session.ISessionControllerCallback);
- public abstract void onMediaButton(java.lang.String, int, int, android.content.Intent, int, android.os.ResultReceiver);
- public abstract void onMediaButtonFromController(java.lang.String, int, int, android.media.session.ISessionControllerCallback, android.content.Intent);
- public abstract void onNext(java.lang.String, int, int, android.media.session.ISessionControllerCallback);
- public abstract void onPause(java.lang.String, int, int, android.media.session.ISessionControllerCallback);
- public abstract void onPlay(java.lang.String, int, int, android.media.session.ISessionControllerCallback);
- public abstract void onPlayFromMediaId(java.lang.String, int, int, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle);
- public abstract void onPlayFromSearch(java.lang.String, int, int, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle);
- public abstract void onPlayFromUri(java.lang.String, int, int, android.media.session.ISessionControllerCallback, android.net.Uri, android.os.Bundle);
- public abstract void onPrepare(java.lang.String, int, int, android.media.session.ISessionControllerCallback);
- public abstract void onPrepareFromMediaId(java.lang.String, int, int, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle);
- public abstract void onPrepareFromSearch(java.lang.String, int, int, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle);
- public abstract void onPrepareFromUri(java.lang.String, int, int, android.media.session.ISessionControllerCallback, android.net.Uri, android.os.Bundle);
- public abstract void onPrevious(java.lang.String, int, int, android.media.session.ISessionControllerCallback);
- public abstract void onRate(java.lang.String, int, int, android.media.session.ISessionControllerCallback, android.media.Rating);
- public abstract void onRewind(java.lang.String, int, int, android.media.session.ISessionControllerCallback);
- public abstract void onSeekTo(java.lang.String, int, int, android.media.session.ISessionControllerCallback, long);
- public abstract void onSetVolumeTo(java.lang.String, int, int, android.media.session.ISessionControllerCallback, int);
- public abstract void onSkipToTrack(java.lang.String, int, int, android.media.session.ISessionControllerCallback, long);
- public abstract void onStop(java.lang.String, int, int, android.media.session.ISessionControllerCallback);
-
-
-}
-
--keep class android.media.session.ISessionCallback$Stub {
- <init>();
-
- public android.os.IBinder asBinder();
- public static android.media.session.ISessionCallback asInterface(android.os.IBinder);
- public boolean onTransact(int, android.os.Parcel, android.os.Parcel, int);
-
-
-}
-
--keep class android.media.session.ISessionController {
-
- public abstract void adjustVolume(java.lang.String, android.media.session.ISessionControllerCallback, boolean, int, int);
- public abstract void fastForward(java.lang.String, android.media.session.ISessionControllerCallback);
- public abstract android.os.Bundle getExtras();
- public abstract long getFlags();
- public abstract android.app.PendingIntent getLaunchPendingIntent();
- public abstract android.media.MediaMetadata getMetadata();
- public abstract java.lang.String getPackageName();
- public abstract android.media.session.PlaybackState getPlaybackState();
- public abstract android.content.pm.ParceledListSlice getQueue();
- public abstract java.lang.CharSequence getQueueTitle();
- public abstract int getRatingType();
- public abstract java.lang.String getTag();
- public abstract android.media.session.ParcelableVolumeInfo getVolumeAttributes();
- public abstract boolean isTransportControlEnabled();
- public abstract void next(java.lang.String, android.media.session.ISessionControllerCallback);
- public abstract void pause(java.lang.String, android.media.session.ISessionControllerCallback);
- public abstract void play(java.lang.String, android.media.session.ISessionControllerCallback);
- public abstract void playFromMediaId(java.lang.String, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle);
- public abstract void playFromSearch(java.lang.String, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle);
- public abstract void playFromUri(java.lang.String, android.media.session.ISessionControllerCallback, android.net.Uri, android.os.Bundle);
- public abstract void prepare(java.lang.String, android.media.session.ISessionControllerCallback);
- public abstract void prepareFromMediaId(java.lang.String, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle);
- public abstract void prepareFromSearch(java.lang.String, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle);
- public abstract void prepareFromUri(java.lang.String, android.media.session.ISessionControllerCallback, android.net.Uri, android.os.Bundle);
- public abstract void previous(java.lang.String, android.media.session.ISessionControllerCallback);
- public abstract void rate(java.lang.String, android.media.session.ISessionControllerCallback, android.media.Rating);
- public abstract void registerCallbackListener(java.lang.String, android.media.session.ISessionControllerCallback);
- public abstract void rewind(java.lang.String, android.media.session.ISessionControllerCallback);
- public abstract void seekTo(java.lang.String, android.media.session.ISessionControllerCallback, long);
- public abstract void sendCommand(java.lang.String, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle, android.os.ResultReceiver);
- public abstract void sendCustomAction(java.lang.String, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle);
- public abstract boolean sendMediaButton(java.lang.String, android.media.session.ISessionControllerCallback, boolean, android.view.KeyEvent);
- public abstract void setVolumeTo(java.lang.String, android.media.session.ISessionControllerCallback, int, int);
- public abstract void skipToQueueItem(java.lang.String, android.media.session.ISessionControllerCallback, long);
- public abstract void stop(java.lang.String, android.media.session.ISessionControllerCallback);
- public abstract void unregisterCallbackListener(android.media.session.ISessionControllerCallback);
-
-
-}
-
--keep class android.media.session.ISessionControllerCallback {
-
- public abstract void onEvent(java.lang.String, android.os.Bundle);
- public abstract void onExtrasChanged(android.os.Bundle);
- public abstract void onMetadataChanged(android.media.MediaMetadata);
- public abstract void onPlaybackStateChanged(android.media.session.PlaybackState);
- public abstract void onQueueChanged(android.content.pm.ParceledListSlice);
- public abstract void onQueueTitleChanged(java.lang.CharSequence);
- public abstract void onSessionDestroyed();
- public abstract void onVolumeInfoChanged(android.media.session.ParcelableVolumeInfo);
-
-
-}
-
--keep class android.media.session.MediaController {
- <init>(android.content.Context, android.media.session.ISessionController);
- <init>(android.content.Context, android.media.session.MediaSession$Token);
-
- public void adjustVolume(int, int);
- public boolean controlsSameSession(android.media.session.MediaController);
- public boolean dispatchMediaButtonEvent(android.view.KeyEvent);
- public boolean dispatchMediaButtonEventAsSystemService(android.view.KeyEvent);
- public void dispatchVolumeButtonEventAsSystemService(android.view.KeyEvent);
- public android.os.Bundle getExtras();
- public long getFlags();
- public android.media.MediaMetadata getMetadata();
- public java.lang.String getPackageName();
- public android.media.session.MediaController$PlaybackInfo getPlaybackInfo();
- public android.media.session.PlaybackState getPlaybackState();
- public java.util.List getQueue();
- public java.lang.CharSequence getQueueTitle();
- public int getRatingType();
- public android.app.PendingIntent getSessionActivity();
- public android.media.session.MediaSession$Token getSessionToken();
- public java.lang.String getTag();
- public android.media.session.MediaController$TransportControls getTransportControls();
- public void registerCallback(android.media.session.MediaController$Callback);
- public void registerCallback(android.media.session.MediaController$Callback, android.os.Handler);
- public void sendCommand(java.lang.String, android.os.Bundle, android.os.ResultReceiver);
- public void setVolumeTo(int, int);
- public void unregisterCallback(android.media.session.MediaController$Callback);
-
-
-}
-
--keep class android.media.session.MediaController$Callback {
- <init>();
-
- public void onAudioInfoChanged(android.media.session.MediaController$PlaybackInfo);
- public void onExtrasChanged(android.os.Bundle);
- public void onMetadataChanged(android.media.MediaMetadata);
- public void onPlaybackStateChanged(android.media.session.PlaybackState);
- public void onQueueChanged(java.util.List);
- public void onQueueTitleChanged(java.lang.CharSequence);
- public void onSessionDestroyed();
- public void onSessionEvent(java.lang.String, android.os.Bundle);
-
-
-}
-
--keep class android.media.session.MediaController$PlaybackInfo {
- <init>(int, android.media.AudioAttributes, int, int, int);
-
- public android.media.AudioAttributes getAudioAttributes();
- public int getCurrentVolume();
- public int getMaxVolume();
- public int getPlaybackType();
- public int getVolumeControl();
-
-
- public static int PLAYBACK_TYPE_LOCAL;
- public static int PLAYBACK_TYPE_REMOTE;
-}
-
--keep class android.media.session.MediaController$TransportControls {
-
- public void fastForward();
- public void pause();
- public void play();
- public void playFromMediaId(java.lang.String, android.os.Bundle);
- public void playFromSearch(java.lang.String, android.os.Bundle);
- public void playFromUri(android.net.Uri, android.os.Bundle);
- public void prepare();
- public void prepareFromMediaId(java.lang.String, android.os.Bundle);
- public void prepareFromSearch(java.lang.String, android.os.Bundle);
- public void prepareFromUri(android.net.Uri, android.os.Bundle);
- public void rewind();
- public void seekTo(long);
- public void sendCustomAction(android.media.session.PlaybackState$CustomAction, android.os.Bundle);
- public void sendCustomAction(java.lang.String, android.os.Bundle);
- public void setRating(android.media.Rating);
- public void skipToNext();
- public void skipToPrevious();
- public void skipToQueueItem(long);
- public void stop();
-
-
-}
-
--keep class android.media.session.MediaSession {
- <init>(android.content.Context, java.lang.String);
- <init>(android.content.Context, java.lang.String, int);
-
- public java.lang.String getCallingPackage();
- public android.media.session.MediaController getController();
- public android.media.session.MediaSessionManager$RemoteUserInfo getCurrentControllerInfo();
- public android.media.session.MediaSession$Token getSessionToken();
- public boolean isActive();
- public static boolean isActiveState(int);
- public void notifyRemoteVolumeChanged(android.media.VolumeProvider);
- public void release();
- public void sendSessionEvent(java.lang.String, android.os.Bundle);
- public void setActive(boolean);
- public void setCallback(android.media.session.MediaSession$Callback);
- public void setCallback(android.media.session.MediaSession$Callback, android.os.Handler);
- public void setExtras(android.os.Bundle);
- public void setFlags(int);
- public void setMediaButtonReceiver(android.app.PendingIntent);
- public void setMetadata(android.media.MediaMetadata);
- public void setPlaybackState(android.media.session.PlaybackState);
- public void setPlaybackToLocal(android.media.AudioAttributes);
- public void setPlaybackToRemote(android.media.VolumeProvider);
- public void setQueue(java.util.List);
- public void setQueueTitle(java.lang.CharSequence);
- public void setRatingType(int);
- public void setSessionActivity(android.app.PendingIntent);
-
-
- public static int FLAG_EXCLUSIVE_GLOBAL_PRIORITY;
- public static int FLAG_HANDLES_MEDIA_BUTTONS;
- public static int FLAG_HANDLES_TRANSPORT_CONTROLS;
- public static int INVALID_PID;
- public static int INVALID_UID;
-}
-
--keep class android.media.session.MediaSession$Callback {
- <init>();
-
- public void onCommand(java.lang.String, android.os.Bundle, android.os.ResultReceiver);
- public void onCustomAction(java.lang.String, android.os.Bundle);
- public void onFastForward();
- public boolean onMediaButtonEvent(android.content.Intent);
- public void onPause();
- public void onPlay();
- public void onPlayFromMediaId(java.lang.String, android.os.Bundle);
- public void onPlayFromSearch(java.lang.String, android.os.Bundle);
- public void onPlayFromUri(android.net.Uri, android.os.Bundle);
- public void onPrepare();
- public void onPrepareFromMediaId(java.lang.String, android.os.Bundle);
- public void onPrepareFromSearch(java.lang.String, android.os.Bundle);
- public void onPrepareFromUri(android.net.Uri, android.os.Bundle);
- public void onRewind();
- public void onSeekTo(long);
- public void onSetRating(android.media.Rating);
- public void onSkipToNext();
- public void onSkipToPrevious();
- public void onSkipToQueueItem(long);
- public void onStop();
-
-
-}
-
--keep class android.media.session.MediaSession$CallbackStub {
- <init>(android.media.session.MediaSession);
-
- public void onAdjustVolume(java.lang.String, int, int, android.media.session.ISessionControllerCallback, int);
- public void onCommand(java.lang.String, int, int, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle, android.os.ResultReceiver);
- public void onCustomAction(java.lang.String, int, int, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle);
- public void onFastForward(java.lang.String, int, int, android.media.session.ISessionControllerCallback);
- public void onMediaButton(java.lang.String, int, int, android.content.Intent, int, android.os.ResultReceiver);
- public void onMediaButtonFromController(java.lang.String, int, int, android.media.session.ISessionControllerCallback, android.content.Intent);
- public void onNext(java.lang.String, int, int, android.media.session.ISessionControllerCallback);
- public void onPause(java.lang.String, int, int, android.media.session.ISessionControllerCallback);
- public void onPlay(java.lang.String, int, int, android.media.session.ISessionControllerCallback);
- public void onPlayFromMediaId(java.lang.String, int, int, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle);
- public void onPlayFromSearch(java.lang.String, int, int, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle);
- public void onPlayFromUri(java.lang.String, int, int, android.media.session.ISessionControllerCallback, android.net.Uri, android.os.Bundle);
- public void onPrepare(java.lang.String, int, int, android.media.session.ISessionControllerCallback);
- public void onPrepareFromMediaId(java.lang.String, int, int, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle);
- public void onPrepareFromSearch(java.lang.String, int, int, android.media.session.ISessionControllerCallback, java.lang.String, android.os.Bundle);
- public void onPrepareFromUri(java.lang.String, int, int, android.media.session.ISessionControllerCallback, android.net.Uri, android.os.Bundle);
- public void onPrevious(java.lang.String, int, int, android.media.session.ISessionControllerCallback);
- public void onRate(java.lang.String, int, int, android.media.session.ISessionControllerCallback, android.media.Rating);
- public void onRewind(java.lang.String, int, int, android.media.session.ISessionControllerCallback);
- public void onSeekTo(java.lang.String, int, int, android.media.session.ISessionControllerCallback, long);
- public void onSetVolumeTo(java.lang.String, int, int, android.media.session.ISessionControllerCallback, int);
- public void onSkipToTrack(java.lang.String, int, int, android.media.session.ISessionControllerCallback, long);
- public void onStop(java.lang.String, int, int, android.media.session.ISessionControllerCallback);
-
-
-}
-
--keep class android.media.session.MediaSession$QueueItem {
- <init>(android.media.MediaDescription, long);
-
- public int describeContents();
- public boolean equals(java.lang.Object);
- public android.media.MediaDescription getDescription();
- public long getQueueId();
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public static int UNKNOWN_ID;
-}
-
--keep class android.media.session.MediaSession$Token {
- <init>(android.media.session.ISessionController);
-
- public int describeContents();
- public boolean equals(java.lang.Object);
- public int hashCode();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.media.session.MediaSessionManager {
- <init>(android.content.Context);
-
- public void addOnActiveSessionsChangedListener(android.media.session.MediaSessionManager$OnActiveSessionsChangedListener, android.content.ComponentName);
- public void addOnActiveSessionsChangedListener(android.media.session.MediaSessionManager$OnActiveSessionsChangedListener, android.content.ComponentName, android.os.Handler);
- public void addOnActiveSessionsChangedListener(android.media.session.MediaSessionManager$OnActiveSessionsChangedListener, android.content.ComponentName, int, android.os.Handler);
- public void addOnSessionTokensChangedListener(java.util.concurrent.Executor, android.media.session.MediaSessionManager$OnSessionTokensChangedListener);
- public void addOnSessionTokensChangedListener(int, java.util.concurrent.Executor, android.media.session.MediaSessionManager$OnSessionTokensChangedListener);
- public android.media.session.ISession createSession(android.media.session.MediaSession$CallbackStub, java.lang.String, int);
- public boolean createSession2(android.media.SessionToken2);
- public void destroySession2(android.media.SessionToken2);
- public void dispatchAdjustVolume(int, int, int);
- public void dispatchMediaKeyEvent(android.view.KeyEvent);
- public void dispatchMediaKeyEvent(android.view.KeyEvent, boolean);
- public void dispatchMediaKeyEventAsSystemService(android.view.KeyEvent);
- public void dispatchVolumeKeyEvent(android.view.KeyEvent, int, boolean);
- public void dispatchVolumeKeyEventAsSystemService(android.view.KeyEvent, int);
- public java.util.List getActiveSessionTokens();
- public java.util.List getActiveSessions(android.content.ComponentName);
- public java.util.List getActiveSessionsForUser(android.content.ComponentName, int);
- public java.util.List getAllSessionTokens();
- public java.util.List getSessionServiceTokens();
- public boolean isGlobalPriorityActive();
- public boolean isTrustedForMediaControl(android.media.session.MediaSessionManager$RemoteUserInfo);
- public void removeOnActiveSessionsChangedListener(android.media.session.MediaSessionManager$OnActiveSessionsChangedListener);
- public void removeOnSessionTokensChangedListener(android.media.session.MediaSessionManager$OnSessionTokensChangedListener);
- public void setCallback(android.media.session.MediaSessionManager$Callback, android.os.Handler);
- public void setOnMediaKeyListener(android.media.session.MediaSessionManager$OnMediaKeyListener, android.os.Handler);
- public void setOnVolumeKeyLongPressListener(android.media.session.MediaSessionManager$OnVolumeKeyLongPressListener, android.os.Handler);
- public void setRemoteVolumeController(android.media.IRemoteVolumeController);
-
-
- public static int RESULT_MEDIA_KEY_HANDLED;
- public static int RESULT_MEDIA_KEY_NOT_HANDLED;
-}
-
--keep class android.media.session.MediaSessionManager$Callback {
- <init>();
-
- public abstract void onAddressedPlayerChanged(android.media.session.MediaSession$Token);
- public abstract void onAddressedPlayerChanged(android.content.ComponentName);
- public abstract void onMediaKeyEventDispatched(android.view.KeyEvent, android.media.session.MediaSession$Token);
- public abstract void onMediaKeyEventDispatched(android.view.KeyEvent, android.content.ComponentName);
-
-
-}
-
--keep class android.media.session.MediaSessionManager$OnActiveSessionsChangedListener {
-
- public abstract void onActiveSessionsChanged(java.util.List);
-
-
-}
-
--keep class android.media.session.MediaSessionManager$OnMediaKeyListener {
-
- public abstract boolean onMediaKey(android.view.KeyEvent);
-
-
-}
-
--keep class android.media.session.MediaSessionManager$OnSessionTokensChangedListener {
-
- public abstract void onSessionTokensChanged(java.util.List);
-
-
-}
-
--keep class android.media.session.MediaSessionManager$OnVolumeKeyLongPressListener {
-
- public abstract void onVolumeKeyLongPress(android.view.KeyEvent);
-
-
-}
-
--keep class android.media.session.MediaSessionManager$RemoteUserInfo {
- <init>(java.lang.String, int, int);
- <init>(java.lang.String, int, int, android.os.IBinder);
-
- public boolean equals(java.lang.Object);
- public java.lang.String getPackageName();
- public int getPid();
- public int getUid();
- public int hashCode();
-
-
-}
-
--keep class android.media.session.ParcelableVolumeInfo {
- <init>(int, android.media.AudioAttributes, int, int, int);
- <init>(android.os.Parcel);
-
- public int describeContents();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public android.media.AudioAttributes audioAttrs;
- public int controlType;
- public int currentVolume;
- public int maxVolume;
- public int volumeType;
-}
-
--keep class android.media.session.PlaybackState {
-
- public int describeContents();
- public long getActions();
- public static long getActionsFromRccControlFlags(int);
- public long getActiveQueueItemId();
- public long getBufferedPosition();
- public java.util.List getCustomActions();
- public java.lang.CharSequence getErrorMessage();
- public android.os.Bundle getExtras();
- public long getLastPositionUpdateTime();
- public float getPlaybackSpeed();
- public long getPosition();
- public static int getRccControlFlagsFromActions(long);
- public static int getRccStateFromState(int);
- public int getState();
- public static int getStateFromRccState(int);
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static long ACTION_FAST_FORWARD;
- public static long ACTION_PAUSE;
- public static long ACTION_PLAY;
- public static long ACTION_PLAY_FROM_MEDIA_ID;
- public static long ACTION_PLAY_FROM_SEARCH;
- public static long ACTION_PLAY_FROM_URI;
- public static long ACTION_PLAY_PAUSE;
- public static long ACTION_PREPARE;
- public static long ACTION_PREPARE_FROM_MEDIA_ID;
- public static long ACTION_PREPARE_FROM_SEARCH;
- public static long ACTION_PREPARE_FROM_URI;
- public static long ACTION_REWIND;
- public static long ACTION_SEEK_TO;
- public static long ACTION_SET_RATING;
- public static long ACTION_SKIP_TO_NEXT;
- public static long ACTION_SKIP_TO_PREVIOUS;
- public static long ACTION_SKIP_TO_QUEUE_ITEM;
- public static long ACTION_STOP;
- public static android.os.Parcelable$Creator CREATOR;
- public static long PLAYBACK_POSITION_UNKNOWN;
- public static int STATE_BUFFERING;
- public static int STATE_CONNECTING;
- public static int STATE_ERROR;
- public static int STATE_FAST_FORWARDING;
- public static int STATE_NONE;
- public static int STATE_PAUSED;
- public static int STATE_PLAYING;
- public static int STATE_REWINDING;
- public static int STATE_SKIPPING_TO_NEXT;
- public static int STATE_SKIPPING_TO_PREVIOUS;
- public static int STATE_SKIPPING_TO_QUEUE_ITEM;
- public static int STATE_STOPPED;
-}
-
--keep class android.media.session.PlaybackState$CustomAction {
-
- public int describeContents();
- public java.lang.String getAction();
- public android.os.Bundle getExtras();
- public int getIcon();
- public java.lang.CharSequence getName();
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.media.update.SessionToken2Provider {
-
- public abstract boolean equals_impl(java.lang.Object);
- public abstract java.lang.String getId_imp();
- public abstract java.lang.String getPackageName_impl();
- public abstract int getType_impl();
- public abstract int getUid_impl();
- public abstract int hashCode_impl();
- public abstract android.os.Bundle toBundle_impl();
- public abstract java.lang.String toString_impl();
-
-
-}
-
--keep class android.net.Uri {
-
- public abstract android.net.Uri$Builder buildUpon();
- public void checkContentUriWithoutPermission(java.lang.String, int);
- public void checkFileUriExposed(java.lang.String);
- public int compareTo(android.net.Uri);
- public int compareTo(java.lang.Object);
- public static java.lang.String decode(java.lang.String);
- public static java.lang.String encode(java.lang.String);
- public static java.lang.String encode(java.lang.String, java.lang.String);
- public boolean equals(java.lang.Object);
- public static android.net.Uri fromFile(java.io.File);
- public static android.net.Uri fromParts(java.lang.String, java.lang.String, java.lang.String);
- public abstract java.lang.String getAuthority();
- public boolean getBooleanQueryParameter(java.lang.String, boolean);
- public android.net.Uri getCanonicalUri();
- public abstract java.lang.String getEncodedAuthority();
- public abstract java.lang.String getEncodedFragment();
- public abstract java.lang.String getEncodedPath();
- public abstract java.lang.String getEncodedQuery();
- public abstract java.lang.String getEncodedSchemeSpecificPart();
- public abstract java.lang.String getEncodedUserInfo();
- public abstract java.lang.String getFragment();
- public abstract java.lang.String getHost();
- public abstract java.lang.String getLastPathSegment();
- public abstract java.lang.String getPath();
- public abstract java.util.List getPathSegments();
- public abstract int getPort();
- public abstract java.lang.String getQuery();
- public java.lang.String getQueryParameter(java.lang.String);
- public java.util.Set getQueryParameterNames();
- public java.util.List getQueryParameters(java.lang.String);
- public abstract java.lang.String getScheme();
- public abstract java.lang.String getSchemeSpecificPart();
- public abstract java.lang.String getUserInfo();
- public int hashCode();
- public boolean isAbsolute();
- public abstract boolean isHierarchical();
- public boolean isOpaque();
- public boolean isPathPrefixMatch(android.net.Uri);
- public abstract boolean isRelative();
- public android.net.Uri normalizeScheme();
- public static android.net.Uri parse(java.lang.String);
- public java.lang.String toSafeString();
- public abstract java.lang.String toString();
- public static android.net.Uri withAppendedPath(android.net.Uri, java.lang.String);
- public static void writeToParcel(android.os.Parcel, android.net.Uri);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public static android.net.Uri EMPTY;
-}
-
--keep class android.net.Uri$Builder {
- <init>();
-
- public android.net.Uri$Builder appendEncodedPath(java.lang.String);
- public android.net.Uri$Builder appendPath(java.lang.String);
- public android.net.Uri$Builder appendQueryParameter(java.lang.String, java.lang.String);
- public android.net.Uri$Builder authority(java.lang.String);
- public android.net.Uri build();
- public android.net.Uri$Builder clearQuery();
- public android.net.Uri$Builder encodedAuthority(java.lang.String);
- public android.net.Uri$Builder encodedFragment(java.lang.String);
- public android.net.Uri$Builder encodedOpaquePart(java.lang.String);
- public android.net.Uri$Builder encodedPath(java.lang.String);
- public android.net.Uri$Builder encodedQuery(java.lang.String);
- public android.net.Uri$Builder fragment(java.lang.String);
- public android.net.Uri$Builder opaquePart(java.lang.String);
- public android.net.Uri$Builder path(java.lang.String);
- public android.net.Uri$Builder query(java.lang.String);
- public android.net.Uri$Builder scheme(java.lang.String);
- public java.lang.String toString();
-
-
-}
-
--keep class android.os.BaseBundle {
-
- public void clear();
- public boolean containsKey(java.lang.String);
- public static void dumpStats(com.android.internal.util.IndentingPrintWriter, java.lang.String, java.lang.Object);
- public static void dumpStats(com.android.internal.util.IndentingPrintWriter, android.util.SparseArray);
- public static void dumpStats(com.android.internal.util.IndentingPrintWriter, android.os.BaseBundle);
- public java.lang.Object get(java.lang.String);
- public boolean getBoolean(java.lang.String);
- public boolean getBoolean(java.lang.String, boolean);
- public boolean[] getBooleanArray(java.lang.String);
- public double getDouble(java.lang.String);
- public double getDouble(java.lang.String, double);
- public double[] getDoubleArray(java.lang.String);
- public int getInt(java.lang.String);
- public int getInt(java.lang.String, int);
- public int[] getIntArray(java.lang.String);
- public long getLong(java.lang.String);
- public long getLong(java.lang.String, long);
- public long[] getLongArray(java.lang.String);
- public java.lang.String getPairValue();
- public java.lang.String getString(java.lang.String);
- public java.lang.String getString(java.lang.String, java.lang.String);
- public java.lang.String[] getStringArray(java.lang.String);
- public boolean isEmpty();
- public boolean isEmptyParcel();
- public boolean isParcelled();
- public java.util.Set keySet();
- public static boolean kindofEquals(android.os.BaseBundle, android.os.BaseBundle);
- public boolean kindofEquals(android.os.BaseBundle);
- public boolean maybeIsEmpty();
- public void putAll(android.os.PersistableBundle);
- public void putBoolean(java.lang.String, boolean);
- public void putBooleanArray(java.lang.String, boolean[]);
- public void putDouble(java.lang.String, double);
- public void putDoubleArray(java.lang.String, double[]);
- public void putInt(java.lang.String, int);
- public void putIntArray(java.lang.String, int[]);
- public void putLong(java.lang.String, long);
- public void putLongArray(java.lang.String, long[]);
- public void putString(java.lang.String, java.lang.String);
- public void putStringArray(java.lang.String, java.lang.String[]);
- public void remove(java.lang.String);
- public static void setShouldDefuse(boolean);
- public int size();
-
-
- public int mFlags;
-}
-
--keep class android.os.Binder {
- <init>();
-
- public static android.os.IBinder allowBlocking(android.os.IBinder);
- public void attachInterface(android.os.IInterface, java.lang.String);
- public static void blockUntilThreadAvailable();
- public static long clearCallingIdentity();
- public static void copyAllowBlocking(android.os.IBinder, android.os.IBinder);
- public static android.os.IBinder defaultBlocking(android.os.IBinder);
- public static void disableTracing();
- public void dump(java.io.FileDescriptor, java.lang.String[]);
- protected void dump(java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
- public void dumpAsync(java.io.FileDescriptor, java.lang.String[]);
- public static void enableTracing();
- public static void flushPendingCommands();
- public static int getCallingPid();
- public static int getCallingUid();
- public static android.os.UserHandle getCallingUserHandle();
- public java.lang.String getInterfaceDescriptor();
- public static int getThreadStrictModePolicy();
- public static synchronized android.os.TransactionTracker getTransactionTracker();
- public boolean isBinderAlive();
- public static boolean isProxy(android.os.IInterface);
- public static boolean isTracingEnabled();
- public static void joinThreadPool();
- public void linkToDeath(android.os.IBinder$DeathRecipient, int);
- public void onShellCommand(java.io.FileDescriptor, java.io.FileDescriptor, java.io.FileDescriptor, java.lang.String[], android.os.ShellCallback, android.os.ResultReceiver);
- protected boolean onTransact(int, android.os.Parcel, android.os.Parcel, int);
- public boolean pingBinder();
- public android.os.IInterface queryLocalInterface(java.lang.String);
- public static void restoreCallingIdentity(long);
- public static void setDumpDisabled(java.lang.String);
- public static void setThreadStrictModePolicy(int);
- public static void setWarnOnBlocking(boolean);
- public void shellCommand(java.io.FileDescriptor, java.io.FileDescriptor, java.io.FileDescriptor, java.lang.String[], android.os.ShellCallback, android.os.ResultReceiver);
- public boolean transact(int, android.os.Parcel, android.os.Parcel, int);
- public boolean unlinkToDeath(android.os.IBinder$DeathRecipient, int);
- public static void withCleanCallingIdentity(com.android.internal.util.FunctionalUtils$ThrowingRunnable);
- public static java.lang.Object withCleanCallingIdentity(com.android.internal.util.FunctionalUtils$ThrowingSupplier);
-
-
- public static boolean CHECK_PARCEL_SIZE;
- public static boolean LOG_RUNTIME_EXCEPTION;
-}
-
--keep class android.os.Bundle {
- <init>();
- <init>(android.os.Parcel);
- <init>(android.os.Parcel, int);
- <init>(java.lang.ClassLoader);
- <init>(int);
- <init>(android.os.Bundle);
- <init>(android.os.PersistableBundle);
-
- public void clear();
- public java.lang.Object clone();
- public android.os.Bundle deepCopy();
- public int describeContents();
- public android.os.Bundle filterValues();
- public static android.os.Bundle forPair(java.lang.String, java.lang.String);
- public android.os.IBinder getBinder(java.lang.String);
- public android.os.Bundle getBundle(java.lang.String);
- public byte getByte(java.lang.String);
- public java.lang.Byte getByte(java.lang.String, byte);
- public byte[] getByteArray(java.lang.String);
- public char getChar(java.lang.String);
- public char getChar(java.lang.String, char);
- public char[] getCharArray(java.lang.String);
- public java.lang.CharSequence getCharSequence(java.lang.String);
- public java.lang.CharSequence getCharSequence(java.lang.String, java.lang.CharSequence);
- public java.lang.CharSequence[] getCharSequenceArray(java.lang.String);
- public java.util.ArrayList getCharSequenceArrayList(java.lang.String);
- public java.lang.ClassLoader getClassLoader();
- public float getFloat(java.lang.String);
- public float getFloat(java.lang.String, float);
- public float[] getFloatArray(java.lang.String);
- public android.os.IBinder getIBinder(java.lang.String);
- public java.util.ArrayList getIntegerArrayList(java.lang.String);
- public android.os.Parcelable getParcelable(java.lang.String);
- public android.os.Parcelable[] getParcelableArray(java.lang.String);
- public java.util.ArrayList getParcelableArrayList(java.lang.String);
- public java.io.Serializable getSerializable(java.lang.String);
- public short getShort(java.lang.String);
- public short getShort(java.lang.String, short);
- public short[] getShortArray(java.lang.String);
- public int getSize();
- public android.util.Size getSize(java.lang.String);
- public android.util.SizeF getSizeF(java.lang.String);
- public android.util.SparseArray getSparseParcelableArray(java.lang.String);
- public java.util.ArrayList getStringArrayList(java.lang.String);
- public boolean hasFileDescriptors();
- public void putAll(android.os.Bundle);
- public void putBinder(java.lang.String, android.os.IBinder);
- public void putBundle(java.lang.String, android.os.Bundle);
- public void putByte(java.lang.String, byte);
- public void putByteArray(java.lang.String, byte[]);
- public void putChar(java.lang.String, char);
- public void putCharArray(java.lang.String, char[]);
- public void putCharSequence(java.lang.String, java.lang.CharSequence);
- public void putCharSequenceArray(java.lang.String, java.lang.CharSequence[]);
- public void putCharSequenceArrayList(java.lang.String, java.util.ArrayList);
- public void putFloat(java.lang.String, float);
- public void putFloatArray(java.lang.String, float[]);
- public void putIBinder(java.lang.String, android.os.IBinder);
- public void putIntegerArrayList(java.lang.String, java.util.ArrayList);
- public void putParcelable(java.lang.String, android.os.Parcelable);
- public void putParcelableArray(java.lang.String, android.os.Parcelable[]);
- public void putParcelableArrayList(java.lang.String, java.util.ArrayList);
- public void putParcelableList(java.lang.String, java.util.List);
- public void putSerializable(java.lang.String, java.io.Serializable);
- public void putShort(java.lang.String, short);
- public void putShortArray(java.lang.String, short[]);
- public void putSize(java.lang.String, android.util.Size);
- public void putSizeF(java.lang.String, android.util.SizeF);
- public void putSparseParcelableArray(java.lang.String, android.util.SparseArray);
- public void putStringArrayList(java.lang.String, java.util.ArrayList);
- public void readFromParcel(android.os.Parcel);
- public void remove(java.lang.String);
- public boolean setAllowFds(boolean);
- public void setClassLoader(java.lang.ClassLoader);
- public void setDefusable(boolean);
- public static android.os.Bundle setDefusable(android.os.Bundle, boolean);
- public synchronized java.lang.String toShortString();
- public synchronized java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
- public void writeToProto(android.util.proto.ProtoOutputStream, long);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public static android.os.Bundle EMPTY;
- public static android.os.Bundle STRIPPED;
-}
-
--keep class android.os.CancellationSignal {
- <init>();
-
- public void cancel();
- public static android.os.ICancellationSignal createTransport();
- public static android.os.CancellationSignal fromTransport(android.os.ICancellationSignal);
- public boolean isCanceled();
- public void setOnCancelListener(android.os.CancellationSignal$OnCancelListener);
- public void setRemote(android.os.ICancellationSignal);
- public void throwIfCanceled();
-
-
-}
-
--keep class android.os.CancellationSignal$OnCancelListener {
-
- public abstract void onCancel();
-
-
-}
-
--keep class android.os.Debug {
-
- public static void attachJvmtiAgent(java.lang.String, java.lang.String, java.lang.ClassLoader);
- public static boolean cacheRegisterMap(java.lang.String);
- public static void changeDebugPort(int);
- public static long countInstancesOfClass(java.lang.Class);
- public static void dumpHprofData(java.lang.String);
- public static void dumpHprofData(java.lang.String, java.io.FileDescriptor);
- public static void dumpHprofDataDdms();
- public static boolean dumpJavaBacktraceToFileTimeout(int, java.lang.String, int);
- public static boolean dumpNativeBacktraceToFileTimeout(int, java.lang.String, int);
- public static void dumpNativeHeap(java.io.FileDescriptor);
- public static void dumpNativeMallocInfo(java.io.FileDescriptor);
- public static void dumpReferenceTables();
- public static boolean dumpService(java.lang.String, java.io.FileDescriptor, java.lang.String[]);
- public static void enableEmulatorTraceOutput();
- public static int getBinderDeathObjectCount();
- public static int getBinderLocalObjectCount();
- public static int getBinderProxyObjectCount();
- public static int getBinderReceivedTransactions();
- public static int getBinderSentTransactions();
- public static java.lang.String getCaller();
- public static java.lang.String getCallers(int);
- public static java.lang.String getCallers(int, int);
- public static java.lang.String getCallers(int, java.lang.String);
- public static int getGlobalAllocCount();
- public static int getGlobalAllocSize();
- public static int getGlobalClassInitCount();
- public static int getGlobalClassInitTime();
- public static int getGlobalExternalAllocCount();
- public static int getGlobalExternalAllocSize();
- public static int getGlobalExternalFreedCount();
- public static int getGlobalExternalFreedSize();
- public static int getGlobalFreedCount();
- public static int getGlobalFreedSize();
- public static int getGlobalGcInvocationCount();
- public static int getLoadedClassCount();
- public static void getMemInfo(long[]);
- public static void getMemoryInfo(android.os.Debug$MemoryInfo);
- public static void getMemoryInfo(int, android.os.Debug$MemoryInfo);
- public static int getMethodTracingMode();
- public static long getNativeHeapAllocatedSize();
- public static long getNativeHeapFreeSize();
- public static long getNativeHeapSize();
- public static long getPss();
- public static long getPss(int, long[], long[]);
- public static java.lang.String getRuntimeStat(java.lang.String);
- public static java.util.Map getRuntimeStats();
- public static int getThreadAllocCount();
- public static int getThreadAllocSize();
- public static int getThreadExternalAllocCount();
- public static int getThreadExternalAllocSize();
- public static int getThreadGcInvocationCount();
- public static java.lang.String getUnreachableMemory(int, boolean);
- public static java.lang.String[] getVmFeatureList();
- public static boolean isDebuggerConnected();
- public static void printLoadedClasses(int);
- public static void resetAllCounts();
- public static void resetGlobalAllocCount();
- public static void resetGlobalAllocSize();
- public static void resetGlobalClassInitCount();
- public static void resetGlobalClassInitTime();
- public static void resetGlobalExternalAllocCount();
- public static void resetGlobalExternalAllocSize();
- public static void resetGlobalExternalFreedCount();
- public static void resetGlobalExternalFreedSize();
- public static void resetGlobalFreedCount();
- public static void resetGlobalFreedSize();
- public static void resetGlobalGcInvocationCount();
- public static void resetThreadAllocCount();
- public static void resetThreadAllocSize();
- public static void resetThreadExternalAllocCount();
- public static void resetThreadExternalAllocSize();
- public static void resetThreadGcInvocationCount();
- public static int setAllocationLimit(int);
- public static void setFieldsOn(java.lang.Class);
- public static void setFieldsOn(java.lang.Class, boolean);
- public static int setGlobalAllocationLimit(int);
- public static void startAllocCounting();
- public static void startMethodTracing();
- public static void startMethodTracing(java.lang.String);
- public static void startMethodTracing(java.lang.String, int);
- public static void startMethodTracing(java.lang.String, int, int);
- public static void startMethodTracing(java.lang.String, java.io.FileDescriptor, int, int, boolean);
- public static void startMethodTracingDdms(int, int, boolean, int);
- public static void startMethodTracingSampling(java.lang.String, int, int);
- public static void startNativeTracing();
- public static void stopAllocCounting();
- public static void stopMethodTracing();
- public static void stopNativeTracing();
- public static long threadCpuTimeNanos();
- public static void waitForDebugger();
- public static boolean waitingForDebugger();
-
-
- public static int MEMINFO_BUFFERS;
- public static int MEMINFO_CACHED;
- public static int MEMINFO_COUNT;
- public static int MEMINFO_FREE;
- public static int MEMINFO_KERNEL_STACK;
- public static int MEMINFO_MAPPED;
- public static int MEMINFO_PAGE_TABLES;
- public static int MEMINFO_SHMEM;
- public static int MEMINFO_SLAB;
- public static int MEMINFO_SLAB_RECLAIMABLE;
- public static int MEMINFO_SLAB_UNRECLAIMABLE;
- public static int MEMINFO_SWAP_FREE;
- public static int MEMINFO_SWAP_TOTAL;
- public static int MEMINFO_TOTAL;
- public static int MEMINFO_VM_ALLOC_USED;
- public static int MEMINFO_ZRAM_TOTAL;
- public static int SHOW_CLASSLOADER;
- public static int SHOW_FULL_DETAIL;
- public static int SHOW_INITIALIZED;
- public static int TRACE_COUNT_ALLOCS;
-}
-
--keep class android.os.Debug$MemoryInfo {
- <init>();
-
- public int describeContents();
- public java.lang.String getMemoryStat(java.lang.String);
- public java.util.Map getMemoryStats();
- public static java.lang.String getOtherLabel(int);
- public int getOtherPrivate(int);
- public int getOtherPrivateClean(int);
- public int getOtherPrivateDirty(int);
- public int getOtherPss(int);
- public int getOtherRss(int);
- public int getOtherSharedClean(int);
- public int getOtherSharedDirty(int);
- public int getOtherSwappablePss(int);
- public int getOtherSwappedOut(int);
- public int getOtherSwappedOutPss(int);
- public int getSummaryCode();
- public int getSummaryGraphics();
- public int getSummaryJavaHeap();
- public int getSummaryNativeHeap();
- public int getSummaryPrivateOther();
- public int getSummaryStack();
- public int getSummarySystem();
- public int getSummaryTotalPss();
- public int getSummaryTotalSwap();
- public int getSummaryTotalSwapPss();
- public int getTotalPrivateClean();
- public int getTotalPrivateDirty();
- public int getTotalPss();
- public int getTotalRss();
- public int getTotalSharedClean();
- public int getTotalSharedDirty();
- public int getTotalSwappablePss();
- public int getTotalSwappedOut();
- public int getTotalSwappedOutPss();
- public int getTotalUss();
- public boolean hasSwappedOutPss();
- public void readFromParcel(android.os.Parcel);
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public static int HEAP_DALVIK;
- public static int HEAP_NATIVE;
- public static int HEAP_UNKNOWN;
- public static int NUM_CATEGORIES;
- public static int NUM_DVK_STATS;
- public static int NUM_OTHER_STATS;
- public static int OFFSET_PRIVATE_CLEAN;
- public static int OFFSET_PRIVATE_DIRTY;
- public static int OFFSET_PSS;
- public static int OFFSET_RSS;
- public static int OFFSET_SHARED_CLEAN;
- public static int OFFSET_SHARED_DIRTY;
- public static int OFFSET_SWAPPABLE_PSS;
- public static int OFFSET_SWAPPED_OUT;
- public static int OFFSET_SWAPPED_OUT_PSS;
- public static int OTHER_APK;
- public static int OTHER_ART;
- public static int OTHER_ART_APP;
- public static int OTHER_ART_BOOT;
- public static int OTHER_ASHMEM;
- public static int OTHER_CURSOR;
- public static int OTHER_DALVIK_LARGE;
- public static int OTHER_DALVIK_NON_MOVING;
- public static int OTHER_DALVIK_NORMAL;
- public static int OTHER_DALVIK_OTHER;
- public static int OTHER_DALVIK_OTHER_ACCOUNTING;
- public static int OTHER_DALVIK_OTHER_CODE_CACHE;
- public static int OTHER_DALVIK_OTHER_COMPILER_METADATA;
- public static int OTHER_DALVIK_OTHER_INDIRECT_REFERENCE_TABLE;
- public static int OTHER_DALVIK_OTHER_LINEARALLOC;
- public static int OTHER_DALVIK_ZYGOTE;
- public static int OTHER_DEX;
- public static int OTHER_DEX_APP_DEX;
- public static int OTHER_DEX_APP_VDEX;
- public static int OTHER_DEX_BOOT_VDEX;
- public static int OTHER_DVK_STAT_ART_END;
- public static int OTHER_DVK_STAT_ART_START;
- public static int OTHER_DVK_STAT_DALVIK_END;
- public static int OTHER_DVK_STAT_DALVIK_OTHER_END;
- public static int OTHER_DVK_STAT_DALVIK_OTHER_START;
- public static int OTHER_DVK_STAT_DALVIK_START;
- public static int OTHER_DVK_STAT_DEX_END;
- public static int OTHER_DVK_STAT_DEX_START;
- public static int OTHER_GL;
- public static int OTHER_GL_DEV;
- public static int OTHER_GRAPHICS;
- public static int OTHER_JAR;
- public static int OTHER_OAT;
- public static int OTHER_OTHER_MEMTRACK;
- public static int OTHER_SO;
- public static int OTHER_STACK;
- public static int OTHER_TTF;
- public static int OTHER_UNKNOWN_DEV;
- public static int OTHER_UNKNOWN_MAP;
- public int dalvikPrivateClean;
- public int dalvikPrivateDirty;
- public int dalvikPss;
- public int dalvikRss;
- public int dalvikSharedClean;
- public int dalvikSharedDirty;
- public int dalvikSwappablePss;
- public int dalvikSwappedOut;
- public int dalvikSwappedOutPss;
- public boolean hasSwappedOutPss;
- public int nativePrivateClean;
- public int nativePrivateDirty;
- public int nativePss;
- public int nativeRss;
- public int nativeSharedClean;
- public int nativeSharedDirty;
- public int nativeSwappablePss;
- public int nativeSwappedOut;
- public int nativeSwappedOutPss;
- public int otherPrivateClean;
- public int otherPrivateDirty;
- public int otherPss;
- public int otherRss;
- public int otherSharedClean;
- public int otherSharedDirty;
- public int otherSwappablePss;
- public int otherSwappedOut;
- public int otherSwappedOutPss;
-}
-
--keep class android.os.Handler {
- <init>();
- <init>(android.os.Handler$Callback);
- <init>(android.os.Looper);
- <init>(android.os.Looper, android.os.Handler$Callback);
- <init>(boolean);
- <init>(android.os.Handler$Callback, boolean);
- <init>(android.os.Looper, android.os.Handler$Callback, boolean);
-
- public static android.os.Handler createAsync(android.os.Looper);
- public static android.os.Handler createAsync(android.os.Looper, android.os.Handler$Callback);
- public void dispatchMessage(android.os.Message);
- public void dump(android.util.Printer, java.lang.String);
- public void dumpMine(android.util.Printer, java.lang.String);
- public boolean executeOrSendMessage(android.os.Message);
- public android.os.Looper getLooper();
- public static android.os.Handler getMain();
- public java.lang.String getMessageName(android.os.Message);
- public java.lang.String getTraceName(android.os.Message);
- public void handleMessage(android.os.Message);
- public boolean hasCallbacks(java.lang.Runnable);
- public boolean hasMessages(int);
- public boolean hasMessages(int, java.lang.Object);
- public boolean hasMessagesOrCallbacks();
- public static android.os.Handler mainIfNull(android.os.Handler);
- public android.os.Message obtainMessage();
- public android.os.Message obtainMessage(int);
- public android.os.Message obtainMessage(int, java.lang.Object);
- public android.os.Message obtainMessage(int, int, int);
- public android.os.Message obtainMessage(int, int, int, java.lang.Object);
- public boolean post(java.lang.Runnable);
- public boolean postAtFrontOfQueue(java.lang.Runnable);
- public boolean postAtTime(java.lang.Runnable, long);
- public boolean postAtTime(java.lang.Runnable, java.lang.Object, long);
- public boolean postDelayed(java.lang.Runnable, long);
- public boolean postDelayed(java.lang.Runnable, java.lang.Object, long);
- public void removeCallbacks(java.lang.Runnable);
- public void removeCallbacks(java.lang.Runnable, java.lang.Object);
- public void removeCallbacksAndMessages(java.lang.Object);
- public void removeMessages(int);
- public void removeMessages(int, java.lang.Object);
- public boolean runWithScissors(java.lang.Runnable, long);
- public boolean sendEmptyMessage(int);
- public boolean sendEmptyMessageAtTime(int, long);
- public boolean sendEmptyMessageDelayed(int, long);
- public boolean sendMessage(android.os.Message);
- public boolean sendMessageAtFrontOfQueue(android.os.Message);
- public boolean sendMessageAtTime(android.os.Message, long);
- public boolean sendMessageDelayed(android.os.Message, long);
- public java.lang.String toString();
-
-
-}
-
--keep class android.os.Handler$Callback {
-
- public abstract boolean handleMessage(android.os.Message);
-
-
-}
-
--keep class android.os.IBinder {
-
- public abstract void dump(java.io.FileDescriptor, java.lang.String[]);
- public abstract void dumpAsync(java.io.FileDescriptor, java.lang.String[]);
- public abstract java.lang.String getInterfaceDescriptor();
- public abstract boolean isBinderAlive();
- public abstract void linkToDeath(android.os.IBinder$DeathRecipient, int);
- public abstract boolean pingBinder();
- public abstract android.os.IInterface queryLocalInterface(java.lang.String);
- public abstract void shellCommand(java.io.FileDescriptor, java.io.FileDescriptor, java.io.FileDescriptor, java.lang.String[], android.os.ShellCallback, android.os.ResultReceiver);
- public abstract boolean transact(int, android.os.Parcel, android.os.Parcel, int);
- public abstract boolean unlinkToDeath(android.os.IBinder$DeathRecipient, int);
-
-
- public static int DUMP_TRANSACTION;
- public static int FIRST_CALL_TRANSACTION;
- public static int FLAG_ONEWAY;
- public static int INTERFACE_TRANSACTION;
- public static int LAST_CALL_TRANSACTION;
- public static int LIKE_TRANSACTION;
- public static int MAX_IPC_SIZE;
- public static int PING_TRANSACTION;
- public static int SHELL_COMMAND_TRANSACTION;
- public static int SYSPROPS_TRANSACTION;
- public static int TWEET_TRANSACTION;
-}
-
--keep class android.os.IBinder$DeathRecipient {
-
- public abstract void binderDied();
-
-
-}
-
--keep class android.os.ICancellationSignal {
-
- public abstract void cancel();
-
-
-}
-
--keep class android.os.IInterface {
-
- public abstract android.os.IBinder asBinder();
-
-
-}
-
--keep class android.os.IProgressListener {
-
- public abstract void onFinished(int, android.os.Bundle);
- public abstract void onProgress(int, int, android.os.Bundle);
- public abstract void onStarted(int, android.os.Bundle);
-
-
-}
-
--keep class android.os.IRemoteCallback {
-
- public abstract void sendResult(android.os.Bundle);
-
-
-}
-
--keep class android.os.LocaleList {
- <init>(java.util.Locale[]);
- <init>(java.util.Locale, android.os.LocaleList);
-
- public int describeContents();
- public boolean equals(java.lang.Object);
- public static android.os.LocaleList forLanguageTags(java.lang.String);
- public java.util.Locale get(int);
- public static android.os.LocaleList getAdjustedDefault();
- public static android.os.LocaleList getDefault();
- public static android.os.LocaleList getEmptyLocaleList();
- public java.util.Locale getFirstMatch(java.lang.String[]);
- public int getFirstMatchIndex(java.lang.String[]);
- public int getFirstMatchIndexWithEnglishSupported(java.util.Collection);
- public int getFirstMatchIndexWithEnglishSupported(java.lang.String[]);
- public java.util.Locale getFirstMatchWithEnglishSupported(java.lang.String[]);
- public int hashCode();
- public int indexOf(java.util.Locale);
- public boolean isEmpty();
- public static boolean isPseudoLocale(java.util.Locale);
- public static boolean isPseudoLocalesOnly(java.lang.String[]);
- public static void setDefault(android.os.LocaleList);
- public static void setDefault(android.os.LocaleList, int);
- public int size();
- public java.lang.String toLanguageTags();
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
- public void writeToProto(android.util.proto.ProtoOutputStream, long);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.os.Looper {
-
- public void dump(android.util.Printer, java.lang.String);
- public void dump(android.util.Printer, java.lang.String, android.os.Handler);
- public static android.os.Looper getMainLooper();
- public android.os.MessageQueue getQueue();
- public java.lang.Thread getThread();
- public boolean isCurrentThread();
- public static void loop();
- public static android.os.Looper myLooper();
- public static android.os.MessageQueue myQueue();
- public static void prepare();
- public static void prepareMainLooper();
- public void quit();
- public void quitSafely();
- public void setMessageLogging(android.util.Printer);
- public void setSlowLogThresholdMs(long, long);
- public void setTraceTag(long);
- public java.lang.String toString();
- public void writeToProto(android.util.proto.ProtoOutputStream, long);
-
-
-}
-
--keep class android.os.Message {
- <init>();
-
- public void copyFrom(android.os.Message);
- public int describeContents();
- public java.lang.Runnable getCallback();
- public android.os.Bundle getData();
- public android.os.Handler getTarget();
- public long getWhen();
- public boolean isAsynchronous();
- public static android.os.Message obtain();
- public static android.os.Message obtain(android.os.Message);
- public static android.os.Message obtain(android.os.Handler);
- public static android.os.Message obtain(android.os.Handler, java.lang.Runnable);
- public static android.os.Message obtain(android.os.Handler, int);
- public static android.os.Message obtain(android.os.Handler, int, java.lang.Object);
- public static android.os.Message obtain(android.os.Handler, int, int, int);
- public static android.os.Message obtain(android.os.Handler, int, int, int, java.lang.Object);
- public android.os.Bundle peekData();
- public void recycle();
- public void sendToTarget();
- public void setAsynchronous(boolean);
- public android.os.Message setCallback(java.lang.Runnable);
- public void setData(android.os.Bundle);
- public void setTarget(android.os.Handler);
- public android.os.Message setWhat(int);
- public java.lang.String toString();
- public static void updateCheckRecycle(int);
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public int arg1;
- public int arg2;
- public java.lang.Object obj;
- public android.os.Messenger replyTo;
- public static java.lang.Object sPoolSync;
- public int sendingUid;
- public int what;
-}
-
--keep class android.os.MessageQueue {
-
- public void addIdleHandler(android.os.MessageQueue$IdleHandler);
- public void addOnFileDescriptorEventListener(java.io.FileDescriptor, int, android.os.MessageQueue$OnFileDescriptorEventListener);
- protected void finalize();
- public boolean isIdle();
- public boolean isPolling();
- public int postSyncBarrier();
- public void removeIdleHandler(android.os.MessageQueue$IdleHandler);
- public void removeOnFileDescriptorEventListener(java.io.FileDescriptor);
- public void removeSyncBarrier(int);
-
-
-}
-
--keep class android.os.MessageQueue$IdleHandler {
-
- public abstract boolean queueIdle();
-
-
-}
-
--keep class android.os.MessageQueue$OnFileDescriptorEventListener {
-
- public abstract int onFileDescriptorEvents(java.io.FileDescriptor, int);
-
-
- public static int EVENT_ERROR;
- public static int EVENT_INPUT;
- public static int EVENT_OUTPUT;
-}
-
--keep class android.os.Messenger {
- <init>(android.os.Handler);
- <init>(android.os.IBinder);
-
- public int describeContents();
- public boolean equals(java.lang.Object);
- public android.os.IBinder getBinder();
- public int hashCode();
- public static android.os.Messenger readMessengerOrNullFromParcel(android.os.Parcel);
- public void send(android.os.Message);
- public static void writeMessengerOrNullToParcel(android.os.Messenger, android.os.Parcel);
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.os.Parcel {
-
- public void adoptClassCookies(android.os.Parcel);
- public void appendFrom(android.os.Parcel, int, int);
- public int compareData(android.os.Parcel);
- public java.util.Map copyClassCookies();
- public android.os.IBinder[] createBinderArray();
- public java.util.ArrayList createBinderArrayList();
- public boolean[] createBooleanArray();
- public byte[] createByteArray();
- public char[] createCharArray();
- public double[] createDoubleArray();
- public float[] createFloatArray();
- public int[] createIntArray();
- public long[] createLongArray();
- public java.io.FileDescriptor[] createRawFileDescriptorArray();
- public java.lang.String[] createStringArray();
- public java.util.ArrayList createStringArrayList();
- public java.lang.Object[] createTypedArray(android.os.Parcelable$Creator);
- public java.util.ArrayList createTypedArrayList(android.os.Parcelable$Creator);
- public int dataAvail();
- public int dataCapacity();
- public int dataPosition();
- public int dataSize();
- public void enforceInterface(java.lang.String);
- protected void finalize();
- public long getBlobAshmemSize();
- public java.lang.Object getClassCookie(java.lang.Class);
- public static long getGlobalAllocCount();
- public static long getGlobalAllocSize();
- public boolean hasFileDescriptors();
- public boolean hasReadWriteHelper();
- public byte[] marshall();
- public static android.os.Parcel obtain();
- protected static android.os.Parcel obtain(int);
- protected static android.os.Parcel obtain(long);
- public boolean pushAllowFds(boolean);
- public void putClassCookies(java.util.Map);
- public java.lang.Object[] readArray(java.lang.ClassLoader);
- public java.util.ArrayList readArrayList(java.lang.ClassLoader);
- public void readArrayMap(android.util.ArrayMap, java.lang.ClassLoader);
- public android.util.ArraySet readArraySet(java.lang.ClassLoader);
- public void readBinderArray(android.os.IBinder[]);
- public void readBinderList(java.util.List);
- public byte[] readBlob();
- public boolean readBoolean();
- public void readBooleanArray(boolean[]);
- public android.os.Bundle readBundle();
- public android.os.Bundle readBundle(java.lang.ClassLoader);
- public byte readByte();
- public void readByteArray(byte[]);
- public void readCharArray(char[]);
- public java.lang.CharSequence readCharSequence();
- public java.lang.CharSequence[] readCharSequenceArray();
- public java.util.ArrayList readCharSequenceList();
- public android.os.Parcelable readCreator(android.os.Parcelable$Creator, java.lang.ClassLoader);
- public double readDouble();
- public void readDoubleArray(double[]);
- public void readException();
- public void readException(int, java.lang.String);
- public int readExceptionCode();
- public android.os.ParcelFileDescriptor readFileDescriptor();
- public float readFloat();
- public void readFloatArray(float[]);
- public java.util.HashMap readHashMap(java.lang.ClassLoader);
- public int readInt();
- public void readIntArray(int[]);
- public void readList(java.util.List, java.lang.ClassLoader);
- public long readLong();
- public void readLongArray(long[]);
- public void readMap(java.util.Map, java.lang.ClassLoader);
- public android.os.Parcelable readParcelable(java.lang.ClassLoader);
- public android.os.Parcelable[] readParcelableArray(java.lang.ClassLoader);
- public android.os.Parcelable[] readParcelableArray(java.lang.ClassLoader, java.lang.Class);
- public android.os.Parcelable$Creator readParcelableCreator(java.lang.ClassLoader);
- public java.util.List readParcelableList(java.util.List, java.lang.ClassLoader);
- public android.os.PersistableBundle readPersistableBundle();
- public android.os.PersistableBundle readPersistableBundle(java.lang.ClassLoader);
- public java.io.FileDescriptor readRawFileDescriptor();
- public void readRawFileDescriptorArray(java.io.FileDescriptor[]);
- public java.io.Serializable readSerializable();
- public android.util.Size readSize();
- public android.util.SizeF readSizeF();
- public android.util.SparseArray readSparseArray(java.lang.ClassLoader);
- public android.util.SparseBooleanArray readSparseBooleanArray();
- public android.util.SparseIntArray readSparseIntArray();
- public java.lang.String readString();
- public void readStringArray(java.lang.String[]);
- public java.lang.String[] readStringArray();
- public void readStringList(java.util.List);
- public java.lang.String readStringNoHelper();
- public android.os.IBinder readStrongBinder();
- public void readTypedArray(java.lang.Object[], android.os.Parcelable$Creator);
- public java.lang.Object[] readTypedArray(android.os.Parcelable$Creator);
- public void readTypedList(java.util.List, android.os.Parcelable$Creator);
- public java.lang.Object readTypedObject(android.os.Parcelable$Creator);
- public java.lang.Object readValue(java.lang.ClassLoader);
- public void recycle();
- public void restoreAllowFds(boolean);
- public void setClassCookie(java.lang.Class, java.lang.Object);
- public void setDataCapacity(int);
- public void setDataPosition(int);
- public void setDataSize(int);
- public void setReadWriteHelper(android.os.Parcel$ReadWriteHelper);
- public static void setStackTraceParceling(boolean);
- public void unmarshall(byte[], int, int);
- public void writeArray(java.lang.Object[]);
- public void writeArrayMap(android.util.ArrayMap);
- public void writeArraySet(android.util.ArraySet);
- public void writeBinderArray(android.os.IBinder[]);
- public void writeBinderList(java.util.List);
- public void writeBlob(byte[]);
- public void writeBlob(byte[], int, int);
- public void writeBoolean(boolean);
- public void writeBooleanArray(boolean[]);
- public void writeBundle(android.os.Bundle);
- public void writeByte(byte);
- public void writeByteArray(byte[]);
- public void writeByteArray(byte[], int, int);
- public void writeCharArray(char[]);
- public void writeCharSequence(java.lang.CharSequence);
- public void writeCharSequenceArray(java.lang.CharSequence[]);
- public void writeCharSequenceList(java.util.ArrayList);
- public void writeDouble(double);
- public void writeDoubleArray(double[]);
- public void writeException(java.lang.Exception);
- public void writeFileDescriptor(java.io.FileDescriptor);
- public void writeFloat(float);
- public void writeFloatArray(float[]);
- public void writeInt(int);
- public void writeIntArray(int[]);
- public void writeInterfaceToken(java.lang.String);
- public void writeList(java.util.List);
- public void writeLong(long);
- public void writeLongArray(long[]);
- public void writeMap(java.util.Map);
- public void writeNoException();
- public void writeParcelable(android.os.Parcelable, int);
- public void writeParcelableArray(android.os.Parcelable[], int);
- public void writeParcelableCreator(android.os.Parcelable);
- public void writeParcelableList(java.util.List, int);
- public void writePersistableBundle(android.os.PersistableBundle);
- public void writeRawFileDescriptor(java.io.FileDescriptor);
- public void writeRawFileDescriptorArray(java.io.FileDescriptor[]);
- public void writeSerializable(java.io.Serializable);
- public void writeSize(android.util.Size);
- public void writeSizeF(android.util.SizeF);
- public void writeSparseArray(android.util.SparseArray);
- public void writeSparseBooleanArray(android.util.SparseBooleanArray);
- public void writeSparseIntArray(android.util.SparseIntArray);
- public void writeString(java.lang.String);
- public void writeStringArray(java.lang.String[]);
- public void writeStringList(java.util.List);
- public void writeStringNoHelper(java.lang.String);
- public void writeStrongBinder(android.os.IBinder);
- public void writeStrongInterface(android.os.IInterface);
- public void writeTypedArray(android.os.Parcelable[], int);
- public void writeTypedList(java.util.List);
- public void writeTypedList(java.util.List, int);
- public void writeTypedObject(android.os.Parcelable, int);
- public void writeValue(java.lang.Object);
-
-
- public static android.os.Parcelable$Creator STRING_CREATOR;
-}
-
--keep class android.os.Parcel$ReadWriteHelper {
- <init>();
-
- public java.lang.String readString(android.os.Parcel);
- public void writeString(android.os.Parcel, java.lang.String);
-
-
- public static android.os.Parcel$ReadWriteHelper DEFAULT;
-}
-
--keep class android.os.ParcelFileDescriptor {
- <init>(android.os.ParcelFileDescriptor);
- <init>(java.io.FileDescriptor);
- <init>(java.io.FileDescriptor, java.io.FileDescriptor);
-
- public static android.os.ParcelFileDescriptor adoptFd(int);
- public boolean canDetectErrors();
- public void checkError();
- public void close();
- public void closeWithError(java.lang.String);
- public static android.os.ParcelFileDescriptor[] createPipe();
- public static android.os.ParcelFileDescriptor[] createReliablePipe();
- public static android.os.ParcelFileDescriptor[] createReliableSocketPair();
- public static android.os.ParcelFileDescriptor[] createReliableSocketPair(int);
- public static android.os.ParcelFileDescriptor[] createSocketPair();
- public static android.os.ParcelFileDescriptor[] createSocketPair(int);
- public int describeContents();
- public int detachFd();
- public static android.os.ParcelFileDescriptor dup(java.io.FileDescriptor);
- public android.os.ParcelFileDescriptor dup();
- protected void finalize();
- public static android.os.ParcelFileDescriptor fromData(byte[], java.lang.String);
- public static android.os.ParcelFileDescriptor fromDatagramSocket(java.net.DatagramSocket);
- public static android.os.ParcelFileDescriptor fromFd(java.io.FileDescriptor, android.os.Handler, android.os.ParcelFileDescriptor$OnCloseListener);
- public static android.os.ParcelFileDescriptor fromFd(int);
- public static android.os.ParcelFileDescriptor fromSocket(java.net.Socket);
- public int getFd();
- public static java.io.File getFile(java.io.FileDescriptor);
- public java.io.FileDescriptor getFileDescriptor();
- public long getStatSize();
- public static android.os.ParcelFileDescriptor open(java.io.File, int);
- public static android.os.ParcelFileDescriptor open(java.io.File, int, android.os.Handler, android.os.ParcelFileDescriptor$OnCloseListener);
- public static int parseMode(java.lang.String);
- public void releaseResources();
- public long seekTo(long);
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public static int MODE_APPEND;
- public static int MODE_CREATE;
- public static int MODE_READ_ONLY;
- public static int MODE_READ_WRITE;
- public static int MODE_TRUNCATE;
- public static int MODE_WORLD_READABLE;
- public static int MODE_WORLD_WRITEABLE;
- public static int MODE_WRITE_ONLY;
-}
-
--keep class android.os.ParcelFileDescriptor$OnCloseListener {
-
- public abstract void onClose(java.io.IOException);
-
-
-}
-
--keep class android.os.Parcelable {
-
- public abstract int describeContents();
- public abstract void writeToParcel(android.os.Parcel, int);
-
-
- public static int CONTENTS_FILE_DESCRIPTOR;
- public static int PARCELABLE_ELIDE_DUPLICATES;
- public static int PARCELABLE_WRITE_RETURN_VALUE;
-}
-
--keep class android.os.Parcelable$ClassLoaderCreator {
-
- public abstract java.lang.Object createFromParcel(android.os.Parcel, java.lang.ClassLoader);
-
-
-}
-
--keep class android.os.Parcelable$Creator {
-
- public abstract java.lang.Object createFromParcel(android.os.Parcel);
- public abstract java.lang.Object[] newArray(int);
-
-
-}
-
--keep class android.os.PatternMatcher {
- <init>(java.lang.String, int);
- <init>(android.os.Parcel);
-
- public int describeContents();
- public java.lang.String getPath();
- public int getType();
- public boolean match(java.lang.String);
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
- public void writeToProto(android.util.proto.ProtoOutputStream, long);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public static int PATTERN_ADVANCED_GLOB;
- public static int PATTERN_LITERAL;
- public static int PATTERN_PREFIX;
- public static int PATTERN_SIMPLE_GLOB;
-}
-
--keep class android.os.PersistableBundle {
- <init>();
- <init>(int);
- <init>(android.os.PersistableBundle);
- <init>(android.os.Bundle);
-
- public java.lang.Object clone();
- public android.os.PersistableBundle deepCopy();
- public int describeContents();
- public static android.os.PersistableBundle forPair(java.lang.String, java.lang.String);
- public android.os.PersistableBundle getPersistableBundle(java.lang.String);
- public static boolean isValidType(java.lang.Object);
- public void putPersistableBundle(java.lang.String, android.os.PersistableBundle);
- public static android.os.PersistableBundle restoreFromXml(org.xmlpull.v1.XmlPullParser);
- public void saveToXml(org.xmlpull.v1.XmlSerializer);
- public synchronized java.lang.String toShortString();
- public synchronized java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
- public void writeToProto(android.util.proto.ProtoOutputStream, long);
- public void writeUnknownObject(java.lang.Object, java.lang.String, org.xmlpull.v1.XmlSerializer);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public static android.os.PersistableBundle EMPTY;
-}
-
--keep class android.os.RemoteException {
- <init>();
- <init>(java.lang.String);
- <init>(java.lang.String, java.lang.Throwable, boolean, boolean);
-
- public java.lang.RuntimeException rethrowAsRuntimeException();
- public java.lang.RuntimeException rethrowFromSystemServer();
-
-
-}
-
--keep class android.os.ResultReceiver {
- <init>(android.os.Handler);
-
- public int describeContents();
- protected void onReceiveResult(int, android.os.Bundle);
- public void send(int, android.os.Bundle);
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.os.ShellCallback {
- <init>();
-
- public int describeContents();
- public android.os.ParcelFileDescriptor onOpenFile(java.lang.String, java.lang.String, java.lang.String);
- public android.os.ParcelFileDescriptor openFile(java.lang.String, java.lang.String, java.lang.String);
- public static void writeToParcel(android.os.ShellCallback, android.os.Parcel);
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.os.ShellCommand {
- <init>();
-
- public android.os.ResultReceiver adoptResultReceiver();
- public int exec(android.os.Binder, java.io.FileDescriptor, java.io.FileDescriptor, java.io.FileDescriptor, java.lang.String[], android.os.ShellCallback, android.os.ResultReceiver);
- public java.io.InputStream getBufferedInputStream();
- public java.io.FileDescriptor getErrFileDescriptor();
- public java.io.PrintWriter getErrPrintWriter();
- public java.io.FileDescriptor getInFileDescriptor();
- public java.lang.String getNextArg();
- public java.lang.String getNextArgRequired();
- public java.lang.String getNextOption();
- public java.io.FileDescriptor getOutFileDescriptor();
- public java.io.PrintWriter getOutPrintWriter();
- public java.io.OutputStream getRawErrorStream();
- public java.io.InputStream getRawInputStream();
- public java.io.OutputStream getRawOutputStream();
- public android.os.ShellCallback getShellCallback();
- public int handleDefaultCommands(java.lang.String);
- public void init(android.os.Binder, java.io.FileDescriptor, java.io.FileDescriptor, java.io.FileDescriptor, java.lang.String[], android.os.ShellCallback, int);
- public abstract int onCommand(java.lang.String);
- public abstract void onHelp();
- public android.os.ParcelFileDescriptor openFileForSystem(java.lang.String, java.lang.String);
- public java.lang.String peekNextArg();
-
-
-}
-
--keep class android.os.StrictMode {
-
- public static android.os.StrictMode$ThreadPolicy allowThreadDiskReads();
- public static int allowThreadDiskReadsMask();
- public static android.os.StrictMode$ThreadPolicy allowThreadDiskWrites();
- public static int allowThreadDiskWritesMask();
- public static void conditionallyCheckInstanceCounts();
- public static void decrementExpectedActivityCount(java.lang.Class);
- public static void disableDeathOnFileUriExposure();
- public static void enableDeathOnFileUriExposure();
- public static void enableDefaults();
- public static android.os.StrictMode$Span enterCriticalSpan(java.lang.String);
- public static android.os.StrictMode$ThreadPolicy getThreadPolicy();
- public static int getThreadPolicyMask();
- public static android.os.StrictMode$VmPolicy getVmPolicy();
- public static void incrementExpectedActivityCount(java.lang.Class);
- public static void initThreadDefaults(android.content.pm.ApplicationInfo);
- public static void initVmDefaults(android.content.pm.ApplicationInfo);
- public static boolean isBundledSystemApp(android.content.pm.ApplicationInfo);
- public static void noteDiskRead();
- public static void noteDiskWrite();
- public static void noteResourceMismatch(java.lang.Object);
- public static void noteSlowCall(java.lang.String);
- public static void noteUnbufferedIO();
- public static void onCleartextNetworkDetected(byte[]);
- public static void onContentUriWithoutPermission(android.net.Uri, java.lang.String);
- public static void onFileUriExposed(android.net.Uri, java.lang.String);
- public static void onIntentReceiverLeaked(java.lang.Throwable);
- public static void onServiceConnectionLeaked(java.lang.Throwable);
- public static void onSqliteObjectLeaked(java.lang.String, java.lang.Throwable);
- public static void onUntaggedSocket();
- public static void onVmPolicyViolation(android.os.strictmode.Violation);
- public static void onVmPolicyViolation(android.os.strictmode.Violation, boolean);
- public static void onWebViewMethodCalledOnWrongThread(java.lang.Throwable);
- public static void setThreadPolicy(android.os.StrictMode$ThreadPolicy);
- public static void setThreadPolicyMask(int);
- public static void setViolationLogger(android.os.StrictMode$ViolationLogger);
- public static void setVmPolicy(android.os.StrictMode$VmPolicy);
- public static java.lang.Object trackActivity(java.lang.Object);
- public static boolean vmCleartextNetworkEnabled();
- public static boolean vmClosableObjectLeaksEnabled();
- public static boolean vmContentUriWithoutPermissionEnabled();
- public static boolean vmFileUriExposureEnabled();
- public static boolean vmRegistrationLeaksEnabled();
- public static boolean vmSqliteObjectLeaksEnabled();
- public static boolean vmUntaggedSocketEnabled();
-
-
- public static java.lang.String CLEARTEXT_DETECTED_MSG;
- public static int DETECT_CUSTOM;
- public static int DETECT_DISK_READ;
- public static int DETECT_DISK_WRITE;
- public static int DETECT_NETWORK;
- public static int DETECT_RESOURCE_MISMATCH;
- public static int DETECT_UNBUFFERED_IO;
- public static int DETECT_VM_ACTIVITY_LEAKS;
- public static int DETECT_VM_CLEARTEXT_NETWORK;
- public static int DETECT_VM_CLOSABLE_LEAKS;
- public static int DETECT_VM_CONTENT_URI_WITHOUT_PERMISSION;
- public static int DETECT_VM_CURSOR_LEAKS;
- public static int DETECT_VM_FILE_URI_EXPOSURE;
- public static int DETECT_VM_INSTANCE_LEAKS;
- public static int DETECT_VM_NON_SDK_API_USAGE;
- public static int DETECT_VM_REGISTRATION_LEAKS;
- public static int DETECT_VM_UNTAGGED_SOCKET;
- public static java.lang.String DISABLE_PROPERTY;
- public static int NETWORK_POLICY_ACCEPT;
- public static int NETWORK_POLICY_LOG;
- public static int NETWORK_POLICY_REJECT;
- public static int PENALTY_DEATH;
- public static int PENALTY_DEATH_ON_CLEARTEXT_NETWORK;
- public static int PENALTY_DEATH_ON_FILE_URI_EXPOSURE;
- public static int PENALTY_DEATH_ON_NETWORK;
- public static int PENALTY_DIALOG;
- public static int PENALTY_DROPBOX;
- public static int PENALTY_FLASH;
- public static int PENALTY_GATHER;
- public static int PENALTY_LOG;
- public static java.lang.String VISUAL_PROPERTY;
-}
-
--keep class android.os.StrictMode$Span {
- <init>();
-
- public void finish();
-
-
-}
-
--keep class android.os.StrictMode$ThreadPolicy {
-
- public java.lang.String toString();
-
-
- public static android.os.StrictMode$ThreadPolicy LAX;
-}
-
--keep class android.os.StrictMode$ViolationInfo {
- <init>(android.os.Parcel);
- <init>(android.os.Parcel, boolean);
-
- public int describeContents();
- public void dump(android.util.Printer, java.lang.String);
- public int getPolicyMask();
- public java.lang.String getStackTrace();
- public int getViolationBit();
- public java.lang.String getViolationDetails();
- public int hashCode();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public java.lang.String broadcastIntentAction;
- public int durationMillis;
- public int numAnimationsRunning;
- public long numInstances;
- public java.lang.String[] tags;
- public int violationNumThisLoop;
- public long violationUptimeMillis;
-}
-
--keep class android.os.StrictMode$ViolationLogger {
-
- public abstract void log(android.os.StrictMode$ViolationInfo);
-
-
-}
-
--keep class android.os.StrictMode$VmPolicy {
-
- public java.lang.String toString();
-
-
- public static android.os.StrictMode$VmPolicy LAX;
-}
-
--keep class android.os.TestLooperManager {
- <init>(android.os.Looper);
-
- public void execute(android.os.Message);
- public android.os.MessageQueue getMessageQueue();
- public android.os.MessageQueue getQueue();
- public boolean hasMessages(android.os.Handler, java.lang.Object, int);
- public boolean hasMessages(android.os.Handler, java.lang.Object, java.lang.Runnable);
- public android.os.Message next();
- public void recycle(android.os.Message);
- public void release();
-
-
-}
-
--keep class android.os.TransactionTracker {
-
- public void addTrace(java.lang.Throwable);
- public void clearTraces();
- public void writeTracesToFile(android.os.ParcelFileDescriptor);
-
-
-}
-
--keep class android.os.UserHandle {
- <init>(int);
- <init>(android.os.Parcel);
-
- public int describeContents();
- public boolean equals(java.lang.Object);
- public static void formatUid(java.lang.StringBuilder, int);
- public static java.lang.String formatUid(int);
- public static void formatUid(java.io.PrintWriter, int);
- public static int getAppId(int);
- public static int getAppIdFromSharedAppGid(int);
- public static int getCacheAppGid(int);
- public static int getCacheAppGid(int, int);
- public static int getCallingAppId();
- public static int getCallingUserId();
- public int getIdentifier();
- public static int getSharedAppGid(int);
- public static int getSharedAppGid(int, int);
- public static int getUid(int, int);
- public static int getUserGid(int);
- public static android.os.UserHandle getUserHandleForUid(int);
- public static int getUserId(int);
- public int hashCode();
- public static boolean isApp(int);
- public static boolean isCore(int);
- public static boolean isIsolated(int);
- public boolean isOwner();
- public static boolean isSameApp(int, int);
- public static boolean isSameUser(int, int);
- public boolean isSystem();
- public static int myUserId();
- public static android.os.UserHandle of(int);
- public static int parseUserArg(java.lang.String);
- public static android.os.UserHandle readFromParcel(android.os.Parcel);
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
- public static void writeToParcel(android.os.UserHandle, android.os.Parcel);
-
-
- public static int AID_APP_END;
- public static int AID_APP_START;
- public static int AID_CACHE_GID_START;
- public static int AID_ROOT;
- public static int AID_SHARED_GID_START;
- public static android.os.UserHandle ALL;
- public static android.os.Parcelable$Creator CREATOR;
- public static android.os.UserHandle CURRENT;
- public static android.os.UserHandle CURRENT_OR_SELF;
- public static int ERR_GID;
- public static boolean MU_ENABLED;
- public static android.os.UserHandle OWNER;
- public static int PER_USER_RANGE;
- public static android.os.UserHandle SYSTEM;
- public static int USER_ALL;
- public static int USER_CURRENT;
- public static int USER_CURRENT_OR_SELF;
- public static int USER_NULL;
- public static int USER_OWNER;
- public static int USER_SERIAL_SYSTEM;
- public static int USER_SYSTEM;
-}
-
--keep class android.os.VibrationEffect {
- <init>();
-
- public static android.os.VibrationEffect createOneShot(long, int);
- public static android.os.VibrationEffect createWaveform(long[], int);
- public static android.os.VibrationEffect createWaveform(long[], int[], int);
- public int describeContents();
- public static android.os.VibrationEffect get(int);
- public static android.os.VibrationEffect get(int, boolean);
- public static android.os.VibrationEffect get(android.net.Uri, android.content.Context);
- public abstract long getDuration();
- protected static int scale(int, float, int);
- public abstract void validate();
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public static int DEFAULT_AMPLITUDE;
- public static int EFFECT_CLICK;
- public static int EFFECT_DOUBLE_CLICK;
- public static int EFFECT_HEAVY_CLICK;
- public static int EFFECT_POP;
- public static int EFFECT_THUD;
- public static int EFFECT_TICK;
- public static int MAX_AMPLITUDE;
- public static int[] RINGTONES;
-}
-
--keep class android.os.Vibrator {
- <init>();
- <init>(android.content.Context);
-
- public abstract void cancel();
- public int getDefaultHapticFeedbackIntensity();
- public int getDefaultNotificationVibrationIntensity();
- public abstract boolean hasAmplitudeControl();
- public abstract boolean hasVibrator();
- public void vibrate(long);
- public void vibrate(long, android.media.AudioAttributes);
- public void vibrate(long[], int);
- public void vibrate(long[], int, android.media.AudioAttributes);
- public void vibrate(android.os.VibrationEffect);
- public void vibrate(android.os.VibrationEffect, android.media.AudioAttributes);
- public abstract void vibrate(int, java.lang.String, android.os.VibrationEffect, android.media.AudioAttributes);
-
-
- public static int VIBRATION_INTENSITY_HIGH;
- public static int VIBRATION_INTENSITY_LOW;
- public static int VIBRATION_INTENSITY_MEDIUM;
- public static int VIBRATION_INTENSITY_OFF;
-}
-
--keep class android.os.WorkSource {
- <init>();
- <init>(android.os.WorkSource);
- <init>(int);
- <init>(int, java.lang.String);
-
- public boolean add(android.os.WorkSource);
- public boolean add(int);
- public boolean add(int, java.lang.String);
- public android.os.WorkSource addReturningNewbs(android.os.WorkSource);
- public void clear();
- public void clearNames();
- public android.os.WorkSource$WorkChain createWorkChain();
- public int describeContents();
- public boolean diff(android.os.WorkSource);
- public static java.util.ArrayList[] diffChains(android.os.WorkSource, android.os.WorkSource);
- public boolean equals(java.lang.Object);
- public int get(int);
- public java.lang.String getName(int);
- public java.util.ArrayList getWorkChains();
- public int hashCode();
- public static boolean isChainedBatteryAttributionEnabled(android.content.Context);
- public boolean isEmpty();
- public boolean remove(android.os.WorkSource);
- public void set(android.os.WorkSource);
- public void set(int);
- public void set(int, java.lang.String);
- public android.os.WorkSource[] setReturningDiffs(android.os.WorkSource);
- public int size();
- public java.lang.String toString();
- public void transferWorkChains(android.os.WorkSource);
- public void writeToParcel(android.os.Parcel, int);
- public void writeToProto(android.util.proto.ProtoOutputStream, long);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.os.WorkSource$WorkChain {
- <init>();
- <init>(android.os.WorkSource$WorkChain);
-
- public android.os.WorkSource$WorkChain addNode(int, java.lang.String);
- public int describeContents();
- public boolean equals(java.lang.Object);
- public java.lang.String getAttributionTag();
- public int getAttributionUid();
- public int getSize();
- public java.lang.String[] getTags();
- public int[] getUids();
- public int hashCode();
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.os.storage.DiskInfo {
- <init>(java.lang.String, int);
- <init>(android.os.Parcel);
-
- public android.os.storage.DiskInfo clone();
- public java.lang.Object clone();
- public int describeContents();
- public void dump(com.android.internal.util.IndentingPrintWriter);
- public boolean equals(java.lang.Object);
- public java.lang.String getDescription();
- public java.lang.String getId();
- public java.lang.String getShortDescription();
- public int hashCode();
- public boolean isAdoptable();
- public boolean isDefaultPrimary();
- public boolean isSd();
- public boolean isUsb();
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static java.lang.String ACTION_DISK_SCANNED;
- public static android.os.Parcelable$Creator CREATOR;
- public static java.lang.String EXTRA_DISK_ID;
- public static java.lang.String EXTRA_VOLUME_COUNT;
- public static int FLAG_ADOPTABLE;
- public static int FLAG_DEFAULT_PRIMARY;
- public static int FLAG_SD;
- public static int FLAG_USB;
- public int flags;
- public java.lang.String id;
- public java.lang.String label;
- public long size;
- public java.lang.String sysPath;
- public int volumeCount;
-}
-
--keep class android.os.storage.StorageVolume {
- <init>(java.lang.String, java.io.File, java.io.File, java.lang.String, boolean, boolean, boolean, boolean, long, android.os.UserHandle, java.lang.String, java.lang.String);
-
- public boolean allowMassStorage();
- public android.content.Intent createAccessIntent(java.lang.String);
- public int describeContents();
- public java.lang.String dump();
- public void dump(com.android.internal.util.IndentingPrintWriter);
- public boolean equals(java.lang.Object);
- public java.lang.String getDescription(android.content.Context);
- public int getFatVolumeId();
- public java.lang.String getId();
- public java.lang.String getInternalPath();
- public long getMaxFileSize();
- public android.os.UserHandle getOwner();
- public java.lang.String getPath();
- public java.io.File getPathFile();
- public java.lang.String getState();
- public java.lang.String getUserLabel();
- public java.lang.String getUuid();
- public int hashCode();
- public boolean isEmulated();
- public boolean isPrimary();
- public boolean isRemovable();
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public static java.lang.String EXTRA_DIRECTORY_NAME;
- public static java.lang.String EXTRA_STORAGE_VOLUME;
- public static int STORAGE_ID_INVALID;
- public static int STORAGE_ID_PRIMARY;
-}
-
--keep class android.os.storage.VolumeInfo {
- <init>(java.lang.String, int, android.os.storage.DiskInfo, java.lang.String);
- <init>(android.os.Parcel);
-
- public android.content.Intent buildBrowseIntent();
- public android.content.Intent buildBrowseIntentForUser(int);
- public static int buildStableMtpStorageId(java.lang.String);
- public android.os.storage.StorageVolume buildStorageVolume(android.content.Context, int, boolean);
- public android.os.storage.VolumeInfo clone();
- public java.lang.Object clone();
- public int describeContents();
- public void dump(com.android.internal.util.IndentingPrintWriter);
- public boolean equals(java.lang.Object);
- public static java.lang.String getBroadcastForEnvironment(java.lang.String);
- public static java.lang.String getBroadcastForState(int);
- public java.lang.String getDescription();
- public static java.util.Comparator getDescriptionComparator();
- public android.os.storage.DiskInfo getDisk();
- public java.lang.String getDiskId();
- public static java.lang.String getEnvironmentForState(int);
- public java.lang.String getFsUuid();
- public java.lang.String getId();
- public java.io.File getInternalPath();
- public java.io.File getInternalPathForUser(int);
- public int getMountUserId();
- public java.io.File getPath();
- public java.io.File getPathForUser(int);
- public int getState();
- public int getStateDescription();
- public int getType();
- public int hashCode();
- public boolean isMountedReadable();
- public boolean isMountedWritable();
- public boolean isPrimary();
- public boolean isPrimaryPhysical();
- public boolean isVisible();
- public boolean isVisibleForRead(int);
- public boolean isVisibleForUser(int);
- public boolean isVisibleForWrite(int);
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static java.lang.String ACTION_VOLUME_STATE_CHANGED;
- public static android.os.Parcelable$Creator CREATOR;
- public static java.lang.String EXTRA_VOLUME_ID;
- public static java.lang.String EXTRA_VOLUME_STATE;
- public static java.lang.String ID_EMULATED_INTERNAL;
- public static java.lang.String ID_PRIVATE_INTERNAL;
- public static int MOUNT_FLAG_PRIMARY;
- public static int MOUNT_FLAG_VISIBLE;
- public static int STATE_BAD_REMOVAL;
- public static int STATE_CHECKING;
- public static int STATE_EJECTING;
- public static int STATE_FORMATTING;
- public static int STATE_MOUNTED;
- public static int STATE_MOUNTED_READ_ONLY;
- public static int STATE_REMOVED;
- public static int STATE_UNMOUNTABLE;
- public static int STATE_UNMOUNTED;
- public static int TYPE_ASEC;
- public static int TYPE_EMULATED;
- public static int TYPE_OBB;
- public static int TYPE_PRIVATE;
- public static int TYPE_PUBLIC;
- public android.os.storage.DiskInfo disk;
- public java.lang.String fsLabel;
- public java.lang.String fsType;
- public java.lang.String fsUuid;
- public java.lang.String id;
- public java.lang.String internalPath;
- public int mountFlags;
- public int mountUserId;
- public java.lang.String partGuid;
- public java.lang.String path;
- public int state;
- public int type;
-}
-
--keep class android.os.strictmode.Violation {
-
-
-
-}
-
--keep class android.service.autofill.FieldClassification {
- <init>(java.util.ArrayList);
-
- public java.util.List getMatches();
- public java.lang.String toString();
-
-
-}
-
--keep class android.service.autofill.FieldClassification$Match {
- <init>(java.lang.String, float);
-
- public java.lang.String getCategoryId();
- public float getScore();
- public java.lang.String toString();
-
-
-}
-
--keep class android.service.autofill.FillEventHistory {
- <init>(int, android.os.Bundle);
-
- public void addEvent(android.service.autofill.FillEventHistory$Event);
- public int describeContents();
- public android.os.Bundle getClientState();
- public java.util.List getEvents();
- public int getSessionId();
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.service.autofill.FillEventHistory$Event {
- <init>(int, java.lang.String, android.os.Bundle, java.util.List, android.util.ArraySet, java.util.ArrayList, java.util.ArrayList, java.util.ArrayList, java.util.ArrayList, android.view.autofill.AutofillId[], android.service.autofill.FieldClassification[]);
-
- public java.util.Map getChangedFields();
- public android.os.Bundle getClientState();
- public java.lang.String getDatasetId();
- public java.util.Map getFieldsClassification();
- public java.util.Set getIgnoredDatasetIds();
- public java.util.Map getManuallyEnteredField();
- public java.util.Set getSelectedDatasetIds();
- public int getType();
- public java.lang.String toString();
-
-
- public static int TYPE_AUTHENTICATION_SELECTED;
- public static int TYPE_CONTEXT_COMMITTED;
- public static int TYPE_DATASET_AUTHENTICATION_SELECTED;
- public static int TYPE_DATASET_SELECTED;
- public static int TYPE_SAVE_SHOWN;
-}
-
--keep class android.service.autofill.UserData {
-
- public int describeContents();
- public void dump(java.lang.String, java.io.PrintWriter);
- public static void dumpConstraints(java.lang.String, java.io.PrintWriter);
- public android.os.Bundle getAlgorithmArgs();
- public java.lang.String[] getCategoryIds();
- public java.lang.String getFieldClassificationAlgorithm();
- public java.lang.String getId();
- public static int getMaxCategoryCount();
- public static int getMaxFieldClassificationIdsSize();
- public static int getMaxUserDataSize();
- public static int getMaxValueLength();
- public static int getMinValueLength();
- public java.lang.String[] getValues();
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.service.voice.IVoiceInteractionSession {
-
- public abstract void closeSystemDialogs();
- public abstract void destroy();
- public abstract void handleAssist(android.os.Bundle, android.app.assist.AssistStructure, android.app.assist.AssistContent, int, int);
- public abstract void handleScreenshot(android.graphics.Bitmap);
- public abstract void hide();
- public abstract void onLockscreenShown();
- public abstract void show(android.os.Bundle, int, com.android.internal.app.IVoiceInteractionSessionShowCallback);
- public abstract void taskFinished(android.content.Intent, int);
- public abstract void taskStarted(android.content.Intent, int);
-
-
-}
-
--keep class android.support.car.Car {
-
- public void connect();
- public static android.support.car.Car createCar(android.content.Context, android.support.car.CarConnectionCallback, android.os.Handler);
- public static android.support.car.Car createCar(android.content.Context, android.support.car.CarConnectionCallback);
- public void disconnect();
- public java.lang.Object getCarManager(java.lang.String);
- public java.lang.Object getCarManager(java.lang.Class);
- public boolean isConnected();
- public boolean isConnecting();
-
-
- public static java.lang.String APP_FOCUS_SERVICE;
- public static java.lang.String AUDIO_SERVICE;
- public static java.lang.String INFO_SERVICE;
- public static java.lang.String NAVIGATION_STATUS_SERVICE;
- public static java.lang.String PERMISSION_CAR_NAVIGATION_MANAGER;
- public static java.lang.String PERMISSION_VENDOR_EXTENSION;
- public static java.lang.String SENSOR_SERVICE;
-}
-
--keep class android.support.car.CarAppFocusManager {
- <init>();
-
- public abstract void abandonAppFocus(android.support.car.CarAppFocusManager$OnAppFocusOwnershipCallback, int);
- public abstract void abandonAppFocus(android.support.car.CarAppFocusManager$OnAppFocusOwnershipCallback);
- public abstract void addFocusListener(android.support.car.CarAppFocusManager$OnAppFocusChangedListener, int);
- public abstract boolean isOwningFocus(int, android.support.car.CarAppFocusManager$OnAppFocusOwnershipCallback);
- public abstract void removeFocusListener(android.support.car.CarAppFocusManager$OnAppFocusChangedListener, int);
- public abstract void removeFocusListener(android.support.car.CarAppFocusManager$OnAppFocusChangedListener);
- public abstract int requestAppFocus(int, android.support.car.CarAppFocusManager$OnAppFocusOwnershipCallback);
-
-
- public static int APP_FOCUS_REQUEST_FAILED;
- public static int APP_FOCUS_REQUEST_SUCCEEDED;
- public static int APP_FOCUS_TYPE_NAVIGATION;
-}
-
--keep class android.support.car.CarAppFocusManager$OnAppFocusChangedListener {
-
- public abstract void onAppFocusChanged(android.support.car.CarAppFocusManager, int, boolean);
-
-
-}
-
--keep class android.support.car.CarAppFocusManager$OnAppFocusOwnershipCallback {
-
- public abstract void onAppFocusOwnershipGranted(android.support.car.CarAppFocusManager, int);
- public abstract void onAppFocusOwnershipLost(android.support.car.CarAppFocusManager, int);
-
-
-}
-
--keep class android.support.car.CarConnectionCallback {
- <init>();
-
- public abstract void onConnected(android.support.car.Car);
- public abstract void onDisconnected(android.support.car.Car);
-
-
-}
-
--keep class android.support.car.CarInfoManager {
- <init>();
-
- public abstract int getDriverPosition();
- public abstract float getEvBatteryCapacity();
- public abstract int[] getEvConnectorTypes();
- public abstract float getFuelCapacity();
- public abstract int[] getFuelTypes();
- public abstract java.lang.String getHeadunitManufacturer();
- public abstract java.lang.String getHeadunitModel();
- public abstract java.lang.String getHeadunitSoftwareBuild();
- public abstract java.lang.String getHeadunitSoftwareVersion();
- public abstract java.lang.String getManufacturer();
- public abstract java.lang.String getModel();
- public abstract java.lang.String getModelYear();
- public abstract java.lang.String getVehicleId();
-
-
- public static int DRIVER_SIDE_CENTER;
- public static int DRIVER_SIDE_LEFT;
- public static int DRIVER_SIDE_RIGHT;
- public static int DRIVER_SIDE_UNKNOWN;
-}
-
--keep class android.support.car.CarNotConnectedException {
- <init>();
- <init>(java.lang.String);
- <init>(java.lang.String, java.lang.Throwable);
- <init>(java.lang.Exception);
-
-
-
-}
-
--keep class android.support.car.annotation.ValueTypeDef {
-
-
-
-}
-
--keep class android.support.car.annotation.VersionDef {
-
-
-
-}
-
--keep class android.support.car.hardware.CarSensorEvent {
-
- public android.support.car.hardware.CarSensorEvent$CompassData getCompassData();
- public android.support.car.hardware.CarSensorEvent$DrivingStatusData getDrivingStatusData();
- public android.support.car.hardware.CarSensorEvent$NightData getNightData();
- public android.support.car.hardware.CarSensorEvent$ParkingBrakeData getParkingBrakeData();
-
-
- public static int DRIVE_STATUS_FULLY_RESTRICTED;
- public static int DRIVE_STATUS_LIMIT_MESSAGE_LEN;
- public static int DRIVE_STATUS_NO_CONFIG;
- public static int DRIVE_STATUS_NO_KEYBOARD_INPUT;
- public static int DRIVE_STATUS_NO_VIDEO;
- public static int DRIVE_STATUS_NO_VOICE_INPUT;
- public static int DRIVE_STATUS_UNRESTRICTED;
- public static int INDEX_COMPASS_BEARING;
- public static int INDEX_COMPASS_PITCH;
- public static int INDEX_COMPASS_ROLL;
- public static int INDEX_WHEEL_DISTANCE_FRONT_LEFT;
- public static int INDEX_WHEEL_DISTANCE_FRONT_RIGHT;
- public static int INDEX_WHEEL_DISTANCE_REAR_LEFT;
- public static int INDEX_WHEEL_DISTANCE_REAR_RIGHT;
- public static int INDEX_WHEEL_DISTANCE_RESET_COUNT;
- public float[] floatValues;
- public int[] intValues;
- public long[] longValues;
- public int sensorType;
- public long timestamp;
-}
-
--keep class android.support.car.hardware.CarSensorEvent$CompassData {
-
-
-
- public float bearing;
- public float pitch;
- public float roll;
- public long timestamp;
-}
-
--keep class android.support.car.hardware.CarSensorEvent$DrivingStatusData {
-
- public boolean isConfigurationRestricted();
- public boolean isFullyRestricted();
- public boolean isKeyboardRestricted();
- public boolean isMessageLengthRestricted();
- public boolean isVideoRestricted();
- public boolean isVoiceRestricted();
-
-
- public int status;
- public long timestamp;
-}
-
--keep class android.support.car.hardware.CarSensorEvent$NightData {
-
-
-
- public boolean isNightMode;
- public long timestamp;
-}
-
--keep class android.support.car.hardware.CarSensorEvent$ParkingBrakeData {
-
-
-
- public boolean isEngaged;
- public long timestamp;
-}
-
--keep class android.support.car.hardware.CarSensorManager {
- <init>();
-
- public abstract boolean addListener(android.support.car.hardware.CarSensorManager$OnSensorChangedListener, int, int);
- public abstract android.support.car.hardware.CarSensorEvent getLatestSensorEvent(int);
- public abstract int[] getSupportedSensors();
- public abstract boolean isSensorSupported(int);
- public abstract void removeListener(android.support.car.hardware.CarSensorManager$OnSensorChangedListener);
- public abstract void removeListener(android.support.car.hardware.CarSensorManager$OnSensorChangedListener, int);
-
-
- public static int SENSOR_RATE_FASTEST;
- public static int SENSOR_RATE_NORMAL;
- public static int SENSOR_TYPE_ABS_ACTIVE;
- public static int SENSOR_TYPE_COMPASS;
- public static int SENSOR_TYPE_DRIVING_STATUS;
- public static int SENSOR_TYPE_EV_BATTERY_CHARGE_RATE;
- public static int SENSOR_TYPE_EV_BATTERY_LEVEL;
- public static int SENSOR_TYPE_EV_CHARGE_PORT_CONNECTED;
- public static int SENSOR_TYPE_EV_CHARGE_PORT_OPEN;
- public static int SENSOR_TYPE_FUEL_DOOR_OPEN;
- public static int SENSOR_TYPE_NIGHT;
- public static int SENSOR_TYPE_PARKING_BRAKE;
- public static int SENSOR_TYPE_TRACTION_CONTROL_ACTIVE;
- public static int SENSOR_TYPE_WHEEL_TICK_DISTANCE;
-}
-
--keep class android.support.car.hardware.CarSensorManager$OnSensorChangedListener {
-
- public abstract void onSensorChanged(android.support.car.hardware.CarSensorManager, android.support.car.hardware.CarSensorEvent);
-
-
-}
-
--keep class android.support.car.media.CarAudioManager {
- <init>();
-
- public abstract android.support.car.media.CarAudioRecord createCarAudioRecord(int);
- public abstract android.media.AudioFormat getAudioRecordAudioFormat();
- public abstract int getAudioRecordMaxBufferSize();
- public abstract int getAudioRecordMinBufferSize();
- public abstract boolean isAudioRecordSupported();
-
-
-}
-
--keep class android.support.car.media.CarAudioRecord {
- <init>();
-
- public abstract int getAudioSessionId();
- public abstract int getBufferSize();
- public abstract int getRecordingState();
- public abstract int getState();
- public abstract int read(byte[], int, int);
- public abstract void release();
- public abstract void startRecording();
- public abstract void stop();
-
-
-}
-
--keep class android.support.car.navigation.CarNavigationInstrumentCluster {
-
- public int getImageColorDepthBits();
- public int getImageHeight();
- public int getImageWidth();
- public int getMinIntervalMillis();
- public int getType();
- public boolean supportsCustomImages();
- public java.lang.String toString();
-
-
- public static int CLUSTER_TYPE_CUSTOM_IMAGES_SUPPORTED;
- public static int CLUSTER_TYPE_IMAGE_CODES_ONLY;
-}
-
--keep class android.support.car.navigation.CarNavigationStatusManager {
- <init>();
-
- public abstract void addListener(android.support.car.navigation.CarNavigationStatusManager$CarNavigationCallback);
- public abstract void removeListener();
- public abstract void sendEvent(int, android.os.Bundle);
-
-
-}
-
--keep class android.support.car.navigation.CarNavigationStatusManager$CarNavigationCallback {
-
- public abstract void onInstrumentClusterStarted(android.support.car.navigation.CarNavigationStatusManager, android.support.car.navigation.CarNavigationInstrumentCluster);
- public abstract void onInstrumentClusterStopped(android.support.car.navigation.CarNavigationStatusManager);
-
-
-}
-
--keep class android.transition.PathMotion {
- <init>();
- <init>(android.content.Context, android.util.AttributeSet);
-
- public abstract android.graphics.Path getPath(float, float, float, float);
-
-
-}
-
--keep class android.transition.Scene {
- <init>(android.view.ViewGroup);
- <init>(android.view.ViewGroup, android.view.View);
- <init>(android.view.ViewGroup, android.view.ViewGroup);
-
- public void enter();
- public void exit();
- public static android.transition.Scene getSceneForLayout(android.view.ViewGroup, int, android.content.Context);
- public android.view.ViewGroup getSceneRoot();
- public void setEnterAction(java.lang.Runnable);
- public void setExitAction(java.lang.Runnable);
-
-
-}
-
--keep class android.transition.Transition {
- <init>();
- <init>(android.content.Context, android.util.AttributeSet);
-
- public android.transition.Transition addListener(android.transition.Transition$TransitionListener);
- public android.transition.Transition addTarget(int);
- public android.transition.Transition addTarget(java.lang.String);
- public android.transition.Transition addTarget(java.lang.Class);
- public android.transition.Transition addTarget(android.view.View);
- protected void animate(android.animation.Animator);
- public boolean canRemoveViews();
- protected void cancel();
- public abstract void captureEndValues(android.transition.TransitionValues);
- public abstract void captureStartValues(android.transition.TransitionValues);
- public android.transition.Transition clone();
- public java.lang.Object clone();
- public android.animation.Animator createAnimator(android.view.ViewGroup, android.transition.TransitionValues, android.transition.TransitionValues);
- protected void createAnimators(android.view.ViewGroup, android.transition.TransitionValuesMaps, android.transition.TransitionValuesMaps, java.util.ArrayList, java.util.ArrayList);
- protected void end();
- public android.transition.Transition excludeChildren(int, boolean);
- public android.transition.Transition excludeChildren(android.view.View, boolean);
- public android.transition.Transition excludeChildren(java.lang.Class, boolean);
- public android.transition.Transition excludeTarget(int, boolean);
- public android.transition.Transition excludeTarget(java.lang.String, boolean);
- public android.transition.Transition excludeTarget(android.view.View, boolean);
- public android.transition.Transition excludeTarget(java.lang.Class, boolean);
- public long getDuration();
- public android.graphics.Rect getEpicenter();
- public android.transition.Transition$EpicenterCallback getEpicenterCallback();
- public android.animation.TimeInterpolator getInterpolator();
- public java.lang.String getName();
- public android.util.ArrayMap getNameOverrides();
- public android.transition.PathMotion getPathMotion();
- public android.transition.TransitionPropagation getPropagation();
- public long getStartDelay();
- public java.util.List getTargetIds();
- public java.util.List getTargetNames();
- public java.util.List getTargetTypes();
- public java.util.List getTargetViewNames();
- public java.util.List getTargets();
- public java.lang.String[] getTransitionProperties();
- public android.transition.TransitionValues getTransitionValues(android.view.View, boolean);
- public boolean isTransitionRequired(android.transition.TransitionValues, android.transition.TransitionValues);
- public boolean isValidTarget(android.view.View);
- public void pause(android.view.View);
- public android.transition.Transition removeListener(android.transition.Transition$TransitionListener);
- public android.transition.Transition removeTarget(int);
- public android.transition.Transition removeTarget(java.lang.String);
- public android.transition.Transition removeTarget(android.view.View);
- public android.transition.Transition removeTarget(java.lang.Class);
- public void resume(android.view.View);
- protected void runAnimators();
- public android.transition.Transition setDuration(long);
- public void setEpicenterCallback(android.transition.Transition$EpicenterCallback);
- public android.transition.Transition setInterpolator(android.animation.TimeInterpolator);
- public void setMatchOrder(int[]);
- public void setNameOverrides(android.util.ArrayMap);
- public void setPathMotion(android.transition.PathMotion);
- public void setPropagation(android.transition.TransitionPropagation);
- public android.transition.Transition setStartDelay(long);
- protected void start();
- public java.lang.String toString();
-
-
- public static int MATCH_ID;
- public static int MATCH_INSTANCE;
- public static int MATCH_ITEM_ID;
- public static int MATCH_NAME;
-}
-
--keep class android.transition.Transition$EpicenterCallback {
- <init>();
-
- public abstract android.graphics.Rect onGetEpicenter(android.transition.Transition);
-
-
-}
-
--keep class android.transition.Transition$TransitionListener {
-
- public abstract void onTransitionCancel(android.transition.Transition);
- public abstract void onTransitionEnd(android.transition.Transition);
- public abstract void onTransitionPause(android.transition.Transition);
- public abstract void onTransitionResume(android.transition.Transition);
- public abstract void onTransitionStart(android.transition.Transition);
-
-
-}
-
--keep class android.transition.TransitionManager {
- <init>();
-
- public static void beginDelayedTransition(android.view.ViewGroup);
- public static void beginDelayedTransition(android.view.ViewGroup, android.transition.Transition);
- public static void endTransitions(android.view.ViewGroup);
- public static android.transition.Transition getDefaultTransition();
- public android.transition.Transition getTransition(android.transition.Scene);
- public static void go(android.transition.Scene);
- public static void go(android.transition.Scene, android.transition.Transition);
- public void setDefaultTransition(android.transition.Transition);
- public void setTransition(android.transition.Scene, android.transition.Transition);
- public void setTransition(android.transition.Scene, android.transition.Scene, android.transition.Transition);
- public void transitionTo(android.transition.Scene);
-
-
-}
-
--keep class android.transition.TransitionPropagation {
- <init>();
-
- public abstract void captureValues(android.transition.TransitionValues);
- public abstract java.lang.String[] getPropagationProperties();
- public abstract long getStartDelay(android.view.ViewGroup, android.transition.Transition, android.transition.TransitionValues, android.transition.TransitionValues);
-
-
-}
-
--keep class android.transition.TransitionValues {
- <init>();
-
- public boolean equals(java.lang.Object);
- public int hashCode();
- public java.lang.String toString();
-
-
- public java.util.Map values;
- public android.view.View view;
-}
-
--keep class android.transition.TransitionValuesMaps {
-
-
-
-}
-
--keep class android.util.AndroidException {
- <init>();
- <init>(java.lang.String);
- <init>(java.lang.String, java.lang.Throwable);
- <init>(java.lang.Exception);
- <init>(java.lang.String, java.lang.Throwable, boolean, boolean);
-
-
-
-}
-
--keep class android.util.ArrayMap {
- <init>();
- <init>(int);
- <init>(int, boolean);
- <init>(android.util.ArrayMap);
-
- public void append(java.lang.Object, java.lang.Object);
- public void clear();
- public boolean containsAll(java.util.Collection);
- public boolean containsKey(java.lang.Object);
- public boolean containsValue(java.lang.Object);
- public void ensureCapacity(int);
- public java.util.Set entrySet();
- public boolean equals(java.lang.Object);
- public void erase();
- public java.lang.Object get(java.lang.Object);
- public int hashCode();
- public int indexOfKey(java.lang.Object);
- public boolean isEmpty();
- public java.lang.Object keyAt(int);
- public java.util.Set keySet();
- public java.lang.Object put(java.lang.Object, java.lang.Object);
- public void putAll(android.util.ArrayMap);
- public void putAll(java.util.Map);
- public java.lang.Object remove(java.lang.Object);
- public boolean removeAll(java.util.Collection);
- public java.lang.Object removeAt(int);
- public boolean retainAll(java.util.Collection);
- public java.lang.Object setValueAt(int, java.lang.Object);
- public int size();
- public java.lang.String toString();
- public void validate();
- public java.lang.Object valueAt(int);
- public java.util.Collection values();
-
-
- public static android.util.ArrayMap EMPTY;
-}
-
--keep class android.util.ArraySet {
- <init>();
- <init>(int);
- <init>(int, boolean);
- <init>(android.util.ArraySet);
- <init>(java.util.Collection);
-
- public boolean add(java.lang.Object);
- public void addAll(android.util.ArraySet);
- public boolean addAll(java.util.Collection);
- public void append(java.lang.Object);
- public void clear();
- public boolean contains(java.lang.Object);
- public boolean containsAll(java.util.Collection);
- public void ensureCapacity(int);
- public boolean equals(java.lang.Object);
- public int hashCode();
- public int indexOf(java.lang.Object);
- public boolean isEmpty();
- public java.util.Iterator iterator();
- public boolean remove(java.lang.Object);
- public boolean removeAll(android.util.ArraySet);
- public boolean removeAll(java.util.Collection);
- public java.lang.Object removeAt(int);
- public boolean retainAll(java.util.Collection);
- public int size();
- public java.lang.Object[] toArray();
- public java.lang.Object[] toArray(java.lang.Object[]);
- public java.lang.String toString();
- public java.lang.Object valueAt(int);
-
-
-}
-
--keep class android.util.AttributeSet {
-
- public abstract boolean getAttributeBooleanValue(java.lang.String, java.lang.String, boolean);
- public abstract boolean getAttributeBooleanValue(int, boolean);
- public abstract int getAttributeCount();
- public abstract float getAttributeFloatValue(java.lang.String, java.lang.String, float);
- public abstract float getAttributeFloatValue(int, float);
- public abstract int getAttributeIntValue(java.lang.String, java.lang.String, int);
- public abstract int getAttributeIntValue(int, int);
- public abstract int getAttributeListValue(java.lang.String, java.lang.String, java.lang.String[], int);
- public abstract int getAttributeListValue(int, java.lang.String[], int);
- public abstract java.lang.String getAttributeName(int);
- public abstract int getAttributeNameResource(int);
- public java.lang.String getAttributeNamespace(int);
- public abstract int getAttributeResourceValue(java.lang.String, java.lang.String, int);
- public abstract int getAttributeResourceValue(int, int);
- public abstract int getAttributeUnsignedIntValue(java.lang.String, java.lang.String, int);
- public abstract int getAttributeUnsignedIntValue(int, int);
- public abstract java.lang.String getAttributeValue(int);
- public abstract java.lang.String getAttributeValue(java.lang.String, java.lang.String);
- public abstract java.lang.String getClassAttribute();
- public abstract java.lang.String getIdAttribute();
- public abstract int getIdAttributeResourceValue(int);
- public abstract java.lang.String getPositionDescription();
- public abstract int getStyleAttribute();
-
-
-}
-
--keep class android.util.DisplayMetrics {
- <init>();
-
- public boolean equals(java.lang.Object);
- public boolean equals(android.util.DisplayMetrics);
- public boolean equalsPhysical(android.util.DisplayMetrics);
- public int hashCode();
- public void setTo(android.util.DisplayMetrics);
- public void setToDefaults();
- public java.lang.String toString();
-
-
- public static int DENSITY_260;
- public static int DENSITY_280;
- public static int DENSITY_300;
- public static int DENSITY_340;
- public static int DENSITY_360;
- public static int DENSITY_400;
- public static int DENSITY_420;
- public static int DENSITY_440;
- public static int DENSITY_560;
- public static int DENSITY_DEFAULT;
- public static float DENSITY_DEFAULT_SCALE;
- public static int DENSITY_DEVICE;
- public static int DENSITY_DEVICE_STABLE;
- public static int DENSITY_HIGH;
- public static int DENSITY_LOW;
- public static int DENSITY_MEDIUM;
- public static int DENSITY_TV;
- public static int DENSITY_XHIGH;
- public static int DENSITY_XXHIGH;
- public static int DENSITY_XXXHIGH;
- public float density;
- public int densityDpi;
- public int heightPixels;
- public float noncompatDensity;
- public int noncompatDensityDpi;
- public int noncompatHeightPixels;
- public float noncompatScaledDensity;
- public int noncompatWidthPixels;
- public float noncompatXdpi;
- public float noncompatYdpi;
- public float scaledDensity;
- public int widthPixels;
- public float xdpi;
- public float ydpi;
-}
-
--keep class android.util.LongArray {
- <init>();
- <init>(int);
-
- public void add(long);
- public void add(int, long);
- public void addAll(android.util.LongArray);
- public void clear();
- public android.util.LongArray clone();
- public java.lang.Object clone();
- public static boolean elementsEqual(android.util.LongArray, android.util.LongArray);
- public static android.util.LongArray fromArray(long[], int);
- public long get(int);
- public int indexOf(long);
- public void remove(int);
- public void resize(int);
- public void set(int, long);
- public int size();
- public long[] toArray();
- public static android.util.LongArray wrap(long[]);
-
-
-}
-
--keep class android.util.LongSparseArray {
- <init>();
- <init>(int);
-
- public void append(long, java.lang.Object);
- public void clear();
- public android.util.LongSparseArray clone();
- public java.lang.Object clone();
- public void delete(long);
- public java.lang.Object get(long);
- public java.lang.Object get(long, java.lang.Object);
- public int indexOfKey(long);
- public int indexOfValue(java.lang.Object);
- public int indexOfValueByValue(java.lang.Object);
- public long keyAt(int);
- public void put(long, java.lang.Object);
- public void remove(long);
- public void removeAt(int);
- public void setValueAt(int, java.lang.Object);
- public int size();
- public java.lang.String toString();
- public java.lang.Object valueAt(int);
-
-
-}
-
--keep class android.util.MergedConfiguration {
- <init>();
- <init>(android.content.res.Configuration, android.content.res.Configuration);
- <init>(android.content.res.Configuration);
- <init>(android.util.MergedConfiguration);
-
- public int describeContents();
- public void dump(java.io.PrintWriter, java.lang.String);
- public boolean equals(java.lang.Object);
- public android.content.res.Configuration getGlobalConfiguration();
- public android.content.res.Configuration getMergedConfiguration();
- public android.content.res.Configuration getOverrideConfiguration();
- public int hashCode();
- public void readFromParcel(android.os.Parcel);
- public void setConfiguration(android.content.res.Configuration, android.content.res.Configuration);
- public void setGlobalConfiguration(android.content.res.Configuration);
- public void setOverrideConfiguration(android.content.res.Configuration);
- public void setTo(android.util.MergedConfiguration);
- public java.lang.String toString();
- public void unset();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.util.Pair {
- <init>(java.lang.Object, java.lang.Object);
-
- public static android.util.Pair create(java.lang.Object, java.lang.Object);
- public boolean equals(java.lang.Object);
- public int hashCode();
- public java.lang.String toString();
-
-
- public java.lang.Object first;
- public java.lang.Object second;
-}
-
--keep class android.util.Printer {
-
- public abstract void println(java.lang.String);
-
-
-}
-
--keep class android.util.Property {
- <init>(java.lang.Class, java.lang.String);
-
- public abstract java.lang.Object get(java.lang.Object);
- public java.lang.String getName();
- public java.lang.Class getType();
- public boolean isReadOnly();
- public static android.util.Property of(java.lang.Class, java.lang.Class, java.lang.String);
- public void set(java.lang.Object, java.lang.Object);
-
-
-}
-
--keep class android.util.Rational {
- <init>(int, int);
-
- public int compareTo(android.util.Rational);
- public int compareTo(java.lang.Object);
- public double doubleValue();
- public boolean equals(java.lang.Object);
- public float floatValue();
- public static int gcd(int, int);
- public int getDenominator();
- public int getNumerator();
- public int hashCode();
- public int intValue();
- public boolean isFinite();
- public boolean isInfinite();
- public boolean isNaN();
- public boolean isZero();
- public long longValue();
- public static android.util.Rational parseRational(java.lang.String);
- public short shortValue();
- public float toFloat();
- public java.lang.String toString();
-
-
- public static android.util.Rational NEGATIVE_INFINITY;
- public static android.util.Rational NaN;
- public static android.util.Rational POSITIVE_INFINITY;
- public static android.util.Rational ZERO;
-}
-
--keep class android.util.Size {
- <init>(int, int);
-
- public boolean equals(java.lang.Object);
- public int getHeight();
- public int getWidth();
- public int hashCode();
- public static android.util.Size parseSize(java.lang.String);
- public java.lang.String toString();
-
-
-}
-
--keep class android.util.SizeF {
- <init>(float, float);
-
- public boolean equals(java.lang.Object);
- public float getHeight();
- public float getWidth();
- public int hashCode();
- public static android.util.SizeF parseSizeF(java.lang.String);
- public java.lang.String toString();
-
-
-}
-
--keep class android.util.SparseArray {
- <init>();
- <init>(int);
-
- public void append(int, java.lang.Object);
- public void clear();
- public android.util.SparseArray clone();
- public java.lang.Object clone();
- public void delete(int);
- public java.lang.Object get(int);
- public java.lang.Object get(int, java.lang.Object);
- public int indexOfKey(int);
- public int indexOfValue(java.lang.Object);
- public int indexOfValueByValue(java.lang.Object);
- public int keyAt(int);
- public void put(int, java.lang.Object);
- public void remove(int);
- public void removeAt(int);
- public void removeAtRange(int, int);
- public java.lang.Object removeReturnOld(int);
- public void setValueAt(int, java.lang.Object);
- public int size();
- public java.lang.String toString();
- public java.lang.Object valueAt(int);
-
-
-}
-
--keep class android.util.SparseBooleanArray {
- <init>();
- <init>(int);
-
- public void append(int, boolean);
- public void clear();
- public android.util.SparseBooleanArray clone();
- public java.lang.Object clone();
- public void delete(int);
- public boolean equals(java.lang.Object);
- public boolean get(int);
- public boolean get(int, boolean);
- public int hashCode();
- public int indexOfKey(int);
- public int indexOfValue(boolean);
- public int keyAt(int);
- public void put(int, boolean);
- public void removeAt(int);
- public void setKeyAt(int, int);
- public void setValueAt(int, boolean);
- public int size();
- public java.lang.String toString();
- public boolean valueAt(int);
-
-
-}
-
--keep class android.util.SparseIntArray {
- <init>();
- <init>(int);
-
- public void append(int, int);
- public void clear();
- public android.util.SparseIntArray clone();
- public java.lang.Object clone();
- public int[] copyKeys();
- public void delete(int);
- public int get(int);
- public int get(int, int);
- public int indexOfKey(int);
- public int indexOfValue(int);
- public int keyAt(int);
- public void put(int, int);
- public void removeAt(int);
- public void setValueAt(int, int);
- public int size();
- public java.lang.String toString();
- public int valueAt(int);
-
-
-}
-
--keep class android.util.TypedValue {
- <init>();
-
- public static float applyDimension(int, float, android.util.DisplayMetrics);
- public java.lang.CharSequence coerceToString();
- public static java.lang.String coerceToString(int, int);
- public static float complexToDimension(int, android.util.DisplayMetrics);
- public static float complexToDimensionNoisy(int, android.util.DisplayMetrics);
- public static int complexToDimensionPixelOffset(int, android.util.DisplayMetrics);
- public static int complexToDimensionPixelSize(int, android.util.DisplayMetrics);
- public static float complexToFloat(int);
- public static float complexToFraction(int, float, float);
- public int getComplexUnit();
- public float getDimension(android.util.DisplayMetrics);
- public float getFloat();
- public float getFraction(float, float);
- public void setTo(android.util.TypedValue);
- public java.lang.String toString();
-
-
- public static int COMPLEX_MANTISSA_MASK;
- public static int COMPLEX_MANTISSA_SHIFT;
- public static int COMPLEX_RADIX_0p23;
- public static int COMPLEX_RADIX_16p7;
- public static int COMPLEX_RADIX_23p0;
- public static int COMPLEX_RADIX_8p15;
- public static int COMPLEX_RADIX_MASK;
- public static int COMPLEX_RADIX_SHIFT;
- public static int COMPLEX_UNIT_DIP;
- public static int COMPLEX_UNIT_FRACTION;
- public static int COMPLEX_UNIT_FRACTION_PARENT;
- public static int COMPLEX_UNIT_IN;
- public static int COMPLEX_UNIT_MASK;
- public static int COMPLEX_UNIT_MM;
- public static int COMPLEX_UNIT_PT;
- public static int COMPLEX_UNIT_PX;
- public static int COMPLEX_UNIT_SHIFT;
- public static int COMPLEX_UNIT_SP;
- public static int DATA_NULL_EMPTY;
- public static int DATA_NULL_UNDEFINED;
- public static int DENSITY_DEFAULT;
- public static int DENSITY_NONE;
- public static int TYPE_ATTRIBUTE;
- public static int TYPE_DIMENSION;
- public static int TYPE_FIRST_COLOR_INT;
- public static int TYPE_FIRST_INT;
- public static int TYPE_FLOAT;
- public static int TYPE_FRACTION;
- public static int TYPE_INT_BOOLEAN;
- public static int TYPE_INT_COLOR_ARGB4;
- public static int TYPE_INT_COLOR_ARGB8;
- public static int TYPE_INT_COLOR_RGB4;
- public static int TYPE_INT_COLOR_RGB8;
- public static int TYPE_INT_DEC;
- public static int TYPE_INT_HEX;
- public static int TYPE_LAST_COLOR_INT;
- public static int TYPE_LAST_INT;
- public static int TYPE_NULL;
- public static int TYPE_REFERENCE;
- public static int TYPE_STRING;
- public int assetCookie;
- public int changingConfigurations;
- public int data;
- public int density;
- public int resourceId;
- public java.lang.CharSequence string;
- public int type;
-}
-
--keep class android.util.proto.ProtoOutputStream {
- <init>();
- <init>(int);
- <init>(java.io.OutputStream);
- <init>(java.io.FileDescriptor);
-
- public static int checkFieldId(long, long);
- public static int convertObjectIdToOrdinal(int);
- public void dump(java.lang.String);
- public void end(long);
- public void endObject(long);
- public void endRepeatedObject(long);
- public void flush();
- public byte[] getBytes();
- public static int getDepthFromToken(long);
- public static int getObjectIdFromToken(long);
- public static boolean getRepeatedFromToken(long);
- public static int getSizePosFromToken(long);
- public static int getTagSizeFromToken(long);
- public static long makeFieldId(int, long);
- public static long makeToken(int, boolean, int, int, int);
- public long start(long);
- public long startObject(long);
- public long startRepeatedObject(long);
- public static java.lang.String token2String(long);
- public void write(long, double);
- public void write(long, float);
- public void write(long, int);
- public void write(long, long);
- public void write(long, boolean);
- public void write(long, java.lang.String);
- public void write(long, byte[]);
- public void writeBool(long, boolean);
- public void writeBytes(long, byte[]);
- public void writeDouble(long, double);
- public void writeEnum(long, int);
- public void writeFixed32(long, int);
- public void writeFixed64(long, long);
- public void writeFloat(long, float);
- public void writeInt32(long, int);
- public void writeInt64(long, long);
- public void writeObject(long, byte[]);
- public void writePackedBool(long, boolean[]);
- public void writePackedDouble(long, double[]);
- public void writePackedEnum(long, int[]);
- public void writePackedFixed32(long, int[]);
- public void writePackedFixed64(long, long[]);
- public void writePackedFloat(long, float[]);
- public void writePackedInt32(long, int[]);
- public void writePackedInt64(long, long[]);
- public void writePackedSFixed32(long, int[]);
- public void writePackedSFixed64(long, long[]);
- public void writePackedSInt32(long, int[]);
- public void writePackedSInt64(long, long[]);
- public void writePackedUInt32(long, int[]);
- public void writePackedUInt64(long, long[]);
- public void writeRepeatedBool(long, boolean);
- public void writeRepeatedBytes(long, byte[]);
- public void writeRepeatedDouble(long, double);
- public void writeRepeatedEnum(long, int);
- public void writeRepeatedFixed32(long, int);
- public void writeRepeatedFixed64(long, long);
- public void writeRepeatedFloat(long, float);
- public void writeRepeatedInt32(long, int);
- public void writeRepeatedInt64(long, long);
- public void writeRepeatedObject(long, byte[]);
- public void writeRepeatedSFixed32(long, int);
- public void writeRepeatedSFixed64(long, long);
- public void writeRepeatedSInt32(long, int);
- public void writeRepeatedSInt64(long, long);
- public void writeRepeatedString(long, java.lang.String);
- public void writeRepeatedUInt32(long, int);
- public void writeRepeatedUInt64(long, long);
- public void writeSFixed32(long, int);
- public void writeSFixed64(long, long);
- public void writeSInt32(long, int);
- public void writeSInt64(long, long);
- public void writeString(long, java.lang.String);
- public void writeTag(int, int);
- public void writeUInt32(long, int);
- public void writeUInt64(long, long);
-
-
- public static long FIELD_COUNT_MASK;
- public static long FIELD_COUNT_PACKED;
- public static long FIELD_COUNT_REPEATED;
- public static int FIELD_COUNT_SHIFT;
- public static long FIELD_COUNT_SINGLE;
- public static long FIELD_COUNT_UNKNOWN;
- public static int FIELD_ID_MASK;
- public static int FIELD_ID_SHIFT;
- public static long FIELD_TYPE_BOOL;
- public static long FIELD_TYPE_BYTES;
- public static long FIELD_TYPE_DOUBLE;
- public static long FIELD_TYPE_ENUM;
- public static long FIELD_TYPE_FIXED32;
- public static long FIELD_TYPE_FIXED64;
- public static long FIELD_TYPE_FLOAT;
- public static long FIELD_TYPE_INT32;
- public static long FIELD_TYPE_INT64;
- public static long FIELD_TYPE_MASK;
- public static long FIELD_TYPE_MESSAGE;
- public static long FIELD_TYPE_SFIXED32;
- public static long FIELD_TYPE_SFIXED64;
- public static int FIELD_TYPE_SHIFT;
- public static long FIELD_TYPE_SINT32;
- public static long FIELD_TYPE_SINT64;
- public static long FIELD_TYPE_STRING;
- public static long FIELD_TYPE_UINT32;
- public static long FIELD_TYPE_UINT64;
- public static long FIELD_TYPE_UNKNOWN;
- public static java.lang.String TAG;
- public static int WIRE_TYPE_END_GROUP;
- public static int WIRE_TYPE_FIXED32;
- public static int WIRE_TYPE_FIXED64;
- public static int WIRE_TYPE_LENGTH_DELIMITED;
- public static int WIRE_TYPE_MASK;
- public static int WIRE_TYPE_START_GROUP;
- public static int WIRE_TYPE_VARINT;
-}
-
--keep class android.view.AccessibilityInteractionController {
- <init>(android.view.ViewRootImpl);
-
- public void findAccessibilityNodeInfoByAccessibilityIdClientThread(long, android.graphics.Region, int, android.view.accessibility.IAccessibilityInteractionConnectionCallback, int, int, long, android.view.MagnificationSpec, android.os.Bundle);
- public void findAccessibilityNodeInfosByTextClientThread(long, java.lang.String, android.graphics.Region, int, android.view.accessibility.IAccessibilityInteractionConnectionCallback, int, int, long, android.view.MagnificationSpec);
- public void findAccessibilityNodeInfosByViewIdClientThread(long, java.lang.String, android.graphics.Region, int, android.view.accessibility.IAccessibilityInteractionConnectionCallback, int, int, long, android.view.MagnificationSpec);
- public void findFocusClientThread(long, int, android.graphics.Region, int, android.view.accessibility.IAccessibilityInteractionConnectionCallback, int, int, long, android.view.MagnificationSpec);
- public void focusSearchClientThread(long, int, android.graphics.Region, int, android.view.accessibility.IAccessibilityInteractionConnectionCallback, int, int, long, android.view.MagnificationSpec);
- public void performAccessibilityActionClientThread(long, int, android.os.Bundle, int, android.view.accessibility.IAccessibilityInteractionConnectionCallback, int, int, long);
-
-
-}
-
--keep class android.view.AccessibilityIterators {
- <init>();
-
-
-
-}
-
--keep class android.view.AccessibilityIterators$TextSegmentIterator {
-
- public abstract int[] following(int);
- public abstract int[] preceding(int);
-
-
-}
-
--keep class android.view.ActionMode {
- <init>();
-
- public abstract void finish();
- public abstract android.view.View getCustomView();
- public abstract android.view.Menu getMenu();
- public abstract android.view.MenuInflater getMenuInflater();
- public abstract java.lang.CharSequence getSubtitle();
- public java.lang.Object getTag();
- public abstract java.lang.CharSequence getTitle();
- public boolean getTitleOptionalHint();
- public int getType();
- public void hide(long);
- public abstract void invalidate();
- public void invalidateContentRect();
- public boolean isTitleOptional();
- public boolean isUiFocusable();
- public void onWindowFocusChanged(boolean);
- public abstract void setCustomView(android.view.View);
- public abstract void setSubtitle(java.lang.CharSequence);
- public abstract void setSubtitle(int);
- public void setTag(java.lang.Object);
- public abstract void setTitle(java.lang.CharSequence);
- public abstract void setTitle(int);
- public void setTitleOptionalHint(boolean);
- public void setType(int);
-
-
- public static int DEFAULT_HIDE_DURATION;
- public static int TYPE_FLOATING;
- public static int TYPE_PRIMARY;
-}
-
--keep class android.view.ActionMode$Callback {
-
- public abstract boolean onActionItemClicked(android.view.ActionMode, android.view.MenuItem);
- public abstract boolean onCreateActionMode(android.view.ActionMode, android.view.Menu);
- public abstract void onDestroyActionMode(android.view.ActionMode);
- public abstract boolean onPrepareActionMode(android.view.ActionMode, android.view.Menu);
-
-
-}
-
--keep class android.view.ActionProvider {
- <init>(android.content.Context);
-
- public boolean hasSubMenu();
- public boolean isVisible();
- public abstract android.view.View onCreateActionView();
- public android.view.View onCreateActionView(android.view.MenuItem);
- public boolean onPerformDefaultAction();
- public void onPrepareSubMenu(android.view.SubMenu);
- public boolean overridesItemVisibility();
- public void refreshVisibility();
- public void reset();
- public void setSubUiVisibilityListener(android.view.ActionProvider$SubUiVisibilityListener);
- public void setVisibilityListener(android.view.ActionProvider$VisibilityListener);
- public void subUiVisibilityChanged(boolean);
-
-
-}
-
--keep class android.view.ActionProvider$SubUiVisibilityListener {
-
- public abstract void onSubUiVisibilityChanged(boolean);
-
-
-}
-
--keep class android.view.ActionProvider$VisibilityListener {
-
- public abstract void onActionProviderVisibilityChanged(boolean);
-
-
-}
-
--keep class android.view.AppTransitionAnimationSpec {
- <init>(int, android.graphics.GraphicBuffer, android.graphics.Rect);
- <init>(android.os.Parcel);
-
- public int describeContents();
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public android.graphics.GraphicBuffer buffer;
- public android.graphics.Rect rect;
- public int taskId;
-}
-
--keep class android.view.Choreographer {
-
- public static long getFrameDelay();
- public long getFrameIntervalNanos();
- public long getFrameTime();
- public long getFrameTimeNanos();
- public static android.view.Choreographer getInstance();
- public long getLastFrameTimeNanos();
- public static android.view.Choreographer getMainThreadInstance();
- public static android.view.Choreographer getSfInstance();
- public void postCallback(int, java.lang.Runnable, java.lang.Object);
- public void postCallbackDelayed(int, java.lang.Runnable, java.lang.Object, long);
- public void postFrameCallback(android.view.Choreographer$FrameCallback);
- public void postFrameCallbackDelayed(android.view.Choreographer$FrameCallback, long);
- public static void releaseInstance();
- public void removeCallbacks(int, java.lang.Runnable, java.lang.Object);
- public void removeFrameCallback(android.view.Choreographer$FrameCallback);
- public static void setFrameDelay(long);
- public static long subtractFrameDelay(long);
-
-
- public static int CALLBACK_ANIMATION;
- public static int CALLBACK_COMMIT;
- public static int CALLBACK_INPUT;
- public static int CALLBACK_TRAVERSAL;
-}
-
--keep class android.view.Choreographer$FrameCallback {
-
- public abstract void doFrame(long);
-
-
-}
-
--keep class android.view.ContextMenu {
-
- public abstract void clearHeader();
- public abstract android.view.ContextMenu setHeaderIcon(int);
- public abstract android.view.ContextMenu setHeaderIcon(android.graphics.drawable.Drawable);
- public abstract android.view.ContextMenu setHeaderTitle(int);
- public abstract android.view.ContextMenu setHeaderTitle(java.lang.CharSequence);
- public abstract android.view.ContextMenu setHeaderView(android.view.View);
-
-
-}
-
--keep class android.view.ContextMenu$ContextMenuInfo {
-
-
-
-}
-
--keep class android.view.ContextThemeWrapper {
- <init>();
- <init>(android.content.Context, int);
- <init>(android.content.Context, android.content.res.Resources$Theme);
-
- public void applyOverrideConfiguration(android.content.res.Configuration);
- protected void attachBaseContext(android.content.Context);
- public android.content.res.AssetManager getAssets();
- public android.content.res.Configuration getOverrideConfiguration();
- public android.content.res.Resources getResources();
- public java.lang.Object getSystemService(java.lang.String);
- public android.content.res.Resources$Theme getTheme();
- public int getThemeResId();
- protected void onApplyThemeResource(android.content.res.Resources$Theme, int, boolean);
- public void setTheme(int);
-
-
-}
-
--keep class android.view.Display {
- <init>(android.hardware.display.DisplayManagerGlobal, int, android.view.DisplayInfo, android.view.DisplayAdjustments);
- <init>(android.hardware.display.DisplayManagerGlobal, int, android.view.DisplayInfo, android.content.res.Resources);
-
- public java.lang.String getAddress();
- public long getAppVsyncOffsetNanos();
- public int getColorMode();
- public void getCurrentSizeRange(android.graphics.Point, android.graphics.Point);
- public android.view.DisplayAdjustments getDisplayAdjustments();
- public int getDisplayId();
- public boolean getDisplayInfo(android.view.DisplayInfo);
- public int getFlags();
- public android.view.Display$HdrCapabilities getHdrCapabilities();
- public int getHeight();
- public int getLayerStack();
- public int getMaximumSizeDimension();
- public void getMetrics(android.util.DisplayMetrics);
- public android.view.Display$Mode getMode();
- public java.lang.String getName();
- public int getOrientation();
- public void getOverscanInsets(android.graphics.Rect);
- public java.lang.String getOwnerPackageName();
- public int getOwnerUid();
- public int getPixelFormat();
- public long getPresentationDeadlineNanos();
- public void getRealMetrics(android.util.DisplayMetrics);
- public void getRealSize(android.graphics.Point);
- public void getRectSize(android.graphics.Rect);
- public float getRefreshRate();
- public int getRemoveMode();
- public int getRotation();
- public void getSize(android.graphics.Point);
- public int getState();
- public int[] getSupportedColorModes();
- public android.view.Display$Mode[] getSupportedModes();
- public float[] getSupportedRefreshRates();
- public int getType();
- public int getWidth();
- public boolean hasAccess(int);
- public static boolean hasAccess(int, int, int);
- public static boolean isDozeState(int);
- public boolean isHdr();
- public boolean isPublicPresentation();
- public static boolean isSuspendedState(int);
- public boolean isValid();
- public boolean isWideColorGamut();
- public void requestColorMode(int);
- public static java.lang.String stateToString(int);
- public java.lang.String toString();
- public static java.lang.String typeToString(int);
-
-
- public static int COLOR_MODE_ADOBE_RGB;
- public static int COLOR_MODE_BT601_525;
- public static int COLOR_MODE_BT601_525_UNADJUSTED;
- public static int COLOR_MODE_BT601_625;
- public static int COLOR_MODE_BT601_625_UNADJUSTED;
- public static int COLOR_MODE_BT709;
- public static int COLOR_MODE_DCI_P3;
- public static int COLOR_MODE_DEFAULT;
- public static int COLOR_MODE_DISPLAY_P3;
- public static int COLOR_MODE_INVALID;
- public static int COLOR_MODE_SRGB;
- public static int DEFAULT_DISPLAY;
- public static int FLAG_CAN_SHOW_WITH_INSECURE_KEYGUARD;
- public static int FLAG_PRESENTATION;
- public static int FLAG_PRIVATE;
- public static int FLAG_ROUND;
- public static int FLAG_SCALING_DISABLED;
- public static int FLAG_SECURE;
- public static int FLAG_SUPPORTS_PROTECTED_BUFFERS;
- public static int INVALID_DISPLAY;
- public static int REMOVE_MODE_DESTROY_CONTENT;
- public static int REMOVE_MODE_MOVE_CONTENT_TO_PRIMARY;
- public static int STATE_DOZE;
- public static int STATE_DOZE_SUSPEND;
- public static int STATE_OFF;
- public static int STATE_ON;
- public static int STATE_ON_SUSPEND;
- public static int STATE_UNKNOWN;
- public static int STATE_VR;
- public static int TYPE_BUILT_IN;
- public static int TYPE_HDMI;
- public static int TYPE_OVERLAY;
- public static int TYPE_UNKNOWN;
- public static int TYPE_VIRTUAL;
- public static int TYPE_WIFI;
-}
-
--keep class android.view.Display$HdrCapabilities {
- <init>();
- <init>(int[], float, float, float);
-
- public int describeContents();
- public boolean equals(java.lang.Object);
- public float getDesiredMaxAverageLuminance();
- public float getDesiredMaxLuminance();
- public float getDesiredMinLuminance();
- public int[] getSupportedHdrTypes();
- public int hashCode();
- public void readFromParcel(android.os.Parcel);
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public static int HDR_TYPE_DOLBY_VISION;
- public static int HDR_TYPE_HDR10;
- public static int HDR_TYPE_HLG;
- public static float INVALID_LUMINANCE;
-}
-
--keep class android.view.Display$Mode {
- <init>(int, int, int, float);
-
- public int describeContents();
- public boolean equals(java.lang.Object);
- public int getModeId();
- public int getPhysicalHeight();
- public int getPhysicalWidth();
- public float getRefreshRate();
- public int hashCode();
- public boolean matches(int, int, float);
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public static android.view.Display$Mode[] EMPTY_ARRAY;
-}
-
--keep class android.view.DisplayAdjustments {
- <init>();
- <init>(android.content.res.Configuration);
- <init>(android.view.DisplayAdjustments);
-
- public boolean equals(java.lang.Object);
- public android.content.res.CompatibilityInfo getCompatibilityInfo();
- public android.content.res.Configuration getConfiguration();
- public int hashCode();
- public void setCompatibilityInfo(android.content.res.CompatibilityInfo);
- public void setConfiguration(android.content.res.Configuration);
-
-
- public static android.view.DisplayAdjustments DEFAULT_DISPLAY_ADJUSTMENTS;
-}
-
--keep class android.view.DisplayCutout {
- <init>(android.graphics.Rect, java.util.List);
-
- public boolean equals(java.lang.Object);
- public static android.view.DisplayCutout fromBoundingRect(int, int, int, int);
- public static android.view.DisplayCutout fromBounds(android.graphics.Region);
- public static android.view.DisplayCutout fromResourcesRectApproximation(android.content.res.Resources, int, int);
- public static android.view.DisplayCutout fromSpec(java.lang.String, int, int, float);
- public java.util.List getBoundingRects();
- public android.graphics.Region getBounds();
- public int getSafeInsetBottom();
- public int getSafeInsetLeft();
- public int getSafeInsetRight();
- public int getSafeInsetTop();
- public android.graphics.Rect getSafeInsets();
- public int hashCode();
- public android.view.DisplayCutout inset(int, int, int, int);
- public boolean isBoundsEmpty();
- public boolean isEmpty();
- public static android.graphics.Path pathFromResources(android.content.res.Resources, int, int);
- public android.view.DisplayCutout replaceSafeInsets(android.graphics.Rect);
- public java.lang.String toString();
- public void writeToProto(android.util.proto.ProtoOutputStream, long);
-
-
- public static java.lang.String EMULATION_OVERLAY_CATEGORY;
- public static android.view.DisplayCutout NO_CUTOUT;
-}
-
--keep class android.view.DisplayCutout$ParcelableWrapper {
- <init>();
- <init>(android.view.DisplayCutout);
-
- public int describeContents();
- public boolean equals(java.lang.Object);
- public android.view.DisplayCutout get();
- public int hashCode();
- public static android.view.DisplayCutout readCutoutFromParcel(android.os.Parcel);
- public void readFromParcel(android.os.Parcel);
- public void set(android.view.DisplayCutout$ParcelableWrapper);
- public void set(android.view.DisplayCutout);
- public java.lang.String toString();
- public static void writeCutoutToParcel(android.view.DisplayCutout, android.os.Parcel, int);
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.view.DisplayInfo {
- <init>();
- <init>(android.view.DisplayInfo);
-
- public void copyFrom(android.view.DisplayInfo);
- public int describeContents();
- public boolean equals(java.lang.Object);
- public boolean equals(android.view.DisplayInfo);
- public int findDefaultModeByRefreshRate(float);
- public void getAppMetrics(android.util.DisplayMetrics);
- public void getAppMetrics(android.util.DisplayMetrics, android.view.DisplayAdjustments);
- public void getAppMetrics(android.util.DisplayMetrics, android.content.res.CompatibilityInfo, android.content.res.Configuration);
- public android.view.Display$Mode getDefaultMode();
- public float[] getDefaultRefreshRates();
- public void getLogicalMetrics(android.util.DisplayMetrics, android.content.res.CompatibilityInfo, android.content.res.Configuration);
- public android.view.Display$Mode getMode();
- public int getNaturalHeight();
- public int getNaturalWidth();
- public boolean hasAccess(int);
- public int hashCode();
- public boolean isHdr();
- public boolean isWideColorGamut();
- public void readFromParcel(android.os.Parcel);
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
- public void writeToProto(android.util.proto.ProtoOutputStream, long);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public java.lang.String address;
- public int appHeight;
- public long appVsyncOffsetNanos;
- public int appWidth;
- public int colorMode;
- public int defaultModeId;
- public android.view.DisplayCutout displayCutout;
- public int flags;
- public android.view.Display$HdrCapabilities hdrCapabilities;
- public int largestNominalAppHeight;
- public int largestNominalAppWidth;
- public int layerStack;
- public int logicalDensityDpi;
- public int logicalHeight;
- public int logicalWidth;
- public int modeId;
- public java.lang.String name;
- public int overscanBottom;
- public int overscanLeft;
- public int overscanRight;
- public int overscanTop;
- public java.lang.String ownerPackageName;
- public int ownerUid;
- public float physicalXDpi;
- public float physicalYDpi;
- public long presentationDeadlineNanos;
- public int removeMode;
- public int rotation;
- public int smallestNominalAppHeight;
- public int smallestNominalAppWidth;
- public int state;
- public int[] supportedColorModes;
- public android.view.Display$Mode[] supportedModes;
- public int type;
- public java.lang.String uniqueId;
-}
-
--keep class android.view.DisplayListCanvas {
-
- public void callDrawGLFunction2(long);
- public void drawCircle(android.graphics.CanvasProperty, android.graphics.CanvasProperty, android.graphics.CanvasProperty, android.graphics.CanvasProperty);
- public void drawGLFunctor2(long, java.lang.Runnable);
- public void drawRenderNode(android.view.RenderNode);
- public void drawRoundRect(android.graphics.CanvasProperty, android.graphics.CanvasProperty, android.graphics.CanvasProperty, android.graphics.CanvasProperty, android.graphics.CanvasProperty, android.graphics.CanvasProperty, android.graphics.CanvasProperty);
- public int getHeight();
- public int getMaximumBitmapHeight();
- public int getMaximumBitmapWidth();
- public int getWidth();
- public void insertInorderBarrier();
- public void insertReorderBarrier();
- public boolean isHardwareAccelerated();
- public boolean isOpaque();
- public boolean isRecordingFor(java.lang.Object);
- public void setBitmap(android.graphics.Bitmap);
- public void setDensity(int);
- protected void throwIfCannotDraw(android.graphics.Bitmap);
-
-
-}
-
--keep class android.view.DragAndDropPermissions {
-
- public int describeContents();
- public static android.view.DragAndDropPermissions obtain(android.view.DragEvent);
- public void release();
- public boolean take(android.os.IBinder);
- public boolean takeTransient();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.view.DragEvent {
-
- public int describeContents();
- public int getAction();
- public android.content.ClipData getClipData();
- public android.content.ClipDescription getClipDescription();
- public com.android.internal.view.IDragAndDropPermissions getDragAndDropPermissions();
- public java.lang.Object getLocalState();
- public boolean getResult();
- public float getX();
- public float getY();
- public static android.view.DragEvent obtain(int, float, float, java.lang.Object, android.content.ClipDescription, android.content.ClipData, com.android.internal.view.IDragAndDropPermissions, boolean);
- public static android.view.DragEvent obtain(android.view.DragEvent);
- public void recycle();
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static int ACTION_DRAG_ENDED;
- public static int ACTION_DRAG_ENTERED;
- public static int ACTION_DRAG_EXITED;
- public static int ACTION_DRAG_LOCATION;
- public static int ACTION_DRAG_STARTED;
- public static int ACTION_DROP;
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.view.FrameMetrics {
- <init>(android.view.FrameMetrics);
-
- public long getMetric(int);
-
-
- public static int ANIMATION_DURATION;
- public static int COMMAND_ISSUE_DURATION;
- public static int DRAW_DURATION;
- public static int FIRST_DRAW_FRAME;
- public static int INPUT_HANDLING_DURATION;
- public static int INTENDED_VSYNC_TIMESTAMP;
- public static int LAYOUT_MEASURE_DURATION;
- public static int SWAP_BUFFERS_DURATION;
- public static int SYNC_DURATION;
- public static int TOTAL_DURATION;
- public static int UNKNOWN_DELAY_DURATION;
- public static int VSYNC_TIMESTAMP;
-}
-
--keep class android.view.FrameStats {
- <init>();
-
- public long getEndTimeNano();
- public int getFrameCount();
- public long getFramePresentedTimeNano(int);
- public long getRefreshPeriodNano();
- public long getStartTimeNano();
-
-
- public static long UNDEFINED_TIME_NANO;
- protected long[] mFramesPresentedTimeNano;
- protected long mRefreshPeriodNano;
-}
-
--keep class android.view.IAppTransitionAnimationSpecsFuture {
-
- public abstract android.view.AppTransitionAnimationSpec[] get();
-
-
-}
-
--keep class android.view.IRecentsAnimationController {
-
- public abstract void finish(boolean);
- public abstract void hideCurrentInputMethod();
- public abstract android.app.ActivityManager$TaskSnapshot screenshotTask(int);
- public abstract void setAnimationTargetsBehindSystemBars(boolean);
- public abstract void setInputConsumerEnabled(boolean);
- public abstract void setSplitScreenMinimized(boolean);
-
-
-}
-
--keep class android.view.IRecentsAnimationRunner {
-
- public abstract void onAnimationCanceled();
- public abstract void onAnimationStart(android.view.IRecentsAnimationController, android.view.RemoteAnimationTarget[], android.graphics.Rect, android.graphics.Rect);
-
-
-}
-
--keep class android.view.IRemoteAnimationFinishedCallback {
-
- public abstract void onAnimationFinished();
-
-
-}
-
--keep class android.view.IRemoteAnimationRunner {
-
- public abstract void onAnimationCancelled();
- public abstract void onAnimationStart(android.view.RemoteAnimationTarget[], android.view.IRemoteAnimationFinishedCallback);
-
-
-}
-
--keep class android.view.IWindow {
-
- public abstract void closeSystemDialogs(java.lang.String);
- public abstract void dispatchAppVisibility(boolean);
- public abstract void dispatchDragEvent(android.view.DragEvent);
- public abstract void dispatchGetNewSurface();
- public abstract void dispatchPointerCaptureChanged(boolean);
- public abstract void dispatchSystemUiVisibilityChanged(int, int, int, int);
- public abstract void dispatchWallpaperCommand(java.lang.String, int, int, int, android.os.Bundle, boolean);
- public abstract void dispatchWallpaperOffsets(float, float, float, float, boolean);
- public abstract void dispatchWindowShown();
- public abstract void executeCommand(java.lang.String, java.lang.String, android.os.ParcelFileDescriptor);
- public abstract void moved(int, int);
- public abstract void requestAppKeyboardShortcuts(com.android.internal.os.IResultReceiver, int);
- public abstract void resized(android.graphics.Rect, android.graphics.Rect, android.graphics.Rect, android.graphics.Rect, android.graphics.Rect, android.graphics.Rect, boolean, android.util.MergedConfiguration, android.graphics.Rect, boolean, boolean, int, android.view.DisplayCutout$ParcelableWrapper);
- public abstract void updatePointerIcon(float, float);
- public abstract void windowFocusChanged(boolean, boolean);
-
-
-}
-
--keep class android.view.IWindowFocusObserver {
-
- public abstract void focusGained(android.os.IBinder);
- public abstract void focusLost(android.os.IBinder);
-
-
-}
-
--keep class android.view.IWindowId {
-
- public abstract boolean isFocused();
- public abstract void registerFocusObserver(android.view.IWindowFocusObserver);
- public abstract void unregisterFocusObserver(android.view.IWindowFocusObserver);
-
-
-}
-
--keep class android.view.InflateException {
- <init>();
- <init>(java.lang.String, java.lang.Throwable);
- <init>(java.lang.String);
- <init>(java.lang.Throwable);
-
-
-
-}
-
--keep class android.view.InputChannel {
- <init>();
-
- public int describeContents();
- public void dispose();
- public android.view.InputChannel dup();
- protected void finalize();
- public java.lang.String getName();
- public static android.view.InputChannel[] openInputChannelPair(java.lang.String);
- public void readFromParcel(android.os.Parcel);
- public java.lang.String toString();
- public void transferTo(android.view.InputChannel);
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.view.InputDevice {
-
- public int describeContents();
- public void disable();
- public void enable();
- public int getControllerNumber();
- public java.lang.String getDescriptor();
- public static android.view.InputDevice getDevice(int);
- public static int[] getDeviceIds();
- public int getGeneration();
- public int getId();
- public android.hardware.input.InputDeviceIdentifier getIdentifier();
- public android.view.KeyCharacterMap getKeyCharacterMap();
- public int getKeyboardType();
- public android.view.InputDevice$MotionRange getMotionRange(int);
- public android.view.InputDevice$MotionRange getMotionRange(int, int);
- public java.util.List getMotionRanges();
- public java.lang.String getName();
- public int getProductId();
- public int getSources();
- public int getVendorId();
- public android.os.Vibrator getVibrator();
- public boolean hasButtonUnderPad();
- public boolean[] hasKeys(int[]);
- public boolean hasMicrophone();
- public boolean isEnabled();
- public boolean isExternal();
- public boolean isFullKeyboard();
- public boolean isVirtual();
- public void setCustomPointerIcon(android.view.PointerIcon);
- public void setPointerType(int);
- public boolean supportsSource(int);
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public static int KEYBOARD_TYPE_ALPHABETIC;
- public static int KEYBOARD_TYPE_NONE;
- public static int KEYBOARD_TYPE_NON_ALPHABETIC;
- public static int MOTION_RANGE_ORIENTATION;
- public static int MOTION_RANGE_PRESSURE;
- public static int MOTION_RANGE_SIZE;
- public static int MOTION_RANGE_TOOL_MAJOR;
- public static int MOTION_RANGE_TOOL_MINOR;
- public static int MOTION_RANGE_TOUCH_MAJOR;
- public static int MOTION_RANGE_TOUCH_MINOR;
- public static int MOTION_RANGE_X;
- public static int MOTION_RANGE_Y;
- public static int SOURCE_ANY;
- public static int SOURCE_BLUETOOTH_STYLUS;
- public static int SOURCE_CLASS_BUTTON;
- public static int SOURCE_CLASS_JOYSTICK;
- public static int SOURCE_CLASS_MASK;
- public static int SOURCE_CLASS_NONE;
- public static int SOURCE_CLASS_POINTER;
- public static int SOURCE_CLASS_POSITION;
- public static int SOURCE_CLASS_TRACKBALL;
- public static int SOURCE_DPAD;
- public static int SOURCE_GAMEPAD;
- public static int SOURCE_HDMI;
- public static int SOURCE_JOYSTICK;
- public static int SOURCE_KEYBOARD;
- public static int SOURCE_MOUSE;
- public static int SOURCE_MOUSE_RELATIVE;
- public static int SOURCE_ROTARY_ENCODER;
- public static int SOURCE_STYLUS;
- public static int SOURCE_TOUCHPAD;
- public static int SOURCE_TOUCHSCREEN;
- public static int SOURCE_TOUCH_NAVIGATION;
- public static int SOURCE_TRACKBALL;
- public static int SOURCE_UNKNOWN;
-}
-
--keep class android.view.InputDevice$MotionRange {
-
- public int getAxis();
- public float getFlat();
- public float getFuzz();
- public float getMax();
- public float getMin();
- public float getRange();
- public float getResolution();
- public int getSource();
- public boolean isFromSource(int);
-
-
-}
-
--keep class android.view.InputEvent {
-
- public abstract void cancel();
- public abstract android.view.InputEvent copy();
- public int describeContents();
- public android.view.InputDevice getDevice();
- public abstract int getDeviceId();
- public abstract long getEventTime();
- public abstract long getEventTimeNano();
- public int getSequenceNumber();
- public abstract int getSource();
- public boolean isFromSource(int);
- public abstract boolean isTainted();
- protected void prepareForReuse();
- public void recycle();
- public void recycleIfNeededAfterDispatch();
- public abstract void setSource(int);
- public abstract void setTainted(boolean);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- protected static int PARCEL_TOKEN_KEY_EVENT;
- protected static int PARCEL_TOKEN_MOTION_EVENT;
- protected boolean mRecycled;
- protected int mSeq;
-}
-
--keep class android.view.InputEventConsistencyVerifier {
- <init>(java.lang.Object, int);
- <init>(java.lang.Object, int, java.lang.String);
-
- public static boolean isInstrumentationEnabled();
- public void onGenericMotionEvent(android.view.MotionEvent, int);
- public void onInputEvent(android.view.InputEvent, int);
- public void onKeyEvent(android.view.KeyEvent, int);
- public void onTouchEvent(android.view.MotionEvent, int);
- public void onTrackballEvent(android.view.MotionEvent, int);
- public void onUnhandledEvent(android.view.InputEvent, int);
- public void reset();
-
-
- public static int FLAG_RAW_DEVICE_INPUT;
-}
-
--keep class android.view.InputEventReceiver {
- <init>(android.view.InputChannel, android.os.Looper);
-
- public boolean consumeBatchedInputEvents(long);
- public void dispose();
- protected void finalize();
- public void finishInputEvent(android.view.InputEvent, boolean);
- public void onBatchedInputEventPending();
- public void onInputEvent(android.view.InputEvent, int);
-
-
-}
-
--keep class android.view.InputQueue {
- <init>();
-
- public void dispose();
- public void dispose(boolean);
- protected void finalize();
- public long getNativePtr();
- public void sendInputEvent(android.view.InputEvent, java.lang.Object, boolean, android.view.InputQueue$FinishedInputEventCallback);
-
-
-}
-
--keep class android.view.InputQueue$Callback {
-
- public abstract void onInputQueueCreated(android.view.InputQueue);
- public abstract void onInputQueueDestroyed(android.view.InputQueue);
-
-
-}
-
--keep class android.view.InputQueue$FinishedInputEventCallback {
-
- public abstract void onFinishedInputEvent(java.lang.Object, boolean);
-
-
-}
-
--keep class android.view.KeyCharacterMap {
-
- public int describeContents();
- public static boolean deviceHasKey(int);
- public static boolean[] deviceHasKeys(int[]);
- protected void finalize();
- public int get(int, int);
- public static int getDeadChar(int, int);
- public char getDisplayLabel(int);
- public android.view.KeyEvent[] getEvents(char[]);
- public android.view.KeyCharacterMap$FallbackAction getFallbackAction(int, int);
- public boolean getKeyData(int, android.view.KeyCharacterMap$KeyData);
- public int getKeyboardType();
- public char getMatch(int, char[]);
- public char getMatch(int, char[], int);
- public int getModifierBehavior();
- public char getNumber(int);
- public boolean isPrintingKey(int);
- public static android.view.KeyCharacterMap load(int);
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static int ALPHA;
- public static int BUILT_IN_KEYBOARD;
- public static int COMBINING_ACCENT;
- public static int COMBINING_ACCENT_MASK;
- public static android.os.Parcelable$Creator CREATOR;
- public static int FULL;
- public static char HEX_INPUT;
- public static int MODIFIER_BEHAVIOR_CHORDED;
- public static int MODIFIER_BEHAVIOR_CHORDED_OR_TOGGLED;
- public static int NUMERIC;
- public static char PICKER_DIALOG_INPUT;
- public static int PREDICTIVE;
- public static int SPECIAL_FUNCTION;
- public static int VIRTUAL_KEYBOARD;
-}
-
--keep class android.view.KeyCharacterMap$FallbackAction {
-
- public static android.view.KeyCharacterMap$FallbackAction obtain();
- public void recycle();
-
-
- public int keyCode;
- public int metaState;
-}
-
--keep class android.view.KeyCharacterMap$KeyData {
- <init>();
-
-
-
- public static int META_LENGTH;
- public char displayLabel;
- public char[] meta;
- public char number;
-}
-
--keep class android.view.KeyEvent {
- <init>(int, int);
- <init>(long, long, int, int, int);
- <init>(long, long, int, int, int, int);
- <init>(long, long, int, int, int, int, int, int);
- <init>(long, long, int, int, int, int, int, int, int);
- <init>(long, long, int, int, int, int, int, int, int, int);
- <init>(long, java.lang.String, int, int);
- <init>(android.view.KeyEvent);
- <init>(android.view.KeyEvent, long, int);
-
- public static java.lang.String actionToString(int);
- public void cancel();
- public static android.view.KeyEvent changeAction(android.view.KeyEvent, int);
- public static android.view.KeyEvent changeFlags(android.view.KeyEvent, int);
- public static android.view.KeyEvent changeTimeRepeat(android.view.KeyEvent, long, int);
- public static android.view.KeyEvent changeTimeRepeat(android.view.KeyEvent, long, int, int);
- public android.view.KeyEvent copy();
- public android.view.InputEvent copy();
- public static android.view.KeyEvent createFromParcelBody(android.os.Parcel);
- public boolean dispatch(android.view.KeyEvent$Callback);
- public boolean dispatch(android.view.KeyEvent$Callback, android.view.KeyEvent$DispatcherState, java.lang.Object);
- public int getAction();
- public java.lang.String getCharacters();
- public static int getDeadChar(int, int);
- public int getDeviceId();
- public char getDisplayLabel();
- public long getDownTime();
- public long getEventTime();
- public long getEventTimeNano();
- public int getFlags();
- public android.view.KeyCharacterMap getKeyCharacterMap();
- public int getKeyCode();
- public boolean getKeyData(android.view.KeyCharacterMap$KeyData);
- public int getKeyboardDevice();
- public char getMatch(char[]);
- public char getMatch(char[], int);
- public static int getMaxKeyCode();
- public int getMetaState();
- public static int getModifierMetaStateMask();
- public int getModifiers();
- public char getNumber();
- public int getRepeatCount();
- public int getScanCode();
- public int getSource();
- public int getUnicodeChar();
- public int getUnicodeChar(int);
- public boolean hasModifiers(int);
- public boolean hasNoModifiers();
- public static boolean isAltKey(int);
- public boolean isAltPressed();
- public boolean isCanceled();
- public boolean isCapsLockOn();
- public static boolean isConfirmKey(int);
- public boolean isCtrlPressed();
- public boolean isDown();
- public boolean isFunctionPressed();
- public static boolean isGamepadButton(int);
- public boolean isLongPress();
- public static boolean isMediaKey(int);
- public static boolean isMetaKey(int);
- public boolean isMetaPressed();
- public static boolean isModifierKey(int);
- public boolean isNumLockOn();
- public boolean isPrintingKey();
- public boolean isScrollLockOn();
- public boolean isShiftPressed();
- public boolean isSymPressed();
- public boolean isSystem();
- public static boolean isSystemKey(int);
- public boolean isTainted();
- public boolean isTracking();
- public boolean isWakeKey();
- public static boolean isWakeKey(int);
- public static int keyCodeFromString(java.lang.String);
- public static java.lang.String keyCodeToString(int);
- public static boolean metaStateHasModifiers(int, int);
- public static boolean metaStateHasNoModifiers(int);
- public static java.lang.String metaStateToString(int);
- public static int normalizeMetaState(int);
- public static android.view.KeyEvent obtain(long, long, int, int, int, int, int, int, int, int, java.lang.String);
- public static android.view.KeyEvent obtain(android.view.KeyEvent);
- public void recycle();
- public void recycleIfNeededAfterDispatch();
- public void setSource(int);
- public void setTainted(boolean);
- public void startTracking();
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static int ACTION_DOWN;
- public static int ACTION_MULTIPLE;
- public static int ACTION_UP;
- public static android.os.Parcelable$Creator CREATOR;
- public static int FLAG_CANCELED;
- public static int FLAG_CANCELED_LONG_PRESS;
- public static int FLAG_EDITOR_ACTION;
- public static int FLAG_FALLBACK;
- public static int FLAG_FROM_SYSTEM;
- public static int FLAG_KEEP_TOUCH_MODE;
- public static int FLAG_LONG_PRESS;
- public static int FLAG_PREDISPATCH;
- public static int FLAG_SOFT_KEYBOARD;
- public static int FLAG_START_TRACKING;
- public static int FLAG_TAINTED;
- public static int FLAG_TRACKING;
- public static int FLAG_VIRTUAL_HARD_KEY;
- public static int FLAG_WOKE_HERE;
- public static int KEYCODE_0;
- public static int KEYCODE_1;
- public static int KEYCODE_11;
- public static int KEYCODE_12;
- public static int KEYCODE_2;
- public static int KEYCODE_3;
- public static int KEYCODE_3D_MODE;
- public static int KEYCODE_4;
- public static int KEYCODE_5;
- public static int KEYCODE_6;
- public static int KEYCODE_7;
- public static int KEYCODE_8;
- public static int KEYCODE_9;
- public static int KEYCODE_A;
- public static int KEYCODE_ALL_APPS;
- public static int KEYCODE_ALT_LEFT;
- public static int KEYCODE_ALT_RIGHT;
- public static int KEYCODE_APOSTROPHE;
- public static int KEYCODE_APP_SWITCH;
- public static int KEYCODE_ASSIST;
- public static int KEYCODE_AT;
- public static int KEYCODE_AVR_INPUT;
- public static int KEYCODE_AVR_POWER;
- public static int KEYCODE_B;
- public static int KEYCODE_BACK;
- public static int KEYCODE_BACKSLASH;
- public static int KEYCODE_BOOKMARK;
- public static int KEYCODE_BREAK;
- public static int KEYCODE_BRIGHTNESS_DOWN;
- public static int KEYCODE_BRIGHTNESS_UP;
- public static int KEYCODE_BUTTON_1;
- public static int KEYCODE_BUTTON_10;
- public static int KEYCODE_BUTTON_11;
- public static int KEYCODE_BUTTON_12;
- public static int KEYCODE_BUTTON_13;
- public static int KEYCODE_BUTTON_14;
- public static int KEYCODE_BUTTON_15;
- public static int KEYCODE_BUTTON_16;
- public static int KEYCODE_BUTTON_2;
- public static int KEYCODE_BUTTON_3;
- public static int KEYCODE_BUTTON_4;
- public static int KEYCODE_BUTTON_5;
- public static int KEYCODE_BUTTON_6;
- public static int KEYCODE_BUTTON_7;
- public static int KEYCODE_BUTTON_8;
- public static int KEYCODE_BUTTON_9;
- public static int KEYCODE_BUTTON_A;
- public static int KEYCODE_BUTTON_B;
- public static int KEYCODE_BUTTON_C;
- public static int KEYCODE_BUTTON_L1;
- public static int KEYCODE_BUTTON_L2;
- public static int KEYCODE_BUTTON_MODE;
- public static int KEYCODE_BUTTON_R1;
- public static int KEYCODE_BUTTON_R2;
- public static int KEYCODE_BUTTON_SELECT;
- public static int KEYCODE_BUTTON_START;
- public static int KEYCODE_BUTTON_THUMBL;
- public static int KEYCODE_BUTTON_THUMBR;
- public static int KEYCODE_BUTTON_X;
- public static int KEYCODE_BUTTON_Y;
- public static int KEYCODE_BUTTON_Z;
- public static int KEYCODE_C;
- public static int KEYCODE_CALCULATOR;
- public static int KEYCODE_CALENDAR;
- public static int KEYCODE_CALL;
- public static int KEYCODE_CAMERA;
- public static int KEYCODE_CAPS_LOCK;
- public static int KEYCODE_CAPTIONS;
- public static int KEYCODE_CHANNEL_DOWN;
- public static int KEYCODE_CHANNEL_UP;
- public static int KEYCODE_CLEAR;
- public static int KEYCODE_COMMA;
- public static int KEYCODE_CONTACTS;
- public static int KEYCODE_COPY;
- public static int KEYCODE_CTRL_LEFT;
- public static int KEYCODE_CTRL_RIGHT;
- public static int KEYCODE_CUT;
- public static int KEYCODE_D;
- public static int KEYCODE_DEL;
- public static int KEYCODE_DPAD_CENTER;
- public static int KEYCODE_DPAD_DOWN;
- public static int KEYCODE_DPAD_DOWN_LEFT;
- public static int KEYCODE_DPAD_DOWN_RIGHT;
- public static int KEYCODE_DPAD_LEFT;
- public static int KEYCODE_DPAD_RIGHT;
- public static int KEYCODE_DPAD_UP;
- public static int KEYCODE_DPAD_UP_LEFT;
- public static int KEYCODE_DPAD_UP_RIGHT;
- public static int KEYCODE_DVR;
- public static int KEYCODE_E;
- public static int KEYCODE_EISU;
- public static int KEYCODE_ENDCALL;
- public static int KEYCODE_ENTER;
- public static int KEYCODE_ENVELOPE;
- public static int KEYCODE_EQUALS;
- public static int KEYCODE_ESCAPE;
- public static int KEYCODE_EXPLORER;
- public static int KEYCODE_F;
- public static int KEYCODE_F1;
- public static int KEYCODE_F10;
- public static int KEYCODE_F11;
- public static int KEYCODE_F12;
- public static int KEYCODE_F2;
- public static int KEYCODE_F3;
- public static int KEYCODE_F4;
- public static int KEYCODE_F5;
- public static int KEYCODE_F6;
- public static int KEYCODE_F7;
- public static int KEYCODE_F8;
- public static int KEYCODE_F9;
- public static int KEYCODE_FOCUS;
- public static int KEYCODE_FORWARD;
- public static int KEYCODE_FORWARD_DEL;
- public static int KEYCODE_FUNCTION;
- public static int KEYCODE_G;
- public static int KEYCODE_GRAVE;
- public static int KEYCODE_GUIDE;
- public static int KEYCODE_H;
- public static int KEYCODE_HEADSETHOOK;
- public static int KEYCODE_HELP;
- public static int KEYCODE_HENKAN;
- public static int KEYCODE_HOME;
- public static int KEYCODE_I;
- public static int KEYCODE_INFO;
- public static int KEYCODE_INSERT;
- public static int KEYCODE_J;
- public static int KEYCODE_K;
- public static int KEYCODE_KANA;
- public static int KEYCODE_KATAKANA_HIRAGANA;
- public static int KEYCODE_L;
- public static int KEYCODE_LANGUAGE_SWITCH;
- public static int KEYCODE_LAST_CHANNEL;
- public static int KEYCODE_LEFT_BRACKET;
- public static int KEYCODE_M;
- public static int KEYCODE_MANNER_MODE;
- public static int KEYCODE_MEDIA_AUDIO_TRACK;
- public static int KEYCODE_MEDIA_CLOSE;
- public static int KEYCODE_MEDIA_EJECT;
- public static int KEYCODE_MEDIA_FAST_FORWARD;
- public static int KEYCODE_MEDIA_NEXT;
- public static int KEYCODE_MEDIA_PAUSE;
- public static int KEYCODE_MEDIA_PLAY;
- public static int KEYCODE_MEDIA_PLAY_PAUSE;
- public static int KEYCODE_MEDIA_PREVIOUS;
- public static int KEYCODE_MEDIA_RECORD;
- public static int KEYCODE_MEDIA_REWIND;
- public static int KEYCODE_MEDIA_SKIP_BACKWARD;
- public static int KEYCODE_MEDIA_SKIP_FORWARD;
- public static int KEYCODE_MEDIA_STEP_BACKWARD;
- public static int KEYCODE_MEDIA_STEP_FORWARD;
- public static int KEYCODE_MEDIA_STOP;
- public static int KEYCODE_MEDIA_TOP_MENU;
- public static int KEYCODE_MENU;
- public static int KEYCODE_META_LEFT;
- public static int KEYCODE_META_RIGHT;
- public static int KEYCODE_MINUS;
- public static int KEYCODE_MOVE_END;
- public static int KEYCODE_MOVE_HOME;
- public static int KEYCODE_MUHENKAN;
- public static int KEYCODE_MUSIC;
- public static int KEYCODE_MUTE;
- public static int KEYCODE_N;
- public static int KEYCODE_NAVIGATE_IN;
- public static int KEYCODE_NAVIGATE_NEXT;
- public static int KEYCODE_NAVIGATE_OUT;
- public static int KEYCODE_NAVIGATE_PREVIOUS;
- public static int KEYCODE_NOTIFICATION;
- public static int KEYCODE_NUM;
- public static int KEYCODE_NUMPAD_0;
- public static int KEYCODE_NUMPAD_1;
- public static int KEYCODE_NUMPAD_2;
- public static int KEYCODE_NUMPAD_3;
- public static int KEYCODE_NUMPAD_4;
- public static int KEYCODE_NUMPAD_5;
- public static int KEYCODE_NUMPAD_6;
- public static int KEYCODE_NUMPAD_7;
- public static int KEYCODE_NUMPAD_8;
- public static int KEYCODE_NUMPAD_9;
- public static int KEYCODE_NUMPAD_ADD;
- public static int KEYCODE_NUMPAD_COMMA;
- public static int KEYCODE_NUMPAD_DIVIDE;
- public static int KEYCODE_NUMPAD_DOT;
- public static int KEYCODE_NUMPAD_ENTER;
- public static int KEYCODE_NUMPAD_EQUALS;
- public static int KEYCODE_NUMPAD_LEFT_PAREN;
- public static int KEYCODE_NUMPAD_MULTIPLY;
- public static int KEYCODE_NUMPAD_RIGHT_PAREN;
- public static int KEYCODE_NUMPAD_SUBTRACT;
- public static int KEYCODE_NUM_LOCK;
- public static int KEYCODE_O;
- public static int KEYCODE_P;
- public static int KEYCODE_PAGE_DOWN;
- public static int KEYCODE_PAGE_UP;
- public static int KEYCODE_PAIRING;
- public static int KEYCODE_PASTE;
- public static int KEYCODE_PERIOD;
- public static int KEYCODE_PICTSYMBOLS;
- public static int KEYCODE_PLUS;
- public static int KEYCODE_POUND;
- public static int KEYCODE_POWER;
- public static int KEYCODE_PROG_BLUE;
- public static int KEYCODE_PROG_GREEN;
- public static int KEYCODE_PROG_RED;
- public static int KEYCODE_PROG_YELLOW;
- public static int KEYCODE_Q;
- public static int KEYCODE_R;
- public static int KEYCODE_REFRESH;
- public static int KEYCODE_RIGHT_BRACKET;
- public static int KEYCODE_RO;
- public static int KEYCODE_S;
- public static int KEYCODE_SCROLL_LOCK;
- public static int KEYCODE_SEARCH;
- public static int KEYCODE_SEMICOLON;
- public static int KEYCODE_SETTINGS;
- public static int KEYCODE_SHIFT_LEFT;
- public static int KEYCODE_SHIFT_RIGHT;
- public static int KEYCODE_SLASH;
- public static int KEYCODE_SLEEP;
- public static int KEYCODE_SOFT_LEFT;
- public static int KEYCODE_SOFT_RIGHT;
- public static int KEYCODE_SOFT_SLEEP;
- public static int KEYCODE_SPACE;
- public static int KEYCODE_STAR;
- public static int KEYCODE_STB_INPUT;
- public static int KEYCODE_STB_POWER;
- public static int KEYCODE_STEM_1;
- public static int KEYCODE_STEM_2;
- public static int KEYCODE_STEM_3;
- public static int KEYCODE_STEM_PRIMARY;
- public static int KEYCODE_SWITCH_CHARSET;
- public static int KEYCODE_SYM;
- public static int KEYCODE_SYSRQ;
- public static int KEYCODE_SYSTEM_NAVIGATION_DOWN;
- public static int KEYCODE_SYSTEM_NAVIGATION_LEFT;
- public static int KEYCODE_SYSTEM_NAVIGATION_RIGHT;
- public static int KEYCODE_SYSTEM_NAVIGATION_UP;
- public static int KEYCODE_T;
- public static int KEYCODE_TAB;
- public static int KEYCODE_TV;
- public static int KEYCODE_TV_ANTENNA_CABLE;
- public static int KEYCODE_TV_AUDIO_DESCRIPTION;
- public static int KEYCODE_TV_AUDIO_DESCRIPTION_MIX_DOWN;
- public static int KEYCODE_TV_AUDIO_DESCRIPTION_MIX_UP;
- public static int KEYCODE_TV_CONTENTS_MENU;
- public static int KEYCODE_TV_DATA_SERVICE;
- public static int KEYCODE_TV_INPUT;
- public static int KEYCODE_TV_INPUT_COMPONENT_1;
- public static int KEYCODE_TV_INPUT_COMPONENT_2;
- public static int KEYCODE_TV_INPUT_COMPOSITE_1;
- public static int KEYCODE_TV_INPUT_COMPOSITE_2;
- public static int KEYCODE_TV_INPUT_HDMI_1;
- public static int KEYCODE_TV_INPUT_HDMI_2;
- public static int KEYCODE_TV_INPUT_HDMI_3;
- public static int KEYCODE_TV_INPUT_HDMI_4;
- public static int KEYCODE_TV_INPUT_VGA_1;
- public static int KEYCODE_TV_MEDIA_CONTEXT_MENU;
- public static int KEYCODE_TV_NETWORK;
- public static int KEYCODE_TV_NUMBER_ENTRY;
- public static int KEYCODE_TV_POWER;
- public static int KEYCODE_TV_RADIO_SERVICE;
- public static int KEYCODE_TV_SATELLITE;
- public static int KEYCODE_TV_SATELLITE_BS;
- public static int KEYCODE_TV_SATELLITE_CS;
- public static int KEYCODE_TV_SATELLITE_SERVICE;
- public static int KEYCODE_TV_TELETEXT;
- public static int KEYCODE_TV_TERRESTRIAL_ANALOG;
- public static int KEYCODE_TV_TERRESTRIAL_DIGITAL;
- public static int KEYCODE_TV_TIMER_PROGRAMMING;
- public static int KEYCODE_TV_ZOOM_MODE;
- public static int KEYCODE_U;
- public static int KEYCODE_UNKNOWN;
- public static int KEYCODE_V;
- public static int KEYCODE_VOICE_ASSIST;
- public static int KEYCODE_VOLUME_DOWN;
- public static int KEYCODE_VOLUME_MUTE;
- public static int KEYCODE_VOLUME_UP;
- public static int KEYCODE_W;
- public static int KEYCODE_WAKEUP;
- public static int KEYCODE_WINDOW;
- public static int KEYCODE_X;
- public static int KEYCODE_Y;
- public static int KEYCODE_YEN;
- public static int KEYCODE_Z;
- public static int KEYCODE_ZENKAKU_HANKAKU;
- public static int KEYCODE_ZOOM_IN;
- public static int KEYCODE_ZOOM_OUT;
- public static int MAX_KEYCODE;
- public static int META_ALT_LEFT_ON;
- public static int META_ALT_LOCKED;
- public static int META_ALT_MASK;
- public static int META_ALT_ON;
- public static int META_ALT_RIGHT_ON;
- public static int META_CAPS_LOCK_ON;
- public static int META_CAP_LOCKED;
- public static int META_CTRL_LEFT_ON;
- public static int META_CTRL_MASK;
- public static int META_CTRL_ON;
- public static int META_CTRL_RIGHT_ON;
- public static int META_FUNCTION_ON;
- public static int META_META_LEFT_ON;
- public static int META_META_MASK;
- public static int META_META_ON;
- public static int META_META_RIGHT_ON;
- public static int META_NUM_LOCK_ON;
- public static int META_SCROLL_LOCK_ON;
- public static int META_SELECTING;
- public static int META_SHIFT_LEFT_ON;
- public static int META_SHIFT_MASK;
- public static int META_SHIFT_ON;
- public static int META_SHIFT_RIGHT_ON;
- public static int META_SYM_LOCKED;
- public static int META_SYM_ON;
-}
-
--keep class android.view.KeyEvent$Callback {
-
- public abstract boolean onKeyDown(int, android.view.KeyEvent);
- public abstract boolean onKeyLongPress(int, android.view.KeyEvent);
- public abstract boolean onKeyMultiple(int, int, android.view.KeyEvent);
- public abstract boolean onKeyUp(int, android.view.KeyEvent);
-
-
-}
-
--keep class android.view.KeyEvent$DispatcherState {
- <init>();
-
- public void handleUpEvent(android.view.KeyEvent);
- public boolean isTracking(android.view.KeyEvent);
- public void performedLongPress(android.view.KeyEvent);
- public void reset();
- public void reset(java.lang.Object);
- public void startTracking(android.view.KeyEvent, java.lang.Object);
-
-
-}
-
--keep class android.view.KeyboardShortcutGroup {
- <init>(java.lang.CharSequence, java.util.List);
- <init>(java.lang.CharSequence);
- <init>(java.lang.CharSequence, java.util.List, boolean);
- <init>(java.lang.CharSequence, boolean);
-
- public void addItem(android.view.KeyboardShortcutInfo);
- public int describeContents();
- public java.util.List getItems();
- public java.lang.CharSequence getLabel();
- public boolean isSystemGroup();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.view.KeyboardShortcutInfo {
- <init>(java.lang.CharSequence, android.graphics.drawable.Icon, int, int);
- <init>(java.lang.CharSequence, int, int);
- <init>(java.lang.CharSequence, char, int);
-
- public int describeContents();
- public char getBaseCharacter();
- public android.graphics.drawable.Icon getIcon();
- public int getKeycode();
- public java.lang.CharSequence getLabel();
- public int getModifiers();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.view.LayoutInflater {
- <init>(android.content.Context);
- <init>(android.view.LayoutInflater, android.content.Context);
-
- public abstract android.view.LayoutInflater cloneInContext(android.content.Context);
- public android.view.View createView(java.lang.String, java.lang.String, android.util.AttributeSet);
- public static android.view.LayoutInflater from(android.content.Context);
- public android.content.Context getContext();
- public android.view.LayoutInflater$Factory getFactory();
- public android.view.LayoutInflater$Factory2 getFactory2();
- public android.view.LayoutInflater$Filter getFilter();
- public android.view.View inflate(int, android.view.ViewGroup);
- public android.view.View inflate(org.xmlpull.v1.XmlPullParser, android.view.ViewGroup);
- public android.view.View inflate(int, android.view.ViewGroup, boolean);
- public android.view.View inflate(org.xmlpull.v1.XmlPullParser, android.view.ViewGroup, boolean);
- protected android.view.View onCreateView(java.lang.String, android.util.AttributeSet);
- protected android.view.View onCreateView(android.view.View, java.lang.String, android.util.AttributeSet);
- public void setFactory(android.view.LayoutInflater$Factory);
- public void setFactory2(android.view.LayoutInflater$Factory2);
- public void setFilter(android.view.LayoutInflater$Filter);
- public void setPrivateFactory(android.view.LayoutInflater$Factory2);
-
-
- protected android.content.Context mContext;
-}
-
--keep class android.view.LayoutInflater$Factory {
-
- public abstract android.view.View onCreateView(java.lang.String, android.content.Context, android.util.AttributeSet);
-
-
-}
-
--keep class android.view.LayoutInflater$Factory2 {
-
- public abstract android.view.View onCreateView(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet);
-
-
-}
-
--keep class android.view.LayoutInflater$Filter {
-
- public abstract boolean onLoadClass(java.lang.Class);
-
-
-}
-
--keep class android.view.MagnificationSpec {
-
- public void clear();
- public int describeContents();
- public boolean equals(java.lang.Object);
- public int hashCode();
- public void initialize(float, float, float);
- public boolean isNop();
- public static android.view.MagnificationSpec obtain(android.view.MagnificationSpec);
- public static android.view.MagnificationSpec obtain();
- public void recycle();
- public void setTo(android.view.MagnificationSpec);
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public float offsetX;
- public float offsetY;
- public float scale;
-}
-
--keep class android.view.Menu {
-
- public abstract android.view.MenuItem add(java.lang.CharSequence);
- public abstract android.view.MenuItem add(int);
- public abstract android.view.MenuItem add(int, int, int, java.lang.CharSequence);
- public abstract android.view.MenuItem add(int, int, int, int);
- public abstract int addIntentOptions(int, int, int, android.content.ComponentName, android.content.Intent[], android.content.Intent, int, android.view.MenuItem[]);
- public abstract android.view.SubMenu addSubMenu(java.lang.CharSequence);
- public abstract android.view.SubMenu addSubMenu(int);
- public abstract android.view.SubMenu addSubMenu(int, int, int, java.lang.CharSequence);
- public abstract android.view.SubMenu addSubMenu(int, int, int, int);
- public abstract void clear();
- public abstract void close();
- public abstract android.view.MenuItem findItem(int);
- public abstract android.view.MenuItem getItem(int);
- public abstract boolean hasVisibleItems();
- public abstract boolean isShortcutKey(int, android.view.KeyEvent);
- public abstract boolean performIdentifierAction(int, int);
- public abstract boolean performShortcut(int, android.view.KeyEvent, int);
- public abstract void removeGroup(int);
- public abstract void removeItem(int);
- public abstract void setGroupCheckable(int, boolean, boolean);
- public void setGroupDividerEnabled(boolean);
- public abstract void setGroupEnabled(int, boolean);
- public abstract void setGroupVisible(int, boolean);
- public abstract void setQwertyMode(boolean);
- public abstract int size();
-
-
- public static int CATEGORY_ALTERNATIVE;
- public static int CATEGORY_CONTAINER;
- public static int CATEGORY_MASK;
- public static int CATEGORY_SECONDARY;
- public static int CATEGORY_SHIFT;
- public static int CATEGORY_SYSTEM;
- public static int FIRST;
- public static int FLAG_ALWAYS_PERFORM_CLOSE;
- public static int FLAG_APPEND_TO_GROUP;
- public static int FLAG_PERFORM_NO_CLOSE;
- public static int NONE;
- public static int SUPPORTED_MODIFIERS_MASK;
- public static int USER_MASK;
- public static int USER_SHIFT;
-}
-
--keep class android.view.MenuInflater {
- <init>(android.content.Context);
- <init>(android.content.Context, java.lang.Object);
-
- public void inflate(int, android.view.Menu);
-
-
-}
-
--keep class android.view.MenuItem {
-
- public abstract boolean collapseActionView();
- public abstract boolean expandActionView();
- public abstract android.view.ActionProvider getActionProvider();
- public abstract android.view.View getActionView();
- public int getAlphabeticModifiers();
- public abstract char getAlphabeticShortcut();
- public java.lang.CharSequence getContentDescription();
- public abstract int getGroupId();
- public abstract android.graphics.drawable.Drawable getIcon();
- public android.content.res.ColorStateList getIconTintList();
- public android.graphics.PorterDuff$Mode getIconTintMode();
- public abstract android.content.Intent getIntent();
- public abstract int getItemId();
- public abstract android.view.ContextMenu$ContextMenuInfo getMenuInfo();
- public int getNumericModifiers();
- public abstract char getNumericShortcut();
- public abstract int getOrder();
- public abstract android.view.SubMenu getSubMenu();
- public abstract java.lang.CharSequence getTitle();
- public abstract java.lang.CharSequence getTitleCondensed();
- public java.lang.CharSequence getTooltipText();
- public abstract boolean hasSubMenu();
- public abstract boolean isActionViewExpanded();
- public abstract boolean isCheckable();
- public abstract boolean isChecked();
- public abstract boolean isEnabled();
- public abstract boolean isVisible();
- public boolean requiresActionButton();
- public boolean requiresOverflow();
- public abstract android.view.MenuItem setActionProvider(android.view.ActionProvider);
- public abstract android.view.MenuItem setActionView(android.view.View);
- public abstract android.view.MenuItem setActionView(int);
- public abstract android.view.MenuItem setAlphabeticShortcut(char);
- public android.view.MenuItem setAlphabeticShortcut(char, int);
- public abstract android.view.MenuItem setCheckable(boolean);
- public abstract android.view.MenuItem setChecked(boolean);
- public android.view.MenuItem setContentDescription(java.lang.CharSequence);
- public abstract android.view.MenuItem setEnabled(boolean);
- public abstract android.view.MenuItem setIcon(android.graphics.drawable.Drawable);
- public abstract android.view.MenuItem setIcon(int);
- public android.view.MenuItem setIconTintList(android.content.res.ColorStateList);
- public android.view.MenuItem setIconTintMode(android.graphics.PorterDuff$Mode);
- public abstract android.view.MenuItem setIntent(android.content.Intent);
- public abstract android.view.MenuItem setNumericShortcut(char);
- public android.view.MenuItem setNumericShortcut(char, int);
- public abstract android.view.MenuItem setOnActionExpandListener(android.view.MenuItem$OnActionExpandListener);
- public abstract android.view.MenuItem setOnMenuItemClickListener(android.view.MenuItem$OnMenuItemClickListener);
- public abstract android.view.MenuItem setShortcut(char, char);
- public android.view.MenuItem setShortcut(char, char, int, int);
- public abstract void setShowAsAction(int);
- public abstract android.view.MenuItem setShowAsActionFlags(int);
- public abstract android.view.MenuItem setTitle(java.lang.CharSequence);
- public abstract android.view.MenuItem setTitle(int);
- public abstract android.view.MenuItem setTitleCondensed(java.lang.CharSequence);
- public android.view.MenuItem setTooltipText(java.lang.CharSequence);
- public abstract android.view.MenuItem setVisible(boolean);
-
-
- public static int SHOW_AS_ACTION_ALWAYS;
- public static int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW;
- public static int SHOW_AS_ACTION_IF_ROOM;
- public static int SHOW_AS_ACTION_NEVER;
- public static int SHOW_AS_ACTION_WITH_TEXT;
-}
-
--keep class android.view.MenuItem$OnActionExpandListener {
-
- public abstract boolean onMenuItemActionCollapse(android.view.MenuItem);
- public abstract boolean onMenuItemActionExpand(android.view.MenuItem);
-
-
-}
-
--keep class android.view.MenuItem$OnMenuItemClickListener {
-
- public abstract boolean onMenuItemClick(android.view.MenuItem);
-
-
-}
-
--keep class android.view.MotionEvent {
-
- public static java.lang.String actionToString(int);
- public void addBatch(long, float, float, float, float, int);
- public void addBatch(long, android.view.MotionEvent$PointerCoords[], int);
- public boolean addBatch(android.view.MotionEvent);
- public static int axisFromString(java.lang.String);
- public static java.lang.String axisToString(int);
- public static java.lang.String buttonStateToString(int);
- public void cancel();
- public android.view.MotionEvent clampNoHistory(float, float, float, float);
- public android.view.MotionEvent copy();
- public android.view.InputEvent copy();
- public static android.view.MotionEvent createFromParcelBody(android.os.Parcel);
- protected void finalize();
- public int findPointerIndex(int);
- public int getAction();
- public int getActionButton();
- public int getActionIndex();
- public int getActionMasked();
- public float getAxisValue(int);
- public float getAxisValue(int, int);
- public int getButtonState();
- public int getDeviceId();
- public long getDownTime();
- public int getEdgeFlags();
- public long getEventTime();
- public long getEventTimeNano();
- public int getFlags();
- public float getHistoricalAxisValue(int, int);
- public float getHistoricalAxisValue(int, int, int);
- public long getHistoricalEventTime(int);
- public long getHistoricalEventTimeNano(int);
- public float getHistoricalOrientation(int);
- public float getHistoricalOrientation(int, int);
- public void getHistoricalPointerCoords(int, int, android.view.MotionEvent$PointerCoords);
- public float getHistoricalPressure(int);
- public float getHistoricalPressure(int, int);
- public float getHistoricalSize(int);
- public float getHistoricalSize(int, int);
- public float getHistoricalToolMajor(int);
- public float getHistoricalToolMajor(int, int);
- public float getHistoricalToolMinor(int);
- public float getHistoricalToolMinor(int, int);
- public float getHistoricalTouchMajor(int);
- public float getHistoricalTouchMajor(int, int);
- public float getHistoricalTouchMinor(int);
- public float getHistoricalTouchMinor(int, int);
- public float getHistoricalX(int);
- public float getHistoricalX(int, int);
- public float getHistoricalY(int);
- public float getHistoricalY(int, int);
- public int getHistorySize();
- public int getMetaState();
- public float getOrientation();
- public float getOrientation(int);
- public void getPointerCoords(int, android.view.MotionEvent$PointerCoords);
- public int getPointerCount();
- public int getPointerId(int);
- public int getPointerIdBits();
- public void getPointerProperties(int, android.view.MotionEvent$PointerProperties);
- public float getPressure();
- public float getPressure(int);
- public float getRawX();
- public float getRawY();
- public float getSize();
- public float getSize(int);
- public int getSource();
- public float getToolMajor();
- public float getToolMajor(int);
- public float getToolMinor();
- public float getToolMinor(int);
- public int getToolType(int);
- public float getTouchMajor();
- public float getTouchMajor(int);
- public float getTouchMinor();
- public float getTouchMinor(int);
- public float getX();
- public float getX(int);
- public float getXPrecision();
- public float getY();
- public float getY(int);
- public float getYPrecision();
- public boolean isButtonPressed(int);
- public boolean isHoverExitPending();
- public boolean isTainted();
- public boolean isTargetAccessibilityFocus();
- public boolean isTouchEvent();
- public boolean isWithinBoundsNoHistory(float, float, float, float);
- public static android.view.MotionEvent obtain(long, long, int, int, android.view.MotionEvent$PointerProperties[], android.view.MotionEvent$PointerCoords[], int, int, float, float, int, int, int, int);
- public static android.view.MotionEvent obtain(long, long, int, int, int[], android.view.MotionEvent$PointerCoords[], int, float, float, int, int, int, int);
- public static android.view.MotionEvent obtain(long, long, int, float, float, float, float, int, float, float, int, int);
- public static android.view.MotionEvent obtain(long, long, int, int, float, float, float, float, int, float, float, int, int);
- public static android.view.MotionEvent obtain(long, long, int, float, float, int);
- public static android.view.MotionEvent obtain(android.view.MotionEvent);
- public static android.view.MotionEvent obtainNoHistory(android.view.MotionEvent);
- public void offsetLocation(float, float);
- public void recycle();
- public void scale(float);
- public void setAction(int);
- public void setActionButton(int);
- public void setButtonState(int);
- public void setDownTime(long);
- public void setEdgeFlags(int);
- public void setHoverExitPending(boolean);
- public void setLocation(float, float);
- public void setSource(int);
- public void setTainted(boolean);
- public void setTargetAccessibilityFocus(boolean);
- public android.view.MotionEvent split(int);
- public java.lang.String toString();
- public static java.lang.String toolTypeToString(int);
- public void transform(android.graphics.Matrix);
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static int ACTION_BUTTON_PRESS;
- public static int ACTION_BUTTON_RELEASE;
- public static int ACTION_CANCEL;
- public static int ACTION_DOWN;
- public static int ACTION_HOVER_ENTER;
- public static int ACTION_HOVER_EXIT;
- public static int ACTION_HOVER_MOVE;
- public static int ACTION_MASK;
- public static int ACTION_MOVE;
- public static int ACTION_OUTSIDE;
- public static int ACTION_POINTER_1_DOWN;
- public static int ACTION_POINTER_1_UP;
- public static int ACTION_POINTER_2_DOWN;
- public static int ACTION_POINTER_2_UP;
- public static int ACTION_POINTER_3_DOWN;
- public static int ACTION_POINTER_3_UP;
- public static int ACTION_POINTER_DOWN;
- public static int ACTION_POINTER_ID_MASK;
- public static int ACTION_POINTER_ID_SHIFT;
- public static int ACTION_POINTER_INDEX_MASK;
- public static int ACTION_POINTER_INDEX_SHIFT;
- public static int ACTION_POINTER_UP;
- public static int ACTION_SCROLL;
- public static int ACTION_UP;
- public static int AXIS_BRAKE;
- public static int AXIS_DISTANCE;
- public static int AXIS_GAS;
- public static int AXIS_GENERIC_1;
- public static int AXIS_GENERIC_10;
- public static int AXIS_GENERIC_11;
- public static int AXIS_GENERIC_12;
- public static int AXIS_GENERIC_13;
- public static int AXIS_GENERIC_14;
- public static int AXIS_GENERIC_15;
- public static int AXIS_GENERIC_16;
- public static int AXIS_GENERIC_2;
- public static int AXIS_GENERIC_3;
- public static int AXIS_GENERIC_4;
- public static int AXIS_GENERIC_5;
- public static int AXIS_GENERIC_6;
- public static int AXIS_GENERIC_7;
- public static int AXIS_GENERIC_8;
- public static int AXIS_GENERIC_9;
- public static int AXIS_HAT_X;
- public static int AXIS_HAT_Y;
- public static int AXIS_HSCROLL;
- public static int AXIS_LTRIGGER;
- public static int AXIS_ORIENTATION;
- public static int AXIS_PRESSURE;
- public static int AXIS_RELATIVE_X;
- public static int AXIS_RELATIVE_Y;
- public static int AXIS_RTRIGGER;
- public static int AXIS_RUDDER;
- public static int AXIS_RX;
- public static int AXIS_RY;
- public static int AXIS_RZ;
- public static int AXIS_SCROLL;
- public static int AXIS_SIZE;
- public static int AXIS_THROTTLE;
- public static int AXIS_TILT;
- public static int AXIS_TOOL_MAJOR;
- public static int AXIS_TOOL_MINOR;
- public static int AXIS_TOUCH_MAJOR;
- public static int AXIS_TOUCH_MINOR;
- public static int AXIS_VSCROLL;
- public static int AXIS_WHEEL;
- public static int AXIS_X;
- public static int AXIS_Y;
- public static int AXIS_Z;
- public static int BUTTON_BACK;
- public static int BUTTON_FORWARD;
- public static int BUTTON_PRIMARY;
- public static int BUTTON_SECONDARY;
- public static int BUTTON_STYLUS_PRIMARY;
- public static int BUTTON_STYLUS_SECONDARY;
- public static int BUTTON_TERTIARY;
- public static android.os.Parcelable$Creator CREATOR;
- public static int EDGE_BOTTOM;
- public static int EDGE_LEFT;
- public static int EDGE_RIGHT;
- public static int EDGE_TOP;
- public static int FLAG_HOVER_EXIT_PENDING;
- public static int FLAG_IS_GENERATED_GESTURE;
- public static int FLAG_TAINTED;
- public static int FLAG_TARGET_ACCESSIBILITY_FOCUS;
- public static int FLAG_WINDOW_IS_OBSCURED;
- public static int FLAG_WINDOW_IS_PARTIALLY_OBSCURED;
- public static int INVALID_POINTER_ID;
- public static int TOOL_TYPE_ERASER;
- public static int TOOL_TYPE_FINGER;
- public static int TOOL_TYPE_MOUSE;
- public static int TOOL_TYPE_STYLUS;
- public static int TOOL_TYPE_UNKNOWN;
-}
-
--keep class android.view.MotionEvent$PointerCoords {
- <init>();
- <init>(android.view.MotionEvent$PointerCoords);
-
- public void clear();
- public void copyFrom(android.view.MotionEvent$PointerCoords);
- public static android.view.MotionEvent$PointerCoords[] createArray(int);
- public float getAxisValue(int);
- public void setAxisValue(int, float);
-
-
- public float orientation;
- public float pressure;
- public float size;
- public float toolMajor;
- public float toolMinor;
- public float touchMajor;
- public float touchMinor;
- public float x;
- public float y;
-}
-
--keep class android.view.MotionEvent$PointerProperties {
- <init>();
- <init>(android.view.MotionEvent$PointerProperties);
-
- public void clear();
- public void copyFrom(android.view.MotionEvent$PointerProperties);
- public static android.view.MotionEvent$PointerProperties[] createArray(int);
- public boolean equals(java.lang.Object);
- public int hashCode();
-
-
- public int id;
- public int toolType;
-}
-
--keep class android.view.PointerIcon {
-
- public static android.view.PointerIcon create(android.graphics.Bitmap, float, float);
- public int describeContents();
- public boolean equals(java.lang.Object);
- public static android.view.PointerIcon getDefaultIcon(android.content.Context);
- public static android.view.PointerIcon getNullIcon();
- public static android.view.PointerIcon getSystemIcon(android.content.Context, int);
- public int getType();
- public static android.view.PointerIcon load(android.content.res.Resources, int);
- public android.view.PointerIcon load(android.content.Context);
- public static void setUseLargeIcons(boolean);
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public static int TYPE_ALIAS;
- public static int TYPE_ALL_SCROLL;
- public static int TYPE_ARROW;
- public static int TYPE_CELL;
- public static int TYPE_CONTEXT_MENU;
- public static int TYPE_COPY;
- public static int TYPE_CROSSHAIR;
- public static int TYPE_CUSTOM;
- public static int TYPE_DEFAULT;
- public static int TYPE_GRAB;
- public static int TYPE_GRABBING;
- public static int TYPE_HAND;
- public static int TYPE_HELP;
- public static int TYPE_HORIZONTAL_DOUBLE_ARROW;
- public static int TYPE_NOT_SPECIFIED;
- public static int TYPE_NO_DROP;
- public static int TYPE_NULL;
- public static int TYPE_SPOT_ANCHOR;
- public static int TYPE_SPOT_HOVER;
- public static int TYPE_SPOT_TOUCH;
- public static int TYPE_TEXT;
- public static int TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW;
- public static int TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW;
- public static int TYPE_VERTICAL_DOUBLE_ARROW;
- public static int TYPE_VERTICAL_TEXT;
- public static int TYPE_WAIT;
- public static int TYPE_ZOOM_IN;
- public static int TYPE_ZOOM_OUT;
-}
-
--keep class android.view.RecordingCanvas {
- <init>(long);
-
- public void drawARGB(int, int, int, int);
- public void drawArc(float, float, float, float, float, float, boolean, android.graphics.Paint);
- public void drawArc(android.graphics.RectF, float, float, boolean, android.graphics.Paint);
- public void drawBitmap(android.graphics.Bitmap, float, float, android.graphics.Paint);
- public void drawBitmap(android.graphics.Bitmap, android.graphics.Matrix, android.graphics.Paint);
- public void drawBitmap(android.graphics.Bitmap, android.graphics.Rect, android.graphics.Rect, android.graphics.Paint);
- public void drawBitmap(android.graphics.Bitmap, android.graphics.Rect, android.graphics.RectF, android.graphics.Paint);
- public void drawBitmap(int[], int, int, float, float, int, int, boolean, android.graphics.Paint);
- public void drawBitmap(int[], int, int, int, int, int, int, boolean, android.graphics.Paint);
- public void drawBitmapMesh(android.graphics.Bitmap, int, int, float[], int, int[], int, android.graphics.Paint);
- public void drawCircle(float, float, float, android.graphics.Paint);
- public void drawColor(int);
- public void drawColor(int, android.graphics.PorterDuff$Mode);
- public void drawLine(float, float, float, float, android.graphics.Paint);
- public void drawLines(float[], int, int, android.graphics.Paint);
- public void drawLines(float[], android.graphics.Paint);
- public void drawOval(float, float, float, float, android.graphics.Paint);
- public void drawOval(android.graphics.RectF, android.graphics.Paint);
- public void drawPaint(android.graphics.Paint);
- public void drawPatch(android.graphics.NinePatch, android.graphics.Rect, android.graphics.Paint);
- public void drawPatch(android.graphics.NinePatch, android.graphics.RectF, android.graphics.Paint);
- public void drawPath(android.graphics.Path, android.graphics.Paint);
- public void drawPicture(android.graphics.Picture);
- public void drawPicture(android.graphics.Picture, android.graphics.Rect);
- public void drawPicture(android.graphics.Picture, android.graphics.RectF);
- public void drawPoint(float, float, android.graphics.Paint);
- public void drawPoints(float[], int, int, android.graphics.Paint);
- public void drawPoints(float[], android.graphics.Paint);
- public void drawPosText(char[], int, int, float[], android.graphics.Paint);
- public void drawPosText(java.lang.String, float[], android.graphics.Paint);
- public void drawRGB(int, int, int);
- public void drawRect(float, float, float, float, android.graphics.Paint);
- public void drawRect(android.graphics.Rect, android.graphics.Paint);
- public void drawRect(android.graphics.RectF, android.graphics.Paint);
- public void drawRoundRect(float, float, float, float, float, float, android.graphics.Paint);
- public void drawRoundRect(android.graphics.RectF, float, float, android.graphics.Paint);
- public void drawText(char[], int, int, float, float, android.graphics.Paint);
- public void drawText(java.lang.CharSequence, int, int, float, float, android.graphics.Paint);
- public void drawText(java.lang.String, float, float, android.graphics.Paint);
- public void drawText(java.lang.String, int, int, float, float, android.graphics.Paint);
- public void drawTextOnPath(char[], int, int, android.graphics.Path, float, float, android.graphics.Paint);
- public void drawTextOnPath(java.lang.String, android.graphics.Path, float, float, android.graphics.Paint);
- public void drawTextRun(char[], int, int, int, int, float, float, boolean, android.graphics.Paint);
- public void drawTextRun(java.lang.CharSequence, int, int, int, int, float, float, boolean, android.graphics.Paint);
- public void drawVertices(android.graphics.Canvas$VertexMode, int, float[], int, float[], int, int[], int, short[], int, int, android.graphics.Paint);
-
-
-}
-
--keep class android.view.RemoteAnimationAdapter {
- <init>(android.view.IRemoteAnimationRunner, long, long);
- <init>(android.os.Parcel);
-
- public int describeContents();
- public int getCallingPid();
- public long getDuration();
- public android.view.IRemoteAnimationRunner getRunner();
- public long getStatusBarTransitionDelay();
- public void setCallingPid(int);
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.view.RemoteAnimationDefinition {
- <init>();
- <init>(android.os.Parcel);
-
- public void addRemoteAnimation(int, int, android.view.RemoteAnimationAdapter);
- public void addRemoteAnimation(int, android.view.RemoteAnimationAdapter);
- public int describeContents();
- public android.view.RemoteAnimationAdapter getAdapter(int, android.util.ArraySet);
- public boolean hasTransition(int, android.util.ArraySet);
- public void setCallingPid(int);
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.view.RemoteAnimationTarget {
- <init>(int, int, android.view.SurfaceControl, boolean, android.graphics.Rect, android.graphics.Rect, int, android.graphics.Point, android.graphics.Rect, android.app.WindowConfiguration, boolean);
- <init>(android.os.Parcel);
-
- public int describeContents();
- public void dump(java.io.PrintWriter, java.lang.String);
- public void writeToParcel(android.os.Parcel, int);
- public void writeToProto(android.util.proto.ProtoOutputStream, long);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public static int MODE_CLOSING;
- public static int MODE_OPENING;
- public android.graphics.Rect clipRect;
- public android.graphics.Rect contentInsets;
- public boolean isNotInRecents;
- public boolean isTranslucent;
- public android.view.SurfaceControl leash;
- public int mode;
- public android.graphics.Point position;
- public int prefixOrderIndex;
- public android.graphics.Rect sourceContainerBounds;
- public int taskId;
- public android.app.WindowConfiguration windowConfiguration;
-}
-
--keep class android.view.RenderNode {
-
- public void addAnimator(android.view.RenderNodeAnimator);
- public static android.view.RenderNode adopt(long);
- public static android.view.RenderNode create(java.lang.String, android.view.View);
- public void destroy();
- public void discardDisplayList();
- public void end(android.view.DisplayListCanvas);
- public void endAllAnimators();
- public float getAlpha();
- public int getAmbientShadowColor();
- public float getCameraDistance();
- public boolean getClipToOutline();
- public int getDebugSize();
- public float getElevation();
- public void getInverseMatrix(android.graphics.Matrix);
- public void getMatrix(android.graphics.Matrix);
- public float getPivotX();
- public float getPivotY();
- public float getRotation();
- public float getRotationX();
- public float getRotationY();
- public float getScaleX();
- public float getScaleY();
- public int getSpotShadowColor();
- public float getTranslationX();
- public float getTranslationY();
- public float getTranslationZ();
- public boolean hasIdentityMatrix();
- public boolean hasOverlappingRendering();
- public boolean hasShadow();
- public boolean isAttached();
- public boolean isPivotExplicitlySet();
- public boolean isValid();
- public boolean offsetLeftAndRight(int);
- public boolean offsetTopAndBottom(int);
- public void output();
- public void registerVectorDrawableAnimator(android.graphics.drawable.AnimatedVectorDrawable$VectorDrawableAnimatorRT);
- public void requestPositionUpdates(android.view.SurfaceView);
- public boolean resetPivot();
- public boolean setAlpha(float);
- public boolean setAmbientShadowColor(int);
- public boolean setAnimationMatrix(android.graphics.Matrix);
- public boolean setBottom(int);
- public boolean setCameraDistance(float);
- public boolean setClipBounds(android.graphics.Rect);
- public boolean setClipToBounds(boolean);
- public boolean setClipToOutline(boolean);
- public boolean setElevation(float);
- public boolean setHasOverlappingRendering(boolean);
- public boolean setLayerPaint(android.graphics.Paint);
- public boolean setLayerType(int);
- public boolean setLeft(int);
- public boolean setLeftTopRightBottom(int, int, int, int);
- public boolean setOutline(android.graphics.Outline);
- public boolean setPivotX(float);
- public boolean setPivotY(float);
- public boolean setProjectBackwards(boolean);
- public boolean setProjectionReceiver(boolean);
- public boolean setRevealClip(boolean, float, float, float);
- public boolean setRight(int);
- public boolean setRotation(float);
- public boolean setRotationX(float);
- public boolean setRotationY(float);
- public boolean setScaleX(float);
- public boolean setScaleY(float);
- public boolean setSpotShadowColor(int);
- public boolean setStaticMatrix(android.graphics.Matrix);
- public boolean setTop(int);
- public boolean setTranslationX(float);
- public boolean setTranslationY(float);
- public boolean setTranslationZ(float);
- public android.view.DisplayListCanvas start(int, int);
-
-
-}
-
--keep class android.view.RenderNodeAnimator {
- <init>(int, float);
- <init>(android.graphics.CanvasProperty, float);
- <init>(android.graphics.CanvasProperty, int, float);
- <init>(int, int, float, float);
-
- public void cancel();
- public android.animation.Animator clone();
- public java.lang.Object clone();
- public void end();
- public long getDuration();
- public android.animation.TimeInterpolator getInterpolator();
- public long getStartDelay();
- public long getTotalDuration();
- public boolean isRunning();
- public boolean isStarted();
- public static int mapViewPropertyToRenderProperty(int);
- protected void onFinished();
- public void pause();
- public void resume();
- public void setAllowRunningAsynchronously(boolean);
- public android.view.RenderNodeAnimator setDuration(long);
- public android.animation.Animator setDuration(long);
- public void setInterpolator(android.animation.TimeInterpolator);
- public void setStartDelay(long);
- public void setStartValue(float);
- public void setTarget(android.view.View);
- public void setTarget(android.view.DisplayListCanvas);
- public void start();
-
-
- public static int ALPHA;
- public static int LAST_VALUE;
- public static int PAINT_ALPHA;
- public static int PAINT_STROKE_WIDTH;
- public static int ROTATION;
- public static int ROTATION_X;
- public static int ROTATION_Y;
- public static int SCALE_X;
- public static int SCALE_Y;
- public static int TRANSLATION_X;
- public static int TRANSLATION_Y;
- public static int TRANSLATION_Z;
- public static int X;
- public static int Y;
- public static int Z;
-}
-
--keep class android.view.SearchEvent {
- <init>(android.view.InputDevice);
-
- public android.view.InputDevice getInputDevice();
-
-
-}
-
--keep class android.view.SubMenu {
-
- public abstract void clearHeader();
- public abstract android.view.MenuItem getItem();
- public abstract android.view.SubMenu setHeaderIcon(int);
- public abstract android.view.SubMenu setHeaderIcon(android.graphics.drawable.Drawable);
- public abstract android.view.SubMenu setHeaderTitle(int);
- public abstract android.view.SubMenu setHeaderTitle(java.lang.CharSequence);
- public abstract android.view.SubMenu setHeaderView(android.view.View);
- public abstract android.view.SubMenu setIcon(int);
- public abstract android.view.SubMenu setIcon(android.graphics.drawable.Drawable);
-
-
-}
-
--keep class android.view.Surface {
- <init>();
- <init>(android.graphics.SurfaceTexture);
-
- public void allocateBuffers();
- public void attachAndQueueBuffer(android.graphics.GraphicBuffer);
- public void copyFrom(android.view.SurfaceControl);
- public void createFrom(android.view.SurfaceControl);
- public int describeContents();
- public void destroy();
- protected void finalize();
- public int getGenerationId();
- public long getNextFrameNumber();
- public void hwuiDestroy();
- public boolean isAutoRefreshEnabled();
- public boolean isConsumerRunningBehind();
- public boolean isSharedBufferModeEnabled();
- public boolean isSingleBuffered();
- public boolean isValid();
- public android.graphics.Canvas lockCanvas(android.graphics.Rect);
- public android.graphics.Canvas lockHardwareCanvas();
- public android.graphics.Canvas lockHardwareWideColorGamutCanvas();
- public void readFromParcel(android.os.Parcel);
- public void release();
- public static java.lang.String rotationToString(int);
- public void setAutoRefreshEnabled(boolean);
- public void setSharedBufferModeEnabled(boolean);
- public java.lang.String toString();
- public void transferFrom(android.view.Surface);
- public void unlockCanvas(android.graphics.Canvas);
- public void unlockCanvasAndPost(android.graphics.Canvas);
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public static int ROTATION_0;
- public static int ROTATION_180;
- public static int ROTATION_270;
- public static int ROTATION_90;
- public static int SCALING_MODE_FREEZE;
- public static int SCALING_MODE_NO_SCALE_CROP;
- public static int SCALING_MODE_SCALE_CROP;
- public static int SCALING_MODE_SCALE_TO_WINDOW;
-}
-
--keep class android.view.Surface$OutOfResourcesException {
- <init>();
- <init>(java.lang.String);
-
-
-
-}
-
--keep class android.view.SurfaceControl {
- <init>(android.view.SurfaceControl);
-
- public static android.graphics.GraphicBuffer captureLayers(android.os.IBinder, android.graphics.Rect, float);
- public static boolean clearAnimationFrameStats();
- public boolean clearContentFrameStats();
- public static void closeTransaction();
- public static void closeTransactionSync();
- public static android.os.IBinder createDisplay(java.lang.String, boolean);
- public void deferTransactionUntil(android.os.IBinder, long);
- public void deferTransactionUntil(android.view.Surface, long);
- public int describeContents();
- public void destroy();
- public static void destroyDisplay(android.os.IBinder);
- public void detachChildren();
- public void disconnect();
- protected void finalize();
- public static int getActiveColorMode(android.os.IBinder);
- public static int getActiveConfig(android.os.IBinder);
- public static boolean getAnimationFrameStats(android.view.WindowAnimationFrameStats);
- public static android.os.IBinder getBuiltInDisplay(int);
- public boolean getContentFrameStats(android.view.WindowContentFrameStats);
- public static int[] getDisplayColorModes(android.os.IBinder);
- public static android.view.SurfaceControl$PhysicalDisplayInfo[] getDisplayConfigs(android.os.IBinder);
- public android.os.IBinder getHandle();
- public static android.view.Display$HdrCapabilities getHdrCapabilities(android.os.IBinder);
- public int getHeight();
- public int getWidth();
- public void hide();
- public static void mergeToGlobalTransaction(android.view.SurfaceControl$Transaction);
- public static void openTransaction();
- public void release();
- public void reparent(android.os.IBinder);
- public void reparentChildren(android.os.IBinder);
- public static void screenshot(android.os.IBinder, android.view.Surface, int, int, int, int, boolean);
- public static void screenshot(android.os.IBinder, android.view.Surface, int, int);
- public static void screenshot(android.os.IBinder, android.view.Surface);
- public static android.graphics.Bitmap screenshot(android.graphics.Rect, int, int, int, int, boolean, int);
- public static android.graphics.Bitmap screenshot(android.graphics.Rect, int, int, int);
- public static android.graphics.GraphicBuffer screenshotToBuffer(android.graphics.Rect, int, int, int, int, boolean, int);
- public static boolean setActiveColorMode(android.os.IBinder, int);
- public static boolean setActiveConfig(android.os.IBinder, int);
- public void setAlpha(float);
- public static void setAnimationTransaction();
- public void setColor(float[]);
- public static void setDisplayLayerStack(android.os.IBinder, int);
- public static void setDisplayPowerMode(android.os.IBinder, int);
- public static void setDisplayProjection(android.os.IBinder, int, android.graphics.Rect, android.graphics.Rect);
- public static void setDisplaySize(android.os.IBinder, int, int);
- public static void setDisplaySurface(android.os.IBinder, android.view.Surface);
- public void setFinalCrop(android.graphics.Rect);
- public void setGeometryAppliesWithResize();
- public void setLayer(int);
- public void setLayerStack(int);
- public void setMatrix(float, float, float, float);
- public void setMatrix(android.graphics.Matrix, float[]);
- public void setOpaque(boolean);
- public void setOverrideScalingMode(int);
- public void setPosition(float, float);
- public void setRelativeLayer(android.view.SurfaceControl, int);
- public void setSecure(boolean);
- public void setSize(int, int);
- public void setTransparentRegionHint(android.graphics.Region);
- public void setWindowCrop(android.graphics.Rect);
- public void show();
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
- public void writeToProto(android.util.proto.ProtoOutputStream, long);
-
-
- public static int BUILT_IN_DISPLAY_ID_HDMI;
- public static int BUILT_IN_DISPLAY_ID_MAIN;
- public static android.os.Parcelable$Creator CREATOR;
- public static int CURSOR_WINDOW;
- public static int FX_SURFACE_DIM;
- public static int FX_SURFACE_MASK;
- public static int FX_SURFACE_NORMAL;
- public static int HIDDEN;
- public static int NON_PREMULTIPLIED;
- public static int OPAQUE;
- public static int POWER_MODE_DOZE;
- public static int POWER_MODE_DOZE_SUSPEND;
- public static int POWER_MODE_NORMAL;
- public static int POWER_MODE_OFF;
- public static int POWER_MODE_ON_SUSPEND;
- public static int PROTECTED_APP;
- public static int SECURE;
- public static int WINDOW_TYPE_DONT_SCREENSHOT;
-}
-
--keep class android.view.SurfaceControl$PhysicalDisplayInfo {
- <init>();
- <init>(android.view.SurfaceControl$PhysicalDisplayInfo);
-
- public void copyFrom(android.view.SurfaceControl$PhysicalDisplayInfo);
- public boolean equals(java.lang.Object);
- public boolean equals(android.view.SurfaceControl$PhysicalDisplayInfo);
- public int hashCode();
- public java.lang.String toString();
-
-
- public long appVsyncOffsetNanos;
- public float density;
- public int height;
- public long presentationDeadlineNanos;
- public float refreshRate;
- public boolean secure;
- public int width;
- public float xDpi;
- public float yDpi;
-}
-
--keep class android.view.SurfaceControl$Transaction {
- <init>();
-
- public void apply();
- public void apply(boolean);
- public void close();
- public android.view.SurfaceControl$Transaction deferTransactionUntil(android.view.SurfaceControl, android.os.IBinder, long);
- public android.view.SurfaceControl$Transaction deferTransactionUntilSurface(android.view.SurfaceControl, android.view.Surface, long);
- public android.view.SurfaceControl$Transaction destroy(android.view.SurfaceControl);
- public android.view.SurfaceControl$Transaction detachChildren(android.view.SurfaceControl);
- public android.view.SurfaceControl$Transaction hide(android.view.SurfaceControl);
- public android.view.SurfaceControl$Transaction merge(android.view.SurfaceControl$Transaction);
- public android.view.SurfaceControl$Transaction reparent(android.view.SurfaceControl, android.os.IBinder);
- public android.view.SurfaceControl$Transaction reparentChildren(android.view.SurfaceControl, android.os.IBinder);
- public android.view.SurfaceControl$Transaction setAlpha(android.view.SurfaceControl, float);
- public android.view.SurfaceControl$Transaction setAnimationTransaction();
- public android.view.SurfaceControl$Transaction setColor(android.view.SurfaceControl, float[]);
- public android.view.SurfaceControl$Transaction setDisplayLayerStack(android.os.IBinder, int);
- public android.view.SurfaceControl$Transaction setDisplayProjection(android.os.IBinder, int, android.graphics.Rect, android.graphics.Rect);
- public android.view.SurfaceControl$Transaction setDisplaySize(android.os.IBinder, int, int);
- public android.view.SurfaceControl$Transaction setDisplaySurface(android.os.IBinder, android.view.Surface);
- public android.view.SurfaceControl$Transaction setEarlyWakeup();
- public android.view.SurfaceControl$Transaction setFinalCrop(android.view.SurfaceControl, android.graphics.Rect);
- public android.view.SurfaceControl$Transaction setGeometryAppliesWithResize(android.view.SurfaceControl);
- public android.view.SurfaceControl$Transaction setLayer(android.view.SurfaceControl, int);
- public android.view.SurfaceControl$Transaction setLayerStack(android.view.SurfaceControl, int);
- public android.view.SurfaceControl$Transaction setMatrix(android.view.SurfaceControl, float, float, float, float);
- public android.view.SurfaceControl$Transaction setMatrix(android.view.SurfaceControl, android.graphics.Matrix, float[]);
- public android.view.SurfaceControl$Transaction setOpaque(android.view.SurfaceControl, boolean);
- public android.view.SurfaceControl$Transaction setOverrideScalingMode(android.view.SurfaceControl, int);
- public android.view.SurfaceControl$Transaction setPosition(android.view.SurfaceControl, float, float);
- public android.view.SurfaceControl$Transaction setRelativeLayer(android.view.SurfaceControl, android.view.SurfaceControl, int);
- public android.view.SurfaceControl$Transaction setSecure(android.view.SurfaceControl, boolean);
- public android.view.SurfaceControl$Transaction setSize(android.view.SurfaceControl, int, int);
- public android.view.SurfaceControl$Transaction setTransparentRegionHint(android.view.SurfaceControl, android.graphics.Region);
- public android.view.SurfaceControl$Transaction setWindowCrop(android.view.SurfaceControl, android.graphics.Rect);
- public android.view.SurfaceControl$Transaction show(android.view.SurfaceControl);
-
-
- public static libcore.util.NativeAllocationRegistry sRegistry;
-}
-
--keep class android.view.SurfaceHolder {
-
- public abstract void addCallback(android.view.SurfaceHolder$Callback);
- public abstract android.view.Surface getSurface();
- public abstract android.graphics.Rect getSurfaceFrame();
- public abstract boolean isCreating();
- public abstract android.graphics.Canvas lockCanvas();
- public abstract android.graphics.Canvas lockCanvas(android.graphics.Rect);
- public android.graphics.Canvas lockHardwareCanvas();
- public abstract void removeCallback(android.view.SurfaceHolder$Callback);
- public abstract void setFixedSize(int, int);
- public abstract void setFormat(int);
- public abstract void setKeepScreenOn(boolean);
- public abstract void setSizeFromLayout();
- public abstract void setType(int);
- public abstract void unlockCanvasAndPost(android.graphics.Canvas);
-
-
- public static int SURFACE_TYPE_GPU;
- public static int SURFACE_TYPE_HARDWARE;
- public static int SURFACE_TYPE_NORMAL;
- public static int SURFACE_TYPE_PUSH_BUFFERS;
-}
-
--keep class android.view.SurfaceHolder$Callback {
-
- public abstract void surfaceChanged(android.view.SurfaceHolder, int, int, int);
- public abstract void surfaceCreated(android.view.SurfaceHolder);
- public abstract void surfaceDestroyed(android.view.SurfaceHolder);
-
-
-}
-
--keep class android.view.SurfaceHolder$Callback2 {
-
- public abstract void surfaceRedrawNeeded(android.view.SurfaceHolder);
- public void surfaceRedrawNeededAsync(android.view.SurfaceHolder, java.lang.Runnable);
-
-
-}
-
--keep class android.view.SurfaceView {
- <init>(android.content.Context);
- <init>(android.content.Context, android.util.AttributeSet);
- <init>(android.content.Context, android.util.AttributeSet, int);
- <init>(android.content.Context, android.util.AttributeSet, int, int);
-
- protected void applyChildSurfaceTransaction_renderWorker(android.view.SurfaceControl$Transaction, android.view.Surface, long);
- protected void dispatchDraw(android.graphics.Canvas);
- public void draw(android.graphics.Canvas);
- public boolean gatherTransparentRegion(android.graphics.Region);
- public android.view.SurfaceHolder getHolder();
- public boolean isFixedSize();
- protected void onAttachedToWindow();
- protected void onDetachedFromWindow();
- protected void onMeasure(int, int);
- protected void onWindowVisibilityChanged(int);
- protected boolean setFrame(int, int, int, int);
- public void setResizeBackgroundColor(int);
- public void setSecure(boolean);
- public void setVisibility(int);
- public void setZOrderMediaOverlay(boolean);
- public void setZOrderOnTop(boolean);
- public void surfacePositionLost_uiRtSync(long);
- protected void updateSurface();
- public void updateSurfacePosition_renderWorker(long, int, int, int, int);
- public void windowStopped(boolean);
-
-
-}
-
--keep class android.view.ThreadedRenderer {
-
- public void addRenderNode(android.view.RenderNode, boolean);
- public static int copySurfaceInto(android.view.Surface, android.graphics.Rect, android.graphics.Bitmap);
- public static android.view.ThreadedRenderer create(android.content.Context, boolean, java.lang.String);
- public static android.graphics.Bitmap createHardwareBitmap(android.view.RenderNode, int, int);
- public static void disable(boolean);
- public static void disableVsync();
- public void drawRenderNode(android.view.RenderNode);
- public static void enableForegroundTrimming();
- protected void finalize();
- public static boolean isAvailable();
- public void notifyFramePending();
- public static void overrideProperty(java.lang.String, java.lang.String);
- public void removeRenderNode(android.view.RenderNode);
- public void serializeDisplayListTree();
- public void setContentDrawBounds(int, int, int, int);
- public static void setContextPriority(int);
- public static void setDebuggingEnabled(boolean);
- public static void setFPSDivisor(int);
- public static void setHighContrastText(boolean);
- public static void setIsolatedProcess(boolean);
- public static void setupDiskCache(java.io.File);
- public static void trimMemory(int);
-
-
- public static java.lang.String DEBUG_DIRTY_REGIONS_PROPERTY;
- public static java.lang.String DEBUG_FPS_DIVISOR;
- public static java.lang.String DEBUG_OVERDRAW_PROPERTY;
- public static java.lang.String DEBUG_SHOW_LAYERS_UPDATES_PROPERTY;
- public static java.lang.String DEBUG_SHOW_NON_RECTANGULAR_CLIP_PROPERTY;
- public static int EGL_CONTEXT_PRIORITY_HIGH_IMG;
- public static int EGL_CONTEXT_PRIORITY_LOW_IMG;
- public static int EGL_CONTEXT_PRIORITY_MEDIUM_IMG;
- public static java.lang.String OVERDRAW_PROPERTY_SHOW;
- public static java.lang.String PROFILE_PROPERTY;
- public static java.lang.String PROFILE_PROPERTY_VISUALIZE_BARS;
- public static boolean sRendererDisabled;
- public static boolean sSystemRendererDisabled;
- public static boolean sTrimForeground;
-}
-
--keep class android.view.ThreadedRenderer$FrameDrawingCallback {
-
- public abstract void onFrameDraw(long);
-
-
-}
-
--keep class android.view.TouchDelegate {
- <init>(android.graphics.Rect, android.view.View);
-
- public boolean onTouchEvent(android.view.MotionEvent);
-
-
- public static int ABOVE;
- public static int BELOW;
- public static int TO_LEFT;
- public static int TO_RIGHT;
-}
-
--keep class android.view.View {
- <init>(android.content.Context);
- <init>(android.content.Context, android.util.AttributeSet);
- <init>(android.content.Context, android.util.AttributeSet, int);
- <init>(android.content.Context, android.util.AttributeSet, int, int);
-
- public void addChildrenForAccessibility(java.util.ArrayList);
- public void addExtraDataToAccessibilityNodeInfo(android.view.accessibility.AccessibilityNodeInfo, java.lang.String, android.os.Bundle);
- public void addFocusables(java.util.ArrayList, int);
- public void addFocusables(java.util.ArrayList, int, int);
- public void addFrameMetricsListener(android.view.Window, android.view.Window$OnFrameMetricsAvailableListener, android.os.Handler);
- public void addKeyboardNavigationClusters(java.util.Collection, int);
- public void addOnAttachStateChangeListener(android.view.View$OnAttachStateChangeListener);
- public void addOnLayoutChangeListener(android.view.View$OnLayoutChangeListener);
- public void addOnUnhandledKeyEventListener(android.view.View$OnUnhandledKeyEventListener);
- public void addTouchables(java.util.ArrayList);
- public android.view.ViewPropertyAnimator animate();
- public void announceForAccessibility(java.lang.CharSequence);
- public void applyDrawableToTransparentRegion(android.graphics.drawable.Drawable, android.graphics.Region);
- public void autofill(android.view.autofill.AutofillValue);
- public void autofill(android.util.SparseArray);
- protected boolean awakenScrollBars();
- protected boolean awakenScrollBars(int);
- protected boolean awakenScrollBars(int, boolean);
- public void bringToFront();
- public void buildDrawingCache();
- public void buildDrawingCache(boolean);
- public void buildLayer();
- public boolean callOnClick();
- public boolean canHaveDisplayList();
- public boolean canNotifyAutofillEnterExitEvent();
- public boolean canResolveLayoutDirection();
- public boolean canResolveTextAlignment();
- public boolean canResolveTextDirection();
- public boolean canScrollHorizontally(int);
- public boolean canScrollVertically(int);
- public void cancelDragAndDrop();
- public void cancelLongPress();
- public void cancelPendingInputEvents();
- public void captureTransitioningViews(java.util.List);
- public boolean checkInputConnectionProxy(android.view.View);
- public void clearAccessibilityFocus();
- public void clearAnimation();
- public void clearFocus();
- public static int combineMeasuredStates(int, int);
- protected boolean computeFitSystemWindows(android.graphics.Rect, android.graphics.Rect);
- protected int computeHorizontalScrollExtent();
- protected int computeHorizontalScrollOffset();
- protected int computeHorizontalScrollRange();
- protected void computeOpaqueFlags();
- public void computeScroll();
- public android.view.WindowInsets computeSystemWindowInsets(android.view.WindowInsets, android.graphics.Rect);
- protected int computeVerticalScrollExtent();
- protected int computeVerticalScrollOffset();
- protected int computeVerticalScrollRange();
- public android.view.accessibility.AccessibilityNodeInfo createAccessibilityNodeInfo();
- public android.view.accessibility.AccessibilityNodeInfo createAccessibilityNodeInfoInternal();
- public void createContextMenu(android.view.ContextMenu);
- public android.graphics.Bitmap createSnapshot(android.view.ViewDebug$CanvasProvider, boolean);
- protected void damageInParent();
- public void debug();
- protected void debug(int);
- protected static java.lang.String debugIndent(int);
- public void destroyDrawingCache();
- protected void destroyHardwareResources();
- public boolean dispatchActivityResult(java.lang.String, int, int, android.content.Intent);
- public android.view.WindowInsets dispatchApplyWindowInsets(android.view.WindowInsets);
- public boolean dispatchCapturedPointerEvent(android.view.MotionEvent);
- public void dispatchConfigurationChanged(android.content.res.Configuration);
- public void dispatchDisplayHint(int);
- public boolean dispatchDragEvent(android.view.DragEvent);
- protected void dispatchDraw(android.graphics.Canvas);
- public void dispatchDrawableHotspotChanged(float, float);
- public void dispatchFinishTemporaryDetach();
- protected boolean dispatchGenericFocusedEvent(android.view.MotionEvent);
- public boolean dispatchGenericMotionEvent(android.view.MotionEvent);
- protected boolean dispatchGenericPointerEvent(android.view.MotionEvent);
- protected void dispatchGetDisplayList();
- protected boolean dispatchHoverEvent(android.view.MotionEvent);
- public boolean dispatchKeyEvent(android.view.KeyEvent);
- public boolean dispatchKeyEventPreIme(android.view.KeyEvent);
- public boolean dispatchKeyShortcutEvent(android.view.KeyEvent);
- public boolean dispatchNestedFling(float, float, boolean);
- public boolean dispatchNestedPreFling(float, float);
- public boolean dispatchNestedPrePerformAccessibilityAction(int, android.os.Bundle);
- public boolean dispatchNestedPreScroll(int, int, int[], int[]);
- public boolean dispatchNestedScroll(int, int, int, int, int[]);
- public void dispatchPointerCaptureChanged(boolean);
- public boolean dispatchPointerEvent(android.view.MotionEvent);
- public boolean dispatchPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
- public boolean dispatchPopulateAccessibilityEventInternal(android.view.accessibility.AccessibilityEvent);
- public void dispatchProvideAutofillStructure(android.view.ViewStructure, int);
- public void dispatchProvideStructure(android.view.ViewStructure);
- protected void dispatchRestoreInstanceState(android.util.SparseArray);
- protected void dispatchSaveInstanceState(android.util.SparseArray);
- protected void dispatchSetActivated(boolean);
- protected void dispatchSetPressed(boolean);
- protected void dispatchSetSelected(boolean);
- public void dispatchStartTemporaryDetach();
- public void dispatchSystemUiVisibilityChanged(int);
- public boolean dispatchTouchEvent(android.view.MotionEvent);
- public boolean dispatchTrackballEvent(android.view.MotionEvent);
- public boolean dispatchUnhandledMove(android.view.View, int);
- protected void dispatchVisibilityChanged(android.view.View, int);
- public void dispatchWindowFocusChanged(boolean);
- public void dispatchWindowSystemUiVisiblityChanged(int);
- public void dispatchWindowVisibilityChanged(int);
- public void draw(android.graphics.Canvas);
- public void drawableHotspotChanged(float, float);
- protected void drawableStateChanged();
- public void encode(android.view.ViewHierarchyEncoder);
- protected void encodeProperties(android.view.ViewHierarchyEncoder);
- public android.view.View findFocus();
- public void findNamedViews(java.util.Map);
- public android.view.View findViewByAccessibilityIdTraversal(int);
- public android.view.View findViewByAutofillIdTraversal(int);
- public android.view.View findViewById(int);
- public android.view.View findViewByPredicate(java.util.function.Predicate);
- public android.view.View findViewByPredicateInsideOut(android.view.View, java.util.function.Predicate);
- protected android.view.View findViewByPredicateTraversal(java.util.function.Predicate, android.view.View);
- protected android.view.View findViewTraversal(int);
- public android.view.View findViewWithTag(java.lang.Object);
- protected android.view.View findViewWithTagTraversal(java.lang.Object);
- public void findViewsWithText(java.util.ArrayList, java.lang.CharSequence, int);
- protected boolean fitSystemWindows(android.graphics.Rect);
- public boolean fitsSystemWindows();
- public android.view.View focusSearch(int);
- public void forceHasOverlappingRendering(boolean);
- public void forceLayout();
- public boolean gatherTransparentRegion(android.graphics.Region);
- public static int generateViewId();
- public java.lang.CharSequence getAccessibilityClassName();
- public android.view.View$AccessibilityDelegate getAccessibilityDelegate();
- public int getAccessibilityLiveRegion();
- public android.view.accessibility.AccessibilityNodeProvider getAccessibilityNodeProvider();
- public java.lang.CharSequence getAccessibilityPaneTitle();
- public int getAccessibilitySelectionEnd();
- public int getAccessibilitySelectionStart();
- public int getAccessibilityTraversalAfter();
- public int getAccessibilityTraversalBefore();
- public int getAccessibilityViewId();
- public int getAccessibilityWindowId();
- public float getAlpha();
- public android.view.animation.Animation getAnimation();
- public android.os.IBinder getApplicationWindowToken();
- public java.lang.String[] getAutofillHints();
- public android.view.autofill.AutofillId getAutofillId();
- public int getAutofillType();
- public android.view.autofill.AutofillValue getAutofillValue();
- public int getAutofillViewId();
- public android.graphics.drawable.Drawable getBackground();
- public android.content.res.ColorStateList getBackgroundTintList();
- public android.graphics.PorterDuff$Mode getBackgroundTintMode();
- public int getBaseline();
- public int getBottom();
- protected float getBottomFadingEdgeStrength();
- protected int getBottomPaddingOffset();
- public void getBoundsOnScreen(android.graphics.Rect);
- public void getBoundsOnScreen(android.graphics.Rect, boolean);
- public float getCameraDistance();
- public android.graphics.Rect getClipBounds();
- public boolean getClipBounds(android.graphics.Rect);
- public boolean getClipToOutline();
- public java.lang.CharSequence getContentDescription();
- public android.content.Context getContext();
- protected android.view.ContextMenu$ContextMenuInfo getContextMenuInfo();
- public boolean getDefaultFocusHighlightEnabled();
- public static int getDefaultSize(int, int);
- public android.view.Display getDisplay();
- public int[] getDrawableState();
- public android.graphics.Bitmap getDrawingCache();
- public android.graphics.Bitmap getDrawingCache(boolean);
- public int getDrawingCacheBackgroundColor();
- public int getDrawingCacheQuality();
- public void getDrawingRect(android.graphics.Rect);
- public long getDrawingTime();
- public float getElevation();
- protected int getFadeHeight(boolean);
- protected int getFadeTop(boolean);
- public boolean getFilterTouchesWhenObscured();
- public boolean getFitsSystemWindows();
- public int getFocusable();
- public java.util.ArrayList getFocusables(int);
- public void getFocusedRect(android.graphics.Rect);
- public android.graphics.drawable.Drawable getForeground();
- public int getForegroundGravity();
- public android.content.res.ColorStateList getForegroundTintList();
- public android.graphics.PorterDuff$Mode getForegroundTintMode();
- public boolean getGlobalVisibleRect(android.graphics.Rect, android.graphics.Point);
- public boolean getGlobalVisibleRect(android.graphics.Rect);
- public android.os.Handler getHandler();
- public boolean getHasOverlappingRendering();
- public int getHeight();
- public void getHitRect(android.graphics.Rect);
- public int getHorizontalFadingEdgeLength();
- protected float getHorizontalScrollFactor();
- protected int getHorizontalScrollbarHeight();
- public void getHotspotBounds(android.graphics.Rect);
- public int getId();
- public int getImportantForAccessibility();
- public int getImportantForAutofill();
- public android.graphics.Matrix getInverseMatrix();
- public java.lang.CharSequence getIterableTextForAccessibility();
- public android.view.AccessibilityIterators$TextSegmentIterator getIteratorForGranularity(int);
- public boolean getKeepScreenOn();
- public android.view.KeyEvent$DispatcherState getKeyDispatcherState();
- public int getLabelFor();
- public int getLayerType();
- public int getLayoutDirection();
- public android.view.ViewGroup$LayoutParams getLayoutParams();
- public int getLeft();
- protected float getLeftFadingEdgeStrength();
- protected int getLeftPaddingOffset();
- public boolean getLocalVisibleRect(android.graphics.Rect);
- public void getLocationInSurface(int[]);
- public void getLocationInWindow(int[]);
- public int[] getLocationOnScreen();
- public void getLocationOnScreen(int[]);
- public android.graphics.Matrix getMatrix();
- public int getMeasuredHeight();
- public int getMeasuredHeightAndState();
- public int getMeasuredState();
- public int getMeasuredWidth();
- public int getMeasuredWidthAndState();
- public int getMinimumHeight();
- public int getMinimumWidth();
- public int getNextClusterForwardId();
- public int getNextFocusDownId();
- public int getNextFocusForwardId();
- public int getNextFocusLeftId();
- public int getNextFocusRightId();
- public int getNextFocusUpId();
- public android.view.View$OnFocusChangeListener getOnFocusChangeListener();
- public android.graphics.Insets getOpticalInsets();
- public int getOutlineAmbientShadowColor();
- public android.view.ViewOutlineProvider getOutlineProvider();
- public int getOutlineSpotShadowColor();
- public void getOutsets(android.graphics.Rect);
- public int getOverScrollMode();
- public android.view.ViewOverlay getOverlay();
- public int getPaddingBottom();
- public int getPaddingEnd();
- public int getPaddingLeft();
- public int getPaddingRight();
- public int getPaddingStart();
- public int getPaddingTop();
- public android.view.ViewParent getParent();
- public android.view.ViewParent getParentForAccessibility();
- public float getPivotX();
- public float getPivotY();
- public android.view.PointerIcon getPointerIcon();
- public int getRawLayoutDirection();
- public int getRawTextAlignment();
- public int getRawTextDirection();
- public android.content.res.Resources getResources();
- public boolean getRevealOnFocusHint();
- public int getRight();
- protected float getRightFadingEdgeStrength();
- protected int getRightPaddingOffset();
- public android.view.View getRootView();
- public android.view.WindowInsets getRootWindowInsets();
- public float getRotation();
- public float getRotationX();
- public float getRotationY();
- public float getScaleX();
- public float getScaleY();
- public int getScrollBarDefaultDelayBeforeFade();
- public int getScrollBarFadeDuration();
- public int getScrollBarSize();
- public int getScrollBarStyle();
- public int getScrollIndicators();
- public int getScrollX();
- public int getScrollY();
- public int getSolidColor();
- public android.animation.StateListAnimator getStateListAnimator();
- protected int getSuggestedMinimumHeight();
- protected int getSuggestedMinimumWidth();
- public int getSystemUiVisibility();
- public java.lang.Object getTag();
- public java.lang.Object getTag(int);
- public int getTextAlignment();
- public int getTextDirection();
- public android.view.ThreadedRenderer getThreadedRenderer();
- public java.lang.CharSequence getTooltip();
- public java.lang.CharSequence getTooltipText();
- public android.view.View getTooltipView();
- public int getTop();
- protected float getTopFadingEdgeStrength();
- protected int getTopPaddingOffset();
- public android.view.TouchDelegate getTouchDelegate();
- public java.util.ArrayList getTouchables();
- public float getTransitionAlpha();
- public java.lang.String getTransitionName();
- public float getTranslationX();
- public float getTranslationY();
- public float getTranslationZ();
- public int getVerticalFadingEdgeLength();
- protected float getVerticalScrollFactor();
- public int getVerticalScrollbarPosition();
- public int getVerticalScrollbarWidth();
- public android.view.ViewRootImpl getViewRootImpl();
- public android.view.ViewTreeObserver getViewTreeObserver();
- public int getVisibility();
- public int getWidth();
- protected android.view.IWindow getWindow();
- protected int getWindowAttachCount();
- public void getWindowDisplayFrame(android.graphics.Rect);
- public android.view.WindowId getWindowId();
- public int getWindowSystemUiVisibility();
- public android.os.IBinder getWindowToken();
- public int getWindowVisibility();
- public void getWindowVisibleDisplayFrame(android.graphics.Rect);
- public float getX();
- public float getY();
- public float getZ();
- protected boolean handleScrollBarDragging(android.view.MotionEvent);
- public boolean hasExplicitFocusable();
- public boolean hasFocus();
- public boolean hasFocusable();
- protected boolean hasHoveredChild();
- public boolean hasNestedScrollingParent();
- public boolean hasOnClickListeners();
- protected boolean hasOpaqueScrollbars();
- public boolean hasOverlappingRendering();
- public boolean hasPointerCapture();
- public boolean hasShadow();
- public boolean hasTransientState();
- public boolean hasWindowFocus();
- public boolean includeForAccessibility();
- public static android.view.View inflate(android.content.Context, int, android.view.ViewGroup);
- protected void initializeFadingEdge(android.content.res.TypedArray);
- protected void initializeFadingEdgeInternal(android.content.res.TypedArray);
- protected void initializeScrollbars(android.content.res.TypedArray);
- protected void initializeScrollbarsInternal(android.content.res.TypedArray);
- protected void internalSetPadding(int, int, int, int);
- public void invalidate(android.graphics.Rect);
- public void invalidate(int, int, int, int);
- public void invalidate();
- public void invalidate(boolean);
- public void invalidateDrawable(android.graphics.drawable.Drawable);
- public void invalidateOutline();
- protected void invalidateParentCaches();
- protected void invalidateParentIfNeeded();
- protected void invalidateParentIfNeededAndWasQuickRejected();
- public boolean isAccessibilityFocused();
- public boolean isAccessibilityHeading();
- public boolean isAccessibilitySelectionExtendable();
- public boolean isActionableForAccessibility();
- public boolean isActivated();
- public boolean isAssistBlocked();
- public boolean isAttachedToWindow();
- public boolean isAutofilled();
- public boolean isClickable();
- public boolean isContextClickable();
- public static boolean isDefaultFocusHighlightEnabled();
- public boolean isDefaultFocusHighlightNeeded(android.graphics.drawable.Drawable, android.graphics.drawable.Drawable);
- public boolean isDirty();
- public boolean isDrawingCacheEnabled();
- public boolean isDuplicateParentStateEnabled();
- public boolean isEnabled();
- public boolean isFocusable();
- public boolean isFocusableInTouchMode();
- public boolean isFocused();
- public boolean isFocusedByDefault();
- public boolean isForegroundInsidePadding();
- public boolean isHapticFeedbackEnabled();
- public boolean isHardwareAccelerated();
- public boolean isHorizontalFadingEdgeEnabled();
- public boolean isHorizontalScrollBarEnabled();
- public boolean isHovered();
- public boolean isImportantForAccessibility();
- public boolean isImportantForAutofill();
- public boolean isInEditMode();
- public boolean isInLayout();
- public boolean isInScrollingContainer();
- public boolean isInTouchMode();
- public boolean isKeyboardNavigationCluster();
- public boolean isLaidOut();
- public boolean isLayoutDirectionInherited();
- public boolean isLayoutDirectionResolved();
- public static boolean isLayoutModeOptical(java.lang.Object);
- public boolean isLayoutRequested();
- public boolean isLayoutRtl();
- public boolean isLongClickable();
- public boolean isNestedScrollingEnabled();
- public boolean isOpaque();
- protected boolean isPaddingOffsetRequired();
- public boolean isPaddingRelative();
- public boolean isPivotSet();
- public boolean isPressed();
- public boolean isRootNamespace();
- public boolean isSaveEnabled();
- public boolean isSaveFromParentEnabled();
- public boolean isScreenReaderFocusable();
- public boolean isScrollContainer();
- public boolean isScrollbarFadingEnabled();
- public boolean isSelected();
- public boolean isShown();
- public boolean isSoundEffectsEnabled();
- public boolean isTemporarilyDetached();
- public boolean isTextAlignmentInherited();
- public boolean isTextAlignmentResolved();
- public boolean isTextDirectionInherited();
- public boolean isTextDirectionResolved();
- public boolean isVerticalFadingEdgeEnabled();
- public boolean isVerticalScrollBarEnabled();
- protected boolean isVerticalScrollBarHidden();
- public boolean isVisibleToUser();
- protected boolean isVisibleToUser(android.graphics.Rect);
- public boolean isVisibleToUserForAutofill(int);
- public void jumpDrawablesToCurrentState();
- public android.view.View keyboardNavigationClusterSearch(android.view.View, int);
- public void layout(int, int, int, int);
- public void makeOptionalFitsSystemWindows();
- public void mapRectFromViewToScreenCoords(android.graphics.RectF, boolean);
- public void measure(int, int);
- protected static int[] mergeDrawableStates(int[], int[]);
- public void notifyEnterOrExitForAutoFillIfNeeded(boolean);
- public void notifySubtreeAccessibilityStateChangedIfNeeded();
- public void notifyViewAccessibilityStateChangedIfNeeded(int);
- public void offsetLeftAndRight(int);
- public void offsetTopAndBottom(int);
- public void onActivityResult(int, int, android.content.Intent);
- protected void onAnimationEnd();
- protected void onAnimationStart();
- public android.view.WindowInsets onApplyWindowInsets(android.view.WindowInsets);
- protected void onAttachedToWindow();
- public void onCancelPendingInputEvents();
- public boolean onCapturedPointerEvent(android.view.MotionEvent);
- public boolean onCheckIsTextEditor();
- public void onCloseSystemDialogs(java.lang.String);
- protected void onConfigurationChanged(android.content.res.Configuration);
- protected void onCreateContextMenu(android.view.ContextMenu);
- protected int[] onCreateDrawableState(int);
- public android.view.inputmethod.InputConnection onCreateInputConnection(android.view.inputmethod.EditorInfo);
- protected void onDetachedFromWindow();
- protected void onDetachedFromWindowInternal();
- protected void onDisplayHint(int);
- public boolean onDragEvent(android.view.DragEvent);
- protected void onDraw(android.graphics.Canvas);
- public void onDrawForeground(android.graphics.Canvas);
- protected void onDrawHorizontalScrollBar(android.graphics.Canvas, android.graphics.drawable.Drawable, int, int, int, int);
- protected void onDrawScrollBars(android.graphics.Canvas);
- protected void onDrawVerticalScrollBar(android.graphics.Canvas, android.graphics.drawable.Drawable, int, int, int, int);
- public boolean onFilterTouchEventForSecurity(android.view.MotionEvent);
- protected void onFinishInflate();
- public void onFinishTemporaryDetach();
- protected void onFocusChanged(boolean, int, android.graphics.Rect);
- protected void onFocusLost();
- public boolean onGenericMotionEvent(android.view.MotionEvent);
- public void onHoverChanged(boolean);
- public boolean onHoverEvent(android.view.MotionEvent);
- public void onInitializeAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
- public void onInitializeAccessibilityEventInternal(android.view.accessibility.AccessibilityEvent);
- public void onInitializeAccessibilityNodeInfo(android.view.accessibility.AccessibilityNodeInfo);
- public void onInitializeAccessibilityNodeInfoInternal(android.view.accessibility.AccessibilityNodeInfo);
- public boolean onKeyDown(int, android.view.KeyEvent);
- public boolean onKeyLongPress(int, android.view.KeyEvent);
- public boolean onKeyMultiple(int, int, android.view.KeyEvent);
- public boolean onKeyPreIme(int, android.view.KeyEvent);
- public boolean onKeyShortcut(int, android.view.KeyEvent);
- public boolean onKeyUp(int, android.view.KeyEvent);
- protected void onLayout(boolean, int, int, int, int);
- protected void onMeasure(int, int);
- public void onMovedToDisplay(int, android.content.res.Configuration);
- protected void onOverScrolled(int, int, boolean, boolean);
- public void onPointerCaptureChange(boolean);
- public void onPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
- public void onPopulateAccessibilityEventInternal(android.view.accessibility.AccessibilityEvent);
- public void onProvideAutofillStructure(android.view.ViewStructure, int);
- public void onProvideAutofillVirtualStructure(android.view.ViewStructure, int);
- public void onProvideStructure(android.view.ViewStructure);
- public void onProvideVirtualStructure(android.view.ViewStructure);
- public void onResolveDrawables(int);
- public android.view.PointerIcon onResolvePointerIcon(android.view.MotionEvent, int);
- protected void onRestoreInstanceState(android.os.Parcelable);
- public void onRtlPropertiesChanged(int);
- protected android.os.Parcelable onSaveInstanceState();
- public void onScreenStateChanged(int);
- protected void onScrollChanged(int, int, int, int);
- protected boolean onSetAlpha(int);
- protected void onSizeChanged(int, int, int, int);
- public void onStartTemporaryDetach();
- public boolean onTouchEvent(android.view.MotionEvent);
- public boolean onTrackballEvent(android.view.MotionEvent);
- public void onVisibilityAggregated(boolean);
- protected void onVisibilityChanged(android.view.View, int);
- public void onWindowFocusChanged(boolean);
- public void onWindowSystemUiVisibilityChanged(int);
- protected void onWindowVisibilityChanged(int);
- public void outputDirtyFlags(java.lang.String, boolean, int);
- protected boolean overScrollBy(int, int, int, int, int, int, int, int, boolean);
- public boolean performAccessibilityAction(int, android.os.Bundle);
- public boolean performAccessibilityActionInternal(int, android.os.Bundle);
- protected boolean performButtonActionOnTouchDown(android.view.MotionEvent);
- public boolean performClick();
- public boolean performContextClick(float, float);
- public boolean performContextClick();
- public boolean performHapticFeedback(int);
- public boolean performHapticFeedback(int, int);
- public boolean performLongClick();
- public boolean performLongClick(float, float);
- public void playSoundEffect(int);
- public boolean pointInView(float, float, float);
- public boolean post(java.lang.Runnable);
- public boolean postDelayed(java.lang.Runnable, long);
- public void postInvalidate();
- public void postInvalidate(int, int, int, int);
- public void postInvalidateDelayed(long);
- public void postInvalidateDelayed(long, int, int, int, int);
- public void postInvalidateOnAnimation();
- public void postInvalidateOnAnimation(int, int, int, int);
- public void postOnAnimation(java.lang.Runnable);
- public void postOnAnimationDelayed(java.lang.Runnable, long);
- protected void recomputePadding();
- public void refreshDrawableState();
- public void releasePointerCapture();
- public boolean removeCallbacks(java.lang.Runnable);
- public void removeFrameMetricsListener(android.view.Window$OnFrameMetricsAvailableListener);
- public void removeOnAttachStateChangeListener(android.view.View$OnAttachStateChangeListener);
- public void removeOnLayoutChangeListener(android.view.View$OnLayoutChangeListener);
- public void removeOnUnhandledKeyEventListener(android.view.View$OnUnhandledKeyEventListener);
- public boolean requestAccessibilityFocus();
- public void requestApplyInsets();
- public void requestFitSystemWindows();
- public boolean requestFocus();
- public boolean requestFocus(int);
- public boolean requestFocus(int, android.graphics.Rect);
- public boolean requestFocusFromTouch();
- public void requestKeyboardShortcuts(java.util.List, int);
- public void requestLayout();
- public void requestPointerCapture();
- public boolean requestRectangleOnScreen(android.graphics.Rect);
- public boolean requestRectangleOnScreen(android.graphics.Rect, boolean);
- public void requestUnbufferedDispatch(android.view.MotionEvent);
- public android.view.View requireViewById(int);
- public void resetPaddingToInitialValues();
- public void resetPivot();
- protected void resetResolvedDrawables();
- public void resetResolvedLayoutDirection();
- public void resetResolvedPadding();
- public void resetResolvedTextAlignment();
- public void resetResolvedTextDirection();
- public void resetRtlProperties();
- protected void resolveDrawables();
- public boolean resolveLayoutDirection();
- public void resolveLayoutParams();
- public void resolvePadding();
- public boolean resolveRtlPropertiesIfNeeded();
- public static int resolveSize(int, int);
- public static int resolveSizeAndState(int, int, int);
- public boolean resolveTextAlignment();
- public boolean resolveTextDirection();
- public boolean restoreDefaultFocus();
- public boolean restoreFocusInCluster(int);
- public boolean restoreFocusNotInCluster();
- public void restoreHierarchyState(android.util.SparseArray);
- public void saveHierarchyState(android.util.SparseArray);
- public void scheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable, long);
- public void scrollBy(int, int);
- public void scrollTo(int, int);
- public void sendAccessibilityEvent(int);
- public void sendAccessibilityEventInternal(int);
- public void sendAccessibilityEventUnchecked(android.view.accessibility.AccessibilityEvent);
- public void sendAccessibilityEventUncheckedInternal(android.view.accessibility.AccessibilityEvent);
- public void setAccessibilityDelegate(android.view.View$AccessibilityDelegate);
- public void setAccessibilityHeading(boolean);
- public void setAccessibilityLiveRegion(int);
- public void setAccessibilityPaneTitle(java.lang.CharSequence);
- public void setAccessibilitySelection(int, int);
- public void setAccessibilityTraversalAfter(int);
- public void setAccessibilityTraversalBefore(int);
- public void setActivated(boolean);
- public void setAlpha(float);
- public void setAnimation(android.view.animation.Animation);
- public void setAnimationMatrix(android.graphics.Matrix);
- public void setAssistBlocked(boolean);
- public void setAutofillHints(java.lang.String[]);
- public void setAutofillId(android.view.autofill.AutofillId);
- public void setAutofilled(boolean);
- public void setBackground(android.graphics.drawable.Drawable);
- public void setBackgroundColor(int);
- public void setBackgroundDrawable(android.graphics.drawable.Drawable);
- public void setBackgroundResource(int);
- public void setBackgroundTintList(android.content.res.ColorStateList);
- public void setBackgroundTintMode(android.graphics.PorterDuff$Mode);
- public void setBottom(int);
- public void setCameraDistance(float);
- public void setClickable(boolean);
- public void setClipBounds(android.graphics.Rect);
- public void setClipToOutline(boolean);
- public void setContentDescription(java.lang.CharSequence);
- public void setContextClickable(boolean);
- public void setDefaultFocusHighlightEnabled(boolean);
- public void setDisabledSystemUiVisibility(int);
- public void setDrawingCacheBackgroundColor(int);
- public void setDrawingCacheEnabled(boolean);
- public void setDrawingCacheQuality(int);
- public void setDuplicateParentStateEnabled(boolean);
- public void setElevation(float);
- public void setEnabled(boolean);
- public void setFadingEdgeLength(int);
- public void setFilterTouchesWhenObscured(boolean);
- public void setFitsSystemWindows(boolean);
- public void setFocusable(boolean);
- public void setFocusable(int);
- public void setFocusableInTouchMode(boolean);
- public void setFocusedByDefault(boolean);
- public void setFocusedInCluster();
- public void setForeground(android.graphics.drawable.Drawable);
- public void setForegroundGravity(int);
- public void setForegroundTintList(android.content.res.ColorStateList);
- public void setForegroundTintMode(android.graphics.PorterDuff$Mode);
- protected boolean setFrame(int, int, int, int);
- public void setHapticFeedbackEnabled(boolean);
- public void setHasTransientState(boolean);
- public void setHorizontalFadingEdgeEnabled(boolean);
- public void setHorizontalScrollBarEnabled(boolean);
- public void setHovered(boolean);
- public void setId(int);
- public void setImportantForAccessibility(int);
- public void setImportantForAutofill(int);
- public void setIsRootNamespace(boolean);
- public void setKeepScreenOn(boolean);
- public void setKeyboardNavigationCluster(boolean);
- public void setLabelFor(int);
- public void setLayerPaint(android.graphics.Paint);
- public void setLayerType(int, android.graphics.Paint);
- public void setLayoutDirection(int);
- public void setLayoutParams(android.view.ViewGroup$LayoutParams);
- public void setLeft(int);
- public void setLeftTopRightBottom(int, int, int, int);
- public void setLongClickable(boolean);
- protected void setMeasuredDimension(int, int);
- public void setMinimumHeight(int);
- public void setMinimumWidth(int);
- public void setNestedScrollingEnabled(boolean);
- public void setNextClusterForwardId(int);
- public void setNextFocusDownId(int);
- public void setNextFocusForwardId(int);
- public void setNextFocusLeftId(int);
- public void setNextFocusRightId(int);
- public void setNextFocusUpId(int);
- public void setNotifyAutofillManagerOnClick(boolean);
- public void setOnApplyWindowInsetsListener(android.view.View$OnApplyWindowInsetsListener);
- public void setOnCapturedPointerListener(android.view.View$OnCapturedPointerListener);
- public void setOnClickListener(android.view.View$OnClickListener);
- public void setOnContextClickListener(android.view.View$OnContextClickListener);
- public void setOnCreateContextMenuListener(android.view.View$OnCreateContextMenuListener);
- public void setOnDragListener(android.view.View$OnDragListener);
- public void setOnFocusChangeListener(android.view.View$OnFocusChangeListener);
- public void setOnGenericMotionListener(android.view.View$OnGenericMotionListener);
- public void setOnHoverListener(android.view.View$OnHoverListener);
- public void setOnKeyListener(android.view.View$OnKeyListener);
- public void setOnLongClickListener(android.view.View$OnLongClickListener);
- public void setOnScrollChangeListener(android.view.View$OnScrollChangeListener);
- public void setOnSystemUiVisibilityChangeListener(android.view.View$OnSystemUiVisibilityChangeListener);
- public void setOnTouchListener(android.view.View$OnTouchListener);
- public void setOpticalInsets(android.graphics.Insets);
- public void setOutlineAmbientShadowColor(int);
- public void setOutlineProvider(android.view.ViewOutlineProvider);
- public void setOutlineSpotShadowColor(int);
- public void setOverScrollMode(int);
- public void setPadding(int, int, int, int);
- public void setPaddingRelative(int, int, int, int);
- public void setPivotX(float);
- public void setPivotY(float);
- public void setPointerIcon(android.view.PointerIcon);
- public void setPressed(boolean);
- public void setRevealClip(boolean, float, float, float);
- public void setRevealOnFocusHint(boolean);
- public void setRight(int);
- public void setRotation(float);
- public void setRotationX(float);
- public void setRotationY(float);
- public void setSaveEnabled(boolean);
- public void setSaveFromParentEnabled(boolean);
- public void setScaleX(float);
- public void setScaleY(float);
- public void setScreenReaderFocusable(boolean);
- public void setScrollBarDefaultDelayBeforeFade(int);
- public void setScrollBarFadeDuration(int);
- public void setScrollBarSize(int);
- public void setScrollBarStyle(int);
- public void setScrollContainer(boolean);
- public void setScrollIndicators(int);
- public void setScrollIndicators(int, int);
- public void setScrollX(int);
- public void setScrollY(int);
- public void setScrollbarFadingEnabled(boolean);
- public void setSelected(boolean);
- public void setSoundEffectsEnabled(boolean);
- public void setStateListAnimator(android.animation.StateListAnimator);
- public void setSystemUiVisibility(int);
- public void setTag(java.lang.Object);
- public void setTag(int, java.lang.Object);
- public void setTagInternal(int, java.lang.Object);
- public void setTextAlignment(int);
- public void setTextDirection(int);
- public void setTooltip(java.lang.CharSequence);
- public void setTooltipText(java.lang.CharSequence);
- public void setTop(int);
- public void setTouchDelegate(android.view.TouchDelegate);
- public void setTransitionAlpha(float);
- public void setTransitionName(java.lang.String);
- public void setTransitionVisibility(int);
- public void setTranslationX(float);
- public void setTranslationY(float);
- public void setTranslationZ(float);
- public void setVerticalFadingEdgeEnabled(boolean);
- public void setVerticalScrollBarEnabled(boolean);
- public void setVerticalScrollbarPosition(int);
- public void setVisibility(int);
- public void setWillNotCacheDrawing(boolean);
- public void setWillNotDraw(boolean);
- public void setX(float);
- public void setY(float);
- public void setZ(float);
- public boolean showContextMenu();
- public boolean showContextMenu(float, float);
- public android.view.ActionMode startActionMode(android.view.ActionMode$Callback);
- public android.view.ActionMode startActionMode(android.view.ActionMode$Callback, int);
- public void startActivityForResult(android.content.Intent, int);
- public void startAnimation(android.view.animation.Animation);
- public boolean startDrag(android.content.ClipData, android.view.View$DragShadowBuilder, java.lang.Object, int);
- public boolean startDragAndDrop(android.content.ClipData, android.view.View$DragShadowBuilder, java.lang.Object, int);
- public boolean startMovingTask(float, float);
- public boolean startNestedScroll(int);
- public void stopNestedScroll();
- public boolean toGlobalMotionEvent(android.view.MotionEvent);
- public boolean toLocalMotionEvent(android.view.MotionEvent);
- public java.lang.String toString();
- public void transformFromViewToWindowSpace(int[]);
- public void transformMatrixToGlobal(android.graphics.Matrix);
- public void transformMatrixToLocal(android.graphics.Matrix);
- public void unscheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable);
- public void unscheduleDrawable(android.graphics.drawable.Drawable);
- public android.view.RenderNode updateDisplayListIfDirty();
- public void updateDragShadow(android.view.View$DragShadowBuilder);
- protected boolean verifyDrawable(android.graphics.drawable.Drawable);
- public boolean willNotCacheDrawing();
- public boolean willNotDraw();
-
-
- public static int ACCESSIBILITY_CURSOR_POSITION_UNDEFINED;
- public static int ACCESSIBILITY_LIVE_REGION_ASSERTIVE;
- public static int ACCESSIBILITY_LIVE_REGION_NONE;
- public static int ACCESSIBILITY_LIVE_REGION_POLITE;
- public static android.util.Property ALPHA;
- public static int AUTOFILL_FLAG_INCLUDE_NOT_IMPORTANT_VIEWS;
- public static java.lang.String AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DATE;
- public static java.lang.String AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DAY;
- public static java.lang.String AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTH;
- public static java.lang.String AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_YEAR;
- public static java.lang.String AUTOFILL_HINT_CREDIT_CARD_NUMBER;
- public static java.lang.String AUTOFILL_HINT_CREDIT_CARD_SECURITY_CODE;
- public static java.lang.String AUTOFILL_HINT_EMAIL_ADDRESS;
- public static java.lang.String AUTOFILL_HINT_NAME;
- public static java.lang.String AUTOFILL_HINT_PASSWORD;
- public static java.lang.String AUTOFILL_HINT_PHONE;
- public static java.lang.String AUTOFILL_HINT_POSTAL_ADDRESS;
- public static java.lang.String AUTOFILL_HINT_POSTAL_CODE;
- public static java.lang.String AUTOFILL_HINT_USERNAME;
- public static int AUTOFILL_TYPE_DATE;
- public static int AUTOFILL_TYPE_LIST;
- public static int AUTOFILL_TYPE_NONE;
- public static int AUTOFILL_TYPE_TEXT;
- public static int AUTOFILL_TYPE_TOGGLE;
- public static boolean DEBUG_DRAW;
- public static java.lang.String DEBUG_LAYOUT_PROPERTY;
- public static int DRAG_FLAG_GLOBAL;
- public static int DRAG_FLAG_GLOBAL_PERSISTABLE_URI_PERMISSION;
- public static int DRAG_FLAG_GLOBAL_PREFIX_URI_PERMISSION;
- public static int DRAG_FLAG_GLOBAL_URI_READ;
- public static int DRAG_FLAG_GLOBAL_URI_WRITE;
- public static int DRAG_FLAG_OPAQUE;
- public static int DRAWING_CACHE_QUALITY_AUTO;
- public static int DRAWING_CACHE_QUALITY_HIGH;
- public static int DRAWING_CACHE_QUALITY_LOW;
- protected static int[] EMPTY_STATE_SET;
- protected static int[] ENABLED_FOCUSED_SELECTED_STATE_SET;
- protected static int[] ENABLED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET;
- protected static int[] ENABLED_FOCUSED_STATE_SET;
- protected static int[] ENABLED_FOCUSED_WINDOW_FOCUSED_STATE_SET;
- protected static int[] ENABLED_SELECTED_STATE_SET;
- protected static int[] ENABLED_SELECTED_WINDOW_FOCUSED_STATE_SET;
- protected static int[] ENABLED_STATE_SET;
- protected static int[] ENABLED_WINDOW_FOCUSED_STATE_SET;
- public static int FIND_VIEWS_WITH_ACCESSIBILITY_NODE_PROVIDERS;
- public static int FIND_VIEWS_WITH_CONTENT_DESCRIPTION;
- public static int FIND_VIEWS_WITH_TEXT;
- public static int FOCUSABLE;
- public static int FOCUSABLES_ALL;
- public static int FOCUSABLES_TOUCH_MODE;
- public static int FOCUSABLE_AUTO;
- protected static int[] FOCUSED_SELECTED_STATE_SET;
- protected static int[] FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET;
- protected static int[] FOCUSED_STATE_SET;
- protected static int[] FOCUSED_WINDOW_FOCUSED_STATE_SET;
- public static int FOCUS_BACKWARD;
- public static int FOCUS_DOWN;
- public static int FOCUS_FORWARD;
- public static int FOCUS_LEFT;
- public static int FOCUS_RIGHT;
- public static int FOCUS_UP;
- public static int GONE;
- public static int HAPTIC_FEEDBACK_ENABLED;
- public static int IMPORTANT_FOR_ACCESSIBILITY_AUTO;
- public static int IMPORTANT_FOR_ACCESSIBILITY_NO;
- public static int IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS;
- public static int IMPORTANT_FOR_ACCESSIBILITY_YES;
- public static int IMPORTANT_FOR_AUTOFILL_AUTO;
- public static int IMPORTANT_FOR_AUTOFILL_NO;
- public static int IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS;
- public static int IMPORTANT_FOR_AUTOFILL_YES;
- public static int IMPORTANT_FOR_AUTOFILL_YES_EXCLUDE_DESCENDANTS;
- public static int INVISIBLE;
- public static int KEEP_SCREEN_ON;
- public static int LAST_APP_AUTOFILL_ID;
- public static int LAYER_TYPE_HARDWARE;
- public static int LAYER_TYPE_NONE;
- public static int LAYER_TYPE_SOFTWARE;
- public static int LAYOUT_DIRECTION_INHERIT;
- public static int LAYOUT_DIRECTION_LOCALE;
- public static int LAYOUT_DIRECTION_LTR;
- public static int LAYOUT_DIRECTION_RTL;
- public static int LAYOUT_DIRECTION_UNDEFINED;
- public static int MEASURED_HEIGHT_STATE_SHIFT;
- public static int MEASURED_SIZE_MASK;
- public static int MEASURED_STATE_MASK;
- public static int MEASURED_STATE_TOO_SMALL;
- public static int NAVIGATION_BAR_TRANSIENT;
- public static int NAVIGATION_BAR_TRANSLUCENT;
- public static int NAVIGATION_BAR_TRANSPARENT;
- public static int NAVIGATION_BAR_UNHIDE;
- public static int NOT_FOCUSABLE;
- public static int NO_ID;
- public static int OVER_SCROLL_ALWAYS;
- public static int OVER_SCROLL_IF_CONTENT_SCROLLS;
- public static int OVER_SCROLL_NEVER;
- protected static int[] PRESSED_ENABLED_FOCUSED_SELECTED_STATE_SET;
- protected static int[] PRESSED_ENABLED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET;
- protected static int[] PRESSED_ENABLED_FOCUSED_STATE_SET;
- protected static int[] PRESSED_ENABLED_FOCUSED_WINDOW_FOCUSED_STATE_SET;
- protected static int[] PRESSED_ENABLED_SELECTED_STATE_SET;
- protected static int[] PRESSED_ENABLED_SELECTED_WINDOW_FOCUSED_STATE_SET;
- protected static int[] PRESSED_ENABLED_STATE_SET;
- protected static int[] PRESSED_ENABLED_WINDOW_FOCUSED_STATE_SET;
- protected static int[] PRESSED_FOCUSED_SELECTED_STATE_SET;
- protected static int[] PRESSED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET;
- protected static int[] PRESSED_FOCUSED_STATE_SET;
- protected static int[] PRESSED_FOCUSED_WINDOW_FOCUSED_STATE_SET;
- protected static int[] PRESSED_SELECTED_STATE_SET;
- protected static int[] PRESSED_SELECTED_WINDOW_FOCUSED_STATE_SET;
- protected static int[] PRESSED_STATE_SET;
- protected static int[] PRESSED_WINDOW_FOCUSED_STATE_SET;
- public static int PUBLIC_STATUS_BAR_VISIBILITY_MASK;
- public static android.util.Property ROTATION;
- public static android.util.Property ROTATION_X;
- public static android.util.Property ROTATION_Y;
- public static android.util.Property SCALE_X;
- public static android.util.Property SCALE_Y;
- public static int SCREEN_STATE_OFF;
- public static int SCREEN_STATE_ON;
- public static int SCROLLBARS_INSIDE_INSET;
- public static int SCROLLBARS_INSIDE_OVERLAY;
- public static int SCROLLBARS_OUTSIDE_INSET;
- public static int SCROLLBARS_OUTSIDE_OVERLAY;
- public static int SCROLLBAR_POSITION_DEFAULT;
- public static int SCROLLBAR_POSITION_LEFT;
- public static int SCROLLBAR_POSITION_RIGHT;
- public static int SCROLL_AXIS_HORIZONTAL;
- public static int SCROLL_AXIS_NONE;
- public static int SCROLL_AXIS_VERTICAL;
- public static int SCROLL_INDICATOR_BOTTOM;
- public static int SCROLL_INDICATOR_END;
- public static int SCROLL_INDICATOR_LEFT;
- public static int SCROLL_INDICATOR_RIGHT;
- public static int SCROLL_INDICATOR_START;
- public static int SCROLL_INDICATOR_TOP;
- protected static int[] SELECTED_STATE_SET;
- protected static int[] SELECTED_WINDOW_FOCUSED_STATE_SET;
- public static int SOUND_EFFECTS_ENABLED;
- public static int STATUS_BAR_DISABLE_BACK;
- public static int STATUS_BAR_DISABLE_CLOCK;
- public static int STATUS_BAR_DISABLE_EXPAND;
- public static int STATUS_BAR_DISABLE_HOME;
- public static int STATUS_BAR_DISABLE_NOTIFICATION_ALERTS;
- public static int STATUS_BAR_DISABLE_NOTIFICATION_ICONS;
- public static int STATUS_BAR_DISABLE_NOTIFICATION_TICKER;
- public static int STATUS_BAR_DISABLE_RECENT;
- public static int STATUS_BAR_DISABLE_SEARCH;
- public static int STATUS_BAR_DISABLE_SYSTEM_INFO;
- public static int STATUS_BAR_HIDDEN;
- public static int STATUS_BAR_TRANSIENT;
- public static int STATUS_BAR_TRANSLUCENT;
- public static int STATUS_BAR_TRANSPARENT;
- public static int STATUS_BAR_UNHIDE;
- public static int STATUS_BAR_VISIBLE;
- public static int SYSTEM_UI_CLEARABLE_FLAGS;
- public static int SYSTEM_UI_FLAG_FULLSCREEN;
- public static int SYSTEM_UI_FLAG_HIDE_NAVIGATION;
- public static int SYSTEM_UI_FLAG_IMMERSIVE;
- public static int SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
- public static int SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
- public static int SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
- public static int SYSTEM_UI_FLAG_LAYOUT_STABLE;
- public static int SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR;
- public static int SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
- public static int SYSTEM_UI_FLAG_LOW_PROFILE;
- public static int SYSTEM_UI_FLAG_VISIBLE;
- public static int SYSTEM_UI_LAYOUT_FLAGS;
- public static int SYSTEM_UI_TRANSPARENT;
- public static int TEXT_ALIGNMENT_CENTER;
- public static int TEXT_ALIGNMENT_GRAVITY;
- public static int TEXT_ALIGNMENT_INHERIT;
- public static int TEXT_ALIGNMENT_TEXT_END;
- public static int TEXT_ALIGNMENT_TEXT_START;
- public static int TEXT_ALIGNMENT_VIEW_END;
- public static int TEXT_ALIGNMENT_VIEW_START;
- public static int TEXT_DIRECTION_ANY_RTL;
- public static int TEXT_DIRECTION_FIRST_STRONG;
- public static int TEXT_DIRECTION_FIRST_STRONG_LTR;
- public static int TEXT_DIRECTION_FIRST_STRONG_RTL;
- public static int TEXT_DIRECTION_INHERIT;
- public static int TEXT_DIRECTION_LOCALE;
- public static int TEXT_DIRECTION_LTR;
- public static int TEXT_DIRECTION_RTL;
- public static android.util.Property TRANSLATION_X;
- public static android.util.Property TRANSLATION_Y;
- public static android.util.Property TRANSLATION_Z;
- protected static java.lang.String VIEW_LOG_TAG;
- public static int VISIBLE;
- protected static int[] WINDOW_FOCUSED_STATE_SET;
- public static android.util.Property X;
- public static android.util.Property Y;
- public static android.util.Property Z;
- public java.lang.String[] mAttributes;
- protected int mBottom;
- public boolean mCachingFailed;
- protected android.content.Context mContext;
- protected android.view.animation.Animation mCurrentAnimation;
- public static boolean mDebugViewAttributes;
- protected android.view.InputEventConsistencyVerifier mInputEventConsistencyVerifier;
- protected android.view.ViewGroup$LayoutParams mLayoutParams;
- protected int mLeft;
- protected int mPaddingBottom;
- protected int mPaddingLeft;
- protected int mPaddingRight;
- protected int mPaddingTop;
- protected android.view.ViewParent mParent;
- public int mPrivateFlags;
- protected int mRight;
- protected int mScrollX;
- protected int mScrollY;
- protected java.lang.Object mTag;
- protected int mTop;
- public android.view.View$TransformationInfo mTransformationInfo;
- protected int mUserPaddingBottom;
- protected int mUserPaddingLeft;
- protected int mUserPaddingRight;
- protected static boolean sPreserveMarginParamsInLayoutParamConversion;
-}
-
--keep class android.view.View$AccessibilityDelegate {
- <init>();
-
- public void addExtraDataToAccessibilityNodeInfo(android.view.View, android.view.accessibility.AccessibilityNodeInfo, java.lang.String, android.os.Bundle);
- public android.view.accessibility.AccessibilityNodeInfo createAccessibilityNodeInfo(android.view.View);
- public boolean dispatchPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
- public android.view.accessibility.AccessibilityNodeProvider getAccessibilityNodeProvider(android.view.View);
- public void onInitializeAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
- public void onInitializeAccessibilityNodeInfo(android.view.View, android.view.accessibility.AccessibilityNodeInfo);
- public void onPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
- public boolean onRequestSendAccessibilityEvent(android.view.ViewGroup, android.view.View, android.view.accessibility.AccessibilityEvent);
- public boolean performAccessibilityAction(android.view.View, int, android.os.Bundle);
- public void sendAccessibilityEvent(android.view.View, int);
- public void sendAccessibilityEventUnchecked(android.view.View, android.view.accessibility.AccessibilityEvent);
-
-
-}
-
--keep class android.view.View$AttachInfo {
-
-
-
- public android.view.Surface mDragSurface;
-}
-
--keep class android.view.View$AttachInfo$InvalidateInfo {
-
- public static android.view.View$AttachInfo$InvalidateInfo obtain();
- public void recycle();
-
-
-}
-
--keep class android.view.View$DragShadowBuilder {
- <init>(android.view.View);
- <init>();
-
- public android.view.View getView();
- public void onDrawShadow(android.graphics.Canvas);
- public void onProvideShadowMetrics(android.graphics.Point, android.graphics.Point);
-
-
-}
-
--keep class android.view.View$OnApplyWindowInsetsListener {
-
- public abstract android.view.WindowInsets onApplyWindowInsets(android.view.View, android.view.WindowInsets);
-
-
-}
-
--keep class android.view.View$OnAttachStateChangeListener {
-
- public abstract void onViewAttachedToWindow(android.view.View);
- public abstract void onViewDetachedFromWindow(android.view.View);
-
-
-}
-
--keep class android.view.View$OnCapturedPointerListener {
-
- public abstract boolean onCapturedPointer(android.view.View, android.view.MotionEvent);
-
-
-}
-
--keep class android.view.View$OnClickListener {
-
- public abstract void onClick(android.view.View);
-
-
-}
-
--keep class android.view.View$OnContextClickListener {
-
- public abstract boolean onContextClick(android.view.View);
-
-
-}
-
--keep class android.view.View$OnCreateContextMenuListener {
-
- public abstract void onCreateContextMenu(android.view.ContextMenu, android.view.View, android.view.ContextMenu$ContextMenuInfo);
-
-
-}
-
--keep class android.view.View$OnDragListener {
-
- public abstract boolean onDrag(android.view.View, android.view.DragEvent);
-
-
-}
-
--keep class android.view.View$OnFocusChangeListener {
-
- public abstract void onFocusChange(android.view.View, boolean);
-
-
-}
-
--keep class android.view.View$OnGenericMotionListener {
-
- public abstract boolean onGenericMotion(android.view.View, android.view.MotionEvent);
-
-
-}
-
--keep class android.view.View$OnHoverListener {
-
- public abstract boolean onHover(android.view.View, android.view.MotionEvent);
-
-
-}
-
--keep class android.view.View$OnKeyListener {
-
- public abstract boolean onKey(android.view.View, int, android.view.KeyEvent);
-
-
-}
-
--keep class android.view.View$OnLayoutChangeListener {
-
- public abstract void onLayoutChange(android.view.View, int, int, int, int, int, int, int, int);
-
-
-}
-
--keep class android.view.View$OnLongClickListener {
-
- public abstract boolean onLongClick(android.view.View);
-
-
-}
-
--keep class android.view.View$OnScrollChangeListener {
-
- public abstract void onScrollChange(android.view.View, int, int, int, int);
-
-
-}
-
--keep class android.view.View$OnSystemUiVisibilityChangeListener {
-
- public abstract void onSystemUiVisibilityChange(int);
-
-
-}
-
--keep class android.view.View$OnTouchListener {
-
- public abstract boolean onTouch(android.view.View, android.view.MotionEvent);
-
-
-}
-
--keep class android.view.View$OnUnhandledKeyEventListener {
-
- public abstract boolean onUnhandledKeyEvent(android.view.View, android.view.KeyEvent);
-
-
-}
-
--keep class android.view.View$TransformationInfo {
-
-
-
-}
-
--keep class android.view.ViewDebug {
- <init>();
-
- public static void capture(android.view.View, java.io.OutputStream, android.view.View);
- public static void captureLayers(android.view.View, java.io.DataOutputStream);
- public static void dump(android.view.View, boolean, boolean, java.io.OutputStream);
- public static void dumpCapturedView(java.lang.String, java.lang.Object);
- public static void dumpTheme(android.view.View, java.io.OutputStream);
- public static void dumpv2(android.view.View, java.io.ByteArrayOutputStream);
- public static android.view.View findView(android.view.View, java.lang.String);
- public static java.lang.String flagsToString(java.lang.Class, java.lang.String, int);
- public static long getViewInstanceCount();
- public static long getViewRootImplCount();
- public static java.lang.String intToString(java.lang.Class, java.lang.String, int);
- public static java.lang.Object invokeViewMethod(android.view.View, java.lang.reflect.Method, java.lang.Object[]);
- public static void outputDisplayList(android.view.View, android.view.View);
- public static void profileViewAndChildren(android.view.View, java.io.BufferedWriter);
- public static void setLayoutParameter(android.view.View, java.lang.String, int);
- public static void startHierarchyTracing(java.lang.String, android.view.View);
- public static void startRecyclerTracing(java.lang.String, android.view.View);
- public static void stopHierarchyTracing();
- public static void stopRecyclerTracing();
- public static void trace(android.view.View, android.view.ViewDebug$RecyclerTraceType, int[]);
- public static void trace(android.view.View, android.view.ViewDebug$HierarchyTraceType);
-
-
- public static boolean DEBUG_DRAG;
- public static boolean DEBUG_POSITIONING;
- public static boolean TRACE_HIERARCHY;
- public static boolean TRACE_RECYCLER;
-}
-
--keep class android.view.ViewDebug$CanvasProvider {
-
- public abstract android.graphics.Bitmap createBitmap();
- public abstract android.graphics.Canvas getCanvas(android.view.View, int, int);
-
-
-}
-
--keep class android.view.ViewDebug$HierarchyTraceType {
-
- public static android.view.ViewDebug$HierarchyTraceType valueOf(java.lang.String);
- public static android.view.ViewDebug$HierarchyTraceType[] values();
-
- public static android.view.ViewDebug$HierarchyTraceType BUILD_CACHE;
- public static android.view.ViewDebug$HierarchyTraceType DRAW;
- public static android.view.ViewDebug$HierarchyTraceType INVALIDATE;
- public static android.view.ViewDebug$HierarchyTraceType INVALIDATE_CHILD;
- public static android.view.ViewDebug$HierarchyTraceType INVALIDATE_CHILD_IN_PARENT;
- public static android.view.ViewDebug$HierarchyTraceType ON_LAYOUT;
- public static android.view.ViewDebug$HierarchyTraceType ON_MEASURE;
- public static android.view.ViewDebug$HierarchyTraceType REQUEST_LAYOUT;
-
-}
-
--keep class android.view.ViewDebug$RecyclerTraceType {
-
- public static android.view.ViewDebug$RecyclerTraceType valueOf(java.lang.String);
- public static android.view.ViewDebug$RecyclerTraceType[] values();
-
- public static android.view.ViewDebug$RecyclerTraceType BIND_VIEW;
- public static android.view.ViewDebug$RecyclerTraceType MOVE_FROM_ACTIVE_TO_SCRAP_HEAP;
- public static android.view.ViewDebug$RecyclerTraceType MOVE_TO_SCRAP_HEAP;
- public static android.view.ViewDebug$RecyclerTraceType NEW_VIEW;
- public static android.view.ViewDebug$RecyclerTraceType RECYCLE_FROM_ACTIVE_HEAP;
- public static android.view.ViewDebug$RecyclerTraceType RECYCLE_FROM_SCRAP_HEAP;
-
-}
-
--keep class android.view.ViewGroup {
- <init>(android.content.Context);
- <init>(android.content.Context, android.util.AttributeSet);
- <init>(android.content.Context, android.util.AttributeSet, int);
- <init>(android.content.Context, android.util.AttributeSet, int, int);
-
- public void addChildrenForAccessibility(java.util.ArrayList);
- public void addFocusables(java.util.ArrayList, int, int);
- public void addKeyboardNavigationClusters(java.util.Collection, int);
- public boolean addStatesFromChildren();
- public void addTouchables(java.util.ArrayList);
- public void addTransientView(android.view.View, int);
- public void addView(android.view.View);
- public void addView(android.view.View, int);
- public void addView(android.view.View, int, int);
- public void addView(android.view.View, android.view.ViewGroup$LayoutParams);
- public void addView(android.view.View, int, android.view.ViewGroup$LayoutParams);
- protected boolean addViewInLayout(android.view.View, int, android.view.ViewGroup$LayoutParams);
- protected boolean addViewInLayout(android.view.View, int, android.view.ViewGroup$LayoutParams, boolean);
- protected void attachLayoutAnimationParameters(android.view.View, android.view.ViewGroup$LayoutParams, int, int);
- protected void attachViewToParent(android.view.View, int, android.view.ViewGroup$LayoutParams);
- public void bringChildToFront(android.view.View);
- public java.util.ArrayList buildTouchDispatchChildList();
- protected boolean canAnimate();
- public void captureTransitioningViews(java.util.List);
- protected boolean checkLayoutParams(android.view.ViewGroup$LayoutParams);
- public void childDrawableStateChanged(android.view.View);
- public void childHasTransientStateChanged(android.view.View, boolean);
- protected void cleanupLayoutState(android.view.View);
- public void clearChildFocus(android.view.View);
- public void clearDisappearingChildren();
- public void clearFocus();
- public android.graphics.Bitmap createSnapshot(android.view.ViewDebug$CanvasProvider, boolean);
- protected void debug(int);
- protected void destroyHardwareResources();
- protected void detachAllViewsFromParent();
- protected void detachViewFromParent(android.view.View);
- protected void detachViewFromParent(int);
- protected void detachViewsFromParent(int, int);
- public boolean dispatchActivityResult(java.lang.String, int, int, android.content.Intent);
- public android.view.WindowInsets dispatchApplyWindowInsets(android.view.WindowInsets);
- public boolean dispatchCapturedPointerEvent(android.view.MotionEvent);
- public void dispatchConfigurationChanged(android.content.res.Configuration);
- public void dispatchDisplayHint(int);
- public boolean dispatchDragEvent(android.view.DragEvent);
- protected void dispatchDraw(android.graphics.Canvas);
- public void dispatchDrawableHotspotChanged(float, float);
- public void dispatchFinishTemporaryDetach();
- protected void dispatchFreezeSelfOnly(android.util.SparseArray);
- protected boolean dispatchGenericFocusedEvent(android.view.MotionEvent);
- protected boolean dispatchGenericPointerEvent(android.view.MotionEvent);
- protected void dispatchGetDisplayList();
- protected boolean dispatchHoverEvent(android.view.MotionEvent);
- public boolean dispatchKeyEvent(android.view.KeyEvent);
- public boolean dispatchKeyEventPreIme(android.view.KeyEvent);
- public boolean dispatchKeyShortcutEvent(android.view.KeyEvent);
- public void dispatchPointerCaptureChanged(boolean);
- public boolean dispatchPopulateAccessibilityEventInternal(android.view.accessibility.AccessibilityEvent);
- public void dispatchProvideAutofillStructure(android.view.ViewStructure, int);
- public void dispatchProvideStructure(android.view.ViewStructure);
- protected void dispatchRestoreInstanceState(android.util.SparseArray);
- protected void dispatchSaveInstanceState(android.util.SparseArray);
- public void dispatchSetActivated(boolean);
- protected void dispatchSetPressed(boolean);
- public void dispatchSetSelected(boolean);
- public void dispatchStartTemporaryDetach();
- public void dispatchSystemUiVisibilityChanged(int);
- protected void dispatchThawSelfOnly(android.util.SparseArray);
- public boolean dispatchTouchEvent(android.view.MotionEvent);
- public boolean dispatchTrackballEvent(android.view.MotionEvent);
- public boolean dispatchUnhandledMove(android.view.View, int);
- protected void dispatchVisibilityChanged(android.view.View, int);
- public void dispatchWindowFocusChanged(boolean);
- public void dispatchWindowSystemUiVisiblityChanged(int);
- public void dispatchWindowVisibilityChanged(int);
- protected boolean drawChild(android.graphics.Canvas, android.view.View, long);
- protected void drawableStateChanged();
- protected void encodeProperties(android.view.ViewHierarchyEncoder);
- public void endViewTransition(android.view.View);
- public android.view.View findFocus();
- public void findNamedViews(java.util.Map);
- public android.view.View findViewByAccessibilityIdTraversal(int);
- public android.view.View findViewByAutofillIdTraversal(int);
- protected android.view.View findViewByPredicateTraversal(java.util.function.Predicate, android.view.View);
- protected android.view.View findViewTraversal(int);
- protected android.view.View findViewWithTagTraversal(java.lang.Object);
- public void findViewsWithText(java.util.ArrayList, java.lang.CharSequence, int);
- public android.view.View focusSearch(android.view.View, int);
- public void focusableViewAvailable(android.view.View);
- public boolean gatherTransparentRegion(android.graphics.Region);
- protected android.view.ViewGroup$LayoutParams generateDefaultLayoutParams();
- public android.view.ViewGroup$LayoutParams generateLayoutParams(android.util.AttributeSet);
- protected android.view.ViewGroup$LayoutParams generateLayoutParams(android.view.ViewGroup$LayoutParams);
- public java.lang.CharSequence getAccessibilityClassName();
- public android.view.View getChildAt(int);
- public int getChildCount();
- protected int getChildDrawingOrder(int, int);
- public static int getChildMeasureSpec(int, int, int);
- protected boolean getChildStaticTransformation(android.view.View, android.view.animation.Transformation);
- public boolean getChildVisibleRect(android.view.View, android.graphics.Rect, android.graphics.Point);
- public boolean getChildVisibleRect(android.view.View, android.graphics.Rect, android.graphics.Point, boolean);
- public boolean getClipChildren();
- public boolean getClipToPadding();
- public int getDescendantFocusability();
- public android.view.View getFocusedChild();
- public android.view.animation.LayoutAnimationController getLayoutAnimation();
- public android.view.animation.Animation$AnimationListener getLayoutAnimationListener();
- public int getLayoutMode();
- public android.animation.LayoutTransition getLayoutTransition();
- public int getNestedScrollAxes();
- public android.view.ViewGroupOverlay getOverlay();
- public android.view.ViewOverlay getOverlay();
- public int getPersistentDrawingCache();
- public boolean getTouchscreenBlocksFocus();
- public android.view.View getTransientView(int);
- public int getTransientViewCount();
- public int getTransientViewIndex(int);
- public boolean hasFocus();
- protected boolean hasHoveredChild();
- public boolean hasTransientState();
- public int indexOfChild(android.view.View);
- protected void internalSetPadding(int, int, int, int);
- public void invalidateChild(android.view.View, android.graphics.Rect);
- public android.view.ViewParent invalidateChildInParent(int[], android.graphics.Rect);
- public boolean isAlwaysDrawnWithCacheEnabled();
- public boolean isAnimationCacheEnabled();
- protected boolean isChildrenDrawingOrderEnabled();
- protected boolean isChildrenDrawnWithCacheEnabled();
- public boolean isLayoutSuppressed();
- public boolean isMotionEventSplittingEnabled();
- public boolean isShowingContextMenuWithCoords();
- protected boolean isTransformedTouchPointInView(float, float, android.view.View, android.graphics.PointF);
- public boolean isTransitionGroup();
- public void jumpDrawablesToCurrentState();
- public void layout(int, int, int, int);
- public void makeOptionalFitsSystemWindows();
- protected void measureChild(android.view.View, int, int);
- protected void measureChildWithMargins(android.view.View, int, int, int, int);
- protected void measureChildren(int, int);
- public void notifySubtreeAccessibilityStateChanged(android.view.View, android.view.View, int);
- public void notifySubtreeAccessibilityStateChangedIfNeeded();
- public void offsetChildrenTopAndBottom(int);
- public void offsetDescendantRectToMyCoords(android.view.View, android.graphics.Rect);
- public void offsetRectIntoDescendantCoords(android.view.View, android.graphics.Rect);
- protected void onAttachedToWindow();
- protected void onChildVisibilityChanged(android.view.View, int, int);
- protected int[] onCreateDrawableState(int);
- protected void onDebugDraw(android.graphics.Canvas);
- protected void onDebugDrawMargins(android.graphics.Canvas, android.graphics.Paint);
- public void onDescendantInvalidated(android.view.View, android.view.View);
- protected void onDetachedFromWindow();
- public void onInitializeAccessibilityNodeInfoInternal(android.view.accessibility.AccessibilityNodeInfo);
- public boolean onInterceptHoverEvent(android.view.MotionEvent);
- public boolean onInterceptTouchEvent(android.view.MotionEvent);
- protected abstract void onLayout(boolean, int, int, int, int);
- public boolean onNestedFling(android.view.View, float, float, boolean);
- public boolean onNestedPreFling(android.view.View, float, float);
- public boolean onNestedPrePerformAccessibilityAction(android.view.View, int, android.os.Bundle);
- public void onNestedPreScroll(android.view.View, int, int, int[]);
- public void onNestedScroll(android.view.View, int, int, int, int);
- public void onNestedScrollAccepted(android.view.View, android.view.View, int);
- protected boolean onRequestFocusInDescendants(int, android.graphics.Rect);
- public boolean onRequestSendAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
- public boolean onRequestSendAccessibilityEventInternal(android.view.View, android.view.accessibility.AccessibilityEvent);
- public android.view.PointerIcon onResolvePointerIcon(android.view.MotionEvent, int);
- protected void onSetLayoutParams(android.view.View, android.view.ViewGroup$LayoutParams);
- public boolean onStartNestedScroll(android.view.View, android.view.View, int);
- public void onStopNestedScroll(android.view.View);
- public void onViewAdded(android.view.View);
- public void onViewRemoved(android.view.View);
- public void recomputeViewAttributes(android.view.View);
- public void removeAllViews();
- public void removeAllViewsInLayout();
- protected void removeDetachedView(android.view.View, boolean);
- public void removeTransientView(android.view.View);
- public void removeView(android.view.View);
- public void removeViewAt(int);
- public void removeViewInLayout(android.view.View);
- public void removeViews(int, int);
- public void removeViewsInLayout(int, int);
- public void requestChildFocus(android.view.View, android.view.View);
- public boolean requestChildRectangleOnScreen(android.view.View, android.graphics.Rect, boolean);
- public void requestDisallowInterceptTouchEvent(boolean);
- public boolean requestFocus(int, android.graphics.Rect);
- public boolean requestSendAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
- public void requestTransitionStart(android.animation.LayoutTransition);
- public void requestTransparentRegion(android.view.View);
- protected void resetResolvedDrawables();
- public void resetResolvedLayoutDirection();
- public void resetResolvedPadding();
- public void resetResolvedTextAlignment();
- public void resetResolvedTextDirection();
- protected void resolveDrawables();
- public boolean resolveLayoutDirection();
- public void resolveLayoutParams();
- public void resolvePadding();
- public boolean resolveRtlPropertiesIfNeeded();
- public boolean resolveTextAlignment();
- public boolean resolveTextDirection();
- public boolean restoreDefaultFocus();
- public boolean restoreFocusInCluster(int);
- public boolean restoreFocusNotInCluster();
- public void scheduleLayoutAnimation();
- public void setAddStatesFromChildren(boolean);
- public void setAlwaysDrawnWithCacheEnabled(boolean);
- public void setAnimationCacheEnabled(boolean);
- protected void setChildrenDrawingCacheEnabled(boolean);
- protected void setChildrenDrawingOrderEnabled(boolean);
- protected void setChildrenDrawnWithCacheEnabled(boolean);
- public void setClipChildren(boolean);
- public void setClipToPadding(boolean);
- public void setDescendantFocusability(int);
- public void setLayoutAnimation(android.view.animation.LayoutAnimationController);
- public void setLayoutAnimationListener(android.view.animation.Animation$AnimationListener);
- public void setLayoutMode(int);
- public void setLayoutTransition(android.animation.LayoutTransition);
- public void setMotionEventSplittingEnabled(boolean);
- public void setOnHierarchyChangeListener(android.view.ViewGroup$OnHierarchyChangeListener);
- public void setPersistentDrawingCache(int);
- protected void setStaticTransformationsEnabled(boolean);
- public void setTouchscreenBlocksFocus(boolean);
- public void setTransitionGroup(boolean);
- public boolean shouldDelayChildPressedState();
- public boolean showContextMenuForChild(android.view.View);
- public boolean showContextMenuForChild(android.view.View, float, float);
- public android.view.ActionMode startActionModeForChild(android.view.View, android.view.ActionMode$Callback);
- public android.view.ActionMode startActionModeForChild(android.view.View, android.view.ActionMode$Callback, int);
- public void startLayoutAnimation();
- public void startViewTransition(android.view.View);
- public void suppressLayout(boolean);
- public void transformPointToViewLocal(float[], android.view.View);
- public void updateViewLayout(android.view.View, android.view.ViewGroup$LayoutParams);
-
-
- protected static int CLIP_TO_PADDING_MASK;
- protected static int FLAG_DISALLOW_INTERCEPT;
- protected static int FLAG_SUPPORT_STATIC_TRANSFORMATIONS;
- protected static int FLAG_USE_CHILD_DRAWING_ORDER;
- public static int FOCUS_AFTER_DESCENDANTS;
- public static int FOCUS_BEFORE_DESCENDANTS;
- public static int FOCUS_BLOCK_DESCENDANTS;
- public static int LAYOUT_MODE_CLIP_BOUNDS;
- public static int LAYOUT_MODE_DEFAULT;
- public static int LAYOUT_MODE_OPTICAL_BOUNDS;
- public static int PERSISTENT_ALL_CACHES;
- public static int PERSISTENT_ANIMATION_CACHE;
- public static int PERSISTENT_NO_CACHE;
- public static int PERSISTENT_SCROLLING_CACHE;
- protected java.util.ArrayList mDisappearingChildren;
- protected int mGroupFlags;
- protected android.view.ViewGroup$OnHierarchyChangeListener mOnHierarchyChangeListener;
- protected int mPersistentDrawingCache;
-}
-
--keep class android.view.ViewGroup$LayoutParams {
- <init>(android.content.Context, android.util.AttributeSet);
- <init>(int, int);
- <init>(android.view.ViewGroup$LayoutParams);
-
- public java.lang.String debug(java.lang.String);
- protected void encodeProperties(android.view.ViewHierarchyEncoder);
- public void onDebugDraw(android.view.View, android.graphics.Canvas, android.graphics.Paint);
- public void resolveLayoutDirection(int);
- protected void setBaseAttributes(android.content.res.TypedArray, int, int);
- protected static java.lang.String sizeToString(int);
-
-
- public static int FILL_PARENT;
- public static int MATCH_PARENT;
- public static int WRAP_CONTENT;
- public int height;
- public android.view.animation.LayoutAnimationController$AnimationParameters layoutAnimationParameters;
- public int width;
-}
-
--keep class android.view.ViewGroup$MarginLayoutParams {
- <init>(android.content.Context, android.util.AttributeSet);
- <init>(int, int);
- <init>(android.view.ViewGroup$MarginLayoutParams);
- <init>(android.view.ViewGroup$LayoutParams);
-
- public void copyMarginsFrom(android.view.ViewGroup$MarginLayoutParams);
- protected void encodeProperties(android.view.ViewHierarchyEncoder);
- public int getLayoutDirection();
- public int getMarginEnd();
- public int getMarginStart();
- public boolean isLayoutRtl();
- public boolean isMarginRelative();
- public void onDebugDraw(android.view.View, android.graphics.Canvas, android.graphics.Paint);
- public void resolveLayoutDirection(int);
- public void setLayoutDirection(int);
- public void setMarginEnd(int);
- public void setMarginStart(int);
- public void setMargins(int, int, int, int);
- public void setMarginsRelative(int, int, int, int);
-
-
- public static int DEFAULT_MARGIN_RELATIVE;
- public int bottomMargin;
- public int leftMargin;
- public int rightMargin;
- public int topMargin;
-}
-
--keep class android.view.ViewGroup$OnHierarchyChangeListener {
-
- public abstract void onChildViewAdded(android.view.View, android.view.View);
- public abstract void onChildViewRemoved(android.view.View, android.view.View);
-
-
-}
-
--keep class android.view.ViewGroupOverlay {
-
- public void add(android.view.View);
- public void remove(android.view.View);
-
-
-}
-
--keep class android.view.ViewHierarchyEncoder {
- <init>(java.io.ByteArrayOutputStream);
-
- public void addProperty(java.lang.String, boolean);
- public void addProperty(java.lang.String, short);
- public void addProperty(java.lang.String, int);
- public void addProperty(java.lang.String, float);
- public void addProperty(java.lang.String, java.lang.String);
- public void addPropertyKey(java.lang.String);
- public void beginObject(java.lang.Object);
- public void endObject();
- public void endStream();
-
-
-}
-
--keep class android.view.ViewOutlineProvider {
- <init>();
-
- public abstract void getOutline(android.view.View, android.graphics.Outline);
-
-
- public static android.view.ViewOutlineProvider BACKGROUND;
- public static android.view.ViewOutlineProvider BOUNDS;
- public static android.view.ViewOutlineProvider PADDED_BOUNDS;
-}
-
--keep class android.view.ViewOverlay {
-
- public void add(android.graphics.drawable.Drawable);
- public void clear();
- public void remove(android.graphics.drawable.Drawable);
-
-
-}
-
--keep class android.view.ViewParent {
-
- public abstract void bringChildToFront(android.view.View);
- public abstract boolean canResolveLayoutDirection();
- public abstract boolean canResolveTextAlignment();
- public abstract boolean canResolveTextDirection();
- public abstract void childDrawableStateChanged(android.view.View);
- public abstract void childHasTransientStateChanged(android.view.View, boolean);
- public abstract void clearChildFocus(android.view.View);
- public abstract void createContextMenu(android.view.ContextMenu);
- public abstract android.view.View focusSearch(android.view.View, int);
- public abstract void focusableViewAvailable(android.view.View);
- public abstract boolean getChildVisibleRect(android.view.View, android.graphics.Rect, android.graphics.Point);
- public abstract int getLayoutDirection();
- public abstract android.view.ViewParent getParent();
- public abstract android.view.ViewParent getParentForAccessibility();
- public abstract int getTextAlignment();
- public abstract int getTextDirection();
- public abstract void invalidateChild(android.view.View, android.graphics.Rect);
- public abstract android.view.ViewParent invalidateChildInParent(int[], android.graphics.Rect);
- public abstract boolean isLayoutDirectionResolved();
- public abstract boolean isLayoutRequested();
- public abstract boolean isTextAlignmentResolved();
- public abstract boolean isTextDirectionResolved();
- public abstract android.view.View keyboardNavigationClusterSearch(android.view.View, int);
- public abstract void notifySubtreeAccessibilityStateChanged(android.view.View, android.view.View, int);
- public void onDescendantInvalidated(android.view.View, android.view.View);
- public abstract boolean onNestedFling(android.view.View, float, float, boolean);
- public abstract boolean onNestedPreFling(android.view.View, float, float);
- public abstract boolean onNestedPrePerformAccessibilityAction(android.view.View, int, android.os.Bundle);
- public abstract void onNestedPreScroll(android.view.View, int, int, int[]);
- public abstract void onNestedScroll(android.view.View, int, int, int, int);
- public abstract void onNestedScrollAccepted(android.view.View, android.view.View, int);
- public abstract boolean onStartNestedScroll(android.view.View, android.view.View, int);
- public abstract void onStopNestedScroll(android.view.View);
- public abstract void recomputeViewAttributes(android.view.View);
- public abstract void requestChildFocus(android.view.View, android.view.View);
- public abstract boolean requestChildRectangleOnScreen(android.view.View, android.graphics.Rect, boolean);
- public abstract void requestDisallowInterceptTouchEvent(boolean);
- public abstract void requestFitSystemWindows();
- public abstract void requestLayout();
- public abstract boolean requestSendAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
- public abstract void requestTransparentRegion(android.view.View);
- public abstract boolean showContextMenuForChild(android.view.View);
- public abstract boolean showContextMenuForChild(android.view.View, float, float);
- public abstract android.view.ActionMode startActionModeForChild(android.view.View, android.view.ActionMode$Callback);
- public abstract android.view.ActionMode startActionModeForChild(android.view.View, android.view.ActionMode$Callback, int);
-
-
-}
-
--keep class android.view.ViewPropertyAnimator {
-
- public android.view.ViewPropertyAnimator alpha(float);
- public android.view.ViewPropertyAnimator alphaBy(float);
- public void cancel();
- public long getDuration();
- public android.animation.TimeInterpolator getInterpolator();
- public long getStartDelay();
- public android.view.ViewPropertyAnimator rotation(float);
- public android.view.ViewPropertyAnimator rotationBy(float);
- public android.view.ViewPropertyAnimator rotationX(float);
- public android.view.ViewPropertyAnimator rotationXBy(float);
- public android.view.ViewPropertyAnimator rotationY(float);
- public android.view.ViewPropertyAnimator rotationYBy(float);
- public android.view.ViewPropertyAnimator scaleX(float);
- public android.view.ViewPropertyAnimator scaleXBy(float);
- public android.view.ViewPropertyAnimator scaleY(float);
- public android.view.ViewPropertyAnimator scaleYBy(float);
- public android.view.ViewPropertyAnimator setDuration(long);
- public android.view.ViewPropertyAnimator setInterpolator(android.animation.TimeInterpolator);
- public android.view.ViewPropertyAnimator setListener(android.animation.Animator$AnimatorListener);
- public android.view.ViewPropertyAnimator setStartDelay(long);
- public android.view.ViewPropertyAnimator setUpdateListener(android.animation.ValueAnimator$AnimatorUpdateListener);
- public void start();
- public android.view.ViewPropertyAnimator translationX(float);
- public android.view.ViewPropertyAnimator translationXBy(float);
- public android.view.ViewPropertyAnimator translationY(float);
- public android.view.ViewPropertyAnimator translationYBy(float);
- public android.view.ViewPropertyAnimator translationZ(float);
- public android.view.ViewPropertyAnimator translationZBy(float);
- public android.view.ViewPropertyAnimator withEndAction(java.lang.Runnable);
- public android.view.ViewPropertyAnimator withLayer();
- public android.view.ViewPropertyAnimator withStartAction(java.lang.Runnable);
- public android.view.ViewPropertyAnimator x(float);
- public android.view.ViewPropertyAnimator xBy(float);
- public android.view.ViewPropertyAnimator y(float);
- public android.view.ViewPropertyAnimator yBy(float);
- public android.view.ViewPropertyAnimator z(float);
- public android.view.ViewPropertyAnimator zBy(float);
-
-
-}
-
--keep class android.view.ViewRootImpl {
- <init>(android.content.Context, android.view.Display);
-
- public static void addConfigCallback(android.view.ViewRootImpl$ConfigChangedCallback);
- public static void addFirstDrawHandler(java.lang.Runnable);
- public void addWindowCallbacks(android.view.WindowCallbacks);
- public void bringChildToFront(android.view.View);
- public boolean canResolveLayoutDirection();
- public boolean canResolveTextAlignment();
- public boolean canResolveTextDirection();
- public void cancelInvalidate(android.view.View);
- public void childDrawableStateChanged(android.view.View);
- public void childHasTransientStateChanged(android.view.View, boolean);
- public void clearChildFocus(android.view.View);
- public void createContextMenu(android.view.ContextMenu);
- public void debug();
- public void detachFunctor(long);
- public void dispatchAppVisibility(boolean);
- public void dispatchCheckFocus();
- public void dispatchCloseSystemDialogs(java.lang.String);
- public void dispatchDragEvent(android.view.DragEvent);
- public void dispatchGetNewSurface();
- public void dispatchInputEvent(android.view.InputEvent);
- public void dispatchInputEvent(android.view.InputEvent, android.view.InputEventReceiver);
- public void dispatchInvalidateDelayed(android.view.View, long);
- public void dispatchInvalidateOnAnimation(android.view.View);
- public void dispatchInvalidateRectDelayed(android.view.View$AttachInfo$InvalidateInfo, long);
- public void dispatchInvalidateRectOnAnimation(android.view.View$AttachInfo$InvalidateInfo);
- public void dispatchKeyFromAutofill(android.view.KeyEvent);
- public void dispatchKeyFromIme(android.view.KeyEvent);
- public void dispatchMoved(int, int);
- public void dispatchPointerCaptureChanged(boolean);
- public void dispatchRequestKeyboardShortcuts(com.android.internal.os.IResultReceiver, int);
- public void dispatchSystemUiVisibilityChanged(int, int, int, int);
- public void dispatchUnhandledInputEvent(android.view.InputEvent);
- public boolean dispatchUnhandledKeyEvent(android.view.KeyEvent);
- public void dispatchWindowShown();
- public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
- public void dumpGfxInfo(int[]);
- public android.view.View focusSearch(android.view.View, int);
- public void focusableViewAvailable(android.view.View);
- public android.view.View getAccessibilityFocusedHost();
- public android.view.accessibility.AccessibilityNodeInfo getAccessibilityFocusedVirtualView();
- public android.view.AccessibilityInteractionController getAccessibilityInteractionController();
- public boolean getChildVisibleRect(android.view.View, android.graphics.Rect, android.graphics.Point);
- public int getDisplayId();
- public int getHeight();
- public void getLastTouchPoint(android.graphics.Point);
- public int getLastTouchSource();
- public int getLayoutDirection();
- public android.view.ViewParent getParent();
- public android.view.ViewParent getParentForAccessibility();
- public int getTextAlignment();
- public int getTextDirection();
- public java.lang.CharSequence getTitle();
- public android.view.View getView();
- public int getWidth();
- public int getWindowFlags();
- public void handleDispatchSystemUiVisibilityChanged(android.view.ViewRootImpl$SystemUiVisibilityInfo);
- public void handleDispatchWindowShown();
- public void handleRequestKeyboardShortcuts(com.android.internal.os.IResultReceiver, int);
- public void invalidateChild(android.view.View, android.graphics.Rect);
- public android.view.ViewParent invalidateChildInParent(int[], android.graphics.Rect);
- public static void invokeFunctor(long, boolean);
- public boolean isLayoutDirectionResolved();
- public boolean isLayoutRequested();
- public boolean isTextAlignmentResolved();
- public boolean isTextDirectionResolved();
- public static boolean isViewDescendantOf(android.view.View, android.view.View);
- public android.view.View keyboardNavigationClusterSearch(android.view.View, int);
- public void loadSystemProperties();
- public void notifyChildRebuilt();
- public void notifySubtreeAccessibilityStateChanged(android.view.View, android.view.View, int);
- public void onDescendantInvalidated(android.view.View, android.view.View);
- public void onMovedToDisplay(int, android.content.res.Configuration);
- public boolean onNestedFling(android.view.View, float, float, boolean);
- public boolean onNestedPreFling(android.view.View, float, float);
- public boolean onNestedPrePerformAccessibilityAction(android.view.View, int, android.os.Bundle);
- public void onNestedPreScroll(android.view.View, int, int, int[]);
- public void onNestedScroll(android.view.View, int, int, int, int);
- public void onNestedScrollAccepted(android.view.View, android.view.View, int);
- public void onPostDraw(android.view.DisplayListCanvas);
- public void onPreDraw(android.view.DisplayListCanvas);
- public boolean onStartNestedScroll(android.view.View, android.view.View, int);
- public void onStopNestedScroll(android.view.View);
- public void onWindowTitleChanged();
- public boolean performHapticFeedback(int, boolean);
- public void playSoundEffect(int);
- public void profile();
- public void recomputeViewAttributes(android.view.View);
- public void registerAnimatingRenderNode(android.view.RenderNode);
- public void registerRtFrameCallback(android.view.ThreadedRenderer$FrameDrawingCallback);
- public void registerVectorDrawableAnimator(android.graphics.drawable.AnimatedVectorDrawable$VectorDrawableAnimatorRT);
- public void removeWindowCallbacks(android.view.WindowCallbacks);
- public void reportActivityRelaunched();
- public void reportDrawFinish();
- public void requestChildFocus(android.view.View, android.view.View);
- public boolean requestChildRectangleOnScreen(android.view.View, android.graphics.Rect, boolean);
- public void requestDisallowInterceptTouchEvent(boolean);
- public void requestFitSystemWindows();
- public void requestInvalidateRootRenderNode();
- public void requestLayout();
- public boolean requestSendAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
- public void requestTransitionStart(android.animation.LayoutTransition);
- public void requestTransparentRegion(android.view.View);
- public void requestUpdateConfiguration(android.content.res.Configuration);
- public void setActivityConfigCallback(android.view.ViewRootImpl$ActivityConfigCallback);
- public void setDragFocus(android.view.View, android.view.DragEvent);
- public void setIsAmbientMode(boolean);
- public void setPausedForTransition(boolean);
- public void setReportNextDraw();
- public void setView(android.view.View, android.view.WindowManager$LayoutParams, android.view.View);
- public boolean showContextMenuForChild(android.view.View);
- public boolean showContextMenuForChild(android.view.View, float, float);
- public android.view.ActionMode startActionModeForChild(android.view.View, android.view.ActionMode$Callback);
- public android.view.ActionMode startActionModeForChild(android.view.View, android.view.ActionMode$Callback, int);
- public void synthesizeInputEvent(android.view.InputEvent);
- public void updateConfiguration(int);
- public void updatePointerIcon(float, float);
- public void windowFocusChanged(boolean, boolean);
-
-
- public static java.lang.String PROPERTY_EMULATOR_WIN_OUTSET_BOTTOM_PX;
- protected android.view.InputEventConsistencyVerifier mInputEventConsistencyVerifier;
- public boolean mIsAnimating;
- public android.view.Surface mSurface;
- public boolean mTraversalScheduled;
- public android.view.WindowManager$LayoutParams mWindowAttributes;
-}
-
--keep class android.view.ViewRootImpl$ActivityConfigCallback {
-
- public abstract void onConfigurationChanged(android.content.res.Configuration, int);
-
-
-}
-
--keep class android.view.ViewRootImpl$ConfigChangedCallback {
-
- public abstract void onConfigurationChanged(android.content.res.Configuration);
-
-
-}
-
--keep class android.view.ViewRootImpl$SystemUiVisibilityInfo {
-
-
-
-}
-
--keep class android.view.ViewStructure {
- <init>();
-
- public abstract int addChildCount(int);
- public abstract void asyncCommit();
- public abstract android.view.ViewStructure asyncNewChild(int);
- public abstract android.view.autofill.AutofillId getAutofillId();
- public abstract int getChildCount();
- public abstract android.os.Bundle getExtras();
- public abstract java.lang.CharSequence getHint();
- public abstract android.graphics.Rect getTempRect();
- public abstract java.lang.CharSequence getText();
- public abstract int getTextSelectionEnd();
- public abstract int getTextSelectionStart();
- public abstract boolean hasExtras();
- public abstract android.view.ViewStructure newChild(int);
- public abstract android.view.ViewStructure$HtmlInfo$Builder newHtmlInfoBuilder(java.lang.String);
- public abstract void setAccessibilityFocused(boolean);
- public abstract void setActivated(boolean);
- public abstract void setAlpha(float);
- public abstract void setAssistBlocked(boolean);
- public abstract void setAutofillHints(java.lang.String[]);
- public abstract void setAutofillId(android.view.autofill.AutofillId);
- public abstract void setAutofillId(android.view.autofill.AutofillId, int);
- public abstract void setAutofillOptions(java.lang.CharSequence[]);
- public abstract void setAutofillType(int);
- public abstract void setAutofillValue(android.view.autofill.AutofillValue);
- public abstract void setCheckable(boolean);
- public abstract void setChecked(boolean);
- public abstract void setChildCount(int);
- public abstract void setClassName(java.lang.String);
- public abstract void setClickable(boolean);
- public abstract void setContentDescription(java.lang.CharSequence);
- public abstract void setContextClickable(boolean);
- public abstract void setDataIsSensitive(boolean);
- public abstract void setDimens(int, int, int, int, int, int);
- public abstract void setElevation(float);
- public abstract void setEnabled(boolean);
- public abstract void setFocusable(boolean);
- public abstract void setFocused(boolean);
- public abstract void setHint(java.lang.CharSequence);
- public abstract void setHtmlInfo(android.view.ViewStructure$HtmlInfo);
- public abstract void setId(int, java.lang.String, java.lang.String, java.lang.String);
- public void setImportantForAutofill(int);
- public abstract void setInputType(int);
- public abstract void setLocaleList(android.os.LocaleList);
- public abstract void setLongClickable(boolean);
- public void setMaxTextEms(int);
- public void setMaxTextLength(int);
- public void setMinTextEms(int);
- public abstract void setOpaque(boolean);
- public abstract void setSelected(boolean);
- public abstract void setText(java.lang.CharSequence);
- public abstract void setText(java.lang.CharSequence, int, int);
- public void setTextIdEntry(java.lang.String);
- public abstract void setTextLines(int[], int[]);
- public abstract void setTextStyle(float, int, int, int);
- public abstract void setTransformation(android.graphics.Matrix);
- public abstract void setVisibility(int);
- public abstract void setWebDomain(java.lang.String);
-
-
-}
-
--keep class android.view.ViewStructure$HtmlInfo {
- <init>();
-
- public abstract java.util.List getAttributes();
- public abstract java.lang.String getTag();
-
-
-}
-
--keep class android.view.ViewStructure$HtmlInfo$Builder {
- <init>();
-
- public abstract android.view.ViewStructure$HtmlInfo$Builder addAttribute(java.lang.String, java.lang.String);
- public abstract android.view.ViewStructure$HtmlInfo build();
-
-
-}
-
--keep class android.view.ViewTreeObserver {
-
- public void addOnComputeInternalInsetsListener(android.view.ViewTreeObserver$OnComputeInternalInsetsListener);
- public void addOnDrawListener(android.view.ViewTreeObserver$OnDrawListener);
- public void addOnEnterAnimationCompleteListener(android.view.ViewTreeObserver$OnEnterAnimationCompleteListener);
- public void addOnGlobalFocusChangeListener(android.view.ViewTreeObserver$OnGlobalFocusChangeListener);
- public void addOnGlobalLayoutListener(android.view.ViewTreeObserver$OnGlobalLayoutListener);
- public void addOnPreDrawListener(android.view.ViewTreeObserver$OnPreDrawListener);
- public void addOnScrollChangedListener(android.view.ViewTreeObserver$OnScrollChangedListener);
- public void addOnTouchModeChangeListener(android.view.ViewTreeObserver$OnTouchModeChangeListener);
- public void addOnWindowAttachListener(android.view.ViewTreeObserver$OnWindowAttachListener);
- public void addOnWindowFocusChangeListener(android.view.ViewTreeObserver$OnWindowFocusChangeListener);
- public void addOnWindowShownListener(android.view.ViewTreeObserver$OnWindowShownListener);
- public void dispatchOnDraw();
- public void dispatchOnEnterAnimationComplete();
- public void dispatchOnGlobalLayout();
- public boolean dispatchOnPreDraw();
- public void dispatchOnWindowShown();
- public boolean isAlive();
- public void removeGlobalOnLayoutListener(android.view.ViewTreeObserver$OnGlobalLayoutListener);
- public void removeOnComputeInternalInsetsListener(android.view.ViewTreeObserver$OnComputeInternalInsetsListener);
- public void removeOnDrawListener(android.view.ViewTreeObserver$OnDrawListener);
- public void removeOnEnterAnimationCompleteListener(android.view.ViewTreeObserver$OnEnterAnimationCompleteListener);
- public void removeOnGlobalFocusChangeListener(android.view.ViewTreeObserver$OnGlobalFocusChangeListener);
- public void removeOnGlobalLayoutListener(android.view.ViewTreeObserver$OnGlobalLayoutListener);
- public void removeOnPreDrawListener(android.view.ViewTreeObserver$OnPreDrawListener);
- public void removeOnScrollChangedListener(android.view.ViewTreeObserver$OnScrollChangedListener);
- public void removeOnTouchModeChangeListener(android.view.ViewTreeObserver$OnTouchModeChangeListener);
- public void removeOnWindowAttachListener(android.view.ViewTreeObserver$OnWindowAttachListener);
- public void removeOnWindowFocusChangeListener(android.view.ViewTreeObserver$OnWindowFocusChangeListener);
- public void removeOnWindowShownListener(android.view.ViewTreeObserver$OnWindowShownListener);
-
-
-}
-
--keep class android.view.ViewTreeObserver$InternalInsetsInfo {
- <init>();
-
- public boolean equals(java.lang.Object);
- public int hashCode();
- public void setTouchableInsets(int);
-
-
- public static int TOUCHABLE_INSETS_CONTENT;
- public static int TOUCHABLE_INSETS_FRAME;
- public static int TOUCHABLE_INSETS_REGION;
- public static int TOUCHABLE_INSETS_VISIBLE;
- public android.graphics.Rect contentInsets;
- public android.graphics.Region touchableRegion;
- public android.graphics.Rect visibleInsets;
-}
-
--keep class android.view.ViewTreeObserver$OnComputeInternalInsetsListener {
-
- public abstract void onComputeInternalInsets(android.view.ViewTreeObserver$InternalInsetsInfo);
-
-
-}
-
--keep class android.view.ViewTreeObserver$OnDrawListener {
-
- public abstract void onDraw();
-
-
-}
-
--keep class android.view.ViewTreeObserver$OnEnterAnimationCompleteListener {
-
- public abstract void onEnterAnimationComplete();
-
-
-}
-
--keep class android.view.ViewTreeObserver$OnGlobalFocusChangeListener {
-
- public abstract void onGlobalFocusChanged(android.view.View, android.view.View);
-
-
-}
-
--keep class android.view.ViewTreeObserver$OnGlobalLayoutListener {
-
- public abstract void onGlobalLayout();
-
-
-}
-
--keep class android.view.ViewTreeObserver$OnPreDrawListener {
-
- public abstract boolean onPreDraw();
-
-
-}
-
--keep class android.view.ViewTreeObserver$OnScrollChangedListener {
-
- public abstract void onScrollChanged();
-
-
-}
-
--keep class android.view.ViewTreeObserver$OnTouchModeChangeListener {
-
- public abstract void onTouchModeChanged(boolean);
-
-
-}
-
--keep class android.view.ViewTreeObserver$OnWindowAttachListener {
-
- public abstract void onWindowAttached();
- public abstract void onWindowDetached();
-
-
-}
-
--keep class android.view.ViewTreeObserver$OnWindowFocusChangeListener {
-
- public abstract void onWindowFocusChanged(boolean);
-
-
-}
-
--keep class android.view.ViewTreeObserver$OnWindowShownListener {
-
- public abstract void onWindowShown();
-
-
-}
-
--keep class android.view.Window {
- <init>(android.content.Context);
-
- public abstract void addContentView(android.view.View, android.view.ViewGroup$LayoutParams);
- public void addFlags(int);
- public void addOnFrameMetricsAvailableListener(android.view.Window$OnFrameMetricsAvailableListener, android.os.Handler);
- public void addPrivateFlags(int);
- public abstract void alwaysReadCloseOnTouchAttr();
- public abstract void clearContentView();
- public void clearFlags(int);
- public abstract void closeAllPanels();
- public abstract void closePanel(int);
- public void destroy();
- public void dispatchOnWindowDismissed(boolean, boolean);
- public void dispatchOnWindowSwipeDismissed();
- protected void dispatchWindowAttributesChanged(android.view.WindowManager$LayoutParams);
- public android.view.View findViewById(int);
- public boolean getAllowEnterTransitionOverlap();
- public boolean getAllowReturnTransitionOverlap();
- public android.view.WindowManager$LayoutParams getAttributes();
- public android.view.Window$Callback getCallback();
- public int getColorMode();
- public android.view.Window getContainer();
- public android.transition.Scene getContentScene();
- public android.content.Context getContext();
- public abstract android.view.View getCurrentFocus();
- public abstract android.view.View getDecorView();
- public static int getDefaultFeatures(android.content.Context);
- public float getElevation();
- public android.transition.Transition getEnterTransition();
- public android.transition.Transition getExitTransition();
- protected int getFeatures();
- protected int getForcedWindowFlags();
- public abstract android.view.LayoutInflater getLayoutInflater();
- protected int getLocalFeatures();
- public android.media.session.MediaController getMediaController();
- public abstract int getNavigationBarColor();
- public int getNavigationBarDividerColor();
- public android.transition.Transition getReenterTransition();
- public android.transition.Transition getReturnTransition();
- public android.transition.Transition getSharedElementEnterTransition();
- public android.transition.Transition getSharedElementExitTransition();
- public android.transition.Transition getSharedElementReenterTransition();
- public android.transition.Transition getSharedElementReturnTransition();
- public boolean getSharedElementsUseOverlay();
- public abstract int getStatusBarColor();
- public long getTransitionBackgroundFadeDuration();
- public android.transition.TransitionManager getTransitionManager();
- public abstract int getVolumeControlStream();
- public android.view.Window$WindowControllerCallback getWindowControllerCallback();
- public android.view.WindowManager getWindowManager();
- public android.content.res.TypedArray getWindowStyle();
- public boolean hasChildren();
- public boolean hasFeature(int);
- protected boolean hasSoftInputMode();
- protected boolean haveDimAmount();
- public void injectInputEvent(android.view.InputEvent);
- public abstract void invalidatePanelMenu(int);
- public boolean isActive();
- public boolean isCloseOnSwipeEnabled();
- public boolean isDestroyed();
- public abstract boolean isFloating();
- public boolean isOverlayWithDecorCaptionEnabled();
- public abstract boolean isShortcutKey(int, android.view.KeyEvent);
- public boolean isWideColorGamut();
- public void makeActive();
- public void notifyRestrictedCaptionAreaCallback(int, int, int, int);
- protected abstract void onActive();
- public abstract void onConfigurationChanged(android.content.res.Configuration);
- public abstract void onMultiWindowModeChanged();
- public abstract void onPictureInPictureModeChanged(boolean);
- public abstract void openPanel(int, android.view.KeyEvent);
- public abstract android.view.View peekDecorView();
- public abstract boolean performContextMenuIdentifierAction(int, int);
- public abstract boolean performPanelIdentifierAction(int, int, int);
- public abstract boolean performPanelShortcut(int, int, android.view.KeyEvent, int);
- protected void removeFeature(int);
- public void removeOnFrameMetricsAvailableListener(android.view.Window$OnFrameMetricsAvailableListener);
- public abstract void reportActivityRelaunched();
- public boolean requestFeature(int);
- public android.view.View requireViewById(int);
- public abstract void restoreHierarchyState(android.os.Bundle);
- public abstract android.os.Bundle saveHierarchyState();
- public void setAllowEnterTransitionOverlap(boolean);
- public void setAllowReturnTransitionOverlap(boolean);
- public void setAttributes(android.view.WindowManager$LayoutParams);
- public abstract void setBackgroundDrawable(android.graphics.drawable.Drawable);
- public void setBackgroundDrawableResource(int);
- public void setCallback(android.view.Window$Callback);
- public abstract void setChildDrawable(int, android.graphics.drawable.Drawable);
- public abstract void setChildInt(int, int);
- public void setClipToOutline(boolean);
- public void setCloseOnSwipeEnabled(boolean);
- public void setCloseOnTouchOutside(boolean);
- public void setCloseOnTouchOutsideIfNotSet(boolean);
- public void setColorMode(int);
- public void setContainer(android.view.Window);
- public abstract void setContentView(int);
- public abstract void setContentView(android.view.View);
- public abstract void setContentView(android.view.View, android.view.ViewGroup$LayoutParams);
- public abstract void setDecorCaptionShade(int);
- public void setDefaultIcon(int);
- public void setDefaultLogo(int);
- protected void setDefaultWindowFormat(int);
- public void setDimAmount(float);
- public void setElevation(float);
- public void setEnterTransition(android.transition.Transition);
- public void setExitTransition(android.transition.Transition);
- public abstract void setFeatureDrawable(int, android.graphics.drawable.Drawable);
- public abstract void setFeatureDrawableAlpha(int, int);
- public abstract void setFeatureDrawableResource(int, int);
- public abstract void setFeatureDrawableUri(int, android.net.Uri);
- public abstract void setFeatureInt(int, int);
- public void setFlags(int, int);
- public void setFormat(int);
- public void setGravity(int);
- public void setIcon(int);
- public void setLayout(int, int);
- public void setLocalFocus(boolean, boolean);
- public void setLogo(int);
- public void setMediaController(android.media.session.MediaController);
- public abstract void setNavigationBarColor(int);
- public void setNavigationBarDividerColor(int);
- protected void setNeedsMenuKey(int);
- public void setOnWindowDismissedCallback(android.view.Window$OnWindowDismissedCallback);
- public void setOnWindowSwipeDismissedCallback(android.view.Window$OnWindowSwipeDismissedCallback);
- public void setOverlayWithDecorCaptionEnabled(boolean);
- public void setReenterTransition(android.transition.Transition);
- public abstract void setResizingCaptionDrawable(android.graphics.drawable.Drawable);
- public void setRestrictedCaptionAreaListener(android.view.Window$OnRestrictedCaptionAreaChangedListener);
- public void setReturnTransition(android.transition.Transition);
- public void setSharedElementEnterTransition(android.transition.Transition);
- public void setSharedElementExitTransition(android.transition.Transition);
- public void setSharedElementReenterTransition(android.transition.Transition);
- public void setSharedElementReturnTransition(android.transition.Transition);
- public void setSharedElementsUseOverlay(boolean);
- public void setSoftInputMode(int);
- public abstract void setStatusBarColor(int);
- public void setSustainedPerformanceMode(boolean);
- public void setTheme(int);
- public abstract void setTitle(java.lang.CharSequence);
- public abstract void setTitleColor(int);
- public void setTransitionBackgroundFadeDuration(long);
- public void setTransitionManager(android.transition.TransitionManager);
- public void setType(int);
- public void setUiOptions(int);
- public void setUiOptions(int, int);
- public abstract void setVolumeControlStream(int);
- public void setWindowAnimations(int);
- public void setWindowControllerCallback(android.view.Window$WindowControllerCallback);
- public void setWindowManager(android.view.WindowManager, android.os.IBinder, java.lang.String);
- public void setWindowManager(android.view.WindowManager, android.os.IBinder, java.lang.String, boolean);
- public boolean shouldCloseOnTouch(android.content.Context, android.view.MotionEvent);
- public abstract boolean superDispatchGenericMotionEvent(android.view.MotionEvent);
- public abstract boolean superDispatchKeyEvent(android.view.KeyEvent);
- public abstract boolean superDispatchKeyShortcutEvent(android.view.KeyEvent);
- public abstract boolean superDispatchTouchEvent(android.view.MotionEvent);
- public abstract boolean superDispatchTrackballEvent(android.view.MotionEvent);
- public abstract void takeInputQueue(android.view.InputQueue$Callback);
- public abstract void takeKeyEvents(boolean);
- public abstract void takeSurface(android.view.SurfaceHolder$Callback2);
- public abstract void togglePanel(int, android.view.KeyEvent);
-
-
- public static int DECOR_CAPTION_SHADE_AUTO;
- public static int DECOR_CAPTION_SHADE_DARK;
- public static int DECOR_CAPTION_SHADE_LIGHT;
- protected static int DEFAULT_FEATURES;
- public static int FEATURE_ACTION_BAR;
- public static int FEATURE_ACTION_BAR_OVERLAY;
- public static int FEATURE_ACTION_MODE_OVERLAY;
- public static int FEATURE_ACTIVITY_TRANSITIONS;
- public static int FEATURE_CONTENT_TRANSITIONS;
- public static int FEATURE_CONTEXT_MENU;
- public static int FEATURE_CUSTOM_TITLE;
- public static int FEATURE_INDETERMINATE_PROGRESS;
- public static int FEATURE_LEFT_ICON;
- public static int FEATURE_MAX;
- public static int FEATURE_NO_TITLE;
- public static int FEATURE_OPTIONS_PANEL;
- public static int FEATURE_PROGRESS;
- public static int FEATURE_RIGHT_ICON;
- public static int FEATURE_SWIPE_TO_DISMISS;
- public static int ID_ANDROID_CONTENT;
- public static java.lang.String NAVIGATION_BAR_BACKGROUND_TRANSITION_NAME;
- public static int PROGRESS_END;
- public static int PROGRESS_INDETERMINATE_OFF;
- public static int PROGRESS_INDETERMINATE_ON;
- public static int PROGRESS_SECONDARY_END;
- public static int PROGRESS_SECONDARY_START;
- public static int PROGRESS_START;
- public static int PROGRESS_VISIBILITY_OFF;
- public static int PROGRESS_VISIBILITY_ON;
- public static java.lang.String STATUS_BAR_BACKGROUND_TRANSITION_NAME;
-}
-
--keep class android.view.Window$Callback {
-
- public abstract boolean dispatchGenericMotionEvent(android.view.MotionEvent);
- public abstract boolean dispatchKeyEvent(android.view.KeyEvent);
- public abstract boolean dispatchKeyShortcutEvent(android.view.KeyEvent);
- public abstract boolean dispatchPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
- public abstract boolean dispatchTouchEvent(android.view.MotionEvent);
- public abstract boolean dispatchTrackballEvent(android.view.MotionEvent);
- public abstract void onActionModeFinished(android.view.ActionMode);
- public abstract void onActionModeStarted(android.view.ActionMode);
- public abstract void onAttachedToWindow();
- public abstract void onContentChanged();
- public abstract boolean onCreatePanelMenu(int, android.view.Menu);
- public abstract android.view.View onCreatePanelView(int);
- public abstract void onDetachedFromWindow();
- public abstract boolean onMenuItemSelected(int, android.view.MenuItem);
- public abstract boolean onMenuOpened(int, android.view.Menu);
- public abstract void onPanelClosed(int, android.view.Menu);
- public void onPointerCaptureChanged(boolean);
- public abstract boolean onPreparePanel(int, android.view.View, android.view.Menu);
- public void onProvideKeyboardShortcuts(java.util.List, android.view.Menu, int);
- public abstract boolean onSearchRequested();
- public abstract boolean onSearchRequested(android.view.SearchEvent);
- public abstract void onWindowAttributesChanged(android.view.WindowManager$LayoutParams);
- public abstract void onWindowFocusChanged(boolean);
- public abstract android.view.ActionMode onWindowStartingActionMode(android.view.ActionMode$Callback);
- public abstract android.view.ActionMode onWindowStartingActionMode(android.view.ActionMode$Callback, int);
-
-
-}
-
--keep class android.view.Window$OnFrameMetricsAvailableListener {
-
- public abstract void onFrameMetricsAvailable(android.view.Window, android.view.FrameMetrics, int);
-
-
-}
-
--keep class android.view.Window$OnRestrictedCaptionAreaChangedListener {
-
- public abstract void onRestrictedCaptionAreaChanged(android.graphics.Rect);
-
-
-}
-
--keep class android.view.Window$OnWindowDismissedCallback {
-
- public abstract void onWindowDismissed(boolean, boolean);
-
-
-}
-
--keep class android.view.Window$OnWindowSwipeDismissedCallback {
-
- public abstract void onWindowSwipeDismissed();
-
-
-}
-
--keep class android.view.Window$WindowControllerCallback {
-
- public abstract void enterPictureInPictureModeIfPossible();
- public abstract void exitFreeformMode();
- public abstract boolean isTaskRoot();
-
-
-}
-
--keep class android.view.WindowAnimationFrameStats {
- <init>();
-
- public int describeContents();
- public void init(long, long[]);
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.view.WindowCallbacks {
-
- public abstract boolean onContentDrawn(int, int, int, int);
- public abstract void onPostDraw(android.view.DisplayListCanvas);
- public abstract void onRequestDraw(boolean);
- public abstract void onWindowDragResizeEnd();
- public abstract void onWindowDragResizeStart(android.graphics.Rect, boolean, android.graphics.Rect, android.graphics.Rect, int);
- public abstract void onWindowSizeIsChanging(android.graphics.Rect, boolean, android.graphics.Rect, android.graphics.Rect);
-
-
- public static int RESIZE_MODE_DOCKED_DIVIDER;
- public static int RESIZE_MODE_FREEFORM;
- public static int RESIZE_MODE_INVALID;
-}
-
--keep class android.view.WindowContentFrameStats {
- <init>();
-
- public int describeContents();
- public long getFramePostedTimeNano(int);
- public long getFrameReadyTimeNano(int);
- public void init(long, long[], long[], long[]);
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.view.WindowId {
- <init>(android.view.IWindowId);
- <init>(android.os.IBinder);
-
- public int describeContents();
- public boolean equals(java.lang.Object);
- public android.view.IWindowId getTarget();
- public int hashCode();
- public boolean isFocused();
- public void registerFocusObserver(android.view.WindowId$FocusObserver);
- public java.lang.String toString();
- public void unregisterFocusObserver(android.view.WindowId$FocusObserver);
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.view.WindowId$FocusObserver {
- <init>();
-
- public abstract void onFocusGained(android.view.WindowId);
- public abstract void onFocusLost(android.view.WindowId);
-
-
-}
-
--keep class android.view.WindowInsets {
- <init>(android.graphics.Rect, android.graphics.Rect, android.graphics.Rect, boolean, boolean, android.view.DisplayCutout);
- <init>(android.view.WindowInsets);
- <init>(android.graphics.Rect);
-
- public android.view.WindowInsets consumeDisplayCutout();
- public android.view.WindowInsets consumeStableInsets();
- public android.view.WindowInsets consumeSystemWindowInsets();
- public android.view.WindowInsets consumeSystemWindowInsets(boolean, boolean, boolean, boolean);
- public android.view.WindowInsets consumeWindowDecorInsets();
- public android.view.WindowInsets consumeWindowDecorInsets(boolean, boolean, boolean, boolean);
- public boolean equals(java.lang.Object);
- public android.view.DisplayCutout getDisplayCutout();
- public int getStableInsetBottom();
- public int getStableInsetLeft();
- public int getStableInsetRight();
- public int getStableInsetTop();
- public int getSystemWindowInsetBottom();
- public int getSystemWindowInsetLeft();
- public int getSystemWindowInsetRight();
- public int getSystemWindowInsetTop();
- public android.graphics.Rect getSystemWindowInsets();
- public int getWindowDecorInsetBottom();
- public int getWindowDecorInsetLeft();
- public int getWindowDecorInsetRight();
- public int getWindowDecorInsetTop();
- public boolean hasInsets();
- public boolean hasStableInsets();
- public boolean hasSystemWindowInsets();
- public boolean hasWindowDecorInsets();
- public int hashCode();
- public android.view.WindowInsets inset(android.graphics.Rect);
- public android.view.WindowInsets inset(int, int, int, int);
- public boolean isConsumed();
- public boolean isRound();
- public android.view.WindowInsets replaceSystemWindowInsets(int, int, int, int);
- public android.view.WindowInsets replaceSystemWindowInsets(android.graphics.Rect);
- public android.view.WindowInsets replaceWindowDecorInsets(int, int, int, int);
- public boolean shouldAlwaysConsumeNavBar();
- public java.lang.String toString();
-
-
- public static android.view.WindowInsets CONSUMED;
-}
-
--keep class android.view.WindowManager {
-
- public abstract android.graphics.Region getCurrentImeTouchRegion();
- public abstract android.view.Display getDefaultDisplay();
- public abstract void removeViewImmediate(android.view.View);
- public abstract void requestAppKeyboardShortcuts(android.view.WindowManager$KeyboardShortcutsReceiver, int);
-
-
- public static int DOCKED_BOTTOM;
- public static int DOCKED_INVALID;
- public static int DOCKED_LEFT;
- public static int DOCKED_RIGHT;
- public static int DOCKED_TOP;
- public static java.lang.String INPUT_CONSUMER_NAVIGATION;
- public static java.lang.String INPUT_CONSUMER_PIP;
- public static java.lang.String INPUT_CONSUMER_RECENTS_ANIMATION;
- public static java.lang.String INPUT_CONSUMER_WALLPAPER;
- public static java.lang.String PARCEL_KEY_SHORTCUTS_ARRAY;
- public static int TAKE_SCREENSHOT_FULLSCREEN;
- public static int TAKE_SCREENSHOT_SELECTED_REGION;
- public static int TRANSIT_ACTIVITY_CLOSE;
- public static int TRANSIT_ACTIVITY_OPEN;
- public static int TRANSIT_ACTIVITY_RELAUNCH;
- public static int TRANSIT_CRASHING_ACTIVITY_CLOSE;
- public static int TRANSIT_DOCK_TASK_FROM_RECENTS;
- public static int TRANSIT_FLAG_KEYGUARD_GOING_AWAY_NO_ANIMATION;
- public static int TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE;
- public static int TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER;
- public static int TRANSIT_KEYGUARD_GOING_AWAY;
- public static int TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER;
- public static int TRANSIT_KEYGUARD_OCCLUDE;
- public static int TRANSIT_KEYGUARD_UNOCCLUDE;
- public static int TRANSIT_NONE;
- public static int TRANSIT_TASK_CLOSE;
- public static int TRANSIT_TASK_IN_PLACE;
- public static int TRANSIT_TASK_OPEN;
- public static int TRANSIT_TASK_OPEN_BEHIND;
- public static int TRANSIT_TASK_TO_BACK;
- public static int TRANSIT_TASK_TO_FRONT;
- public static int TRANSIT_TRANSLUCENT_ACTIVITY_CLOSE;
- public static int TRANSIT_TRANSLUCENT_ACTIVITY_OPEN;
- public static int TRANSIT_UNSET;
- public static int TRANSIT_WALLPAPER_CLOSE;
- public static int TRANSIT_WALLPAPER_INTRA_CLOSE;
- public static int TRANSIT_WALLPAPER_INTRA_OPEN;
- public static int TRANSIT_WALLPAPER_OPEN;
-}
-
--keep class android.view.WindowManager$KeyboardShortcutsReceiver {
-
- public abstract void onKeyboardShortcutsReceived(java.util.List);
-
-
-}
-
--keep class android.view.WindowManager$LayoutParams {
- <init>();
- <init>(int);
- <init>(int, int);
- <init>(int, int, int);
- <init>(int, int, int, int, int);
- <init>(int, int, int, int, int, int, int);
- <init>(android.os.Parcel);
-
- public int copyFrom(android.view.WindowManager$LayoutParams);
- public java.lang.String debug(java.lang.String);
- public int describeContents();
- public void dumpDimensions(java.lang.StringBuilder);
- protected void encodeProperties(android.view.ViewHierarchyEncoder);
- public int getColorMode();
- public java.lang.CharSequence getTitle();
- public long getUserActivityTimeout();
- public boolean isFullscreen();
- public static boolean isSystemAlertWindowType(int);
- public static boolean mayUseInputMethod(int);
- public void scale(float);
- public void setColorMode(int);
- public void setSurfaceInsets(android.view.View, boolean, boolean);
- public void setTitle(java.lang.CharSequence);
- public void setUserActivityTimeout(long);
- public java.lang.String toString();
- public java.lang.String toString(java.lang.String);
- public void writeToParcel(android.os.Parcel, int);
- public void writeToProto(android.util.proto.ProtoOutputStream, long);
-
-
- public static int ACCESSIBILITY_ANCHOR_CHANGED;
- public static int ACCESSIBILITY_TITLE_CHANGED;
- public static int ALPHA_CHANGED;
- public static int ANIMATION_CHANGED;
- public static float BRIGHTNESS_OVERRIDE_FULL;
- public static float BRIGHTNESS_OVERRIDE_NONE;
- public static float BRIGHTNESS_OVERRIDE_OFF;
- public static int BUTTON_BRIGHTNESS_CHANGED;
- public static int COLOR_MODE_CHANGED;
- public static android.os.Parcelable$Creator CREATOR;
- public static int DIM_AMOUNT_CHANGED;
- public static int EVERYTHING_CHANGED;
- public static int FIRST_APPLICATION_WINDOW;
- public static int FIRST_SUB_WINDOW;
- public static int FIRST_SYSTEM_WINDOW;
- public static int FLAGS_CHANGED;
- public static int FLAG_ALLOW_LOCK_WHILE_SCREEN_ON;
- public static int FLAG_ALT_FOCUSABLE_IM;
- public static int FLAG_BLUR_BEHIND;
- public static int FLAG_DIM_BEHIND;
- public static int FLAG_DISMISS_KEYGUARD;
- public static int FLAG_DITHER;
- public static int FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS;
- public static int FLAG_FORCE_NOT_FULLSCREEN;
- public static int FLAG_FULLSCREEN;
- public static int FLAG_HARDWARE_ACCELERATED;
- public static int FLAG_IGNORE_CHEEK_PRESSES;
- public static int FLAG_KEEP_SCREEN_ON;
- public static int FLAG_LAYOUT_ATTACHED_IN_DECOR;
- public static int FLAG_LAYOUT_INSET_DECOR;
- public static int FLAG_LAYOUT_IN_OVERSCAN;
- public static int FLAG_LAYOUT_IN_SCREEN;
- public static int FLAG_LAYOUT_NO_LIMITS;
- public static int FLAG_LOCAL_FOCUS_MODE;
- public static int FLAG_NOT_FOCUSABLE;
- public static int FLAG_NOT_TOUCHABLE;
- public static int FLAG_NOT_TOUCH_MODAL;
- public static int FLAG_SCALED;
- public static int FLAG_SECURE;
- public static int FLAG_SHOW_WALLPAPER;
- public static int FLAG_SHOW_WHEN_LOCKED;
- public static int FLAG_SLIPPERY;
- public static int FLAG_SPLIT_TOUCH;
- public static int FLAG_TOUCHABLE_WHEN_WAKING;
- public static int FLAG_TRANSLUCENT_NAVIGATION;
- public static int FLAG_TRANSLUCENT_STATUS;
- public static int FLAG_TURN_SCREEN_ON;
- public static int FLAG_WATCH_OUTSIDE_TOUCH;
- public static int FORMAT_CHANGED;
- public static int INPUT_FEATURES_CHANGED;
- public static int INPUT_FEATURE_DISABLE_POINTER_GESTURES;
- public static int INPUT_FEATURE_DISABLE_USER_ACTIVITY;
- public static int INPUT_FEATURE_NO_INPUT_CHANNEL;
- public static int INVALID_WINDOW_TYPE;
- public static int LAST_APPLICATION_WINDOW;
- public static int LAST_SUB_WINDOW;
- public static int LAST_SYSTEM_WINDOW;
- public static int LAYOUT_CHANGED;
- public static int LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
- public static int LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT;
- public static int LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER;
- public static int LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
- public static int MEMORY_TYPE_CHANGED;
- public static int MEMORY_TYPE_GPU;
- public static int MEMORY_TYPE_HARDWARE;
- public static int MEMORY_TYPE_NORMAL;
- public static int MEMORY_TYPE_PUSH_BUFFERS;
- public static int NEEDS_MENU_KEY_CHANGED;
- public static int NEEDS_MENU_SET_FALSE;
- public static int NEEDS_MENU_SET_TRUE;
- public static int NEEDS_MENU_UNSET;
- public static int PREFERRED_DISPLAY_MODE_ID;
- public static int PREFERRED_REFRESH_RATE_CHANGED;
- public static int PRIVATE_FLAGS_CHANGED;
- public static int PRIVATE_FLAG_ACQUIRES_SLEEP_TOKEN;
- public static int PRIVATE_FLAG_COMPATIBLE_WINDOW;
- public static int PRIVATE_FLAG_DISABLE_WALLPAPER_TOUCH_EVENTS;
- public static int PRIVATE_FLAG_FAKE_HARDWARE_ACCELERATED;
- public static int PRIVATE_FLAG_FORCE_DECOR_VIEW_VISIBILITY;
- public static int PRIVATE_FLAG_FORCE_DRAW_STATUS_BAR_BACKGROUND;
- public static int PRIVATE_FLAG_FORCE_HARDWARE_ACCELERATED;
- public static int PRIVATE_FLAG_FORCE_STATUS_BAR_VISIBLE_TRANSPARENT;
- public static int PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
- public static int PRIVATE_FLAG_INHERIT_TRANSLUCENT_DECOR;
- public static int PRIVATE_FLAG_IS_ROUNDED_CORNERS_OVERLAY;
- public static int PRIVATE_FLAG_IS_SCREEN_DECOR;
- public static int PRIVATE_FLAG_KEYGUARD;
- public static int PRIVATE_FLAG_LAYOUT_CHILD_WINDOW_IN_PARENT_FRAME;
- public static int PRIVATE_FLAG_NO_MOVE_ANIMATION;
- public static int PRIVATE_FLAG_PRESERVE_GEOMETRY;
- public static int PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
- public static int PRIVATE_FLAG_SUSTAINED_PERFORMANCE_MODE;
- public static int PRIVATE_FLAG_SYSTEM_ERROR;
- public static int PRIVATE_FLAG_WANTS_OFFSET_NOTIFICATIONS;
- public static int PRIVATE_FLAG_WILL_NOT_REPLACE_ON_RELAUNCH;
- public static int ROTATION_ANIMATION_CHANGED;
- public static int ROTATION_ANIMATION_CROSSFADE;
- public static int ROTATION_ANIMATION_JUMPCUT;
- public static int ROTATION_ANIMATION_ROTATE;
- public static int ROTATION_ANIMATION_SEAMLESS;
- public static int ROTATION_ANIMATION_UNSPECIFIED;
- public static int SCREEN_BRIGHTNESS_CHANGED;
- public static int SCREEN_ORIENTATION_CHANGED;
- public static int SOFT_INPUT_ADJUST_NOTHING;
- public static int SOFT_INPUT_ADJUST_PAN;
- public static int SOFT_INPUT_ADJUST_RESIZE;
- public static int SOFT_INPUT_ADJUST_UNSPECIFIED;
- public static int SOFT_INPUT_IS_FORWARD_NAVIGATION;
- public static int SOFT_INPUT_MASK_ADJUST;
- public static int SOFT_INPUT_MASK_STATE;
- public static int SOFT_INPUT_MODE_CHANGED;
- public static int SOFT_INPUT_STATE_ALWAYS_HIDDEN;
- public static int SOFT_INPUT_STATE_ALWAYS_VISIBLE;
- public static int SOFT_INPUT_STATE_HIDDEN;
- public static int SOFT_INPUT_STATE_UNCHANGED;
- public static int SOFT_INPUT_STATE_UNSPECIFIED;
- public static int SOFT_INPUT_STATE_VISIBLE;
- public static int SURFACE_INSETS_CHANGED;
- public static int SYSTEM_UI_LISTENER_CHANGED;
- public static int SYSTEM_UI_VISIBILITY_CHANGED;
- public static int TITLE_CHANGED;
- public static int TRANSLUCENT_FLAGS_CHANGED;
- public static int TYPE_ACCESSIBILITY_OVERLAY;
- public static int TYPE_APPLICATION;
- public static int TYPE_APPLICATION_ABOVE_SUB_PANEL;
- public static int TYPE_APPLICATION_ATTACHED_DIALOG;
- public static int TYPE_APPLICATION_MEDIA;
- public static int TYPE_APPLICATION_MEDIA_OVERLAY;
- public static int TYPE_APPLICATION_OVERLAY;
- public static int TYPE_APPLICATION_PANEL;
- public static int TYPE_APPLICATION_STARTING;
- public static int TYPE_APPLICATION_SUB_PANEL;
- public static int TYPE_BASE_APPLICATION;
- public static int TYPE_BOOT_PROGRESS;
- public static int TYPE_CHANGED;
- public static int TYPE_DISPLAY_OVERLAY;
- public static int TYPE_DOCK_DIVIDER;
- public static int TYPE_DRAG;
- public static int TYPE_DRAWN_APPLICATION;
- public static int TYPE_DREAM;
- public static int TYPE_INPUT_CONSUMER;
- public static int TYPE_INPUT_METHOD;
- public static int TYPE_INPUT_METHOD_DIALOG;
- public static int TYPE_KEYGUARD;
- public static int TYPE_KEYGUARD_DIALOG;
- public static int TYPE_MAGNIFICATION_OVERLAY;
- public static int TYPE_NAVIGATION_BAR;
- public static int TYPE_NAVIGATION_BAR_PANEL;
- public static int TYPE_PHONE;
- public static int TYPE_POINTER;
- public static int TYPE_PRESENTATION;
- public static int TYPE_PRIORITY_PHONE;
- public static int TYPE_PRIVATE_PRESENTATION;
- public static int TYPE_QS_DIALOG;
- public static int TYPE_SCREENSHOT;
- public static int TYPE_SEARCH_BAR;
- public static int TYPE_SECURE_SYSTEM_OVERLAY;
- public static int TYPE_STATUS_BAR;
- public static int TYPE_STATUS_BAR_PANEL;
- public static int TYPE_STATUS_BAR_SUB_PANEL;
- public static int TYPE_SYSTEM_ALERT;
- public static int TYPE_SYSTEM_DIALOG;
- public static int TYPE_SYSTEM_ERROR;
- public static int TYPE_SYSTEM_OVERLAY;
- public static int TYPE_TOAST;
- public static int TYPE_VOICE_INTERACTION;
- public static int TYPE_VOICE_INTERACTION_STARTING;
- public static int TYPE_VOLUME_OVERLAY;
- public static int TYPE_WALLPAPER;
- public static int USER_ACTIVITY_TIMEOUT_CHANGED;
- public long accessibilityIdOfAnchor;
- public java.lang.CharSequence accessibilityTitle;
- public float alpha;
- public float buttonBrightness;
- public float dimAmount;
- public int flags;
- public int format;
- public int gravity;
- public boolean hasManualSurfaceInsets;
- public boolean hasSystemUiListeners;
- public long hideTimeoutMilliseconds;
- public float horizontalMargin;
- public float horizontalWeight;
- public int inputFeatures;
- public int layoutInDisplayCutoutMode;
- public int memoryType;
- public int needsMenuKey;
- public java.lang.String packageName;
- public int preferredDisplayModeId;
- public float preferredRefreshRate;
- public boolean preservePreviousSurfaceInsets;
- public int privateFlags;
- public int rotationAnimation;
- public float screenBrightness;
- public int screenOrientation;
- public int softInputMode;
- public int subtreeSystemUiVisibility;
- public android.graphics.Rect surfaceInsets;
- public int systemUiVisibility;
- public android.os.IBinder token;
- public int type;
- public long userActivityTimeout;
- public float verticalMargin;
- public float verticalWeight;
- public int windowAnimations;
- public int x;
- public int y;
-}
-
--keep class android.view.accessibility.AccessibilityEvent {
-
- public void appendRecord(android.view.accessibility.AccessibilityRecord);
- protected void clear();
- public int describeContents();
- public static java.lang.String eventTypeToString(int);
- public int getAction();
- public int getContentChangeTypes();
- public long getEventTime();
- public int getEventType();
- public int getMovementGranularity();
- public java.lang.CharSequence getPackageName();
- public android.view.accessibility.AccessibilityRecord getRecord(int);
- public int getRecordCount();
- public int getWindowChanges();
- public void initFromParcel(android.os.Parcel);
- public static android.view.accessibility.AccessibilityEvent obtain(int);
- public static android.view.accessibility.AccessibilityEvent obtain(android.view.accessibility.AccessibilityEvent);
- public static android.view.accessibility.AccessibilityEvent obtain();
- public static android.view.accessibility.AccessibilityEvent obtainWindowsChangedEvent(int, int);
- public void recycle();
- public void setAction(int);
- public void setContentChangeTypes(int);
- public void setEventTime(long);
- public void setEventType(int);
- public void setMovementGranularity(int);
- public void setPackageName(java.lang.CharSequence);
- public void setSealed(boolean);
- public void setWindowChanges(int);
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static int CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION;
- public static int CONTENT_CHANGE_TYPE_PANE_APPEARED;
- public static int CONTENT_CHANGE_TYPE_PANE_DISAPPEARED;
- public static int CONTENT_CHANGE_TYPE_PANE_TITLE;
- public static int CONTENT_CHANGE_TYPE_SUBTREE;
- public static int CONTENT_CHANGE_TYPE_TEXT;
- public static int CONTENT_CHANGE_TYPE_UNDEFINED;
- public static android.os.Parcelable$Creator CREATOR;
- public static boolean DEBUG_ORIGIN;
- public static int INVALID_POSITION;
- public static int MAX_TEXT_LENGTH;
- public static int TYPES_ALL_MASK;
- public static int TYPE_ANNOUNCEMENT;
- public static int TYPE_ASSIST_READING_CONTEXT;
- public static int TYPE_GESTURE_DETECTION_END;
- public static int TYPE_GESTURE_DETECTION_START;
- public static int TYPE_NOTIFICATION_STATE_CHANGED;
- public static int TYPE_TOUCH_EXPLORATION_GESTURE_END;
- public static int TYPE_TOUCH_EXPLORATION_GESTURE_START;
- public static int TYPE_TOUCH_INTERACTION_END;
- public static int TYPE_TOUCH_INTERACTION_START;
- public static int TYPE_VIEW_ACCESSIBILITY_FOCUSED;
- public static int TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED;
- public static int TYPE_VIEW_CLICKED;
- public static int TYPE_VIEW_CONTEXT_CLICKED;
- public static int TYPE_VIEW_FOCUSED;
- public static int TYPE_VIEW_HOVER_ENTER;
- public static int TYPE_VIEW_HOVER_EXIT;
- public static int TYPE_VIEW_LONG_CLICKED;
- public static int TYPE_VIEW_SCROLLED;
- public static int TYPE_VIEW_SELECTED;
- public static int TYPE_VIEW_TEXT_CHANGED;
- public static int TYPE_VIEW_TEXT_SELECTION_CHANGED;
- public static int TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY;
- public static int TYPE_WINDOWS_CHANGED;
- public static int TYPE_WINDOW_CONTENT_CHANGED;
- public static int TYPE_WINDOW_STATE_CHANGED;
- public static int WINDOWS_CHANGE_ACCESSIBILITY_FOCUSED;
- public static int WINDOWS_CHANGE_ACTIVE;
- public static int WINDOWS_CHANGE_ADDED;
- public static int WINDOWS_CHANGE_BOUNDS;
- public static int WINDOWS_CHANGE_CHILDREN;
- public static int WINDOWS_CHANGE_FOCUSED;
- public static int WINDOWS_CHANGE_LAYER;
- public static int WINDOWS_CHANGE_PARENT;
- public static int WINDOWS_CHANGE_PIP;
- public static int WINDOWS_CHANGE_REMOVED;
- public static int WINDOWS_CHANGE_TITLE;
- public java.lang.StackTraceElement[] originStackTrace;
-}
-
--keep class android.view.accessibility.AccessibilityNodeInfo {
-
- public void addAction(android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction);
- public void addAction(int);
- public void addChild(android.view.View);
- public void addChild(android.view.View, int);
- public void addChildUnchecked(android.view.View);
- public boolean canOpenPopup();
- public int describeContents();
- protected void enforceNotSealed();
- protected void enforceSealed();
- public boolean equals(java.lang.Object);
- public java.util.List findAccessibilityNodeInfosByText(java.lang.String);
- public java.util.List findAccessibilityNodeInfosByViewId(java.lang.String);
- public android.view.accessibility.AccessibilityNodeInfo findFocus(int);
- public android.view.accessibility.AccessibilityNodeInfo focusSearch(int);
- public static int getAccessibilityViewId(long);
- public java.util.List getActionList();
- public int getActions();
- public java.util.List getAvailableExtraData();
- public void getBoundsInParent(android.graphics.Rect);
- public void getBoundsInScreen(android.graphics.Rect);
- public android.graphics.Rect getBoundsInScreen();
- public android.view.accessibility.AccessibilityNodeInfo getChild(int);
- public int getChildCount();
- public long getChildId(int);
- public android.util.LongArray getChildNodeIds();
- public java.lang.CharSequence getClassName();
- public android.view.accessibility.AccessibilityNodeInfo$CollectionInfo getCollectionInfo();
- public android.view.accessibility.AccessibilityNodeInfo$CollectionItemInfo getCollectionItemInfo();
- public int getConnectionId();
- public java.lang.CharSequence getContentDescription();
- public int getDrawingOrder();
- public java.lang.CharSequence getError();
- public android.os.Bundle getExtras();
- public java.lang.CharSequence getHintText();
- public int getInputType();
- public android.view.accessibility.AccessibilityNodeInfo getLabelFor();
- public android.view.accessibility.AccessibilityNodeInfo getLabeledBy();
- public int getLiveRegion();
- public int getMaxTextLength();
- public int getMovementGranularities();
- public java.lang.CharSequence getOriginalText();
- public java.lang.CharSequence getPackageName();
- public java.lang.CharSequence getPaneTitle();
- public android.view.accessibility.AccessibilityNodeInfo getParent();
- public long getParentNodeId();
- public android.view.accessibility.AccessibilityNodeInfo$RangeInfo getRangeInfo();
- public long getSourceNodeId();
- public java.lang.CharSequence getText();
- public int getTextSelectionEnd();
- public int getTextSelectionStart();
- public java.lang.CharSequence getTooltipText();
- public android.view.accessibility.AccessibilityNodeInfo getTraversalAfter();
- public android.view.accessibility.AccessibilityNodeInfo getTraversalBefore();
- public java.lang.String getViewIdResourceName();
- public static int getVirtualDescendantId(long);
- public android.view.accessibility.AccessibilityWindowInfo getWindow();
- public int getWindowId();
- public boolean hasExtras();
- public int hashCode();
- public static java.lang.String idToString(long);
- public boolean isAccessibilityFocused();
- public boolean isCheckable();
- public boolean isChecked();
- public boolean isClickable();
- public boolean isContentInvalid();
- public boolean isContextClickable();
- public boolean isDismissable();
- public boolean isEditable();
- public boolean isEnabled();
- public boolean isFocusable();
- public boolean isFocused();
- public boolean isHeading();
- public boolean isImportantForAccessibility();
- public boolean isLongClickable();
- public boolean isMultiLine();
- public boolean isPassword();
- public boolean isScreenReaderFocusable();
- public boolean isScrollable();
- public boolean isSealed();
- public boolean isSelected();
- public boolean isShowingHintText();
- public boolean isVisibleToUser();
- public static long makeNodeId(int, int);
- public static android.view.accessibility.AccessibilityNodeInfo obtain(android.view.View);
- public static android.view.accessibility.AccessibilityNodeInfo obtain(android.view.View, int);
- public static android.view.accessibility.AccessibilityNodeInfo obtain();
- public static android.view.accessibility.AccessibilityNodeInfo obtain(android.view.accessibility.AccessibilityNodeInfo);
- public boolean performAction(int);
- public boolean performAction(int, android.os.Bundle);
- public void recycle();
- public boolean refresh(android.os.Bundle, boolean);
- public boolean refresh();
- public boolean refreshWithExtraData(java.lang.String, android.os.Bundle);
- public void removeAction(int);
- public boolean removeAction(android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction);
- public void removeAllActions();
- public boolean removeChild(android.view.View);
- public boolean removeChild(android.view.View, int);
- public void setAccessibilityFocused(boolean);
- public void setAvailableExtraData(java.util.List);
- public void setBoundsInParent(android.graphics.Rect);
- public void setBoundsInScreen(android.graphics.Rect);
- public void setCanOpenPopup(boolean);
- public void setCheckable(boolean);
- public void setChecked(boolean);
- public void setClassName(java.lang.CharSequence);
- public void setClickable(boolean);
- public void setCollectionInfo(android.view.accessibility.AccessibilityNodeInfo$CollectionInfo);
- public void setCollectionItemInfo(android.view.accessibility.AccessibilityNodeInfo$CollectionItemInfo);
- public void setConnectionId(int);
- public void setContentDescription(java.lang.CharSequence);
- public void setContentInvalid(boolean);
- public void setContextClickable(boolean);
- public void setDismissable(boolean);
- public void setDrawingOrder(int);
- public void setEditable(boolean);
- public void setEnabled(boolean);
- public void setError(java.lang.CharSequence);
- public void setFocusable(boolean);
- public void setFocused(boolean);
- public void setHeading(boolean);
- public void setHintText(java.lang.CharSequence);
- public void setImportantForAccessibility(boolean);
- public void setInputType(int);
- public void setLabelFor(android.view.View);
- public void setLabelFor(android.view.View, int);
- public void setLabeledBy(android.view.View);
- public void setLabeledBy(android.view.View, int);
- public void setLiveRegion(int);
- public void setLongClickable(boolean);
- public void setMaxTextLength(int);
- public void setMovementGranularities(int);
- public void setMultiLine(boolean);
- public static void setNumInstancesInUseCounter(java.util.concurrent.atomic.AtomicInteger);
- public void setPackageName(java.lang.CharSequence);
- public void setPaneTitle(java.lang.CharSequence);
- public void setParent(android.view.View);
- public void setParent(android.view.View, int);
- public void setPassword(boolean);
- public void setRangeInfo(android.view.accessibility.AccessibilityNodeInfo$RangeInfo);
- public void setScreenReaderFocusable(boolean);
- public void setScrollable(boolean);
- public void setSealed(boolean);
- public void setSelected(boolean);
- public void setShowingHintText(boolean);
- public void setSource(android.view.View);
- public void setSource(android.view.View, int);
- public void setSourceNodeId(long, int);
- public void setText(java.lang.CharSequence);
- public void setTextSelection(int, int);
- public void setTooltipText(java.lang.CharSequence);
- public void setTraversalAfter(android.view.View);
- public void setTraversalAfter(android.view.View, int);
- public void setTraversalBefore(android.view.View);
- public void setTraversalBefore(android.view.View, int);
- public void setViewIdResourceName(java.lang.String);
- public void setVisibleToUser(boolean);
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
- public void writeToParcelNoRecycle(android.os.Parcel, int);
-
-
- public static int ACTION_ACCESSIBILITY_FOCUS;
- public static java.lang.String ACTION_ARGUMENT_ACCESSIBLE_CLICKABLE_SPAN;
- public static java.lang.String ACTION_ARGUMENT_COLUMN_INT;
- public static java.lang.String ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN;
- public static java.lang.String ACTION_ARGUMENT_HTML_ELEMENT_STRING;
- public static java.lang.String ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT;
- public static java.lang.String ACTION_ARGUMENT_MOVE_WINDOW_X;
- public static java.lang.String ACTION_ARGUMENT_MOVE_WINDOW_Y;
- public static java.lang.String ACTION_ARGUMENT_PROGRESS_VALUE;
- public static java.lang.String ACTION_ARGUMENT_ROW_INT;
- public static java.lang.String ACTION_ARGUMENT_SELECTION_END_INT;
- public static java.lang.String ACTION_ARGUMENT_SELECTION_START_INT;
- public static java.lang.String ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE;
- public static int ACTION_CLEAR_ACCESSIBILITY_FOCUS;
- public static int ACTION_CLEAR_FOCUS;
- public static int ACTION_CLEAR_SELECTION;
- public static int ACTION_CLICK;
- public static int ACTION_COLLAPSE;
- public static int ACTION_COPY;
- public static int ACTION_CUT;
- public static int ACTION_DISMISS;
- public static int ACTION_EXPAND;
- public static int ACTION_FOCUS;
- public static int ACTION_LONG_CLICK;
- public static int ACTION_NEXT_AT_MOVEMENT_GRANULARITY;
- public static int ACTION_NEXT_HTML_ELEMENT;
- public static int ACTION_PASTE;
- public static int ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY;
- public static int ACTION_PREVIOUS_HTML_ELEMENT;
- public static int ACTION_SCROLL_BACKWARD;
- public static int ACTION_SCROLL_FORWARD;
- public static int ACTION_SELECT;
- public static int ACTION_SET_SELECTION;
- public static int ACTION_SET_TEXT;
- public static android.os.Parcelable$Creator CREATOR;
- public static java.lang.String EXTRA_DATA_REQUESTED_KEY;
- public static java.lang.String EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_LENGTH;
- public static java.lang.String EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_START_INDEX;
- public static java.lang.String EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY;
- public static int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS;
- public static int FLAG_PREFETCH_DESCENDANTS;
- public static int FLAG_PREFETCH_PREDECESSORS;
- public static int FLAG_PREFETCH_SIBLINGS;
- public static int FLAG_REPORT_VIEW_IDS;
- public static int FOCUS_ACCESSIBILITY;
- public static int FOCUS_INPUT;
- public static int LAST_LEGACY_STANDARD_ACTION;
- public static int MOVEMENT_GRANULARITY_CHARACTER;
- public static int MOVEMENT_GRANULARITY_LINE;
- public static int MOVEMENT_GRANULARITY_PAGE;
- public static int MOVEMENT_GRANULARITY_PARAGRAPH;
- public static int MOVEMENT_GRANULARITY_WORD;
- public static int ROOT_ITEM_ID;
- public static long ROOT_NODE_ID;
- public static int UNDEFINED_CONNECTION_ID;
- public static int UNDEFINED_ITEM_ID;
- public static long UNDEFINED_NODE_ID;
- public static int UNDEFINED_SELECTION_INDEX;
-}
-
--keep class android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction {
- <init>(int, java.lang.CharSequence);
-
- public boolean equals(java.lang.Object);
- public int getId();
- public java.lang.CharSequence getLabel();
- public int hashCode();
- public java.lang.String toString();
-
-
- public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_ACCESSIBILITY_FOCUS;
- public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_CLEAR_ACCESSIBILITY_FOCUS;
- public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_CLEAR_FOCUS;
- public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_CLEAR_SELECTION;
- public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_CLICK;
- public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_COLLAPSE;
- public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_CONTEXT_CLICK;
- public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_COPY;
- public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_CUT;
- public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_DISMISS;
- public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_EXPAND;
- public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_FOCUS;
- public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_HIDE_TOOLTIP;
- public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_LONG_CLICK;
- public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_MOVE_WINDOW;
- public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_NEXT_AT_MOVEMENT_GRANULARITY;
- public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_NEXT_HTML_ELEMENT;
- public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_PASTE;
- public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY;
- public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_PREVIOUS_HTML_ELEMENT;
- public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_SCROLL_BACKWARD;
- public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_SCROLL_DOWN;
- public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_SCROLL_FORWARD;
- public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_SCROLL_LEFT;
- public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_SCROLL_RIGHT;
- public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_SCROLL_TO_POSITION;
- public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_SCROLL_UP;
- public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_SELECT;
- public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_SET_PROGRESS;
- public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_SET_SELECTION;
- public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_SET_TEXT;
- public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_SHOW_ON_SCREEN;
- public static android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction ACTION_SHOW_TOOLTIP;
- public long mSerializationFlag;
- public static android.util.ArraySet sStandardActions;
-}
-
--keep class android.view.accessibility.AccessibilityNodeInfo$CollectionInfo {
-
- public int getColumnCount();
- public int getRowCount();
- public int getSelectionMode();
- public boolean isHierarchical();
- public static android.view.accessibility.AccessibilityNodeInfo$CollectionInfo obtain(android.view.accessibility.AccessibilityNodeInfo$CollectionInfo);
- public static android.view.accessibility.AccessibilityNodeInfo$CollectionInfo obtain(int, int, boolean);
- public static android.view.accessibility.AccessibilityNodeInfo$CollectionInfo obtain(int, int, boolean, int);
-
-
- public static int SELECTION_MODE_MULTIPLE;
- public static int SELECTION_MODE_NONE;
- public static int SELECTION_MODE_SINGLE;
-}
-
--keep class android.view.accessibility.AccessibilityNodeInfo$CollectionItemInfo {
-
- public int getColumnIndex();
- public int getColumnSpan();
- public int getRowIndex();
- public int getRowSpan();
- public boolean isHeading();
- public boolean isSelected();
- public static android.view.accessibility.AccessibilityNodeInfo$CollectionItemInfo obtain(android.view.accessibility.AccessibilityNodeInfo$CollectionItemInfo);
- public static android.view.accessibility.AccessibilityNodeInfo$CollectionItemInfo obtain(int, int, int, int, boolean);
- public static android.view.accessibility.AccessibilityNodeInfo$CollectionItemInfo obtain(int, int, int, int, boolean, boolean);
-
-
-}
-
--keep class android.view.accessibility.AccessibilityNodeInfo$RangeInfo {
-
- public float getCurrent();
- public float getMax();
- public float getMin();
- public int getType();
- public static android.view.accessibility.AccessibilityNodeInfo$RangeInfo obtain(android.view.accessibility.AccessibilityNodeInfo$RangeInfo);
- public static android.view.accessibility.AccessibilityNodeInfo$RangeInfo obtain(int, float, float, float);
-
-
- public static int RANGE_TYPE_FLOAT;
- public static int RANGE_TYPE_INT;
- public static int RANGE_TYPE_PERCENT;
-}
-
--keep class android.view.accessibility.AccessibilityNodeProvider {
- <init>();
-
- public void addExtraDataToAccessibilityNodeInfo(int, android.view.accessibility.AccessibilityNodeInfo, java.lang.String, android.os.Bundle);
- public android.view.accessibility.AccessibilityNodeInfo createAccessibilityNodeInfo(int);
- public java.util.List findAccessibilityNodeInfosByText(java.lang.String, int);
- public android.view.accessibility.AccessibilityNodeInfo findFocus(int);
- public boolean performAction(int, int, android.os.Bundle);
-
-
- public static int HOST_VIEW_ID;
-}
-
--keep class android.view.accessibility.AccessibilityRecord {
-
- public int getAddedCount();
- public java.lang.CharSequence getBeforeText();
- public java.lang.CharSequence getClassName();
- public java.lang.CharSequence getContentDescription();
- public int getCurrentItemIndex();
- public int getFromIndex();
- public int getItemCount();
- public int getMaxScrollX();
- public int getMaxScrollY();
- public android.os.Parcelable getParcelableData();
- public int getRemovedCount();
- public int getScrollDeltaX();
- public int getScrollDeltaY();
- public int getScrollX();
- public int getScrollY();
- public android.view.accessibility.AccessibilityNodeInfo getSource();
- public long getSourceNodeId();
- public java.util.List getText();
- public int getToIndex();
- public int getWindowId();
- public boolean isChecked();
- public boolean isEnabled();
- public boolean isFullScreen();
- public boolean isImportantForAccessibility();
- public boolean isPassword();
- public boolean isScrollable();
- public static android.view.accessibility.AccessibilityRecord obtain(android.view.accessibility.AccessibilityRecord);
- public static android.view.accessibility.AccessibilityRecord obtain();
- public void recycle();
- public void setAddedCount(int);
- public void setBeforeText(java.lang.CharSequence);
- public void setChecked(boolean);
- public void setClassName(java.lang.CharSequence);
- public void setConnectionId(int);
- public void setContentDescription(java.lang.CharSequence);
- public void setCurrentItemIndex(int);
- public void setEnabled(boolean);
- public void setFromIndex(int);
- public void setFullScreen(boolean);
- public void setImportantForAccessibility(boolean);
- public void setItemCount(int);
- public void setMaxScrollX(int);
- public void setMaxScrollY(int);
- public void setParcelableData(android.os.Parcelable);
- public void setPassword(boolean);
- public void setRemovedCount(int);
- public void setScrollDeltaX(int);
- public void setScrollDeltaY(int);
- public void setScrollX(int);
- public void setScrollY(int);
- public void setScrollable(boolean);
- public void setSealed(boolean);
- public void setSource(android.view.View);
- public void setSource(android.view.View, int);
- public void setSourceNodeId(long);
- public void setToIndex(int);
- public void setWindowId(int);
- public java.lang.String toString();
-
-
- protected static boolean DEBUG_CONCISE_TOSTRING;
-}
-
--keep class android.view.accessibility.AccessibilityWindowInfo {
-
- public void addChild(int);
- public boolean changed(android.view.accessibility.AccessibilityWindowInfo);
- public int describeContents();
- public int differenceFrom(android.view.accessibility.AccessibilityWindowInfo);
- public boolean equals(java.lang.Object);
- public android.view.accessibility.AccessibilityNodeInfo getAnchor();
- public void getBoundsInScreen(android.graphics.Rect);
- public android.view.accessibility.AccessibilityWindowInfo getChild(int);
- public int getChildCount();
- public int getId();
- public int getLayer();
- public android.view.accessibility.AccessibilityWindowInfo getParent();
- public android.view.accessibility.AccessibilityNodeInfo getRoot();
- public java.lang.CharSequence getTitle();
- public int getType();
- public int hashCode();
- public boolean isAccessibilityFocused();
- public boolean isActive();
- public boolean isFocused();
- public boolean isInPictureInPictureMode();
- public static android.view.accessibility.AccessibilityWindowInfo obtain();
- public static android.view.accessibility.AccessibilityWindowInfo obtain(android.view.accessibility.AccessibilityWindowInfo);
- public void recycle();
- public void setAccessibilityFocused(boolean);
- public void setActive(boolean);
- public void setAnchorId(long);
- public void setBoundsInScreen(android.graphics.Rect);
- public void setConnectionId(int);
- public void setFocused(boolean);
- public void setId(int);
- public void setLayer(int);
- public static void setNumInstancesInUseCounter(java.util.concurrent.atomic.AtomicInteger);
- public void setParentId(int);
- public void setPictureInPicture(boolean);
- public void setTitle(java.lang.CharSequence);
- public void setType(int);
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static int ACTIVE_WINDOW_ID;
- public static int ANY_WINDOW_ID;
- public static android.os.Parcelable$Creator CREATOR;
- public static int PICTURE_IN_PICTURE_ACTION_REPLACER_WINDOW_ID;
- public static int TYPE_ACCESSIBILITY_OVERLAY;
- public static int TYPE_APPLICATION;
- public static int TYPE_INPUT_METHOD;
- public static int TYPE_SPLIT_SCREEN_DIVIDER;
- public static int TYPE_SYSTEM;
- public static int UNDEFINED_WINDOW_ID;
-}
-
--keep class android.view.accessibility.IAccessibilityInteractionConnectionCallback {
-
- public abstract void setFindAccessibilityNodeInfoResult(android.view.accessibility.AccessibilityNodeInfo, int);
- public abstract void setFindAccessibilityNodeInfosResult(java.util.List, int);
- public abstract void setPerformAccessibilityActionResult(boolean, int);
-
-
-}
-
--keep class android.view.animation.Animation {
- <init>();
- <init>(android.content.Context, android.util.AttributeSet);
-
- protected void applyTransformation(float, android.view.animation.Transformation);
- public void cancel();
- protected android.view.animation.Animation clone();
- protected java.lang.Object clone();
- public long computeDurationHint();
- public void detach();
- protected void ensureInterpolator();
- protected void finalize();
- public int getBackgroundColor();
- public boolean getDetachWallpaper();
- public long getDuration();
- public boolean getFillAfter();
- public boolean getFillBefore();
- public android.view.animation.Interpolator getInterpolator();
- public void getInvalidateRegion(int, int, int, int, android.graphics.RectF, android.view.animation.Transformation);
- public int getRepeatCount();
- public int getRepeatMode();
- protected float getScaleFactor();
- public boolean getShowWallpaper();
- public long getStartOffset();
- public long getStartTime();
- public boolean getTransformation(long, android.view.animation.Transformation);
- public boolean getTransformation(long, android.view.animation.Transformation, float);
- public int getZAdjustment();
- public boolean hasAlpha();
- public boolean hasEnded();
- public boolean hasStarted();
- public void initialize(int, int, int, int);
- public void initializeInvalidateRegion(int, int, int, int);
- public boolean isFillEnabled();
- public boolean isInitialized();
- public void reset();
- protected float resolveSize(int, float, int, int);
- public void restrictDuration(long);
- public void scaleCurrentDuration(float);
- public void setAnimationListener(android.view.animation.Animation$AnimationListener);
- public void setBackgroundColor(int);
- public void setDetachWallpaper(boolean);
- public void setDuration(long);
- public void setFillAfter(boolean);
- public void setFillBefore(boolean);
- public void setFillEnabled(boolean);
- public void setInterpolator(android.content.Context, int);
- public void setInterpolator(android.view.animation.Interpolator);
- public void setListenerHandler(android.os.Handler);
- public void setRepeatCount(int);
- public void setRepeatMode(int);
- public void setShowWallpaper(boolean);
- public void setStartOffset(long);
- public void setStartTime(long);
- public void setZAdjustment(int);
- public void start();
- public void startNow();
- public boolean willChangeBounds();
- public boolean willChangeTransformationMatrix();
-
-
- public static int ABSOLUTE;
- public static int INFINITE;
- public static int RELATIVE_TO_PARENT;
- public static int RELATIVE_TO_SELF;
- public static int RESTART;
- public static int REVERSE;
- public static int START_ON_FIRST_FRAME;
- public static int ZORDER_BOTTOM;
- public static int ZORDER_NORMAL;
- public static int ZORDER_TOP;
-}
-
--keep class android.view.animation.Animation$AnimationListener {
-
- public abstract void onAnimationEnd(android.view.animation.Animation);
- public abstract void onAnimationRepeat(android.view.animation.Animation);
- public abstract void onAnimationStart(android.view.animation.Animation);
-
-
-}
-
--keep class android.view.animation.Interpolator {
-
-
-
-}
-
--keep class android.view.animation.LayoutAnimationController {
- <init>(android.content.Context, android.util.AttributeSet);
- <init>(android.view.animation.Animation);
- <init>(android.view.animation.Animation, float);
-
- public android.view.animation.Animation getAnimation();
- public android.view.animation.Animation getAnimationForView(android.view.View);
- public float getDelay();
- protected long getDelayForView(android.view.View);
- public android.view.animation.Interpolator getInterpolator();
- public int getOrder();
- protected int getTransformedIndex(android.view.animation.LayoutAnimationController$AnimationParameters);
- public boolean isDone();
- public void setAnimation(android.content.Context, int);
- public void setAnimation(android.view.animation.Animation);
- public void setDelay(float);
- public void setInterpolator(android.content.Context, int);
- public void setInterpolator(android.view.animation.Interpolator);
- public void setOrder(int);
- public void start();
- public boolean willOverlap();
-
-
- public static int ORDER_NORMAL;
- public static int ORDER_RANDOM;
- public static int ORDER_REVERSE;
- protected android.view.animation.Animation mAnimation;
- protected android.view.animation.Interpolator mInterpolator;
- protected java.util.Random mRandomizer;
-}
-
--keep class android.view.animation.LayoutAnimationController$AnimationParameters {
- <init>();
-
-
-
- public int count;
- public int index;
-}
-
--keep class android.view.animation.Transformation {
- <init>();
-
- public void clear();
- public void compose(android.view.animation.Transformation);
- public float getAlpha();
- public android.graphics.Rect getClipRect();
- public android.graphics.Matrix getMatrix();
- public int getTransformationType();
- public boolean hasClipRect();
- public void postCompose(android.view.animation.Transformation);
- public void printShortString(java.io.PrintWriter);
- public void set(android.view.animation.Transformation);
- public void setAlpha(float);
- public void setClipRect(android.graphics.Rect);
- public void setClipRect(int, int, int, int);
- public void setTransformationType(int);
- public java.lang.String toShortString();
- public void toShortString(java.lang.StringBuilder);
- public java.lang.String toString();
-
-
- public static int TYPE_ALPHA;
- public static int TYPE_BOTH;
- public static int TYPE_IDENTITY;
- public static int TYPE_MATRIX;
- protected float mAlpha;
- protected android.graphics.Matrix mMatrix;
- protected int mTransformationType;
-}
-
--keep class android.view.autofill.AutofillId {
- <init>(int);
- <init>(android.view.autofill.AutofillId, int);
- <init>(int, int);
-
- public int describeContents();
- public boolean equals(java.lang.Object);
- public int getViewId();
- public int getVirtualChildId();
- public int hashCode();
- public boolean isVirtual();
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.view.autofill.AutofillManager {
- <init>(android.content.Context, android.view.autofill.IAutoFillManager);
-
- public void cancel();
- public void commit();
- public void disableAutofillServices();
- public void disableOwnedAutofillServices();
- public void dump(java.lang.String, java.io.PrintWriter);
- public void enableCompatibilityMode();
- public android.content.ComponentName getAutofillServiceComponentName();
- public java.util.List getAvailableFieldClassificationAlgorithms();
- public static int getDatasetIdFromAuthenticationId(int);
- public java.lang.String getDefaultFieldClassificationAlgorithm();
- public android.service.autofill.FillEventHistory getFillEventHistory();
- public android.view.autofill.AutofillId getNextAutofillId();
- public static int getRequestIdFromAuthenticationId(int);
- public android.service.autofill.UserData getUserData();
- public java.lang.String getUserDataId();
- public boolean hasAutofillFeature();
- public boolean hasEnabledAutofillServices();
- public boolean isAutofillSupported();
- public boolean isAutofillUiShowing();
- public boolean isCompatibilityModeEnabledLocked();
- public boolean isEnabled();
- public boolean isFieldClassificationEnabled();
- public static int makeAuthenticationId(int, int);
- public void notifyValueChanged(android.view.View);
- public void notifyValueChanged(android.view.View, int, android.view.autofill.AutofillValue);
- public void notifyViewClicked(android.view.View);
- public void notifyViewClicked(android.view.View, int);
- public void notifyViewEntered(android.view.View);
- public void notifyViewEntered(android.view.View, int, android.graphics.Rect);
- public void notifyViewExited(android.view.View);
- public void notifyViewExited(android.view.View, int);
- public void notifyViewVisibilityChanged(android.view.View, boolean);
- public void notifyViewVisibilityChanged(android.view.View, int, boolean);
- public void onActivityFinishing();
- public void onAuthenticationResult(int, android.content.Intent, android.view.View);
- public void onCreate(android.os.Bundle);
- public void onInvisibleForAutofill();
- public void onPendingSaveUi(int, android.os.IBinder);
- public void onSaveInstanceState(android.os.Bundle);
- public void onVisibleForAutofill();
- public void registerCallback(android.view.autofill.AutofillManager$AutofillCallback);
- public void requestAutofill(android.view.View);
- public void requestAutofill(android.view.View, int, android.graphics.Rect);
- public void requestHideFillUi();
- public void setUserData(android.service.autofill.UserData);
- public void unregisterCallback(android.view.autofill.AutofillManager$AutofillCallback);
-
-
- public static int ACTION_START_SESSION;
- public static int ACTION_VALUE_CHANGED;
- public static int ACTION_VIEW_ENTERED;
- public static int ACTION_VIEW_EXITED;
- public static int AUTHENTICATION_ID_DATASET_ID_UNDEFINED;
- public static java.lang.String EXTRA_ASSIST_STRUCTURE;
- public static java.lang.String EXTRA_AUTHENTICATION_RESULT;
- public static java.lang.String EXTRA_CLIENT_STATE;
- public static java.lang.String EXTRA_RESTORE_SESSION_TOKEN;
- public static int FC_SERVICE_TIMEOUT;
- public static int FLAG_ADD_CLIENT_DEBUG;
- public static int FLAG_ADD_CLIENT_ENABLED;
- public static int FLAG_ADD_CLIENT_VERBOSE;
- public static int NO_SESSION;
- public static int PENDING_UI_OPERATION_CANCEL;
- public static int PENDING_UI_OPERATION_RESTORE;
- public static int SET_STATE_FLAG_DEBUG;
- public static int SET_STATE_FLAG_ENABLED;
- public static int SET_STATE_FLAG_RESET_CLIENT;
- public static int SET_STATE_FLAG_RESET_SESSION;
- public static int SET_STATE_FLAG_VERBOSE;
- public static int STATE_ACTIVE;
- public static int STATE_DISABLED_BY_SERVICE;
- public static int STATE_FINISHED;
- public static int STATE_SHOWING_SAVE_UI;
- public static int STATE_UNKNOWN;
- public static int STATE_UNKNOWN_COMPAT_MODE;
-}
-
--keep class android.view.autofill.AutofillManager$AutofillCallback {
- <init>();
-
- public void onAutofillEvent(android.view.View, int);
- public void onAutofillEvent(android.view.View, int, int);
-
-
- public static int EVENT_INPUT_HIDDEN;
- public static int EVENT_INPUT_SHOWN;
- public static int EVENT_INPUT_UNAVAILABLE;
-}
-
--keep class android.view.autofill.AutofillManager$AutofillClient {
-
- public abstract void autofillClientAuthenticate(int, android.content.IntentSender, android.content.Intent);
- public abstract void autofillClientDispatchUnhandledKey(android.view.View, android.view.KeyEvent);
- public abstract android.view.View autofillClientFindViewByAccessibilityIdTraversal(int, int);
- public abstract android.view.View autofillClientFindViewByAutofillIdTraversal(android.view.autofill.AutofillId);
- public abstract android.view.View[] autofillClientFindViewsByAutofillIdTraversal(android.view.autofill.AutofillId[]);
- public abstract android.os.IBinder autofillClientGetActivityToken();
- public abstract android.content.ComponentName autofillClientGetComponentName();
- public abstract android.view.autofill.AutofillId autofillClientGetNextAutofillId();
- public abstract boolean[] autofillClientGetViewVisibility(android.view.autofill.AutofillId[]);
- public abstract boolean autofillClientIsCompatibilityModeEnabled();
- public abstract boolean autofillClientIsFillUiShowing();
- public abstract boolean autofillClientIsVisibleForAutofill();
- public abstract boolean autofillClientRequestHideFillUi();
- public abstract boolean autofillClientRequestShowFillUi(android.view.View, int, int, android.graphics.Rect, android.view.autofill.IAutofillWindowPresenter);
- public abstract void autofillClientResetableStateAvailable();
- public abstract void autofillClientRunOnUiThread(java.lang.Runnable);
- public abstract boolean isDisablingEnterExitEventForAutofill();
-
-
-}
-
--keep class android.view.autofill.AutofillValue {
-
- public int describeContents();
- public boolean equals(java.lang.Object);
- public static android.view.autofill.AutofillValue forDate(long);
- public static android.view.autofill.AutofillValue forList(int);
- public static android.view.autofill.AutofillValue forText(java.lang.CharSequence);
- public static android.view.autofill.AutofillValue forToggle(boolean);
- public long getDateValue();
- public int getListValue();
- public java.lang.CharSequence getTextValue();
- public boolean getToggleValue();
- public int hashCode();
- public boolean isDate();
- public boolean isEmpty();
- public boolean isList();
- public boolean isText();
- public boolean isToggle();
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.view.autofill.IAutoFillManager {
-
- public abstract int addClient(android.view.autofill.IAutoFillManagerClient, int);
- public abstract void cancelSession(int, int);
- public abstract void disableOwnedAutofillServices(int);
- public abstract void finishSession(int, int);
- public abstract android.content.ComponentName getAutofillServiceComponentName();
- public abstract java.lang.String[] getAvailableFieldClassificationAlgorithms();
- public abstract java.lang.String getDefaultFieldClassificationAlgorithm();
- public abstract android.service.autofill.FillEventHistory getFillEventHistory();
- public abstract android.service.autofill.UserData getUserData();
- public abstract java.lang.String getUserDataId();
- public abstract boolean isFieldClassificationEnabled();
- public abstract boolean isServiceEnabled(int, java.lang.String);
- public abstract boolean isServiceSupported(int);
- public abstract void onPendingSaveUi(int, android.os.IBinder);
- public abstract void removeClient(android.view.autofill.IAutoFillManagerClient, int);
- public abstract boolean restoreSession(int, android.os.IBinder, android.os.IBinder);
- public abstract void setAuthenticationResult(android.os.Bundle, int, int, int);
- public abstract void setAutofillFailure(int, java.util.List, int);
- public abstract void setHasCallback(int, int, boolean);
- public abstract void setUserData(android.service.autofill.UserData);
- public abstract int startSession(android.os.IBinder, android.os.IBinder, android.view.autofill.AutofillId, android.graphics.Rect, android.view.autofill.AutofillValue, int, boolean, int, android.content.ComponentName, boolean);
- public abstract int updateOrRestartSession(android.os.IBinder, android.os.IBinder, android.view.autofill.AutofillId, android.graphics.Rect, android.view.autofill.AutofillValue, int, boolean, int, android.content.ComponentName, int, int, boolean);
- public abstract void updateSession(int, android.view.autofill.AutofillId, android.graphics.Rect, android.view.autofill.AutofillValue, int, int, int);
-
-
-}
-
--keep class android.view.autofill.IAutoFillManagerClient {
-
- public abstract void authenticate(int, int, android.content.IntentSender, android.content.Intent);
- public abstract void autofill(int, java.util.List, java.util.List);
- public abstract void dispatchUnhandledKey(int, android.view.autofill.AutofillId, android.view.KeyEvent);
- public abstract void notifyNoFillUi(int, android.view.autofill.AutofillId, int);
- public abstract void requestHideFillUi(int, android.view.autofill.AutofillId);
- public abstract void requestShowFillUi(int, android.view.autofill.AutofillId, int, int, android.graphics.Rect, android.view.autofill.IAutofillWindowPresenter);
- public abstract void setSaveUiState(int, boolean);
- public abstract void setSessionFinished(int);
- public abstract void setState(int);
- public abstract void setTrackedViews(int, android.view.autofill.AutofillId[], boolean, boolean, android.view.autofill.AutofillId[], android.view.autofill.AutofillId);
- public abstract void startIntentSender(android.content.IntentSender, android.content.Intent);
-
-
-}
-
--keep class android.view.autofill.IAutofillWindowPresenter {
-
- public abstract void hide(android.graphics.Rect);
- public abstract void show(android.view.WindowManager$LayoutParams, android.graphics.Rect, boolean, int);
-
-
-}
-
--keep class android.view.inputmethod.CompletionInfo {
- <init>(long, int, java.lang.CharSequence);
- <init>(long, int, java.lang.CharSequence, java.lang.CharSequence);
-
- public int describeContents();
- public long getId();
- public java.lang.CharSequence getLabel();
- public int getPosition();
- public java.lang.CharSequence getText();
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.view.inputmethod.CorrectionInfo {
- <init>(int, java.lang.CharSequence, java.lang.CharSequence);
-
- public int describeContents();
- public java.lang.CharSequence getNewText();
- public int getOffset();
- public java.lang.CharSequence getOldText();
- public java.lang.String toString();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.view.inputmethod.EditorInfo {
- <init>();
-
- public int describeContents();
- public void dump(android.util.Printer, java.lang.String);
- public void makeCompatible(int);
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public static int IME_ACTION_DONE;
- public static int IME_ACTION_GO;
- public static int IME_ACTION_NEXT;
- public static int IME_ACTION_NONE;
- public static int IME_ACTION_PREVIOUS;
- public static int IME_ACTION_SEARCH;
- public static int IME_ACTION_SEND;
- public static int IME_ACTION_UNSPECIFIED;
- public static int IME_FLAG_FORCE_ASCII;
- public static int IME_FLAG_NAVIGATE_NEXT;
- public static int IME_FLAG_NAVIGATE_PREVIOUS;
- public static int IME_FLAG_NO_ACCESSORY_ACTION;
- public static int IME_FLAG_NO_ENTER_ACTION;
- public static int IME_FLAG_NO_EXTRACT_UI;
- public static int IME_FLAG_NO_FULLSCREEN;
- public static int IME_FLAG_NO_PERSONALIZED_LEARNING;
- public static int IME_MASK_ACTION;
- public static int IME_NULL;
- public int actionId;
- public java.lang.CharSequence actionLabel;
- public java.lang.String[] contentMimeTypes;
- public android.os.Bundle extras;
- public int fieldId;
- public java.lang.String fieldName;
- public android.os.LocaleList hintLocales;
- public java.lang.CharSequence hintText;
- public int imeOptions;
- public int initialCapsMode;
- public int initialSelEnd;
- public int initialSelStart;
- public int inputType;
- public java.lang.CharSequence label;
- public java.lang.String packageName;
- public java.lang.String privateImeOptions;
-}
-
--keep class android.view.inputmethod.ExtractedText {
- <init>();
-
- public int describeContents();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public static int FLAG_SELECTING;
- public static int FLAG_SINGLE_LINE;
- public int flags;
- public java.lang.CharSequence hint;
- public int partialEndOffset;
- public int partialStartOffset;
- public int selectionEnd;
- public int selectionStart;
- public int startOffset;
- public java.lang.CharSequence text;
-}
-
--keep class android.view.inputmethod.ExtractedTextRequest {
- <init>();
-
- public int describeContents();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public int flags;
- public int hintMaxChars;
- public int hintMaxLines;
- public int token;
-}
-
--keep class android.view.inputmethod.InputConnection {
-
- public abstract boolean beginBatchEdit();
- public abstract boolean clearMetaKeyStates(int);
- public abstract void closeConnection();
- public abstract boolean commitCompletion(android.view.inputmethod.CompletionInfo);
- public abstract boolean commitContent(android.view.inputmethod.InputContentInfo, int, android.os.Bundle);
- public abstract boolean commitCorrection(android.view.inputmethod.CorrectionInfo);
- public abstract boolean commitText(java.lang.CharSequence, int);
- public abstract boolean deleteSurroundingText(int, int);
- public abstract boolean deleteSurroundingTextInCodePoints(int, int);
- public abstract boolean endBatchEdit();
- public abstract boolean finishComposingText();
- public abstract int getCursorCapsMode(int);
- public abstract android.view.inputmethod.ExtractedText getExtractedText(android.view.inputmethod.ExtractedTextRequest, int);
- public abstract android.os.Handler getHandler();
- public abstract java.lang.CharSequence getSelectedText(int);
- public abstract java.lang.CharSequence getTextAfterCursor(int, int);
- public abstract java.lang.CharSequence getTextBeforeCursor(int, int);
- public abstract boolean performContextMenuAction(int);
- public abstract boolean performEditorAction(int);
- public abstract boolean performPrivateCommand(java.lang.String, android.os.Bundle);
- public abstract boolean reportFullscreenMode(boolean);
- public abstract boolean requestCursorUpdates(int);
- public abstract boolean sendKeyEvent(android.view.KeyEvent);
- public abstract boolean setComposingRegion(int, int);
- public abstract boolean setComposingText(java.lang.CharSequence, int);
- public abstract boolean setSelection(int, int);
-
-
- public static int CURSOR_UPDATE_IMMEDIATE;
- public static int CURSOR_UPDATE_MONITOR;
- public static int GET_EXTRACTED_TEXT_MONITOR;
- public static int GET_TEXT_WITH_STYLES;
- public static int INPUT_CONTENT_GRANT_READ_URI_PERMISSION;
-}
-
--keep class android.view.inputmethod.InputContentInfo {
- <init>(android.net.Uri, android.content.ClipDescription);
- <init>(android.net.Uri, android.content.ClipDescription, android.net.Uri);
-
- public int describeContents();
- public android.net.Uri getContentUri();
- public android.content.ClipDescription getDescription();
- public android.net.Uri getLinkUri();
- public void releasePermission();
- public void requestPermission();
- public boolean validate();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
-}
-
--keep class android.widget.ActionMenuPresenter {
- <init>(android.content.Context);
-
- public void bindItemView(com.android.internal.view.menu.MenuItemImpl, com.android.internal.view.menu.MenuView$ItemView);
- public boolean dismissPopupMenus();
- public boolean filterLeftoverView(android.view.ViewGroup, int);
- public boolean flagActionItems();
- public android.view.View getItemView(com.android.internal.view.menu.MenuItemImpl, android.view.View, android.view.ViewGroup);
- public com.android.internal.view.menu.MenuView getMenuView(android.view.ViewGroup);
- public android.graphics.drawable.Drawable getOverflowIcon();
- public boolean hideOverflowMenu();
- public boolean hideSubMenus();
- public void initForMenu(android.content.Context, com.android.internal.view.menu.MenuBuilder);
- public boolean isOverflowMenuShowPending();
- public boolean isOverflowMenuShowing();
- public boolean isOverflowReserved();
- public void onCloseMenu(com.android.internal.view.menu.MenuBuilder, boolean);
- public void onConfigurationChanged(android.content.res.Configuration);
- public void onRestoreInstanceState(android.os.Parcelable);
- public android.os.Parcelable onSaveInstanceState();
- public boolean onSubMenuSelected(com.android.internal.view.menu.SubMenuBuilder);
- public void onSubUiVisibilityChanged(boolean);
- public void setExpandedActionViewsExclusive(boolean);
- public void setItemLimit(int);
- public void setMenuView(android.widget.ActionMenuView);
- public void setOverflowIcon(android.graphics.drawable.Drawable);
- public void setReserveOverflow(boolean);
- public void setWidthLimit(int, boolean);
- public boolean shouldIncludeItem(int, com.android.internal.view.menu.MenuItemImpl);
- public boolean showOverflowMenu();
- public void updateMenuView(boolean);
-
-
-}
-
--keep class android.widget.ActionMenuView {
- <init>(android.content.Context);
- <init>(android.content.Context, android.util.AttributeSet);
-
- protected boolean checkLayoutParams(android.view.ViewGroup$LayoutParams);
- public void dismissPopupMenus();
- public boolean dispatchPopulateAccessibilityEventInternal(android.view.accessibility.AccessibilityEvent);
- protected android.widget.ActionMenuView$LayoutParams generateDefaultLayoutParams();
- protected android.widget.LinearLayout$LayoutParams generateDefaultLayoutParams();
- protected android.view.ViewGroup$LayoutParams generateDefaultLayoutParams();
- public android.widget.ActionMenuView$LayoutParams generateLayoutParams(android.util.AttributeSet);
- protected android.widget.ActionMenuView$LayoutParams generateLayoutParams(android.view.ViewGroup$LayoutParams);
- protected android.widget.LinearLayout$LayoutParams generateLayoutParams(android.view.ViewGroup$LayoutParams);
- public android.widget.LinearLayout$LayoutParams generateLayoutParams(android.util.AttributeSet);
- protected android.view.ViewGroup$LayoutParams generateLayoutParams(android.view.ViewGroup$LayoutParams);
- public android.view.ViewGroup$LayoutParams generateLayoutParams(android.util.AttributeSet);
- public android.widget.ActionMenuView$LayoutParams generateOverflowButtonLayoutParams();
- public android.view.Menu getMenu();
- public android.graphics.drawable.Drawable getOverflowIcon();
- public int getPopupTheme();
- public int getWindowAnimations();
- protected boolean hasDividerBeforeChildAt(int);
- public boolean hideOverflowMenu();
- public void initialize(com.android.internal.view.menu.MenuBuilder);
- public boolean invokeItem(com.android.internal.view.menu.MenuItemImpl);
- public boolean isOverflowMenuShowPending();
- public boolean isOverflowMenuShowing();
- public boolean isOverflowReserved();
- public void onConfigurationChanged(android.content.res.Configuration);
- public void onDetachedFromWindow();
- protected void onLayout(boolean, int, int, int, int);
- protected void onMeasure(int, int);
- public com.android.internal.view.menu.MenuBuilder peekMenu();
- public void setExpandedActionViewsExclusive(boolean);
- public void setMenuCallbacks(com.android.internal.view.menu.MenuPresenter$Callback, com.android.internal.view.menu.MenuBuilder$Callback);
- public void setOnMenuItemClickListener(android.widget.ActionMenuView$OnMenuItemClickListener);
- public void setOverflowIcon(android.graphics.drawable.Drawable);
- public void setOverflowReserved(boolean);
- public void setPopupTheme(int);
- public void setPresenter(android.widget.ActionMenuPresenter);
- public boolean showOverflowMenu();
-
-
-}
-
--keep class android.widget.ActionMenuView$LayoutParams {
- <init>(android.content.Context, android.util.AttributeSet);
- <init>(android.view.ViewGroup$LayoutParams);
- <init>(android.widget.ActionMenuView$LayoutParams);
- <init>(int, int);
- <init>(int, int, boolean);
-
- protected void encodeProperties(android.view.ViewHierarchyEncoder);
-
-
- public int cellsUsed;
- public boolean expandable;
- public boolean expanded;
- public int extraPixels;
- public boolean isOverflowButton;
- public boolean preventEdgeOffset;
-}
-
--keep class android.widget.ActionMenuView$OnMenuItemClickListener {
-
- public abstract boolean onMenuItemClick(android.view.MenuItem);
-
-
-}
-
--keep class android.widget.Adapter {
-
- public java.lang.CharSequence[] getAutofillOptions();
- public abstract int getCount();
- public abstract java.lang.Object getItem(int);
- public abstract long getItemId(int);
- public abstract int getItemViewType(int);
- public abstract android.view.View getView(int, android.view.View, android.view.ViewGroup);
- public abstract int getViewTypeCount();
- public abstract boolean hasStableIds();
- public abstract boolean isEmpty();
- public abstract void registerDataSetObserver(android.database.DataSetObserver);
- public abstract void unregisterDataSetObserver(android.database.DataSetObserver);
-
-
- public static int IGNORE_ITEM_VIEW_TYPE;
- public static int NO_SELECTION;
-}
-
--keep class android.widget.AdapterView {
- <init>(android.content.Context);
- <init>(android.content.Context, android.util.AttributeSet);
- <init>(android.content.Context, android.util.AttributeSet, int);
- <init>(android.content.Context, android.util.AttributeSet, int, int);
-
- public void addView(android.view.View);
- public void addView(android.view.View, int);
- public void addView(android.view.View, android.view.ViewGroup$LayoutParams);
- public void addView(android.view.View, int, android.view.ViewGroup$LayoutParams);
- protected boolean canAnimate();
- public boolean dispatchPopulateAccessibilityEventInternal(android.view.accessibility.AccessibilityEvent);
- protected void dispatchRestoreInstanceState(android.util.SparseArray);
- protected void dispatchSaveInstanceState(android.util.SparseArray);
- protected void encodeProperties(android.view.ViewHierarchyEncoder);
- public java.lang.CharSequence getAccessibilityClassName();
- public abstract android.widget.Adapter getAdapter();
- public int getCount();
- public android.view.View getEmptyView();
- public int getFirstVisiblePosition();
- public java.lang.Object getItemAtPosition(int);
- public long getItemIdAtPosition(int);
- public int getLastVisiblePosition();
- public android.widget.AdapterView$OnItemClickListener getOnItemClickListener();
- public android.widget.AdapterView$OnItemLongClickListener getOnItemLongClickListener();
- public android.widget.AdapterView$OnItemSelectedListener getOnItemSelectedListener();
- public int getPositionForView(android.view.View);
- public java.lang.Object getSelectedItem();
- public long getSelectedItemId();
- public int getSelectedItemPosition();
- public abstract android.view.View getSelectedView();
- protected void onDetachedFromWindow();
- public void onInitializeAccessibilityEventInternal(android.view.accessibility.AccessibilityEvent);
- public void onInitializeAccessibilityNodeInfoInternal(android.view.accessibility.AccessibilityNodeInfo);
- protected void onLayout(boolean, int, int, int, int);
- public void onProvideAutofillStructure(android.view.ViewStructure, int);
- public boolean onRequestSendAccessibilityEventInternal(android.view.View, android.view.accessibility.AccessibilityEvent);
- public boolean performItemClick(android.view.View, int, long);
- public void removeAllViews();
- public void removeView(android.view.View);
- public void removeViewAt(int);
- public abstract void setAdapter(android.widget.Adapter);
- public void setEmptyView(android.view.View);
- public void setFocusable(int);
- public void setFocusableInTouchMode(boolean);
- public void setOnClickListener(android.view.View$OnClickListener);
- public void setOnItemClickListener(android.widget.AdapterView$OnItemClickListener);
- public void setOnItemLongClickListener(android.widget.AdapterView$OnItemLongClickListener);
- public void setOnItemSelectedListener(android.widget.AdapterView$OnItemSelectedListener);
- public abstract void setSelection(int);
-
-
- public static int INVALID_POSITION;
- public static long INVALID_ROW_ID;
- public static int ITEM_VIEW_TYPE_HEADER_OR_FOOTER;
- public static int ITEM_VIEW_TYPE_IGNORE;
-}
-
--keep class android.widget.AdapterView$OnItemClickListener {
-
- public abstract void onItemClick(android.widget.AdapterView, android.view.View, int, long);
-
-
-}
-
--keep class android.widget.AdapterView$OnItemLongClickListener {
-
- public abstract boolean onItemLongClick(android.widget.AdapterView, android.view.View, int, long);
-
-
-}
-
--keep class android.widget.AdapterView$OnItemSelectedListener {
-
- public abstract void onItemSelected(android.widget.AdapterView, android.view.View, int, long);
- public abstract void onNothingSelected(android.widget.AdapterView);
-
-
-}
-
--keep class android.widget.FrameLayout {
- <init>(android.content.Context);
- <init>(android.content.Context, android.util.AttributeSet);
- <init>(android.content.Context, android.util.AttributeSet, int);
- <init>(android.content.Context, android.util.AttributeSet, int, int);
-
- protected boolean checkLayoutParams(android.view.ViewGroup$LayoutParams);
- protected void encodeProperties(android.view.ViewHierarchyEncoder);
- protected android.widget.FrameLayout$LayoutParams generateDefaultLayoutParams();
- protected android.view.ViewGroup$LayoutParams generateDefaultLayoutParams();
- public android.widget.FrameLayout$LayoutParams generateLayoutParams(android.util.AttributeSet);
- protected android.view.ViewGroup$LayoutParams generateLayoutParams(android.view.ViewGroup$LayoutParams);
- public android.view.ViewGroup$LayoutParams generateLayoutParams(android.util.AttributeSet);
- public java.lang.CharSequence getAccessibilityClassName();
- public boolean getConsiderGoneChildrenWhenMeasuring();
- public boolean getMeasureAllChildren();
- protected void onLayout(boolean, int, int, int, int);
- protected void onMeasure(int, int);
- public void setForegroundGravity(int);
- public void setMeasureAllChildren(boolean);
- public boolean shouldDelayChildPressedState();
-
-
-}
-
--keep class android.widget.FrameLayout$LayoutParams {
- <init>(android.content.Context, android.util.AttributeSet);
- <init>(int, int);
- <init>(int, int, int);
- <init>(android.view.ViewGroup$LayoutParams);
- <init>(android.view.ViewGroup$MarginLayoutParams);
- <init>(android.widget.FrameLayout$LayoutParams);
-
-
-
- public static int UNSPECIFIED_GRAVITY;
- public int gravity;
-}
-
--keep class android.widget.HorizontalScrollView {
- <init>(android.content.Context);
- <init>(android.content.Context, android.util.AttributeSet);
- <init>(android.content.Context, android.util.AttributeSet, int);
- <init>(android.content.Context, android.util.AttributeSet, int, int);
-
- public void addView(android.view.View);
- public void addView(android.view.View, int);
- public void addView(android.view.View, android.view.ViewGroup$LayoutParams);
- public void addView(android.view.View, int, android.view.ViewGroup$LayoutParams);
- public boolean arrowScroll(int);
- protected int computeHorizontalScrollOffset();
- protected int computeHorizontalScrollRange();
- public void computeScroll();
- protected int computeScrollDeltaToGetChildRectOnScreen(android.graphics.Rect);
- public boolean dispatchKeyEvent(android.view.KeyEvent);
- public void draw(android.graphics.Canvas);
- protected void encodeProperties(android.view.ViewHierarchyEncoder);
- public boolean executeKeyEvent(android.view.KeyEvent);
- public void fling(int);
- public boolean fullScroll(int);
- public java.lang.CharSequence getAccessibilityClassName();
- protected float getLeftFadingEdgeStrength();
- public int getMaxScrollAmount();
- protected float getRightFadingEdgeStrength();
- public boolean isFillViewport();
- public boolean isSmoothScrollingEnabled();
- protected void measureChild(android.view.View, int, int);
- protected void measureChildWithMargins(android.view.View, int, int, int, int);
- public boolean onGenericMotionEvent(android.view.MotionEvent);
- public void onInitializeAccessibilityEventInternal(android.view.accessibility.AccessibilityEvent);
- public void onInitializeAccessibilityNodeInfoInternal(android.view.accessibility.AccessibilityNodeInfo);
- public boolean onInterceptTouchEvent(android.view.MotionEvent);
- protected void onLayout(boolean, int, int, int, int);
- protected void onMeasure(int, int);
- protected void onOverScrolled(int, int, boolean, boolean);
- protected boolean onRequestFocusInDescendants(int, android.graphics.Rect);
- protected void onRestoreInstanceState(android.os.Parcelable);
- protected android.os.Parcelable onSaveInstanceState();
- protected void onSizeChanged(int, int, int, int);
- public boolean onTouchEvent(android.view.MotionEvent);
- public boolean pageScroll(int);
- public boolean performAccessibilityActionInternal(int, android.os.Bundle);
- public void requestChildFocus(android.view.View, android.view.View);
- public boolean requestChildRectangleOnScreen(android.view.View, android.graphics.Rect, boolean);
- public void requestDisallowInterceptTouchEvent(boolean);
- public void requestLayout();
- public void scrollTo(int, int);
- public void setFillViewport(boolean);
- public void setOverScrollMode(int);
- public void setSmoothScrollingEnabled(boolean);
- public boolean shouldDelayChildPressedState();
- public void smoothScrollBy(int, int);
- public void smoothScrollTo(int, int);
-
-
-}
-
--keep class android.widget.LinearLayout {
- <init>(android.content.Context);
- <init>(android.content.Context, android.util.AttributeSet);
- <init>(android.content.Context, android.util.AttributeSet, int);
- <init>(android.content.Context, android.util.AttributeSet, int, int);
-
- protected boolean checkLayoutParams(android.view.ViewGroup$LayoutParams);
- protected void encodeProperties(android.view.ViewHierarchyEncoder);
- protected android.widget.LinearLayout$LayoutParams generateDefaultLayoutParams();
- protected android.view.ViewGroup$LayoutParams generateDefaultLayoutParams();
- public android.widget.LinearLayout$LayoutParams generateLayoutParams(android.util.AttributeSet);
- protected android.widget.LinearLayout$LayoutParams generateLayoutParams(android.view.ViewGroup$LayoutParams);
- protected android.view.ViewGroup$LayoutParams generateLayoutParams(android.view.ViewGroup$LayoutParams);
- public android.view.ViewGroup$LayoutParams generateLayoutParams(android.util.AttributeSet);
- public java.lang.CharSequence getAccessibilityClassName();
- public int getBaseline();
- public int getBaselineAlignedChildIndex();
- public android.graphics.drawable.Drawable getDividerDrawable();
- public int getDividerPadding();
- public int getDividerWidth();
- public int getGravity();
- public int getOrientation();
- public int getShowDividers();
- public float getWeightSum();
- protected boolean hasDividerBeforeChildAt(int);
- public boolean isBaselineAligned();
- public boolean isMeasureWithLargestChildEnabled();
- protected void onDraw(android.graphics.Canvas);
- protected void onLayout(boolean, int, int, int, int);
- protected void onMeasure(int, int);
- public void onRtlPropertiesChanged(int);
- public void setBaselineAligned(boolean);
- public void setBaselineAlignedChildIndex(int);
- public void setDividerDrawable(android.graphics.drawable.Drawable);
- public void setDividerPadding(int);
- public void setGravity(int);
- public void setHorizontalGravity(int);
- public void setMeasureWithLargestChildEnabled(boolean);
- public void setOrientation(int);
- public void setShowDividers(int);
- public void setVerticalGravity(int);
- public void setWeightSum(float);
- public boolean shouldDelayChildPressedState();
-
-
- public static int HORIZONTAL;
- public static int SHOW_DIVIDER_BEGINNING;
- public static int SHOW_DIVIDER_END;
- public static int SHOW_DIVIDER_MIDDLE;
- public static int SHOW_DIVIDER_NONE;
- public static int VERTICAL;
-}
-
--keep class android.widget.LinearLayout$LayoutParams {
- <init>(android.content.Context, android.util.AttributeSet);
- <init>(int, int);
- <init>(int, int, float);
- <init>(android.view.ViewGroup$LayoutParams);
- <init>(android.view.ViewGroup$MarginLayoutParams);
- <init>(android.widget.LinearLayout$LayoutParams);
-
- public java.lang.String debug(java.lang.String);
- protected void encodeProperties(android.view.ViewHierarchyEncoder);
-
-
- public int gravity;
- public float weight;
-}
-
--keep class android.widget.RemoteViews {
- <init>(java.lang.String, int);
- <init>(java.lang.String, int, int);
- <init>(android.content.pm.ApplicationInfo, int);
- <init>(android.widget.RemoteViews, android.widget.RemoteViews);
- <init>(android.widget.RemoteViews);
- <init>(android.os.Parcel);
-
- public void addView(int, android.widget.RemoteViews);
- public void addView(int, android.widget.RemoteViews, int);
- public android.view.View apply(android.content.Context, android.view.ViewGroup);
- public android.view.View apply(android.content.Context, android.view.ViewGroup, android.widget.RemoteViews$OnClickHandler);
- public android.os.CancellationSignal applyAsync(android.content.Context, android.view.ViewGroup, java.util.concurrent.Executor, android.widget.RemoteViews$OnViewAppliedListener);
- public android.os.CancellationSignal applyAsync(android.content.Context, android.view.ViewGroup, java.util.concurrent.Executor, android.widget.RemoteViews$OnViewAppliedListener, android.widget.RemoteViews$OnClickHandler);
- public android.widget.RemoteViews clone();
- public java.lang.Object clone();
- public int describeContents();
- public int estimateMemoryUsage();
- public int getLayoutId();
- public java.lang.String getPackage();
- public int getSequenceNumber();
- public boolean hasSameAppInfo(android.content.pm.ApplicationInfo);
- public boolean isReapplyDisallowed();
- public void mergeRemoteViews(android.widget.RemoteViews);
- public boolean onLoadClass(java.lang.Class);
- public void overrideTextColors(int);
- public boolean prefersAsyncApply();
- public void reapply(android.content.Context, android.view.View);
- public void reapply(android.content.Context, android.view.View, android.widget.RemoteViews$OnClickHandler);
- public android.os.CancellationSignal reapplyAsync(android.content.Context, android.view.View, java.util.concurrent.Executor, android.widget.RemoteViews$OnViewAppliedListener);
- public android.os.CancellationSignal reapplyAsync(android.content.Context, android.view.View, java.util.concurrent.Executor, android.widget.RemoteViews$OnViewAppliedListener, android.widget.RemoteViews$OnClickHandler);
- public void reduceImageSizes(int, int);
- public void removeAllViews(int);
- public void removeAllViewsExceptId(int, int);
- public void setAccessibilityTraversalAfter(int, int);
- public void setAccessibilityTraversalBefore(int, int);
- public void setApplyTheme(int);
- public void setBitmap(int, java.lang.String, android.graphics.Bitmap);
- public void setBoolean(int, java.lang.String, boolean);
- public void setBundle(int, java.lang.String, android.os.Bundle);
- public void setByte(int, java.lang.String, byte);
- public void setChar(int, java.lang.String, char);
- public void setCharSequence(int, java.lang.String, java.lang.CharSequence);
- public void setChronometer(int, long, java.lang.String, boolean);
- public void setChronometerCountDown(int, boolean);
- public void setColorStateList(int, java.lang.String, android.content.res.ColorStateList);
- public void setContentDescription(int, java.lang.CharSequence);
- public void setDisplayedChild(int, int);
- public void setDouble(int, java.lang.String, double);
- public void setDrawableTint(int, boolean, int, android.graphics.PorterDuff$Mode);
- public void setEmptyView(int, int);
- public void setFloat(int, java.lang.String, float);
- public void setIcon(int, java.lang.String, android.graphics.drawable.Icon);
- public void setImageViewBitmap(int, android.graphics.Bitmap);
- public void setImageViewIcon(int, android.graphics.drawable.Icon);
- public void setImageViewResource(int, int);
- public void setImageViewUri(int, android.net.Uri);
- public void setInt(int, java.lang.String, int);
- public void setIntent(int, java.lang.String, android.content.Intent);
- public void setLabelFor(int, int);
- public void setLong(int, java.lang.String, long);
- public void setOnClickFillInIntent(int, android.content.Intent);
- public void setOnClickPendingIntent(int, android.app.PendingIntent);
- public void setPendingIntentTemplate(int, android.app.PendingIntent);
- public void setProgressBackgroundTintList(int, android.content.res.ColorStateList);
- public void setProgressBar(int, int, int, boolean);
- public void setProgressIndeterminateTintList(int, android.content.res.ColorStateList);
- public void setProgressTintList(int, android.content.res.ColorStateList);
- public void setReapplyDisallowed();
- public void setRelativeScrollPosition(int, int);
- public void setRemoteAdapter(int, int, android.content.Intent);
- public void setRemoteAdapter(int, android.content.Intent);
- public void setRemoteAdapter(int, java.util.ArrayList, int);
- public void setRemoteInputs(int, android.app.RemoteInput[]);
- public void setScrollPosition(int, int);
- public void setShort(int, java.lang.String, short);
- public void setString(int, java.lang.String, java.lang.String);
- public void setTextColor(int, int);
- public void setTextColor(int, android.content.res.ColorStateList);
- public void setTextViewCompoundDrawables(int, int, int, int, int);
- public void setTextViewCompoundDrawables(int, android.graphics.drawable.Icon, android.graphics.drawable.Icon, android.graphics.drawable.Icon, android.graphics.drawable.Icon);
- public void setTextViewCompoundDrawablesRelative(int, int, int, int, int);
- public void setTextViewCompoundDrawablesRelative(int, android.graphics.drawable.Icon, android.graphics.drawable.Icon, android.graphics.drawable.Icon, android.graphics.drawable.Icon);
- public void setTextViewText(int, java.lang.CharSequence);
- public void setTextViewTextSize(int, int, float);
- public void setUri(int, java.lang.String, android.net.Uri);
- public void setViewLayoutMarginBottomDimen(int, int);
- public void setViewLayoutMarginEnd(int, int);
- public void setViewLayoutMarginEndDimen(int, int);
- public void setViewLayoutWidth(int, int);
- public void setViewPadding(int, int, int, int, int);
- public void setViewVisibility(int, int);
- public void showNext(int);
- public void showPrevious(int);
- public void visitUris(java.util.function.Consumer);
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public android.content.pm.ApplicationInfo mApplication;
-}
-
--keep class android.widget.RemoteViews$OnClickHandler {
- <init>();
-
- public boolean onClickHandler(android.view.View, android.app.PendingIntent, android.content.Intent);
- public boolean onClickHandler(android.view.View, android.app.PendingIntent, android.content.Intent, int);
- public void setEnterAnimationId(int);
-
-
-}
-
--keep class android.widget.RemoteViews$OnViewAppliedListener {
-
- public abstract void onError(java.lang.Exception);
- public abstract void onViewApplied(android.view.View);
-
-
-}
-
--keep class android.widget.SpinnerAdapter {
-
- public abstract android.view.View getDropDownView(int, android.view.View, android.view.ViewGroup);
-
-
-}
-
--keep class android.widget.Toolbar {
- <init>(android.content.Context);
- <init>(android.content.Context, android.util.AttributeSet);
- <init>(android.content.Context, android.util.AttributeSet, int);
- <init>(android.content.Context, android.util.AttributeSet, int, int);
-
- public boolean canShowOverflowMenu();
- protected boolean checkLayoutParams(android.view.ViewGroup$LayoutParams);
- public void collapseActionView();
- public void dismissPopupMenus();
- protected android.widget.Toolbar$LayoutParams generateDefaultLayoutParams();
- protected android.view.ViewGroup$LayoutParams generateDefaultLayoutParams();
- public android.widget.Toolbar$LayoutParams generateLayoutParams(android.util.AttributeSet);
- protected android.widget.Toolbar$LayoutParams generateLayoutParams(android.view.ViewGroup$LayoutParams);
- protected android.view.ViewGroup$LayoutParams generateLayoutParams(android.view.ViewGroup$LayoutParams);
- public android.view.ViewGroup$LayoutParams generateLayoutParams(android.util.AttributeSet);
- public int getContentInsetEnd();
- public int getContentInsetEndWithActions();
- public int getContentInsetLeft();
- public int getContentInsetRight();
- public int getContentInsetStart();
- public int getContentInsetStartWithNavigation();
- public int getCurrentContentInsetEnd();
- public int getCurrentContentInsetLeft();
- public int getCurrentContentInsetRight();
- public int getCurrentContentInsetStart();
- public android.graphics.drawable.Drawable getLogo();
- public java.lang.CharSequence getLogoDescription();
- public android.view.Menu getMenu();
- public java.lang.CharSequence getNavigationContentDescription();
- public android.graphics.drawable.Drawable getNavigationIcon();
- public android.view.View getNavigationView();
- public android.graphics.drawable.Drawable getOverflowIcon();
- public int getPopupTheme();
- public java.lang.CharSequence getSubtitle();
- public java.lang.CharSequence getTitle();
- public int getTitleMarginBottom();
- public int getTitleMarginEnd();
- public int getTitleMarginStart();
- public int getTitleMarginTop();
- public com.android.internal.widget.DecorToolbar getWrapper();
- public boolean hasExpandedActionView();
- public boolean hideOverflowMenu();
- public void inflateMenu(int);
- public boolean isOverflowMenuShowPending();
- public boolean isOverflowMenuShowing();
- public boolean isTitleTruncated();
- protected void onAttachedToWindow();
- protected void onDetachedFromWindow();
- protected void onLayout(boolean, int, int, int, int);
- protected void onMeasure(int, int);
- protected void onRestoreInstanceState(android.os.Parcelable);
- public void onRtlPropertiesChanged(int);
- protected android.os.Parcelable onSaveInstanceState();
- protected void onSetLayoutParams(android.view.View, android.view.ViewGroup$LayoutParams);
- public boolean onTouchEvent(android.view.MotionEvent);
- public void setCollapsible(boolean);
- public void setContentInsetEndWithActions(int);
- public void setContentInsetStartWithNavigation(int);
- public void setContentInsetsAbsolute(int, int);
- public void setContentInsetsRelative(int, int);
- public void setLogo(int);
- public void setLogo(android.graphics.drawable.Drawable);
- public void setLogoDescription(int);
- public void setLogoDescription(java.lang.CharSequence);
- public void setMenu(com.android.internal.view.menu.MenuBuilder, android.widget.ActionMenuPresenter);
- public void setMenuCallbacks(com.android.internal.view.menu.MenuPresenter$Callback, com.android.internal.view.menu.MenuBuilder$Callback);
- public void setNavigationContentDescription(int);
- public void setNavigationContentDescription(java.lang.CharSequence);
- public void setNavigationIcon(int);
- public void setNavigationIcon(android.graphics.drawable.Drawable);
- public void setNavigationOnClickListener(android.view.View$OnClickListener);
- public void setOnMenuItemClickListener(android.widget.Toolbar$OnMenuItemClickListener);
- public void setOverflowIcon(android.graphics.drawable.Drawable);
- public void setPopupTheme(int);
- public void setSubtitle(int);
- public void setSubtitle(java.lang.CharSequence);
- public void setSubtitleTextAppearance(android.content.Context, int);
- public void setSubtitleTextColor(int);
- public void setTitle(int);
- public void setTitle(java.lang.CharSequence);
- public void setTitleMargin(int, int, int, int);
- public void setTitleMarginBottom(int);
- public void setTitleMarginEnd(int);
- public void setTitleMarginStart(int);
- public void setTitleMarginTop(int);
- public void setTitleTextAppearance(android.content.Context, int);
- public void setTitleTextColor(int);
- public boolean showOverflowMenu();
-
-
-}
-
--keep class android.widget.Toolbar$LayoutParams {
- <init>(android.content.Context, android.util.AttributeSet);
- <init>(int, int);
- <init>(int, int, int);
- <init>(int);
- <init>(android.widget.Toolbar$LayoutParams);
- <init>(android.app.ActionBar$LayoutParams);
- <init>(android.view.ViewGroup$MarginLayoutParams);
- <init>(android.view.ViewGroup$LayoutParams);
-
-
-
-}
-
--keep class android.widget.Toolbar$OnMenuItemClickListener {
-
- public abstract boolean onMenuItemClick(android.view.MenuItem);
-
-
-}
-
--keep class com.android.internal.app.IAppOpsActiveCallback {
-
- public abstract void opActiveChanged(int, int, java.lang.String, boolean);
-
-
-}
-
--keep class com.android.internal.app.IAppOpsCallback {
-
- public abstract void opChanged(int, int, java.lang.String);
-
-
-}
-
--keep class com.android.internal.app.IAppOpsService {
-
- public abstract int checkAudioOperation(int, int, int, java.lang.String);
- public abstract int checkOperation(int, int, java.lang.String);
- public abstract int checkPackage(int, java.lang.String);
- public abstract void finishOperation(android.os.IBinder, int, int, java.lang.String);
- public abstract java.util.List getOpsForPackage(int, java.lang.String, int[]);
- public abstract java.util.List getPackagesForOps(int[]);
- public abstract android.os.IBinder getToken(android.os.IBinder);
- public abstract java.util.List getUidOps(int, int[]);
- public abstract boolean isOperationActive(int, int, java.lang.String);
- public abstract int noteOperation(int, int, java.lang.String);
- public abstract int noteProxyOperation(int, java.lang.String, int, java.lang.String);
- public abstract int permissionToOpCode(java.lang.String);
- public abstract void removeUser(int);
- public abstract void resetAllModes(int, java.lang.String);
- public abstract void setAudioRestriction(int, int, int, int, java.lang.String[]);
- public abstract void setMode(int, int, java.lang.String, int);
- public abstract void setUidMode(int, int, int);
- public abstract void setUserRestriction(int, boolean, android.os.IBinder, int, java.lang.String[]);
- public abstract void setUserRestrictions(android.os.Bundle, android.os.IBinder, int);
- public abstract int startOperation(android.os.IBinder, int, int, java.lang.String, boolean);
- public abstract void startWatchingActive(int[], com.android.internal.app.IAppOpsActiveCallback);
- public abstract void startWatchingMode(int, java.lang.String, com.android.internal.app.IAppOpsCallback);
- public abstract void startWatchingModeWithFlags(int, java.lang.String, int, com.android.internal.app.IAppOpsCallback);
- public abstract void stopWatchingActive(com.android.internal.app.IAppOpsActiveCallback);
- public abstract void stopWatchingMode(com.android.internal.app.IAppOpsCallback);
-
-
-}
-
--keep class com.android.internal.app.IVoiceInteractionSessionShowCallback {
-
- public abstract void onFailed();
- public abstract void onShown();
-
-
-}
-
--keep class com.android.internal.app.IVoiceInteractor {
-
- public abstract com.android.internal.app.IVoiceInteractorRequest startAbortVoice(java.lang.String, com.android.internal.app.IVoiceInteractorCallback, android.app.VoiceInteractor$Prompt, android.os.Bundle);
- public abstract com.android.internal.app.IVoiceInteractorRequest startCommand(java.lang.String, com.android.internal.app.IVoiceInteractorCallback, java.lang.String, android.os.Bundle);
- public abstract com.android.internal.app.IVoiceInteractorRequest startCompleteVoice(java.lang.String, com.android.internal.app.IVoiceInteractorCallback, android.app.VoiceInteractor$Prompt, android.os.Bundle);
- public abstract com.android.internal.app.IVoiceInteractorRequest startConfirmation(java.lang.String, com.android.internal.app.IVoiceInteractorCallback, android.app.VoiceInteractor$Prompt, android.os.Bundle);
- public abstract com.android.internal.app.IVoiceInteractorRequest startPickOption(java.lang.String, com.android.internal.app.IVoiceInteractorCallback, android.app.VoiceInteractor$Prompt, android.app.VoiceInteractor$PickOptionRequest$Option[], android.os.Bundle);
- public abstract boolean[] supportsCommands(java.lang.String, java.lang.String[]);
-
-
-}
-
--keep class com.android.internal.app.IVoiceInteractorCallback {
-
- public abstract void deliverAbortVoiceResult(com.android.internal.app.IVoiceInteractorRequest, android.os.Bundle);
- public abstract void deliverCancel(com.android.internal.app.IVoiceInteractorRequest);
- public abstract void deliverCommandResult(com.android.internal.app.IVoiceInteractorRequest, boolean, android.os.Bundle);
- public abstract void deliverCompleteVoiceResult(com.android.internal.app.IVoiceInteractorRequest, android.os.Bundle);
- public abstract void deliverConfirmationResult(com.android.internal.app.IVoiceInteractorRequest, boolean, android.os.Bundle);
- public abstract void deliverPickOptionResult(com.android.internal.app.IVoiceInteractorRequest, boolean, android.app.VoiceInteractor$PickOptionRequest$Option[], android.os.Bundle);
-
-
-}
-
--keep class com.android.internal.app.IVoiceInteractorRequest {
-
- public abstract void cancel();
-
-
-}
-
--keep class com.android.internal.content.ReferrerIntent {
- <init>(android.content.Intent, java.lang.String);
-
- public boolean equals(java.lang.Object);
- public int hashCode();
- public void writeToParcel(android.os.Parcel, int);
-
-
- public static android.os.Parcelable$Creator CREATOR;
- public java.lang.String mReferrer;
-}
-
--keep class com.android.internal.os.IResultReceiver {
-
- public abstract void send(int, android.os.Bundle);
-
-
-}
-
--keep class com.android.internal.policy.IKeyguardDismissCallback {
-
- public abstract void onDismissCancelled();
- public abstract void onDismissError();
- public abstract void onDismissSucceeded();
-
-
-}
-
--keep class com.android.internal.util.FunctionalUtils {
-
- public static java.lang.Runnable handleExceptions(com.android.internal.util.FunctionalUtils$ThrowingRunnable, java.util.function.Consumer);
- public static java.util.function.Consumer ignoreRemoteException(com.android.internal.util.FunctionalUtils$RemoteExceptionIgnoringConsumer);
- public static java.util.function.Consumer uncheckExceptions(com.android.internal.util.FunctionalUtils$ThrowingConsumer);
-
-
-}
-
--keep class com.android.internal.util.FunctionalUtils$RemoteExceptionIgnoringConsumer {
-
- public void accept(java.lang.Object);
- public abstract void acceptOrThrow(java.lang.Object);
-
-
-}
-
--keep class com.android.internal.util.FunctionalUtils$ThrowingConsumer {
-
- public void accept(java.lang.Object);
- public abstract void acceptOrThrow(java.lang.Object);
-
-
-}
-
--keep class com.android.internal.util.FunctionalUtils$ThrowingRunnable {
-
- public void run();
- public abstract void runOrThrow();
-
-
-}
-
--keep class com.android.internal.util.FunctionalUtils$ThrowingSupplier {
-
- public abstract java.lang.Object getOrThrow();
-
-
-}
-
--keep class com.android.internal.util.IndentingPrintWriter {
- <init>(java.io.Writer, java.lang.String);
- <init>(java.io.Writer, java.lang.String, int);
-
- public com.android.internal.util.IndentingPrintWriter decreaseIndent();
- public com.android.internal.util.IndentingPrintWriter increaseIndent();
- public com.android.internal.util.IndentingPrintWriter printHexPair(java.lang.String, int);
- public com.android.internal.util.IndentingPrintWriter printPair(java.lang.String, java.lang.Object);
- public com.android.internal.util.IndentingPrintWriter printPair(java.lang.String, java.lang.Object[]);
- public void println();
- public com.android.internal.util.IndentingPrintWriter setIndent(java.lang.String);
- public com.android.internal.util.IndentingPrintWriter setIndent(int);
- public void write(int);
- public void write(java.lang.String, int, int);
- public void write(char[], int, int);
-
-
-}
-
--keep class com.android.internal.view.IDragAndDropPermissions {
-
- public abstract void release();
- public abstract void take(android.os.IBinder);
- public abstract void takeTransient(android.os.IBinder);
-
-
-}
-
--keep class com.android.internal.view.menu.BaseMenuPresenter {
- <init>(android.content.Context, int, int);
-
- protected void addItemView(android.view.View, int);
- public abstract void bindItemView(com.android.internal.view.menu.MenuItemImpl, com.android.internal.view.menu.MenuView$ItemView);
- public boolean collapseItemActionView(com.android.internal.view.menu.MenuBuilder, com.android.internal.view.menu.MenuItemImpl);
- public com.android.internal.view.menu.MenuView$ItemView createItemView(android.view.ViewGroup);
- public boolean expandItemActionView(com.android.internal.view.menu.MenuBuilder, com.android.internal.view.menu.MenuItemImpl);
- protected boolean filterLeftoverView(android.view.ViewGroup, int);
- public boolean flagActionItems();
- public com.android.internal.view.menu.MenuPresenter$Callback getCallback();
- public int getId();
- public android.view.View getItemView(com.android.internal.view.menu.MenuItemImpl, android.view.View, android.view.ViewGroup);
- public com.android.internal.view.menu.MenuView getMenuView(android.view.ViewGroup);
- public void initForMenu(android.content.Context, com.android.internal.view.menu.MenuBuilder);
- public void onCloseMenu(com.android.internal.view.menu.MenuBuilder, boolean);
- public boolean onSubMenuSelected(com.android.internal.view.menu.SubMenuBuilder);
- public void setCallback(com.android.internal.view.menu.MenuPresenter$Callback);
- public void setId(int);
- public boolean shouldIncludeItem(int, com.android.internal.view.menu.MenuItemImpl);
- public void updateMenuView(boolean);
-
-
- protected android.content.Context mContext;
- protected android.view.LayoutInflater mInflater;
- protected com.android.internal.view.menu.MenuBuilder mMenu;
- protected com.android.internal.view.menu.MenuView mMenuView;
- protected android.content.Context mSystemContext;
- protected android.view.LayoutInflater mSystemInflater;
-}
-
--keep class com.android.internal.view.menu.MenuBuilder {
- <init>(android.content.Context);
-
- public android.view.MenuItem add(java.lang.CharSequence);
- public android.view.MenuItem add(int);
- public android.view.MenuItem add(int, int, int, java.lang.CharSequence);
- public android.view.MenuItem add(int, int, int, int);
- public int addIntentOptions(int, int, int, android.content.ComponentName, android.content.Intent[], android.content.Intent, int, android.view.MenuItem[]);
- public void addMenuPresenter(com.android.internal.view.menu.MenuPresenter);
- public void addMenuPresenter(com.android.internal.view.menu.MenuPresenter, android.content.Context);
- public android.view.SubMenu addSubMenu(java.lang.CharSequence);
- public android.view.SubMenu addSubMenu(int);
- public android.view.SubMenu addSubMenu(int, int, int, java.lang.CharSequence);
- public android.view.SubMenu addSubMenu(int, int, int, int);
- public void changeMenuMode();
- public void clear();
- public void clearAll();
- public void clearHeader();
- public void close(boolean);
- public void close();
- public boolean collapseItemActionView(com.android.internal.view.menu.MenuItemImpl);
- public boolean expandItemActionView(com.android.internal.view.menu.MenuItemImpl);
- public int findGroupIndex(int);
- public int findGroupIndex(int, int);
- public android.view.MenuItem findItem(int);
- public int findItemIndex(int);
- public void flagActionItems();
- public java.util.ArrayList getActionItems();
- protected java.lang.String getActionViewStatesKey();
- public android.content.Context getContext();
- public com.android.internal.view.menu.MenuItemImpl getExpandedItem();
- public android.graphics.drawable.Drawable getHeaderIcon();
- public java.lang.CharSequence getHeaderTitle();
- public android.view.View getHeaderView();
- public android.view.MenuItem getItem(int);
- public java.util.ArrayList getNonActionItems();
- public com.android.internal.view.menu.MenuBuilder getRootMenu();
- public java.util.ArrayList getVisibleItems();
- public boolean hasVisibleItems();
- public boolean isGroupDividerEnabled();
- public boolean isShortcutKey(int, android.view.KeyEvent);
- public boolean isShortcutsVisible();
- public void onItemsChanged(boolean);
- public boolean performIdentifierAction(int, int);
- public boolean performItemAction(android.view.MenuItem, int);
- public boolean performItemAction(android.view.MenuItem, com.android.internal.view.menu.MenuPresenter, int);
- public boolean performShortcut(int, android.view.KeyEvent, int);
- public void removeGroup(int);
- public void removeItem(int);
- public void removeItemAt(int);
- public void removeMenuPresenter(com.android.internal.view.menu.MenuPresenter);
- public void restoreActionViewStates(android.os.Bundle);
- public void restorePresenterStates(android.os.Bundle);
- public void saveActionViewStates(android.os.Bundle);
- public void savePresenterStates(android.os.Bundle);
- public void setCallback(com.android.internal.view.menu.MenuBuilder$Callback);
- public void setCurrentMenuInfo(android.view.ContextMenu$ContextMenuInfo);
- public com.android.internal.view.menu.MenuBuilder setDefaultShowAsAction(int);
- public void setGroupCheckable(int, boolean, boolean);
- public void setGroupDividerEnabled(boolean);
- public void setGroupEnabled(int, boolean);
- public void setGroupVisible(int, boolean);
- protected com.android.internal.view.menu.MenuBuilder setHeaderIconInt(android.graphics.drawable.Drawable);
- protected com.android.internal.view.menu.MenuBuilder setHeaderIconInt(int);
- protected com.android.internal.view.menu.MenuBuilder setHeaderTitleInt(java.lang.CharSequence);
- protected com.android.internal.view.menu.MenuBuilder setHeaderTitleInt(int);
- protected com.android.internal.view.menu.MenuBuilder setHeaderViewInt(android.view.View);
- public void setQwertyMode(boolean);
- public void setShortcutsVisible(boolean);
- public int size();
- public void startDispatchingItemsChanged();
- public void stopDispatchingItemsChanged();
-
-
-}
-
--keep class com.android.internal.view.menu.MenuBuilder$Callback {
-
- public abstract boolean onMenuItemSelected(com.android.internal.view.menu.MenuBuilder, android.view.MenuItem);
- public abstract void onMenuModeChange(com.android.internal.view.menu.MenuBuilder);
-
-
-}
-
--keep class com.android.internal.view.menu.MenuItemImpl {
-
- public void actionFormatChanged();
- public boolean collapseActionView();
- public boolean expandActionView();
- public android.view.ActionProvider getActionProvider();
- public android.view.View getActionView();
- public int getAlphabeticModifiers();
- public char getAlphabeticShortcut();
- public java.lang.CharSequence getContentDescription();
- public int getGroupId();
- public android.graphics.drawable.Drawable getIcon();
- public android.content.res.ColorStateList getIconTintList();
- public android.graphics.PorterDuff$Mode getIconTintMode();
- public android.content.Intent getIntent();
- public int getItemId();
- public android.view.ContextMenu$ContextMenuInfo getMenuInfo();
- public int getNumericModifiers();
- public char getNumericShortcut();
- public int getOrder();
- public int getOrdering();
- public android.view.SubMenu getSubMenu();
- public java.lang.CharSequence getTitle();
- public java.lang.CharSequence getTitleCondensed();
- public java.lang.CharSequence getTooltipText();
- public boolean hasCollapsibleActionView();
- public boolean hasSubMenu();
- public boolean invoke();
- public boolean isActionButton();
- public boolean isActionViewExpanded();
- public boolean isCheckable();
- public boolean isChecked();
- public boolean isEnabled();
- public boolean isExclusiveCheckable();
- public boolean isVisible();
- public boolean requestsActionButton();
- public boolean requiresActionButton();
- public boolean requiresOverflow();
- public android.view.MenuItem setActionProvider(android.view.ActionProvider);
- public android.view.MenuItem setActionView(android.view.View);
- public android.view.MenuItem setActionView(int);
- public void setActionViewExpanded(boolean);
- public android.view.MenuItem setAlphabeticShortcut(char);
- public android.view.MenuItem setAlphabeticShortcut(char, int);
- public android.view.MenuItem setCallback(java.lang.Runnable);
- public android.view.MenuItem setCheckable(boolean);
- public android.view.MenuItem setChecked(boolean);
- public android.view.MenuItem setContentDescription(java.lang.CharSequence);
- public android.view.MenuItem setEnabled(boolean);
- public void setExclusiveCheckable(boolean);
- public android.view.MenuItem setIcon(android.graphics.drawable.Drawable);
- public android.view.MenuItem setIcon(int);
- public android.view.MenuItem setIconTintList(android.content.res.ColorStateList);
- public android.view.MenuItem setIconTintMode(android.graphics.PorterDuff$Mode);
- public android.view.MenuItem setIntent(android.content.Intent);
- public void setIsActionButton(boolean);
- public android.view.MenuItem setNumericShortcut(char);
- public android.view.MenuItem setNumericShortcut(char, int);
- public android.view.MenuItem setOnActionExpandListener(android.view.MenuItem$OnActionExpandListener);
- public android.view.MenuItem setOnMenuItemClickListener(android.view.MenuItem$OnMenuItemClickListener);
- public android.view.MenuItem setShortcut(char, char);
- public android.view.MenuItem setShortcut(char, char, int, int);
- public void setShowAsAction(int);
- public android.view.MenuItem setShowAsActionFlags(int);
- public android.view.MenuItem setTitle(java.lang.CharSequence);
- public android.view.MenuItem setTitle(int);
- public android.view.MenuItem setTitleCondensed(java.lang.CharSequence);
- public android.view.MenuItem setTooltipText(java.lang.CharSequence);
- public android.view.MenuItem setVisible(boolean);
- public boolean shouldShowIcon();
- public boolean showsTextAsAction();
- public java.lang.String toString();
-
-
-}
-
--keep class com.android.internal.view.menu.MenuPresenter {
-
- public abstract boolean collapseItemActionView(com.android.internal.view.menu.MenuBuilder, com.android.internal.view.menu.MenuItemImpl);
- public abstract boolean expandItemActionView(com.android.internal.view.menu.MenuBuilder, com.android.internal.view.menu.MenuItemImpl);
- public abstract boolean flagActionItems();
- public abstract int getId();
- public abstract com.android.internal.view.menu.MenuView getMenuView(android.view.ViewGroup);
- public abstract void initForMenu(android.content.Context, com.android.internal.view.menu.MenuBuilder);
- public abstract void onCloseMenu(com.android.internal.view.menu.MenuBuilder, boolean);
- public abstract void onRestoreInstanceState(android.os.Parcelable);
- public abstract android.os.Parcelable onSaveInstanceState();
- public abstract boolean onSubMenuSelected(com.android.internal.view.menu.SubMenuBuilder);
- public abstract void setCallback(com.android.internal.view.menu.MenuPresenter$Callback);
- public abstract void updateMenuView(boolean);
-
-
-}
-
--keep class com.android.internal.view.menu.MenuPresenter$Callback {
-
- public abstract void onCloseMenu(com.android.internal.view.menu.MenuBuilder, boolean);
- public abstract boolean onOpenSubMenu(com.android.internal.view.menu.MenuBuilder);
-
-
-}
-
--keep class com.android.internal.view.menu.MenuView {
-
- public abstract int getWindowAnimations();
- public abstract void initialize(com.android.internal.view.menu.MenuBuilder);
-
-
-}
-
--keep class com.android.internal.view.menu.MenuView$ItemView {
-
- public abstract com.android.internal.view.menu.MenuItemImpl getItemData();
- public abstract void initialize(com.android.internal.view.menu.MenuItemImpl, int);
- public abstract boolean prefersCondensedTitle();
- public abstract void setCheckable(boolean);
- public abstract void setChecked(boolean);
- public abstract void setEnabled(boolean);
- public abstract void setIcon(android.graphics.drawable.Drawable);
- public abstract void setShortcut(boolean, char);
- public abstract void setTitle(java.lang.CharSequence);
- public abstract boolean showsIcon();
-
-
-}
-
--keep class com.android.internal.view.menu.SubMenuBuilder {
- <init>(android.content.Context, com.android.internal.view.menu.MenuBuilder, com.android.internal.view.menu.MenuItemImpl);
-
- public boolean collapseItemActionView(com.android.internal.view.menu.MenuItemImpl);
- public boolean expandItemActionView(com.android.internal.view.menu.MenuItemImpl);
- public java.lang.String getActionViewStatesKey();
- public android.view.MenuItem getItem();
- public android.view.Menu getParentMenu();
- public com.android.internal.view.menu.MenuBuilder getRootMenu();
- public boolean isGroupDividerEnabled();
- public boolean isQwertyMode();
- public boolean isShortcutsVisible();
- public void setCallback(com.android.internal.view.menu.MenuBuilder$Callback);
- public void setGroupDividerEnabled(boolean);
- public android.view.SubMenu setHeaderIcon(android.graphics.drawable.Drawable);
- public android.view.SubMenu setHeaderIcon(int);
- public android.view.SubMenu setHeaderTitle(java.lang.CharSequence);
- public android.view.SubMenu setHeaderTitle(int);
- public android.view.SubMenu setHeaderView(android.view.View);
- public android.view.SubMenu setIcon(android.graphics.drawable.Drawable);
- public android.view.SubMenu setIcon(int);
- public void setQwertyMode(boolean);
- public void setShortcutsVisible(boolean);
-
-
-}
-
--keep class com.android.internal.widget.DecorToolbar {
-
- public abstract void animateToVisibility(int);
- public abstract boolean canShowOverflowMenu();
- public abstract boolean canSplit();
- public abstract void collapseActionView();
- public abstract void dismissPopupMenus();
- public abstract android.content.Context getContext();
- public abstract android.view.View getCustomView();
- public abstract int getDisplayOptions();
- public abstract int getDropdownItemCount();
- public abstract int getDropdownSelectedPosition();
- public abstract int getHeight();
- public abstract android.view.Menu getMenu();
- public abstract int getNavigationMode();
- public abstract java.lang.CharSequence getSubtitle();
- public abstract java.lang.CharSequence getTitle();
- public abstract android.view.ViewGroup getViewGroup();
- public abstract int getVisibility();
- public abstract boolean hasEmbeddedTabs();
- public abstract boolean hasExpandedActionView();
- public abstract boolean hasIcon();
- public abstract boolean hasLogo();
- public abstract boolean hideOverflowMenu();
- public abstract void initIndeterminateProgress();
- public abstract void initProgress();
- public abstract boolean isOverflowMenuShowPending();
- public abstract boolean isOverflowMenuShowing();
- public abstract boolean isSplit();
- public abstract boolean isTitleTruncated();
- public abstract void restoreHierarchyState(android.util.SparseArray);
- public abstract void saveHierarchyState(android.util.SparseArray);
- public abstract void setBackgroundDrawable(android.graphics.drawable.Drawable);
- public abstract void setCollapsible(boolean);
- public abstract void setCustomView(android.view.View);
- public abstract void setDefaultNavigationContentDescription(int);
- public abstract void setDefaultNavigationIcon(android.graphics.drawable.Drawable);
- public abstract void setDisplayOptions(int);
- public abstract void setDropdownParams(android.widget.SpinnerAdapter, android.widget.AdapterView$OnItemSelectedListener);
- public abstract void setDropdownSelectedPosition(int);
- public abstract void setEmbeddedTabView(com.android.internal.widget.ScrollingTabContainerView);
- public abstract void setHomeButtonEnabled(boolean);
- public abstract void setIcon(int);
- public abstract void setIcon(android.graphics.drawable.Drawable);
- public abstract void setLogo(int);
- public abstract void setLogo(android.graphics.drawable.Drawable);
- public abstract void setMenu(android.view.Menu, com.android.internal.view.menu.MenuPresenter$Callback);
- public abstract void setMenuCallbacks(com.android.internal.view.menu.MenuPresenter$Callback, com.android.internal.view.menu.MenuBuilder$Callback);
- public abstract void setMenuPrepared();
- public abstract void setNavigationContentDescription(java.lang.CharSequence);
- public abstract void setNavigationContentDescription(int);
- public abstract void setNavigationIcon(android.graphics.drawable.Drawable);
- public abstract void setNavigationIcon(int);
- public abstract void setNavigationMode(int);
- public abstract void setSplitToolbar(boolean);
- public abstract void setSplitView(android.view.ViewGroup);
- public abstract void setSplitWhenNarrow(boolean);
- public abstract void setSubtitle(java.lang.CharSequence);
- public abstract void setTitle(java.lang.CharSequence);
- public abstract void setVisibility(int);
- public abstract void setWindowCallback(android.view.Window$Callback);
- public abstract void setWindowTitle(java.lang.CharSequence);
- public abstract android.animation.Animator setupAnimatorToVisibility(int, long);
- public abstract boolean showOverflowMenu();
-
-
-}
-
--keep class com.android.internal.widget.ScrollingTabContainerView {
- <init>(android.content.Context);
-
- public void addTab(android.app.ActionBar$Tab, boolean);
- public void addTab(android.app.ActionBar$Tab, int, boolean);
- public void animateToTab(int);
- public void animateToVisibility(int);
- public void onAttachedToWindow();
- protected void onConfigurationChanged(android.content.res.Configuration);
- public void onDetachedFromWindow();
- public void onItemClick(android.widget.AdapterView, android.view.View, int, long);
- public void onMeasure(int, int);
- public void removeAllTabs();
- public void removeTabAt(int);
- public void setAllowCollapse(boolean);
- public void setContentHeight(int);
- public void setTabSelected(int);
- public void updateTab(int);
-
-
- protected com.android.internal.widget.ScrollingTabContainerView$VisibilityAnimListener mVisAnimListener;
- protected android.animation.Animator mVisibilityAnim;
-}
-
--keep class com.android.internal.widget.ScrollingTabContainerView$VisibilityAnimListener {
- <init>();
-
- public void onAnimationCancel(android.animation.Animator);
- public void onAnimationEnd(android.animation.Animator);
- public void onAnimationRepeat(android.animation.Animator);
- public void onAnimationStart(android.animation.Animator);
- public com.android.internal.widget.ScrollingTabContainerView$VisibilityAnimListener withFinalVisibility(int);
-
-
-}
-
--keep class java.io.BufferedWriter {
- <init>(java.io.Writer);
- <init>(java.io.Writer, int);
-
- public void close();
- public void flush();
- public void newLine();
- public void write(int);
- public void write(char[], int, int);
- public void write(java.lang.String, int, int);
-
-
-}
-
--keep class java.io.ByteArrayOutputStream {
- <init>();
- <init>(int);
-
- public void close();
- public synchronized void reset();
- public synchronized int size();
- public synchronized byte[] toByteArray();
- public synchronized java.lang.String toString();
- public synchronized java.lang.String toString(java.lang.String);
- public synchronized java.lang.String toString(int);
- public synchronized void write(int);
- public synchronized void write(byte[], int, int);
- public synchronized void writeTo(java.io.OutputStream);
-
-
- protected byte[] buf;
- protected int count;
-}
-
--keep class java.io.DataOutputStream {
- <init>(java.io.OutputStream);
-
- public void flush();
- public int size();
- public synchronized void write(int);
- public synchronized void write(byte[], int, int);
- public void writeBoolean(boolean);
- public void writeByte(int);
- public void writeBytes(java.lang.String);
- public void writeChar(int);
- public void writeChars(java.lang.String);
- public void writeDouble(double);
- public void writeFloat(float);
- public void writeInt(int);
- public void writeLong(long);
- public void writeShort(int);
- public void writeUTF(java.lang.String);
-
-
- protected int written;
-}
-
--keep class java.io.File {
- <init>(java.lang.String);
- <init>(java.lang.String, java.lang.String);
- <init>(java.io.File, java.lang.String);
- <init>(java.net.URI);
-
- public boolean canExecute();
- public boolean canRead();
- public boolean canWrite();
- public int compareTo(java.io.File);
- public int compareTo(java.lang.Object);
- public boolean createNewFile();
- public static java.io.File createTempFile(java.lang.String, java.lang.String, java.io.File);
- public static java.io.File createTempFile(java.lang.String, java.lang.String);
- public boolean delete();
- public void deleteOnExit();
- public boolean equals(java.lang.Object);
- public boolean exists();
- public java.io.File getAbsoluteFile();
- public java.lang.String getAbsolutePath();
- public java.io.File getCanonicalFile();
- public java.lang.String getCanonicalPath();
- public long getFreeSpace();
- public java.lang.String getName();
- public java.lang.String getParent();
- public java.io.File getParentFile();
- public java.lang.String getPath();
- public long getTotalSpace();
- public long getUsableSpace();
- public int hashCode();
- public boolean isAbsolute();
- public boolean isDirectory();
- public boolean isFile();
- public boolean isHidden();
- public long lastModified();
- public long length();
- public java.lang.String[] list();
- public java.lang.String[] list(java.io.FilenameFilter);
- public java.io.File[] listFiles();
- public java.io.File[] listFiles(java.io.FilenameFilter);
- public java.io.File[] listFiles(java.io.FileFilter);
- public static java.io.File[] listRoots();
- public boolean mkdir();
- public boolean mkdirs();
- public boolean renameTo(java.io.File);
- public boolean setExecutable(boolean, boolean);
- public boolean setExecutable(boolean);
- public boolean setLastModified(long);
- public boolean setReadOnly();
- public boolean setReadable(boolean, boolean);
- public boolean setReadable(boolean);
- public boolean setWritable(boolean, boolean);
- public boolean setWritable(boolean);
- public java.nio.file.Path toPath();
- public java.lang.String toString();
- public java.net.URI toURI();
- public java.net.URL toURL();
-
-
- public static java.lang.String pathSeparator;
- public static char pathSeparatorChar;
- public static java.lang.String separator;
- public static char separatorChar;
-}
-
--keep class java.io.FileDescriptor {
- <init>();
-
- public int getInt$();
- public boolean isSocket$();
- public void setInt$(int);
- public void sync();
- public boolean valid();
-
-
- public static java.io.FileDescriptor err;
- public static java.io.FileDescriptor in;
- public static java.io.FileDescriptor out;
-}
-
--keep class java.io.FileFilter {
-
- public abstract boolean accept(java.io.File);
-
-
-}
-
--keep class java.io.FileInputStream {
- <init>(java.lang.String);
- <init>(java.io.File);
- <init>(java.io.FileDescriptor);
- <init>(java.io.FileDescriptor, boolean);
-
- public int available();
- public void close();
- protected void finalize();
- public java.nio.channels.FileChannel getChannel();
- public java.io.FileDescriptor getFD();
- public int read();
- public int read(byte[]);
- public int read(byte[], int, int);
- public long skip(long);
-
-
-}
-
--keep class java.io.FileNotFoundException {
- <init>();
- <init>(java.lang.String);
-
-
-
-}
-
--keep class java.io.FileOutputStream {
- <init>(java.lang.String);
- <init>(java.lang.String, boolean);
- <init>(java.io.File);
- <init>(java.io.File, boolean);
- <init>(java.io.FileDescriptor);
- <init>(java.io.FileDescriptor, boolean);
-
- public void close();
- protected void finalize();
- public java.nio.channels.FileChannel getChannel();
- public java.io.FileDescriptor getFD();
- public void write(int);
- public void write(byte[]);
- public void write(byte[], int, int);
-
-
-}
-
--keep class java.io.FilenameFilter {
-
- public abstract boolean accept(java.io.File, java.lang.String);
-
-
-}
-
--keep class java.io.FilterOutputStream {
- <init>(java.io.OutputStream);
-
- public void close();
- public void flush();
- public void write(int);
- public void write(byte[]);
- public void write(byte[], int, int);
-
-
- protected java.io.OutputStream out;
-}
-
--keep class java.io.IOException {
- <init>();
- <init>(java.lang.String);
- <init>(java.lang.String, java.lang.Throwable);
- <init>(java.lang.Throwable);
-
-
-
-}
-
--keep class java.io.InputStream {
- <init>();
-
- public int available();
- public void close();
- public synchronized void mark(int);
- public boolean markSupported();
- public abstract int read();
- public int read(byte[]);
- public int read(byte[], int, int);
- public synchronized void reset();
- public long skip(long);
-
-
-}
-
--keep class java.io.InvalidObjectException {
- <init>(java.lang.String);
-
-
-
-}
-
--keep class java.io.ObjectStreamException {
- <init>(java.lang.String);
- <init>();
-
-
-
-}
-
--keep class java.io.OutputStream {
- <init>();
-
- public void close();
- public void flush();
- public abstract void write(int);
- public void write(byte[]);
- public void write(byte[], int, int);
-
-
-}
-
--keep class java.io.PrintStream {
- <init>(java.io.OutputStream);
- <init>(java.io.OutputStream, boolean);
- <init>(java.io.OutputStream, boolean, java.lang.String);
- <init>(java.lang.String);
- <init>(java.lang.String, java.lang.String);
- <init>(java.io.File);
- <init>(java.io.File, java.lang.String);
-
- public java.io.PrintStream append(java.lang.CharSequence);
- public java.io.PrintStream append(java.lang.CharSequence, int, int);
- public java.io.PrintStream append(char);
- public java.lang.Appendable append(char);
- public java.lang.Appendable append(java.lang.CharSequence, int, int);
- public java.lang.Appendable append(java.lang.CharSequence);
- public boolean checkError();
- protected void clearError();
- public void close();
- public void flush();
- public java.io.PrintStream format(java.lang.String, java.lang.Object[]);
- public java.io.PrintStream format(java.util.Locale, java.lang.String, java.lang.Object[]);
- public void print(boolean);
- public void print(char);
- public void print(int);
- public void print(long);
- public void print(float);
- public void print(double);
- public void print(char[]);
- public void print(java.lang.String);
- public void print(java.lang.Object);
- public java.io.PrintStream printf(java.lang.String, java.lang.Object[]);
- public java.io.PrintStream printf(java.util.Locale, java.lang.String, java.lang.Object[]);
- public void println();
- public void println(boolean);
- public void println(char);
- public void println(int);
- public void println(long);
- public void println(float);
- public void println(double);
- public void println(char[]);
- public void println(java.lang.String);
- public void println(java.lang.Object);
- protected void setError();
- public void write(int);
- public void write(byte[], int, int);
-
-
-}
-
--keep class java.io.PrintWriter {
- <init>(java.io.Writer);
- <init>(java.io.Writer, boolean);
- <init>(java.io.OutputStream);
- <init>(java.io.OutputStream, boolean);
- <init>(java.lang.String);
- <init>(java.lang.String, java.lang.String);
- <init>(java.io.File);
- <init>(java.io.File, java.lang.String);
-
- public java.io.PrintWriter append(java.lang.CharSequence);
- public java.io.PrintWriter append(java.lang.CharSequence, int, int);
- public java.io.PrintWriter append(char);
- public java.io.Writer append(char);
- public java.io.Writer append(java.lang.CharSequence, int, int);
- public java.io.Writer append(java.lang.CharSequence);
- public java.lang.Appendable append(char);
- public java.lang.Appendable append(java.lang.CharSequence, int, int);
- public java.lang.Appendable append(java.lang.CharSequence);
- public boolean checkError();
- protected void clearError();
- public void close();
- public void flush();
- public java.io.PrintWriter format(java.lang.String, java.lang.Object[]);
- public java.io.PrintWriter format(java.util.Locale, java.lang.String, java.lang.Object[]);
- public void print(boolean);
- public void print(char);
- public void print(int);
- public void print(long);
- public void print(float);
- public void print(double);
- public void print(char[]);
- public void print(java.lang.String);
- public void print(java.lang.Object);
- public java.io.PrintWriter printf(java.lang.String, java.lang.Object[]);
- public java.io.PrintWriter printf(java.util.Locale, java.lang.String, java.lang.Object[]);
- public void println();
- public void println(boolean);
- public void println(char);
- public void println(int);
- public void println(long);
- public void println(float);
- public void println(double);
- public void println(char[]);
- public void println(java.lang.String);
- public void println(java.lang.Object);
- protected void setError();
- public void write(int);
- public void write(char[], int, int);
- public void write(char[]);
- public void write(java.lang.String, int, int);
- public void write(java.lang.String);
-
-
- protected java.io.Writer out;
-}
-
--keep class java.io.Reader {
- <init>();
- <init>(java.lang.Object);
-
- public abstract void close();
- public void mark(int);
- public boolean markSupported();
- public int read(java.nio.CharBuffer);
- public int read();
- public int read(char[]);
- public abstract int read(char[], int, int);
- public boolean ready();
- public void reset();
- public long skip(long);
-
-
- protected java.lang.Object lock;
-}
-
--keep class java.io.Serializable {
-
-
-
-}
-
--keep class java.io.SyncFailedException {
- <init>(java.lang.String);
-
-
-
-}
-
--keep class java.io.UnsupportedEncodingException {
- <init>();
- <init>(java.lang.String);
-
-
-
-}
-
--keep class java.io.Writer {
- <init>();
- <init>(java.lang.Object);
-
- public java.io.Writer append(java.lang.CharSequence);
- public java.io.Writer append(java.lang.CharSequence, int, int);
- public java.io.Writer append(char);
- public java.lang.Appendable append(char);
- public java.lang.Appendable append(java.lang.CharSequence, int, int);
- public java.lang.Appendable append(java.lang.CharSequence);
- public abstract void close();
- public abstract void flush();
- public void write(int);
- public void write(char[]);
- public abstract void write(char[], int, int);
- public void write(java.lang.String);
- public void write(java.lang.String, int, int);
-
-
- protected java.lang.Object lock;
-}
-
--keep class java.lang.AbstractStringBuilder {
-
- public java.lang.AbstractStringBuilder append(java.lang.Object);
- public java.lang.AbstractStringBuilder append(java.lang.String);
- public java.lang.AbstractStringBuilder append(java.lang.StringBuffer);
- public java.lang.AbstractStringBuilder append(java.lang.CharSequence);
- public java.lang.AbstractStringBuilder append(java.lang.CharSequence, int, int);
- public java.lang.AbstractStringBuilder append(char[]);
- public java.lang.AbstractStringBuilder append(char[], int, int);
- public java.lang.AbstractStringBuilder append(boolean);
- public java.lang.AbstractStringBuilder append(char);
- public java.lang.AbstractStringBuilder append(int);
- public java.lang.AbstractStringBuilder append(long);
- public java.lang.AbstractStringBuilder append(float);
- public java.lang.AbstractStringBuilder append(double);
- public java.lang.Appendable append(char);
- public java.lang.Appendable append(java.lang.CharSequence, int, int);
- public java.lang.Appendable append(java.lang.CharSequence);
- public java.lang.AbstractStringBuilder appendCodePoint(int);
- public int capacity();
- public char charAt(int);
- public int codePointAt(int);
- public int codePointBefore(int);
- public int codePointCount(int, int);
- public java.lang.AbstractStringBuilder delete(int, int);
- public java.lang.AbstractStringBuilder deleteCharAt(int);
- public void ensureCapacity(int);
- public void getChars(int, int, char[], int);
- public int indexOf(java.lang.String);
- public int indexOf(java.lang.String, int);
- public java.lang.AbstractStringBuilder insert(int, char[], int, int);
- public java.lang.AbstractStringBuilder insert(int, java.lang.Object);
- public java.lang.AbstractStringBuilder insert(int, java.lang.String);
- public java.lang.AbstractStringBuilder insert(int, char[]);
- public java.lang.AbstractStringBuilder insert(int, java.lang.CharSequence);
- public java.lang.AbstractStringBuilder insert(int, java.lang.CharSequence, int, int);
- public java.lang.AbstractStringBuilder insert(int, boolean);
- public java.lang.AbstractStringBuilder insert(int, char);
- public java.lang.AbstractStringBuilder insert(int, int);
- public java.lang.AbstractStringBuilder insert(int, long);
- public java.lang.AbstractStringBuilder insert(int, float);
- public java.lang.AbstractStringBuilder insert(int, double);
- public int lastIndexOf(java.lang.String);
- public int lastIndexOf(java.lang.String, int);
- public int length();
- public int offsetByCodePoints(int, int);
- public java.lang.AbstractStringBuilder replace(int, int, java.lang.String);
- public java.lang.AbstractStringBuilder reverse();
- public void setCharAt(int, char);
- public void setLength(int);
- public java.lang.CharSequence subSequence(int, int);
- public java.lang.String substring(int);
- public java.lang.String substring(int, int);
- public abstract java.lang.String toString();
- public void trimToSize();
-
-
-}
-
--keep class java.lang.Appendable {
-
- public abstract java.lang.Appendable append(java.lang.CharSequence);
- public abstract java.lang.Appendable append(java.lang.CharSequence, int, int);
- public abstract java.lang.Appendable append(char);
-
-
-}
-
--keep class java.lang.Boolean {
- <init>(boolean);
- <init>(java.lang.String);
-
- public boolean booleanValue();
- public static int compare(boolean, boolean);
- public int compareTo(java.lang.Boolean);
- public int compareTo(java.lang.Object);
- public boolean equals(java.lang.Object);
- public static boolean getBoolean(java.lang.String);
- public int hashCode();
- public static int hashCode(boolean);
- public static boolean logicalAnd(boolean, boolean);
- public static boolean logicalOr(boolean, boolean);
- public static boolean logicalXor(boolean, boolean);
- public static boolean parseBoolean(java.lang.String);
- public static java.lang.String toString(boolean);
- public java.lang.String toString();
- public static java.lang.Boolean valueOf(boolean);
- public static java.lang.Boolean valueOf(java.lang.String);
-
-
- public static java.lang.Boolean FALSE;
- public static java.lang.Boolean TRUE;
- public static java.lang.Class TYPE;
-}
-
--keep class java.lang.Byte {
- <init>(byte);
- <init>(java.lang.String);
-
- public byte byteValue();
- public static int compare(byte, byte);
- public int compareTo(java.lang.Byte);
- public int compareTo(java.lang.Object);
- public static java.lang.Byte decode(java.lang.String);
- public double doubleValue();
- public boolean equals(java.lang.Object);
- public float floatValue();
- public int hashCode();
- public static int hashCode(byte);
- public int intValue();
- public long longValue();
- public static byte parseByte(java.lang.String, int);
- public static byte parseByte(java.lang.String);
- public short shortValue();
- public static java.lang.String toHexString(byte, boolean);
- public static java.lang.String toString(byte);
- public java.lang.String toString();
- public static int toUnsignedInt(byte);
- public static long toUnsignedLong(byte);
- public static java.lang.Byte valueOf(byte);
- public static java.lang.Byte valueOf(java.lang.String, int);
- public static java.lang.Byte valueOf(java.lang.String);
-
-
- public static int BYTES;
- public static byte MAX_VALUE;
- public static byte MIN_VALUE;
- public static int SIZE;
- public static java.lang.Class TYPE;
-}
-
--keep class java.lang.CharSequence {
-
- public abstract char charAt(int);
- public java.util.stream.IntStream chars();
- public java.util.stream.IntStream codePoints();
- public abstract int length();
- public abstract java.lang.CharSequence subSequence(int, int);
- public abstract java.lang.String toString();
-
-
-}
-
--keep class java.lang.Character {
- <init>(char);
-
- public static int charCount(int);
- public char charValue();
- public static int codePointAt(java.lang.CharSequence, int);
- public static int codePointAt(char[], int);
- public static int codePointAt(char[], int, int);
- public static int codePointBefore(java.lang.CharSequence, int);
- public static int codePointBefore(char[], int);
- public static int codePointBefore(char[], int, int);
- public static int codePointCount(java.lang.CharSequence, int, int);
- public static int codePointCount(char[], int, int);
- public static int compare(char, char);
- public int compareTo(java.lang.Character);
- public int compareTo(java.lang.Object);
- public static int digit(char, int);
- public static int digit(int, int);
- public boolean equals(java.lang.Object);
- public static char forDigit(int, int);
- public static byte getDirectionality(char);
- public static byte getDirectionality(int);
- public static java.lang.String getName(int);
- public static int getNumericValue(char);
- public static int getNumericValue(int);
- public static int getType(char);
- public static int getType(int);
- public int hashCode();
- public static int hashCode(char);
- public static char highSurrogate(int);
- public static boolean isAlphabetic(int);
- public static boolean isBmpCodePoint(int);
- public static boolean isDefined(char);
- public static boolean isDefined(int);
- public static boolean isDigit(char);
- public static boolean isDigit(int);
- public static boolean isHighSurrogate(char);
- public static boolean isISOControl(char);
- public static boolean isISOControl(int);
- public static boolean isIdentifierIgnorable(char);
- public static boolean isIdentifierIgnorable(int);
- public static boolean isIdeographic(int);
- public static boolean isJavaIdentifierPart(char);
- public static boolean isJavaIdentifierPart(int);
- public static boolean isJavaIdentifierStart(char);
- public static boolean isJavaIdentifierStart(int);
- public static boolean isJavaLetter(char);
- public static boolean isJavaLetterOrDigit(char);
- public static boolean isLetter(char);
- public static boolean isLetter(int);
- public static boolean isLetterOrDigit(char);
- public static boolean isLetterOrDigit(int);
- public static boolean isLowSurrogate(char);
- public static boolean isLowerCase(char);
- public static boolean isLowerCase(int);
- public static boolean isMirrored(char);
- public static boolean isMirrored(int);
- public static boolean isSpace(char);
- public static boolean isSpaceChar(char);
- public static boolean isSpaceChar(int);
- public static boolean isSupplementaryCodePoint(int);
- public static boolean isSurrogate(char);
- public static boolean isSurrogatePair(char, char);
- public static boolean isTitleCase(char);
- public static boolean isTitleCase(int);
- public static boolean isUnicodeIdentifierPart(char);
- public static boolean isUnicodeIdentifierPart(int);
- public static boolean isUnicodeIdentifierStart(char);
- public static boolean isUnicodeIdentifierStart(int);
- public static boolean isUpperCase(char);
- public static boolean isUpperCase(int);
- public static boolean isValidCodePoint(int);
- public static boolean isWhitespace(char);
- public static boolean isWhitespace(int);
- public static char lowSurrogate(int);
- public static int offsetByCodePoints(java.lang.CharSequence, int, int);
- public static int offsetByCodePoints(char[], int, int, int, int);
- public static char reverseBytes(char);
- public static int toChars(int, char[], int);
- public static char[] toChars(int);
- public static int toCodePoint(char, char);
- public static char toLowerCase(char);
- public static int toLowerCase(int);
- public java.lang.String toString();
- public static java.lang.String toString(char);
- public static char toTitleCase(char);
- public static int toTitleCase(int);
- public static char toUpperCase(char);
- public static int toUpperCase(int);
- public static java.lang.Character valueOf(char);
-
-
- public static int BYTES;
- public static byte COMBINING_SPACING_MARK;
- public static byte CONNECTOR_PUNCTUATION;
- public static byte CONTROL;
- public static byte CURRENCY_SYMBOL;
- public static byte DASH_PUNCTUATION;
- public static byte DECIMAL_DIGIT_NUMBER;
- public static byte DIRECTIONALITY_ARABIC_NUMBER;
- public static byte DIRECTIONALITY_BOUNDARY_NEUTRAL;
- public static byte DIRECTIONALITY_COMMON_NUMBER_SEPARATOR;
- public static byte DIRECTIONALITY_EUROPEAN_NUMBER;
- public static byte DIRECTIONALITY_EUROPEAN_NUMBER_SEPARATOR;
- public static byte DIRECTIONALITY_EUROPEAN_NUMBER_TERMINATOR;
- public static byte DIRECTIONALITY_LEFT_TO_RIGHT;
- public static byte DIRECTIONALITY_LEFT_TO_RIGHT_EMBEDDING;
- public static byte DIRECTIONALITY_LEFT_TO_RIGHT_OVERRIDE;
- public static byte DIRECTIONALITY_NONSPACING_MARK;
- public static byte DIRECTIONALITY_OTHER_NEUTRALS;
- public static byte DIRECTIONALITY_PARAGRAPH_SEPARATOR;
- public static byte DIRECTIONALITY_POP_DIRECTIONAL_FORMAT;
- public static byte DIRECTIONALITY_RIGHT_TO_LEFT;
- public static byte DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC;
- public static byte DIRECTIONALITY_RIGHT_TO_LEFT_EMBEDDING;
- public static byte DIRECTIONALITY_RIGHT_TO_LEFT_OVERRIDE;
- public static byte DIRECTIONALITY_SEGMENT_SEPARATOR;
- public static byte DIRECTIONALITY_UNDEFINED;
- public static byte DIRECTIONALITY_WHITESPACE;
- public static byte ENCLOSING_MARK;
- public static byte END_PUNCTUATION;
- public static byte FINAL_QUOTE_PUNCTUATION;
- public static byte FORMAT;
- public static byte INITIAL_QUOTE_PUNCTUATION;
- public static byte LETTER_NUMBER;
- public static byte LINE_SEPARATOR;
- public static byte LOWERCASE_LETTER;
- public static byte MATH_SYMBOL;
- public static int MAX_CODE_POINT;
- public static char MAX_HIGH_SURROGATE;
- public static char MAX_LOW_SURROGATE;
- public static int MAX_RADIX;
- public static char MAX_SURROGATE;
- public static char MAX_VALUE;
- public static int MIN_CODE_POINT;
- public static char MIN_HIGH_SURROGATE;
- public static char MIN_LOW_SURROGATE;
- public static int MIN_RADIX;
- public static int MIN_SUPPLEMENTARY_CODE_POINT;
- public static char MIN_SURROGATE;
- public static char MIN_VALUE;
- public static byte MODIFIER_LETTER;
- public static byte MODIFIER_SYMBOL;
- public static byte NON_SPACING_MARK;
- public static byte OTHER_LETTER;
- public static byte OTHER_NUMBER;
- public static byte OTHER_PUNCTUATION;
- public static byte OTHER_SYMBOL;
- public static byte PARAGRAPH_SEPARATOR;
- public static byte PRIVATE_USE;
- public static int SIZE;
- public static byte SPACE_SEPARATOR;
- public static byte START_PUNCTUATION;
- public static byte SURROGATE;
- public static byte TITLECASE_LETTER;
- public static java.lang.Class TYPE;
- public static byte UNASSIGNED;
- public static byte UPPERCASE_LETTER;
-}
-
--keep class java.lang.Class {
-
- public java.lang.Class asSubclass(java.lang.Class);
- public java.lang.Object cast(java.lang.Object);
- public boolean desiredAssertionStatus();
- public static java.lang.Class forName(java.lang.String);
- public static java.lang.Class forName(java.lang.String, boolean, java.lang.ClassLoader);
- public int getAccessFlags();
- public java.lang.annotation.Annotation getAnnotation(java.lang.Class);
- public java.lang.annotation.Annotation[] getAnnotations();
- public java.lang.annotation.Annotation[] getAnnotationsByType(java.lang.Class);
- public java.lang.String getCanonicalName();
- public java.lang.ClassLoader getClassLoader();
- public java.lang.Class[] getClasses();
- public java.lang.Class getComponentType();
- public java.lang.reflect.Constructor getConstructor(java.lang.Class[]);
- public java.lang.reflect.Constructor[] getConstructors();
- public java.lang.annotation.Annotation getDeclaredAnnotation(java.lang.Class);
- public java.lang.annotation.Annotation[] getDeclaredAnnotations();
- public java.lang.Class[] getDeclaredClasses();
- public java.lang.reflect.Constructor getDeclaredConstructor(java.lang.Class[]);
- public java.lang.reflect.Constructor[] getDeclaredConstructors();
- public java.lang.reflect.Field getDeclaredField(java.lang.String);
- public java.lang.reflect.Field[] getDeclaredFields();
- public java.lang.reflect.Field[] getDeclaredFieldsUnchecked(boolean);
- public java.lang.reflect.Method getDeclaredMethod(java.lang.String, java.lang.Class[]);
- public java.lang.reflect.Method[] getDeclaredMethods();
- public java.lang.reflect.Method[] getDeclaredMethodsUnchecked(boolean);
- public java.lang.Class getDeclaringClass();
- public java.lang.Class getEnclosingClass();
- public java.lang.reflect.Constructor getEnclosingConstructor();
- public java.lang.reflect.Method getEnclosingMethod();
- public java.lang.Object[] getEnumConstants();
- public java.lang.Object[] getEnumConstantsShared();
- public java.lang.reflect.Field getField(java.lang.String);
- public java.lang.reflect.Field[] getFields();
- public java.lang.reflect.Type[] getGenericInterfaces();
- public java.lang.reflect.Type getGenericSuperclass();
- public java.lang.reflect.Method getInstanceMethod(java.lang.String, java.lang.Class[]);
- public java.lang.Class[] getInterfaces();
- public java.lang.reflect.Method getMethod(java.lang.String, java.lang.Class[]);
- public java.lang.reflect.Method[] getMethods();
- public int getModifiers();
- public java.lang.String getName();
- public java.lang.Package getPackage();
- public java.lang.String getPackageName$();
- public java.security.ProtectionDomain getProtectionDomain();
- public java.net.URL getResource(java.lang.String);
- public java.io.InputStream getResourceAsStream(java.lang.String);
- public java.lang.Object[] getSigners();
- public java.lang.String getSimpleName();
- public java.lang.Class getSuperclass();
- public java.lang.String getTypeName();
- public synchronized java.lang.reflect.TypeVariable[] getTypeParameters();
- public boolean isAnnotation();
- public boolean isAnnotationPresent(java.lang.Class);
- public boolean isAnonymousClass();
- public boolean isArray();
- public boolean isAssignableFrom(java.lang.Class);
- public boolean isEnum();
- public boolean isFinalizable();
- public boolean isInstance(java.lang.Object);
- public boolean isInterface();
- public boolean isLocalClass();
- public boolean isMemberClass();
- public boolean isPrimitive();
- public boolean isProxy();
- public boolean isSynthetic();
- public java.lang.Object newInstance();
- public java.lang.String toGenericString();
- public java.lang.String toString();
-
-
-}
-
--keep class java.lang.ClassFormatError {
- <init>();
- <init>(java.lang.String);
-
-
-
-}
-
--keep class java.lang.ClassLoader {
- <init>(java.lang.ClassLoader);
- <init>();
-
- public void clearAssertionStatus();
- protected java.lang.Class defineClass(byte[], int, int);
- protected java.lang.Class defineClass(java.lang.String, byte[], int, int);
- protected java.lang.Class defineClass(java.lang.String, byte[], int, int, java.security.ProtectionDomain);
- protected java.lang.Class defineClass(java.lang.String, java.nio.ByteBuffer, java.security.ProtectionDomain);
- protected java.lang.Package definePackage(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.net.URL);
- protected java.lang.Class findClass(java.lang.String);
- protected java.lang.String findLibrary(java.lang.String);
- protected java.lang.Class findLoadedClass(java.lang.String);
- protected java.net.URL findResource(java.lang.String);
- protected java.util.Enumeration findResources(java.lang.String);
- protected java.lang.Class findSystemClass(java.lang.String);
- protected java.lang.Package getPackage(java.lang.String);
- protected java.lang.Package[] getPackages();
- public java.lang.ClassLoader getParent();
- public java.net.URL getResource(java.lang.String);
- public java.io.InputStream getResourceAsStream(java.lang.String);
- public java.util.Enumeration getResources(java.lang.String);
- public static java.lang.ClassLoader getSystemClassLoader();
- public static java.net.URL getSystemResource(java.lang.String);
- public static java.io.InputStream getSystemResourceAsStream(java.lang.String);
- public static java.util.Enumeration getSystemResources(java.lang.String);
- public java.lang.Class loadClass(java.lang.String);
- protected java.lang.Class loadClass(java.lang.String, boolean);
- protected static boolean registerAsParallelCapable();
- protected void resolveClass(java.lang.Class);
- public void setClassAssertionStatus(java.lang.String, boolean);
- public void setDefaultAssertionStatus(boolean);
- public void setPackageAssertionStatus(java.lang.String, boolean);
- protected void setSigners(java.lang.Class, java.lang.Object[]);
-
-
- public java.util.Map proxyCache;
-}
-
--keep class java.lang.ClassNotFoundException {
- <init>();
- <init>(java.lang.String);
- <init>(java.lang.String, java.lang.Throwable);
-
- public java.lang.Throwable getCause();
- public java.lang.Throwable getException();
-
-
-}
-
--keep class java.lang.CloneNotSupportedException {
- <init>();
- <init>(java.lang.String);
-
-
-
-}
-
--keep class java.lang.Comparable {
-
- public abstract int compareTo(java.lang.Object);
-
-
-}
-
--keep class java.lang.Double {
- <init>(double);
- <init>(java.lang.String);
-
- public byte byteValue();
- public static int compare(double, double);
- public int compareTo(java.lang.Double);
- public int compareTo(java.lang.Object);
- public static long doubleToLongBits(double);
- public static long doubleToRawLongBits(double);
- public double doubleValue();
- public boolean equals(java.lang.Object);
- public float floatValue();
- public int hashCode();
- public static int hashCode(double);
- public int intValue();
- public static boolean isFinite(double);
- public static boolean isInfinite(double);
- public boolean isInfinite();
- public static boolean isNaN(double);
- public boolean isNaN();
- public static double longBitsToDouble(long);
- public long longValue();
- public static double max(double, double);
- public static double min(double, double);
- public static double parseDouble(java.lang.String);
- public short shortValue();
- public static double sum(double, double);
- public static java.lang.String toHexString(double);
- public static java.lang.String toString(double);
- public java.lang.String toString();
- public static java.lang.Double valueOf(java.lang.String);
- public static java.lang.Double valueOf(double);
-
-
- public static int BYTES;
- public static int MAX_EXPONENT;
- public static double MAX_VALUE;
- public static int MIN_EXPONENT;
- public static double MIN_NORMAL;
- public static double MIN_VALUE;
- public static double NEGATIVE_INFINITY;
- public static double NaN;
- public static double POSITIVE_INFINITY;
- public static int SIZE;
- public static java.lang.Class TYPE;
-}
-
--keep class java.lang.Enum {
- <init>(java.lang.String, int);
-
- protected java.lang.Object clone();
- public int compareTo(java.lang.Enum);
- public int compareTo(java.lang.Object);
- public boolean equals(java.lang.Object);
- protected void finalize();
- public java.lang.Class getDeclaringClass();
- public static java.lang.Enum[] getSharedConstants(java.lang.Class);
- public int hashCode();
- public java.lang.String name();
- public int ordinal();
- public java.lang.String toString();
- public static java.lang.Enum valueOf(java.lang.Class, java.lang.String);
-
-
-}
-
--keep class java.lang.Error {
- <init>();
- <init>(java.lang.String);
- <init>(java.lang.String, java.lang.Throwable);
- <init>(java.lang.Throwable);
- <init>(java.lang.String, java.lang.Throwable, boolean, boolean);
-
-
-
-}
-
--keep class java.lang.Exception {
- <init>();
- <init>(java.lang.String);
- <init>(java.lang.String, java.lang.Throwable);
- <init>(java.lang.Throwable);
- <init>(java.lang.String, java.lang.Throwable, boolean, boolean);
-
-
-
-}
-
--keep class java.lang.Float {
- <init>(float);
- <init>(double);
- <init>(java.lang.String);
-
- public byte byteValue();
- public static int compare(float, float);
- public int compareTo(java.lang.Float);
- public int compareTo(java.lang.Object);
- public double doubleValue();
- public boolean equals(java.lang.Object);
- public static int floatToIntBits(float);
- public static int floatToRawIntBits(float);
- public float floatValue();
- public int hashCode();
- public static int hashCode(float);
- public static float intBitsToFloat(int);
- public int intValue();
- public static boolean isFinite(float);
- public static boolean isInfinite(float);
- public boolean isInfinite();
- public static boolean isNaN(float);
- public boolean isNaN();
- public long longValue();
- public static float max(float, float);
- public static float min(float, float);
- public static float parseFloat(java.lang.String);
- public short shortValue();
- public static float sum(float, float);
- public static java.lang.String toHexString(float);
- public static java.lang.String toString(float);
- public java.lang.String toString();
- public static java.lang.Float valueOf(java.lang.String);
- public static java.lang.Float valueOf(float);
-
-
- public static int BYTES;
- public static int MAX_EXPONENT;
- public static float MAX_VALUE;
- public static int MIN_EXPONENT;
- public static float MIN_NORMAL;
- public static float MIN_VALUE;
- public static float NEGATIVE_INFINITY;
- public static float NaN;
- public static float POSITIVE_INFINITY;
- public static int SIZE;
- public static java.lang.Class TYPE;
-}
-
--keep class java.lang.IllegalAccessException {
- <init>();
- <init>(java.lang.String);
-
-
-
-}
-
--keep class java.lang.IllegalArgumentException {
- <init>();
- <init>(java.lang.String);
- <init>(java.lang.String, java.lang.Throwable);
- <init>(java.lang.Throwable);
-
-
-
-}
-
--keep class java.lang.IllegalStateException {
- <init>();
- <init>(java.lang.String);
- <init>(java.lang.String, java.lang.Throwable);
- <init>(java.lang.Throwable);
-
-
-
-}
-
--keep class java.lang.InstantiationException {
- <init>();
- <init>(java.lang.String);
-
-
-
-}
-
--keep class java.lang.Integer {
- <init>(int);
- <init>(java.lang.String);
-
- public static int bitCount(int);
- public byte byteValue();
- public static int compare(int, int);
- public int compareTo(java.lang.Integer);
- public int compareTo(java.lang.Object);
- public static int compareUnsigned(int, int);
- public static java.lang.Integer decode(java.lang.String);
- public static int divideUnsigned(int, int);
- public double doubleValue();
- public boolean equals(java.lang.Object);
- public float floatValue();
- public static java.lang.Integer getInteger(java.lang.String);
- public static java.lang.Integer getInteger(java.lang.String, int);
- public static java.lang.Integer getInteger(java.lang.String, java.lang.Integer);
- public int hashCode();
- public static int hashCode(int);
- public static int highestOneBit(int);
- public int intValue();
- public long longValue();
- public static int lowestOneBit(int);
- public static int max(int, int);
- public static int min(int, int);
- public static int numberOfLeadingZeros(int);
- public static int numberOfTrailingZeros(int);
- public static int parseInt(java.lang.String, int);
- public static int parseInt(java.lang.String);
- public static int parseUnsignedInt(java.lang.String, int);
- public static int parseUnsignedInt(java.lang.String);
- public static int remainderUnsigned(int, int);
- public static int reverse(int);
- public static int reverseBytes(int);
- public static int rotateLeft(int, int);
- public static int rotateRight(int, int);
- public short shortValue();
- public static int signum(int);
- public static int sum(int, int);
- public static java.lang.String toBinaryString(int);
- public static java.lang.String toHexString(int);
- public static java.lang.String toOctalString(int);
- public static java.lang.String toString(int, int);
- public static java.lang.String toString(int);
- public java.lang.String toString();
- public static long toUnsignedLong(int);
- public static java.lang.String toUnsignedString(int, int);
- public static java.lang.String toUnsignedString(int);
- public static java.lang.Integer valueOf(java.lang.String, int);
- public static java.lang.Integer valueOf(java.lang.String);
- public static java.lang.Integer valueOf(int);
-
-
- public static int BYTES;
- public static int MAX_VALUE;
- public static int MIN_VALUE;
- public static int SIZE;
- public static java.lang.Class TYPE;
-}
-
--keep class java.lang.InterruptedException {
- <init>();
- <init>(java.lang.String);
-
-
-
-}
-
--keep class java.lang.Iterable {
-
- public void forEach(java.util.function.Consumer);
- public abstract java.util.Iterator iterator();
- public java.util.Spliterator spliterator();
-
-
-}
-
--keep class java.lang.LinkageError {
- <init>();
- <init>(java.lang.String);
- <init>(java.lang.String, java.lang.Throwable);
-
-
-
-}
-
--keep class java.lang.Long {
- <init>(long);
- <init>(java.lang.String);
-
- public static int bitCount(long);
- public byte byteValue();
- public static int compare(long, long);
- public int compareTo(java.lang.Long);
- public int compareTo(java.lang.Object);
- public static int compareUnsigned(long, long);
- public static java.lang.Long decode(java.lang.String);
- public static long divideUnsigned(long, long);
- public double doubleValue();
- public boolean equals(java.lang.Object);
- public float floatValue();
- public static java.lang.Long getLong(java.lang.String);
- public static java.lang.Long getLong(java.lang.String, long);
- public static java.lang.Long getLong(java.lang.String, java.lang.Long);
- public int hashCode();
- public static int hashCode(long);
- public static long highestOneBit(long);
- public int intValue();
- public long longValue();
- public static long lowestOneBit(long);
- public static long max(long, long);
- public static long min(long, long);
- public static int numberOfLeadingZeros(long);
- public static int numberOfTrailingZeros(long);
- public static long parseLong(java.lang.String, int);
- public static long parseLong(java.lang.String);
- public static long parseUnsignedLong(java.lang.String, int);
- public static long parseUnsignedLong(java.lang.String);
- public static long remainderUnsigned(long, long);
- public static long reverse(long);
- public static long reverseBytes(long);
- public static long rotateLeft(long, int);
- public static long rotateRight(long, int);
- public short shortValue();
- public static int signum(long);
- public static long sum(long, long);
- public static java.lang.String toBinaryString(long);
- public static java.lang.String toHexString(long);
- public static java.lang.String toOctalString(long);
- public static java.lang.String toString(long, int);
- public static java.lang.String toString(long);
- public java.lang.String toString();
- public static java.lang.String toUnsignedString(long, int);
- public static java.lang.String toUnsignedString(long);
- public static java.lang.Long valueOf(java.lang.String, int);
- public static java.lang.Long valueOf(java.lang.String);
- public static java.lang.Long valueOf(long);
-
-
- public static int BYTES;
- public static long MAX_VALUE;
- public static long MIN_VALUE;
- public static int SIZE;
- public static java.lang.Class TYPE;
-}
-
--keep class java.lang.NoSuchFieldException {
- <init>();
- <init>(java.lang.String);
-
-
-
-}
-
--keep class java.lang.NoSuchMethodException {
- <init>();
- <init>(java.lang.String);
-
-
-
-}
-
--keep class java.lang.Number {
- <init>();
-
- public byte byteValue();
- public abstract double doubleValue();
- public abstract float floatValue();
- public abstract int intValue();
- public abstract long longValue();
- public short shortValue();
-
-
-}
-
--keep class java.lang.NumberFormatException {
- <init>();
- <init>(java.lang.String);
-
-
-
-}
-
--keep class java.lang.Object {
- <init>();
-
- protected java.lang.Object clone();
- public boolean equals(java.lang.Object);
- protected void finalize();
- public java.lang.Class getClass();
- public int hashCode();
- public void notify();
- public void notifyAll();
- public java.lang.String toString();
- public void wait(long);
- public void wait(long, int);
- public void wait();
-
-
-}
-
--keep class java.lang.Package {
-
- public java.lang.annotation.Annotation getAnnotation(java.lang.Class);
- public java.lang.annotation.Annotation[] getAnnotations();
- public java.lang.annotation.Annotation[] getAnnotationsByType(java.lang.Class);
- public java.lang.annotation.Annotation getDeclaredAnnotation(java.lang.Class);
- public java.lang.annotation.Annotation[] getDeclaredAnnotations();
- public java.lang.annotation.Annotation[] getDeclaredAnnotationsByType(java.lang.Class);
- public java.lang.String getImplementationTitle();
- public java.lang.String getImplementationVendor();
- public java.lang.String getImplementationVersion();
- public java.lang.String getName();
- public static java.lang.Package getPackage(java.lang.String);
- public static java.lang.Package[] getPackages();
- public java.lang.String getSpecificationTitle();
- public java.lang.String getSpecificationVendor();
- public java.lang.String getSpecificationVersion();
- public int hashCode();
- public boolean isAnnotationPresent(java.lang.Class);
- public boolean isCompatibleWith(java.lang.String);
- public boolean isSealed();
- public boolean isSealed(java.net.URL);
- public java.lang.String toString();
-
-
-}
-
--keep class java.lang.ReflectiveOperationException {
- <init>();
- <init>(java.lang.String);
- <init>(java.lang.String, java.lang.Throwable);
- <init>(java.lang.Throwable);
-
-
-
-}
-
--keep class java.lang.Runnable {
-
- public abstract void run();
-
-
-}
-
--keep class java.lang.RuntimeException {
- <init>();
- <init>(java.lang.String);
- <init>(java.lang.String, java.lang.Throwable);
- <init>(java.lang.Throwable);
- <init>(java.lang.String, java.lang.Throwable, boolean, boolean);
-
-
-
-}
-
--keep class java.lang.SecurityException {
- <init>();
- <init>(java.lang.String);
- <init>(java.lang.String, java.lang.Throwable);
- <init>(java.lang.Throwable);
-
-
-
-}
-
--keep class java.lang.Short {
- <init>(short);
- <init>(java.lang.String);
-
- public byte byteValue();
- public static int compare(short, short);
- public int compareTo(java.lang.Short);
- public int compareTo(java.lang.Object);
- public static java.lang.Short decode(java.lang.String);
- public double doubleValue();
- public boolean equals(java.lang.Object);
- public float floatValue();
- public int hashCode();
- public static int hashCode(short);
- public int intValue();
- public long longValue();
- public static short parseShort(java.lang.String, int);
- public static short parseShort(java.lang.String);
- public static short reverseBytes(short);
- public short shortValue();
- public static java.lang.String toString(short);
- public java.lang.String toString();
- public static int toUnsignedInt(short);
- public static long toUnsignedLong(short);
- public static java.lang.Short valueOf(java.lang.String, int);
- public static java.lang.Short valueOf(java.lang.String);
- public static java.lang.Short valueOf(short);
-
-
- public static int BYTES;
- public static short MAX_VALUE;
- public static short MIN_VALUE;
- public static int SIZE;
- public static java.lang.Class TYPE;
-}
-
--keep class java.lang.StackTraceElement {
- <init>(java.lang.String, java.lang.String, java.lang.String, int);
-
- public boolean equals(java.lang.Object);
- public java.lang.String getClassName();
- public java.lang.String getFileName();
- public int getLineNumber();
- public java.lang.String getMethodName();
- public int hashCode();
- public boolean isNativeMethod();
- public java.lang.String toString();
-
-
-}
-
--keep class java.lang.String {
- <init>();
- <init>(java.lang.String);
- <init>(char[]);
- <init>(char[], int, int);
- <init>(int[], int, int);
- <init>(byte[], int, int, int);
- <init>(byte[], int);
- <init>(byte[], int, int, java.lang.String);
- <init>(byte[], int, int, java.nio.charset.Charset);
- <init>(byte[], java.lang.String);
- <init>(byte[], java.nio.charset.Charset);
- <init>(byte[], int, int);
- <init>(byte[]);
- <init>(java.lang.StringBuffer);
- <init>(java.lang.StringBuilder);
-
- public char charAt(int);
- public int codePointAt(int);
- public int codePointBefore(int);
- public int codePointCount(int, int);
- public int compareTo(java.lang.String);
- public int compareTo(java.lang.Object);
- public int compareToIgnoreCase(java.lang.String);
- public java.lang.String concat(java.lang.String);
- public boolean contains(java.lang.CharSequence);
- public boolean contentEquals(java.lang.StringBuffer);
- public boolean contentEquals(java.lang.CharSequence);
- public static java.lang.String copyValueOf(char[], int, int);
- public static java.lang.String copyValueOf(char[]);
- public boolean endsWith(java.lang.String);
- public boolean equals(java.lang.Object);
- public boolean equalsIgnoreCase(java.lang.String);
- public static java.lang.String format(java.lang.String, java.lang.Object[]);
- public static java.lang.String format(java.util.Locale, java.lang.String, java.lang.Object[]);
- public void getBytes(int, int, byte[], int);
- public byte[] getBytes(java.lang.String);
- public byte[] getBytes(java.nio.charset.Charset);
- public byte[] getBytes();
- public void getChars(int, int, char[], int);
- public int hashCode();
- public int indexOf(int);
- public int indexOf(int, int);
- public int indexOf(java.lang.String);
- public int indexOf(java.lang.String, int);
- public java.lang.String intern();
- public boolean isEmpty();
- public static java.lang.String join(java.lang.CharSequence, java.lang.CharSequence[]);
- public static java.lang.String join(java.lang.CharSequence, java.lang.Iterable);
- public int lastIndexOf(int);
- public int lastIndexOf(int, int);
- public int lastIndexOf(java.lang.String);
- public int lastIndexOf(java.lang.String, int);
- public int length();
- public boolean matches(java.lang.String);
- public int offsetByCodePoints(int, int);
- public boolean regionMatches(int, java.lang.String, int, int);
- public boolean regionMatches(boolean, int, java.lang.String, int, int);
- public java.lang.String replace(char, char);
- public java.lang.String replace(java.lang.CharSequence, java.lang.CharSequence);
- public java.lang.String replaceAll(java.lang.String, java.lang.String);
- public java.lang.String replaceFirst(java.lang.String, java.lang.String);
- public java.lang.String[] split(java.lang.String, int);
- public java.lang.String[] split(java.lang.String);
- public boolean startsWith(java.lang.String, int);
- public boolean startsWith(java.lang.String);
- public java.lang.CharSequence subSequence(int, int);
- public java.lang.String substring(int);
- public java.lang.String substring(int, int);
- public char[] toCharArray();
- public java.lang.String toLowerCase(java.util.Locale);
- public java.lang.String toLowerCase();
- public java.lang.String toString();
- public java.lang.String toUpperCase(java.util.Locale);
- public java.lang.String toUpperCase();
- public java.lang.String trim();
- public static java.lang.String valueOf(java.lang.Object);
- public static java.lang.String valueOf(char[]);
- public static java.lang.String valueOf(char[], int, int);
- public static java.lang.String valueOf(boolean);
- public static java.lang.String valueOf(char);
- public static java.lang.String valueOf(int);
- public static java.lang.String valueOf(long);
- public static java.lang.String valueOf(float);
- public static java.lang.String valueOf(double);
-
-
- public static java.util.Comparator CASE_INSENSITIVE_ORDER;
-}
-
--keep class java.lang.StringBuffer {
- <init>();
- <init>(int);
- <init>(java.lang.String);
- <init>(java.lang.CharSequence);
-
- public synchronized java.lang.StringBuffer append(java.lang.Object);
- public synchronized java.lang.StringBuffer append(java.lang.String);
- public synchronized java.lang.StringBuffer append(java.lang.StringBuffer);
- public synchronized java.lang.StringBuffer append(java.lang.CharSequence);
- public synchronized java.lang.StringBuffer append(java.lang.CharSequence, int, int);
- public synchronized java.lang.StringBuffer append(char[]);
- public synchronized java.lang.StringBuffer append(char[], int, int);
- public synchronized java.lang.StringBuffer append(boolean);
- public synchronized java.lang.StringBuffer append(char);
- public synchronized java.lang.StringBuffer append(int);
- public synchronized java.lang.StringBuffer append(long);
- public synchronized java.lang.StringBuffer append(float);
- public synchronized java.lang.StringBuffer append(double);
- public java.lang.AbstractStringBuilder append(double);
- public java.lang.AbstractStringBuilder append(float);
- public java.lang.AbstractStringBuilder append(long);
- public java.lang.AbstractStringBuilder append(int);
- public java.lang.AbstractStringBuilder append(char);
- public java.lang.AbstractStringBuilder append(boolean);
- public java.lang.AbstractStringBuilder append(char[], int, int);
- public java.lang.AbstractStringBuilder append(char[]);
- public java.lang.AbstractStringBuilder append(java.lang.CharSequence, int, int);
- public java.lang.AbstractStringBuilder append(java.lang.CharSequence);
- public java.lang.AbstractStringBuilder append(java.lang.StringBuffer);
- public java.lang.AbstractStringBuilder append(java.lang.String);
- public java.lang.AbstractStringBuilder append(java.lang.Object);
- public java.lang.Appendable append(char);
- public java.lang.Appendable append(java.lang.CharSequence, int, int);
- public java.lang.Appendable append(java.lang.CharSequence);
- public synchronized java.lang.StringBuffer appendCodePoint(int);
- public java.lang.AbstractStringBuilder appendCodePoint(int);
- public synchronized int capacity();
- public synchronized char charAt(int);
- public synchronized int codePointAt(int);
- public synchronized int codePointBefore(int);
- public synchronized int codePointCount(int, int);
- public synchronized java.lang.StringBuffer delete(int, int);
- public java.lang.AbstractStringBuilder delete(int, int);
- public synchronized java.lang.StringBuffer deleteCharAt(int);
- public java.lang.AbstractStringBuilder deleteCharAt(int);
- public synchronized void ensureCapacity(int);
- public synchronized void getChars(int, int, char[], int);
- public int indexOf(java.lang.String);
- public synchronized int indexOf(java.lang.String, int);
- public synchronized java.lang.StringBuffer insert(int, char[], int, int);
- public synchronized java.lang.StringBuffer insert(int, java.lang.Object);
- public synchronized java.lang.StringBuffer insert(int, java.lang.String);
- public synchronized java.lang.StringBuffer insert(int, char[]);
- public java.lang.StringBuffer insert(int, java.lang.CharSequence);
- public synchronized java.lang.StringBuffer insert(int, java.lang.CharSequence, int, int);
- public java.lang.StringBuffer insert(int, boolean);
- public synchronized java.lang.StringBuffer insert(int, char);
- public java.lang.StringBuffer insert(int, int);
- public java.lang.StringBuffer insert(int, long);
- public java.lang.StringBuffer insert(int, float);
- public java.lang.StringBuffer insert(int, double);
- public java.lang.AbstractStringBuilder insert(int, double);
- public java.lang.AbstractStringBuilder insert(int, float);
- public java.lang.AbstractStringBuilder insert(int, long);
- public java.lang.AbstractStringBuilder insert(int, int);
- public java.lang.AbstractStringBuilder insert(int, char);
- public java.lang.AbstractStringBuilder insert(int, boolean);
- public java.lang.AbstractStringBuilder insert(int, java.lang.CharSequence, int, int);
- public java.lang.AbstractStringBuilder insert(int, java.lang.CharSequence);
- public java.lang.AbstractStringBuilder insert(int, char[]);
- public java.lang.AbstractStringBuilder insert(int, java.lang.String);
- public java.lang.AbstractStringBuilder insert(int, java.lang.Object);
- public java.lang.AbstractStringBuilder insert(int, char[], int, int);
- public int lastIndexOf(java.lang.String);
- public synchronized int lastIndexOf(java.lang.String, int);
- public synchronized int length();
- public synchronized int offsetByCodePoints(int, int);
- public synchronized java.lang.StringBuffer replace(int, int, java.lang.String);
- public java.lang.AbstractStringBuilder replace(int, int, java.lang.String);
- public synchronized java.lang.StringBuffer reverse();
- public java.lang.AbstractStringBuilder reverse();
- public synchronized void setCharAt(int, char);
- public synchronized void setLength(int);
- public synchronized java.lang.CharSequence subSequence(int, int);
- public synchronized java.lang.String substring(int);
- public synchronized java.lang.String substring(int, int);
- public synchronized java.lang.String toString();
- public synchronized void trimToSize();
-
-
-}
-
--keep class java.lang.StringBuilder {
- <init>();
- <init>(int);
- <init>(java.lang.String);
- <init>(java.lang.CharSequence);
-
- public java.lang.StringBuilder append(java.lang.Object);
- public java.lang.StringBuilder append(java.lang.String);
- public java.lang.StringBuilder append(java.lang.StringBuffer);
- public java.lang.StringBuilder append(java.lang.CharSequence);
- public java.lang.StringBuilder append(java.lang.CharSequence, int, int);
- public java.lang.StringBuilder append(char[]);
- public java.lang.StringBuilder append(char[], int, int);
- public java.lang.StringBuilder append(boolean);
- public java.lang.StringBuilder append(char);
- public java.lang.StringBuilder append(int);
- public java.lang.StringBuilder append(long);
- public java.lang.StringBuilder append(float);
- public java.lang.StringBuilder append(double);
- public java.lang.AbstractStringBuilder append(double);
- public java.lang.AbstractStringBuilder append(float);
- public java.lang.AbstractStringBuilder append(long);
- public java.lang.AbstractStringBuilder append(int);
- public java.lang.AbstractStringBuilder append(char);
- public java.lang.AbstractStringBuilder append(boolean);
- public java.lang.AbstractStringBuilder append(char[], int, int);
- public java.lang.AbstractStringBuilder append(char[]);
- public java.lang.AbstractStringBuilder append(java.lang.CharSequence, int, int);
- public java.lang.AbstractStringBuilder append(java.lang.CharSequence);
- public java.lang.AbstractStringBuilder append(java.lang.StringBuffer);
- public java.lang.AbstractStringBuilder append(java.lang.String);
- public java.lang.AbstractStringBuilder append(java.lang.Object);
- public java.lang.Appendable append(char);
- public java.lang.Appendable append(java.lang.CharSequence, int, int);
- public java.lang.Appendable append(java.lang.CharSequence);
- public java.lang.StringBuilder appendCodePoint(int);
- public java.lang.AbstractStringBuilder appendCodePoint(int);
- public int capacity();
- public char charAt(int);
- public int codePointAt(int);
- public int codePointBefore(int);
- public int codePointCount(int, int);
- public java.lang.StringBuilder delete(int, int);
- public java.lang.AbstractStringBuilder delete(int, int);
- public java.lang.StringBuilder deleteCharAt(int);
- public java.lang.AbstractStringBuilder deleteCharAt(int);
- public void ensureCapacity(int);
- public void getChars(int, int, char[], int);
- public int indexOf(java.lang.String);
- public int indexOf(java.lang.String, int);
- public java.lang.StringBuilder insert(int, char[], int, int);
- public java.lang.StringBuilder insert(int, java.lang.Object);
- public java.lang.StringBuilder insert(int, java.lang.String);
- public java.lang.StringBuilder insert(int, char[]);
- public java.lang.StringBuilder insert(int, java.lang.CharSequence);
- public java.lang.StringBuilder insert(int, java.lang.CharSequence, int, int);
- public java.lang.StringBuilder insert(int, boolean);
- public java.lang.StringBuilder insert(int, char);
- public java.lang.StringBuilder insert(int, int);
- public java.lang.StringBuilder insert(int, long);
- public java.lang.StringBuilder insert(int, float);
- public java.lang.StringBuilder insert(int, double);
- public java.lang.AbstractStringBuilder insert(int, double);
- public java.lang.AbstractStringBuilder insert(int, float);
- public java.lang.AbstractStringBuilder insert(int, long);
- public java.lang.AbstractStringBuilder insert(int, int);
- public java.lang.AbstractStringBuilder insert(int, char);
- public java.lang.AbstractStringBuilder insert(int, boolean);
- public java.lang.AbstractStringBuilder insert(int, java.lang.CharSequence, int, int);
- public java.lang.AbstractStringBuilder insert(int, java.lang.CharSequence);
- public java.lang.AbstractStringBuilder insert(int, char[]);
- public java.lang.AbstractStringBuilder insert(int, java.lang.String);
- public java.lang.AbstractStringBuilder insert(int, java.lang.Object);
- public java.lang.AbstractStringBuilder insert(int, char[], int, int);
- public int lastIndexOf(java.lang.String);
- public int lastIndexOf(java.lang.String, int);
- public int length();
- public int offsetByCodePoints(int, int);
- public java.lang.StringBuilder replace(int, int, java.lang.String);
- public java.lang.AbstractStringBuilder replace(int, int, java.lang.String);
- public java.lang.StringBuilder reverse();
- public java.lang.AbstractStringBuilder reverse();
- public void setCharAt(int, char);
- public void setLength(int);
- public java.lang.CharSequence subSequence(int, int);
- public java.lang.String substring(int, int);
- public java.lang.String substring(int);
- public java.lang.String toString();
- public void trimToSize();
-
-
-}
-
--keep class java.lang.Thread {
- <init>();
- <init>(java.lang.Runnable);
- <init>(java.lang.ThreadGroup, java.lang.Runnable);
- <init>(java.lang.String);
- <init>(java.lang.ThreadGroup, java.lang.String);
- <init>(java.lang.Runnable, java.lang.String);
- <init>(java.lang.ThreadGroup, java.lang.Runnable, java.lang.String);
- <init>(java.lang.ThreadGroup, java.lang.Runnable, java.lang.String, long);
-
- public static int activeCount();
- public void blockedOn(sun.nio.ch.Interruptible);
- public void checkAccess();
- protected java.lang.Object clone();
- public int countStackFrames();
- public static java.lang.Thread currentThread();
- public void destroy();
- public void dispatchUncaughtException(java.lang.Throwable);
- public static void dumpStack();
- public static int enumerate(java.lang.Thread[]);
- public static java.util.Map getAllStackTraces();
- public java.lang.ClassLoader getContextClassLoader();
- public static java.lang.Thread$UncaughtExceptionHandler getDefaultUncaughtExceptionHandler();
- public long getId();
- public java.lang.String getName();
- public int getPriority();
- public java.lang.StackTraceElement[] getStackTrace();
- public java.lang.Thread$State getState();
- public java.lang.ThreadGroup getThreadGroup();
- public java.lang.Thread$UncaughtExceptionHandler getUncaughtExceptionHandler();
- public static java.lang.Thread$UncaughtExceptionHandler getUncaughtExceptionPreHandler();
- public static boolean holdsLock(java.lang.Object);
- public void interrupt();
- public static boolean interrupted();
- public boolean isAlive();
- public boolean isDaemon();
- public boolean isInterrupted();
- public void join(long);
- public void join(long, int);
- public void join();
- public void parkFor$(long);
- public void parkUntil$(long);
- public void resume();
- public void run();
- public void setContextClassLoader(java.lang.ClassLoader);
- public void setDaemon(boolean);
- public static void setDefaultUncaughtExceptionHandler(java.lang.Thread$UncaughtExceptionHandler);
- public void setName(java.lang.String);
- public void setPriority(int);
- public void setUncaughtExceptionHandler(java.lang.Thread$UncaughtExceptionHandler);
- public static void setUncaughtExceptionPreHandler(java.lang.Thread$UncaughtExceptionHandler);
- public static void sleep(long);
- public static void sleep(long, int);
- public synchronized void start();
- public void stop();
- public void stop(java.lang.Throwable);
- public void suspend();
- public java.lang.String toString();
- public void unpark$();
- public static void yield();
-
-
- public static int MAX_PRIORITY;
- public static int MIN_PRIORITY;
- public static int NORM_PRIORITY;
-}
-
--keep class java.lang.Thread$State {
-
- public static java.lang.Thread$State valueOf(java.lang.String);
- public static java.lang.Thread$State[] values();
-
- public static java.lang.Thread$State BLOCKED;
- public static java.lang.Thread$State NEW;
- public static java.lang.Thread$State RUNNABLE;
- public static java.lang.Thread$State TERMINATED;
- public static java.lang.Thread$State TIMED_WAITING;
- public static java.lang.Thread$State WAITING;
-
-}
-
--keep class java.lang.Thread$UncaughtExceptionHandler {
-
- public abstract void uncaughtException(java.lang.Thread, java.lang.Throwable);
-
-
-}
-
--keep class java.lang.ThreadGroup {
- <init>(java.lang.String);
- <init>(java.lang.ThreadGroup, java.lang.String);
-
- public int activeCount();
- public int activeGroupCount();
- public boolean allowThreadSuspension(boolean);
- public void checkAccess();
- public void destroy();
- public int enumerate(java.lang.Thread[]);
- public int enumerate(java.lang.Thread[], boolean);
- public int enumerate(java.lang.ThreadGroup[]);
- public int enumerate(java.lang.ThreadGroup[], boolean);
- public int getMaxPriority();
- public java.lang.String getName();
- public java.lang.ThreadGroup getParent();
- public void interrupt();
- public boolean isDaemon();
- public synchronized boolean isDestroyed();
- public void list();
- public boolean parentOf(java.lang.ThreadGroup);
- public void resume();
- public void setDaemon(boolean);
- public void setMaxPriority(int);
- public void stop();
- public void suspend();
- public java.lang.String toString();
- public void uncaughtException(java.lang.Thread, java.lang.Throwable);
-
-
-}
-
--keep class java.lang.ThreadLocal {
- <init>();
-
- public java.lang.Object get();
- protected java.lang.Object initialValue();
- public void remove();
- public void set(java.lang.Object);
- public static java.lang.ThreadLocal withInitial(java.util.function.Supplier);
-
-
-}
-
--keep class java.lang.Throwable {
- <init>();
- <init>(java.lang.String);
- <init>(java.lang.String, java.lang.Throwable);
- <init>(java.lang.Throwable);
- <init>(java.lang.String, java.lang.Throwable, boolean, boolean);
-
- public synchronized void addSuppressed(java.lang.Throwable);
- public synchronized java.lang.Throwable fillInStackTrace();
- public synchronized java.lang.Throwable getCause();
- public java.lang.String getLocalizedMessage();
- public java.lang.String getMessage();
- public java.lang.StackTraceElement[] getStackTrace();
- public synchronized java.lang.Throwable[] getSuppressed();
- public synchronized java.lang.Throwable initCause(java.lang.Throwable);
- public void printStackTrace();
- public void printStackTrace(java.io.PrintStream);
- public void printStackTrace(java.io.PrintWriter);
- public void setStackTrace(java.lang.StackTraceElement[]);
- public java.lang.String toString();
-
-
-}
-
--keep class java.lang.annotation.Annotation {
-
- public abstract java.lang.Class annotationType();
- public abstract boolean equals(java.lang.Object);
- public abstract int hashCode();
- public abstract java.lang.String toString();
-
-
-}
-
--keep class java.lang.reflect.AccessibleObject {
- <init>();
-
- public java.lang.annotation.Annotation getAnnotation(java.lang.Class);
- public java.lang.annotation.Annotation[] getAnnotations();
- public java.lang.annotation.Annotation[] getAnnotationsByType(java.lang.Class);
- public java.lang.annotation.Annotation getDeclaredAnnotation(java.lang.Class);
- public java.lang.annotation.Annotation[] getDeclaredAnnotations();
- public java.lang.annotation.Annotation[] getDeclaredAnnotationsByType(java.lang.Class);
- public boolean isAccessible();
- public boolean isAnnotationPresent(java.lang.Class);
- public static void setAccessible(java.lang.reflect.AccessibleObject[], boolean);
- public void setAccessible(boolean);
-
-
-}
-
--keep class java.lang.reflect.Constructor {
-
- public boolean equals(java.lang.Object);
- public java.lang.annotation.Annotation getAnnotation(java.lang.Class);
- public java.lang.annotation.Annotation[] getDeclaredAnnotations();
- public java.lang.Class getDeclaringClass();
- public java.lang.Class[] getExceptionTypes();
- public java.lang.reflect.Type[] getGenericExceptionTypes();
- public java.lang.reflect.Type[] getGenericParameterTypes();
- public int getModifiers();
- public java.lang.String getName();
- public java.lang.annotation.Annotation[][] getParameterAnnotations();
- public int getParameterCount();
- public java.lang.Class[] getParameterTypes();
- public java.lang.reflect.TypeVariable[] getTypeParameters();
- public int hashCode();
- public boolean isSynthetic();
- public boolean isVarArgs();
- public java.lang.Object newInstance(java.lang.Object[]);
- public java.lang.reflect.Constructor serializationCopy(java.lang.Class, java.lang.Class);
- public java.lang.String toGenericString();
- public java.lang.String toString();
-
-
-}
-
--keep class java.lang.reflect.Executable {
-
- public int getAccessFlags();
- public java.lang.annotation.Annotation getAnnotation(java.lang.Class);
- public java.lang.annotation.Annotation[] getAnnotationsByType(java.lang.Class);
- public long getArtMethod();
- public java.lang.annotation.Annotation[] getDeclaredAnnotations();
- public abstract java.lang.Class getDeclaringClass();
- public abstract java.lang.Class[] getExceptionTypes();
- public java.lang.reflect.Type[] getGenericExceptionTypes();
- public java.lang.reflect.Type[] getGenericParameterTypes();
- public abstract int getModifiers();
- public abstract java.lang.String getName();
- public abstract java.lang.annotation.Annotation[][] getParameterAnnotations();
- public int getParameterCount();
- public abstract java.lang.Class[] getParameterTypes();
- public java.lang.reflect.Parameter[] getParameters();
- public abstract java.lang.reflect.TypeVariable[] getTypeParameters();
- public boolean isAnnotationPresent(java.lang.Class);
- public boolean isSynthetic();
- public boolean isVarArgs();
- public abstract java.lang.String toGenericString();
-
-
-}
-
--keep class java.lang.reflect.Field {
-
- public boolean equals(java.lang.Object);
- public java.lang.Object get(java.lang.Object);
- public java.lang.annotation.Annotation getAnnotation(java.lang.Class);
- public java.lang.annotation.Annotation[] getAnnotationsByType(java.lang.Class);
- public long getArtField();
- public boolean getBoolean(java.lang.Object);
- public byte getByte(java.lang.Object);
- public char getChar(java.lang.Object);
- public java.lang.annotation.Annotation[] getDeclaredAnnotations();
- public java.lang.Class getDeclaringClass();
- public int getDexFieldIndex();
- public double getDouble(java.lang.Object);
- public float getFloat(java.lang.Object);
- public java.lang.reflect.Type getGenericType();
- public int getInt(java.lang.Object);
- public long getLong(java.lang.Object);
- public int getModifiers();
- public java.lang.String getName();
- public int getOffset();
- public short getShort(java.lang.Object);
- public java.lang.Class getType();
- public int hashCode();
- public boolean isAnnotationPresent(java.lang.Class);
- public boolean isEnumConstant();
- public boolean isSynthetic();
- public void set(java.lang.Object, java.lang.Object);
- public void setBoolean(java.lang.Object, boolean);
- public void setByte(java.lang.Object, byte);
- public void setChar(java.lang.Object, char);
- public void setDouble(java.lang.Object, double);
- public void setFloat(java.lang.Object, float);
- public void setInt(java.lang.Object, int);
- public void setLong(java.lang.Object, long);
- public void setShort(java.lang.Object, short);
- public java.lang.String toGenericString();
- public java.lang.String toString();
-
-
-}
-
--keep class java.lang.reflect.GenericDeclaration {
-
- public abstract java.lang.reflect.TypeVariable[] getTypeParameters();
-
-
-}
-
--keep class java.lang.reflect.InvocationTargetException {
- <init>();
- <init>(java.lang.Throwable);
- <init>(java.lang.Throwable, java.lang.String);
-
- public java.lang.Throwable getCause();
- public java.lang.Throwable getTargetException();
-
-
-}
-
--keep class java.lang.reflect.Method {
-
- public boolean equals(java.lang.Object);
- public java.lang.annotation.Annotation getAnnotation(java.lang.Class);
- public java.lang.annotation.Annotation[] getDeclaredAnnotations();
- public java.lang.Class getDeclaringClass();
- public java.lang.Object getDefaultValue();
- public java.lang.Class[] getExceptionTypes();
- public java.lang.reflect.Type[] getGenericExceptionTypes();
- public java.lang.reflect.Type[] getGenericParameterTypes();
- public java.lang.reflect.Type getGenericReturnType();
- public int getModifiers();
- public java.lang.String getName();
- public java.lang.annotation.Annotation[][] getParameterAnnotations();
- public int getParameterCount();
- public java.lang.Class[] getParameterTypes();
- public java.lang.Class getReturnType();
- public java.lang.reflect.TypeVariable[] getTypeParameters();
- public int hashCode();
- public java.lang.Object invoke(java.lang.Object, java.lang.Object[]);
- public boolean isBridge();
- public boolean isDefault();
- public boolean isSynthetic();
- public boolean isVarArgs();
- public java.lang.String toGenericString();
- public java.lang.String toString();
-
-
- public static java.util.Comparator ORDER_BY_SIGNATURE;
-}
-
--keep class java.lang.reflect.Parameter {
-
- public boolean equals(java.lang.Object);
- public java.lang.annotation.Annotation getAnnotation(java.lang.Class);
- public java.lang.annotation.Annotation[] getAnnotations();
- public java.lang.annotation.Annotation[] getAnnotationsByType(java.lang.Class);
- public java.lang.annotation.Annotation getDeclaredAnnotation(java.lang.Class);
- public java.lang.annotation.Annotation[] getDeclaredAnnotations();
- public java.lang.annotation.Annotation[] getDeclaredAnnotationsByType(java.lang.Class);
- public java.lang.reflect.Executable getDeclaringExecutable();
- public int getModifiers();
- public java.lang.String getName();
- public java.lang.reflect.Type getParameterizedType();
- public java.lang.Class getType();
- public int hashCode();
- public boolean isImplicit();
- public boolean isNamePresent();
- public boolean isSynthetic();
- public boolean isVarArgs();
- public java.lang.String toString();
-
-
-}
-
--keep class java.lang.reflect.Type {
-
- public java.lang.String getTypeName();
-
-
-}
-
--keep class java.lang.reflect.TypeVariable {
-
- public abstract java.lang.reflect.Type[] getBounds();
- public abstract java.lang.reflect.GenericDeclaration getGenericDeclaration();
- public abstract java.lang.String getName();
-
-
-}
-
--keep class java.net.ContentHandler {
- <init>();
-
- public abstract java.lang.Object getContent(java.net.URLConnection);
- public java.lang.Object getContent(java.net.URLConnection, java.lang.Class[]);
-
-
-}
-
--keep class java.net.ContentHandlerFactory {
-
- public abstract java.net.ContentHandler createContentHandler(java.lang.String);
-
-
-}
-
--keep class java.net.DatagramPacket {
- <init>(byte[], int, int);
- <init>(byte[], int);
- <init>(byte[], int, int, java.net.InetAddress, int);
- <init>(byte[], int, int, java.net.SocketAddress);
- <init>(byte[], int, java.net.InetAddress, int);
- <init>(byte[], int, java.net.SocketAddress);
-
- public synchronized java.net.InetAddress getAddress();
- public synchronized byte[] getData();
- public synchronized int getLength();
- public synchronized int getOffset();
- public synchronized int getPort();
- public synchronized java.net.SocketAddress getSocketAddress();
- public synchronized void setAddress(java.net.InetAddress);
- public synchronized void setData(byte[], int, int);
- public synchronized void setData(byte[]);
- public synchronized void setLength(int);
- public synchronized void setPort(int);
- public void setReceivedLength(int);
- public synchronized void setSocketAddress(java.net.SocketAddress);
-
-
-}
-
--keep class java.net.DatagramSocket {
- <init>();
- <init>(java.net.DatagramSocketImpl);
- <init>(java.net.SocketAddress);
- <init>(int);
- <init>(int, java.net.InetAddress);
-
- public synchronized void bind(java.net.SocketAddress);
- public void close();
- public void connect(java.net.InetAddress, int);
- public void connect(java.net.SocketAddress);
- public void disconnect();
- public synchronized boolean getBroadcast();
- public java.nio.channels.DatagramChannel getChannel();
- public java.io.FileDescriptor getFileDescriptor$();
- public java.net.InetAddress getInetAddress();
- public java.net.InetAddress getLocalAddress();
- public int getLocalPort();
- public java.net.SocketAddress getLocalSocketAddress();
- public int getPort();
- public synchronized int getReceiveBufferSize();
- public java.net.SocketAddress getRemoteSocketAddress();
- public synchronized boolean getReuseAddress();
- public synchronized int getSendBufferSize();
- public synchronized int getSoTimeout();
- public synchronized int getTrafficClass();
- public boolean isBound();
- public boolean isClosed();
- public boolean isConnected();
- public synchronized void receive(java.net.DatagramPacket);
- public void send(java.net.DatagramPacket);
- public synchronized void setBroadcast(boolean);
- public static synchronized void setDatagramSocketImplFactory(java.net.DatagramSocketImplFactory);
- public synchronized void setReceiveBufferSize(int);
- public synchronized void setReuseAddress(boolean);
- public synchronized void setSendBufferSize(int);
- public synchronized void setSoTimeout(int);
- public synchronized void setTrafficClass(int);
-
-
-}
-
--keep class java.net.DatagramSocketImpl {
- <init>();
-
- protected abstract void bind(int, java.net.InetAddress);
- protected abstract void close();
- protected void connect(java.net.InetAddress, int);
- protected abstract void create();
- protected void disconnect();
- protected java.io.FileDescriptor getFileDescriptor();
- protected int getLocalPort();
- protected abstract byte getTTL();
- protected abstract int getTimeToLive();
- protected abstract void join(java.net.InetAddress);
- protected abstract void joinGroup(java.net.SocketAddress, java.net.NetworkInterface);
- protected abstract void leave(java.net.InetAddress);
- protected abstract void leaveGroup(java.net.SocketAddress, java.net.NetworkInterface);
- protected abstract int peek(java.net.InetAddress);
- protected abstract int peekData(java.net.DatagramPacket);
- protected abstract void receive(java.net.DatagramPacket);
- protected abstract void send(java.net.DatagramPacket);
- protected abstract void setTTL(byte);
- protected abstract void setTimeToLive(int);
-
-
- protected java.io.FileDescriptor fd;
- protected int localPort;
-}
-
--keep class java.net.DatagramSocketImplFactory {
-
- public abstract java.net.DatagramSocketImpl createDatagramSocketImpl();
-
-
-}
-
--keep class java.net.FileNameMap {
-
- public abstract java.lang.String getContentTypeFor(java.lang.String);
-
-
-}
-
--keep class java.net.InetAddress {
-
- public static void clearDnsCache();
- public boolean equals(java.lang.Object);
- public byte[] getAddress();
- public static java.net.InetAddress[] getAllByName(java.lang.String);
- public static java.net.InetAddress[] getAllByNameOnNet(java.lang.String, int);
- public static java.net.InetAddress getByAddress(java.lang.String, byte[]);
- public static java.net.InetAddress getByAddress(byte[]);
- public static java.net.InetAddress getByName(java.lang.String);
- public static java.net.InetAddress getByNameOnNet(java.lang.String, int);
- public java.lang.String getCanonicalHostName();
- public java.lang.String getHostAddress();
- public java.lang.String getHostName();
- public static java.net.InetAddress getLocalHost();
- public static java.net.InetAddress getLoopbackAddress();
- public int hashCode();
- public boolean isAnyLocalAddress();
- public boolean isLinkLocalAddress();
- public boolean isLoopbackAddress();
- public boolean isMCGlobal();
- public boolean isMCLinkLocal();
- public boolean isMCNodeLocal();
- public boolean isMCOrgLocal();
- public boolean isMCSiteLocal();
- public boolean isMulticastAddress();
- public static boolean isNumeric(java.lang.String);
- public boolean isReachable(int);
- public boolean isReachable(java.net.NetworkInterface, int, int);
- public boolean isReachableByICMP(int);
- public boolean isSiteLocalAddress();
- public static java.net.InetAddress parseNumericAddress(java.lang.String);
- public java.lang.String toString();
-
-
-}
-
--keep class java.net.InterfaceAddress {
-
- public boolean equals(java.lang.Object);
- public java.net.InetAddress getAddress();
- public java.net.InetAddress getBroadcast();
- public short getNetworkPrefixLength();
- public int hashCode();
- public java.lang.String toString();
-
-
-}
-
--keep class java.net.MalformedURLException {
- <init>();
- <init>(java.lang.String);
-
-
-
-}
-
--keep class java.net.NetworkInterface {
-
- public boolean equals(java.lang.Object);
- public static java.net.NetworkInterface getByIndex(int);
- public static java.net.NetworkInterface getByInetAddress(java.net.InetAddress);
- public static java.net.NetworkInterface getByName(java.lang.String);
- public java.lang.String getDisplayName();
- public byte[] getHardwareAddress();
- public int getIndex();
- public java.util.Enumeration getInetAddresses();
- public java.util.List getInterfaceAddresses();
- public int getMTU();
- public java.lang.String getName();
- public static java.util.Enumeration getNetworkInterfaces();
- public java.net.NetworkInterface getParent();
- public java.util.Enumeration getSubInterfaces();
- public int hashCode();
- public boolean isLoopback();
- public boolean isPointToPoint();
- public boolean isUp();
- public boolean isVirtual();
- public boolean supportsMulticast();
- public java.lang.String toString();
-
-
-}
-
--keep class java.net.ProtocolFamily {
-
- public abstract java.lang.String name();
-
-
-}
-
--keep class java.net.Proxy {
- <init>(java.net.Proxy$Type, java.net.SocketAddress);
-
- public java.net.SocketAddress address();
- public boolean equals(java.lang.Object);
- public int hashCode();
- public java.lang.String toString();
- public java.net.Proxy$Type type();
-
-
- public static java.net.Proxy NO_PROXY;
-}
-
--keep class java.net.Proxy$Type {
-
- public static java.net.Proxy$Type valueOf(java.lang.String);
- public static java.net.Proxy$Type[] values();
-
- public static java.net.Proxy$Type DIRECT;
- public static java.net.Proxy$Type HTTP;
- public static java.net.Proxy$Type SOCKS;
-
-}
-
--keep class java.net.ServerSocket {
- <init>();
- <init>(int);
- <init>(int, int);
- <init>(int, int, java.net.InetAddress);
-
- public java.net.Socket accept();
- public void bind(java.net.SocketAddress);
- public void bind(java.net.SocketAddress, int);
- public void close();
- public java.nio.channels.ServerSocketChannel getChannel();
- public java.io.FileDescriptor getFileDescriptor$();
- public java.net.SocketImpl getImpl();
- public java.net.InetAddress getInetAddress();
- public int getLocalPort();
- public java.net.SocketAddress getLocalSocketAddress();
- public synchronized int getReceiveBufferSize();
- public boolean getReuseAddress();
- public synchronized int getSoTimeout();
- protected void implAccept(java.net.Socket);
- public boolean isBound();
- public boolean isClosed();
- public void setPerformancePreferences(int, int, int);
- public synchronized void setReceiveBufferSize(int);
- public void setReuseAddress(boolean);
- public synchronized void setSoTimeout(int);
- public static synchronized void setSocketFactory(java.net.SocketImplFactory);
- public java.lang.String toString();
-
-
-}
-
--keep class java.net.Socket {
- <init>();
- <init>(java.net.Proxy);
- <init>(java.net.SocketImpl);
- <init>(java.lang.String, int);
- <init>(java.net.InetAddress, int);
- <init>(java.lang.String, int, java.net.InetAddress, int);
- <init>(java.net.InetAddress, int, java.net.InetAddress, int);
- <init>(java.lang.String, int, boolean);
- <init>(java.net.InetAddress, int, boolean);
-
- public void bind(java.net.SocketAddress);
- public synchronized void close();
- public void connect(java.net.SocketAddress);
- public void connect(java.net.SocketAddress, int);
- public java.nio.channels.SocketChannel getChannel();
- public java.io.FileDescriptor getFileDescriptor$();
- public java.net.InetAddress getInetAddress();
- public java.io.InputStream getInputStream();
- public boolean getKeepAlive();
- public java.net.InetAddress getLocalAddress();
- public int getLocalPort();
- public java.net.SocketAddress getLocalSocketAddress();
- public boolean getOOBInline();
- public java.io.OutputStream getOutputStream();
- public int getPort();
- public synchronized int getReceiveBufferSize();
- public java.net.SocketAddress getRemoteSocketAddress();
- public boolean getReuseAddress();
- public synchronized int getSendBufferSize();
- public int getSoLinger();
- public synchronized int getSoTimeout();
- public boolean getTcpNoDelay();
- public int getTrafficClass();
- public boolean isBound();
- public boolean isClosed();
- public boolean isConnected();
- public boolean isInputShutdown();
- public boolean isOutputShutdown();
- public void sendUrgentData(int);
- public void setKeepAlive(boolean);
- public void setOOBInline(boolean);
- public void setPerformancePreferences(int, int, int);
- public synchronized void setReceiveBufferSize(int);
- public void setReuseAddress(boolean);
- public synchronized void setSendBufferSize(int);
- public void setSoLinger(boolean, int);
- public synchronized void setSoTimeout(int);
- public static synchronized void setSocketImplFactory(java.net.SocketImplFactory);
- public void setTcpNoDelay(boolean);
- public void setTrafficClass(int);
- public void shutdownInput();
- public void shutdownOutput();
- public java.lang.String toString();
-
-
-}
-
--keep class java.net.SocketAddress {
- <init>();
-
-
-
-}
-
--keep class java.net.SocketException {
- <init>(java.lang.String);
- <init>();
- <init>(java.lang.Throwable);
- <init>(java.lang.String, java.lang.Throwable);
-
-
-
-}
-
--keep class java.net.SocketImpl {
- <init>();
-
- protected abstract void accept(java.net.SocketImpl);
- protected abstract int available();
- protected abstract void bind(java.net.InetAddress, int);
- protected abstract void close();
- protected abstract void connect(java.lang.String, int);
- protected abstract void connect(java.net.InetAddress, int);
- protected abstract void connect(java.net.SocketAddress, int);
- protected abstract void create(boolean);
- public java.io.FileDescriptor getFD$();
- protected java.io.FileDescriptor getFileDescriptor();
- protected java.net.InetAddress getInetAddress();
- protected abstract java.io.InputStream getInputStream();
- protected int getLocalPort();
- protected abstract java.io.OutputStream getOutputStream();
- protected int getPort();
- protected abstract void listen(int);
- protected abstract void sendUrgentData(int);
- protected void setPerformancePreferences(int, int, int);
- protected void shutdownInput();
- protected void shutdownOutput();
- protected boolean supportsUrgentData();
- public java.lang.String toString();
-
-
- protected java.net.InetAddress address;
- protected java.io.FileDescriptor fd;
- protected int localport;
- protected int port;
-}
-
--keep class java.net.SocketImplFactory {
-
- public abstract java.net.SocketImpl createSocketImpl();
-
-
-}
-
--keep class java.net.SocketOption {
-
- public abstract java.lang.String name();
- public abstract java.lang.Class type();
-
-
-}
-
--keep class java.net.URI {
- <init>(java.lang.String);
- <init>(java.lang.String, java.lang.String, java.lang.String, int, java.lang.String, java.lang.String, java.lang.String);
- <init>(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String);
- <init>(java.lang.String, java.lang.String, java.lang.String, java.lang.String);
- <init>(java.lang.String, java.lang.String, java.lang.String);
-
- public int compareTo(java.net.URI);
- public int compareTo(java.lang.Object);
- public static java.net.URI create(java.lang.String);
- public boolean equals(java.lang.Object);
- public java.lang.String getAuthority();
- public java.lang.String getFragment();
- public java.lang.String getHost();
- public java.lang.String getPath();
- public int getPort();
- public java.lang.String getQuery();
- public java.lang.String getRawAuthority();
- public java.lang.String getRawFragment();
- public java.lang.String getRawPath();
- public java.lang.String getRawQuery();
- public java.lang.String getRawSchemeSpecificPart();
- public java.lang.String getRawUserInfo();
- public java.lang.String getScheme();
- public java.lang.String getSchemeSpecificPart();
- public java.lang.String getUserInfo();
- public int hashCode();
- public boolean isAbsolute();
- public boolean isOpaque();
- public java.net.URI normalize();
- public java.net.URI parseServerAuthority();
- public java.net.URI relativize(java.net.URI);
- public java.net.URI resolve(java.net.URI);
- public java.net.URI resolve(java.lang.String);
- public java.lang.String toASCIIString();
- public java.lang.String toString();
- public java.net.URL toURL();
-
-
-}
-
--keep class java.net.URISyntaxException {
- <init>(java.lang.String, java.lang.String, int);
- <init>(java.lang.String, java.lang.String);
-
- public int getIndex();
- public java.lang.String getInput();
- public java.lang.String getMessage();
- public java.lang.String getReason();
-
-
-}
-
--keep class java.net.URL {
- <init>(java.lang.String, java.lang.String, int, java.lang.String);
- <init>(java.lang.String, java.lang.String, java.lang.String);
- <init>(java.lang.String, java.lang.String, int, java.lang.String, java.net.URLStreamHandler);
- <init>(java.lang.String);
- <init>(java.net.URL, java.lang.String);
- <init>(java.net.URL, java.lang.String, java.net.URLStreamHandler);
-
- public boolean equals(java.lang.Object);
- public java.lang.String getAuthority();
- public java.lang.Object getContent();
- public java.lang.Object getContent(java.lang.Class[]);
- public int getDefaultPort();
- public java.lang.String getFile();
- public java.lang.String getHost();
- public java.lang.String getPath();
- public int getPort();
- public java.lang.String getProtocol();
- public java.lang.String getQuery();
- public java.lang.String getRef();
- public java.lang.String getUserInfo();
- public synchronized int hashCode();
- public java.net.URLConnection openConnection();
- public java.net.URLConnection openConnection(java.net.Proxy);
- public java.io.InputStream openStream();
- public boolean sameFile(java.net.URL);
- public static void setURLStreamHandlerFactory(java.net.URLStreamHandlerFactory);
- public java.lang.String toExternalForm();
- public java.lang.String toString();
- public java.net.URI toURI();
-
-
-}
-
--keep class java.net.URLConnection {
- <init>(java.net.URL);
-
- public void addRequestProperty(java.lang.String, java.lang.String);
- public abstract void connect();
- public boolean getAllowUserInteraction();
- public int getConnectTimeout();
- public java.lang.Object getContent();
- public java.lang.Object getContent(java.lang.Class[]);
- public java.lang.String getContentEncoding();
- public int getContentLength();
- public long getContentLengthLong();
- public java.lang.String getContentType();
- public long getDate();
- public static boolean getDefaultAllowUserInteraction();
- public static java.lang.String getDefaultRequestProperty(java.lang.String);
- public boolean getDefaultUseCaches();
- public boolean getDoInput();
- public boolean getDoOutput();
- public long getExpiration();
- public static synchronized java.net.FileNameMap getFileNameMap();
- public java.lang.String getHeaderField(java.lang.String);
- public java.lang.String getHeaderField(int);
- public long getHeaderFieldDate(java.lang.String, long);
- public int getHeaderFieldInt(java.lang.String, int);
- public java.lang.String getHeaderFieldKey(int);
- public long getHeaderFieldLong(java.lang.String, long);
- public java.util.Map getHeaderFields();
- public long getIfModifiedSince();
- public java.io.InputStream getInputStream();
- public long getLastModified();
- public java.io.OutputStream getOutputStream();
- public java.security.Permission getPermission();
- public int getReadTimeout();
- public java.util.Map getRequestProperties();
- public java.lang.String getRequestProperty(java.lang.String);
- public java.net.URL getURL();
- public boolean getUseCaches();
- public static java.lang.String guessContentTypeFromName(java.lang.String);
- public static java.lang.String guessContentTypeFromStream(java.io.InputStream);
- public void setAllowUserInteraction(boolean);
- public void setConnectTimeout(int);
- public static synchronized void setContentHandlerFactory(java.net.ContentHandlerFactory);
- public static void setDefaultAllowUserInteraction(boolean);
- public static void setDefaultRequestProperty(java.lang.String, java.lang.String);
- public void setDefaultUseCaches(boolean);
- public void setDoInput(boolean);
- public void setDoOutput(boolean);
- public static void setFileNameMap(java.net.FileNameMap);
- public void setIfModifiedSince(long);
- public void setReadTimeout(int);
- public void setRequestProperty(java.lang.String, java.lang.String);
- public void setUseCaches(boolean);
- public java.lang.String toString();
-
-
- protected boolean allowUserInteraction;
- protected boolean connected;
- protected boolean doInput;
- protected boolean doOutput;
- protected long ifModifiedSince;
- protected java.net.URL url;
- protected boolean useCaches;
-}
-
--keep class java.net.URLStreamHandler {
- <init>();
-
- protected boolean equals(java.net.URL, java.net.URL);
- protected int getDefaultPort();
- protected synchronized java.net.InetAddress getHostAddress(java.net.URL);
- protected int hashCode(java.net.URL);
- protected boolean hostsEqual(java.net.URL, java.net.URL);
- protected abstract java.net.URLConnection openConnection(java.net.URL);
- protected java.net.URLConnection openConnection(java.net.URL, java.net.Proxy);
- protected void parseURL(java.net.URL, java.lang.String, int, int);
- protected boolean sameFile(java.net.URL, java.net.URL);
- protected void setURL(java.net.URL, java.lang.String, java.lang.String, int, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String);
- protected void setURL(java.net.URL, java.lang.String, java.lang.String, int, java.lang.String, java.lang.String);
- protected java.lang.String toExternalForm(java.net.URL);
-
-
-}
-
--keep class java.net.URLStreamHandlerFactory {
-
- public abstract java.net.URLStreamHandler createURLStreamHandler(java.lang.String);
-
-
-}
-
--keep class java.net.UnknownHostException {
- <init>(java.lang.String);
- <init>();
-
-
-
-}
-
--keep class java.nio.Buffer {
-
- public abstract java.lang.Object array();
- public abstract int arrayOffset();
- public int capacity();
- public java.nio.Buffer clear();
- public java.nio.Buffer flip();
- public int getElementSizeShift();
- public abstract boolean hasArray();
- public boolean hasRemaining();
- public abstract boolean isDirect();
- public abstract boolean isReadOnly();
- public int limit();
- public java.nio.Buffer limit(int);
- public java.nio.Buffer mark();
- public int position();
- public java.nio.Buffer position(int);
- public int remaining();
- public java.nio.Buffer reset();
- public java.nio.Buffer rewind();
-
-
-}
-
--keep class java.nio.ByteBuffer {
-
- public static java.nio.ByteBuffer allocate(int);
- public static java.nio.ByteBuffer allocateDirect(int);
- public byte[] array();
- public java.lang.Object array();
- public int arrayOffset();
- public abstract java.nio.CharBuffer asCharBuffer();
- public abstract java.nio.DoubleBuffer asDoubleBuffer();
- public abstract java.nio.FloatBuffer asFloatBuffer();
- public abstract java.nio.IntBuffer asIntBuffer();
- public abstract java.nio.LongBuffer asLongBuffer();
- public abstract java.nio.ByteBuffer asReadOnlyBuffer();
- public abstract java.nio.ShortBuffer asShortBuffer();
- public abstract java.nio.ByteBuffer compact();
- public int compareTo(java.nio.ByteBuffer);
- public int compareTo(java.lang.Object);
- public abstract java.nio.ByteBuffer duplicate();
- public boolean equals(java.lang.Object);
- public abstract byte get();
- public abstract byte get(int);
- public java.nio.ByteBuffer get(byte[], int, int);
- public java.nio.ByteBuffer get(byte[]);
- public abstract char getChar();
- public abstract char getChar(int);
- public abstract double getDouble();
- public abstract double getDouble(int);
- public abstract float getFloat();
- public abstract float getFloat(int);
- public abstract int getInt();
- public abstract int getInt(int);
- public abstract long getLong();
- public abstract long getLong(int);
- public abstract short getShort();
- public abstract short getShort(int);
- public boolean hasArray();
- public int hashCode();
- public boolean isAccessible();
- public abstract boolean isDirect();
- public java.nio.ByteOrder order();
- public java.nio.ByteBuffer order(java.nio.ByteOrder);
- public abstract java.nio.ByteBuffer put(byte);
- public abstract java.nio.ByteBuffer put(int, byte);
- public java.nio.ByteBuffer put(java.nio.ByteBuffer);
- public java.nio.ByteBuffer put(byte[], int, int);
- public java.nio.ByteBuffer put(byte[]);
- public abstract java.nio.ByteBuffer putChar(char);
- public abstract java.nio.ByteBuffer putChar(int, char);
- public abstract java.nio.ByteBuffer putDouble(double);
- public abstract java.nio.ByteBuffer putDouble(int, double);
- public abstract java.nio.ByteBuffer putFloat(float);
- public abstract java.nio.ByteBuffer putFloat(int, float);
- public abstract java.nio.ByteBuffer putInt(int);
- public abstract java.nio.ByteBuffer putInt(int, int);
- public abstract java.nio.ByteBuffer putLong(long);
- public abstract java.nio.ByteBuffer putLong(int, long);
- public abstract java.nio.ByteBuffer putShort(short);
- public abstract java.nio.ByteBuffer putShort(int, short);
- public void setAccessible(boolean);
- public abstract java.nio.ByteBuffer slice();
- public java.lang.String toString();
- public static java.nio.ByteBuffer wrap(byte[], int, int);
- public static java.nio.ByteBuffer wrap(byte[]);
-
-
-}
-
--keep class java.nio.ByteOrder {
-
- public static java.nio.ByteOrder nativeOrder();
- public java.lang.String toString();
-
-
- public static java.nio.ByteOrder BIG_ENDIAN;
- public static java.nio.ByteOrder LITTLE_ENDIAN;
-}
-
--keep class java.nio.CharBuffer {
-
- public static java.nio.CharBuffer allocate(int);
- public java.nio.CharBuffer append(java.lang.CharSequence);
- public java.nio.CharBuffer append(java.lang.CharSequence, int, int);
- public java.nio.CharBuffer append(char);
- public java.lang.Appendable append(char);
- public java.lang.Appendable append(java.lang.CharSequence, int, int);
- public java.lang.Appendable append(java.lang.CharSequence);
- public char[] array();
- public java.lang.Object array();
- public int arrayOffset();
- public abstract java.nio.CharBuffer asReadOnlyBuffer();
- public char charAt(int);
- public java.util.stream.IntStream chars();
- public abstract java.nio.CharBuffer compact();
- public int compareTo(java.nio.CharBuffer);
- public int compareTo(java.lang.Object);
- public abstract java.nio.CharBuffer duplicate();
- public boolean equals(java.lang.Object);
- public abstract char get();
- public abstract char get(int);
- public java.nio.CharBuffer get(char[], int, int);
- public java.nio.CharBuffer get(char[]);
- public boolean hasArray();
- public int hashCode();
- public abstract boolean isDirect();
- public int length();
- public abstract java.nio.ByteOrder order();
- public abstract java.nio.CharBuffer put(char);
- public abstract java.nio.CharBuffer put(int, char);
- public java.nio.CharBuffer put(java.nio.CharBuffer);
- public java.nio.CharBuffer put(char[], int, int);
- public java.nio.CharBuffer put(char[]);
- public java.nio.CharBuffer put(java.lang.String, int, int);
- public java.nio.CharBuffer put(java.lang.String);
- public int read(java.nio.CharBuffer);
- public abstract java.nio.CharBuffer slice();
- public abstract java.nio.CharBuffer subSequence(int, int);
- public java.lang.CharSequence subSequence(int, int);
- public java.lang.String toString();
- public static java.nio.CharBuffer wrap(char[], int, int);
- public static java.nio.CharBuffer wrap(char[]);
- public static java.nio.CharBuffer wrap(java.lang.CharSequence, int, int);
- public static java.nio.CharBuffer wrap(java.lang.CharSequence);
-
-
-}
-
--keep class java.nio.DoubleBuffer {
-
- public static java.nio.DoubleBuffer allocate(int);
- public double[] array();
- public java.lang.Object array();
- public int arrayOffset();
- public abstract java.nio.DoubleBuffer asReadOnlyBuffer();
- public abstract java.nio.DoubleBuffer compact();
- public int compareTo(java.nio.DoubleBuffer);
- public int compareTo(java.lang.Object);
- public abstract java.nio.DoubleBuffer duplicate();
- public boolean equals(java.lang.Object);
- public abstract double get();
- public abstract double get(int);
- public java.nio.DoubleBuffer get(double[], int, int);
- public java.nio.DoubleBuffer get(double[]);
- public boolean hasArray();
- public int hashCode();
- public abstract boolean isDirect();
- public abstract java.nio.ByteOrder order();
- public abstract java.nio.DoubleBuffer put(double);
- public abstract java.nio.DoubleBuffer put(int, double);
- public java.nio.DoubleBuffer put(java.nio.DoubleBuffer);
- public java.nio.DoubleBuffer put(double[], int, int);
- public java.nio.DoubleBuffer put(double[]);
- public abstract java.nio.DoubleBuffer slice();
- public java.lang.String toString();
- public static java.nio.DoubleBuffer wrap(double[], int, int);
- public static java.nio.DoubleBuffer wrap(double[]);
-
-
-}
-
--keep class java.nio.FloatBuffer {
-
- public static java.nio.FloatBuffer allocate(int);
- public float[] array();
- public java.lang.Object array();
- public int arrayOffset();
- public abstract java.nio.FloatBuffer asReadOnlyBuffer();
- public abstract java.nio.FloatBuffer compact();
- public int compareTo(java.nio.FloatBuffer);
- public int compareTo(java.lang.Object);
- public abstract java.nio.FloatBuffer duplicate();
- public boolean equals(java.lang.Object);
- public abstract float get();
- public abstract float get(int);
- public java.nio.FloatBuffer get(float[], int, int);
- public java.nio.FloatBuffer get(float[]);
- public boolean hasArray();
- public int hashCode();
- public abstract boolean isDirect();
- public abstract java.nio.ByteOrder order();
- public abstract java.nio.FloatBuffer put(float);
- public abstract java.nio.FloatBuffer put(int, float);
- public java.nio.FloatBuffer put(java.nio.FloatBuffer);
- public java.nio.FloatBuffer put(float[], int, int);
- public java.nio.FloatBuffer put(float[]);
- public abstract java.nio.FloatBuffer slice();
- public java.lang.String toString();
- public static java.nio.FloatBuffer wrap(float[], int, int);
- public static java.nio.FloatBuffer wrap(float[]);
-
-
-}
-
--keep class java.nio.IntBuffer {
-
- public static java.nio.IntBuffer allocate(int);
- public int[] array();
- public java.lang.Object array();
- public int arrayOffset();
- public abstract java.nio.IntBuffer asReadOnlyBuffer();
- public abstract java.nio.IntBuffer compact();
- public int compareTo(java.nio.IntBuffer);
- public int compareTo(java.lang.Object);
- public abstract java.nio.IntBuffer duplicate();
- public boolean equals(java.lang.Object);
- public abstract int get();
- public abstract int get(int);
- public java.nio.IntBuffer get(int[], int, int);
- public java.nio.IntBuffer get(int[]);
- public boolean hasArray();
- public int hashCode();
- public abstract boolean isDirect();
- public abstract java.nio.ByteOrder order();
- public abstract java.nio.IntBuffer put(int);
- public abstract java.nio.IntBuffer put(int, int);
- public java.nio.IntBuffer put(java.nio.IntBuffer);
- public java.nio.IntBuffer put(int[], int, int);
- public java.nio.IntBuffer put(int[]);
- public abstract java.nio.IntBuffer slice();
- public java.lang.String toString();
- public static java.nio.IntBuffer wrap(int[], int, int);
- public static java.nio.IntBuffer wrap(int[]);
-
-
-}
-
--keep class java.nio.LongBuffer {
-
- public static java.nio.LongBuffer allocate(int);
- public long[] array();
- public java.lang.Object array();
- public int arrayOffset();
- public abstract java.nio.LongBuffer asReadOnlyBuffer();
- public abstract java.nio.LongBuffer compact();
- public int compareTo(java.nio.LongBuffer);
- public int compareTo(java.lang.Object);
- public abstract java.nio.LongBuffer duplicate();
- public boolean equals(java.lang.Object);
- public abstract long get();
- public abstract long get(int);
- public java.nio.LongBuffer get(long[], int, int);
- public java.nio.LongBuffer get(long[]);
- public boolean hasArray();
- public int hashCode();
- public abstract boolean isDirect();
- public abstract java.nio.ByteOrder order();
- public abstract java.nio.LongBuffer put(long);
- public abstract java.nio.LongBuffer put(int, long);
- public java.nio.LongBuffer put(java.nio.LongBuffer);
- public java.nio.LongBuffer put(long[], int, int);
- public java.nio.LongBuffer put(long[]);
- public abstract java.nio.LongBuffer slice();
- public java.lang.String toString();
- public static java.nio.LongBuffer wrap(long[], int, int);
- public static java.nio.LongBuffer wrap(long[]);
-
-
-}
-
--keep class java.nio.MappedByteBuffer {
-
- public java.nio.MappedByteBuffer force();
- public boolean isLoaded();
- public java.nio.MappedByteBuffer load();
-
-
-}
-
--keep class java.nio.ShortBuffer {
-
- public static java.nio.ShortBuffer allocate(int);
- public short[] array();
- public java.lang.Object array();
- public int arrayOffset();
- public abstract java.nio.ShortBuffer asReadOnlyBuffer();
- public abstract java.nio.ShortBuffer compact();
- public int compareTo(java.nio.ShortBuffer);
- public int compareTo(java.lang.Object);
- public abstract java.nio.ShortBuffer duplicate();
- public boolean equals(java.lang.Object);
- public abstract short get();
- public abstract short get(int);
- public java.nio.ShortBuffer get(short[], int, int);
- public java.nio.ShortBuffer get(short[]);
- public boolean hasArray();
- public int hashCode();
- public abstract boolean isDirect();
- public abstract java.nio.ByteOrder order();
- public abstract java.nio.ShortBuffer put(short);
- public abstract java.nio.ShortBuffer put(int, short);
- public java.nio.ShortBuffer put(java.nio.ShortBuffer);
- public java.nio.ShortBuffer put(short[], int, int);
- public java.nio.ShortBuffer put(short[]);
- public abstract java.nio.ShortBuffer slice();
- public java.lang.String toString();
- public static java.nio.ShortBuffer wrap(short[], int, int);
- public static java.nio.ShortBuffer wrap(short[]);
-
-
-}
-
--keep class java.nio.channels.AsynchronousCloseException {
- <init>();
-
-
-
-}
-
--keep class java.nio.channels.AsynchronousFileChannel {
- <init>();
-
- public abstract void force(boolean);
- public abstract void lock(long, long, boolean, java.lang.Object, java.nio.channels.CompletionHandler);
- public void lock(java.lang.Object, java.nio.channels.CompletionHandler);
- public abstract java.util.concurrent.Future lock(long, long, boolean);
- public java.util.concurrent.Future lock();
- public static java.nio.channels.AsynchronousFileChannel open(java.nio.file.Path, java.util.Set, java.util.concurrent.ExecutorService, java.nio.file.attribute.FileAttribute[]);
- public static java.nio.channels.AsynchronousFileChannel open(java.nio.file.Path, java.nio.file.OpenOption[]);
- public abstract void read(java.nio.ByteBuffer, long, java.lang.Object, java.nio.channels.CompletionHandler);
- public abstract java.util.concurrent.Future read(java.nio.ByteBuffer, long);
- public abstract long size();
- public abstract java.nio.channels.AsynchronousFileChannel truncate(long);
- public abstract java.nio.channels.FileLock tryLock(long, long, boolean);
- public java.nio.channels.FileLock tryLock();
- public abstract void write(java.nio.ByteBuffer, long, java.lang.Object, java.nio.channels.CompletionHandler);
- public abstract java.util.concurrent.Future write(java.nio.ByteBuffer, long);
-
-
-}
-
--keep class java.nio.channels.Channel {
-
- public abstract void close();
- public abstract boolean isOpen();
-
-
-}
-
--keep class java.nio.channels.ClosedChannelException {
- <init>();
-
-
-
-}
-
--keep class java.nio.channels.CompletionHandler {
-
- public abstract void completed(java.lang.Object, java.lang.Object);
- public abstract void failed(java.lang.Throwable, java.lang.Object);
-
-
-}
-
--keep class java.nio.channels.DatagramChannel {
- <init>(java.nio.channels.spi.SelectorProvider);
-
- public abstract java.nio.channels.DatagramChannel bind(java.net.SocketAddress);
- public java.nio.channels.NetworkChannel bind(java.net.SocketAddress);
- public abstract java.nio.channels.DatagramChannel connect(java.net.SocketAddress);
- public abstract java.nio.channels.DatagramChannel disconnect();
- public abstract java.net.SocketAddress getLocalAddress();
- public abstract java.net.SocketAddress getRemoteAddress();
- public abstract boolean isConnected();
- public static java.nio.channels.DatagramChannel open();
- public static java.nio.channels.DatagramChannel open(java.net.ProtocolFamily);
- public abstract int read(java.nio.ByteBuffer);
- public abstract long read(java.nio.ByteBuffer[], int, int);
- public long read(java.nio.ByteBuffer[]);
- public abstract java.net.SocketAddress receive(java.nio.ByteBuffer);
- public abstract int send(java.nio.ByteBuffer, java.net.SocketAddress);
- public abstract java.nio.channels.DatagramChannel setOption(java.net.SocketOption, java.lang.Object);
- public java.nio.channels.NetworkChannel setOption(java.net.SocketOption, java.lang.Object);
- public abstract java.net.DatagramSocket socket();
- public int validOps();
- public abstract int write(java.nio.ByteBuffer);
- public abstract long write(java.nio.ByteBuffer[], int, int);
- public long write(java.nio.ByteBuffer[]);
-
-
-}
-
--keep class java.nio.channels.FileChannel {
- <init>();
-
- public abstract void force(boolean);
- public abstract java.nio.channels.FileLock lock(long, long, boolean);
- public java.nio.channels.FileLock lock();
- public abstract java.nio.MappedByteBuffer map(java.nio.channels.FileChannel$MapMode, long, long);
- public static java.nio.channels.FileChannel open(java.nio.file.Path, java.util.Set, java.nio.file.attribute.FileAttribute[]);
- public static java.nio.channels.FileChannel open(java.nio.file.Path, java.nio.file.OpenOption[]);
- public abstract long position();
- public abstract java.nio.channels.FileChannel position(long);
- public java.nio.channels.SeekableByteChannel position(long);
- public abstract int read(java.nio.ByteBuffer);
- public abstract long read(java.nio.ByteBuffer[], int, int);
- public long read(java.nio.ByteBuffer[]);
- public abstract int read(java.nio.ByteBuffer, long);
- public abstract long size();
- public abstract long transferFrom(java.nio.channels.ReadableByteChannel, long, long);
- public abstract long transferTo(long, long, java.nio.channels.WritableByteChannel);
- public abstract java.nio.channels.FileChannel truncate(long);
- public java.nio.channels.SeekableByteChannel truncate(long);
- public abstract java.nio.channels.FileLock tryLock(long, long, boolean);
- public java.nio.channels.FileLock tryLock();
- public abstract int write(java.nio.ByteBuffer);
- public abstract long write(java.nio.ByteBuffer[], int, int);
- public long write(java.nio.ByteBuffer[]);
- public abstract int write(java.nio.ByteBuffer, long);
-
-
-}
-
--keep class java.nio.channels.FileChannel$MapMode {
-
- public java.lang.String toString();
-
-
- public static java.nio.channels.FileChannel$MapMode PRIVATE;
- public static java.nio.channels.FileChannel$MapMode READ_ONLY;
- public static java.nio.channels.FileChannel$MapMode READ_WRITE;
-}
-
--keep class java.nio.channels.FileLock {
- <init>(java.nio.channels.FileChannel, long, long, boolean);
- <init>(java.nio.channels.AsynchronousFileChannel, long, long, boolean);
-
- public java.nio.channels.Channel acquiredBy();
- public java.nio.channels.FileChannel channel();
- public void close();
- public boolean isShared();
- public abstract boolean isValid();
- public boolean overlaps(long, long);
- public long position();
- public abstract void release();
- public long size();
- public java.lang.String toString();
-
-
-}
-
--keep class java.nio.channels.NetworkChannel {
-
- public abstract java.nio.channels.NetworkChannel bind(java.net.SocketAddress);
- public abstract java.net.SocketAddress getLocalAddress();
- public abstract java.lang.Object getOption(java.net.SocketOption);
- public abstract java.nio.channels.NetworkChannel setOption(java.net.SocketOption, java.lang.Object);
- public abstract java.util.Set supportedOptions();
-
-
-}
-
--keep class java.nio.channels.Pipe {
- <init>();
-
- public static java.nio.channels.Pipe open();
- public abstract java.nio.channels.Pipe$SinkChannel sink();
- public abstract java.nio.channels.Pipe$SourceChannel source();
-
-
-}
-
--keep class java.nio.channels.Pipe$SinkChannel {
- <init>(java.nio.channels.spi.SelectorProvider);
-
- public int validOps();
-
-
-}
-
--keep class java.nio.channels.Pipe$SourceChannel {
- <init>(java.nio.channels.spi.SelectorProvider);
-
- public int validOps();
-
-
-}
-
--keep class java.nio.channels.ReadableByteChannel {
-
- public abstract int read(java.nio.ByteBuffer);
-
-
-}
-
--keep class java.nio.channels.SeekableByteChannel {
-
- public abstract long position();
- public abstract java.nio.channels.SeekableByteChannel position(long);
- public abstract int read(java.nio.ByteBuffer);
- public abstract long size();
- public abstract java.nio.channels.SeekableByteChannel truncate(long);
- public abstract int write(java.nio.ByteBuffer);
-
-
-}
-
--keep class java.nio.channels.SelectableChannel {
- <init>();
-
- public abstract java.lang.Object blockingLock();
- public abstract java.nio.channels.SelectableChannel configureBlocking(boolean);
- public abstract boolean isBlocking();
- public abstract boolean isRegistered();
- public abstract java.nio.channels.SelectionKey keyFor(java.nio.channels.Selector);
- public abstract java.nio.channels.spi.SelectorProvider provider();
- public abstract java.nio.channels.SelectionKey register(java.nio.channels.Selector, int, java.lang.Object);
- public java.nio.channels.SelectionKey register(java.nio.channels.Selector, int);
- public abstract int validOps();
-
-
-}
-
--keep class java.nio.channels.SelectionKey {
- <init>();
-
- public java.lang.Object attach(java.lang.Object);
- public java.lang.Object attachment();
- public abstract void cancel();
- public abstract java.nio.channels.SelectableChannel channel();
- public abstract int interestOps();
- public abstract java.nio.channels.SelectionKey interestOps(int);
- public boolean isAcceptable();
- public boolean isConnectable();
- public boolean isReadable();
- public abstract boolean isValid();
- public boolean isWritable();
- public abstract int readyOps();
- public abstract java.nio.channels.Selector selector();
-
-
- public static int OP_ACCEPT;
- public static int OP_CONNECT;
- public static int OP_READ;
- public static int OP_WRITE;
-}
-
--keep class java.nio.channels.Selector {
- <init>();
-
- public abstract void close();
- public abstract boolean isOpen();
- public abstract java.util.Set keys();
- public static java.nio.channels.Selector open();
- public abstract java.nio.channels.spi.SelectorProvider provider();
- public abstract int select(long);
- public abstract int select();
- public abstract int selectNow();
- public abstract java.util.Set selectedKeys();
- public abstract java.nio.channels.Selector wakeup();
-
-
-}
-
--keep class java.nio.channels.ServerSocketChannel {
- <init>(java.nio.channels.spi.SelectorProvider);
-
- public abstract java.nio.channels.SocketChannel accept();
- public java.nio.channels.ServerSocketChannel bind(java.net.SocketAddress);
- public abstract java.nio.channels.ServerSocketChannel bind(java.net.SocketAddress, int);
- public java.nio.channels.NetworkChannel bind(java.net.SocketAddress);
- public abstract java.net.SocketAddress getLocalAddress();
- public static java.nio.channels.ServerSocketChannel open();
- public abstract java.nio.channels.ServerSocketChannel setOption(java.net.SocketOption, java.lang.Object);
- public java.nio.channels.NetworkChannel setOption(java.net.SocketOption, java.lang.Object);
- public abstract java.net.ServerSocket socket();
- public int validOps();
-
-
-}
-
--keep class java.nio.channels.SocketChannel {
- <init>(java.nio.channels.spi.SelectorProvider);
-
- public abstract java.nio.channels.SocketChannel bind(java.net.SocketAddress);
- public java.nio.channels.NetworkChannel bind(java.net.SocketAddress);
- public abstract boolean connect(java.net.SocketAddress);
- public abstract boolean finishConnect();
- public abstract java.net.SocketAddress getLocalAddress();
- public abstract java.net.SocketAddress getRemoteAddress();
- public abstract boolean isConnected();
- public abstract boolean isConnectionPending();
- public static java.nio.channels.SocketChannel open();
- public static java.nio.channels.SocketChannel open(java.net.SocketAddress);
- public abstract int read(java.nio.ByteBuffer);
- public abstract long read(java.nio.ByteBuffer[], int, int);
- public long read(java.nio.ByteBuffer[]);
- public abstract java.nio.channels.SocketChannel setOption(java.net.SocketOption, java.lang.Object);
- public java.nio.channels.NetworkChannel setOption(java.net.SocketOption, java.lang.Object);
- public abstract java.nio.channels.SocketChannel shutdownInput();
- public abstract java.nio.channels.SocketChannel shutdownOutput();
- public abstract java.net.Socket socket();
- public int validOps();
- public abstract int write(java.nio.ByteBuffer);
- public abstract long write(java.nio.ByteBuffer[], int, int);
- public long write(java.nio.ByteBuffer[]);
-
-
-}
-
--keep class java.nio.channels.WritableByteChannel {
-
- public abstract int write(java.nio.ByteBuffer);
-
-
-}
-
--keep class java.nio.channels.spi.AbstractInterruptibleChannel {
- <init>();
-
- protected void begin();
- public void close();
- protected void end(boolean);
- protected abstract void implCloseChannel();
- public boolean isOpen();
-
-
-}
-
--keep class java.nio.channels.spi.AbstractSelectableChannel {
- <init>(java.nio.channels.spi.SelectorProvider);
-
- public java.lang.Object blockingLock();
- public java.nio.channels.SelectableChannel configureBlocking(boolean);
- protected void implCloseChannel();
- protected abstract void implCloseSelectableChannel();
- protected abstract void implConfigureBlocking(boolean);
- public boolean isBlocking();
- public boolean isRegistered();
- public java.nio.channels.SelectionKey keyFor(java.nio.channels.Selector);
- public java.nio.channels.spi.SelectorProvider provider();
- public java.nio.channels.SelectionKey register(java.nio.channels.Selector, int, java.lang.Object);
-
-
-}
-
--keep class java.nio.channels.spi.AbstractSelectionKey {
- <init>();
-
- public void cancel();
- public boolean isValid();
-
-
-}
-
--keep class java.nio.channels.spi.AbstractSelector {
- <init>(java.nio.channels.spi.SelectorProvider);
-
- protected void begin();
- protected java.util.Set cancelledKeys();
- public void close();
- protected void deregister(java.nio.channels.spi.AbstractSelectionKey);
- protected void end();
- protected abstract void implCloseSelector();
- public boolean isOpen();
- public java.nio.channels.spi.SelectorProvider provider();
- protected abstract java.nio.channels.SelectionKey register(java.nio.channels.spi.AbstractSelectableChannel, int, java.lang.Object);
-
-
-}
-
--keep class java.nio.channels.spi.SelectorProvider {
- <init>();
-
- public java.nio.channels.Channel inheritedChannel();
- public abstract java.nio.channels.DatagramChannel openDatagramChannel();
- public abstract java.nio.channels.DatagramChannel openDatagramChannel(java.net.ProtocolFamily);
- public abstract java.nio.channels.Pipe openPipe();
- public abstract java.nio.channels.spi.AbstractSelector openSelector();
- public abstract java.nio.channels.ServerSocketChannel openServerSocketChannel();
- public abstract java.nio.channels.SocketChannel openSocketChannel();
- public static java.nio.channels.spi.SelectorProvider provider();
-
-
-}
-
--keep class java.nio.charset.CharacterCodingException {
- <init>();
-
-
-
-}
-
--keep class java.nio.charset.Charset {
- <init>(java.lang.String, java.lang.String[]);
-
- public java.util.Set aliases();
- public static java.util.SortedMap availableCharsets();
- public boolean canEncode();
- public int compareTo(java.nio.charset.Charset);
- public int compareTo(java.lang.Object);
- public abstract boolean contains(java.nio.charset.Charset);
- public java.nio.CharBuffer decode(java.nio.ByteBuffer);
- public static java.nio.charset.Charset defaultCharset();
- public java.lang.String displayName();
- public java.lang.String displayName(java.util.Locale);
- public java.nio.ByteBuffer encode(java.nio.CharBuffer);
- public java.nio.ByteBuffer encode(java.lang.String);
- public boolean equals(java.lang.Object);
- public static java.nio.charset.Charset forName(java.lang.String);
- public static java.nio.charset.Charset forNameUEE(java.lang.String);
- public int hashCode();
- public boolean isRegistered();
- public static boolean isSupported(java.lang.String);
- public java.lang.String name();
- public abstract java.nio.charset.CharsetDecoder newDecoder();
- public abstract java.nio.charset.CharsetEncoder newEncoder();
- public java.lang.String toString();
-
-
-}
-
--keep class java.nio.charset.CharsetDecoder {
- <init>(java.nio.charset.Charset, float, float);
-
- public float averageCharsPerByte();
- public java.nio.charset.Charset charset();
- public java.nio.charset.CoderResult decode(java.nio.ByteBuffer, java.nio.CharBuffer, boolean);
- public java.nio.CharBuffer decode(java.nio.ByteBuffer);
- protected abstract java.nio.charset.CoderResult decodeLoop(java.nio.ByteBuffer, java.nio.CharBuffer);
- public java.nio.charset.Charset detectedCharset();
- public java.nio.charset.CoderResult flush(java.nio.CharBuffer);
- protected java.nio.charset.CoderResult implFlush(java.nio.CharBuffer);
- protected void implOnMalformedInput(java.nio.charset.CodingErrorAction);
- protected void implOnUnmappableCharacter(java.nio.charset.CodingErrorAction);
- protected void implReplaceWith(java.lang.String);
- protected void implReset();
- public boolean isAutoDetecting();
- public boolean isCharsetDetected();
- public java.nio.charset.CodingErrorAction malformedInputAction();
- public float maxCharsPerByte();
- public java.nio.charset.CharsetDecoder onMalformedInput(java.nio.charset.CodingErrorAction);
- public java.nio.charset.CharsetDecoder onUnmappableCharacter(java.nio.charset.CodingErrorAction);
- public java.nio.charset.CharsetDecoder replaceWith(java.lang.String);
- public java.lang.String replacement();
- public java.nio.charset.CharsetDecoder reset();
- public java.nio.charset.CodingErrorAction unmappableCharacterAction();
-
-
-}
-
--keep class java.nio.charset.CharsetEncoder {
- <init>(java.nio.charset.Charset, float, float, byte[]);
- <init>(java.nio.charset.Charset, float, float);
-
- public float averageBytesPerChar();
- public boolean canEncode(char);
- public boolean canEncode(java.lang.CharSequence);
- public java.nio.charset.Charset charset();
- public java.nio.charset.CoderResult encode(java.nio.CharBuffer, java.nio.ByteBuffer, boolean);
- public java.nio.ByteBuffer encode(java.nio.CharBuffer);
- protected abstract java.nio.charset.CoderResult encodeLoop(java.nio.CharBuffer, java.nio.ByteBuffer);
- public java.nio.charset.CoderResult flush(java.nio.ByteBuffer);
- protected java.nio.charset.CoderResult implFlush(java.nio.ByteBuffer);
- protected void implOnMalformedInput(java.nio.charset.CodingErrorAction);
- protected void implOnUnmappableCharacter(java.nio.charset.CodingErrorAction);
- protected void implReplaceWith(byte[]);
- protected void implReset();
- public boolean isLegalReplacement(byte[]);
- public java.nio.charset.CodingErrorAction malformedInputAction();
- public float maxBytesPerChar();
- public java.nio.charset.CharsetEncoder onMalformedInput(java.nio.charset.CodingErrorAction);
- public java.nio.charset.CharsetEncoder onUnmappableCharacter(java.nio.charset.CodingErrorAction);
- public java.nio.charset.CharsetEncoder replaceWith(byte[]);
- public byte[] replacement();
- public java.nio.charset.CharsetEncoder reset();
- public java.nio.charset.CodingErrorAction unmappableCharacterAction();
-
-
-}
-
--keep class java.nio.charset.CoderResult {
-
- public boolean isError();
- public boolean isMalformed();
- public boolean isOverflow();
- public boolean isUnderflow();
- public boolean isUnmappable();
- public int length();
- public static java.nio.charset.CoderResult malformedForLength(int);
- public void throwException();
- public java.lang.String toString();
- public static java.nio.charset.CoderResult unmappableForLength(int);
-
-
- public static java.nio.charset.CoderResult OVERFLOW;
- public static java.nio.charset.CoderResult UNDERFLOW;
-}
-
--keep class java.nio.charset.CodingErrorAction {
-
- public java.lang.String toString();
-
-
- public static java.nio.charset.CodingErrorAction IGNORE;
- public static java.nio.charset.CodingErrorAction REPLACE;
- public static java.nio.charset.CodingErrorAction REPORT;
-}
-
--keep class java.nio.file.AccessMode {
-
- public static java.nio.file.AccessMode valueOf(java.lang.String);
- public static java.nio.file.AccessMode[] values();
-
- public static java.nio.file.AccessMode EXECUTE;
- public static java.nio.file.AccessMode READ;
- public static java.nio.file.AccessMode WRITE;
-
-}
-
--keep class java.nio.file.CopyOption {
-
-
-
-}
-
--keep class java.nio.file.DirectoryStream {
-
- public abstract java.util.Iterator iterator();
-
-
-}
-
--keep class java.nio.file.DirectoryStream$Filter {
-
- public abstract boolean accept(java.lang.Object);
-
-
-}
-
--keep class java.nio.file.FileStore {
- <init>();
-
- public abstract java.lang.Object getAttribute(java.lang.String);
- public abstract java.nio.file.attribute.FileStoreAttributeView getFileStoreAttributeView(java.lang.Class);
- public abstract long getTotalSpace();
- public abstract long getUnallocatedSpace();
- public abstract long getUsableSpace();
- public abstract boolean isReadOnly();
- public abstract java.lang.String name();
- public abstract boolean supportsFileAttributeView(java.lang.Class);
- public abstract boolean supportsFileAttributeView(java.lang.String);
- public abstract java.lang.String type();
-
-
-}
-
--keep class java.nio.file.FileSystem {
- <init>();
-
- public abstract void close();
- public abstract java.lang.Iterable getFileStores();
- public abstract java.nio.file.Path getPath(java.lang.String, java.lang.String[]);
- public abstract java.nio.file.PathMatcher getPathMatcher(java.lang.String);
- public abstract java.lang.Iterable getRootDirectories();
- public abstract java.lang.String getSeparator();
- public abstract java.nio.file.attribute.UserPrincipalLookupService getUserPrincipalLookupService();
- public abstract boolean isOpen();
- public abstract boolean isReadOnly();
- public abstract java.nio.file.WatchService newWatchService();
- public abstract java.nio.file.spi.FileSystemProvider provider();
- public abstract java.util.Set supportedFileAttributeViews();
-
-
-}
-
--keep class java.nio.file.LinkOption {
-
- public static java.nio.file.LinkOption valueOf(java.lang.String);
- public static java.nio.file.LinkOption[] values();
-
- public static java.nio.file.LinkOption NOFOLLOW_LINKS;
-
-}
-
--keep class java.nio.file.OpenOption {
-
-
-
-}
-
--keep class java.nio.file.Path {
-
- public abstract int compareTo(java.nio.file.Path);
- public int compareTo(java.lang.Object);
- public abstract boolean endsWith(java.nio.file.Path);
- public abstract boolean endsWith(java.lang.String);
- public abstract boolean equals(java.lang.Object);
- public abstract java.nio.file.Path getFileName();
- public abstract java.nio.file.FileSystem getFileSystem();
- public abstract java.nio.file.Path getName(int);
- public abstract int getNameCount();
- public abstract java.nio.file.Path getParent();
- public abstract java.nio.file.Path getRoot();
- public abstract int hashCode();
- public abstract boolean isAbsolute();
- public abstract java.util.Iterator iterator();
- public abstract java.nio.file.Path normalize();
- public abstract java.nio.file.WatchKey register(java.nio.file.WatchService, java.nio.file.WatchEvent$Kind[], java.nio.file.WatchEvent$Modifier[]);
- public abstract java.nio.file.WatchKey register(java.nio.file.WatchService, java.nio.file.WatchEvent$Kind[]);
- public abstract java.nio.file.Path relativize(java.nio.file.Path);
- public abstract java.nio.file.Path resolve(java.nio.file.Path);
- public abstract java.nio.file.Path resolve(java.lang.String);
- public abstract java.nio.file.Path resolveSibling(java.nio.file.Path);
- public abstract java.nio.file.Path resolveSibling(java.lang.String);
- public abstract boolean startsWith(java.nio.file.Path);
- public abstract boolean startsWith(java.lang.String);
- public abstract java.nio.file.Path subpath(int, int);
- public abstract java.nio.file.Path toAbsolutePath();
- public abstract java.io.File toFile();
- public abstract java.nio.file.Path toRealPath(java.nio.file.LinkOption[]);
- public abstract java.lang.String toString();
- public abstract java.net.URI toUri();
-
-
-}
-
--keep class java.nio.file.PathMatcher {
-
- public abstract boolean matches(java.nio.file.Path);
-
-
-}
-
--keep class java.nio.file.WatchEvent {
-
- public abstract java.lang.Object context();
- public abstract int count();
- public abstract java.nio.file.WatchEvent$Kind kind();
-
-
-}
-
--keep class java.nio.file.WatchEvent$Kind {
-
- public abstract java.lang.String name();
- public abstract java.lang.Class type();
-
-
-}
-
--keep class java.nio.file.WatchEvent$Modifier {
-
- public abstract java.lang.String name();
-
-
-}
-
--keep class java.nio.file.WatchKey {
-
- public abstract void cancel();
- public abstract boolean isValid();
- public abstract java.util.List pollEvents();
- public abstract boolean reset();
- public abstract java.nio.file.Watchable watchable();
-
-
-}
-
--keep class java.nio.file.WatchService {
-
- public abstract void close();
- public abstract java.nio.file.WatchKey poll();
- public abstract java.nio.file.WatchKey poll(long, java.util.concurrent.TimeUnit);
- public abstract java.nio.file.WatchKey take();
-
-
-}
-
--keep class java.nio.file.Watchable {
-
- public abstract java.nio.file.WatchKey register(java.nio.file.WatchService, java.nio.file.WatchEvent$Kind[], java.nio.file.WatchEvent$Modifier[]);
- public abstract java.nio.file.WatchKey register(java.nio.file.WatchService, java.nio.file.WatchEvent$Kind[]);
-
-
-}
-
--keep class java.nio.file.attribute.BasicFileAttributes {
-
- public abstract java.nio.file.attribute.FileTime creationTime();
- public abstract java.lang.Object fileKey();
- public abstract boolean isDirectory();
- public abstract boolean isOther();
- public abstract boolean isRegularFile();
- public abstract boolean isSymbolicLink();
- public abstract java.nio.file.attribute.FileTime lastAccessTime();
- public abstract java.nio.file.attribute.FileTime lastModifiedTime();
- public abstract long size();
-
-
-}
-
--keep class java.nio.file.attribute.FileAttribute {
-
- public abstract java.lang.String name();
- public abstract java.lang.Object value();
-
-
-}
-
--keep class java.nio.file.attribute.FileAttributeView {
-
-
-
-}
-
--keep class java.nio.file.attribute.FileStoreAttributeView {
-
-
-
-}
-
--keep class java.nio.file.attribute.FileTime {
-
- public int compareTo(java.nio.file.attribute.FileTime);
- public int compareTo(java.lang.Object);
- public boolean equals(java.lang.Object);
- public static java.nio.file.attribute.FileTime from(long, java.util.concurrent.TimeUnit);
- public static java.nio.file.attribute.FileTime from(java.time.Instant);
- public static java.nio.file.attribute.FileTime fromMillis(long);
- public int hashCode();
- public long to(java.util.concurrent.TimeUnit);
- public java.time.Instant toInstant();
- public long toMillis();
- public java.lang.String toString();
-
-
-}
-
--keep class java.nio.file.attribute.GroupPrincipal {
-
-
-
-}
-
--keep class java.nio.file.attribute.UserPrincipal {
-
-
-
-}
-
--keep class java.nio.file.attribute.UserPrincipalLookupService {
- <init>();
-
- public abstract java.nio.file.attribute.GroupPrincipal lookupPrincipalByGroupName(java.lang.String);
- public abstract java.nio.file.attribute.UserPrincipal lookupPrincipalByName(java.lang.String);
-
-
-}
-
--keep class java.nio.file.spi.FileSystemProvider {
- <init>();
-
- public abstract void checkAccess(java.nio.file.Path, java.nio.file.AccessMode[]);
- public abstract void copy(java.nio.file.Path, java.nio.file.Path, java.nio.file.CopyOption[]);
- public abstract void createDirectory(java.nio.file.Path, java.nio.file.attribute.FileAttribute[]);
- public void createLink(java.nio.file.Path, java.nio.file.Path);
- public void createSymbolicLink(java.nio.file.Path, java.nio.file.Path, java.nio.file.attribute.FileAttribute[]);
- public abstract void delete(java.nio.file.Path);
- public boolean deleteIfExists(java.nio.file.Path);
- public abstract java.nio.file.attribute.FileAttributeView getFileAttributeView(java.nio.file.Path, java.lang.Class, java.nio.file.LinkOption[]);
- public abstract java.nio.file.FileStore getFileStore(java.nio.file.Path);
- public abstract java.nio.file.FileSystem getFileSystem(java.net.URI);
- public abstract java.nio.file.Path getPath(java.net.URI);
- public abstract java.lang.String getScheme();
- public static java.util.List installedProviders();
- public abstract boolean isHidden(java.nio.file.Path);
- public abstract boolean isSameFile(java.nio.file.Path, java.nio.file.Path);
- public abstract void move(java.nio.file.Path, java.nio.file.Path, java.nio.file.CopyOption[]);
- public java.nio.channels.AsynchronousFileChannel newAsynchronousFileChannel(java.nio.file.Path, java.util.Set, java.util.concurrent.ExecutorService, java.nio.file.attribute.FileAttribute[]);
- public abstract java.nio.channels.SeekableByteChannel newByteChannel(java.nio.file.Path, java.util.Set, java.nio.file.attribute.FileAttribute[]);
- public abstract java.nio.file.DirectoryStream newDirectoryStream(java.nio.file.Path, java.nio.file.DirectoryStream$Filter);
- public java.nio.channels.FileChannel newFileChannel(java.nio.file.Path, java.util.Set, java.nio.file.attribute.FileAttribute[]);
- public abstract java.nio.file.FileSystem newFileSystem(java.net.URI, java.util.Map);
- public java.nio.file.FileSystem newFileSystem(java.nio.file.Path, java.util.Map);
- public java.io.InputStream newInputStream(java.nio.file.Path, java.nio.file.OpenOption[]);
- public java.io.OutputStream newOutputStream(java.nio.file.Path, java.nio.file.OpenOption[]);
- public abstract java.nio.file.attribute.BasicFileAttributes readAttributes(java.nio.file.Path, java.lang.Class, java.nio.file.LinkOption[]);
- public abstract java.util.Map readAttributes(java.nio.file.Path, java.lang.String, java.nio.file.LinkOption[]);
- public java.nio.file.Path readSymbolicLink(java.nio.file.Path);
- public abstract void setAttribute(java.nio.file.Path, java.lang.String, java.lang.Object, java.nio.file.LinkOption[]);
-
-
-}
-
--keep class java.security.AccessControlContext {
- <init>(java.security.ProtectionDomain[]);
- <init>(java.security.AccessControlContext, java.security.DomainCombiner);
-
- public void checkPermission(java.security.Permission);
- public java.security.DomainCombiner getDomainCombiner();
-
-
-}
-
--keep class java.security.AccessControlException {
- <init>(java.lang.String);
- <init>(java.lang.String, java.security.Permission);
-
- public java.security.Permission getPermission();
-
-
-}
-
--keep class java.security.CodeSigner {
- <init>(java.security.cert.CertPath, java.security.Timestamp);
-
- public boolean equals(java.lang.Object);
- public java.security.cert.CertPath getSignerCertPath();
- public java.security.Timestamp getTimestamp();
- public int hashCode();
- public java.lang.String toString();
-
-
-}
-
--keep class java.security.CodeSource {
- <init>(java.net.URL, java.security.cert.Certificate[]);
- <init>(java.net.URL, java.security.CodeSigner[]);
-
- public java.security.cert.Certificate[] getCertificates();
- public java.security.CodeSigner[] getCodeSigners();
- public java.net.URL getLocation();
- public boolean implies(java.security.CodeSource);
-
-
-}
-
--keep class java.security.DomainCombiner {
-
- public abstract java.security.ProtectionDomain[] combine(java.security.ProtectionDomain[], java.security.ProtectionDomain[]);
-
-
-}
-
--keep class java.security.GeneralSecurityException {
- <init>();
- <init>(java.lang.String);
- <init>(java.lang.String, java.lang.Throwable);
- <init>(java.lang.Throwable);
-
-
-
-}
-
--keep class java.security.InvalidKeyException {
- <init>();
- <init>(java.lang.String);
- <init>(java.lang.String, java.lang.Throwable);
- <init>(java.lang.Throwable);
-
-
-
-}
-
--keep class java.security.KeyException {
- <init>();
- <init>(java.lang.String);
- <init>(java.lang.String, java.lang.Throwable);
- <init>(java.lang.Throwable);
-
-
-
-}
-
--keep class java.security.NoSuchAlgorithmException {
- <init>();
- <init>(java.lang.String);
- <init>(java.lang.String, java.lang.Throwable);
- <init>(java.lang.Throwable);
-
-
-
-}
-
--keep class java.security.NoSuchProviderException {
- <init>();
- <init>(java.lang.String);
-
-
-
-}
-
--keep class java.security.Permission {
- <init>(java.lang.String);
-
- public void checkGuard(java.lang.Object);
- public abstract java.lang.String getActions();
- public java.lang.String getName();
- public abstract boolean implies(java.security.Permission);
- public java.security.PermissionCollection newPermissionCollection();
-
-
-}
-
--keep class java.security.PermissionCollection {
- <init>();
-
- public abstract void add(java.security.Permission);
- public abstract java.util.Enumeration elements();
- public abstract boolean implies(java.security.Permission);
- public boolean isReadOnly();
- public void setReadOnly();
-
-
-}
-
--keep class java.security.Principal {
-
- public abstract boolean equals(java.lang.Object);
- public abstract java.lang.String getName();
- public abstract int hashCode();
- public boolean implies(javax.security.auth.Subject);
- public abstract java.lang.String toString();
-
-
-}
-
--keep class java.security.PrivilegedAction {
-
- public abstract java.lang.Object run();
-
-
-}
-
--keep class java.security.PrivilegedActionException {
- <init>(java.lang.Exception);
-
- public java.lang.Throwable getCause();
- public java.lang.Exception getException();
- public java.lang.String toString();
-
-
-}
-
--keep class java.security.PrivilegedExceptionAction {
-
- public abstract java.lang.Object run();
-
-
-}
-
--keep class java.security.ProtectionDomain {
- <init>(java.security.CodeSource, java.security.PermissionCollection);
- <init>(java.security.CodeSource, java.security.PermissionCollection, java.lang.ClassLoader, java.security.Principal[]);
-
- public java.lang.ClassLoader getClassLoader();
- public java.security.CodeSource getCodeSource();
- public java.security.PermissionCollection getPermissions();
- public java.security.Principal[] getPrincipals();
- public boolean implies(java.security.Permission);
-
-
-}
-
--keep class java.security.Provider {
- <init>(java.lang.String, double, java.lang.String);
-
- public synchronized void clear();
- public synchronized java.lang.Object compute(java.lang.Object, java.util.function.BiFunction);
- public synchronized java.lang.Object computeIfAbsent(java.lang.Object, java.util.function.Function);
- public synchronized java.lang.Object computeIfPresent(java.lang.Object, java.util.function.BiFunction);
- public java.util.Enumeration elements();
- public synchronized java.util.Set entrySet();
- public synchronized void forEach(java.util.function.BiConsumer);
- public java.lang.Object get(java.lang.Object);
- public java.lang.String getInfo();
- public java.lang.String getName();
- public synchronized java.lang.Object getOrDefault(java.lang.Object, java.lang.Object);
- public java.lang.String getProperty(java.lang.String);
- public synchronized java.security.Provider$Service getService(java.lang.String, java.lang.String);
- public synchronized java.util.Set getServices();
- public double getVersion();
- public boolean isRegistered();
- public java.util.Set keySet();
- public java.util.Enumeration keys();
- public synchronized void load(java.io.InputStream);
- public synchronized java.lang.Object merge(java.lang.Object, java.lang.Object, java.util.function.BiFunction);
- public synchronized java.lang.Object put(java.lang.Object, java.lang.Object);
- public synchronized void putAll(java.util.Map);
- public synchronized java.lang.Object putIfAbsent(java.lang.Object, java.lang.Object);
- protected synchronized void putService(java.security.Provider$Service);
- public synchronized java.lang.Object remove(java.lang.Object);
- public synchronized boolean remove(java.lang.Object, java.lang.Object);
- protected synchronized void removeService(java.security.Provider$Service);
- public synchronized boolean replace(java.lang.Object, java.lang.Object, java.lang.Object);
- public synchronized java.lang.Object replace(java.lang.Object, java.lang.Object);
- public synchronized void replaceAll(java.util.function.BiFunction);
- public void setRegistered();
- public void setUnregistered();
- public java.lang.String toString();
- public java.util.Collection values();
- public synchronized void warmUpServiceProvision();
-
-
-}
-
--keep class java.security.Provider$Service {
- <init>(java.security.Provider, java.lang.String, java.lang.String, java.lang.String, java.util.List, java.util.Map);
-
- public java.lang.String getAlgorithm();
- public java.lang.String getAttribute(java.lang.String);
- public java.lang.String getClassName();
- public java.security.Provider getProvider();
- public java.lang.String getType();
- public java.lang.Object newInstance(java.lang.Object);
- public boolean supportsParameter(java.lang.Object);
- public java.lang.String toString();
-
-
-}
-
--keep class java.security.PublicKey {
-
-
-
- public static long serialVersionUID;
-}
-
--keep class java.security.SignatureException {
- <init>();
- <init>(java.lang.String);
- <init>(java.lang.String, java.lang.Throwable);
- <init>(java.lang.Throwable);
-
-
-
-}
-
--keep class java.security.Timestamp {
- <init>(java.util.Date, java.security.cert.CertPath);
-
- public boolean equals(java.lang.Object);
- public java.security.cert.CertPath getSignerCertPath();
- public java.util.Date getTimestamp();
- public int hashCode();
- public java.lang.String toString();
-
-
-}
-
--keep class java.security.cert.CRL {
- <init>(java.lang.String);
-
- public java.lang.String getType();
- public abstract boolean isRevoked(java.security.cert.Certificate);
- public abstract java.lang.String toString();
-
-
-}
-
--keep class java.security.cert.CRLException {
- <init>();
- <init>(java.lang.String);
- <init>(java.lang.String, java.lang.Throwable);
- <init>(java.lang.Throwable);
-
-
-
-}
-
--keep class java.security.cert.CertPath {
- <init>(java.lang.String);
-
- public boolean equals(java.lang.Object);
- public abstract java.util.List getCertificates();
- public abstract byte[] getEncoded();
- public abstract byte[] getEncoded(java.lang.String);
- public abstract java.util.Iterator getEncodings();
- public java.lang.String getType();
- public int hashCode();
- public java.lang.String toString();
- protected java.lang.Object writeReplace();
-
-
-}
-
--keep class java.security.cert.Certificate {
- <init>(java.lang.String);
-
- public boolean equals(java.lang.Object);
- public abstract byte[] getEncoded();
- public abstract java.security.PublicKey getPublicKey();
- public java.lang.String getType();
- public int hashCode();
- public abstract java.lang.String toString();
- public abstract void verify(java.security.PublicKey);
- public abstract void verify(java.security.PublicKey, java.lang.String);
- public void verify(java.security.PublicKey, java.security.Provider);
- protected java.lang.Object writeReplace();
-
-
-}
-
--keep class java.security.cert.CertificateEncodingException {
- <init>();
- <init>(java.lang.String);
- <init>(java.lang.String, java.lang.Throwable);
- <init>(java.lang.Throwable);
-
-
-
-}
-
--keep class java.security.cert.CertificateException {
- <init>();
- <init>(java.lang.String);
- <init>(java.lang.String, java.lang.Throwable);
- <init>(java.lang.Throwable);
-
-
-
-}
-
--keep class java.security.cert.CertificateFactory {
- <init>(java.security.cert.CertificateFactorySpi, java.security.Provider, java.lang.String);
-
- public java.security.cert.CRL generateCRL(java.io.InputStream);
- public java.util.Collection generateCRLs(java.io.InputStream);
- public java.security.cert.CertPath generateCertPath(java.io.InputStream);
- public java.security.cert.CertPath generateCertPath(java.io.InputStream, java.lang.String);
- public java.security.cert.CertPath generateCertPath(java.util.List);
- public java.security.cert.Certificate generateCertificate(java.io.InputStream);
- public java.util.Collection generateCertificates(java.io.InputStream);
- public java.util.Iterator getCertPathEncodings();
- public static java.security.cert.CertificateFactory getInstance(java.lang.String);
- public static java.security.cert.CertificateFactory getInstance(java.lang.String, java.lang.String);
- public static java.security.cert.CertificateFactory getInstance(java.lang.String, java.security.Provider);
- public java.security.Provider getProvider();
- public java.lang.String getType();
-
-
-}
-
--keep class java.security.cert.CertificateFactorySpi {
- <init>();
-
- public abstract java.security.cert.CRL engineGenerateCRL(java.io.InputStream);
- public abstract java.util.Collection engineGenerateCRLs(java.io.InputStream);
- public java.security.cert.CertPath engineGenerateCertPath(java.io.InputStream);
- public java.security.cert.CertPath engineGenerateCertPath(java.io.InputStream, java.lang.String);
- public java.security.cert.CertPath engineGenerateCertPath(java.util.List);
- public abstract java.security.cert.Certificate engineGenerateCertificate(java.io.InputStream);
- public abstract java.util.Collection engineGenerateCertificates(java.io.InputStream);
- public java.util.Iterator engineGetCertPathEncodings();
-
-
-}
-
--keep class java.text.AttributedCharacterIterator {
-
- public abstract java.util.Set getAllAttributeKeys();
- public abstract java.lang.Object getAttribute(java.text.AttributedCharacterIterator$Attribute);
- public abstract java.util.Map getAttributes();
- public abstract int getRunLimit();
- public abstract int getRunLimit(java.text.AttributedCharacterIterator$Attribute);
- public abstract int getRunLimit(java.util.Set);
- public abstract int getRunStart();
- public abstract int getRunStart(java.text.AttributedCharacterIterator$Attribute);
- public abstract int getRunStart(java.util.Set);
-
-
-}
-
--keep class java.text.AttributedCharacterIterator$Attribute {
- <init>(java.lang.String);
-
- public boolean equals(java.lang.Object);
- protected java.lang.String getName();
- public int hashCode();
- protected java.lang.Object readResolve();
- public java.lang.String toString();
-
-
- public static java.text.AttributedCharacterIterator$Attribute INPUT_METHOD_SEGMENT;
- public static java.text.AttributedCharacterIterator$Attribute LANGUAGE;
- public static java.text.AttributedCharacterIterator$Attribute READING;
-}
-
--keep class java.text.FieldPosition {
- <init>(int);
- <init>(java.text.Format$Field);
- <init>(java.text.Format$Field, int);
-
- public boolean equals(java.lang.Object);
- public int getBeginIndex();
- public int getEndIndex();
- public int getField();
- public java.text.Format$Field getFieldAttribute();
- public int hashCode();
- public void setBeginIndex(int);
- public void setEndIndex(int);
- public java.lang.String toString();
-
-
-}
-
--keep class java.text.Format {
- <init>();
-
- public java.lang.Object clone();
- public java.lang.String format(java.lang.Object);
- public abstract java.lang.StringBuffer format(java.lang.Object, java.lang.StringBuffer, java.text.FieldPosition);
- public java.text.AttributedCharacterIterator formatToCharacterIterator(java.lang.Object);
- public abstract java.lang.Object parseObject(java.lang.String, java.text.ParsePosition);
- public java.lang.Object parseObject(java.lang.String);
-
-
-}
-
--keep class java.text.Format$Field {
- <init>(java.lang.String);
-
-
-
-}
-
--keep class java.text.ParseException {
- <init>(java.lang.String, int);
-
- public int getErrorOffset();
-
-
-}
-
--keep class java.text.ParsePosition {
- <init>(int);
-
- public boolean equals(java.lang.Object);
- public int getErrorIndex();
- public int getIndex();
- public int hashCode();
- public void setErrorIndex(int);
- public void setIndex(int);
- public java.lang.String toString();
-
-
-}
-
--keep class java.time.Clock {
- <init>();
-
- public boolean equals(java.lang.Object);
- public static java.time.Clock fixed(java.time.Instant, java.time.ZoneId);
- public abstract java.time.ZoneId getZone();
- public int hashCode();
- public abstract java.time.Instant instant();
- public long millis();
- public static java.time.Clock offset(java.time.Clock, java.time.Duration);
- public static java.time.Clock system(java.time.ZoneId);
- public static java.time.Clock systemDefaultZone();
- public static java.time.Clock systemUTC();
- public static java.time.Clock tick(java.time.Clock, java.time.Duration);
- public static java.time.Clock tickMinutes(java.time.ZoneId);
- public static java.time.Clock tickSeconds(java.time.ZoneId);
- public abstract java.time.Clock withZone(java.time.ZoneId);
-
-
-}
-
--keep class java.time.DayOfWeek {
-
- public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
- public static java.time.DayOfWeek from(java.time.temporal.TemporalAccessor);
- public int get(java.time.temporal.TemporalField);
- public java.lang.String getDisplayName(java.time.format.TextStyle, java.util.Locale);
- public long getLong(java.time.temporal.TemporalField);
- public int getValue();
- public boolean isSupported(java.time.temporal.TemporalField);
- public java.time.DayOfWeek minus(long);
- public static java.time.DayOfWeek of(int);
- public java.time.DayOfWeek plus(long);
- public java.lang.Object query(java.time.temporal.TemporalQuery);
- public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
- public static java.time.DayOfWeek valueOf(java.lang.String);
- public static java.time.DayOfWeek[] values();
-
- public static java.time.DayOfWeek FRIDAY;
- public static java.time.DayOfWeek MONDAY;
- public static java.time.DayOfWeek SATURDAY;
- public static java.time.DayOfWeek SUNDAY;
- public static java.time.DayOfWeek THURSDAY;
- public static java.time.DayOfWeek TUESDAY;
- public static java.time.DayOfWeek WEDNESDAY;
-
-}
-
--keep class java.time.Duration {
-
- public java.time.Duration abs();
- public java.time.temporal.Temporal addTo(java.time.temporal.Temporal);
- public static java.time.Duration between(java.time.temporal.Temporal, java.time.temporal.Temporal);
- public int compareTo(java.time.Duration);
- public int compareTo(java.lang.Object);
- public java.time.Duration dividedBy(long);
- public boolean equals(java.lang.Object);
- public static java.time.Duration from(java.time.temporal.TemporalAmount);
- public long get(java.time.temporal.TemporalUnit);
- public int getNano();
- public long getSeconds();
- public java.util.List getUnits();
- public int hashCode();
- public boolean isNegative();
- public boolean isZero();
- public java.time.Duration minus(java.time.Duration);
- public java.time.Duration minus(long, java.time.temporal.TemporalUnit);
- public java.time.Duration minusDays(long);
- public java.time.Duration minusHours(long);
- public java.time.Duration minusMillis(long);
- public java.time.Duration minusMinutes(long);
- public java.time.Duration minusNanos(long);
- public java.time.Duration minusSeconds(long);
- public java.time.Duration multipliedBy(long);
- public java.time.Duration negated();
- public static java.time.Duration of(long, java.time.temporal.TemporalUnit);
- public static java.time.Duration ofDays(long);
- public static java.time.Duration ofHours(long);
- public static java.time.Duration ofMillis(long);
- public static java.time.Duration ofMinutes(long);
- public static java.time.Duration ofNanos(long);
- public static java.time.Duration ofSeconds(long);
- public static java.time.Duration ofSeconds(long, long);
- public static java.time.Duration parse(java.lang.CharSequence);
- public java.time.Duration plus(java.time.Duration);
- public java.time.Duration plus(long, java.time.temporal.TemporalUnit);
- public java.time.Duration plusDays(long);
- public java.time.Duration plusHours(long);
- public java.time.Duration plusMillis(long);
- public java.time.Duration plusMinutes(long);
- public java.time.Duration plusNanos(long);
- public java.time.Duration plusSeconds(long);
- public java.time.temporal.Temporal subtractFrom(java.time.temporal.Temporal);
- public long toDays();
- public long toHours();
- public long toMillis();
- public long toMinutes();
- public long toNanos();
- public java.lang.String toString();
- public java.time.Duration withNanos(int);
- public java.time.Duration withSeconds(long);
-
-
- public static java.time.Duration ZERO;
-}
-
--keep class java.time.Instant {
-
- public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
- public java.time.OffsetDateTime atOffset(java.time.ZoneOffset);
- public java.time.ZonedDateTime atZone(java.time.ZoneId);
- public int compareTo(java.time.Instant);
- public int compareTo(java.lang.Object);
- public boolean equals(java.lang.Object);
- public static java.time.Instant from(java.time.temporal.TemporalAccessor);
- public int get(java.time.temporal.TemporalField);
- public long getEpochSecond();
- public long getLong(java.time.temporal.TemporalField);
- public int getNano();
- public int hashCode();
- public boolean isAfter(java.time.Instant);
- public boolean isBefore(java.time.Instant);
- public boolean isSupported(java.time.temporal.TemporalField);
- public boolean isSupported(java.time.temporal.TemporalUnit);
- public java.time.Instant minus(java.time.temporal.TemporalAmount);
- public java.time.Instant minus(long, java.time.temporal.TemporalUnit);
- public java.time.temporal.Temporal minus(long, java.time.temporal.TemporalUnit);
- public java.time.temporal.Temporal minus(java.time.temporal.TemporalAmount);
- public java.time.Instant minusMillis(long);
- public java.time.Instant minusNanos(long);
- public java.time.Instant minusSeconds(long);
- public static java.time.Instant now();
- public static java.time.Instant now(java.time.Clock);
- public static java.time.Instant ofEpochMilli(long);
- public static java.time.Instant ofEpochSecond(long);
- public static java.time.Instant ofEpochSecond(long, long);
- public static java.time.Instant parse(java.lang.CharSequence);
- public java.time.Instant plus(java.time.temporal.TemporalAmount);
- public java.time.Instant plus(long, java.time.temporal.TemporalUnit);
- public java.time.temporal.Temporal plus(long, java.time.temporal.TemporalUnit);
- public java.time.temporal.Temporal plus(java.time.temporal.TemporalAmount);
- public java.time.Instant plusMillis(long);
- public java.time.Instant plusNanos(long);
- public java.time.Instant plusSeconds(long);
- public java.lang.Object query(java.time.temporal.TemporalQuery);
- public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
- public long toEpochMilli();
- public java.lang.String toString();
- public java.time.Instant truncatedTo(java.time.temporal.TemporalUnit);
- public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
- public java.time.Instant with(java.time.temporal.TemporalAdjuster);
- public java.time.Instant with(java.time.temporal.TemporalField, long);
- public java.time.temporal.Temporal with(java.time.temporal.TemporalField, long);
- public java.time.temporal.Temporal with(java.time.temporal.TemporalAdjuster);
-
-
- public static java.time.Instant EPOCH;
- public static java.time.Instant MAX;
- public static java.time.Instant MIN;
-}
-
--keep class java.time.LocalDate {
-
- public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
- public java.time.LocalDateTime atStartOfDay();
- public java.time.ZonedDateTime atStartOfDay(java.time.ZoneId);
- public java.time.LocalDateTime atTime(java.time.LocalTime);
- public java.time.LocalDateTime atTime(int, int);
- public java.time.LocalDateTime atTime(int, int, int);
- public java.time.LocalDateTime atTime(int, int, int, int);
- public java.time.OffsetDateTime atTime(java.time.OffsetTime);
- public java.time.chrono.ChronoLocalDateTime atTime(java.time.LocalTime);
- public int compareTo(java.time.chrono.ChronoLocalDate);
- public int compareTo(java.lang.Object);
- public boolean equals(java.lang.Object);
- public java.lang.String format(java.time.format.DateTimeFormatter);
- public static java.time.LocalDate from(java.time.temporal.TemporalAccessor);
- public int get(java.time.temporal.TemporalField);
- public java.time.chrono.IsoChronology getChronology();
- public java.time.chrono.Chronology getChronology();
- public int getDayOfMonth();
- public java.time.DayOfWeek getDayOfWeek();
- public int getDayOfYear();
- public java.time.chrono.Era getEra();
- public long getLong(java.time.temporal.TemporalField);
- public java.time.Month getMonth();
- public int getMonthValue();
- public int getYear();
- public int hashCode();
- public boolean isAfter(java.time.chrono.ChronoLocalDate);
- public boolean isBefore(java.time.chrono.ChronoLocalDate);
- public boolean isEqual(java.time.chrono.ChronoLocalDate);
- public boolean isLeapYear();
- public boolean isSupported(java.time.temporal.TemporalField);
- public boolean isSupported(java.time.temporal.TemporalUnit);
- public int lengthOfMonth();
- public int lengthOfYear();
- public java.time.LocalDate minus(java.time.temporal.TemporalAmount);
- public java.time.LocalDate minus(long, java.time.temporal.TemporalUnit);
- public java.time.temporal.Temporal minus(long, java.time.temporal.TemporalUnit);
- public java.time.temporal.Temporal minus(java.time.temporal.TemporalAmount);
- public java.time.chrono.ChronoLocalDate minus(long, java.time.temporal.TemporalUnit);
- public java.time.chrono.ChronoLocalDate minus(java.time.temporal.TemporalAmount);
- public java.time.LocalDate minusDays(long);
- public java.time.LocalDate minusMonths(long);
- public java.time.LocalDate minusWeeks(long);
- public java.time.LocalDate minusYears(long);
- public static java.time.LocalDate now();
- public static java.time.LocalDate now(java.time.ZoneId);
- public static java.time.LocalDate now(java.time.Clock);
- public static java.time.LocalDate of(int, java.time.Month, int);
- public static java.time.LocalDate of(int, int, int);
- public static java.time.LocalDate ofEpochDay(long);
- public static java.time.LocalDate ofYearDay(int, int);
- public static java.time.LocalDate parse(java.lang.CharSequence);
- public static java.time.LocalDate parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
- public java.time.LocalDate plus(java.time.temporal.TemporalAmount);
- public java.time.LocalDate plus(long, java.time.temporal.TemporalUnit);
- public java.time.temporal.Temporal plus(long, java.time.temporal.TemporalUnit);
- public java.time.temporal.Temporal plus(java.time.temporal.TemporalAmount);
- public java.time.chrono.ChronoLocalDate plus(long, java.time.temporal.TemporalUnit);
- public java.time.chrono.ChronoLocalDate plus(java.time.temporal.TemporalAmount);
- public java.time.LocalDate plusDays(long);
- public java.time.LocalDate plusMonths(long);
- public java.time.LocalDate plusWeeks(long);
- public java.time.LocalDate plusYears(long);
- public java.lang.Object query(java.time.temporal.TemporalQuery);
- public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
- public long toEpochDay();
- public java.lang.String toString();
- public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
- public java.time.Period until(java.time.chrono.ChronoLocalDate);
- public java.time.chrono.ChronoPeriod until(java.time.chrono.ChronoLocalDate);
- public java.time.LocalDate with(java.time.temporal.TemporalAdjuster);
- public java.time.LocalDate with(java.time.temporal.TemporalField, long);
- public java.time.temporal.Temporal with(java.time.temporal.TemporalField, long);
- public java.time.temporal.Temporal with(java.time.temporal.TemporalAdjuster);
- public java.time.chrono.ChronoLocalDate with(java.time.temporal.TemporalField, long);
- public java.time.chrono.ChronoLocalDate with(java.time.temporal.TemporalAdjuster);
- public java.time.LocalDate withDayOfMonth(int);
- public java.time.LocalDate withDayOfYear(int);
- public java.time.LocalDate withMonth(int);
- public java.time.LocalDate withYear(int);
-
-
- public static java.time.LocalDate MAX;
- public static java.time.LocalDate MIN;
-}
-
--keep class java.time.LocalDateTime {
-
- public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
- public java.time.OffsetDateTime atOffset(java.time.ZoneOffset);
- public java.time.ZonedDateTime atZone(java.time.ZoneId);
- public java.time.chrono.ChronoZonedDateTime atZone(java.time.ZoneId);
- public int compareTo(java.time.chrono.ChronoLocalDateTime);
- public int compareTo(java.lang.Object);
- public boolean equals(java.lang.Object);
- public java.lang.String format(java.time.format.DateTimeFormatter);
- public static java.time.LocalDateTime from(java.time.temporal.TemporalAccessor);
- public int get(java.time.temporal.TemporalField);
- public int getDayOfMonth();
- public java.time.DayOfWeek getDayOfWeek();
- public int getDayOfYear();
- public int getHour();
- public long getLong(java.time.temporal.TemporalField);
- public int getMinute();
- public java.time.Month getMonth();
- public int getMonthValue();
- public int getNano();
- public int getSecond();
- public int getYear();
- public int hashCode();
- public boolean isAfter(java.time.chrono.ChronoLocalDateTime);
- public boolean isBefore(java.time.chrono.ChronoLocalDateTime);
- public boolean isEqual(java.time.chrono.ChronoLocalDateTime);
- public boolean isSupported(java.time.temporal.TemporalField);
- public boolean isSupported(java.time.temporal.TemporalUnit);
- public java.time.LocalDateTime minus(java.time.temporal.TemporalAmount);
- public java.time.LocalDateTime minus(long, java.time.temporal.TemporalUnit);
- public java.time.temporal.Temporal minus(long, java.time.temporal.TemporalUnit);
- public java.time.temporal.Temporal minus(java.time.temporal.TemporalAmount);
- public java.time.chrono.ChronoLocalDateTime minus(long, java.time.temporal.TemporalUnit);
- public java.time.chrono.ChronoLocalDateTime minus(java.time.temporal.TemporalAmount);
- public java.time.LocalDateTime minusDays(long);
- public java.time.LocalDateTime minusHours(long);
- public java.time.LocalDateTime minusMinutes(long);
- public java.time.LocalDateTime minusMonths(long);
- public java.time.LocalDateTime minusNanos(long);
- public java.time.LocalDateTime minusSeconds(long);
- public java.time.LocalDateTime minusWeeks(long);
- public java.time.LocalDateTime minusYears(long);
- public static java.time.LocalDateTime now();
- public static java.time.LocalDateTime now(java.time.ZoneId);
- public static java.time.LocalDateTime now(java.time.Clock);
- public static java.time.LocalDateTime of(int, java.time.Month, int, int, int);
- public static java.time.LocalDateTime of(int, java.time.Month, int, int, int, int);
- public static java.time.LocalDateTime of(int, java.time.Month, int, int, int, int, int);
- public static java.time.LocalDateTime of(int, int, int, int, int);
- public static java.time.LocalDateTime of(int, int, int, int, int, int);
- public static java.time.LocalDateTime of(int, int, int, int, int, int, int);
- public static java.time.LocalDateTime of(java.time.LocalDate, java.time.LocalTime);
- public static java.time.LocalDateTime ofEpochSecond(long, int, java.time.ZoneOffset);
- public static java.time.LocalDateTime ofInstant(java.time.Instant, java.time.ZoneId);
- public static java.time.LocalDateTime parse(java.lang.CharSequence);
- public static java.time.LocalDateTime parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
- public java.time.LocalDateTime plus(java.time.temporal.TemporalAmount);
- public java.time.LocalDateTime plus(long, java.time.temporal.TemporalUnit);
- public java.time.temporal.Temporal plus(long, java.time.temporal.TemporalUnit);
- public java.time.temporal.Temporal plus(java.time.temporal.TemporalAmount);
- public java.time.chrono.ChronoLocalDateTime plus(long, java.time.temporal.TemporalUnit);
- public java.time.chrono.ChronoLocalDateTime plus(java.time.temporal.TemporalAmount);
- public java.time.LocalDateTime plusDays(long);
- public java.time.LocalDateTime plusHours(long);
- public java.time.LocalDateTime plusMinutes(long);
- public java.time.LocalDateTime plusMonths(long);
- public java.time.LocalDateTime plusNanos(long);
- public java.time.LocalDateTime plusSeconds(long);
- public java.time.LocalDateTime plusWeeks(long);
- public java.time.LocalDateTime plusYears(long);
- public java.lang.Object query(java.time.temporal.TemporalQuery);
- public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
- public java.time.LocalDate toLocalDate();
- public java.time.chrono.ChronoLocalDate toLocalDate();
- public java.time.LocalTime toLocalTime();
- public java.lang.String toString();
- public java.time.LocalDateTime truncatedTo(java.time.temporal.TemporalUnit);
- public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
- public java.time.LocalDateTime with(java.time.temporal.TemporalAdjuster);
- public java.time.LocalDateTime with(java.time.temporal.TemporalField, long);
- public java.time.temporal.Temporal with(java.time.temporal.TemporalField, long);
- public java.time.temporal.Temporal with(java.time.temporal.TemporalAdjuster);
- public java.time.chrono.ChronoLocalDateTime with(java.time.temporal.TemporalField, long);
- public java.time.chrono.ChronoLocalDateTime with(java.time.temporal.TemporalAdjuster);
- public java.time.LocalDateTime withDayOfMonth(int);
- public java.time.LocalDateTime withDayOfYear(int);
- public java.time.LocalDateTime withHour(int);
- public java.time.LocalDateTime withMinute(int);
- public java.time.LocalDateTime withMonth(int);
- public java.time.LocalDateTime withNano(int);
- public java.time.LocalDateTime withSecond(int);
- public java.time.LocalDateTime withYear(int);
-
-
- public static java.time.LocalDateTime MAX;
- public static java.time.LocalDateTime MIN;
-}
-
--keep class java.time.LocalTime {
-
- public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
- public java.time.LocalDateTime atDate(java.time.LocalDate);
- public java.time.OffsetTime atOffset(java.time.ZoneOffset);
- public int compareTo(java.time.LocalTime);
- public int compareTo(java.lang.Object);
- public boolean equals(java.lang.Object);
- public java.lang.String format(java.time.format.DateTimeFormatter);
- public static java.time.LocalTime from(java.time.temporal.TemporalAccessor);
- public int get(java.time.temporal.TemporalField);
- public int getHour();
- public long getLong(java.time.temporal.TemporalField);
- public int getMinute();
- public int getNano();
- public int getSecond();
- public int hashCode();
- public boolean isAfter(java.time.LocalTime);
- public boolean isBefore(java.time.LocalTime);
- public boolean isSupported(java.time.temporal.TemporalField);
- public boolean isSupported(java.time.temporal.TemporalUnit);
- public java.time.LocalTime minus(java.time.temporal.TemporalAmount);
- public java.time.LocalTime minus(long, java.time.temporal.TemporalUnit);
- public java.time.temporal.Temporal minus(long, java.time.temporal.TemporalUnit);
- public java.time.temporal.Temporal minus(java.time.temporal.TemporalAmount);
- public java.time.LocalTime minusHours(long);
- public java.time.LocalTime minusMinutes(long);
- public java.time.LocalTime minusNanos(long);
- public java.time.LocalTime minusSeconds(long);
- public static java.time.LocalTime now();
- public static java.time.LocalTime now(java.time.ZoneId);
- public static java.time.LocalTime now(java.time.Clock);
- public static java.time.LocalTime of(int, int);
- public static java.time.LocalTime of(int, int, int);
- public static java.time.LocalTime of(int, int, int, int);
- public static java.time.LocalTime ofNanoOfDay(long);
- public static java.time.LocalTime ofSecondOfDay(long);
- public static java.time.LocalTime parse(java.lang.CharSequence);
- public static java.time.LocalTime parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
- public java.time.LocalTime plus(java.time.temporal.TemporalAmount);
- public java.time.LocalTime plus(long, java.time.temporal.TemporalUnit);
- public java.time.temporal.Temporal plus(long, java.time.temporal.TemporalUnit);
- public java.time.temporal.Temporal plus(java.time.temporal.TemporalAmount);
- public java.time.LocalTime plusHours(long);
- public java.time.LocalTime plusMinutes(long);
- public java.time.LocalTime plusNanos(long);
- public java.time.LocalTime plusSeconds(long);
- public java.lang.Object query(java.time.temporal.TemporalQuery);
- public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
- public long toNanoOfDay();
- public int toSecondOfDay();
- public java.lang.String toString();
- public java.time.LocalTime truncatedTo(java.time.temporal.TemporalUnit);
- public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
- public java.time.LocalTime with(java.time.temporal.TemporalAdjuster);
- public java.time.LocalTime with(java.time.temporal.TemporalField, long);
- public java.time.temporal.Temporal with(java.time.temporal.TemporalField, long);
- public java.time.temporal.Temporal with(java.time.temporal.TemporalAdjuster);
- public java.time.LocalTime withHour(int);
- public java.time.LocalTime withMinute(int);
- public java.time.LocalTime withNano(int);
- public java.time.LocalTime withSecond(int);
-
-
- public static java.time.LocalTime MAX;
- public static java.time.LocalTime MIDNIGHT;
- public static java.time.LocalTime MIN;
- public static java.time.LocalTime NOON;
-}
-
--keep class java.time.Month {
-
- public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
- public int firstDayOfYear(boolean);
- public java.time.Month firstMonthOfQuarter();
- public static java.time.Month from(java.time.temporal.TemporalAccessor);
- public int get(java.time.temporal.TemporalField);
- public java.lang.String getDisplayName(java.time.format.TextStyle, java.util.Locale);
- public long getLong(java.time.temporal.TemporalField);
- public int getValue();
- public boolean isSupported(java.time.temporal.TemporalField);
- public int length(boolean);
- public int maxLength();
- public int minLength();
- public java.time.Month minus(long);
- public static java.time.Month of(int);
- public java.time.Month plus(long);
- public java.lang.Object query(java.time.temporal.TemporalQuery);
- public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
- public static java.time.Month valueOf(java.lang.String);
- public static java.time.Month[] values();
-
- public static java.time.Month APRIL;
- public static java.time.Month AUGUST;
- public static java.time.Month DECEMBER;
- public static java.time.Month FEBRUARY;
- public static java.time.Month JANUARY;
- public static java.time.Month JULY;
- public static java.time.Month JUNE;
- public static java.time.Month MARCH;
- public static java.time.Month MAY;
- public static java.time.Month NOVEMBER;
- public static java.time.Month OCTOBER;
- public static java.time.Month SEPTEMBER;
-
-}
-
--keep class java.time.OffsetDateTime {
-
- public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
- public java.time.ZonedDateTime atZoneSameInstant(java.time.ZoneId);
- public java.time.ZonedDateTime atZoneSimilarLocal(java.time.ZoneId);
- public int compareTo(java.time.OffsetDateTime);
- public int compareTo(java.lang.Object);
- public boolean equals(java.lang.Object);
- public java.lang.String format(java.time.format.DateTimeFormatter);
- public static java.time.OffsetDateTime from(java.time.temporal.TemporalAccessor);
- public int get(java.time.temporal.TemporalField);
- public int getDayOfMonth();
- public java.time.DayOfWeek getDayOfWeek();
- public int getDayOfYear();
- public int getHour();
- public long getLong(java.time.temporal.TemporalField);
- public int getMinute();
- public java.time.Month getMonth();
- public int getMonthValue();
- public int getNano();
- public java.time.ZoneOffset getOffset();
- public int getSecond();
- public int getYear();
- public int hashCode();
- public boolean isAfter(java.time.OffsetDateTime);
- public boolean isBefore(java.time.OffsetDateTime);
- public boolean isEqual(java.time.OffsetDateTime);
- public boolean isSupported(java.time.temporal.TemporalField);
- public boolean isSupported(java.time.temporal.TemporalUnit);
- public java.time.OffsetDateTime minus(java.time.temporal.TemporalAmount);
- public java.time.OffsetDateTime minus(long, java.time.temporal.TemporalUnit);
- public java.time.temporal.Temporal minus(long, java.time.temporal.TemporalUnit);
- public java.time.temporal.Temporal minus(java.time.temporal.TemporalAmount);
- public java.time.OffsetDateTime minusDays(long);
- public java.time.OffsetDateTime minusHours(long);
- public java.time.OffsetDateTime minusMinutes(long);
- public java.time.OffsetDateTime minusMonths(long);
- public java.time.OffsetDateTime minusNanos(long);
- public java.time.OffsetDateTime minusSeconds(long);
- public java.time.OffsetDateTime minusWeeks(long);
- public java.time.OffsetDateTime minusYears(long);
- public static java.time.OffsetDateTime now();
- public static java.time.OffsetDateTime now(java.time.ZoneId);
- public static java.time.OffsetDateTime now(java.time.Clock);
- public static java.time.OffsetDateTime of(java.time.LocalDate, java.time.LocalTime, java.time.ZoneOffset);
- public static java.time.OffsetDateTime of(java.time.LocalDateTime, java.time.ZoneOffset);
- public static java.time.OffsetDateTime of(int, int, int, int, int, int, int, java.time.ZoneOffset);
- public static java.time.OffsetDateTime ofInstant(java.time.Instant, java.time.ZoneId);
- public static java.time.OffsetDateTime parse(java.lang.CharSequence);
- public static java.time.OffsetDateTime parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
- public java.time.OffsetDateTime plus(java.time.temporal.TemporalAmount);
- public java.time.OffsetDateTime plus(long, java.time.temporal.TemporalUnit);
- public java.time.temporal.Temporal plus(long, java.time.temporal.TemporalUnit);
- public java.time.temporal.Temporal plus(java.time.temporal.TemporalAmount);
- public java.time.OffsetDateTime plusDays(long);
- public java.time.OffsetDateTime plusHours(long);
- public java.time.OffsetDateTime plusMinutes(long);
- public java.time.OffsetDateTime plusMonths(long);
- public java.time.OffsetDateTime plusNanos(long);
- public java.time.OffsetDateTime plusSeconds(long);
- public java.time.OffsetDateTime plusWeeks(long);
- public java.time.OffsetDateTime plusYears(long);
- public java.lang.Object query(java.time.temporal.TemporalQuery);
- public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
- public static java.util.Comparator timeLineOrder();
- public long toEpochSecond();
- public java.time.Instant toInstant();
- public java.time.LocalDate toLocalDate();
- public java.time.LocalDateTime toLocalDateTime();
- public java.time.LocalTime toLocalTime();
- public java.time.OffsetTime toOffsetTime();
- public java.lang.String toString();
- public java.time.ZonedDateTime toZonedDateTime();
- public java.time.OffsetDateTime truncatedTo(java.time.temporal.TemporalUnit);
- public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
- public java.time.OffsetDateTime with(java.time.temporal.TemporalAdjuster);
- public java.time.OffsetDateTime with(java.time.temporal.TemporalField, long);
- public java.time.temporal.Temporal with(java.time.temporal.TemporalField, long);
- public java.time.temporal.Temporal with(java.time.temporal.TemporalAdjuster);
- public java.time.OffsetDateTime withDayOfMonth(int);
- public java.time.OffsetDateTime withDayOfYear(int);
- public java.time.OffsetDateTime withHour(int);
- public java.time.OffsetDateTime withMinute(int);
- public java.time.OffsetDateTime withMonth(int);
- public java.time.OffsetDateTime withNano(int);
- public java.time.OffsetDateTime withOffsetSameInstant(java.time.ZoneOffset);
- public java.time.OffsetDateTime withOffsetSameLocal(java.time.ZoneOffset);
- public java.time.OffsetDateTime withSecond(int);
- public java.time.OffsetDateTime withYear(int);
-
-
- public static java.time.OffsetDateTime MAX;
- public static java.time.OffsetDateTime MIN;
-}
-
--keep class java.time.OffsetTime {
-
- public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
- public java.time.OffsetDateTime atDate(java.time.LocalDate);
- public int compareTo(java.time.OffsetTime);
- public int compareTo(java.lang.Object);
- public boolean equals(java.lang.Object);
- public java.lang.String format(java.time.format.DateTimeFormatter);
- public static java.time.OffsetTime from(java.time.temporal.TemporalAccessor);
- public int get(java.time.temporal.TemporalField);
- public int getHour();
- public long getLong(java.time.temporal.TemporalField);
- public int getMinute();
- public int getNano();
- public java.time.ZoneOffset getOffset();
- public int getSecond();
- public int hashCode();
- public boolean isAfter(java.time.OffsetTime);
- public boolean isBefore(java.time.OffsetTime);
- public boolean isEqual(java.time.OffsetTime);
- public boolean isSupported(java.time.temporal.TemporalField);
- public boolean isSupported(java.time.temporal.TemporalUnit);
- public java.time.OffsetTime minus(java.time.temporal.TemporalAmount);
- public java.time.OffsetTime minus(long, java.time.temporal.TemporalUnit);
- public java.time.temporal.Temporal minus(long, java.time.temporal.TemporalUnit);
- public java.time.temporal.Temporal minus(java.time.temporal.TemporalAmount);
- public java.time.OffsetTime minusHours(long);
- public java.time.OffsetTime minusMinutes(long);
- public java.time.OffsetTime minusNanos(long);
- public java.time.OffsetTime minusSeconds(long);
- public static java.time.OffsetTime now();
- public static java.time.OffsetTime now(java.time.ZoneId);
- public static java.time.OffsetTime now(java.time.Clock);
- public static java.time.OffsetTime of(java.time.LocalTime, java.time.ZoneOffset);
- public static java.time.OffsetTime of(int, int, int, int, java.time.ZoneOffset);
- public static java.time.OffsetTime ofInstant(java.time.Instant, java.time.ZoneId);
- public static java.time.OffsetTime parse(java.lang.CharSequence);
- public static java.time.OffsetTime parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
- public java.time.OffsetTime plus(java.time.temporal.TemporalAmount);
- public java.time.OffsetTime plus(long, java.time.temporal.TemporalUnit);
- public java.time.temporal.Temporal plus(long, java.time.temporal.TemporalUnit);
- public java.time.temporal.Temporal plus(java.time.temporal.TemporalAmount);
- public java.time.OffsetTime plusHours(long);
- public java.time.OffsetTime plusMinutes(long);
- public java.time.OffsetTime plusNanos(long);
- public java.time.OffsetTime plusSeconds(long);
- public java.lang.Object query(java.time.temporal.TemporalQuery);
- public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
- public java.time.LocalTime toLocalTime();
- public java.lang.String toString();
- public java.time.OffsetTime truncatedTo(java.time.temporal.TemporalUnit);
- public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
- public java.time.OffsetTime with(java.time.temporal.TemporalAdjuster);
- public java.time.OffsetTime with(java.time.temporal.TemporalField, long);
- public java.time.temporal.Temporal with(java.time.temporal.TemporalField, long);
- public java.time.temporal.Temporal with(java.time.temporal.TemporalAdjuster);
- public java.time.OffsetTime withHour(int);
- public java.time.OffsetTime withMinute(int);
- public java.time.OffsetTime withNano(int);
- public java.time.OffsetTime withOffsetSameInstant(java.time.ZoneOffset);
- public java.time.OffsetTime withOffsetSameLocal(java.time.ZoneOffset);
- public java.time.OffsetTime withSecond(int);
-
-
- public static java.time.OffsetTime MAX;
- public static java.time.OffsetTime MIN;
-}
-
--keep class java.time.Period {
-
- public java.time.temporal.Temporal addTo(java.time.temporal.Temporal);
- public static java.time.Period between(java.time.LocalDate, java.time.LocalDate);
- public boolean equals(java.lang.Object);
- public static java.time.Period from(java.time.temporal.TemporalAmount);
- public long get(java.time.temporal.TemporalUnit);
- public java.time.chrono.IsoChronology getChronology();
- public java.time.chrono.Chronology getChronology();
- public int getDays();
- public int getMonths();
- public java.util.List getUnits();
- public int getYears();
- public int hashCode();
- public boolean isNegative();
- public boolean isZero();
- public java.time.Period minus(java.time.temporal.TemporalAmount);
- public java.time.chrono.ChronoPeriod minus(java.time.temporal.TemporalAmount);
- public java.time.Period minusDays(long);
- public java.time.Period minusMonths(long);
- public java.time.Period minusYears(long);
- public java.time.Period multipliedBy(int);
- public java.time.chrono.ChronoPeriod multipliedBy(int);
- public java.time.Period negated();
- public java.time.chrono.ChronoPeriod negated();
- public java.time.Period normalized();
- public java.time.chrono.ChronoPeriod normalized();
- public static java.time.Period of(int, int, int);
- public static java.time.Period ofDays(int);
- public static java.time.Period ofMonths(int);
- public static java.time.Period ofWeeks(int);
- public static java.time.Period ofYears(int);
- public static java.time.Period parse(java.lang.CharSequence);
- public java.time.Period plus(java.time.temporal.TemporalAmount);
- public java.time.chrono.ChronoPeriod plus(java.time.temporal.TemporalAmount);
- public java.time.Period plusDays(long);
- public java.time.Period plusMonths(long);
- public java.time.Period plusYears(long);
- public java.time.temporal.Temporal subtractFrom(java.time.temporal.Temporal);
- public java.lang.String toString();
- public long toTotalMonths();
- public java.time.Period withDays(int);
- public java.time.Period withMonths(int);
- public java.time.Period withYears(int);
-
-
- public static java.time.Period ZERO;
-}
-
--keep class java.time.ZoneId {
-
- public boolean equals(java.lang.Object);
- public static java.time.ZoneId from(java.time.temporal.TemporalAccessor);
- public static java.util.Set getAvailableZoneIds();
- public java.lang.String getDisplayName(java.time.format.TextStyle, java.util.Locale);
- public abstract java.lang.String getId();
- public abstract java.time.zone.ZoneRules getRules();
- public int hashCode();
- public java.time.ZoneId normalized();
- public static java.time.ZoneId of(java.lang.String, java.util.Map);
- public static java.time.ZoneId of(java.lang.String);
- public static java.time.ZoneId ofOffset(java.lang.String, java.time.ZoneOffset);
- public static java.time.ZoneId systemDefault();
- public java.lang.String toString();
-
-
- public static java.util.Map SHORT_IDS;
-}
-
--keep class java.time.ZoneOffset {
-
- public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
- public int compareTo(java.time.ZoneOffset);
- public int compareTo(java.lang.Object);
- public boolean equals(java.lang.Object);
- public static java.time.ZoneOffset from(java.time.temporal.TemporalAccessor);
- public int get(java.time.temporal.TemporalField);
- public java.lang.String getId();
- public long getLong(java.time.temporal.TemporalField);
- public java.time.zone.ZoneRules getRules();
- public int getTotalSeconds();
- public int hashCode();
- public boolean isSupported(java.time.temporal.TemporalField);
- public static java.time.ZoneOffset of(java.lang.String);
- public static java.time.ZoneOffset ofHours(int);
- public static java.time.ZoneOffset ofHoursMinutes(int, int);
- public static java.time.ZoneOffset ofHoursMinutesSeconds(int, int, int);
- public static java.time.ZoneOffset ofTotalSeconds(int);
- public java.lang.Object query(java.time.temporal.TemporalQuery);
- public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
- public java.lang.String toString();
-
-
- public static java.time.ZoneOffset MAX;
- public static java.time.ZoneOffset MIN;
- public static java.time.ZoneOffset UTC;
-}
-
--keep class java.time.ZonedDateTime {
-
- public boolean equals(java.lang.Object);
- public java.lang.String format(java.time.format.DateTimeFormatter);
- public static java.time.ZonedDateTime from(java.time.temporal.TemporalAccessor);
- public int get(java.time.temporal.TemporalField);
- public int getDayOfMonth();
- public java.time.DayOfWeek getDayOfWeek();
- public int getDayOfYear();
- public int getHour();
- public long getLong(java.time.temporal.TemporalField);
- public int getMinute();
- public java.time.Month getMonth();
- public int getMonthValue();
- public int getNano();
- public java.time.ZoneOffset getOffset();
- public int getSecond();
- public int getYear();
- public java.time.ZoneId getZone();
- public int hashCode();
- public boolean isSupported(java.time.temporal.TemporalField);
- public boolean isSupported(java.time.temporal.TemporalUnit);
- public java.time.ZonedDateTime minus(java.time.temporal.TemporalAmount);
- public java.time.ZonedDateTime minus(long, java.time.temporal.TemporalUnit);
- public java.time.temporal.Temporal minus(long, java.time.temporal.TemporalUnit);
- public java.time.temporal.Temporal minus(java.time.temporal.TemporalAmount);
- public java.time.chrono.ChronoZonedDateTime minus(long, java.time.temporal.TemporalUnit);
- public java.time.chrono.ChronoZonedDateTime minus(java.time.temporal.TemporalAmount);
- public java.time.ZonedDateTime minusDays(long);
- public java.time.ZonedDateTime minusHours(long);
- public java.time.ZonedDateTime minusMinutes(long);
- public java.time.ZonedDateTime minusMonths(long);
- public java.time.ZonedDateTime minusNanos(long);
- public java.time.ZonedDateTime minusSeconds(long);
- public java.time.ZonedDateTime minusWeeks(long);
- public java.time.ZonedDateTime minusYears(long);
- public static java.time.ZonedDateTime now();
- public static java.time.ZonedDateTime now(java.time.ZoneId);
- public static java.time.ZonedDateTime now(java.time.Clock);
- public static java.time.ZonedDateTime of(java.time.LocalDate, java.time.LocalTime, java.time.ZoneId);
- public static java.time.ZonedDateTime of(java.time.LocalDateTime, java.time.ZoneId);
- public static java.time.ZonedDateTime of(int, int, int, int, int, int, int, java.time.ZoneId);
- public static java.time.ZonedDateTime ofInstant(java.time.Instant, java.time.ZoneId);
- public static java.time.ZonedDateTime ofInstant(java.time.LocalDateTime, java.time.ZoneOffset, java.time.ZoneId);
- public static java.time.ZonedDateTime ofLocal(java.time.LocalDateTime, java.time.ZoneId, java.time.ZoneOffset);
- public static java.time.ZonedDateTime ofStrict(java.time.LocalDateTime, java.time.ZoneOffset, java.time.ZoneId);
- public static java.time.ZonedDateTime parse(java.lang.CharSequence);
- public static java.time.ZonedDateTime parse(java.lang.CharSequence, java.time.format.DateTimeFormatter);
- public java.time.ZonedDateTime plus(java.time.temporal.TemporalAmount);
- public java.time.ZonedDateTime plus(long, java.time.temporal.TemporalUnit);
- public java.time.temporal.Temporal plus(long, java.time.temporal.TemporalUnit);
- public java.time.temporal.Temporal plus(java.time.temporal.TemporalAmount);
- public java.time.chrono.ChronoZonedDateTime plus(long, java.time.temporal.TemporalUnit);
- public java.time.chrono.ChronoZonedDateTime plus(java.time.temporal.TemporalAmount);
- public java.time.ZonedDateTime plusDays(long);
- public java.time.ZonedDateTime plusHours(long);
- public java.time.ZonedDateTime plusMinutes(long);
- public java.time.ZonedDateTime plusMonths(long);
- public java.time.ZonedDateTime plusNanos(long);
- public java.time.ZonedDateTime plusSeconds(long);
- public java.time.ZonedDateTime plusWeeks(long);
- public java.time.ZonedDateTime plusYears(long);
- public java.lang.Object query(java.time.temporal.TemporalQuery);
- public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
- public java.time.LocalDate toLocalDate();
- public java.time.chrono.ChronoLocalDate toLocalDate();
- public java.time.LocalDateTime toLocalDateTime();
- public java.time.chrono.ChronoLocalDateTime toLocalDateTime();
- public java.time.LocalTime toLocalTime();
- public java.time.OffsetDateTime toOffsetDateTime();
- public java.lang.String toString();
- public java.time.ZonedDateTime truncatedTo(java.time.temporal.TemporalUnit);
- public long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
- public java.time.ZonedDateTime with(java.time.temporal.TemporalAdjuster);
- public java.time.ZonedDateTime with(java.time.temporal.TemporalField, long);
- public java.time.temporal.Temporal with(java.time.temporal.TemporalField, long);
- public java.time.temporal.Temporal with(java.time.temporal.TemporalAdjuster);
- public java.time.chrono.ChronoZonedDateTime with(java.time.temporal.TemporalField, long);
- public java.time.chrono.ChronoZonedDateTime with(java.time.temporal.TemporalAdjuster);
- public java.time.ZonedDateTime withDayOfMonth(int);
- public java.time.ZonedDateTime withDayOfYear(int);
- public java.time.ZonedDateTime withEarlierOffsetAtOverlap();
- public java.time.chrono.ChronoZonedDateTime withEarlierOffsetAtOverlap();
- public java.time.ZonedDateTime withFixedOffsetZone();
- public java.time.ZonedDateTime withHour(int);
- public java.time.ZonedDateTime withLaterOffsetAtOverlap();
- public java.time.chrono.ChronoZonedDateTime withLaterOffsetAtOverlap();
- public java.time.ZonedDateTime withMinute(int);
- public java.time.ZonedDateTime withMonth(int);
- public java.time.ZonedDateTime withNano(int);
- public java.time.ZonedDateTime withSecond(int);
- public java.time.ZonedDateTime withYear(int);
- public java.time.ZonedDateTime withZoneSameInstant(java.time.ZoneId);
- public java.time.chrono.ChronoZonedDateTime withZoneSameInstant(java.time.ZoneId);
- public java.time.ZonedDateTime withZoneSameLocal(java.time.ZoneId);
- public java.time.chrono.ChronoZonedDateTime withZoneSameLocal(java.time.ZoneId);
-
-
-}
-
--keep class java.time.chrono.AbstractChronology {
- <init>();
-
- public int compareTo(java.time.chrono.Chronology);
- public int compareTo(java.lang.Object);
- public boolean equals(java.lang.Object);
- public int hashCode();
- public java.time.chrono.ChronoLocalDate resolveDate(java.util.Map, java.time.format.ResolverStyle);
- public java.lang.String toString();
-
-
-}
-
--keep class java.time.chrono.ChronoLocalDate {
-
- public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
- public java.time.chrono.ChronoLocalDateTime atTime(java.time.LocalTime);
- public int compareTo(java.time.chrono.ChronoLocalDate);
- public int compareTo(java.lang.Object);
- public abstract boolean equals(java.lang.Object);
- public java.lang.String format(java.time.format.DateTimeFormatter);
- public static java.time.chrono.ChronoLocalDate from(java.time.temporal.TemporalAccessor);
- public abstract java.time.chrono.Chronology getChronology();
- public java.time.chrono.Era getEra();
- public abstract int hashCode();
- public boolean isAfter(java.time.chrono.ChronoLocalDate);
- public boolean isBefore(java.time.chrono.ChronoLocalDate);
- public boolean isEqual(java.time.chrono.ChronoLocalDate);
- public boolean isLeapYear();
- public boolean isSupported(java.time.temporal.TemporalField);
- public boolean isSupported(java.time.temporal.TemporalUnit);
- public abstract int lengthOfMonth();
- public int lengthOfYear();
- public java.time.chrono.ChronoLocalDate minus(java.time.temporal.TemporalAmount);
- public java.time.chrono.ChronoLocalDate minus(long, java.time.temporal.TemporalUnit);
- public java.time.temporal.Temporal minus(long, java.time.temporal.TemporalUnit);
- public java.time.temporal.Temporal minus(java.time.temporal.TemporalAmount);
- public java.time.chrono.ChronoLocalDate plus(java.time.temporal.TemporalAmount);
- public java.time.chrono.ChronoLocalDate plus(long, java.time.temporal.TemporalUnit);
- public java.time.temporal.Temporal plus(long, java.time.temporal.TemporalUnit);
- public java.time.temporal.Temporal plus(java.time.temporal.TemporalAmount);
- public java.lang.Object query(java.time.temporal.TemporalQuery);
- public static java.util.Comparator timeLineOrder();
- public long toEpochDay();
- public abstract java.lang.String toString();
- public abstract long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
- public abstract java.time.chrono.ChronoPeriod until(java.time.chrono.ChronoLocalDate);
- public java.time.chrono.ChronoLocalDate with(java.time.temporal.TemporalAdjuster);
- public java.time.chrono.ChronoLocalDate with(java.time.temporal.TemporalField, long);
- public java.time.temporal.Temporal with(java.time.temporal.TemporalField, long);
- public java.time.temporal.Temporal with(java.time.temporal.TemporalAdjuster);
-
-
-}
-
--keep class java.time.chrono.ChronoLocalDateTime {
-
- public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
- public abstract java.time.chrono.ChronoZonedDateTime atZone(java.time.ZoneId);
- public int compareTo(java.time.chrono.ChronoLocalDateTime);
- public int compareTo(java.lang.Object);
- public abstract boolean equals(java.lang.Object);
- public java.lang.String format(java.time.format.DateTimeFormatter);
- public static java.time.chrono.ChronoLocalDateTime from(java.time.temporal.TemporalAccessor);
- public java.time.chrono.Chronology getChronology();
- public abstract int hashCode();
- public boolean isAfter(java.time.chrono.ChronoLocalDateTime);
- public boolean isBefore(java.time.chrono.ChronoLocalDateTime);
- public boolean isEqual(java.time.chrono.ChronoLocalDateTime);
- public abstract boolean isSupported(java.time.temporal.TemporalField);
- public boolean isSupported(java.time.temporal.TemporalUnit);
- public java.time.chrono.ChronoLocalDateTime minus(java.time.temporal.TemporalAmount);
- public java.time.chrono.ChronoLocalDateTime minus(long, java.time.temporal.TemporalUnit);
- public java.time.temporal.Temporal minus(long, java.time.temporal.TemporalUnit);
- public java.time.temporal.Temporal minus(java.time.temporal.TemporalAmount);
- public java.time.chrono.ChronoLocalDateTime plus(java.time.temporal.TemporalAmount);
- public abstract java.time.chrono.ChronoLocalDateTime plus(long, java.time.temporal.TemporalUnit);
- public java.time.temporal.Temporal plus(long, java.time.temporal.TemporalUnit);
- public java.time.temporal.Temporal plus(java.time.temporal.TemporalAmount);
- public java.lang.Object query(java.time.temporal.TemporalQuery);
- public static java.util.Comparator timeLineOrder();
- public long toEpochSecond(java.time.ZoneOffset);
- public java.time.Instant toInstant(java.time.ZoneOffset);
- public abstract java.time.chrono.ChronoLocalDate toLocalDate();
- public abstract java.time.LocalTime toLocalTime();
- public abstract java.lang.String toString();
- public java.time.chrono.ChronoLocalDateTime with(java.time.temporal.TemporalAdjuster);
- public abstract java.time.chrono.ChronoLocalDateTime with(java.time.temporal.TemporalField, long);
- public java.time.temporal.Temporal with(java.time.temporal.TemporalField, long);
- public java.time.temporal.Temporal with(java.time.temporal.TemporalAdjuster);
-
-
-}
-
--keep class java.time.chrono.ChronoPeriod {
-
- public abstract java.time.temporal.Temporal addTo(java.time.temporal.Temporal);
- public static java.time.chrono.ChronoPeriod between(java.time.chrono.ChronoLocalDate, java.time.chrono.ChronoLocalDate);
- public abstract boolean equals(java.lang.Object);
- public abstract long get(java.time.temporal.TemporalUnit);
- public abstract java.time.chrono.Chronology getChronology();
- public abstract java.util.List getUnits();
- public abstract int hashCode();
- public boolean isNegative();
- public boolean isZero();
- public abstract java.time.chrono.ChronoPeriod minus(java.time.temporal.TemporalAmount);
- public abstract java.time.chrono.ChronoPeriod multipliedBy(int);
- public java.time.chrono.ChronoPeriod negated();
- public abstract java.time.chrono.ChronoPeriod normalized();
- public abstract java.time.chrono.ChronoPeriod plus(java.time.temporal.TemporalAmount);
- public abstract java.time.temporal.Temporal subtractFrom(java.time.temporal.Temporal);
- public abstract java.lang.String toString();
-
-
-}
-
--keep class java.time.chrono.ChronoZonedDateTime {
-
- public int compareTo(java.time.chrono.ChronoZonedDateTime);
- public int compareTo(java.lang.Object);
- public abstract boolean equals(java.lang.Object);
- public java.lang.String format(java.time.format.DateTimeFormatter);
- public static java.time.chrono.ChronoZonedDateTime from(java.time.temporal.TemporalAccessor);
- public int get(java.time.temporal.TemporalField);
- public java.time.chrono.Chronology getChronology();
- public long getLong(java.time.temporal.TemporalField);
- public abstract java.time.ZoneOffset getOffset();
- public abstract java.time.ZoneId getZone();
- public abstract int hashCode();
- public boolean isAfter(java.time.chrono.ChronoZonedDateTime);
- public boolean isBefore(java.time.chrono.ChronoZonedDateTime);
- public boolean isEqual(java.time.chrono.ChronoZonedDateTime);
- public abstract boolean isSupported(java.time.temporal.TemporalField);
- public boolean isSupported(java.time.temporal.TemporalUnit);
- public java.time.chrono.ChronoZonedDateTime minus(java.time.temporal.TemporalAmount);
- public java.time.chrono.ChronoZonedDateTime minus(long, java.time.temporal.TemporalUnit);
- public java.time.temporal.Temporal minus(long, java.time.temporal.TemporalUnit);
- public java.time.temporal.Temporal minus(java.time.temporal.TemporalAmount);
- public java.time.chrono.ChronoZonedDateTime plus(java.time.temporal.TemporalAmount);
- public abstract java.time.chrono.ChronoZonedDateTime plus(long, java.time.temporal.TemporalUnit);
- public java.time.temporal.Temporal plus(long, java.time.temporal.TemporalUnit);
- public java.time.temporal.Temporal plus(java.time.temporal.TemporalAmount);
- public java.lang.Object query(java.time.temporal.TemporalQuery);
- public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
- public static java.util.Comparator timeLineOrder();
- public long toEpochSecond();
- public java.time.Instant toInstant();
- public java.time.chrono.ChronoLocalDate toLocalDate();
- public abstract java.time.chrono.ChronoLocalDateTime toLocalDateTime();
- public java.time.LocalTime toLocalTime();
- public abstract java.lang.String toString();
- public java.time.chrono.ChronoZonedDateTime with(java.time.temporal.TemporalAdjuster);
- public abstract java.time.chrono.ChronoZonedDateTime with(java.time.temporal.TemporalField, long);
- public java.time.temporal.Temporal with(java.time.temporal.TemporalField, long);
- public java.time.temporal.Temporal with(java.time.temporal.TemporalAdjuster);
- public abstract java.time.chrono.ChronoZonedDateTime withEarlierOffsetAtOverlap();
- public abstract java.time.chrono.ChronoZonedDateTime withLaterOffsetAtOverlap();
- public abstract java.time.chrono.ChronoZonedDateTime withZoneSameInstant(java.time.ZoneId);
- public abstract java.time.chrono.ChronoZonedDateTime withZoneSameLocal(java.time.ZoneId);
-
-
-}
-
--keep class java.time.chrono.Chronology {
-
- public abstract int compareTo(java.time.chrono.Chronology);
- public int compareTo(java.lang.Object);
- public java.time.chrono.ChronoLocalDate date(java.time.chrono.Era, int, int, int);
- public abstract java.time.chrono.ChronoLocalDate date(int, int, int);
- public abstract java.time.chrono.ChronoLocalDate date(java.time.temporal.TemporalAccessor);
- public abstract java.time.chrono.ChronoLocalDate dateEpochDay(long);
- public java.time.chrono.ChronoLocalDate dateNow();
- public java.time.chrono.ChronoLocalDate dateNow(java.time.ZoneId);
- public java.time.chrono.ChronoLocalDate dateNow(java.time.Clock);
- public java.time.chrono.ChronoLocalDate dateYearDay(java.time.chrono.Era, int, int);
- public abstract java.time.chrono.ChronoLocalDate dateYearDay(int, int);
- public abstract boolean equals(java.lang.Object);
- public abstract java.time.chrono.Era eraOf(int);
- public abstract java.util.List eras();
- public static java.time.chrono.Chronology from(java.time.temporal.TemporalAccessor);
- public static java.util.Set getAvailableChronologies();
- public abstract java.lang.String getCalendarType();
- public java.lang.String getDisplayName(java.time.format.TextStyle, java.util.Locale);
- public abstract java.lang.String getId();
- public abstract int hashCode();
- public abstract boolean isLeapYear(long);
- public java.time.chrono.ChronoLocalDateTime localDateTime(java.time.temporal.TemporalAccessor);
- public static java.time.chrono.Chronology of(java.lang.String);
- public static java.time.chrono.Chronology ofLocale(java.util.Locale);
- public java.time.chrono.ChronoPeriod period(int, int, int);
- public abstract int prolepticYear(java.time.chrono.Era, int);
- public abstract java.time.temporal.ValueRange range(java.time.temporal.ChronoField);
- public abstract java.time.chrono.ChronoLocalDate resolveDate(java.util.Map, java.time.format.ResolverStyle);
- public abstract java.lang.String toString();
- public java.time.chrono.ChronoZonedDateTime zonedDateTime(java.time.temporal.TemporalAccessor);
- public java.time.chrono.ChronoZonedDateTime zonedDateTime(java.time.Instant, java.time.ZoneId);
-
-
-}
-
--keep class java.time.chrono.Era {
-
- public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
- public int get(java.time.temporal.TemporalField);
- public java.lang.String getDisplayName(java.time.format.TextStyle, java.util.Locale);
- public long getLong(java.time.temporal.TemporalField);
- public abstract int getValue();
- public boolean isSupported(java.time.temporal.TemporalField);
- public java.lang.Object query(java.time.temporal.TemporalQuery);
- public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
-
-
-}
-
--keep class java.time.chrono.IsoChronology {
-
- public java.time.LocalDate date(java.time.chrono.Era, int, int, int);
- public java.time.LocalDate date(int, int, int);
- public java.time.LocalDate date(java.time.temporal.TemporalAccessor);
- public java.time.chrono.ChronoLocalDate date(java.time.temporal.TemporalAccessor);
- public java.time.chrono.ChronoLocalDate date(int, int, int);
- public java.time.chrono.ChronoLocalDate date(java.time.chrono.Era, int, int, int);
- public java.time.LocalDate dateEpochDay(long);
- public java.time.chrono.ChronoLocalDate dateEpochDay(long);
- public java.time.LocalDate dateNow();
- public java.time.LocalDate dateNow(java.time.ZoneId);
- public java.time.LocalDate dateNow(java.time.Clock);
- public java.time.chrono.ChronoLocalDate dateNow(java.time.Clock);
- public java.time.chrono.ChronoLocalDate dateNow(java.time.ZoneId);
- public java.time.chrono.ChronoLocalDate dateNow();
- public java.time.LocalDate dateYearDay(java.time.chrono.Era, int, int);
- public java.time.LocalDate dateYearDay(int, int);
- public java.time.chrono.ChronoLocalDate dateYearDay(int, int);
- public java.time.chrono.ChronoLocalDate dateYearDay(java.time.chrono.Era, int, int);
- public java.time.chrono.IsoEra eraOf(int);
- public java.time.chrono.Era eraOf(int);
- public java.util.List eras();
- public java.lang.String getCalendarType();
- public java.lang.String getId();
- public boolean isLeapYear(long);
- public java.time.LocalDateTime localDateTime(java.time.temporal.TemporalAccessor);
- public java.time.chrono.ChronoLocalDateTime localDateTime(java.time.temporal.TemporalAccessor);
- public java.time.Period period(int, int, int);
- public java.time.chrono.ChronoPeriod period(int, int, int);
- public int prolepticYear(java.time.chrono.Era, int);
- public java.time.temporal.ValueRange range(java.time.temporal.ChronoField);
- public java.time.LocalDate resolveDate(java.util.Map, java.time.format.ResolverStyle);
- public java.time.chrono.ChronoLocalDate resolveDate(java.util.Map, java.time.format.ResolverStyle);
- public java.time.ZonedDateTime zonedDateTime(java.time.temporal.TemporalAccessor);
- public java.time.ZonedDateTime zonedDateTime(java.time.Instant, java.time.ZoneId);
- public java.time.chrono.ChronoZonedDateTime zonedDateTime(java.time.Instant, java.time.ZoneId);
- public java.time.chrono.ChronoZonedDateTime zonedDateTime(java.time.temporal.TemporalAccessor);
-
-
- public static java.time.chrono.IsoChronology INSTANCE;
-}
-
--keep class java.time.chrono.IsoEra {
-
- public int getValue();
- public static java.time.chrono.IsoEra of(int);
- public static java.time.chrono.IsoEra valueOf(java.lang.String);
- public static java.time.chrono.IsoEra[] values();
-
- public static java.time.chrono.IsoEra BCE;
- public static java.time.chrono.IsoEra CE;
-
-}
-
--keep class java.time.format.DateTimeFormatter {
-
- public java.lang.String format(java.time.temporal.TemporalAccessor);
- public void formatTo(java.time.temporal.TemporalAccessor, java.lang.Appendable);
- public java.time.chrono.Chronology getChronology();
- public java.time.format.DecimalStyle getDecimalStyle();
- public java.util.Locale getLocale();
- public java.util.Set getResolverFields();
- public java.time.format.ResolverStyle getResolverStyle();
- public java.time.ZoneId getZone();
- public static java.time.format.DateTimeFormatter ofLocalizedDate(java.time.format.FormatStyle);
- public static java.time.format.DateTimeFormatter ofLocalizedDateTime(java.time.format.FormatStyle);
- public static java.time.format.DateTimeFormatter ofLocalizedDateTime(java.time.format.FormatStyle, java.time.format.FormatStyle);
- public static java.time.format.DateTimeFormatter ofLocalizedTime(java.time.format.FormatStyle);
- public static java.time.format.DateTimeFormatter ofPattern(java.lang.String);
- public static java.time.format.DateTimeFormatter ofPattern(java.lang.String, java.util.Locale);
- public java.time.temporal.TemporalAccessor parse(java.lang.CharSequence);
- public java.time.temporal.TemporalAccessor parse(java.lang.CharSequence, java.text.ParsePosition);
- public java.lang.Object parse(java.lang.CharSequence, java.time.temporal.TemporalQuery);
- public java.time.temporal.TemporalAccessor parseBest(java.lang.CharSequence, java.time.temporal.TemporalQuery[]);
- public java.time.temporal.TemporalAccessor parseUnresolved(java.lang.CharSequence, java.text.ParsePosition);
- public static java.time.temporal.TemporalQuery parsedExcessDays();
- public static java.time.temporal.TemporalQuery parsedLeapSecond();
- public java.text.Format toFormat();
- public java.text.Format toFormat(java.time.temporal.TemporalQuery);
- public java.lang.String toString();
- public java.time.format.DateTimeFormatter withChronology(java.time.chrono.Chronology);
- public java.time.format.DateTimeFormatter withDecimalStyle(java.time.format.DecimalStyle);
- public java.time.format.DateTimeFormatter withLocale(java.util.Locale);
- public java.time.format.DateTimeFormatter withResolverFields(java.time.temporal.TemporalField[]);
- public java.time.format.DateTimeFormatter withResolverFields(java.util.Set);
- public java.time.format.DateTimeFormatter withResolverStyle(java.time.format.ResolverStyle);
- public java.time.format.DateTimeFormatter withZone(java.time.ZoneId);
-
-
- public static java.time.format.DateTimeFormatter BASIC_ISO_DATE;
- public static java.time.format.DateTimeFormatter ISO_DATE;
- public static java.time.format.DateTimeFormatter ISO_DATE_TIME;
- public static java.time.format.DateTimeFormatter ISO_INSTANT;
- public static java.time.format.DateTimeFormatter ISO_LOCAL_DATE;
- public static java.time.format.DateTimeFormatter ISO_LOCAL_DATE_TIME;
- public static java.time.format.DateTimeFormatter ISO_LOCAL_TIME;
- public static java.time.format.DateTimeFormatter ISO_OFFSET_DATE;
- public static java.time.format.DateTimeFormatter ISO_OFFSET_DATE_TIME;
- public static java.time.format.DateTimeFormatter ISO_OFFSET_TIME;
- public static java.time.format.DateTimeFormatter ISO_ORDINAL_DATE;
- public static java.time.format.DateTimeFormatter ISO_TIME;
- public static java.time.format.DateTimeFormatter ISO_WEEK_DATE;
- public static java.time.format.DateTimeFormatter ISO_ZONED_DATE_TIME;
- public static java.time.format.DateTimeFormatter RFC_1123_DATE_TIME;
-}
-
--keep class java.time.format.DecimalStyle {
-
- public boolean equals(java.lang.Object);
- public static java.util.Set getAvailableLocales();
- public char getDecimalSeparator();
- public char getNegativeSign();
- public char getPositiveSign();
- public char getZeroDigit();
- public int hashCode();
- public static java.time.format.DecimalStyle of(java.util.Locale);
- public static java.time.format.DecimalStyle ofDefaultLocale();
- public java.lang.String toString();
- public java.time.format.DecimalStyle withDecimalSeparator(char);
- public java.time.format.DecimalStyle withNegativeSign(char);
- public java.time.format.DecimalStyle withPositiveSign(char);
- public java.time.format.DecimalStyle withZeroDigit(char);
-
-
- public static java.time.format.DecimalStyle STANDARD;
-}
-
--keep class java.time.format.FormatStyle {
-
- public static java.time.format.FormatStyle valueOf(java.lang.String);
- public static java.time.format.FormatStyle[] values();
-
- public static java.time.format.FormatStyle FULL;
- public static java.time.format.FormatStyle LONG;
- public static java.time.format.FormatStyle MEDIUM;
- public static java.time.format.FormatStyle SHORT;
-
-}
-
--keep class java.time.format.ResolverStyle {
-
- public static java.time.format.ResolverStyle valueOf(java.lang.String);
- public static java.time.format.ResolverStyle[] values();
-
- public static java.time.format.ResolverStyle LENIENT;
- public static java.time.format.ResolverStyle SMART;
- public static java.time.format.ResolverStyle STRICT;
-
-}
-
--keep class java.time.format.TextStyle {
-
- public java.time.format.TextStyle asNormal();
- public java.time.format.TextStyle asStandalone();
- public boolean isStandalone();
- public static java.time.format.TextStyle valueOf(java.lang.String);
- public static java.time.format.TextStyle[] values();
-
- public static java.time.format.TextStyle FULL;
- public static java.time.format.TextStyle FULL_STANDALONE;
- public static java.time.format.TextStyle NARROW;
- public static java.time.format.TextStyle NARROW_STANDALONE;
- public static java.time.format.TextStyle SHORT;
- public static java.time.format.TextStyle SHORT_STANDALONE;
-
-}
-
--keep class java.time.temporal.ChronoField {
-
- public java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal, long);
- public int checkValidIntValue(long);
- public long checkValidValue(long);
- public java.time.temporal.TemporalUnit getBaseUnit();
- public java.lang.String getDisplayName(java.util.Locale);
- public long getFrom(java.time.temporal.TemporalAccessor);
- public java.time.temporal.TemporalUnit getRangeUnit();
- public boolean isDateBased();
- public boolean isSupportedBy(java.time.temporal.TemporalAccessor);
- public boolean isTimeBased();
- public java.time.temporal.ValueRange range();
- public java.time.temporal.ValueRange rangeRefinedBy(java.time.temporal.TemporalAccessor);
- public java.lang.String toString();
- public static java.time.temporal.ChronoField valueOf(java.lang.String);
- public static java.time.temporal.ChronoField[] values();
-
- public static java.time.temporal.ChronoField ALIGNED_DAY_OF_WEEK_IN_MONTH;
- public static java.time.temporal.ChronoField ALIGNED_DAY_OF_WEEK_IN_YEAR;
- public static java.time.temporal.ChronoField ALIGNED_WEEK_OF_MONTH;
- public static java.time.temporal.ChronoField ALIGNED_WEEK_OF_YEAR;
- public static java.time.temporal.ChronoField AMPM_OF_DAY;
- public static java.time.temporal.ChronoField CLOCK_HOUR_OF_AMPM;
- public static java.time.temporal.ChronoField CLOCK_HOUR_OF_DAY;
- public static java.time.temporal.ChronoField DAY_OF_MONTH;
- public static java.time.temporal.ChronoField DAY_OF_WEEK;
- public static java.time.temporal.ChronoField DAY_OF_YEAR;
- public static java.time.temporal.ChronoField EPOCH_DAY;
- public static java.time.temporal.ChronoField ERA;
- public static java.time.temporal.ChronoField HOUR_OF_AMPM;
- public static java.time.temporal.ChronoField HOUR_OF_DAY;
- public static java.time.temporal.ChronoField INSTANT_SECONDS;
- public static java.time.temporal.ChronoField MICRO_OF_DAY;
- public static java.time.temporal.ChronoField MICRO_OF_SECOND;
- public static java.time.temporal.ChronoField MILLI_OF_DAY;
- public static java.time.temporal.ChronoField MILLI_OF_SECOND;
- public static java.time.temporal.ChronoField MINUTE_OF_DAY;
- public static java.time.temporal.ChronoField MINUTE_OF_HOUR;
- public static java.time.temporal.ChronoField MONTH_OF_YEAR;
- public static java.time.temporal.ChronoField NANO_OF_DAY;
- public static java.time.temporal.ChronoField NANO_OF_SECOND;
- public static java.time.temporal.ChronoField OFFSET_SECONDS;
- public static java.time.temporal.ChronoField PROLEPTIC_MONTH;
- public static java.time.temporal.ChronoField SECOND_OF_DAY;
- public static java.time.temporal.ChronoField SECOND_OF_MINUTE;
- public static java.time.temporal.ChronoField YEAR;
- public static java.time.temporal.ChronoField YEAR_OF_ERA;
-
-}
-
--keep class java.time.temporal.Temporal {
-
- public abstract boolean isSupported(java.time.temporal.TemporalUnit);
- public java.time.temporal.Temporal minus(java.time.temporal.TemporalAmount);
- public java.time.temporal.Temporal minus(long, java.time.temporal.TemporalUnit);
- public java.time.temporal.Temporal plus(java.time.temporal.TemporalAmount);
- public abstract java.time.temporal.Temporal plus(long, java.time.temporal.TemporalUnit);
- public abstract long until(java.time.temporal.Temporal, java.time.temporal.TemporalUnit);
- public java.time.temporal.Temporal with(java.time.temporal.TemporalAdjuster);
- public abstract java.time.temporal.Temporal with(java.time.temporal.TemporalField, long);
-
-
-}
-
--keep class java.time.temporal.TemporalAccessor {
-
- public int get(java.time.temporal.TemporalField);
- public abstract long getLong(java.time.temporal.TemporalField);
- public abstract boolean isSupported(java.time.temporal.TemporalField);
- public java.lang.Object query(java.time.temporal.TemporalQuery);
- public java.time.temporal.ValueRange range(java.time.temporal.TemporalField);
-
-
-}
-
--keep class java.time.temporal.TemporalAdjuster {
-
- public abstract java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal);
-
-
-}
-
--keep class java.time.temporal.TemporalAmount {
-
- public abstract java.time.temporal.Temporal addTo(java.time.temporal.Temporal);
- public abstract long get(java.time.temporal.TemporalUnit);
- public abstract java.util.List getUnits();
- public abstract java.time.temporal.Temporal subtractFrom(java.time.temporal.Temporal);
-
-
-}
-
--keep class java.time.temporal.TemporalField {
-
- public abstract java.time.temporal.Temporal adjustInto(java.time.temporal.Temporal, long);
- public abstract java.time.temporal.TemporalUnit getBaseUnit();
- public java.lang.String getDisplayName(java.util.Locale);
- public abstract long getFrom(java.time.temporal.TemporalAccessor);
- public abstract java.time.temporal.TemporalUnit getRangeUnit();
- public abstract boolean isDateBased();
- public abstract boolean isSupportedBy(java.time.temporal.TemporalAccessor);
- public abstract boolean isTimeBased();
- public abstract java.time.temporal.ValueRange range();
- public abstract java.time.temporal.ValueRange rangeRefinedBy(java.time.temporal.TemporalAccessor);
- public java.time.temporal.TemporalAccessor resolve(java.util.Map, java.time.temporal.TemporalAccessor, java.time.format.ResolverStyle);
- public abstract java.lang.String toString();
-
-
-}
-
--keep class java.time.temporal.TemporalQuery {
-
- public abstract java.lang.Object queryFrom(java.time.temporal.TemporalAccessor);
-
-
-}
-
--keep class java.time.temporal.TemporalUnit {
-
- public abstract java.time.temporal.Temporal addTo(java.time.temporal.Temporal, long);
- public abstract long between(java.time.temporal.Temporal, java.time.temporal.Temporal);
- public abstract java.time.Duration getDuration();
- public abstract boolean isDateBased();
- public abstract boolean isDurationEstimated();
- public boolean isSupportedBy(java.time.temporal.Temporal);
- public abstract boolean isTimeBased();
- public abstract java.lang.String toString();
-
-
-}
-
--keep class java.time.temporal.ValueRange {
-
- public int checkValidIntValue(long, java.time.temporal.TemporalField);
- public long checkValidValue(long, java.time.temporal.TemporalField);
- public boolean equals(java.lang.Object);
- public long getLargestMinimum();
- public long getMaximum();
- public long getMinimum();
- public long getSmallestMaximum();
- public int hashCode();
- public boolean isFixed();
- public boolean isIntValue();
- public boolean isValidIntValue(long);
- public boolean isValidValue(long);
- public static java.time.temporal.ValueRange of(long, long);
- public static java.time.temporal.ValueRange of(long, long, long);
- public static java.time.temporal.ValueRange of(long, long, long, long);
- public java.lang.String toString();
-
-
-}
-
--keep class java.time.zone.ZoneOffsetTransition {
-
- public int compareTo(java.time.zone.ZoneOffsetTransition);
- public int compareTo(java.lang.Object);
- public boolean equals(java.lang.Object);
- public java.time.LocalDateTime getDateTimeAfter();
- public java.time.LocalDateTime getDateTimeBefore();
- public java.time.Duration getDuration();
- public java.time.Instant getInstant();
- public java.time.ZoneOffset getOffsetAfter();
- public java.time.ZoneOffset getOffsetBefore();
- public int hashCode();
- public boolean isGap();
- public boolean isOverlap();
- public boolean isValidOffset(java.time.ZoneOffset);
- public static java.time.zone.ZoneOffsetTransition of(java.time.LocalDateTime, java.time.ZoneOffset, java.time.ZoneOffset);
- public long toEpochSecond();
- public java.lang.String toString();
-
-
-}
-
--keep class java.time.zone.ZoneOffsetTransitionRule {
-
- public java.time.zone.ZoneOffsetTransition createTransition(int);
- public boolean equals(java.lang.Object);
- public int getDayOfMonthIndicator();
- public java.time.DayOfWeek getDayOfWeek();
- public java.time.LocalTime getLocalTime();
- public java.time.Month getMonth();
- public java.time.ZoneOffset getOffsetAfter();
- public java.time.ZoneOffset getOffsetBefore();
- public java.time.ZoneOffset getStandardOffset();
- public java.time.zone.ZoneOffsetTransitionRule$TimeDefinition getTimeDefinition();
- public int hashCode();
- public boolean isMidnightEndOfDay();
- public static java.time.zone.ZoneOffsetTransitionRule of(java.time.Month, int, java.time.DayOfWeek, java.time.LocalTime, boolean, java.time.zone.ZoneOffsetTransitionRule$TimeDefinition, java.time.ZoneOffset, java.time.ZoneOffset, java.time.ZoneOffset);
- public java.lang.String toString();
-
-
-}
-
--keep class java.time.zone.ZoneOffsetTransitionRule$TimeDefinition {
-
- public java.time.LocalDateTime createDateTime(java.time.LocalDateTime, java.time.ZoneOffset, java.time.ZoneOffset);
- public static java.time.zone.ZoneOffsetTransitionRule$TimeDefinition valueOf(java.lang.String);
- public static java.time.zone.ZoneOffsetTransitionRule$TimeDefinition[] values();
-
- public static java.time.zone.ZoneOffsetTransitionRule$TimeDefinition STANDARD;
- public static java.time.zone.ZoneOffsetTransitionRule$TimeDefinition UTC;
- public static java.time.zone.ZoneOffsetTransitionRule$TimeDefinition WALL;
-
-}
-
--keep class java.time.zone.ZoneRules {
-
- public boolean equals(java.lang.Object);
- public java.time.Duration getDaylightSavings(java.time.Instant);
- public java.time.ZoneOffset getOffset(java.time.Instant);
- public java.time.ZoneOffset getOffset(java.time.LocalDateTime);
- public java.time.ZoneOffset getStandardOffset(java.time.Instant);
- public java.time.zone.ZoneOffsetTransition getTransition(java.time.LocalDateTime);
- public java.util.List getTransitionRules();
- public java.util.List getTransitions();
- public java.util.List getValidOffsets(java.time.LocalDateTime);
- public int hashCode();
- public boolean isDaylightSavings(java.time.Instant);
- public boolean isFixedOffset();
- public boolean isValidOffset(java.time.LocalDateTime, java.time.ZoneOffset);
- public java.time.zone.ZoneOffsetTransition nextTransition(java.time.Instant);
- public static java.time.zone.ZoneRules of(java.time.ZoneOffset, java.time.ZoneOffset, java.util.List, java.util.List, java.util.List);
- public static java.time.zone.ZoneRules of(java.time.ZoneOffset);
- public java.time.zone.ZoneOffsetTransition previousTransition(java.time.Instant);
- public java.lang.String toString();
-
-
-}
-
--keep class java.util.AbstractCollection {
- <init>();
-
- public boolean add(java.lang.Object);
- public boolean addAll(java.util.Collection);
- public void clear();
- public boolean contains(java.lang.Object);
- public boolean containsAll(java.util.Collection);
- public boolean isEmpty();
- public abstract java.util.Iterator iterator();
- public boolean remove(java.lang.Object);
- public boolean removeAll(java.util.Collection);
- public boolean retainAll(java.util.Collection);
- public abstract int size();
- public java.lang.Object[] toArray();
- public java.lang.Object[] toArray(java.lang.Object[]);
- public java.lang.String toString();
-
-
-}
-
--keep class java.util.AbstractList {
- <init>();
-
- public boolean add(java.lang.Object);
- public void add(int, java.lang.Object);
- public boolean addAll(int, java.util.Collection);
- public void clear();
- public boolean equals(java.lang.Object);
- public abstract java.lang.Object get(int);
- public int hashCode();
- public int indexOf(java.lang.Object);
- public java.util.Iterator iterator();
- public int lastIndexOf(java.lang.Object);
- public java.util.ListIterator listIterator();
- public java.util.ListIterator listIterator(int);
- public java.lang.Object remove(int);
- protected void removeRange(int, int);
- public java.lang.Object set(int, java.lang.Object);
- public java.util.List subList(int, int);
-
-
- protected transient int modCount;
-}
-
--keep class java.util.AbstractMap {
- <init>();
-
- public void clear();
- protected java.lang.Object clone();
- public boolean containsKey(java.lang.Object);
- public boolean containsValue(java.lang.Object);
- public abstract java.util.Set entrySet();
- public boolean equals(java.lang.Object);
- public java.lang.Object get(java.lang.Object);
- public int hashCode();
- public boolean isEmpty();
- public java.util.Set keySet();
- public java.lang.Object put(java.lang.Object, java.lang.Object);
- public void putAll(java.util.Map);
- public java.lang.Object remove(java.lang.Object);
- public int size();
- public java.lang.String toString();
- public java.util.Collection values();
-
-
-}
-
--keep class java.util.ArrayList {
- <init>(int);
- <init>();
- <init>(java.util.Collection);
-
- public boolean add(java.lang.Object);
- public void add(int, java.lang.Object);
- public boolean addAll(java.util.Collection);
- public boolean addAll(int, java.util.Collection);
- public void clear();
- public java.lang.Object clone();
- public boolean contains(java.lang.Object);
- public void ensureCapacity(int);
- public void forEach(java.util.function.Consumer);
- public java.lang.Object get(int);
- public int indexOf(java.lang.Object);
- public boolean isEmpty();
- public java.util.Iterator iterator();
- public int lastIndexOf(java.lang.Object);
- public java.util.ListIterator listIterator(int);
- public java.util.ListIterator listIterator();
- public java.lang.Object remove(int);
- public boolean remove(java.lang.Object);
- public boolean removeAll(java.util.Collection);
- public boolean removeIf(java.util.function.Predicate);
- protected void removeRange(int, int);
- public void replaceAll(java.util.function.UnaryOperator);
- public boolean retainAll(java.util.Collection);
- public java.lang.Object set(int, java.lang.Object);
- public int size();
- public void sort(java.util.Comparator);
- public java.util.Spliterator spliterator();
- public java.util.List subList(int, int);
- public java.lang.Object[] toArray();
- public java.lang.Object[] toArray(java.lang.Object[]);
- public void trimToSize();
-
-
-}
-
--keep class java.util.Collection {
-
- public abstract boolean add(java.lang.Object);
- public abstract boolean addAll(java.util.Collection);
- public abstract void clear();
- public abstract boolean contains(java.lang.Object);
- public abstract boolean containsAll(java.util.Collection);
- public abstract boolean equals(java.lang.Object);
- public abstract int hashCode();
- public abstract boolean isEmpty();
- public abstract java.util.Iterator iterator();
- public java.util.stream.Stream parallelStream();
- public abstract boolean remove(java.lang.Object);
- public abstract boolean removeAll(java.util.Collection);
- public boolean removeIf(java.util.function.Predicate);
- public abstract boolean retainAll(java.util.Collection);
- public abstract int size();
- public java.util.Spliterator spliterator();
- public java.util.stream.Stream stream();
- public abstract java.lang.Object[] toArray();
- public abstract java.lang.Object[] toArray(java.lang.Object[]);
-
-
-}
-
--keep class java.util.Comparator {
-
- public abstract int compare(java.lang.Object, java.lang.Object);
- public static java.util.Comparator comparing(java.util.function.Function, java.util.Comparator);
- public static java.util.Comparator comparing(java.util.function.Function);
- public static java.util.Comparator comparingDouble(java.util.function.ToDoubleFunction);
- public static java.util.Comparator comparingInt(java.util.function.ToIntFunction);
- public static java.util.Comparator comparingLong(java.util.function.ToLongFunction);
- public abstract boolean equals(java.lang.Object);
- public static java.util.Comparator naturalOrder();
- public static java.util.Comparator nullsFirst(java.util.Comparator);
- public static java.util.Comparator nullsLast(java.util.Comparator);
- public static java.util.Comparator reverseOrder();
- public java.util.Comparator reversed();
- public java.util.Comparator thenComparing(java.util.Comparator);
- public java.util.Comparator thenComparing(java.util.function.Function, java.util.Comparator);
- public java.util.Comparator thenComparing(java.util.function.Function);
- public java.util.Comparator thenComparingDouble(java.util.function.ToDoubleFunction);
- public java.util.Comparator thenComparingInt(java.util.function.ToIntFunction);
- public java.util.Comparator thenComparingLong(java.util.function.ToLongFunction);
-
-
-}
-
--keep class java.util.Date {
- <init>();
- <init>(long);
- <init>(int, int, int);
- <init>(int, int, int, int, int);
- <init>(int, int, int, int, int, int);
- <init>(java.lang.String);
-
- public static long UTC(int, int, int, int, int, int);
- public boolean after(java.util.Date);
- public boolean before(java.util.Date);
- public java.lang.Object clone();
- public int compareTo(java.util.Date);
- public int compareTo(java.lang.Object);
- public boolean equals(java.lang.Object);
- public static java.util.Date from(java.time.Instant);
- public int getDate();
- public int getDay();
- public int getHours();
- public int getMinutes();
- public int getMonth();
- public int getSeconds();
- public long getTime();
- public int getTimezoneOffset();
- public int getYear();
- public int hashCode();
- public static long parse(java.lang.String);
- public void setDate(int);
- public void setHours(int);
- public void setMinutes(int);
- public void setMonth(int);
- public void setSeconds(int);
- public void setTime(long);
- public void setYear(int);
- public java.lang.String toGMTString();
- public java.time.Instant toInstant();
- public java.lang.String toLocaleString();
- public java.lang.String toString();
-
-
-}
-
--keep class java.util.Dictionary {
- <init>();
-
- public abstract java.util.Enumeration elements();
- public abstract java.lang.Object get(java.lang.Object);
- public abstract boolean isEmpty();
- public abstract java.util.Enumeration keys();
- public abstract java.lang.Object put(java.lang.Object, java.lang.Object);
- public abstract java.lang.Object remove(java.lang.Object);
- public abstract int size();
-
-
-}
-
--keep class java.util.DoubleSummaryStatistics {
- <init>();
-
- public void accept(double);
- public void combine(java.util.DoubleSummaryStatistics);
- public double getAverage();
- public long getCount();
- public double getMax();
- public double getMin();
- public double getSum();
- public java.lang.String toString();
-
-
-}
-
--keep class java.util.Enumeration {
-
- public abstract boolean hasMoreElements();
- public abstract java.lang.Object nextElement();
-
-
-}
-
--keep class java.util.HashMap {
- <init>(int, float);
- <init>(int);
- <init>();
- <init>(java.util.Map);
-
- public void clear();
- public java.lang.Object clone();
- public java.lang.Object compute(java.lang.Object, java.util.function.BiFunction);
- public java.lang.Object computeIfAbsent(java.lang.Object, java.util.function.Function);
- public java.lang.Object computeIfPresent(java.lang.Object, java.util.function.BiFunction);
- public boolean containsKey(java.lang.Object);
- public boolean containsValue(java.lang.Object);
- public java.util.Set entrySet();
- public void forEach(java.util.function.BiConsumer);
- public java.lang.Object get(java.lang.Object);
- public java.lang.Object getOrDefault(java.lang.Object, java.lang.Object);
- public boolean isEmpty();
- public java.util.Set keySet();
- public java.lang.Object merge(java.lang.Object, java.lang.Object, java.util.function.BiFunction);
- public java.lang.Object put(java.lang.Object, java.lang.Object);
- public void putAll(java.util.Map);
- public java.lang.Object putIfAbsent(java.lang.Object, java.lang.Object);
- public java.lang.Object remove(java.lang.Object);
- public boolean remove(java.lang.Object, java.lang.Object);
- public boolean replace(java.lang.Object, java.lang.Object, java.lang.Object);
- public java.lang.Object replace(java.lang.Object, java.lang.Object);
- public void replaceAll(java.util.function.BiFunction);
- public int size();
- public java.util.Collection values();
-
-
-}
-
--keep class java.util.Hashtable {
- <init>(int, float);
- <init>(int);
- <init>();
- <init>(java.util.Map);
-
- public synchronized void clear();
- public synchronized java.lang.Object clone();
- public synchronized java.lang.Object compute(java.lang.Object, java.util.function.BiFunction);
- public synchronized java.lang.Object computeIfAbsent(java.lang.Object, java.util.function.Function);
- public synchronized java.lang.Object computeIfPresent(java.lang.Object, java.util.function.BiFunction);
- public synchronized boolean contains(java.lang.Object);
- public synchronized boolean containsKey(java.lang.Object);
- public boolean containsValue(java.lang.Object);
- public synchronized java.util.Enumeration elements();
- public java.util.Set entrySet();
- public synchronized boolean equals(java.lang.Object);
- public synchronized void forEach(java.util.function.BiConsumer);
- public synchronized java.lang.Object get(java.lang.Object);
- public synchronized java.lang.Object getOrDefault(java.lang.Object, java.lang.Object);
- public synchronized int hashCode();
- public synchronized boolean isEmpty();
- public java.util.Set keySet();
- public synchronized java.util.Enumeration keys();
- public synchronized java.lang.Object merge(java.lang.Object, java.lang.Object, java.util.function.BiFunction);
- public synchronized java.lang.Object put(java.lang.Object, java.lang.Object);
- public synchronized void putAll(java.util.Map);
- public synchronized java.lang.Object putIfAbsent(java.lang.Object, java.lang.Object);
- protected void rehash();
- public synchronized java.lang.Object remove(java.lang.Object);
- public synchronized boolean remove(java.lang.Object, java.lang.Object);
- public synchronized boolean replace(java.lang.Object, java.lang.Object, java.lang.Object);
- public synchronized java.lang.Object replace(java.lang.Object, java.lang.Object);
- public synchronized void replaceAll(java.util.function.BiFunction);
- public synchronized int size();
- public synchronized java.lang.String toString();
- public java.util.Collection values();
-
-
-}
-
--keep class java.util.IntSummaryStatistics {
- <init>();
-
- public void accept(int);
- public void combine(java.util.IntSummaryStatistics);
- public double getAverage();
- public long getCount();
- public int getMax();
- public int getMin();
- public long getSum();
- public java.lang.String toString();
-
-
-}
-
--keep class java.util.InvalidPropertiesFormatException {
- <init>(java.lang.Throwable);
- <init>(java.lang.String);
-
-
-
-}
-
--keep class java.util.Iterator {
-
- public void forEachRemaining(java.util.function.Consumer);
- public abstract boolean hasNext();
- public abstract java.lang.Object next();
- public void remove();
-
-
-}
-
--keep class java.util.List {
-
- public abstract boolean add(java.lang.Object);
- public abstract void add(int, java.lang.Object);
- public abstract boolean addAll(java.util.Collection);
- public abstract boolean addAll(int, java.util.Collection);
- public abstract void clear();
- public abstract boolean contains(java.lang.Object);
- public abstract boolean containsAll(java.util.Collection);
- public abstract boolean equals(java.lang.Object);
- public abstract java.lang.Object get(int);
- public abstract int hashCode();
- public abstract int indexOf(java.lang.Object);
- public abstract boolean isEmpty();
- public abstract java.util.Iterator iterator();
- public abstract int lastIndexOf(java.lang.Object);
- public abstract java.util.ListIterator listIterator();
- public abstract java.util.ListIterator listIterator(int);
- public abstract boolean remove(java.lang.Object);
- public abstract java.lang.Object remove(int);
- public abstract boolean removeAll(java.util.Collection);
- public void replaceAll(java.util.function.UnaryOperator);
- public abstract boolean retainAll(java.util.Collection);
- public abstract java.lang.Object set(int, java.lang.Object);
- public abstract int size();
- public void sort(java.util.Comparator);
- public java.util.Spliterator spliterator();
- public abstract java.util.List subList(int, int);
- public abstract java.lang.Object[] toArray();
- public abstract java.lang.Object[] toArray(java.lang.Object[]);
-
-
-}
-
--keep class java.util.ListIterator {
-
- public abstract void add(java.lang.Object);
- public abstract boolean hasNext();
- public abstract boolean hasPrevious();
- public abstract java.lang.Object next();
- public abstract int nextIndex();
- public abstract java.lang.Object previous();
- public abstract int previousIndex();
- public abstract void remove();
- public abstract void set(java.lang.Object);
-
-
-}
-
--keep class java.util.Locale {
- <init>(java.lang.String, java.lang.String, java.lang.String);
- <init>(java.lang.String, java.lang.String);
- <init>(java.lang.String);
-
- public static java.lang.String adjustLanguageCode(java.lang.String);
- public java.lang.Object clone();
- public boolean equals(java.lang.Object);
- public static java.util.List filter(java.util.List, java.util.Collection, java.util.Locale$FilteringMode);
- public static java.util.List filter(java.util.List, java.util.Collection);
- public static java.util.List filterTags(java.util.List, java.util.Collection, java.util.Locale$FilteringMode);
- public static java.util.List filterTags(java.util.List, java.util.Collection);
- public static java.util.Locale forLanguageTag(java.lang.String);
- public static java.util.Locale[] getAvailableLocales();
- public java.lang.String getCountry();
- public static java.util.Locale getDefault();
- public static java.util.Locale getDefault(java.util.Locale$Category);
- public java.lang.String getDisplayCountry();
- public java.lang.String getDisplayCountry(java.util.Locale);
- public java.lang.String getDisplayLanguage();
- public java.lang.String getDisplayLanguage(java.util.Locale);
- public java.lang.String getDisplayName();
- public java.lang.String getDisplayName(java.util.Locale);
- public java.lang.String getDisplayScript();
- public java.lang.String getDisplayScript(java.util.Locale);
- public java.lang.String getDisplayVariant();
- public java.lang.String getDisplayVariant(java.util.Locale);
- public java.lang.String getExtension(char);
- public java.util.Set getExtensionKeys();
- public java.lang.String getISO3Country();
- public java.lang.String getISO3Language();
- public static java.lang.String[] getISOCountries();
- public static java.lang.String[] getISOLanguages();
- public java.lang.String getLanguage();
- public java.lang.String getScript();
- public java.util.Set getUnicodeLocaleAttributes();
- public java.util.Set getUnicodeLocaleKeys();
- public java.lang.String getUnicodeLocaleType(java.lang.String);
- public java.lang.String getVariant();
- public boolean hasExtensions();
- public int hashCode();
- public static java.util.Locale initDefault();
- public static java.util.Locale lookup(java.util.List, java.util.Collection);
- public static java.lang.String lookupTag(java.util.List, java.util.Collection);
- public static synchronized void setDefault(java.util.Locale);
- public static synchronized void setDefault(java.util.Locale$Category, java.util.Locale);
- public java.util.Locale stripExtensions();
- public java.lang.String toLanguageTag();
- public java.lang.String toString();
-
-
- public static java.util.Locale CANADA;
- public static java.util.Locale CANADA_FRENCH;
- public static java.util.Locale CHINA;
- public static java.util.Locale CHINESE;
- public static java.util.Locale ENGLISH;
- public static java.util.Locale FRANCE;
- public static java.util.Locale FRENCH;
- public static java.util.Locale GERMAN;
- public static java.util.Locale GERMANY;
- public static java.util.Locale ITALIAN;
- public static java.util.Locale ITALY;
- public static java.util.Locale JAPAN;
- public static java.util.Locale JAPANESE;
- public static java.util.Locale KOREA;
- public static java.util.Locale KOREAN;
- public static java.util.Locale PRC;
- public static char PRIVATE_USE_EXTENSION;
- public static java.util.Locale ROOT;
- public static java.util.Locale SIMPLIFIED_CHINESE;
- public static java.util.Locale TAIWAN;
- public static java.util.Locale TRADITIONAL_CHINESE;
- public static java.util.Locale UK;
- public static char UNICODE_LOCALE_EXTENSION;
- public static java.util.Locale US;
-}
-
--keep class java.util.Locale$Category {
-
- public static java.util.Locale$Category valueOf(java.lang.String);
- public static java.util.Locale$Category[] values();
-
- public static java.util.Locale$Category DISPLAY;
- public static java.util.Locale$Category FORMAT;
-
-}
-
--keep class java.util.Locale$FilteringMode {
-
- public static java.util.Locale$FilteringMode valueOf(java.lang.String);
- public static java.util.Locale$FilteringMode[] values();
-
- public static java.util.Locale$FilteringMode AUTOSELECT_FILTERING;
- public static java.util.Locale$FilteringMode EXTENDED_FILTERING;
- public static java.util.Locale$FilteringMode IGNORE_EXTENDED_RANGES;
- public static java.util.Locale$FilteringMode MAP_EXTENDED_RANGES;
- public static java.util.Locale$FilteringMode REJECT_EXTENDED_RANGES;
-
-}
-
--keep class java.util.Locale$LanguageRange {
- <init>(java.lang.String);
- <init>(java.lang.String, double);
-
- public boolean equals(java.lang.Object);
- public java.lang.String getRange();
- public double getWeight();
- public int hashCode();
- public static java.util.List mapEquivalents(java.util.List, java.util.Map);
- public static java.util.List parse(java.lang.String);
- public static java.util.List parse(java.lang.String, java.util.Map);
-
-
- public static double MAX_WEIGHT;
- public static double MIN_WEIGHT;
-}
-
--keep class java.util.LongSummaryStatistics {
- <init>();
-
- public void accept(int);
- public void accept(long);
- public void combine(java.util.LongSummaryStatistics);
- public double getAverage();
- public long getCount();
- public long getMax();
- public long getMin();
- public long getSum();
- public java.lang.String toString();
-
-
-}
-
--keep class java.util.Map {
-
- public abstract void clear();
- public java.lang.Object compute(java.lang.Object, java.util.function.BiFunction);
- public java.lang.Object computeIfAbsent(java.lang.Object, java.util.function.Function);
- public java.lang.Object computeIfPresent(java.lang.Object, java.util.function.BiFunction);
- public abstract boolean containsKey(java.lang.Object);
- public abstract boolean containsValue(java.lang.Object);
- public abstract java.util.Set entrySet();
- public abstract boolean equals(java.lang.Object);
- public void forEach(java.util.function.BiConsumer);
- public abstract java.lang.Object get(java.lang.Object);
- public java.lang.Object getOrDefault(java.lang.Object, java.lang.Object);
- public abstract int hashCode();
- public abstract boolean isEmpty();
- public abstract java.util.Set keySet();
- public java.lang.Object merge(java.lang.Object, java.lang.Object, java.util.function.BiFunction);
- public abstract java.lang.Object put(java.lang.Object, java.lang.Object);
- public abstract void putAll(java.util.Map);
- public java.lang.Object putIfAbsent(java.lang.Object, java.lang.Object);
- public abstract java.lang.Object remove(java.lang.Object);
- public boolean remove(java.lang.Object, java.lang.Object);
- public boolean replace(java.lang.Object, java.lang.Object, java.lang.Object);
- public java.lang.Object replace(java.lang.Object, java.lang.Object);
- public void replaceAll(java.util.function.BiFunction);
- public abstract int size();
- public abstract java.util.Collection values();
-
-
-}
-
--keep class java.util.Map$Entry {
-
- public static java.util.Comparator comparingByKey();
- public static java.util.Comparator comparingByKey(java.util.Comparator);
- public static java.util.Comparator comparingByValue();
- public static java.util.Comparator comparingByValue(java.util.Comparator);
- public abstract boolean equals(java.lang.Object);
- public abstract java.lang.Object getKey();
- public abstract java.lang.Object getValue();
- public abstract int hashCode();
- public abstract java.lang.Object setValue(java.lang.Object);
-
-
-}
-
--keep class java.util.MissingResourceException {
- <init>(java.lang.String, java.lang.String, java.lang.String);
-
- public java.lang.String getClassName();
- public java.lang.String getKey();
-
-
-}
-
--keep class java.util.Optional {
-
- public static java.util.Optional empty();
- public boolean equals(java.lang.Object);
- public java.util.Optional filter(java.util.function.Predicate);
- public java.util.Optional flatMap(java.util.function.Function);
- public java.lang.Object get();
- public int hashCode();
- public void ifPresent(java.util.function.Consumer);
- public boolean isPresent();
- public java.util.Optional map(java.util.function.Function);
- public static java.util.Optional of(java.lang.Object);
- public static java.util.Optional ofNullable(java.lang.Object);
- public java.lang.Object orElse(java.lang.Object);
- public java.lang.Object orElseGet(java.util.function.Supplier);
- public java.lang.Object orElseThrow(java.util.function.Supplier);
- public java.lang.String toString();
-
-
-}
-
--keep class java.util.OptionalDouble {
-
- public static java.util.OptionalDouble empty();
- public boolean equals(java.lang.Object);
- public double getAsDouble();
- public int hashCode();
- public void ifPresent(java.util.function.DoubleConsumer);
- public boolean isPresent();
- public static java.util.OptionalDouble of(double);
- public double orElse(double);
- public double orElseGet(java.util.function.DoubleSupplier);
- public double orElseThrow(java.util.function.Supplier);
- public java.lang.String toString();
-
-
-}
-
--keep class java.util.OptionalInt {
-
- public static java.util.OptionalInt empty();
- public boolean equals(java.lang.Object);
- public int getAsInt();
- public int hashCode();
- public void ifPresent(java.util.function.IntConsumer);
- public boolean isPresent();
- public static java.util.OptionalInt of(int);
- public int orElse(int);
- public int orElseGet(java.util.function.IntSupplier);
- public int orElseThrow(java.util.function.Supplier);
- public java.lang.String toString();
-
-
-}
-
--keep class java.util.OptionalLong {
-
- public static java.util.OptionalLong empty();
- public boolean equals(java.lang.Object);
- public long getAsLong();
- public int hashCode();
- public void ifPresent(java.util.function.LongConsumer);
- public boolean isPresent();
- public static java.util.OptionalLong of(long);
- public long orElse(long);
- public long orElseGet(java.util.function.LongSupplier);
- public long orElseThrow(java.util.function.Supplier);
- public java.lang.String toString();
-
-
-}
-
--keep class java.util.PrimitiveIterator {
-
- public abstract void forEachRemaining(java.lang.Object);
-
-
-}
-
--keep class java.util.PrimitiveIterator$OfDouble {
-
- public void forEachRemaining(java.util.function.DoubleConsumer);
- public void forEachRemaining(java.util.function.Consumer);
- public void forEachRemaining(java.lang.Object);
- public java.lang.Double next();
- public java.lang.Object next();
- public abstract double nextDouble();
-
-
-}
-
--keep class java.util.PrimitiveIterator$OfInt {
-
- public void forEachRemaining(java.util.function.IntConsumer);
- public void forEachRemaining(java.util.function.Consumer);
- public void forEachRemaining(java.lang.Object);
- public java.lang.Integer next();
- public java.lang.Object next();
- public abstract int nextInt();
-
-
-}
-
--keep class java.util.PrimitiveIterator$OfLong {
-
- public void forEachRemaining(java.util.function.LongConsumer);
- public void forEachRemaining(java.util.function.Consumer);
- public void forEachRemaining(java.lang.Object);
- public java.lang.Long next();
- public java.lang.Object next();
- public abstract long nextLong();
-
-
-}
-
--keep class java.util.Properties {
- <init>();
- <init>(java.util.Properties);
-
- public java.lang.String getProperty(java.lang.String);
- public java.lang.String getProperty(java.lang.String, java.lang.String);
- public void list(java.io.PrintStream);
- public void list(java.io.PrintWriter);
- public synchronized void load(java.io.Reader);
- public synchronized void load(java.io.InputStream);
- public synchronized void loadFromXML(java.io.InputStream);
- public java.util.Enumeration propertyNames();
- public void save(java.io.OutputStream, java.lang.String);
- public synchronized java.lang.Object setProperty(java.lang.String, java.lang.String);
- public void store(java.io.Writer, java.lang.String);
- public void store(java.io.OutputStream, java.lang.String);
- public void storeToXML(java.io.OutputStream, java.lang.String);
- public void storeToXML(java.io.OutputStream, java.lang.String, java.lang.String);
- public java.util.Set stringPropertyNames();
-
-
- protected java.util.Properties defaults;
-}
-
--keep class java.util.Random {
- <init>();
- <init>(long);
-
- public java.util.stream.DoubleStream doubles(long);
- public java.util.stream.DoubleStream doubles();
- public java.util.stream.DoubleStream doubles(long, double, double);
- public java.util.stream.DoubleStream doubles(double, double);
- public java.util.stream.IntStream ints(long);
- public java.util.stream.IntStream ints();
- public java.util.stream.IntStream ints(long, int, int);
- public java.util.stream.IntStream ints(int, int);
- public java.util.stream.LongStream longs(long);
- public java.util.stream.LongStream longs();
- public java.util.stream.LongStream longs(long, long, long);
- public java.util.stream.LongStream longs(long, long);
- protected int next(int);
- public boolean nextBoolean();
- public void nextBytes(byte[]);
- public double nextDouble();
- public float nextFloat();
- public synchronized double nextGaussian();
- public int nextInt();
- public int nextInt(int);
- public long nextLong();
- public synchronized void setSeed(long);
-
-
-}
-
--keep class java.util.Set {
-
- public abstract boolean add(java.lang.Object);
- public abstract boolean addAll(java.util.Collection);
- public abstract void clear();
- public abstract boolean contains(java.lang.Object);
- public abstract boolean containsAll(java.util.Collection);
- public abstract boolean equals(java.lang.Object);
- public abstract int hashCode();
- public abstract boolean isEmpty();
- public abstract java.util.Iterator iterator();
- public abstract boolean remove(java.lang.Object);
- public abstract boolean removeAll(java.util.Collection);
- public abstract boolean retainAll(java.util.Collection);
- public abstract int size();
- public java.util.Spliterator spliterator();
- public abstract java.lang.Object[] toArray();
- public abstract java.lang.Object[] toArray(java.lang.Object[]);
-
-
-}
-
--keep class java.util.SortedMap {
-
- public abstract java.util.Comparator comparator();
- public abstract java.util.Set entrySet();
- public abstract java.lang.Object firstKey();
- public abstract java.util.SortedMap headMap(java.lang.Object);
- public abstract java.util.Set keySet();
- public abstract java.lang.Object lastKey();
- public abstract java.util.SortedMap subMap(java.lang.Object, java.lang.Object);
- public abstract java.util.SortedMap tailMap(java.lang.Object);
- public abstract java.util.Collection values();
-
-
-}
-
--keep class java.util.Spliterator {
-
- public abstract int characteristics();
- public abstract long estimateSize();
- public void forEachRemaining(java.util.function.Consumer);
- public java.util.Comparator getComparator();
- public long getExactSizeIfKnown();
- public boolean hasCharacteristics(int);
- public abstract boolean tryAdvance(java.util.function.Consumer);
- public abstract java.util.Spliterator trySplit();
-
-
- public static int CONCURRENT;
- public static int DISTINCT;
- public static int IMMUTABLE;
- public static int NONNULL;
- public static int ORDERED;
- public static int SIZED;
- public static int SORTED;
- public static int SUBSIZED;
-}
-
--keep class java.util.Spliterator$OfDouble {
-
- public void forEachRemaining(java.util.function.DoubleConsumer);
- public void forEachRemaining(java.util.function.Consumer);
- public void forEachRemaining(java.lang.Object);
- public abstract boolean tryAdvance(java.util.function.DoubleConsumer);
- public boolean tryAdvance(java.util.function.Consumer);
- public boolean tryAdvance(java.lang.Object);
- public abstract java.util.Spliterator$OfDouble trySplit();
- public java.util.Spliterator$OfPrimitive trySplit();
- public java.util.Spliterator trySplit();
-
-
-}
-
--keep class java.util.Spliterator$OfInt {
-
- public void forEachRemaining(java.util.function.IntConsumer);
- public void forEachRemaining(java.util.function.Consumer);
- public void forEachRemaining(java.lang.Object);
- public abstract boolean tryAdvance(java.util.function.IntConsumer);
- public boolean tryAdvance(java.util.function.Consumer);
- public boolean tryAdvance(java.lang.Object);
- public abstract java.util.Spliterator$OfInt trySplit();
- public java.util.Spliterator$OfPrimitive trySplit();
- public java.util.Spliterator trySplit();
-
-
-}
-
--keep class java.util.Spliterator$OfLong {
-
- public void forEachRemaining(java.util.function.LongConsumer);
- public void forEachRemaining(java.util.function.Consumer);
- public void forEachRemaining(java.lang.Object);
- public abstract boolean tryAdvance(java.util.function.LongConsumer);
- public boolean tryAdvance(java.util.function.Consumer);
- public boolean tryAdvance(java.lang.Object);
- public abstract java.util.Spliterator$OfLong trySplit();
- public java.util.Spliterator$OfPrimitive trySplit();
- public java.util.Spliterator trySplit();
-
-
-}
-
--keep class java.util.Spliterator$OfPrimitive {
-
- public void forEachRemaining(java.lang.Object);
- public abstract boolean tryAdvance(java.lang.Object);
- public abstract java.util.Spliterator$OfPrimitive trySplit();
- public java.util.Spliterator trySplit();
-
-
-}
-
--keep class java.util.UUID {
- <init>(long, long);
-
- public int clockSequence();
- public int compareTo(java.util.UUID);
- public int compareTo(java.lang.Object);
- public boolean equals(java.lang.Object);
- public static java.util.UUID fromString(java.lang.String);
- public long getLeastSignificantBits();
- public long getMostSignificantBits();
- public int hashCode();
- public static java.util.UUID nameUUIDFromBytes(byte[]);
- public long node();
- public static java.util.UUID randomUUID();
- public long timestamp();
- public java.lang.String toString();
- public int variant();
- public int version();
-
-
-}
-
--keep class java.util.concurrent.Callable {
-
- public abstract java.lang.Object call();
-
-
-}
-
--keep class java.util.concurrent.ExecutionException {
- <init>();
- <init>(java.lang.String);
- <init>(java.lang.String, java.lang.Throwable);
- <init>(java.lang.Throwable);
-
-
-
-}
-
--keep class java.util.concurrent.Executor {
-
- public abstract void execute(java.lang.Runnable);
-
-
-}
-
--keep class java.util.concurrent.ExecutorService {
-
- public abstract boolean awaitTermination(long, java.util.concurrent.TimeUnit);
- public abstract java.util.List invokeAll(java.util.Collection);
- public abstract java.util.List invokeAll(java.util.Collection, long, java.util.concurrent.TimeUnit);
- public abstract java.lang.Object invokeAny(java.util.Collection);
- public abstract java.lang.Object invokeAny(java.util.Collection, long, java.util.concurrent.TimeUnit);
- public abstract boolean isShutdown();
- public abstract boolean isTerminated();
- public abstract void shutdown();
- public abstract java.util.List shutdownNow();
- public abstract java.util.concurrent.Future submit(java.util.concurrent.Callable);
- public abstract java.util.concurrent.Future submit(java.lang.Runnable, java.lang.Object);
- public abstract java.util.concurrent.Future submit(java.lang.Runnable);
-
-
-}
-
--keep class java.util.concurrent.Future {
-
- public abstract boolean cancel(boolean);
- public abstract java.lang.Object get();
- public abstract java.lang.Object get(long, java.util.concurrent.TimeUnit);
- public abstract boolean isCancelled();
- public abstract boolean isDone();
-
-
-}
-
--keep class java.util.concurrent.TimeUnit {
-
- public long convert(long, java.util.concurrent.TimeUnit);
- public void sleep(long);
- public void timedJoin(java.lang.Thread, long);
- public void timedWait(java.lang.Object, long);
- public long toDays(long);
- public long toHours(long);
- public long toMicros(long);
- public long toMillis(long);
- public long toMinutes(long);
- public long toNanos(long);
- public long toSeconds(long);
- public static java.util.concurrent.TimeUnit valueOf(java.lang.String);
- public static java.util.concurrent.TimeUnit[] values();
-
- public static java.util.concurrent.TimeUnit DAYS;
- public static java.util.concurrent.TimeUnit HOURS;
- public static java.util.concurrent.TimeUnit MICROSECONDS;
- public static java.util.concurrent.TimeUnit MILLISECONDS;
- public static java.util.concurrent.TimeUnit MINUTES;
- public static java.util.concurrent.TimeUnit NANOSECONDS;
- public static java.util.concurrent.TimeUnit SECONDS;
-
-}
-
--keep class java.util.concurrent.TimeoutException {
- <init>();
- <init>(java.lang.String);
-
-
-
-}
-
--keep class java.util.concurrent.atomic.AtomicInteger {
- <init>(int);
- <init>();
-
- public int accumulateAndGet(int, java.util.function.IntBinaryOperator);
- public int addAndGet(int);
- public boolean compareAndSet(int, int);
- public int decrementAndGet();
- public double doubleValue();
- public float floatValue();
- public int get();
- public int getAndAccumulate(int, java.util.function.IntBinaryOperator);
- public int getAndAdd(int);
- public int getAndDecrement();
- public int getAndIncrement();
- public int getAndSet(int);
- public int getAndUpdate(java.util.function.IntUnaryOperator);
- public int incrementAndGet();
- public int intValue();
- public void lazySet(int);
- public long longValue();
- public void set(int);
- public java.lang.String toString();
- public int updateAndGet(java.util.function.IntUnaryOperator);
- public boolean weakCompareAndSet(int, int);
-
-
-}
-
--keep class java.util.function.BiConsumer {
-
- public abstract void accept(java.lang.Object, java.lang.Object);
- public java.util.function.BiConsumer andThen(java.util.function.BiConsumer);
-
-
-}
-
--keep class java.util.function.BiFunction {
-
- public java.util.function.BiFunction andThen(java.util.function.Function);
- public abstract java.lang.Object apply(java.lang.Object, java.lang.Object);
-
-
-}
-
--keep class java.util.function.BinaryOperator {
-
- public static java.util.function.BinaryOperator maxBy(java.util.Comparator);
- public static java.util.function.BinaryOperator minBy(java.util.Comparator);
-
-
-}
-
--keep class java.util.function.Consumer {
-
- public abstract void accept(java.lang.Object);
- public java.util.function.Consumer andThen(java.util.function.Consumer);
-
-
-}
-
--keep class java.util.function.DoubleBinaryOperator {
-
- public abstract double applyAsDouble(double, double);
-
-
-}
-
--keep class java.util.function.DoubleConsumer {
-
- public abstract void accept(double);
- public java.util.function.DoubleConsumer andThen(java.util.function.DoubleConsumer);
-
-
-}
-
--keep class java.util.function.DoubleFunction {
-
- public abstract java.lang.Object apply(double);
-
-
-}
-
--keep class java.util.function.DoublePredicate {
-
- public java.util.function.DoublePredicate and(java.util.function.DoublePredicate);
- public java.util.function.DoublePredicate negate();
- public java.util.function.DoublePredicate or(java.util.function.DoublePredicate);
- public abstract boolean test(double);
-
-
-}
-
--keep class java.util.function.DoubleSupplier {
-
- public abstract double getAsDouble();
-
-
-}
-
--keep class java.util.function.DoubleToIntFunction {
-
- public abstract int applyAsInt(double);
-
-
-}
-
--keep class java.util.function.DoubleToLongFunction {
-
- public abstract long applyAsLong(double);
-
-
-}
-
--keep class java.util.function.DoubleUnaryOperator {
-
- public java.util.function.DoubleUnaryOperator andThen(java.util.function.DoubleUnaryOperator);
- public abstract double applyAsDouble(double);
- public java.util.function.DoubleUnaryOperator compose(java.util.function.DoubleUnaryOperator);
- public static java.util.function.DoubleUnaryOperator identity();
-
-
-}
-
--keep class java.util.function.Function {
-
- public java.util.function.Function andThen(java.util.function.Function);
- public abstract java.lang.Object apply(java.lang.Object);
- public java.util.function.Function compose(java.util.function.Function);
- public static java.util.function.Function identity();
-
-
-}
-
--keep class java.util.function.IntBinaryOperator {
-
- public abstract int applyAsInt(int, int);
-
-
-}
-
--keep class java.util.function.IntConsumer {
-
- public abstract void accept(int);
- public java.util.function.IntConsumer andThen(java.util.function.IntConsumer);
-
-
-}
-
--keep class java.util.function.IntFunction {
-
- public abstract java.lang.Object apply(int);
-
-
-}
-
--keep class java.util.function.IntPredicate {
-
- public java.util.function.IntPredicate and(java.util.function.IntPredicate);
- public java.util.function.IntPredicate negate();
- public java.util.function.IntPredicate or(java.util.function.IntPredicate);
- public abstract boolean test(int);
-
-
-}
-
--keep class java.util.function.IntSupplier {
-
- public abstract int getAsInt();
-
-
-}
-
--keep class java.util.function.IntToDoubleFunction {
-
- public abstract double applyAsDouble(int);
-
-
-}
-
--keep class java.util.function.IntToLongFunction {
-
- public abstract long applyAsLong(int);
-
-
-}
-
--keep class java.util.function.IntUnaryOperator {
-
- public java.util.function.IntUnaryOperator andThen(java.util.function.IntUnaryOperator);
- public abstract int applyAsInt(int);
- public java.util.function.IntUnaryOperator compose(java.util.function.IntUnaryOperator);
- public static java.util.function.IntUnaryOperator identity();
-
-
-}
-
--keep class java.util.function.LongBinaryOperator {
-
- public abstract long applyAsLong(long, long);
-
-
-}
-
--keep class java.util.function.LongConsumer {
-
- public abstract void accept(long);
- public java.util.function.LongConsumer andThen(java.util.function.LongConsumer);
-
-
-}
-
--keep class java.util.function.LongFunction {
-
- public abstract java.lang.Object apply(long);
-
-
-}
-
--keep class java.util.function.LongPredicate {
-
- public java.util.function.LongPredicate and(java.util.function.LongPredicate);
- public java.util.function.LongPredicate negate();
- public java.util.function.LongPredicate or(java.util.function.LongPredicate);
- public abstract boolean test(long);
-
-
-}
-
--keep class java.util.function.LongSupplier {
-
- public abstract long getAsLong();
-
-
-}
-
--keep class java.util.function.LongToDoubleFunction {
-
- public abstract double applyAsDouble(long);
-
-
-}
-
--keep class java.util.function.LongToIntFunction {
-
- public abstract int applyAsInt(long);
-
-
-}
-
--keep class java.util.function.LongUnaryOperator {
-
- public java.util.function.LongUnaryOperator andThen(java.util.function.LongUnaryOperator);
- public abstract long applyAsLong(long);
- public java.util.function.LongUnaryOperator compose(java.util.function.LongUnaryOperator);
- public static java.util.function.LongUnaryOperator identity();
-
-
-}
-
--keep class java.util.function.ObjDoubleConsumer {
-
- public abstract void accept(java.lang.Object, double);
-
-
-}
-
--keep class java.util.function.ObjIntConsumer {
-
- public abstract void accept(java.lang.Object, int);
-
-
-}
-
--keep class java.util.function.ObjLongConsumer {
-
- public abstract void accept(java.lang.Object, long);
-
-
-}
-
--keep class java.util.function.Predicate {
-
- public java.util.function.Predicate and(java.util.function.Predicate);
- public static java.util.function.Predicate isEqual(java.lang.Object);
- public java.util.function.Predicate negate();
- public java.util.function.Predicate or(java.util.function.Predicate);
- public abstract boolean test(java.lang.Object);
-
-
-}
-
--keep class java.util.function.Supplier {
-
- public abstract java.lang.Object get();
-
-
-}
-
--keep class java.util.function.ToDoubleFunction {
-
- public abstract double applyAsDouble(java.lang.Object);
-
-
-}
-
--keep class java.util.function.ToIntFunction {
-
- public abstract int applyAsInt(java.lang.Object);
-
-
-}
-
--keep class java.util.function.ToLongFunction {
-
- public abstract long applyAsLong(java.lang.Object);
-
-
-}
-
--keep class java.util.function.UnaryOperator {
-
- public static java.util.function.UnaryOperator identity();
-
-
-}
-
--keep class java.util.stream.BaseStream {
-
- public abstract void close();
- public abstract boolean isParallel();
- public abstract java.util.Iterator iterator();
- public abstract java.util.stream.BaseStream onClose(java.lang.Runnable);
- public abstract java.util.stream.BaseStream parallel();
- public abstract java.util.stream.BaseStream sequential();
- public abstract java.util.Spliterator spliterator();
- public abstract java.util.stream.BaseStream unordered();
-
-
-}
-
--keep class java.util.stream.Collector {
-
- public abstract java.util.function.BiConsumer accumulator();
- public abstract java.util.Set characteristics();
- public abstract java.util.function.BinaryOperator combiner();
- public abstract java.util.function.Function finisher();
- public static java.util.stream.Collector of(java.util.function.Supplier, java.util.function.BiConsumer, java.util.function.BinaryOperator, java.util.stream.Collector$Characteristics[]);
- public static java.util.stream.Collector of(java.util.function.Supplier, java.util.function.BiConsumer, java.util.function.BinaryOperator, java.util.function.Function, java.util.stream.Collector$Characteristics[]);
- public abstract java.util.function.Supplier supplier();
-
-
-}
-
--keep class java.util.stream.Collector$Characteristics {
-
- public static java.util.stream.Collector$Characteristics valueOf(java.lang.String);
- public static java.util.stream.Collector$Characteristics[] values();
-
- public static java.util.stream.Collector$Characteristics CONCURRENT;
- public static java.util.stream.Collector$Characteristics IDENTITY_FINISH;
- public static java.util.stream.Collector$Characteristics UNORDERED;
-
-}
-
--keep class java.util.stream.DoubleStream {
-
- public abstract boolean allMatch(java.util.function.DoublePredicate);
- public abstract boolean anyMatch(java.util.function.DoublePredicate);
- public abstract java.util.OptionalDouble average();
- public abstract java.util.stream.Stream boxed();
- public static java.util.stream.DoubleStream$Builder builder();
- public abstract java.lang.Object collect(java.util.function.Supplier, java.util.function.ObjDoubleConsumer, java.util.function.BiConsumer);
- public static java.util.stream.DoubleStream concat(java.util.stream.DoubleStream, java.util.stream.DoubleStream);
- public abstract long count();
- public abstract java.util.stream.DoubleStream distinct();
- public static java.util.stream.DoubleStream empty();
- public abstract java.util.stream.DoubleStream filter(java.util.function.DoublePredicate);
- public abstract java.util.OptionalDouble findAny();
- public abstract java.util.OptionalDouble findFirst();
- public abstract java.util.stream.DoubleStream flatMap(java.util.function.DoubleFunction);
- public abstract void forEach(java.util.function.DoubleConsumer);
- public abstract void forEachOrdered(java.util.function.DoubleConsumer);
- public static java.util.stream.DoubleStream generate(java.util.function.DoubleSupplier);
- public static java.util.stream.DoubleStream iterate(double, java.util.function.DoubleUnaryOperator);
- public abstract java.util.PrimitiveIterator$OfDouble iterator();
- public java.util.Iterator iterator();
- public abstract java.util.stream.DoubleStream limit(long);
- public abstract java.util.stream.DoubleStream map(java.util.function.DoubleUnaryOperator);
- public abstract java.util.stream.IntStream mapToInt(java.util.function.DoubleToIntFunction);
- public abstract java.util.stream.LongStream mapToLong(java.util.function.DoubleToLongFunction);
- public abstract java.util.stream.Stream mapToObj(java.util.function.DoubleFunction);
- public abstract java.util.OptionalDouble max();
- public abstract java.util.OptionalDouble min();
- public abstract boolean noneMatch(java.util.function.DoublePredicate);
- public static java.util.stream.DoubleStream of(double);
- public static java.util.stream.DoubleStream of(double[]);
- public abstract java.util.stream.DoubleStream parallel();
- public java.util.stream.BaseStream parallel();
- public abstract java.util.stream.DoubleStream peek(java.util.function.DoubleConsumer);
- public abstract double reduce(double, java.util.function.DoubleBinaryOperator);
- public abstract java.util.OptionalDouble reduce(java.util.function.DoubleBinaryOperator);
- public abstract java.util.stream.DoubleStream sequential();
- public java.util.stream.BaseStream sequential();
- public abstract java.util.stream.DoubleStream skip(long);
- public abstract java.util.stream.DoubleStream sorted();
- public abstract java.util.Spliterator$OfDouble spliterator();
- public java.util.Spliterator spliterator();
- public abstract double sum();
- public abstract java.util.DoubleSummaryStatistics summaryStatistics();
- public abstract double[] toArray();
-
-
-}
-
--keep class java.util.stream.DoubleStream$Builder {
-
- public abstract void accept(double);
- public java.util.stream.DoubleStream$Builder add(double);
- public abstract java.util.stream.DoubleStream build();
-
-
-}
-
--keep class java.util.stream.IntStream {
-
- public abstract boolean allMatch(java.util.function.IntPredicate);
- public abstract boolean anyMatch(java.util.function.IntPredicate);
- public abstract java.util.stream.DoubleStream asDoubleStream();
- public abstract java.util.stream.LongStream asLongStream();
- public abstract java.util.OptionalDouble average();
- public abstract java.util.stream.Stream boxed();
- public static java.util.stream.IntStream$Builder builder();
- public abstract java.lang.Object collect(java.util.function.Supplier, java.util.function.ObjIntConsumer, java.util.function.BiConsumer);
- public static java.util.stream.IntStream concat(java.util.stream.IntStream, java.util.stream.IntStream);
- public abstract long count();
- public abstract java.util.stream.IntStream distinct();
- public static java.util.stream.IntStream empty();
- public abstract java.util.stream.IntStream filter(java.util.function.IntPredicate);
- public abstract java.util.OptionalInt findAny();
- public abstract java.util.OptionalInt findFirst();
- public abstract java.util.stream.IntStream flatMap(java.util.function.IntFunction);
- public abstract void forEach(java.util.function.IntConsumer);
- public abstract void forEachOrdered(java.util.function.IntConsumer);
- public static java.util.stream.IntStream generate(java.util.function.IntSupplier);
- public static java.util.stream.IntStream iterate(int, java.util.function.IntUnaryOperator);
- public abstract java.util.PrimitiveIterator$OfInt iterator();
- public java.util.Iterator iterator();
- public abstract java.util.stream.IntStream limit(long);
- public abstract java.util.stream.IntStream map(java.util.function.IntUnaryOperator);
- public abstract java.util.stream.DoubleStream mapToDouble(java.util.function.IntToDoubleFunction);
- public abstract java.util.stream.LongStream mapToLong(java.util.function.IntToLongFunction);
- public abstract java.util.stream.Stream mapToObj(java.util.function.IntFunction);
- public abstract java.util.OptionalInt max();
- public abstract java.util.OptionalInt min();
- public abstract boolean noneMatch(java.util.function.IntPredicate);
- public static java.util.stream.IntStream of(int);
- public static java.util.stream.IntStream of(int[]);
- public abstract java.util.stream.IntStream parallel();
- public java.util.stream.BaseStream parallel();
- public abstract java.util.stream.IntStream peek(java.util.function.IntConsumer);
- public static java.util.stream.IntStream range(int, int);
- public static java.util.stream.IntStream rangeClosed(int, int);
- public abstract int reduce(int, java.util.function.IntBinaryOperator);
- public abstract java.util.OptionalInt reduce(java.util.function.IntBinaryOperator);
- public abstract java.util.stream.IntStream sequential();
- public java.util.stream.BaseStream sequential();
- public abstract java.util.stream.IntStream skip(long);
- public abstract java.util.stream.IntStream sorted();
- public abstract java.util.Spliterator$OfInt spliterator();
- public java.util.Spliterator spliterator();
- public abstract int sum();
- public abstract java.util.IntSummaryStatistics summaryStatistics();
- public abstract int[] toArray();
-
-
-}
-
--keep class java.util.stream.IntStream$Builder {
-
- public abstract void accept(int);
- public java.util.stream.IntStream$Builder add(int);
- public abstract java.util.stream.IntStream build();
-
-
-}
-
--keep class java.util.stream.LongStream {
-
- public abstract boolean allMatch(java.util.function.LongPredicate);
- public abstract boolean anyMatch(java.util.function.LongPredicate);
- public abstract java.util.stream.DoubleStream asDoubleStream();
- public abstract java.util.OptionalDouble average();
- public abstract java.util.stream.Stream boxed();
- public static java.util.stream.LongStream$Builder builder();
- public abstract java.lang.Object collect(java.util.function.Supplier, java.util.function.ObjLongConsumer, java.util.function.BiConsumer);
- public static java.util.stream.LongStream concat(java.util.stream.LongStream, java.util.stream.LongStream);
- public abstract long count();
- public abstract java.util.stream.LongStream distinct();
- public static java.util.stream.LongStream empty();
- public abstract java.util.stream.LongStream filter(java.util.function.LongPredicate);
- public abstract java.util.OptionalLong findAny();
- public abstract java.util.OptionalLong findFirst();
- public abstract java.util.stream.LongStream flatMap(java.util.function.LongFunction);
- public abstract void forEach(java.util.function.LongConsumer);
- public abstract void forEachOrdered(java.util.function.LongConsumer);
- public static java.util.stream.LongStream generate(java.util.function.LongSupplier);
- public static java.util.stream.LongStream iterate(long, java.util.function.LongUnaryOperator);
- public abstract java.util.PrimitiveIterator$OfLong iterator();
- public java.util.Iterator iterator();
- public abstract java.util.stream.LongStream limit(long);
- public abstract java.util.stream.LongStream map(java.util.function.LongUnaryOperator);
- public abstract java.util.stream.DoubleStream mapToDouble(java.util.function.LongToDoubleFunction);
- public abstract java.util.stream.IntStream mapToInt(java.util.function.LongToIntFunction);
- public abstract java.util.stream.Stream mapToObj(java.util.function.LongFunction);
- public abstract java.util.OptionalLong max();
- public abstract java.util.OptionalLong min();
- public abstract boolean noneMatch(java.util.function.LongPredicate);
- public static java.util.stream.LongStream of(long);
- public static java.util.stream.LongStream of(long[]);
- public abstract java.util.stream.LongStream parallel();
- public java.util.stream.BaseStream parallel();
- public abstract java.util.stream.LongStream peek(java.util.function.LongConsumer);
- public static java.util.stream.LongStream range(long, long);
- public static java.util.stream.LongStream rangeClosed(long, long);
- public abstract long reduce(long, java.util.function.LongBinaryOperator);
- public abstract java.util.OptionalLong reduce(java.util.function.LongBinaryOperator);
- public abstract java.util.stream.LongStream sequential();
- public java.util.stream.BaseStream sequential();
- public abstract java.util.stream.LongStream skip(long);
- public abstract java.util.stream.LongStream sorted();
- public abstract java.util.Spliterator$OfLong spliterator();
- public java.util.Spliterator spliterator();
- public abstract long sum();
- public abstract java.util.LongSummaryStatistics summaryStatistics();
- public abstract long[] toArray();
-
-
-}
-
--keep class java.util.stream.LongStream$Builder {
-
- public abstract void accept(long);
- public java.util.stream.LongStream$Builder add(long);
- public abstract java.util.stream.LongStream build();
-
-
-}
-
--keep class java.util.stream.Stream {
-
- public abstract boolean allMatch(java.util.function.Predicate);
- public abstract boolean anyMatch(java.util.function.Predicate);
- public static java.util.stream.Stream$Builder builder();
- public abstract java.lang.Object collect(java.util.function.Supplier, java.util.function.BiConsumer, java.util.function.BiConsumer);
- public abstract java.lang.Object collect(java.util.stream.Collector);
- public static java.util.stream.Stream concat(java.util.stream.Stream, java.util.stream.Stream);
- public abstract long count();
- public abstract java.util.stream.Stream distinct();
- public static java.util.stream.Stream empty();
- public abstract java.util.stream.Stream filter(java.util.function.Predicate);
- public abstract java.util.Optional findAny();
- public abstract java.util.Optional findFirst();
- public abstract java.util.stream.Stream flatMap(java.util.function.Function);
- public abstract java.util.stream.DoubleStream flatMapToDouble(java.util.function.Function);
- public abstract java.util.stream.IntStream flatMapToInt(java.util.function.Function);
- public abstract java.util.stream.LongStream flatMapToLong(java.util.function.Function);
- public abstract void forEach(java.util.function.Consumer);
- public abstract void forEachOrdered(java.util.function.Consumer);
- public static java.util.stream.Stream generate(java.util.function.Supplier);
- public static java.util.stream.Stream iterate(java.lang.Object, java.util.function.UnaryOperator);
- public abstract java.util.stream.Stream limit(long);
- public abstract java.util.stream.Stream map(java.util.function.Function);
- public abstract java.util.stream.DoubleStream mapToDouble(java.util.function.ToDoubleFunction);
- public abstract java.util.stream.IntStream mapToInt(java.util.function.ToIntFunction);
- public abstract java.util.stream.LongStream mapToLong(java.util.function.ToLongFunction);
- public abstract java.util.Optional max(java.util.Comparator);
- public abstract java.util.Optional min(java.util.Comparator);
- public abstract boolean noneMatch(java.util.function.Predicate);
- public static java.util.stream.Stream of(java.lang.Object);
- public static java.util.stream.Stream of(java.lang.Object[]);
- public abstract java.util.stream.Stream peek(java.util.function.Consumer);
- public abstract java.lang.Object reduce(java.lang.Object, java.util.function.BinaryOperator);
- public abstract java.util.Optional reduce(java.util.function.BinaryOperator);
- public abstract java.lang.Object reduce(java.lang.Object, java.util.function.BiFunction, java.util.function.BinaryOperator);
- public abstract java.util.stream.Stream skip(long);
- public abstract java.util.stream.Stream sorted();
- public abstract java.util.stream.Stream sorted(java.util.Comparator);
- public abstract java.lang.Object[] toArray();
- public abstract java.lang.Object[] toArray(java.util.function.IntFunction);
-
-
-}
-
--keep class java.util.stream.Stream$Builder {
-
- public abstract void accept(java.lang.Object);
- public java.util.stream.Stream$Builder add(java.lang.Object);
- public abstract java.util.stream.Stream build();
-
-
-}
-
--keep class javax.microedition.khronos.opengles.GL {
-
-
-
-}
-
--keep class javax.security.auth.Subject {
- <init>();
- <init>(boolean, java.util.Set, java.util.Set, java.util.Set);
-
- public static java.lang.Object doAs(javax.security.auth.Subject, java.security.PrivilegedAction);
- public static java.lang.Object doAs(javax.security.auth.Subject, java.security.PrivilegedExceptionAction);
- public static java.lang.Object doAsPrivileged(javax.security.auth.Subject, java.security.PrivilegedAction, java.security.AccessControlContext);
- public static java.lang.Object doAsPrivileged(javax.security.auth.Subject, java.security.PrivilegedExceptionAction, java.security.AccessControlContext);
- public boolean equals(java.lang.Object);
- public java.util.Set getPrincipals();
- public java.util.Set getPrincipals(java.lang.Class);
- public java.util.Set getPrivateCredentials();
- public java.util.Set getPrivateCredentials(java.lang.Class);
- public java.util.Set getPublicCredentials();
- public java.util.Set getPublicCredentials(java.lang.Class);
- public static javax.security.auth.Subject getSubject(java.security.AccessControlContext);
- public int hashCode();
- public boolean isReadOnly();
- public void setReadOnly();
- public java.lang.String toString();
-
-
-}
-
--keep class libcore.util.NativeAllocationRegistry {
- <init>(java.lang.ClassLoader, long, long);
-
- public static void applyFreeFunction(long, long);
- public java.lang.Runnable registerNativeAllocation(java.lang.Object, long);
- public java.lang.Runnable registerNativeAllocation(java.lang.Object, libcore.util.NativeAllocationRegistry$Allocator);
-
-
-}
-
--keep class libcore.util.NativeAllocationRegistry$Allocator {
-
- public abstract long allocate();
-
-
-}
-
--keep class org.xmlpull.v1.XmlPullParser {
-
- public abstract void defineEntityReplacementText(java.lang.String, java.lang.String);
- public abstract int getAttributeCount();
- public abstract java.lang.String getAttributeName(int);
- public abstract java.lang.String getAttributeNamespace(int);
- public abstract java.lang.String getAttributePrefix(int);
- public abstract java.lang.String getAttributeType(int);
- public abstract java.lang.String getAttributeValue(int);
- public abstract java.lang.String getAttributeValue(java.lang.String, java.lang.String);
- public abstract int getColumnNumber();
- public abstract int getDepth();
- public abstract int getEventType();
- public abstract boolean getFeature(java.lang.String);
- public abstract java.lang.String getInputEncoding();
- public abstract int getLineNumber();
- public abstract java.lang.String getName();
- public abstract java.lang.String getNamespace(java.lang.String);
- public abstract java.lang.String getNamespace();
- public abstract int getNamespaceCount(int);
- public abstract java.lang.String getNamespacePrefix(int);
- public abstract java.lang.String getNamespaceUri(int);
- public abstract java.lang.String getPositionDescription();
- public abstract java.lang.String getPrefix();
- public abstract java.lang.Object getProperty(java.lang.String);
- public abstract java.lang.String getText();
- public abstract char[] getTextCharacters(int[]);
- public abstract boolean isAttributeDefault(int);
- public abstract boolean isEmptyElementTag();
- public abstract boolean isWhitespace();
- public abstract int next();
- public abstract int nextTag();
- public abstract java.lang.String nextText();
- public abstract int nextToken();
- public abstract void require(int, java.lang.String, java.lang.String);
- public abstract void setFeature(java.lang.String, boolean);
- public abstract void setInput(java.io.Reader);
- public abstract void setInput(java.io.InputStream, java.lang.String);
- public abstract void setProperty(java.lang.String, java.lang.Object);
-
-
- public static int CDSECT;
- public static int COMMENT;
- public static int DOCDECL;
- public static int END_DOCUMENT;
- public static int END_TAG;
- public static int ENTITY_REF;
- public static java.lang.String FEATURE_PROCESS_DOCDECL;
- public static java.lang.String FEATURE_PROCESS_NAMESPACES;
- public static java.lang.String FEATURE_REPORT_NAMESPACE_ATTRIBUTES;
- public static java.lang.String FEATURE_VALIDATION;
- public static int IGNORABLE_WHITESPACE;
- public static java.lang.String NO_NAMESPACE;
- public static int PROCESSING_INSTRUCTION;
- public static int START_DOCUMENT;
- public static int START_TAG;
- public static int TEXT;
- public static java.lang.String[] TYPES;
-}
-
--keep class org.xmlpull.v1.XmlPullParserException {
- <init>(java.lang.String);
- <init>(java.lang.String, org.xmlpull.v1.XmlPullParser, java.lang.Throwable);
-
- public int getColumnNumber();
- public java.lang.Throwable getDetail();
- public int getLineNumber();
- public void printStackTrace();
-
-
- protected int column;
- protected java.lang.Throwable detail;
- protected int row;
-}
-
--keep class org.xmlpull.v1.XmlSerializer {
-
- public abstract org.xmlpull.v1.XmlSerializer attribute(java.lang.String, java.lang.String, java.lang.String);
- public abstract void cdsect(java.lang.String);
- public abstract void comment(java.lang.String);
- public abstract void docdecl(java.lang.String);
- public abstract void endDocument();
- public abstract org.xmlpull.v1.XmlSerializer endTag(java.lang.String, java.lang.String);
- public abstract void entityRef(java.lang.String);
- public abstract void flush();
- public abstract int getDepth();
- public abstract boolean getFeature(java.lang.String);
- public abstract java.lang.String getName();
- public abstract java.lang.String getNamespace();
- public abstract java.lang.String getPrefix(java.lang.String, boolean);
- public abstract java.lang.Object getProperty(java.lang.String);
- public abstract void ignorableWhitespace(java.lang.String);
- public abstract void processingInstruction(java.lang.String);
- public abstract void setFeature(java.lang.String, boolean);
- public abstract void setOutput(java.io.OutputStream, java.lang.String);
- public abstract void setOutput(java.io.Writer);
- public abstract void setPrefix(java.lang.String, java.lang.String);
- public abstract void setProperty(java.lang.String, java.lang.Object);
- public abstract void startDocument(java.lang.String, java.lang.Boolean);
- public abstract org.xmlpull.v1.XmlSerializer startTag(java.lang.String, java.lang.String);
- public abstract org.xmlpull.v1.XmlSerializer text(java.lang.String);
- public abstract org.xmlpull.v1.XmlSerializer text(char[], int, int);
-
-
-}
-
--keep class sun.nio.ch.Interruptible {
-
- public abstract void interrupt(java.lang.Thread);
-
-
-}
-
diff --git a/car-support-lib/res/values/strings.xml b/car-support-lib/res/values/strings.xml
deleted file mode 100644
index ab697e1..0000000
--- a/car-support-lib/res/values/strings.xml
+++ /dev/null
@@ -1,18 +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.
--->
-<resources>
- <string name="resource_warning">Please do not check in any ui resources here.</string>
-</resources>
diff --git a/car-support-lib/src/android/support/car/Car.java b/car-support-lib/src/android/support/car/Car.java
deleted file mode 100644
index c12b13c..0000000
--- a/car-support-lib/src/android/support/car/Car.java
+++ /dev/null
@@ -1,475 +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.support.car;
-
-import android.content.Context;
-import android.os.Handler;
-import android.os.Looper;
-import android.support.car.content.pm.CarPackageManager;
-import android.support.car.hardware.CarSensorManager;
-import android.support.car.media.CarAudioManager;
-import android.support.car.navigation.CarNavigationStatusManager;
-import android.util.Log;
-
-import androidx.annotation.IntDef;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Top-level car API that provides access to all car services and data available in the platform.
- * <p/>
- * Use one of the createCar methods to create a new instance of the Car api. The
- * {@link CarConnectionCallback} will respond with an {@link CarConnectionCallback#onConnected(Car)}
- * or {@link CarConnectionCallback#onDisconnected(Car)} message. Nothing can be done with the
- * car until onConnected is called. When the car disconnects then reconnects you may still use
- * the Car object but any manages retrieved from it should be considered invalid and will need to
- * be retried. Also, you must call {@link #disconnect} before an instance of Car goes out of scope
- * to avoid leaking resources.
- *
- * <p/>
- * Once connected, {@link #getCarManager(String)} or {@link #getCarManager(Class)} can be used to
- * retrieve a manager. This is patterned after how one would retrieve a service from
- * {@link Context#getSystemService(String)} or {@link Context#getSystemService(Class)}. Once
- * again if the car is disconnected you'll want to get new versions of these managers.
- */
-public class Car {
-
- private static final String TAG = "CAR.SUPPORT.LIB.CAR";
- /**
- * Service name for {@link CarSensorManager}, to be used in {@link #getCarManager(String)}.
- */
- public static final String SENSOR_SERVICE = "sensor";
-
- /**
- * Service name for {@link CarInfoManager}, to be used in {@link #getCarManager(String)}.
- */
- public static final String INFO_SERVICE = "info";
-
- /**
- * Service name for {@link CarAppFocusManager}.
- */
- public static final String APP_FOCUS_SERVICE = "app_focus";
-
- /**
- * Service name for {@link CarPackageManager}.
- * @hide
- */
- public static final String PACKAGE_SERVICE = "package";
-
- /**
- * Service name for {@link CarAudioManager}.
- */
- public static final String AUDIO_SERVICE = "audio";
- /**
- * Service name for {@link CarNavigationStatusManager}.
- * @hide
- */
- public static final String CAR_NAVIGATION_SERVICE = "car_navigation_service";
- /**
- * Service name for {@link CarNavigationStatusManager}.
- */
- public static final String NAVIGATION_STATUS_SERVICE = "car_navigation_service";
-
- // TODO(jthol) move into a more robust registry implementation
- private static final Map<Class, String> CLASS_TO_SERVICE_NAME;
- static{
- Map<Class, String> mapping = new HashMap<>();
- mapping.put(CarSensorManager.class, SENSOR_SERVICE);
- mapping.put(CarInfoManager.class, INFO_SERVICE);
- mapping.put(CarAppFocusManager.class, APP_FOCUS_SERVICE);
- mapping.put(CarPackageManager.class, PACKAGE_SERVICE);
- mapping.put(CarAudioManager.class, AUDIO_SERVICE);
- mapping.put(CarNavigationStatusManager.class, NAVIGATION_STATUS_SERVICE);
-
- CLASS_TO_SERVICE_NAME = Collections.unmodifiableMap(mapping);
- }
-
-
- /**
- * Type of car connection: car emulator, no physical connection.
- * @hide
- */
- public static final int CONNECTION_TYPE_EMULATOR = 0;
- /**
- * Type of car connection: connected to a car via USB.
- * @hide
- */
- public static final int CONNECTION_TYPE_USB = 1;
- /**
- * Type of car connection: connected to a car via Wi-Fi.
- * @hide
- */
- public static final int CONNECTION_TYPE_WIFI = 2;
- /**
- * Type of car connection: on-device car emulator, for development (such as Local Head Unit).
- * @hide
- */
- public static final int CONNECTION_TYPE_ON_DEVICE_EMULATOR = 3;
- /**
- * Type of car connection: car emulator, connected over ADB (such as Desktop Head Unit).
- * @hide
- */
- public static final int CONNECTION_TYPE_ADB_EMULATOR = 4;
- /**
- * Type of car connection: platform runs directly in car.
- * @hide
- */
- public static final int CONNECTION_TYPE_EMBEDDED = 5;
-
- /**
- * Unknown type (the support lib is likely out-of-date).
- * @hide
- */
- public static final int CONNECTION_TYPE_UNKNOWN = -1;
-
- private static final Set<Integer> CONNECTION_TYPES = new HashSet<>();
- static {
- CONNECTION_TYPES.add(CONNECTION_TYPE_ADB_EMULATOR);
- CONNECTION_TYPES.add(CONNECTION_TYPE_USB);
- CONNECTION_TYPES.add(CONNECTION_TYPE_WIFI);
- CONNECTION_TYPES.add(CONNECTION_TYPE_ON_DEVICE_EMULATOR);
- CONNECTION_TYPES.add(CONNECTION_TYPE_ADB_EMULATOR);
- CONNECTION_TYPES.add(CONNECTION_TYPE_EMBEDDED);
- }
-
- /** @hide */
- @IntDef({CONNECTION_TYPE_EMULATOR, CONNECTION_TYPE_USB, CONNECTION_TYPE_WIFI,
- CONNECTION_TYPE_ON_DEVICE_EMULATOR, CONNECTION_TYPE_ADB_EMULATOR,
- CONNECTION_TYPE_EMBEDDED, CONNECTION_TYPE_UNKNOWN})
- @Retention(RetentionPolicy.SOURCE)
- public @interface ConnectionType {
- }
-
- /**
- * Permission necessary to access car mileage information.
- * @hide
- */
- public static final String PERMISSION_MILEAGE = "android.car.permission.CAR_MILEAGE";
- /**
- * Permission necessary to access car's energy information.
- * @hide
- */
- public static final String PERMISSION_ENERGY = "android.car.permission.CAR_ENERGY";
- /**
- * Permission necessary to access car speed.
- * @hide
- */
- public static final String PERMISSION_SPEED = "android.car.permission.CAR_SPEED";
- /**
- * Permission necessary to access car dynamics state.
- * @hide
- */
- public static final String PERMISSION_VEHICLE_DYNAMICS_STATE =
- "android.car.permission.VEHICLE_DYNAMICS_STATE";
- /**
- * Permission necessary to access a car-specific communication channel.
- */
- public static final String PERMISSION_VENDOR_EXTENSION =
- "android.car.permission.CAR_VENDOR_EXTENSION";
- /**
- * Permission necessary to use {@link android.car.navigation.CarNavigationStatusManager}.
- */
- public static final String PERMISSION_CAR_NAVIGATION_MANAGER =
- "android.car.permission.PERMISSION_CAR_NAVIGATION_MANAGER";
-
-
- /**
- * PackageManager.FEATURE_AUTOMOTIVE from M. But redefine here to support L.
- */
- private static final String FEATURE_AUTOMOTIVE = "android.hardware.type.automotive";
-
- /**
- * {@link CarServiceLoader} implementation for projected mode. Available only when the
- * projected client library is linked.
- */
- private static final String PROJECTED_CAR_SERVICE_LOADER =
- "com.google.android.apps.auto.sdk.service.CarServiceLoaderGms";
- /**
- * Permission necessary to change car audio volume through {@link CarAudioManager}.
- * @hide
- */
- public static final String PERMISSION_CAR_CONTROL_AUDIO_VOLUME =
- "android.car.permission.CAR_CONTROL_AUDIO_VOLUME";
-
- private final Context mContext;
- private final Handler mEventHandler;
- private static final int STATE_DISCONNECTED = 0;
- private static final int STATE_CONNECTING = 1;
- private static final int STATE_CONNECTED = 2;
- // @GuardedBy("this")
- private int mConnectionState;
-
- private final CarServiceLoader.CarConnectionCallbackProxy mCarConnectionCallbackProxy =
- new CarServiceLoader.CarConnectionCallbackProxy() {
- @Override
- public void onConnected() {
- synchronized (Car.this) {
- mConnectionState = STATE_CONNECTED;
- }
- mCarConnectionCallback.onConnected(Car.this);
- }
-
- @Override
- public void onDisconnected() {
- synchronized (Car.this) {
- if (mConnectionState == STATE_DISCONNECTED) {
- return;
- }
- tearDownCarManagers();
- mConnectionState = STATE_DISCONNECTED;
- }
- mCarConnectionCallback.onDisconnected(Car.this);
- }
- };
-
- private final CarConnectionCallback mCarConnectionCallback;
- private final Object mCarManagerLock = new Object();
- //@GuardedBy("mCarManagerLock")
- private final HashMap<String, CarManagerBase> mServiceMap = new HashMap<>();
- private final CarServiceLoader mCarServiceLoader;
-
-
- /**
- * A factory method that creates a Car instance with the given {@code Looper}.
- *
- * @param context The current app context.
- * @param carConnectionCallback Receives information when the Car Service is started and
- * stopped.
- * @param handler The handler on which the callback should execute, or null to execute on the
- * service's main thread. Note the service connection listener is always on the main
- * thread regardless of the handler given.
- * @return Car instance if system is in car environment; returns {@code null} otherwise.
- */
- public static Car createCar(Context context,
- CarConnectionCallback carConnectionCallback, @Nullable Handler handler) {
- try {
- return new Car(context, carConnectionCallback, handler);
- } catch (IllegalArgumentException e) {
- // Expected when Car Service loader is not available.
- Log.w(TAG, "Car failed to be created", e);
- }
- return null;
- }
-
- /**
- * A factory method that creates Car instance using the main thread {@link Handler}.
- *
- * @see #createCar(Context, CarConnectionCallback, Handler)
- */
- public static Car createCar(Context context,
- CarConnectionCallback carConnectionCallback) {
- return createCar(context, carConnectionCallback, null);
- }
-
- private Car(Context context, CarConnectionCallback carConnectionCallback,
- @Nullable Handler handler) {
- mContext = context;
- mCarConnectionCallback = carConnectionCallback;
- if (handler == null) {
- Looper looper = Looper.getMainLooper();
- handler = new Handler(looper);
- }
- mEventHandler = handler;
-
- if (mContext.getPackageManager().hasSystemFeature(FEATURE_AUTOMOTIVE)) {
- mCarServiceLoader =
- new CarServiceLoaderEmbedded(context, mCarConnectionCallbackProxy,
- mEventHandler);
- } else {
- mCarServiceLoader = loadCarServiceLoader(PROJECTED_CAR_SERVICE_LOADER, context,
- mCarConnectionCallbackProxy, mEventHandler);
- }
- }
-
- private CarServiceLoader loadCarServiceLoader(String carServiceLoaderClassName, Context context,
- CarServiceLoader.CarConnectionCallbackProxy carConnectionCallbackProxy,
- Handler eventHandler) throws IllegalArgumentException {
- Class<? extends CarServiceLoader> carServiceLoaderClass = null;
- try {
- carServiceLoaderClass =
- Class.forName(carServiceLoaderClassName).asSubclass(CarServiceLoader.class);
- } catch (ClassNotFoundException e) {
- throw new IllegalArgumentException(
- "Cannot find CarServiceLoader implementation:" + carServiceLoaderClassName, e);
- }
- Constructor<? extends CarServiceLoader> ctor;
- try {
- ctor = carServiceLoaderClass.getDeclaredConstructor(Context.class,
- CarServiceLoader.CarConnectionCallbackProxy.class, Handler.class);
- } catch (NoSuchMethodException e) {
- throw new IllegalArgumentException("Cannot construct CarServiceLoader, no constructor: "
- + carServiceLoaderClassName, e);
- }
- try {
- return ctor.newInstance(context, carConnectionCallbackProxy, eventHandler);
- } catch (InstantiationException | IllegalAccessException | IllegalArgumentException
- | InvocationTargetException e) {
- throw new IllegalArgumentException(
- "Cannot construct CarServiceLoader, constructor failed for "
- + carServiceLoaderClass.getName(), e);
- }
- }
-
- /**
- * Car constructor when CarServiceLoader is already available.
- *
- * @param serviceLoader must be non-null and connected or {@link CarNotConnectedException} will
- * be thrown.
- * @hide
- */
- public Car(@NonNull CarServiceLoader serviceLoader) throws CarNotConnectedException {
- if (!serviceLoader.isConnected()) {
- throw new CarNotConnectedException();
- }
- mCarServiceLoader = serviceLoader;
- mEventHandler = serviceLoader.getEventHandler();
- mContext = serviceLoader.getContext();
-
- mConnectionState = STATE_CONNECTED;
- mCarConnectionCallback = null;
- }
-
- /**
- * Connect to Car Service. Can be called while disconnected.
- *
- * @throws IllegalStateException if the car is connected or still trying to connect
- * from previous calls.
- */
- public void connect() throws IllegalStateException {
- synchronized (this) {
- if (mConnectionState != STATE_DISCONNECTED) {
- throw new IllegalStateException("already connected or connecting");
- }
- mConnectionState = STATE_CONNECTING;
- mCarServiceLoader.connect();
- }
- }
-
- /**
- * Disconnect from Car Service. Can be called while disconnected. After disconnect is
- * called, all Car*Managers from this instance become invalid, and {@link
- * Car#getCarManager(String)} returns a different instance if connected again.
- */
- public void disconnect() {
- synchronized (this) {
- tearDownCarManagers();
- mConnectionState = STATE_DISCONNECTED;
- mCarServiceLoader.disconnect();
- }
- }
-
- /**
- * @return Returns {@code true} if this object is connected to the service; {@code false}
- * otherwise.
- */
- public boolean isConnected() {
- synchronized (this) {
- return mConnectionState == STATE_CONNECTED;
- }
- }
-
- /**
- * @return Returns {@code true} if this object is still connecting to the service.
- */
- public boolean isConnecting() {
- synchronized (this) {
- return mConnectionState == STATE_CONNECTING;
- }
- }
-
- /**
- * Get a car-specific manager. This is modeled after {@link Context#getSystemService(String)}.
- * The returned {@link Object} should be type cast to the desired manager. For example,
- * to get the sensor service, use the following:
- * <pre>{@code CarSensorManager sensorManager =
- * (CarSensorManager) car.getCarManager(Car.SENSOR_SERVICE);}</pre>
- *
- * @param serviceName Name of service to create, for example {@link #SENSOR_SERVICE}.
- * @return The requested service manager or null if the service is not available.
- */
- public Object getCarManager(String serviceName)
- throws CarNotConnectedException {
- Object manager = null;
- synchronized (mCarManagerLock) {
- manager = mServiceMap.get(serviceName);
- if (manager == null) {
- manager = mCarServiceLoader.getCarManager(serviceName);
- }
- // do not store if it is not CarManagerBase. This can happen when system version
- // is retrieved from this call.
- if (manager != null && manager instanceof CarManagerBase) {
- mServiceMap.put(serviceName, (CarManagerBase) manager);
- }
- }
- return manager;
- }
-
- /**
- * Get a car-specific manager. This is modeled after {@link Context#getSystemService(Class)}.
- * The returned service will be type cast to the desired manager. For example,
- * to get the sensor service, use the following:
- * <pre>{@code CarSensorManager sensorManager = car.getCarManager(CarSensorManager.class);
- * }</pre>
- *
- * @param serviceClass Class: The class of the desired service. For
- * example {@link CarSensorManager}.
- * @return The service or null if the class is not a supported car service.
- */
- public <T> T getCarManager(Class<T> serviceClass) throws CarNotConnectedException {
- // TODO(jthol) port to a more robust registry implementation
- String serviceName = CLASS_TO_SERVICE_NAME.get(serviceClass);
- return (serviceName == null) ? null : (T) getCarManager(serviceName);
- }
-
- /**
- * Return the type of currently connected car. This should only be used for testing scenarios
- *
- * @return One of {@link #CONNECTION_TYPE_USB}, {@link #CONNECTION_TYPE_WIFI},
- * {@link #CONNECTION_TYPE_EMBEDDED}, {@link #CONNECTION_TYPE_ON_DEVICE_EMULATOR},
- * {@link #CONNECTION_TYPE_ADB_EMULATOR},
- * {@link #CONNECTION_TYPE_UNKNOWN}.
- * @throws CarNotConnectedException if the connection to the car service has been lost.
- * @hide
- */
- @ConnectionType
- public int getCarConnectionType() throws CarNotConnectedException {
- int carConnectionType = mCarServiceLoader.getCarConnectionType();
- if (!CONNECTION_TYPES.contains(carConnectionType)){
- return CONNECTION_TYPE_UNKNOWN;
- }
- return carConnectionType;
- }
-
- private void tearDownCarManagers() {
- synchronized (mCarManagerLock) {
- for (CarManagerBase manager : mServiceMap.values()) {
- manager.onCarDisconnected();
- }
- mServiceMap.clear();
- }
- }
-}
diff --git a/car-support-lib/src/android/support/car/CarAppFocusManager.java b/car-support-lib/src/android/support/car/CarAppFocusManager.java
deleted file mode 100644
index 395ff61..0000000
--- a/car-support-lib/src/android/support/car/CarAppFocusManager.java
+++ /dev/null
@@ -1,198 +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.support.car;
-
-import androidx.annotation.IntDef;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * Enables applications to set and listen for the current application focus (such as active
- * navigation). Typically, only one such application should be running at a time. When another
- * application gets ownership of a given APP_FOCUS_TYPE_*, the old app should stop using the
- * feature represented by the focus type.
- */
-public abstract class CarAppFocusManager implements CarManagerBase {
- /**
- * Receives notifications when app focus changes.
- */
- public interface OnAppFocusChangedListener {
- /**
- * Indicates the application focus has changed. The {@link CarAppFocusManager} instance
- * causing the change does not get this notification.
- * @param manager the {@link CarAppFocusManager} this listener is attached to. Useful if
- * the app wished to unregister the listener.
- * @param appType application type for which status changed
- * @param active returns {@code true} if active
- */
- void onAppFocusChanged(CarAppFocusManager manager, @AppFocusType int appType,
- boolean active);
- }
-
- /**
- * Receives notifications when the application focus ownership changes.
- */
- public interface OnAppFocusOwnershipCallback {
- /**
- * Lost ownership for the focus, which occurs when another app has set the focus.
- * The app losing focus should stop the action associated with the focus.
- * For example, a navigation app running active navigation should stop navigation
- * upon getting this for {@link CarAppFocusManager#APP_FOCUS_TYPE_NAVIGATION}.
- * @param manager the {@link CarAppFocusManager} this callback is attached to. Useful if
- * the app wishes to unregister the callback.
- * @param appType
- */
- void onAppFocusOwnershipLost(CarAppFocusManager manager, @AppFocusType int appType);
-
- /**
- * Granted ownership for the focus, which happens after app has requested the focus.
- * The app getting focus can start the action associated with the focus.
- * For example, navigation app can start navigation
- * upon getting this for {@link CarAppFocusManager#APP_FOCUS_TYPE_NAVIGATION}.
- * @param manager the {@link CarAppFocusManager} this callback is attached to. Useful if
- * the app wishes to unregister the callback.
- * @param appType
- */
- void onAppFocusOwnershipGranted(CarAppFocusManager manager, @AppFocusType int appType);
- }
-
- /**
- * Represents navigation focus.
- * <p/>
- * When a program loses navigation focus they should no longer send navigation data to the
- * instrument cluster via the
- * {@link android.support.car.navigation.CarNavigationStatusManager}. Furthermore they
- * should stop sending audio updates and any notifications regarding navigation.
- * Essentially, these apps should stop all navigation activities as this means another app is
- * navigating.
- */
- public static final int APP_FOCUS_TYPE_NAVIGATION = 1;
- /**
- * Represents voice command focus.
- * @hide
- */
- public static final int APP_FOCUS_TYPE_VOICE_COMMAND = 2;
- /**
- * Update this after adding a new app type.
- * @hide
- */
- public static final int APP_FOCUS_TYPE_MAX = 2;
-
- /** @hide */
- @IntDef({
- APP_FOCUS_TYPE_NAVIGATION,
- APP_FOCUS_TYPE_VOICE_COMMAND
- })
- @Retention(RetentionPolicy.SOURCE)
- public @interface AppFocusType {}
-
- /**
- * A failed focus change request.
- */
- public static final int APP_FOCUS_REQUEST_FAILED = 0;
- /**
- * A successful focus change request.
- */
- public static final int APP_FOCUS_REQUEST_SUCCEEDED = 1;
-
- /** @hide */
- @IntDef({
- APP_FOCUS_REQUEST_FAILED,
- APP_FOCUS_REQUEST_SUCCEEDED
- })
- @Retention(RetentionPolicy.SOURCE)
- public @interface AppFocusRequestResult {}
-
- /**
- * Register listener to monitor app focus changes.
- * Multiple listeners can be registered for a single focus and the same listener can be used
- * for multiple focuses.
- * @param listener Listener to register for focus events.
- * @param appType Application type to get notification for.
- * @throws CarNotConnectedException if the connection to the car service has been lost.
- */
- public abstract void addFocusListener(OnAppFocusChangedListener listener,
- @AppFocusType int appType) throws CarNotConnectedException;
-
- /**
- * Unregister listener for app type and stop listening to focus change events.
- * @param listener Listener to unregister from focus events.
- * @param appType Application type to get notification for.
- */
- public abstract void removeFocusListener(OnAppFocusChangedListener listener,
- @AppFocusType int appType);
-
- /**
- * Unregister listener for all app types and stop listening to focus change events.
- * @param listener Listener to unregister from focus events.
- */
- public abstract void removeFocusListener(OnAppFocusChangedListener listener);
-
- /**
- * Check if the current process owns the given focus.
- * @param appType Application type.
- * @param callback Callback that was used to request ownership.
- * @return Returns {@code true} if current callback owns focus for application type.
- * @throws CarNotConnectedException if the connection to the car service has been lost.
- */
- public abstract boolean isOwningFocus(@AppFocusType int appType,
- OnAppFocusOwnershipCallback callback) throws CarNotConnectedException;
-
- /**
- * Request application focus.
- * <p>
- * By requesting this, the app gains the focus for this appType
- * <p>
- * This call is asynchronous, focus may not be granted immediately.
- * {@link OnAppFocusOwnershipCallback#onAppFocusOwnershipGranted(CarAppFocusManager, int)} will
- * be sent to the app when focus is granted.
- * <p>
- * {@link OnAppFocusOwnershipCallback#onAppFocusOwnershipLost(CarAppFocusManager, int)}
- * will be sent to the app that currently holds focus.
- * The foreground app will have higher priority; other apps cannot
- * set the same focus while owner is in foreground.
- * <p>
- * The callback provided here is the identifier for the focus. Apps need to pass it into
- * other app focus methods such as {@link #isOwningFocus(int, OnAppFocusOwnershipCallback)}
- * or {@link #abandonAppFocus(OnAppFocusOwnershipCallback)}.
- *
- * @param appType Application type to request focus for.
- * @param ownershipCallback Ownership callback to request app focus for. Cannot be null.
- *
- * @return {@link #APP_FOCUS_REQUEST_FAILED} or {@link #APP_FOCUS_REQUEST_SUCCEEDED}
- * @throws SecurityException if owner cannot be changed.
- * @throws CarNotConnectedException if the connection to the car service has been lost.
- */
- public abstract int requestAppFocus(int appType,
- OnAppFocusOwnershipCallback ownershipCallback)
- throws SecurityException, CarNotConnectedException;
-
- /**
- * Abandon the given focus (mark it as inactive).
- * @param ownershipCallback Ownership callback to abandon app focus for. Cannot be null.
- * @param appType Application type to abandon focus for.
- */
- public abstract void abandonAppFocus(OnAppFocusOwnershipCallback ownershipCallback,
- @AppFocusType int appType);
-
- /**
- * Abandon all focuses (mark them as inactive).
- * @param ownershipCallback Ownership callback to abandon focus for. Cannot be null.
- */
- public abstract void abandonAppFocus(OnAppFocusOwnershipCallback ownershipCallback);
-}
diff --git a/car-support-lib/src/android/support/car/CarAppFocusManagerEmbedded.java b/car-support-lib/src/android/support/car/CarAppFocusManagerEmbedded.java
deleted file mode 100644
index e866f4b..0000000
--- a/car-support-lib/src/android/support/car/CarAppFocusManagerEmbedded.java
+++ /dev/null
@@ -1,201 +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.support.car;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Implementation of {@link CarAppFocusManager} for embedded.
- * @hide
- */
-public class CarAppFocusManagerEmbedded extends CarAppFocusManager {
-
- private final android.car.CarAppFocusManager mManager;
-
- private final Map<OnAppFocusChangedListener, OnAppFocusChangedListenerProxy>
- mChangeListeners = new HashMap<>();
- private final Map<OnAppFocusOwnershipCallback, OnAppFocusOwnershipCallbackProxy>
- mOwnershipCallbacks = new HashMap<>();
-
- /**
- * @hide
- */
- CarAppFocusManagerEmbedded(Object manager) {
- mManager = (android.car.CarAppFocusManager) manager;
- }
-
- @Override
- public void addFocusListener(OnAppFocusChangedListener listener, int appType)
- throws CarNotConnectedException {
- if (listener == null) {
- throw new IllegalArgumentException("null listener");
- }
- OnAppFocusChangedListenerProxy proxy;
- synchronized (this) {
- proxy = mChangeListeners.get(listener);
- if (proxy == null) {
- proxy = new OnAppFocusChangedListenerProxy(this, listener);
- mChangeListeners.put(listener, proxy);
- }
- }
- try {
- mManager.addFocusListener(proxy, appType);
- } catch (android.car.CarNotConnectedException e) {
- throw new CarNotConnectedException(e);
- }
- }
-
- @Override
- public void removeFocusListener(OnAppFocusChangedListener listener, int appType) {
- OnAppFocusChangedListenerProxy proxy;
- synchronized (this) {
- proxy = mChangeListeners.get(listener);
- if (proxy == null) {
- return;
- }
- }
- mManager.removeFocusListener(proxy, appType);
- }
-
- @Override
- public void removeFocusListener(OnAppFocusChangedListener listener) {
- OnAppFocusChangedListenerProxy proxy;
- synchronized (this) {
- proxy = mChangeListeners.remove(listener);
- if (proxy == null) {
- return;
- }
- }
- mManager.removeFocusListener(proxy);
- }
-
- @Override
- public boolean isOwningFocus(int appType, OnAppFocusOwnershipCallback listener)
- throws CarNotConnectedException {
- OnAppFocusOwnershipCallbackProxy proxy;
- synchronized (this) {
- proxy = mOwnershipCallbacks.get(listener);
- if (proxy == null) {
- return false;
- }
- }
- try {
- return mManager.isOwningFocus(proxy, appType);
- } catch (android.car.CarNotConnectedException e) {
- throw new CarNotConnectedException(e);
- }
- }
-
- @Override
- public int requestAppFocus(int appType, OnAppFocusOwnershipCallback ownershipCallback)
- throws IllegalStateException, SecurityException, CarNotConnectedException {
- if (ownershipCallback == null) {
- throw new IllegalArgumentException("null listener");
- }
- OnAppFocusOwnershipCallbackProxy proxy;
- synchronized (this) {
- proxy = mOwnershipCallbacks.get(ownershipCallback);
- if (proxy == null) {
- proxy = new OnAppFocusOwnershipCallbackProxy(this, ownershipCallback);
- mOwnershipCallbacks.put(ownershipCallback, proxy);
- }
- }
- try {
- return mManager.requestAppFocus(appType, proxy);
- } catch (android.car.CarNotConnectedException e) {
- throw new CarNotConnectedException(e);
- }
- }
-
- @Override
- public void abandonAppFocus(OnAppFocusOwnershipCallback ownershipCallback, int appType) {
- if (ownershipCallback == null) {
- throw new IllegalArgumentException("null listener");
- }
- OnAppFocusOwnershipCallbackProxy proxy;
- synchronized (this) {
- proxy = mOwnershipCallbacks.get(ownershipCallback);
- if (proxy == null) {
- return;
- }
- }
- mManager.abandonAppFocus(proxy, appType);
- }
-
- @Override
- public void abandonAppFocus(OnAppFocusOwnershipCallback ownershipCallback) {
- if (ownershipCallback == null) {
- throw new IllegalArgumentException("null listener");
- }
- OnAppFocusOwnershipCallbackProxy proxy;
- synchronized (this) {
- proxy = mOwnershipCallbacks.get(ownershipCallback);
- if (proxy == null) {
- return;
- }
- }
- mManager.abandonAppFocus(proxy);
- }
-
- @Override
- public void onCarDisconnected() {
- // nothing to do
- }
-
- private static class OnAppFocusChangedListenerProxy
- implements android.car.CarAppFocusManager.OnAppFocusChangedListener {
-
- private final OnAppFocusChangedListener mListener;
- private final CarAppFocusManager mManager;
-
- OnAppFocusChangedListenerProxy(CarAppFocusManager manager,
- OnAppFocusChangedListener listener) {
- mManager = manager;
- mListener = listener;
- }
-
- @Override
- public void onAppFocusChanged(int appType, boolean active) {
- mListener.onAppFocusChanged(mManager, appType, active);
- }
- }
-
- private static class OnAppFocusOwnershipCallbackProxy
- implements android.car.CarAppFocusManager.OnAppFocusOwnershipCallback {
-
- private final OnAppFocusOwnershipCallback mListener;
- private final CarAppFocusManager mManager;
-
-
- OnAppFocusOwnershipCallbackProxy(CarAppFocusManager manager,
- OnAppFocusOwnershipCallback listener) {
- mListener = listener;
- mManager = manager;
- }
-
- @Override
- public void onAppFocusOwnershipLost(int focusType) {
- mListener.onAppFocusOwnershipLost(mManager, focusType);
- }
-
- @Override
- public void onAppFocusOwnershipGranted(int focusType) {
- mListener.onAppFocusOwnershipGranted(mManager, focusType);
- }
- }
-}
diff --git a/car-support-lib/src/android/support/car/CarConnectionCallback.java b/car-support-lib/src/android/support/car/CarConnectionCallback.java
deleted file mode 100644
index f32f735..0000000
--- a/car-support-lib/src/android/support/car/CarConnectionCallback.java
+++ /dev/null
@@ -1,36 +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.support.car;
-
-/**
- * Listener for monitoring car connection status.
- * Callbacks are called from the looper specified when constructing {@link Car}.
- */
-public abstract class CarConnectionCallback {
- /**
- * Called when the Car has been connected. Does not guarantee the car is still connected
- * while this callback is running, so {@link CarNotConnectedException}s may still be
- * thrown from {@link Car} method calls.
- * @param car the car with which this callback is registered.
- */
- public abstract void onConnected(Car car);
- /**
- * Called when the Car has been disconnected.
- * @param car the car with which this callback is registered.
- */
- public abstract void onDisconnected(Car car);
-}
diff --git a/car-support-lib/src/android/support/car/CarInfoManager.java b/car-support-lib/src/android/support/car/CarInfoManager.java
deleted file mode 100644
index 7a29339..0000000
--- a/car-support-lib/src/android/support/car/CarInfoManager.java
+++ /dev/null
@@ -1,131 +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.support.car;
-
-import androidx.annotation.IntDef;
-import androidx.annotation.Nullable;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * Utility to retrieve various static information from car.
- */
-public abstract class CarInfoManager implements CarManagerBase {
-
- /** Location of the driver is unknown. */
- public static final int DRIVER_SIDE_UNKNOWN = 0;
- /** Location of the driver: left. */
- public static final int DRIVER_SIDE_LEFT = 1;
- /** Location of the driver: right. */
- public static final int DRIVER_SIDE_RIGHT = 2;
- /** Location of the driver: center. */
- public static final int DRIVER_SIDE_CENTER = 3;
-
- /** @hide */
- @IntDef({
- DRIVER_SIDE_UNKNOWN,
- DRIVER_SIDE_LEFT,
- DRIVER_SIDE_RIGHT,
- DRIVER_SIDE_CENTER
- })
- @Retention(RetentionPolicy.SOURCE)
- public @interface DriverSide {}
-
- /**
- * Return manufacturer of the car.
- * @return null if information is not available.
- */
- public abstract @Nullable String getManufacturer() throws CarNotConnectedException;
-
- /**
- * Return model name of the car. This information may not necessarily allow distinguishing
- * different car models as the same name may be used for different cars depending on
- * manufacturers.
- * @return null if information is not available.
- */
- public abstract @Nullable String getModel() throws CarNotConnectedException;
-
- /**
- * Return model year of the car in AC.
- * @return null if information is not available.
- */
- public abstract @Nullable String getModelYear() throws CarNotConnectedException;
-
- /**
- * Return unique identifier for the car. This is not VIN, and id is persistent until user
- * resets it.
- * @return null if information is not available.
- */
- public abstract @Nullable String getVehicleId() throws CarNotConnectedException;
-
- /**
- * Return manufacturer of the head unit.
- * @return null if information is not available.
- */
- public abstract @Nullable String getHeadunitManufacturer() throws CarNotConnectedException;
-
- /**
- * Return model of the headunit.
- * @return null if information is not available.
- */
- public abstract @Nullable String getHeadunitModel() throws CarNotConnectedException;
-
- /**
- * Return S/W build of the headunit.
- * @return null if information is not available.
- */
- public abstract @Nullable String getHeadunitSoftwareBuild() throws CarNotConnectedException;
-
- /**
- * Return S/W version of the headunit.
- * @return null if information is not available.
- */
- public abstract @Nullable String getHeadunitSoftwareVersion() throws CarNotConnectedException;
-
- /**
- * Return driver side of the car.
- * @return {@link #DRIVER_SIDE_UNKNOWN} if information is not available.
- */
- public abstract @DriverSide int getDriverPosition() throws CarNotConnectedException;
-
- /**
- * Return fuel capacity of the car in milliliters.
- * @return 0 if car doesn't run on fuel.
- */
- public abstract float getFuelCapacity() throws CarNotConnectedException;
-
- /**
- * Return array of fuel types available in the car, defined in
- * android.hardware.automotive.vehicle.V2_0.FuelType
- * @return empty array if no fuel types available.
- */
- public abstract int[] getFuelTypes() throws CarNotConnectedException;
-
- /**
- * Return battery capacity of the car in WH.
- * @return 0 if car doesn't run on battery.
- */
- public abstract float getEvBatteryCapacity() throws CarNotConnectedException;
-
- /**
- * Return array of EV connector types available in the car, defined in
- * android.hardware.automotive.vehicle.V2_0.EvConnectorType
- * @return empty array if no connector types available.
- */
- public abstract int[] getEvConnectorTypes() throws CarNotConnectedException;
-}
diff --git a/car-support-lib/src/android/support/car/CarInfoManagerEmbedded.java b/car-support-lib/src/android/support/car/CarInfoManagerEmbedded.java
deleted file mode 100644
index 0d41053..0000000
--- a/car-support-lib/src/android/support/car/CarInfoManagerEmbedded.java
+++ /dev/null
@@ -1,132 +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.support.car;
-
-
-/** @hide */
-public class CarInfoManagerEmbedded extends CarInfoManager {
-
- private final android.car.CarInfoManager mManager;
-
- /** @hide */
- CarInfoManagerEmbedded(Object manager) {
- mManager = (android.car.CarInfoManager) manager;
- }
-
- @Override
- public String getManufacturer() throws CarNotConnectedException {
- try {
- return mManager.getManufacturer();
- } catch (android.car.CarNotConnectedException e) {
- throw new CarNotConnectedException(e);
- }
- }
-
- @Override
- public String getModel() throws CarNotConnectedException {
- try {
- return mManager.getModel();
- } catch (android.car.CarNotConnectedException e) {
- throw new CarNotConnectedException(e);
- }
- }
-
- @Override
- public String getModelYear() throws CarNotConnectedException {
- try {
- return mManager.getModelYear();
- } catch (android.car.CarNotConnectedException e) {
- throw new CarNotConnectedException(e);
- }
- }
-
- @Override
- public String getVehicleId() throws CarNotConnectedException {
- try {
- return mManager.getVehicleId();
- } catch (android.car.CarNotConnectedException e) {
- throw new CarNotConnectedException(e);
- }
- }
-
- @Override
- public String getHeadunitManufacturer() throws CarNotConnectedException {
- return null;
- }
-
- @Override
- public String getHeadunitModel() throws CarNotConnectedException {
- return null; // N/A
- }
-
- @Override
- public String getHeadunitSoftwareBuild() throws CarNotConnectedException {
- return null; // N/A
- }
-
- @Override
- public String getHeadunitSoftwareVersion() throws CarNotConnectedException {
- return null; // N/A
- }
-
- @Override
- public int getDriverPosition() throws CarNotConnectedException {
- return CarInfoManager.DRIVER_SIDE_UNKNOWN; // N/A
- }
-
- @Override
- public float getFuelCapacity() throws CarNotConnectedException {
- try {
- return mManager.getFuelCapacity();
- } catch (android.car.CarNotConnectedException e) {
- throw new CarNotConnectedException(e);
- }
- }
-
- @Override
- public int[] getFuelTypes() throws CarNotConnectedException {
- try {
- return mManager.getFuelTypes();
- } catch (android.car.CarNotConnectedException e) {
- throw new CarNotConnectedException(e);
- }
- }
-
- @Override
- public float getEvBatteryCapacity() throws CarNotConnectedException {
- try {
- return mManager.getEvBatteryCapacity();
- } catch (android.car.CarNotConnectedException e) {
- throw new CarNotConnectedException(e);
- }
- }
-
- @Override
- public int[] getEvConnectorTypes() throws CarNotConnectedException {
- try {
- return mManager.getEvConnectorTypes();
- } catch (android.car.CarNotConnectedException e) {
- throw new CarNotConnectedException(e);
- }
- }
-
- /** @hide */
- @Override
- public void onCarDisconnected() {
- //nothing to do
- }
-}
diff --git a/car-support-lib/src/android/support/car/CarLibLog.java b/car-support-lib/src/android/support/car/CarLibLog.java
deleted file mode 100644
index c470937..0000000
--- a/car-support-lib/src/android/support/car/CarLibLog.java
+++ /dev/null
@@ -1,24 +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.support.car;
-
-/** @hide */
-public class CarLibLog {
- public static final String TAG_CAR = "CAR.L";
- public static final String TAG_SENSOR = TAG_CAR + ".SENSOR";
- public static final String TAG_NAV = TAG_CAR + ".NAV";
-}
diff --git a/car-support-lib/src/android/support/car/CarManagerBase.java b/car-support-lib/src/android/support/car/CarManagerBase.java
deleted file mode 100644
index 79a28f8..0000000
--- a/car-support-lib/src/android/support/car/CarManagerBase.java
+++ /dev/null
@@ -1,25 +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.support.car;
-
-/**
- * Common interface for Car*Manager
- * @hide
- */
-public interface CarManagerBase {
- void onCarDisconnected();
-}
diff --git a/car-support-lib/src/android/support/car/CarNotConnectedException.java b/car-support-lib/src/android/support/car/CarNotConnectedException.java
deleted file mode 100644
index aa0cfcd..0000000
--- a/car-support-lib/src/android/support/car/CarNotConnectedException.java
+++ /dev/null
@@ -1,42 +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.support.car;
-
-
-/**
- * Exception thrown when an API that requires a car connection is called while disconnected from a
- * car. This may have happened because the car and phone have become disconnected, the system is
- * undergoing an upgrade, or some other event.
- */
-public class CarNotConnectedException extends Exception {
- private static final long serialVersionUID = -5629175439268813047L;
-
- public CarNotConnectedException() {
- }
-
- public CarNotConnectedException(String name) {
- super(name);
- }
-
- public CarNotConnectedException(String name, Throwable cause) {
- super(name, cause);
- }
-
- public CarNotConnectedException(Exception cause) {
- super(cause);
- }
-}
diff --git a/car-support-lib/src/android/support/car/CarServiceLoader.java b/car-support-lib/src/android/support/car/CarServiceLoader.java
deleted file mode 100644
index 8a334b7..0000000
--- a/car-support-lib/src/android/support/car/CarServiceLoader.java
+++ /dev/null
@@ -1,83 +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.support.car;
-
-import android.content.Context;
-import android.os.Handler;
-
-/**
- * CarServiceLoader is the abstraction for loading different types of car service.
- * @hide
- */
-public abstract class CarServiceLoader {
-
- private final Context mContext;
- private final CarConnectionCallbackProxy mCallback;
- private final Handler mEventHandler;
-
- public CarServiceLoader(Context context, CarConnectionCallbackProxy callback, Handler handler) {
- mContext = context;
- mCallback = callback;
- mEventHandler = handler;
- }
-
- public abstract void connect() throws IllegalStateException;
- public abstract void disconnect();
- public abstract boolean isConnected();
-
- @Car.ConnectionType
- public abstract int getCarConnectionType() throws CarNotConnectedException;
-
- /**
- * Retrieves a manager object for a specified Car*Manager.
- * @param serviceName One of the android.car.Car#*_SERVICE constants.
- * @return An instance of the request manager. Null if the manager is not supported on the
- * current vehicle.
- * @throws CarNotConnectedException if the connection to the car service has been lost.
- */
- public abstract Object getCarManager(String serviceName) throws CarNotConnectedException;
-
- protected Context getContext() {
- return mContext;
- }
-
- protected CarConnectionCallbackProxy getConnectionCallback() {
- return mCallback;
- }
-
- protected Handler getEventHandler() {
- return mEventHandler;
- }
-
- /**
- * Wrapper for CarConnectionCallback which does not return a {@link android.support.car.Car}
- * object.
- */
- public abstract static class CarConnectionCallbackProxy {
-
- /**
- * Called when the Car has been connected. Does not guarantee the car is still connected
- * while this callback is running, so {@link CarNotConnectedException}s may still be
- * thrown from {@link Car} method calls.
- */
- public abstract void onConnected();
- /**
- * Called when the Car has been disconnected.
- */
- public abstract void onDisconnected();
- }
-}
diff --git a/car-support-lib/src/android/support/car/CarServiceLoaderEmbedded.java b/car-support-lib/src/android/support/car/CarServiceLoaderEmbedded.java
deleted file mode 100644
index cfd598a..0000000
--- a/car-support-lib/src/android/support/car/CarServiceLoaderEmbedded.java
+++ /dev/null
@@ -1,106 +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.support.car;
-
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.ServiceConnection;
-import android.os.Handler;
-import android.os.IBinder;
-import android.support.car.content.pm.CarPackageManagerEmbedded;
-import android.support.car.media.CarAudioManagerEmbedded;
-import android.support.car.navigation.CarNavigationStatusManagerEmbedded;
-
-/**
- * Default CarServiceLoader for system with built-in car service (=embedded).
- * @hide
- */
-public class CarServiceLoaderEmbedded extends CarServiceLoader {
-
- private final ServiceConnection mServiceConnection = new ServiceConnection() {
-
- @Override
- public void onServiceConnected(ComponentName name, IBinder service) {
- getConnectionCallback().onConnected();
- }
-
- @Override
- public void onServiceDisconnected(ComponentName name) {
- getConnectionCallback().onDisconnected();
- }
- };
-
- private final android.car.Car mEmbeddedCar;
-
- /** @hide */
- CarServiceLoaderEmbedded(Context context, CarConnectionCallbackProxy carConnectionCallback,
- Handler handler) {
- super(context, carConnectionCallback, handler);
- mEmbeddedCar = android.car.Car.createCar(context, mServiceConnection, handler);
- }
-
- @Override
- public void connect() throws IllegalStateException {
- mEmbeddedCar.connect();
- }
-
- @Override
- public void disconnect() {
- mEmbeddedCar.disconnect();
- }
-
- @Override
- public boolean isConnected() {
- return mEmbeddedCar.isConnected();
- }
-
- @Override
- public int getCarConnectionType() throws CarNotConnectedException {
- @android.support.car.Car.ConnectionType
- int carConnectionType = mEmbeddedCar.getCarConnectionType();
- return carConnectionType;
- }
-
- @Override
- public Object getCarManager(String serviceName) throws CarNotConnectedException {
- Object manager;
- try {
- manager = mEmbeddedCar.getCarManager(serviceName);
- } catch (android.car.CarNotConnectedException e) {
- throw new CarNotConnectedException(e);
- }
-
- if (manager == null) {
- return null;
- }
- // For publicly available versions, return wrapper version.
- switch (serviceName) {
- case Car.AUDIO_SERVICE:
- return new CarAudioManagerEmbedded(manager);
- case Car.INFO_SERVICE:
- return new CarInfoManagerEmbedded(manager);
- case Car.APP_FOCUS_SERVICE:
- return new CarAppFocusManagerEmbedded(manager);
- case Car.PACKAGE_SERVICE:
- return new CarPackageManagerEmbedded(manager);
- case Car.CAR_NAVIGATION_SERVICE:
- return new CarNavigationStatusManagerEmbedded(manager);
- default:
- return manager;
- }
- }
-}
diff --git a/car-support-lib/src/android/support/car/annotation/ValueTypeDef.java b/car-support-lib/src/android/support/car/annotation/ValueTypeDef.java
deleted file mode 100644
index 6de4320..0000000
--- a/car-support-lib/src/android/support/car/annotation/ValueTypeDef.java
+++ /dev/null
@@ -1,32 +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.support.car.annotation;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Annotation for specifying a value type for a key/value pair.
- * Key definitions use this annotation to specify what kind of value is expected from the key.
- */
-@Target(ElementType.FIELD)
-@Retention(RetentionPolicy.RUNTIME)
-public @interface ValueTypeDef {
- Class<?> type() default Object.class;
-}
diff --git a/car-support-lib/src/android/support/car/annotation/VersionDef.java b/car-support-lib/src/android/support/car/annotation/VersionDef.java
deleted file mode 100644
index d299a81..0000000
--- a/car-support-lib/src/android/support/car/annotation/VersionDef.java
+++ /dev/null
@@ -1,32 +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.support.car.annotation;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Annotation for specifying supported version of a member for a Parcelable.
- * Version defaults to 1 if @VersionDef is used without specifying a version.
- */
-@Target(ElementType.FIELD)
-@Retention(RetentionPolicy.SOURCE)
-public @interface VersionDef {
- int version() default 1;
-}
diff --git a/car-support-lib/src/android/support/car/content/pm/CarPackageManager.java b/car-support-lib/src/android/support/car/content/pm/CarPackageManager.java
deleted file mode 100644
index bd97de7..0000000
--- a/car-support-lib/src/android/support/car/content/pm/CarPackageManager.java
+++ /dev/null
@@ -1,39 +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.support.car.content.pm;
-
-import android.support.car.CarManagerBase;
-import android.support.car.CarNotConnectedException;
-
-/**
- * Provides car specific API related to package management.
- * @hide
- */
-public abstract class CarPackageManager implements CarManagerBase {
-
- /**
- * Check if given activity is allowed while driving.
- */
- public abstract boolean isActivityAllowedWhileDriving(String packageName, String className)
- throws CarNotConnectedException;
-
- /**
- * Check if given service is allowed while driving.
- */
- public abstract boolean isServiceAllowedWhileDriving(String packageName, String className)
- throws CarNotConnectedException;
-}
diff --git a/car-support-lib/src/android/support/car/content/pm/CarPackageManagerEmbedded.java b/car-support-lib/src/android/support/car/content/pm/CarPackageManagerEmbedded.java
deleted file mode 100644
index e6f1b67..0000000
--- a/car-support-lib/src/android/support/car/content/pm/CarPackageManagerEmbedded.java
+++ /dev/null
@@ -1,61 +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.support.car.content.pm;
-
-import android.support.car.CarNotConnectedException;
-
-/**
- * @hide
- */
-public class CarPackageManagerEmbedded extends CarPackageManager {
-
- private final android.car.content.pm.CarPackageManager mManager;
-
- public CarPackageManagerEmbedded(Object manager) {
- mManager = (android.car.content.pm.CarPackageManager) manager;
- }
-
- /** @hide */
- public android.car.content.pm.CarPackageManager getManager() {
- return mManager;
- }
-
- @Override
- public boolean isActivityAllowedWhileDriving(String packageName, String className)
- throws CarNotConnectedException {
- try {
- return mManager.isActivityDistractionOptimized(packageName, className);
- } catch (android.car.CarNotConnectedException e) {
- throw new CarNotConnectedException(e);
- }
- }
-
- @Override
- public boolean isServiceAllowedWhileDriving(String packageName, String className)
- throws CarNotConnectedException {
- try {
- return mManager.isServiceDistractionOptimized(packageName, className);
- } catch (android.car.CarNotConnectedException e) {
- throw new CarNotConnectedException(e);
- }
- }
-
- @Override
- public void onCarDisconnected() {
- // nothing to do
- }
-}
diff --git a/car-support-lib/src/android/support/car/hardware/CarSensorConfig.java b/car-support-lib/src/android/support/car/hardware/CarSensorConfig.java
deleted file mode 100644
index b39d205..0000000
--- a/car-support-lib/src/android/support/car/hardware/CarSensorConfig.java
+++ /dev/null
@@ -1,98 +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.support.car.hardware;
-
-import static androidx.annotation.RestrictTo.Scope.GROUP_ID;
-
-import android.os.Bundle;
-
-import androidx.annotation.RestrictTo;
-
-/**
- * A CarSensorConfig object corresponds to a single sensor type coming from the car.
- * @hide
- */
-public class CarSensorConfig {
- /** List of property specific mapped elements in bundle for WHEEL_TICK_DISTANCE sensor*/
- /** @hide */
- public final static String WHEEL_TICK_DISTANCE_SUPPORTED_WHEELS =
- "android.car.wheelTickDistanceSupportedWheels";
- /** @hide */
- public final static String WHEEL_TICK_DISTANCE_FRONT_LEFT_UM_PER_TICK =
- "android.car.wheelTickDistanceFrontLeftUmPerTick";
- /** @hide */
- public final static String WHEEL_TICK_DISTANCE_FRONT_RIGHT_UM_PER_TICK =
- "android.car.wheelTickDistanceFrontRightUmPerTick";
- /** @hide */
- public final static String WHEEL_TICK_DISTANCE_REAR_RIGHT_UM_PER_TICK =
- "android.car.wheelTickDistanceRearRightUmPerTick";
- /** @hide */
- public final static String WHEEL_TICK_DISTANCE_REAR_LEFT_UM_PER_TICK =
- "android.car.wheelTickDistanceRearLeftUmPerTick";
-
- /** Config data stored in Bundle */
- private final Bundle mConfig;
- private final int mType;
-
- private final static int RAW_BUNDLE_SIZE = 4;
- private final static int WHEEL_TICK_DISTANCE_BUNDLE_SIZE = 6;
-
- /**
- * Constructs a {@link CarSensorConfig}. Handled by CarSensorManager implementations.
- * App developers need not worry about constructing these objects.
- * @hide
- */
- @RestrictTo(GROUP_ID)
- public CarSensorConfig(int type, Bundle in) {
- mType = type;
- mConfig = in.deepCopy();
- }
-
- private void checkType(int type) {
- if (mType == type) {
- return;
- }
- throw new UnsupportedOperationException(String.format(
- "Invalid sensor type: expected %d, got %d", type, mType));
- }
-
- /** @hide */
- public int getInt(String key) {
- if (mConfig.containsKey(key)) {
- return mConfig.getInt(key);
- } else {
- throw new IllegalArgumentException("SensorType " + mType +
- " does not contain key: " + key);
- }
- }
-
- /** @hide */
- public int getType() {
- return mType;
- }
-
- /** @hide */
- @Override
- public String toString() {
- StringBuilder sb = new StringBuilder();
- sb.append(getClass().getName() + "[");
- sb.append("mConfig: " + mConfig.toString());
- sb.append("mType: " + mType);
- sb.append("]");
- return sb.toString();
- }
-}
diff --git a/car-support-lib/src/android/support/car/hardware/CarSensorEvent.java b/car-support-lib/src/android/support/car/hardware/CarSensorEvent.java
deleted file mode 100644
index 7b1bf1a..0000000
--- a/car-support-lib/src/android/support/car/hardware/CarSensorEvent.java
+++ /dev/null
@@ -1,1207 +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.support.car.hardware;
-
-import static androidx.annotation.RestrictTo.Scope.GROUP_ID;
-
-import android.car.VehicleOilLevel;
-import android.location.GpsSatellite;
-import android.location.Location;
-import android.os.SystemClock;
-
-import androidx.annotation.RestrictTo;
-
-/**
- * A CarSensorEvent object corresponds to a single sensor event coming from the car. Sensor
- * data is stored in a sensor type-specific format in the object's float and byte arrays.
- * </p>
- * To aid in unmarshalling the object's data arrays, this class provides static nested classes and
- * conversion methods (such as {@link DrivingStatusData} and {@link #getDrivingStatusData}).
- * Additionally, calling a conversion method on a CarSensorEvent object with an inappropriate type
- * results in an {@code UnsupportedOperationException} being thrown.
- */
-public class CarSensorEvent {
-
-
- /**
- * Status for {@link CarSensorManager#SENSOR_TYPE_DRIVING_STATUS}: No restrictions.
- */
- public static final int DRIVE_STATUS_UNRESTRICTED = 0;
- /**
- * Status for {@link CarSensorManager#SENSOR_TYPE_DRIVING_STATUS}: No video playback allowed.
- * See {@link #getDrivingStatusData()}.
- */
- public static final int DRIVE_STATUS_NO_VIDEO = 0x1;
- /**
- * Status for {@link CarSensorManager#SENSOR_TYPE_DRIVING_STATUS}: No keyboard or rotary
- * controller input allowed. See {@link #getDrivingStatusData()}.
- */
- public static final int DRIVE_STATUS_NO_KEYBOARD_INPUT = 0x2;
- /**
- * Status for {@link CarSensorManager#SENSOR_TYPE_DRIVING_STATUS}: No voice input allowed.
- * See {@link #getDrivingStatusData()}.
- */
- public static final int DRIVE_STATUS_NO_VOICE_INPUT = 0x4;
- /**
- * Status for {@link CarSensorManager#SENSOR_TYPE_DRIVING_STATUS}: No setup/configuration
- * allowed. See {@link #getDrivingStatusData()}.
- */
- public static final int DRIVE_STATUS_NO_CONFIG = 0x8;
- /**
- * Status for {@link CarSensorManager#SENSOR_TYPE_DRIVING_STATUS}: Limit displayed message
- * length. See {@link #getDrivingStatusData()}.
- */
- public static final int DRIVE_STATUS_LIMIT_MESSAGE_LEN = 0x10;
- /**
- * Status for {@link CarSensorManager#SENSOR_TYPE_DRIVING_STATUS}: All driving restrictions
- * enabled. See {@link #getDrivingStatusData()}.
- */
- public static final int DRIVE_STATUS_FULLY_RESTRICTED = DRIVE_STATUS_NO_VIDEO |
- DRIVE_STATUS_NO_KEYBOARD_INPUT | DRIVE_STATUS_NO_VOICE_INPUT | DRIVE_STATUS_NO_CONFIG |
- DRIVE_STATUS_LIMIT_MESSAGE_LEN;
- /**
- * Indices for {@link CarSensorManager#SENSOR_TYPE_COMPASS} in floatValues.
- * Angles are in degrees. Can be NaN if not available. See {@link #getCompassData()}.
- */
- public static final int INDEX_COMPASS_BEARING = 0;
- /**
- * Indices for {@link CarSensorManager#SENSOR_TYPE_COMPASS} in floatValues.
- * Angles are in degrees. Can be NaN if not available. See {@link #getCompassData()}.
- */
- public static final int INDEX_COMPASS_PITCH = 1;
- /**
- * Indices for {@link CarSensorManager#SENSOR_TYPE_COMPASS} in floatValues.
- * Angles are in degrees. Can be NaN if not available. See {@link #getCompassData()}.
- */
- public static final int INDEX_COMPASS_ROLL = 2;
-
-
- /**
- * Index for {@link CarSensorManager#SENSOR_TYPE_WHEEL_TICK_DISTANCE} in longValues.
- */
- public static final int INDEX_WHEEL_DISTANCE_RESET_COUNT = 0;
- public static final int INDEX_WHEEL_DISTANCE_FRONT_LEFT = 1;
- public static final int INDEX_WHEEL_DISTANCE_FRONT_RIGHT = 2;
- public static final int INDEX_WHEEL_DISTANCE_REAR_RIGHT = 3;
- public static final int INDEX_WHEEL_DISTANCE_REAR_LEFT = 4;
-
- private static final long MILLI_IN_NANOS = 1000000L;
-
- /** Sensor type for this event, such as {@link CarSensorManager#SENSOR_TYPE_COMPASS}. */
- public final int sensorType;
-
- /**
- * When this data was acquired in car or received from car. It is the elapsed time of data
- * reception from the car in nanoseconds since system boot.
- */
- public final long timestamp;
- /**
- * Array holding float type of sensor data. If the sensor has single value, only floatValues[0]
- * should be used. */
- public final float[] floatValues;
- /** Array holding int type of sensor data. */
- public final int[] intValues;
- /** array holding long int type of sensor data */
- public final long[] longValues;
-
- private static final float[] EMPTY_FLOAT_ARRAY = {};
- private static final int[] EMPTY_INT_ARRAY = {};
- private static final long[] EMPTY_LONG_ARRAY = {};
-
- /**
- * Constructs a {@link CarSensorEvent} from integer values. Handled by
- * CarSensorManager implementations. App developers need not worry about constructing these
- * objects.
- * @hide
- */
- @RestrictTo(GROUP_ID)
- public CarSensorEvent(int sensorType, long timestamp, int floatValueSize, int intValueSize,
- int longValueSize) {
- this.sensorType = sensorType;
- this.timestamp = timestamp;
- floatValues = new float[floatValueSize];
- intValues = new int[intValueSize];
- longValues = new long[longValueSize];
- }
-
- /**
- * Constructor
- * @param sensorType one of the {@link CarSensorManager}'s SENSOR_TYPE_* constants
- * @param timestamp time since system start in nanoseconds
- * @param floatValues {@code null} will be converted to an empty array
- * @param intValues {@code null} will be converted to an empty array
- * @param longValues {@code null} will be converted to an empty array
- * @hide
- */
- @RestrictTo(GROUP_ID)
- public CarSensorEvent(int sensorType, long timestamp, float[] floatValues, int[] intValues,
- long[] longValues) {
- this.sensorType = sensorType;
- this.timestamp = timestamp;
- this.floatValues = (floatValues == null) ? EMPTY_FLOAT_ARRAY : floatValues;
- this.intValues = (intValues == null) ? EMPTY_INT_ARRAY : intValues;
- this.longValues = (longValues == null) ? EMPTY_LONG_ARRAY : longValues;
- }
-
- /**
- * Constructor
- * @param sensorType one of the {@link CarSensorManager}'s SENSOR_TYPE_* constants
- * @param timestamp time since system start in nanoseconds
- * @param floatValues {@code null} will be converted to an empty array
- * @param byteValues bytes will be converted into the intValues array. {@code null} will be
- * converted to an empty array.
- * @param longValues {@code null} will be converted to an empty array
- * @hide
- */
- @RestrictTo(GROUP_ID)
- public CarSensorEvent(int sensorType, long timestamp, float[] floatValues, byte[] byteValues,
- long[] longValues) {
- this.sensorType = sensorType;
- this.timestamp = timestamp;
- this.floatValues = (floatValues == null) ? EMPTY_FLOAT_ARRAY : floatValues;
- if (byteValues == null) {
- this.intValues = EMPTY_INT_ARRAY;
- } else {
- this.intValues = new int[byteValues.length];
- for (int i = 0; i < byteValues.length; i++) {
- this.intValues[i] = byteValues[i];
- }
- }
- this.longValues = (longValues == null) ? EMPTY_LONG_ARRAY : longValues;
- }
-
- private void checkType(int type) {
- if (sensorType == type) {
- return;
- }
- throw new UnsupportedOperationException(String.format(
- "Invalid sensor type: expected %d, got %d", type, sensorType));
- }
-
- /**
- * Holds data about the car's compass readings. See {@link #getCompassData()}.
- */
- public static class CompassData {
- /** The time in nanoseconds since system boot. */
- public final long timestamp;
- /** The bearing in degrees. If unsupported by the car, this value is NaN. */
- public final float bearing;
- /**
- * The pitch in degrees. Nose down is positive. If unsupported by the car, this value is
- * NaN.
- */
- public final float pitch;
- /**
- * The roll in degrees. Right door down is positive. If unsupported by the car, this value
- * is NaN.
- */
- public final float roll;
-
- /** @hide */
- @RestrictTo(GROUP_ID)
- public CompassData(long timestamp, float bearing, float pitch, float roll) {
- this.timestamp = timestamp;
- this.bearing = bearing;
- this.pitch = pitch;
- this.roll = roll;
- }
- }
-
- /**
- * Convenience method for obtaining a {@link CompassData} object from a CarSensorEvent object
- * with type {@link CarSensorManager#SENSOR_TYPE_COMPASS}.
- *
- * @return A CompassData object corresponding to the data contained in the CarSensorEvent.
- */
- public CompassData getCompassData() {
- checkType(CarSensorManager.SENSOR_TYPE_COMPASS);
- return new CompassData(0, floatValues[INDEX_COMPASS_BEARING],
- floatValues[INDEX_COMPASS_PITCH], floatValues[INDEX_COMPASS_ROLL]);
- }
-
- /**
- * Indicates the state of the parking brake (engaged or not). See
- * {@link #getParkingBrakeData()}.
- */
- public static class ParkingBrakeData {
- /** The time in nanoseconds since system boot. */
- public final long timestamp;
- /** Returns {@code true} if the parking brake is engaged. */
- public final boolean isEngaged;
-
- /** @hide */
- @RestrictTo(GROUP_ID)
- public ParkingBrakeData(long timestamp, boolean isEngaged) {
- this.timestamp = timestamp;
- this.isEngaged = isEngaged;
- }
- }
-
- /**
- * Convenience method for obtaining a {@link ParkingBrakeData} object from a CarSensorEvent
- * object with type {@link CarSensorManager#SENSOR_TYPE_PARKING_BRAKE}. See
- * {@link #getParkingBrakeData()}.
- *
- * @return A ParkingBreakData object corresponding to the data contained in the CarSensorEvent.
- */
- public ParkingBrakeData getParkingBrakeData() {
- checkType(CarSensorManager.SENSOR_TYPE_PARKING_BRAKE);
- return new ParkingBrakeData(timestamp, (intValues[0] == 1));
- }
-
- /**
- * Indicates if the system is in night mode (a state in which the screen is
- * darkened or displays a darker color palette). See {@link #getNightData()}.
- */
- public static class NightData {
- /** The time in nanoseconds since system boot. */
- public final long timestamp;
- /** Returns {@code true} if the system is in night mode. */
- public final boolean isNightMode;
-
- /** @hide */
- @RestrictTo(GROUP_ID)
- public NightData(long timestamp, boolean isNightMode) {
- this.timestamp = timestamp;
- this.isNightMode = isNightMode;
- }
- }
-
- /**
- * Convenience method for obtaining a {@link NightData} object from a CarSensorEvent object
- * with type {@link CarSensorManager#SENSOR_TYPE_NIGHT}.
- *
- * @return A NightData object corresponding to the data contained in the CarSensorEvent.
- */
- public NightData getNightData() {
- checkType(CarSensorManager.SENSOR_TYPE_NIGHT);
- return new NightData(timestamp, (intValues[0] == 1));
- }
-
- /**
- * Indicates the restrictions in effect based on the status of the vehicle. See
- * {@link #getDrivingStatusData()}.
- */
- public static class DrivingStatusData {
- /**
- * The time in nanoseconds since system boot.
- */
- public final long timestamp;
- /**
- * A bitmask with the following field values: {@link #DRIVE_STATUS_NO_VIDEO},
- * {@link #DRIVE_STATUS_NO_KEYBOARD_INPUT}, {@link #DRIVE_STATUS_NO_VOICE_INPUT},
- * {@link #DRIVE_STATUS_NO_CONFIG}, {@link #DRIVE_STATUS_LIMIT_MESSAGE_LEN}. You may read
- * this or use the convenience methods.
- */
- public final int status;
-
- /** @hide */
- @RestrictTo(GROUP_ID)
- public DrivingStatusData(long timestamp, int status) {
- this.timestamp = timestamp;
- this.status = status;
- }
-
- /**
- * @return Returns {@code true} if the keyboard is not allowed at this time.
- */
- public boolean isKeyboardRestricted() {
- return DRIVE_STATUS_NO_KEYBOARD_INPUT == (status & DRIVE_STATUS_NO_KEYBOARD_INPUT);
- }
-
- /**
- * @return Returns {@code true} if voice commands are not allowed at this time.
- */
- public boolean isVoiceRestricted() {
- return DRIVE_STATUS_NO_VOICE_INPUT == (status & DRIVE_STATUS_NO_VOICE_INPUT);
- }
-
- /**
- * @return Returns {@code true} if video is not allowed at this time.
- */
- public boolean isVideoRestricted() {
- return DRIVE_STATUS_NO_VIDEO == (status & DRIVE_STATUS_NO_VIDEO);
- }
-
- /**
- * @return Returns {@code true} if configuration should not be performed at this time.
- */
- public boolean isConfigurationRestricted() {
- return DRIVE_STATUS_NO_CONFIG == (status & DRIVE_STATUS_NO_CONFIG);
- }
-
- /**
- * @return Returns {@code true} if message length should be limited at this time.
- */
- public boolean isMessageLengthRestricted() {
- return DRIVE_STATUS_LIMIT_MESSAGE_LEN == (status & DRIVE_STATUS_LIMIT_MESSAGE_LEN);
- }
-
- /**
- * @return Returns {@code true} if all restrictions are in place at this time.
- */
- public boolean isFullyRestricted() {
- return DRIVE_STATUS_FULLY_RESTRICTED == (status & DRIVE_STATUS_FULLY_RESTRICTED);
- }
- }
-
- /**
- * Convenience method for obtaining a {@link DrivingStatusData} object from a CarSensorEvent
- * object with type {@link CarSensorManager#SENSOR_TYPE_DRIVING_STATUS}.
- *
- * @return A DrivingStatusData object corresponding to the data contained in the
- * CarSensorEvent.
- */
- public DrivingStatusData getDrivingStatusData() {
- checkType(CarSensorManager.SENSOR_TYPE_DRIVING_STATUS);
- return new DrivingStatusData(timestamp, intValues[0]);
- }
-
-
- /*things that are currently hidden*/
-
-
- /**
- * GEAR_* represents meaning of intValues[0] for {@link CarSensorManager#SENSOR_TYPE_GEAR}
- * sensor type.
- * GEAR_NEUTRAL means transmission gear is in neutral state, and the car may be moving.
- * @hide
- */
- public static final int GEAR_NEUTRAL = 0;
- /**
- * intValues[0] from 1 to 99 represents transmission gear number for moving forward.
- * GEAR_FIRST is for gear number 1.
- * @hide
- */
- public static final int GEAR_FIRST = 1;
- /** Gear number 2. @hide */
- public static final int GEAR_SECOND = 2;
- /** Gear number 3. @hide */
- public static final int GEAR_THIRD = 3;
- /** Gear number 4. @hide */
- public static final int GEAR_FOURTH = 4;
- /** Gear number 5. @hide */
- public static final int GEAR_FIFTH = 5;
- /** Gear number 6. @hide */
- public static final int GEAR_SIXTH = 6;
- /** Gear number 7. @hide */
- public static final int GEAR_SEVENTH = 7;
- /** Gear number 8. @hide */
- public static final int GEAR_EIGHTH = 8;
- /** Gear number 9. @hide */
- public static final int GEAR_NINTH = 9;
- /** Gear number 10. @hide */
- public static final int GEAR_TENTH = 10;
- /**
- * This is for transmission without specific gear number for moving forward like CVT. It tells
- * that car is in a transmission state to move it forward.
- * @hide
- */
- public static final int GEAR_DRIVE = 100;
- /** Gear in parking state @hide */
- public static final int GEAR_PARK = 101;
- /** Gear in reverse @hide */
- public static final int GEAR_REVERSE = 102;
-
- /**
- * Indices for {@link CarSensorManager#SENSOR_TYPE_GYROSCOPE} in floatValues.
- * Rotation speed is in rad/s. Any component can be NaN if it is not available.
- */
- /**@hide*/
- public static final int INDEX_GYROSCOPE_X = 0;
- /**@hide*/
- public static final int INDEX_GYROSCOPE_Y = 1;
- /**@hide*/
- public static final int INDEX_GYROSCOPE_Z = 2;
-
- /**
- * Indices for {@link CarSensorManager#SENSOR_TYPE_GPS_SATELLITE}.
- * Both byte values and float values are used.
- * Two first bytes encode number of satellites in-use/in-view (or 0xFF if unavailable).
- * Then optionally with INDEX_GPS_SATELLITE_ARRAY_BYTE_OFFSET offset and interval
- * INDEX_GPS_SATELLITE_ARRAY_BYTE_INTERVAL between elements are encoded boolean flags of
- * whether particular satellite from in-view participate in in-use subset.
- * Float values with INDEX_GPS_SATELLITE_ARRAY_FLOAT_OFFSET offset and interval
- * INDEX_GPS_SATELLITE_ARRAY_FLOAT_INTERVAL between elements can optionally contain
- * per-satellite values of signal strength and other values or NaN if unavailable.
- */
- /**@hide*/
- public static final int INDEX_GPS_SATELLITE_NUMBER_IN_USE = 0;
- /**@hide*/
- public static final int INDEX_GPS_SATELLITE_NUMBER_IN_VIEW = 1;
- /**@hide*/
- public static final int INDEX_GPS_SATELLITE_ARRAY_INT_OFFSET = 2;
- /**@hide*/
- public static final int INDEX_GPS_SATELLITE_ARRAY_INT_INTERVAL = 1;
- /**@hide*/
- public static final int INDEX_GPS_SATELLITE_ARRAY_FLOAT_OFFSET = 0;
- /**@hide*/
- public static final int INDEX_GPS_SATELLITE_ARRAY_FLOAT_INTERVAL = 4;
- /**@hide*/
- public static final int INDEX_GPS_SATELLITE_PRN_OFFSET = 0;
- /**@hide*/
- public static final int INDEX_GPS_SATELLITE_SNR_OFFSET = 1;
- /**@hide*/
- public static final int INDEX_GPS_SATELLITE_AZIMUTH_OFFSET = 2;
- /**@hide*/
- public static final int INDEX_GPS_SATELLITE_ELEVATION_OFFSET = 3;
-
-
- /**
- * Index for {@link CarSensorManager#SENSOR_TYPE_LOCATION} in floatValues.
- * Each bit intValues[0] represents whether the corresponding data is present.
- */
- /**@hide*/
- public static final int INDEX_LOCATION_LATITUDE = 0;
- /**@hide*/
- public static final int INDEX_LOCATION_LONGITUDE = 1;
- /**@hide*/
- public static final int INDEX_LOCATION_ACCURACY = 2;
- /**@hide*/
- public static final int INDEX_LOCATION_ALTITUDE = 3;
- /**@hide*/
- public static final int INDEX_LOCATION_SPEED = 4;
- /**@hide*/
- public static final int INDEX_LOCATION_BEARING = 5;
- /**@hide*/
- public static final int INDEX_LOCATION_MAX = INDEX_LOCATION_BEARING;
- /**@hide*/
- public static final int INDEX_LOCATION_LATITUDE_INTS = 1;
- /**@hide*/
- public static final int INDEX_LOCATION_LONGITUDE_INTS = 2;
-
-
- /**
- * Index for {@link CarSensorManager#SENSOR_TYPE_ENVIRONMENT} in floatValues.
- * Temperature in Celsius degrees.
- * @hide
- */
- public static final int INDEX_ENVIRONMENT_TEMPERATURE = 0;
- /**
- * Index for {@link CarSensorManager#SENSOR_TYPE_ENVIRONMENT} in floatValues.
- * Pressure in kPa.
- * @hide
- */
- public static final int INDEX_ENVIRONMENT_PRESSURE = 1;
-
-
- /**
- * Indices for {@link CarSensorManager#SENSOR_TYPE_ACCELEROMETER} in floatValues.
- * Acceleration (gravity) is in m/s^2. Any component can be NaN if it is not available.
- */
- /**@hide*/
- public static final int INDEX_ACCELEROMETER_X = 0;
- /**@hide*/
- public static final int INDEX_ACCELEROMETER_Y = 1;
- /**@hide*/
- public static final int INDEX_ACCELEROMETER_Z = 2;
-
- /** @hide */
- public static class EnvironmentData {
- /** The time in nanoseconds since system boot. */
- public final long timestamp;
- /** If unsupported by the car, this value is NaN. */
- public final float temperature;
- /** If unsupported by the car, this value is NaN. */
- public final float pressure;
-
- /** @hide */
- @RestrictTo(GROUP_ID)
- public EnvironmentData(long timestamp, float temperature, float pressure) {
- this.timestamp = timestamp;
- this.temperature = temperature;
- this.pressure = pressure;
- }
- }
-
- /**
- * Convenience method for obtaining an {@link EnvironmentData} object from a CarSensorEvent
- * object with type {@link CarSensorManager#SENSOR_TYPE_ENVIRONMENT}.
- *
- * @return an EnvironmentData object corresponding to the data contained in the CarSensorEvent.
- * @hide
- */
- public EnvironmentData getEnvironmentData() {
- checkType(CarSensorManager.SENSOR_TYPE_ENVIRONMENT);
-
- float temperature = floatValues[INDEX_ENVIRONMENT_TEMPERATURE];
- float pressure = floatValues[INDEX_ENVIRONMENT_PRESSURE];
- return new EnvironmentData(timestamp, temperature, pressure);
- }
-
- /** @hide */
- public static class GearData {
- /** The time in nanoseconds since system boot. */
- public final long timestamp;
- public final int gear;
-
- /** @hide */
- @RestrictTo(GROUP_ID)
- public GearData(long timestamp, int gear) {
- this.timestamp = timestamp;
- this.gear = gear;
- }
- }
-
- /**
- * Convenience method for obtaining a {@link GearData} object from a CarSensorEvent
- * object with type {@link CarSensorManager#SENSOR_TYPE_GEAR}.
- *
- * @return a GearData object corresponding to the data contained in the CarSensorEvent.
- * @hide
- */
- public GearData getGearData() {
- checkType(CarSensorManager.SENSOR_TYPE_GEAR);
- return new GearData(timestamp, intValues[0]);
- }
-
- /** @hide */
- public static class FuelLevelData {
- /** The time in nanoseconds since system boot. */
- public final long timestamp;
- /** Fuel level in milliliters. If unsupported by the car, this value is -1. */
- public final float level;
-
- /** @hide */
- @RestrictTo(GROUP_ID)
- public FuelLevelData(long timestamp, float level) {
- this.timestamp = timestamp;
- this.level = level;
- }
- }
-
- /**
- * Convenience method for obtaining a {@link FuelLevelData} object from a CarSensorEvent object
- * with type {@link CarSensorManager#SENSOR_TYPE_FUEL_LEVEL}.
- *
- * @return A FuelLevel object corresponding to the data contained in the CarSensorEvent.
- * @hide
- */
- public FuelLevelData getFuelLevelData() {
- checkType(CarSensorManager.SENSOR_TYPE_FUEL_LEVEL);
- float level = -1.0f;
- if (floatValues != null) {
- if (floatValues[0] >= 0) {
- level = floatValues[0];
- }
- }
- return new FuelLevelData(timestamp, level);
- }
-
- /** @hide */
- public static class OdometerData {
- /** The time in nanoseconds since system boot. */
- public final long timestamp;
- public final float kms;
-
- /** @hide */
- @RestrictTo(GROUP_ID)
- public OdometerData(long timestamp, float kms) {
- this.timestamp = timestamp;
- this.kms = kms;
- }
- }
-
- /**
- * Convenience method for obtaining an {@link OdometerData} object from a CarSensorEvent
- * object with type {@link CarSensorManager#SENSOR_TYPE_ODOMETER}.
- *
- * @return an OdometerData object corresponding to the data contained in the CarSensorEvent.
- * @hide
- */
- public OdometerData getOdometerData() {
- checkType(CarSensorManager.SENSOR_TYPE_ODOMETER);
- return new OdometerData(timestamp, floatValues[0]);
- }
-
- /** @hide */
- public static class RpmData {
- /** The time in nanoseconds since system boot. */
- public final long timestamp;
- public final float rpm;
-
- /** @hide */
- @RestrictTo(GROUP_ID)
- public RpmData(long timestamp, float rpm) {
- this.timestamp = timestamp;
- this.rpm = rpm;
- }
- }
-
- /**
- * Convenience method for obtaining a {@link RpmData} object from a CarSensorEvent object with
- * type {@link CarSensorManager#SENSOR_TYPE_RPM}.
- *
- * @return An RpmData object corresponding to the data contained in the CarSensorEvent.
- * @hide
- */
- public RpmData getRpmData() {
- checkType(CarSensorManager.SENSOR_TYPE_RPM);
- return new RpmData(timestamp, floatValues[0]);
- }
-
- /** @hide */
- public static class CarSpeedData {
- /** The time in nanoseconds since system boot. */
- public final long timestamp;
- public final float carSpeed;
-
- /** @hide */
- @RestrictTo(GROUP_ID)
- public CarSpeedData(long timestamp, float carSpeed) {
- this.timestamp = timestamp;
- this.carSpeed = carSpeed;
- }
- }
-
- /**
- * Convenience method for obtaining a {@link CarSpeedData} object from a CarSensorEvent
- * object with type {@link CarSensorManager#SENSOR_TYPE_CAR_SPEED}.
- *
- * @return a CarSpeedData object corresponding to the data contained in the CarSensorEvent.
- * @hide
- */
- public CarSpeedData getCarSpeedData() {
- checkType(CarSensorManager.SENSOR_TYPE_CAR_SPEED);
- return new CarSpeedData(timestamp, floatValues[0]);
- }
-
- /**
- * Convenience method for obtaining a {@link Location} object from a CarSensorEvent
- * object with type {@link CarSensorManager#SENSOR_TYPE_LOCATION}.
- *
- * @param location an optional output parameter which, if non-null, will be used by this method
- * instead of a newly created object.
- * @return a Location object corresponding to the data contained in the CarSensorEvent.
- * @hide
- */
- public Location getLocation(Location location) {
- checkType(CarSensorManager.SENSOR_TYPE_LOCATION);
- if (location == null) {
- location = new Location("Car-GPS");
- }
- // intValues[0]: bit flags for the presence of other values following.
- int presense = intValues[0];
- if ((presense & (0x1 << INDEX_LOCATION_LATITUDE)) != 0) {
- int latE7 = intValues[INDEX_LOCATION_LATITUDE_INTS];
- location.setLatitude(latE7 * 1e-7);
- }
- if ((presense & (0x1 << INDEX_LOCATION_LONGITUDE)) != 0) {
- int longE7 = intValues[INDEX_LOCATION_LONGITUDE_INTS];
- location.setLongitude(longE7 * 1e-7);
- }
- if ((presense & (0x1 << INDEX_LOCATION_ACCURACY)) != 0) {
- location.setAccuracy(floatValues[INDEX_LOCATION_ACCURACY]);
- }
- if ((presense & (0x1 << INDEX_LOCATION_ALTITUDE)) != 0) {
- location.setAltitude(floatValues[INDEX_LOCATION_ALTITUDE]);
- }
- if ((presense & (0x1 << INDEX_LOCATION_SPEED)) != 0) {
- location.setSpeed(floatValues[INDEX_LOCATION_SPEED]);
- }
- if ((presense & (0x1 << INDEX_LOCATION_BEARING)) != 0) {
- location.setBearing(floatValues[INDEX_LOCATION_BEARING]);
- }
- location.setElapsedRealtimeNanos(timestamp);
- // There is a risk of scheduler delaying 2nd elapsedRealtimeNs value.
- // But will not try to fix it assuming that is acceptable as UTC time's accuracy is not
- // guaranteed in Location data.
- long currentTimeMs = System.currentTimeMillis();
- long elapsedRealtimeNs = SystemClock.elapsedRealtimeNanos();
- location.setTime(
- currentTimeMs - (elapsedRealtimeNs - timestamp) / MILLI_IN_NANOS);
- return location;
- }
-
- /** @hide */
- public static class AccelerometerData {
- /** The time in nanoseconds since system boot. */
- public final long timestamp;
- /** If unsupported by the car, this value is NaN. */
- public final float x;
- /** If unsupported by the car, this value is NaN. */
- public final float y;
- /** If unsupported by the car, this value is NaN. */
- public final float z;
-
- /** @hide */
- @RestrictTo(GROUP_ID)
- public AccelerometerData(long timestamp, float x, float y, float z) {
- this.timestamp = timestamp;
- this.x = x;
- this.y = y;
- this.z = z;
- }
- }
-
- /**
- * Convenience method for obtaining an {@link AccelerometerData} object from a CarSensorEvent
- * object with type {@link CarSensorManager#SENSOR_TYPE_ACCELEROMETER}.
- *
- * @return An AccelerometerData object corresponding to the data contained in the
- * CarSensorEvent.
- * @hide
- */
- public AccelerometerData getAccelerometerData() {
- checkType(CarSensorManager.SENSOR_TYPE_ACCELEROMETER);
- float x = floatValues[INDEX_ACCELEROMETER_X];
- float y = floatValues[INDEX_ACCELEROMETER_Y];
- float z = floatValues[INDEX_ACCELEROMETER_Z];
- return new AccelerometerData(timestamp, x, y, z);
- }
-
- /** @hide */
- public static class GyroscopeData {
- /** The time in nanoseconds since system boot. */
- public final long timestamp;
- /** If unsupported by the car, this value is NaN. */
- public final float x;
- /** If unsupported by the car, this value is NaN. */
- public final float y;
- /** If unsupported by the car, this value is NaN. */
- public final float z;
-
- /** @hide */
- @RestrictTo(GROUP_ID)
- public GyroscopeData(long timestamp, float x, float y, float z) {
- this.timestamp = timestamp;
- this.x = x;
- this.y = y;
- this.z = z;
- }
- }
-
- /**
- * Convenience method for obtaining a {@link GyroscopeData} object from a CarSensorEvent object
- * with type {@link CarSensorManager#SENSOR_TYPE_GYROSCOPE}.
- *
- * @return A GyroscopeData object corresponding to the data contained in the CarSensorEvent.
- * @hide
- */
- public GyroscopeData getGyroscopeData() {
- checkType(CarSensorManager.SENSOR_TYPE_GYROSCOPE);
- float x = floatValues[INDEX_GYROSCOPE_X];
- float y = floatValues[INDEX_GYROSCOPE_Y];
- float z = floatValues[INDEX_GYROSCOPE_Z];
- return new GyroscopeData(timestamp, x, y, z);
- }
-
- // android.location.GpsSatellite doesn't have a public constructor, so that can't be used.
- /**
- * Class that contains GPS satellite status. For more info on meaning of these fields refer
- * to the documentation to the {@link GpsSatellite} class.
- * @hide
- */
- public static class GpsSatelliteData {
- /** The time in nanoseconds since system boot. */
- public final long timestamp;
- /**
- * Number of satellites used in GPS fix or -1 of unavailable.
- */
- public final int numberInUse;
- /**
- * Number of satellites in view or -1 of unavailable.
- */
- public final int numberInView;
- /**
- * Per-satellite flag if this satellite was used for GPS fix.
- * Can be null if per-satellite data is unavailable.
- */
- public final boolean[] usedInFix;
- /**
- * Per-satellite pseudo-random id.
- * Can be null if per-satellite data is unavailable.
- */
- public final int[] prn;
- /**
- * Per-satellite signal to noise ratio.
- * Can be null if per-satellite data is unavailable.
- */
- public final float[] snr;
- /**
- * Per-satellite azimuth.
- * Can be null if per-satellite data is unavailable.
- */
- public final float[] azimuth;
- /**
- * Per-satellite elevation.
- * Can be null if per-satellite data is unavailable.
- */
- public final float[] elevation;
-
- /** @hide */
- @RestrictTo(GROUP_ID)
- public GpsSatelliteData(long timestamp, int numberInUse, int numberInView,
- boolean[] usedInFix, int[] prn, float[] snr, float[] azimuth, float[] elevation) {
- this.timestamp = timestamp;
- this.numberInUse = numberInUse;
- this.numberInView = numberInView;
- this.usedInFix = usedInFix;
- this.prn = prn;
- this.snr = snr;
- this.azimuth = azimuth;
- this.elevation = elevation;
- }
- }
-
- private final int intOffset = CarSensorEvent.INDEX_GPS_SATELLITE_ARRAY_INT_OFFSET;
- private final int intInterval = CarSensorEvent.INDEX_GPS_SATELLITE_ARRAY_INT_INTERVAL;
- private final int floatOffset = CarSensorEvent.INDEX_GPS_SATELLITE_ARRAY_FLOAT_OFFSET;
- private final int floatInterval = CarSensorEvent.INDEX_GPS_SATELLITE_ARRAY_FLOAT_INTERVAL;
-
- /**
- * Convenience method for obtaining a {@link GpsSatelliteData} object from a CarSensorEvent
- * object with type {@link CarSensorManager#SENSOR_TYPE_GPS_SATELLITE} with optional
- * per-satellite info.
- *
- * @param withPerSatellite whether to include per-satellite data.
- * @return a GpsSatelliteData object corresponding to the data contained in the CarSensorEvent.
- * @hide
- */
- public GpsSatelliteData getGpsSatelliteData(boolean withPerSatellite) {
- checkType(CarSensorManager.SENSOR_TYPE_GPS_SATELLITE);
-
- //init all vars
- int numberInUse = intValues[CarSensorEvent.INDEX_GPS_SATELLITE_NUMBER_IN_USE];
- int numberInView = intValues[CarSensorEvent.INDEX_GPS_SATELLITE_NUMBER_IN_VIEW];
- boolean[] usedInFix = null;
- int[] prn = null;
- float[] snr = null;
- float[] azimuth = null;
- float[] elevation = null;
-
- if (withPerSatellite && numberInView >= 0) {
- final int numberOfSats = (floatValues.length - floatOffset) / floatInterval;
- usedInFix = new boolean[numberOfSats];
- prn = new int[numberOfSats];
- snr = new float[numberOfSats];
- azimuth = new float[numberOfSats];
- elevation = new float[numberOfSats];
-
- for (int i = 0; i < numberOfSats; ++i) {
- int iInt = intOffset + intInterval * i;
- int iFloat = floatOffset + floatInterval * i;
- usedInFix[i] = intValues[iInt] != 0;
- prn[i] = Math.round(
- floatValues[iFloat + CarSensorEvent.INDEX_GPS_SATELLITE_PRN_OFFSET]);
- snr[i] =
- floatValues[iFloat + CarSensorEvent.INDEX_GPS_SATELLITE_SNR_OFFSET];
- azimuth[i] = floatValues[iFloat
- + CarSensorEvent.INDEX_GPS_SATELLITE_AZIMUTH_OFFSET];
- elevation[i] = floatValues[iFloat
- + CarSensorEvent.INDEX_GPS_SATELLITE_ELEVATION_OFFSET];
- }
- }
- return new GpsSatelliteData(timestamp, numberInUse, numberInView, usedInFix, prn, snr,
- azimuth, elevation);
- }
-
- /** @hide */
- public static class CarWheelTickDistanceData {
- public final long timestamp;
- public final long sensorResetCount;
- public final long frontLeftWheelDistanceMm;
- public final long frontRightWheelDistanceMm;
- public final long rearRightWheelDistanceMm;
- public final long rearLeftWheelDistanceMm;
-
- /** @hide */
- @RestrictTo(GROUP_ID)
- public CarWheelTickDistanceData(long timestamp, long sensorResetCount,
- long frontLeftWheelDistanceMm, long frontRightWheelDistanceMm,
- long rearRightWheelDistanceMm, long rearLeftWheelDistanceMm) {
- this.timestamp = timestamp;
- this.sensorResetCount = sensorResetCount;
- this.frontLeftWheelDistanceMm = frontLeftWheelDistanceMm;
- this.frontRightWheelDistanceMm = frontRightWheelDistanceMm;
- this.rearRightWheelDistanceMm = rearRightWheelDistanceMm;
- this.rearLeftWheelDistanceMm = rearLeftWheelDistanceMm;
- }
- }
-
- /**
- * Convenience method for obtaining a {@link CarWheelTickDistanceData} object from a
- * CarSensorEvent object with type {@link CarSensorManager#SENSOR_TYPE_WHEEL_TICK_DISTANCE}.
- *
- * @return CarWheelTickDistanceData object corresponding to data contained in the CarSensorEvent
- * @hide
- */
- public CarWheelTickDistanceData getCarWheelTickDistanceData() {
- checkType(CarSensorManager.SENSOR_TYPE_WHEEL_TICK_DISTANCE);
- long sensorResetCount = longValues[INDEX_WHEEL_DISTANCE_RESET_COUNT];
- long frontLeftWheelDistanceMm = longValues[INDEX_WHEEL_DISTANCE_FRONT_LEFT];
- long frontRightWheelDistanceMm = longValues[INDEX_WHEEL_DISTANCE_FRONT_RIGHT];
- long rearRightWheelDistanceMm = longValues[INDEX_WHEEL_DISTANCE_REAR_RIGHT];
- long rearLeftWheelDistanceMm = longValues[INDEX_WHEEL_DISTANCE_REAR_LEFT];
- return new CarWheelTickDistanceData(timestamp, sensorResetCount, frontLeftWheelDistanceMm,
- frontRightWheelDistanceMm, rearRightWheelDistanceMm, rearLeftWheelDistanceMm);
- }
-
- /** @hide */
- public static class CarAbsActiveData {
- public final long timestamp;
- public final boolean absIsActive;
-
- /** @hide */
- @RestrictTo(GROUP_ID)
- public CarAbsActiveData(long timestamp, boolean absIsActive) {
- this.timestamp = timestamp;
- this.absIsActive = absIsActive;
- };
- }
-
- /**
- * Convenience method for obtaining a {@link CarAbsActiveData} object from a CarSensorEvent
- * object with type {@link CarSensorManager#SENSOR_TYPE_ABS_ACTIVE}.
- *
- * @return a CarAbsActiveData object corresponding to data contained in the CarSensorEvent.
- * @hide
- */
- public CarAbsActiveData getCarAbsActiveData() {
- checkType(CarSensorManager.SENSOR_TYPE_ABS_ACTIVE);
- boolean absIsActive = intValues[0] == 1;
- return new CarAbsActiveData(timestamp, absIsActive);
- }
-
- /** @hide */
- public static class CarTractionControlActiveData {
- public final long timestamp;
- public final boolean tractionControlIsActive;
-
- /** @hide */
- @RestrictTo(GROUP_ID)
- public CarTractionControlActiveData(long timestamp, boolean tractionControlIsActive) {
- this.timestamp = timestamp;
- this.tractionControlIsActive = tractionControlIsActive;
- };
- }
-
- /**
- * Convenience method for obtaining a {@link CarTractionControlActiveData} object from a
- * CarSensorEvent object with type {@link CarSensorManager#SENSOR_TYPE_TRACTION_CONTROL_ACTIVE}.
- *
- * @return a CarTractionControlActiveData object corresponding to data contained in the
- * CarSensorEvent.
- * @hide
- */
- public CarTractionControlActiveData getCarTractionControlActiveData() {
- checkType(CarSensorManager.SENSOR_TYPE_TRACTION_CONTROL_ACTIVE);
- boolean tractionControlIsActive = intValues[0] == 1;
- return new CarTractionControlActiveData(timestamp, tractionControlIsActive);
- }
-
- /** @hide */
- public static class CarFuelDoorOpenData {
- public final long timestamp;
- public final boolean fuelDoorIsOpen;
-
- /** @hide */
- @RestrictTo(GROUP_ID)
- public CarFuelDoorOpenData(long timestamp, boolean fuelDoorIsOpen) {
- this.timestamp = timestamp;
- this.fuelDoorIsOpen = fuelDoorIsOpen;
- };
- }
-
- /**
- * Convenience method for obtaining a {@link CarFuelDoorOpenData} object from a
- * CarSensorEvent object with type {@link CarSensorManager#SENSOR_TYPE_FUEL_DOOR_OPEN}.
- *
- * @return a CarFuelDoorOpenData object corresponding to data contained in the
- * CarSensorEvent.
- * @hide
- */
- public CarFuelDoorOpenData getCarFuelDoorOpenData() {
- checkType(CarSensorManager.SENSOR_TYPE_FUEL_DOOR_OPEN);
- boolean fuelDoorIsOpen = intValues[0] == 1;
- return new CarFuelDoorOpenData(timestamp, fuelDoorIsOpen);
- }
-
- /** @hide */
- public static class CarEvBatteryLevelData {
- public final long timestamp;
- public final float evBatteryLevel;
-
- /** @hide */
- @RestrictTo(GROUP_ID)
- public CarEvBatteryLevelData(long timestamp, float evBatteryLevel) {
- this.timestamp = timestamp;
- this.evBatteryLevel = evBatteryLevel;
- };
- }
-
- /**
- * Convenience method for obtaining a {@link CarEvBatteryLevelData} object from a
- * CarSensorEvent object with type {@link CarSensorManager#SENSOR_TYPE_EV_BATTERY_LEVEL}.
- *
- * @return a CarEvBatteryLevelData object corresponding to data contained in the
- * CarSensorEvent.
- * @hide
- */
- public CarEvBatteryLevelData getCarEvBatteryLevelData() {
- checkType(CarSensorManager.SENSOR_TYPE_EV_BATTERY_LEVEL);
- float evBatteryLevel = -1.0f;
- if (floatValues != null) {
- if (floatValues[0] >= 0) {
- evBatteryLevel = floatValues[0];
- }
- }
- return new CarEvBatteryLevelData(timestamp, evBatteryLevel);
- }
-
- /** @hide */
- public static class CarEvChargePortOpenData {
- public final long timestamp;
- public final boolean evChargePortIsOpen;
-
- /** @hide */
- @RestrictTo(GROUP_ID)
- public CarEvChargePortOpenData(long timestamp, boolean evChargePortIsOpen) {
- this.timestamp = timestamp;
- this.evChargePortIsOpen = evChargePortIsOpen;
- };
- }
-
- /**
- * Convenience method for obtaining a {@link CarEvChargePortOpenData} object from a
- * CarSensorEvent object with type {@link CarSensorManager#SENSOR_TYPE_EV_CHARGE_PORT_OPEN}.
- *
- * @return a CarEvChargePortOpenData object corresponding to data contained in the
- * CarSensorEvent.
- * @hide
- */
- public CarEvChargePortOpenData getCarEvChargePortOpenData() {
- checkType(CarSensorManager.SENSOR_TYPE_EV_CHARGE_PORT_OPEN);
- boolean evChargePortIsOpen = intValues[0] == 1;
- return new CarEvChargePortOpenData(timestamp, evChargePortIsOpen);
- }
-
- /** @hide */
- public static class CarEvChargePortConnectedData {
- public final long timestamp;
- public final boolean evChargePortIsConnected;
-
- /** @hide */
- @RestrictTo(GROUP_ID)
- public CarEvChargePortConnectedData(long timestamp, boolean evChargePortIsConnected) {
- this.timestamp = timestamp;
- this.evChargePortIsConnected = evChargePortIsConnected;
- };
- }
-
- /**
- * Convenience method for obtaining a {@link CarEvChargePortConnectedData} object from a
- * CarSensorEvent object with type {@link CarSensorManager#SENSOR_TYPE_EV_CHARGE_PORT_CONNECTED}.
- *
- * @return a CarEvChargePortConnectedData object corresponding to data contained in the
- * CarSensorEvent.
- * @hide
- */
- public CarEvChargePortConnectedData getCarEvChargePortConnectedData() {
- checkType(CarSensorManager.SENSOR_TYPE_EV_CHARGE_PORT_CONNECTED);
- boolean evChargePortIsConnected = intValues[0] == 1;
- return new CarEvChargePortConnectedData(timestamp, evChargePortIsConnected);
- }
-
- /** @hide */
- public static class CarEvBatteryChargeRateData {
- public final long timestamp;
- public final float evChargeRate;
-
- /** @hide */
- @RestrictTo(GROUP_ID)
- public CarEvBatteryChargeRateData(long timestamp, float evChargeRate) {
- this.timestamp = timestamp;
- this.evChargeRate = evChargeRate;
- };
- }
-
- /**
- * Convenience method for obtaining a {@link CarEvBatteryChargeRateData} object from a
- * CarSensorEvent object with type {@link CarSensorManager#SENSOR_TYPE_EV_BATTERY_CHARGE_RATE}.
- *
- * @return a CarEvBatteryChargeRateData object corresponding to data contained in the
- * CarSensorEvent.
- * @hide
- */
- public CarEvBatteryChargeRateData getCarEvBatteryChargeRateData() {
- checkType(CarSensorManager.SENSOR_TYPE_EV_BATTERY_CHARGE_RATE);
- float evChargeRate = 0;
- if (floatValues != null) {
- evChargeRate = floatValues[0];
- }
- return new CarEvBatteryChargeRateData(timestamp, evChargeRate);
- }
-
- /** @hide */
- public static class CarEngineOilLevelData {
- public final long timestamp;
- public final int engineOilLevel;
-
- /** @hide */
- @RestrictTo(GROUP_ID)
- public CarEngineOilLevelData(long timestamp, int engineOilLevel) {
- this.timestamp = timestamp;
- this.engineOilLevel = engineOilLevel;
- };
- }
-
- /**
- * Convenience method for obtaining a {@link CarEngineOilLevelData} object from a
- * CarSensorEvent object with type {@link CarSensorManager#SENSOR_TYPE_ENGINE_OIL_LEVEL}.
- *
- * @return a CarEngineOilLevelData object corresponding to data contained in the
- * CarSensorEvent.
- * @hide
- */
- public CarEngineOilLevelData getCarEngineOilLevelData() {
- checkType(CarSensorManager.SENSOR_TYPE_ENGINE_OIL_LEVEL);
- int engineOilLevel = VehicleOilLevel.ERROR;
- if (intValues != null) {
- engineOilLevel = intValues[0];
- }
- return new CarEngineOilLevelData(timestamp, engineOilLevel);
- }
-
- /** @hide */
- @Override
- public String toString() {
- StringBuilder sb = new StringBuilder();
- sb.append(getClass().getName() + "[");
- sb.append("type:" + Integer.toHexString(sensorType));
- if (floatValues != null && floatValues.length > 0) {
- sb.append(" float values:");
- for (float v: floatValues) {
- sb.append(" " + v);
- }
- }
- if (intValues != null && intValues.length > 0) {
- sb.append(" int values:");
- for (int v: intValues) {
- sb.append(" " + v);
- }
- }
- if (longValues != null && longValues.length > 0) {
- sb.append(" long values:");
- for (long v: longValues) {
- sb.append(" " + v);
- }
- }
- sb.append("]");
- return sb.toString();
- }
-}
diff --git a/car-support-lib/src/android/support/car/hardware/CarSensorManager.java b/car-support-lib/src/android/support/car/hardware/CarSensorManager.java
deleted file mode 100644
index 29d6f40..0000000
--- a/car-support-lib/src/android/support/car/hardware/CarSensorManager.java
+++ /dev/null
@@ -1,328 +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.support.car.hardware;
-
-import android.Manifest;
-import android.support.car.Car;
-import android.support.car.CarManagerBase;
-import android.support.car.CarNotConnectedException;
-
-import androidx.annotation.IntDef;
-import androidx.annotation.RequiresPermission;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * Enables applications to monitor car sensor data. Applications register listeners to this
- * manager to subscribe to individual sensor streams using the SENSOR_TYPE_* constants as the
- * keys. Data points are returned as {@link CarSensorEvent} objects that have translations for
- * many built-in data types. For vendor extension streams, interpret data based on
- * vendor-provided documentation.
- */
-public abstract class CarSensorManager implements CarManagerBase {
- /**
- * Represent the direction of the car as an angle in degrees measured clockwise with 0 degree
- * pointing North. Sensor data in {@link CarSensorEvent} is a float (floatValues[0]).
- */
- public static final int SENSOR_TYPE_COMPASS = 1;
- /**
- * Represent vehicle speed in meters per second (m/s). Sensor data in
- * {@link CarSensorEvent} is a float >= 0. Requires {@link Car#PERMISSION_SPEED} permission.
- * @hide
- */
- public static final int SENSOR_TYPE_CAR_SPEED = 2;
- /**
- * Represent the engine RPM of the car. Sensor data in {@link CarSensorEvent} is a float.
- * @hide
- */
- public static final int SENSOR_TYPE_RPM = 3;
- /**
- * Represent the total travel distance of the car in kilometers. Sensor data is a float.
- * Requires {@link Car#PERMISSION_MILEAGE} permission.
- * @hide
- */
- public static final int SENSOR_TYPE_ODOMETER = 4;
- /**
- * Represent the fuel level of the car. In {@link CarSensorEvent}, represents fuel level in
- * milliliters. Requires {@link Car#PERMISSION_ENERGY} permission.
- * @hide
- */
- public static final int SENSOR_TYPE_FUEL_LEVEL = 5;
- /**
- * Represent the current status of parking brake. Sensor data in {@link CarSensorEvent} is in
- * intValues[0]. A value of 1 indicates the parking brake is engaged; a value of 0 indicates
- * the parking brake is not engaged.
- * For this sensor, rate in {@link #addListener(OnSensorChangedListener, int, int)} is
- * ignored and all changes are notified.
- */
- public static final int SENSOR_TYPE_PARKING_BRAKE = 6;
- /**
- * Represent the current position of transmission gear. Sensor data in {@link
- * CarSensorEvent} is in intValues[0]. For the meaning of the value, check {@link
- * CarSensorEvent#GEAR_NEUTRAL} and other GEAR_*.
- * @hide
- */
- public static final int SENSOR_TYPE_GEAR = 7;
-
- /** @hide */
- public static final int SENSOR_TYPE_RESERVED8 = 8;
-
- /**
- * Represent the current status of the day/night sensor. Sensor data is in intValues[0].
- */
- public static final int SENSOR_TYPE_NIGHT = 9;
- /**
- * Represent the location. Sensor data is floatValues.
- * @hide
- */
- public static final int SENSOR_TYPE_LOCATION = 10;
- /**
- * Represent the current driving status of car. Different user interactions should be used
- * depending on the current driving status. Driving status is in intValues[0].
- */
- public static final int SENSOR_TYPE_DRIVING_STATUS = 11;
- /**
- * Environment (such as temperature and pressure).
- * @hide
- */
- public static final int SENSOR_TYPE_ENVIRONMENT = 12;
- /** @hide */
- public static final int SENSOR_TYPE_RESERVED13 = 13;
- /** @hide */
- public static final int SENSOR_TYPE_ACCELEROMETER = 14;
- /** @hide */
- public static final int SENSOR_TYPE_RESERVED15 = 15;
- /** @hide */
- public static final int SENSOR_TYPE_RESERVED16 = 16;
- /** @hide */
- public static final int SENSOR_TYPE_GPS_SATELLITE = 17;
- /** @hide */
- public static final int SENSOR_TYPE_GYROSCOPE = 18;
- /** @hide */
- public static final int SENSOR_TYPE_RESERVED19 = 19;
- /** @hide */
- public static final int SENSOR_TYPE_RESERVED20 = 20;
- /** @hide */
- public static final int SENSOR_TYPE_RESERVED21 = 21;
- /** @hide */
- public static final int SENSOR_TYPE_RESERVED22 = 22;
- /**
- * Represents wheel distance in millimeters. Some cars may not have individual sensors on each
- * wheel. If a value is not available, -1 will be reported. The wheel distance accumulates
- * over time.
- * Requires {@link Car#PERMISSION_MILEAGE} permission.
- */
- public static final int SENSOR_TYPE_WHEEL_TICK_DISTANCE = 23;
- /**
- * Set to true when ABS is active. This sensor is event driven.
- * Requires {@link Car#PERMISSION_VEHICLE_DYNAMICS_STATE} permission.
- */
- public static final int SENSOR_TYPE_ABS_ACTIVE = 24;
- /**
- * Set to true when traction control is active. This sensor is event driven.
- * Requires {@link Car#PERMISSION_VEHICLE_DYNAMICS_STATE} permission.
- */
- public static final int SENSOR_TYPE_TRACTION_CONTROL_ACTIVE = 25;
- /** @hide */
- public static final int SENSOR_TYPE_RESERVED26 = 26;
- /**
- * Set to true if the fuel door is open.
- */
- public static final int SENSOR_TYPE_FUEL_DOOR_OPEN = 27;
-
- /**
- * Indicates battery level of the car.
- * In {@link CarSensorEvent}, represents battery level in WH.
- * This requires {@link Car#PERMISSION_ENERGY} permission.
- */
- public static final int SENSOR_TYPE_EV_BATTERY_LEVEL = 28;
- /**
- * Set to true if EV charging port is open.
- */
- public static final int SENSOR_TYPE_EV_CHARGE_PORT_OPEN = 29;
- /**
- * Set to true if EV charging port is connected.
- */
- public static final int SENSOR_TYPE_EV_CHARGE_PORT_CONNECTED = 30;
- /**
- * Indicates the instantaneous battery charging rate in mW.
- * This requires {@link Car#PERMISSION_ENERGY} permission.
- */
- public static final int SENSOR_TYPE_EV_BATTERY_CHARGE_RATE = 31;
- /**
- * Oil level sensor.
- * @hide
- */
- public static final int SENSOR_TYPE_ENGINE_OIL_LEVEL = 32;
-
- /**
- * Sensors defined in this range [{@link #SENSOR_TYPE_VENDOR_EXTENSION_START},
- * {@link #SENSOR_TYPE_VENDOR_EXTENSION_END}] are for vendors and should be used only
- * by the system app to access sensors not defined as standard types.
- * Sensors supported in this range can vary depending on car models/manufacturers.
- * Third-party apps should not use sensors in this range as they are not compatible across
- * all cars; third-party apps that attempt to access a sensor in this range trigger a
- * security exception (as access is restricted to system apps).
- *
- * @hide
- */
- public static final int SENSOR_TYPE_VENDOR_EXTENSION_START = 0x60000000;
- /** @hide */
- public static final int SENSOR_TYPE_VENDOR_EXTENSION_END = 0x6fffffff;
-
- /** @hide */
- @IntDef({
- SENSOR_TYPE_COMPASS,
- SENSOR_TYPE_CAR_SPEED,
- SENSOR_TYPE_RPM,
- SENSOR_TYPE_ODOMETER,
- SENSOR_TYPE_FUEL_LEVEL,
- SENSOR_TYPE_PARKING_BRAKE,
- SENSOR_TYPE_GEAR,
- SENSOR_TYPE_NIGHT,
- SENSOR_TYPE_LOCATION,
- SENSOR_TYPE_DRIVING_STATUS,
- SENSOR_TYPE_ENVIRONMENT,
- SENSOR_TYPE_ACCELEROMETER,
- SENSOR_TYPE_GPS_SATELLITE,
- SENSOR_TYPE_GYROSCOPE,
- SENSOR_TYPE_WHEEL_TICK_DISTANCE,
- SENSOR_TYPE_ABS_ACTIVE,
- SENSOR_TYPE_TRACTION_CONTROL_ACTIVE,
- SENSOR_TYPE_FUEL_DOOR_OPEN,
- SENSOR_TYPE_EV_BATTERY_LEVEL,
- SENSOR_TYPE_EV_CHARGE_PORT_OPEN,
- SENSOR_TYPE_EV_CHARGE_PORT_CONNECTED,
- SENSOR_TYPE_EV_BATTERY_CHARGE_RATE,
- SENSOR_TYPE_ENGINE_OIL_LEVEL,
- })
- @Retention(RetentionPolicy.SOURCE)
- public @interface SensorType {}
-
- /** Read sensor at the default normal rate set for each sensors. This is default rate. */
- public static final int SENSOR_RATE_NORMAL = 1;
- /**@hide*/
- public static final int SENSOR_RATE_UI = 5;
- /**@hide*/
- public static final int SENSOR_RATE_FAST = 10;
- /** Read sensor at the maximum rate. Actual rate will be different depending on the sensor. */
- public static final int SENSOR_RATE_FASTEST = 100;
-
- /** @hide */
- @IntDef({
- SENSOR_RATE_NORMAL,
- SENSOR_RATE_UI,
- SENSOR_RATE_FAST,
- SENSOR_RATE_FASTEST
- })
- @Retention(RetentionPolicy.SOURCE)
- public @interface SensorRate {}
-
- /**
- * Listener for car sensor data change.
- * Callbacks are called in the Looper context.
- */
- public interface OnSensorChangedListener {
- /**
- * Called when there is new sensor data from car.
- * @param manager The manager the listener is attached to. Useful if the app wished to
- * unregister.
- * @param event Incoming sensor event for the given sensor type.
- */
- void onSensorChanged(final CarSensorManager manager, final CarSensorEvent event);
- }
-
- /**
- * Get the list of CarSensors available in the connected car.
- * @return Array of all sensor types supported.
- * @throws CarNotConnectedException if the connection to the car service has been lost.
- */
- public abstract int[] getSupportedSensors() throws CarNotConnectedException;
-
- /**
- * Indicate support for a given sensor.
- * @param sensorType
- * @return Returns {@code true} if the sensor is supported.
- * @throws CarNotConnectedException if the connection to the car service has been lost.
- */
- public abstract boolean isSensorSupported(@SensorType int sensorType)
- throws CarNotConnectedException;
-
- /**
- * Register {@link OnSensorChangedListener} to get repeated sensor updates. Can register
- * multiple listeners for a single sensor or use the same listener for different
- * sensors. If the same listener is registered again for the same sensor, it is ignored or
- * updated (depending on the rate).
- * <p>
- * The {@link OnSensorChangedListener} is the identifier for the request and the same
- * instance must be passed into {@link #removeListener(OnSensorChangedListener)}.
- * <p>
- *
- * @param sensorType Sensor type to subscribe.
- * @param rate How fast sensor events are delivered. Should be one of
- * {@link #SENSOR_RATE_FASTEST} or {@link #SENSOR_RATE_NORMAL}. Rate may not be
- * respected, especially when the same sensor is registered with a different listener
- * and with different rates.
- * @return Returns {@code true} if the sensor was successfully enabled.
- * @throws CarNotConnectedException if the connection to the car service has been lost.
- * @throws IllegalArgumentException if wrong argument (such as wrong rate).
- * @throws SecurityException if missing the appropriate permission.
- */
- @RequiresPermission(anyOf={Manifest.permission.ACCESS_FINE_LOCATION, Car.PERMISSION_SPEED,
- Car.PERMISSION_MILEAGE, Car.PERMISSION_ENERGY, Car.PERMISSION_VEHICLE_DYNAMICS_STATE},
- conditional=true)
- public abstract boolean addListener(OnSensorChangedListener listener,
- @SensorType int sensorType, @SensorRate int rate)
- throws CarNotConnectedException, IllegalArgumentException;
-
- /**
- * Stop getting sensor updates for the given listener. If there are multiple registrations for
- * this listener, all listening is stopped.
- * @param listener The listener to remove.
- */
- public abstract void removeListener(OnSensorChangedListener listener);
-
- /**
- * Stop getting sensor updates for the given listener and sensor. If the same listener is used
- * for other sensors, those subscriptions are not affected.
- * @param listener The listener to remove.
- * @param sensorType The type to stop receiving notifications for.
- */
- public abstract void removeListener(OnSensorChangedListener listener,
- @SensorType int sensorType);
-
- /**
- * Get the most recent CarSensorEvent for the given type.
- * @param type A sensor to request.
- * @return null if no sensor update since connection to the car.
- * @throws CarNotConnectedException if the connection to the car service has been lost.
- */
- public abstract CarSensorEvent getLatestSensorEvent(@SensorType int type)
- throws CarNotConnectedException;
-
- /**
- * Get the config data for the given type.
- * @param sensor type to request
- * @return CarSensorConfig object
- * @throws CarNotConnectedException if the connection to the car service has been lost.
- * @hide
- */
- public abstract CarSensorConfig getSensorConfig(@SensorType int type)
- throws CarNotConnectedException;
-
-}
diff --git a/car-support-lib/src/android/support/car/hardware/CarSensorManagerEmbedded.java b/car-support-lib/src/android/support/car/hardware/CarSensorManagerEmbedded.java
deleted file mode 100644
index a8d8d28..0000000
--- a/car-support-lib/src/android/support/car/hardware/CarSensorManagerEmbedded.java
+++ /dev/null
@@ -1,218 +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.support.car.hardware;
-
-import static androidx.annotation.RestrictTo.Scope.GROUP_ID;
-
-import android.content.Context;
-import android.support.car.CarNotConnectedException;
-
-import androidx.annotation.RestrictTo;
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.Set;
-
-/**
- * @hide
- */
-@RestrictTo(GROUP_ID)
-public class CarSensorManagerEmbedded extends CarSensorManager {
- private static final String TAG = "CarSensorsProxy";
-
- private final android.car.hardware.CarSensorManager mManager;
- private final CarSensorsProxy mCarSensorsProxy;
- private final LinkedList<OnSensorChangedListenerProxy> mListeners = new LinkedList<>();
-
- public CarSensorManagerEmbedded(Object manager, Context context) {
- mManager = (android.car.hardware.CarSensorManager) manager;
- mCarSensorsProxy = new CarSensorsProxy(this, context);
- }
-
- @Override
- public int[] getSupportedSensors() throws CarNotConnectedException {
- try {
- Set<Integer> sensorsSet = new HashSet<Integer>();
- for (Integer sensor : mManager.getSupportedSensors()) {
- sensorsSet.add(sensor);
- }
- for (Integer proxySensor : mCarSensorsProxy.getSupportedSensors()) {
- sensorsSet.add(proxySensor);
- }
- return toIntArray(sensorsSet);
- } catch (android.car.CarNotConnectedException e) {
- throw new CarNotConnectedException(e);
- }
- }
-
- private static int[] toIntArray(Collection<Integer> collection) {
- int len = collection.size();
- int[] arr = new int[len];
- int arrIndex = 0;
- for (Integer item : collection) {
- arr[arrIndex] = item;
- arrIndex++;
- }
- return arr;
- }
-
- @Override
- public boolean isSensorSupported(int sensorType) throws CarNotConnectedException {
- try {
- return mManager.isSensorSupported(sensorType)
- || mCarSensorsProxy.isSensorSupported(sensorType);
- } catch (android.car.CarNotConnectedException e) {
- throw new CarNotConnectedException(e);
- }
- }
-
- private boolean isSensorProxied(int sensorType) throws CarNotConnectedException {
- try {
- return !mManager.isSensorSupported(sensorType)
- && mCarSensorsProxy.isSensorSupported(sensorType);
- } catch (android.car.CarNotConnectedException e) {
- throw new CarNotConnectedException(e);
- }
- }
-
- @Override
- public boolean addListener(OnSensorChangedListener listener, int sensorType,
- int rate) throws CarNotConnectedException, IllegalArgumentException {
- if (isSensorProxied(sensorType)) {
- return mCarSensorsProxy.registerSensorListener(listener, sensorType, rate);
- }
- OnSensorChangedListenerProxy proxy = null;
- synchronized (this) {
- proxy = findListenerLocked(listener);
- if (proxy == null) {
- proxy = new OnSensorChangedListenerProxy(listener, sensorType, this);
- mListeners.add(proxy);
- } else {
- proxy.sensors.add(sensorType);
- }
- }
- try {
- return mManager.registerListener(proxy, sensorType, rate);
- } catch (android.car.CarNotConnectedException e) {
- throw new CarNotConnectedException(e);
- }
- }
-
- @Override
- public void removeListener(OnSensorChangedListener listener) {
- mCarSensorsProxy.unregisterSensorListener(listener);
- OnSensorChangedListenerProxy proxy = null;
- synchronized (this) {
- proxy = findListenerLocked(listener);
- if (proxy == null) {
- return;
- }
- mListeners.remove(proxy);
- }
- mManager.unregisterListener(proxy);
- }
-
- @Override
- public void removeListener(OnSensorChangedListener listener, int sensorType) {
- mCarSensorsProxy.unregisterSensorListener(listener, sensorType);
- OnSensorChangedListenerProxy proxy = null;
- synchronized (this) {
- proxy = findListenerLocked(listener);
- if (proxy == null) {
- return;
- }
- proxy.sensors.remove(sensorType);
- if (proxy.sensors.isEmpty()) {
- mListeners.remove(proxy);
- }
- }
- mManager.unregisterListener(proxy, sensorType);
- }
-
- @Override
- public CarSensorEvent getLatestSensorEvent(int type) throws CarNotConnectedException {
- if (isSensorProxied(type)) {
- return mCarSensorsProxy.getLatestSensorEvent(type);
- }
- try {
- return convert(mManager.getLatestSensorEvent(type));
- } catch (android.car.CarNotConnectedException e) {
- throw new CarNotConnectedException(e);
- }
- }
-
- @Override
- public CarSensorConfig getSensorConfig(@SensorType int type)
- throws CarNotConnectedException {
- try {
- return convert(mManager.getSensorConfig(type));
- } catch (android.car.CarNotConnectedException e) {
- throw new CarNotConnectedException(e);
- }
- }
-
- @Override
- public void onCarDisconnected() {
- //nothing to do
- }
-
- private OnSensorChangedListenerProxy findListenerLocked(OnSensorChangedListener listener) {
- for (OnSensorChangedListenerProxy proxy : mListeners) {
- if (proxy.listener == listener) {
- return proxy;
- }
- }
- return null;
- }
-
- private static CarSensorEvent convert(android.car.hardware.CarSensorEvent event) {
- if (event == null) {
- return null;
- }
- return new CarSensorEvent(event.sensorType, event.timestamp, event.floatValues,
- event.intValues, event.longValues);
- }
-
- private static CarSensorConfig convert(android.car.hardware.CarSensorConfig cfg) {
- if (cfg == null) {
- return null;
- }
- return new CarSensorConfig(cfg.getType(), cfg.getBundle());
- }
-
- private static class OnSensorChangedListenerProxy
- implements android.car.hardware.CarSensorManager.OnSensorChangedListener {
-
- public final OnSensorChangedListener listener;
- public final Set<Integer> sensors = new HashSet<>();
- public final CarSensorManager manager;
-
- OnSensorChangedListenerProxy(OnSensorChangedListener listener, int sensor,
- CarSensorManager manager) {
- this.listener = listener;
- this.sensors.add(sensor);
- this.manager = manager;
- }
-
- @Override
- public void onSensorChanged(android.car.hardware.CarSensorEvent event) {
- CarSensorEvent newEvent = convert(event);
- listener.onSensorChanged(manager, newEvent);
- }
- }
-}
diff --git a/car-support-lib/src/android/support/car/hardware/CarSensorsProxy.java b/car-support-lib/src/android/support/car/hardware/CarSensorsProxy.java
deleted file mode 100644
index 69feb84..0000000
--- a/car-support-lib/src/android/support/car/hardware/CarSensorsProxy.java
+++ /dev/null
@@ -1,498 +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.support.car.hardware;
-
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.hardware.Sensor;
-import android.hardware.SensorEvent;
-import android.hardware.SensorEventListener;
-import android.hardware.SensorManager;
-import android.location.GpsSatellite;
-import android.location.GpsStatus;
-import android.location.Location;
-import android.location.LocationListener;
-import android.location.LocationManager;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
-import android.util.Log;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * CarSensorsProxy adds car sensors implementation for sensors that are not provided by vehicle HAL.
- * @hide
- */
-class CarSensorsProxy {
- private static final String TAG = "CarSensorsProxy";
- private static final int MSG_SENSORT_EVENT = 1;
-
- // @GuardedBy("this")
- private final Map<Integer, Set<CarSensorManager.OnSensorChangedListener>> mListenersMultiMap;
- private final LocationManager mLocationManager;
- private final SensorManager mSensorManager;
- private final Sensor mAccelerometerSensor;
- private final Sensor mMagneticFieldSensor;
- private final Sensor mGyroscopeSensor;
- private final int[] mSupportedSensors;
-
- // returned with the onSensorChanged messages.
- private final CarSensorManager mCarSensorManager;
-
- // @GuardedBy("this")
- private Location mLastLocation;
- // @GuardedBy("this")
- private GpsStatus mLastGpsStatus;
- // @GuardedBy("this")
- private float[] mLastAccelerometerData = new float[3];
- // @GuardedBy("this")
- private float[] mLastMagneticFieldData = new float[3];
- // @GuardedBy("this")
- private float[] mLastGyroscopeData = new float[3];
- // @GuardedBy("this")
- private float[] mR = new float[16];
- // @GuardedBy("this")
- private float[] mI = new float[16];
- // @GuardedBy("this")
- private float[] mOrientation = new float[3];
- // @GuardedBy("this")
- private long mLastLocationTime;
- // @GuardedBy("this")
- private long mLastGpsStatusTime;
- // @GuardedBy("this")
- private long mLastAccelerometerDataTime;
- // @GuardedBy("this")
- private long mLastMagneticFieldDataTime;
- // @GuardedBy("this")
- private long mLastGyroscopeDataTime;
-
- private final GpsStatus.Listener mGpsStatusListener = new GpsStatus.Listener() {
- @Override
- public void onGpsStatusChanged(int event) {
- if (event == GpsStatus.GPS_EVENT_SATELLITE_STATUS) {
- synchronized (CarSensorsProxy.this) {
- mLastGpsStatus = mLocationManager.getGpsStatus(mLastGpsStatus);
- mLastGpsStatusTime = System.nanoTime();
- }
- pushSensorChanges(CarSensorManager.SENSOR_TYPE_GPS_SATELLITE);
- }
- }
- };
-
- private final LocationListener mLocationListener = new LocationListener() {
- @Override
- public void onLocationChanged(Location location) {
- synchronized (CarSensorsProxy.this) {
- mLastLocation = location;
- mLastLocationTime = System.nanoTime();
- }
- pushSensorChanges(CarSensorManager.SENSOR_TYPE_LOCATION);
- }
-
- @Override
- public void onProviderEnabled(String provider) {
- }
-
- @Override
- public void onProviderDisabled(String provider) {
- }
-
- @Override
- public void onStatusChanged(String provider, int status, Bundle extras) {
- }
- };
-
- private final SensorEventListener mSensorListener = new SensorEventListener() {
- @Override
- public void onSensorChanged(SensorEvent event) {
- int type = event.sensor.getType();
- synchronized (CarSensorsProxy.this) {
- switch (type) {
- case Sensor.TYPE_GYROSCOPE:
- System.arraycopy((Object) event.values, 0, (Object) mLastGyroscopeData, 0, 3);
- mLastGyroscopeDataTime = System.nanoTime();
- pushSensorChanges(CarSensorManager.SENSOR_TYPE_GYROSCOPE);
- break;
- case Sensor.TYPE_MAGNETIC_FIELD:
- System.arraycopy((Object) event.values, 0, (Object) mLastMagneticFieldData, 0, 3);
- mLastMagneticFieldDataTime = System.nanoTime();
- pushSensorChanges(CarSensorManager.SENSOR_TYPE_COMPASS);
- break;
- case Sensor.TYPE_ACCELEROMETER:
- System.arraycopy((Object) event.values, 0, (Object) mLastAccelerometerData, 0, 3);
- mLastAccelerometerDataTime = System.nanoTime();
- pushSensorChanges(CarSensorManager.SENSOR_TYPE_ACCELEROMETER);
- pushSensorChanges(CarSensorManager.SENSOR_TYPE_COMPASS);
- break;
- default:
- Log.w(TAG, "Unexpected sensor event type: " + type);
- // Should never happen.
- return;
- }
- }
- }
-
- @Override
- public void onAccuracyChanged(Sensor sensor, int accuracy) {}
- };
-
- private final Handler mHandler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case MSG_SENSORT_EVENT:
- int sensorType = msg.arg1;
- Collection<CarSensorManager.OnSensorChangedListener> listenersCollection;
- synchronized (CarSensorsProxy.this) {
- listenersCollection = mListenersMultiMap.get(sensorType);
- }
- CarSensorEvent event = (CarSensorEvent) msg.obj;
- if (event != null) {
- for (CarSensorManager.OnSensorChangedListener listener :
- listenersCollection) {
- listener.onSensorChanged(mCarSensorManager, event);
- }
- }
- break;
- default:
- Log.w(TAG, "Unexpected msg dispatched. msg: " + msg);
- super.handleMessage(msg);
- }
- }
- };
-
- CarSensorsProxy(CarSensorManager carSensorManager, Context context) {
- mLocationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
- mSensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
- mAccelerometerSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
- mMagneticFieldSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
- mGyroscopeSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
- mListenersMultiMap = new HashMap<Integer, Set<CarSensorManager.OnSensorChangedListener>>();
- mSupportedSensors = initSupportedSensors(context);
- mCarSensorManager = carSensorManager;
- }
-
- private int[] initSupportedSensors(Context context) {
- Set<Integer> features = new HashSet<>();
- PackageManager packageManager = context.getPackageManager();
- if (packageManager.hasSystemFeature(PackageManager.FEATURE_SENSOR_COMPASS)
- && packageManager.hasSystemFeature(PackageManager.FEATURE_SENSOR_ACCELEROMETER)) {
- features.add(CarSensorManager.SENSOR_TYPE_COMPASS);
- }
- if (packageManager.hasSystemFeature(PackageManager.FEATURE_SENSOR_ACCELEROMETER)) {
- features.add(CarSensorManager.SENSOR_TYPE_ACCELEROMETER);
- }
- if (packageManager.hasSystemFeature(PackageManager.FEATURE_SENSOR_GYROSCOPE)) {
- features.add(CarSensorManager.SENSOR_TYPE_GYROSCOPE);
- }
- if (packageManager.hasSystemFeature(PackageManager.FEATURE_LOCATION)) {
- features.add(CarSensorManager.SENSOR_TYPE_LOCATION);
- features.add(CarSensorManager.SENSOR_TYPE_GPS_SATELLITE);
- }
- return toIntArray(features);
- }
-
- private static int[] toIntArray(Collection<Integer> collection) {
- int len = collection.size();
- int[] arr = new int[len];
- int arrIndex = 0;
- for (Integer item : collection) {
- arr[arrIndex] = item;
- arrIndex++;
- }
- return arr;
- }
-
-
- public boolean isSensorSupported(int sensorType) {
- for (int sensor : mSupportedSensors) {
- if (sensor == sensorType) {
- return true;
- }
- }
- return false;
- }
-
- public int[] getSupportedSensors() {
- return mSupportedSensors;
- }
-
- public boolean registerSensorListener(CarSensorManager.OnSensorChangedListener listener,
- int sensorType, int rate) {
- // current implementation ignores rate.
- boolean sensorSetChanged = false;
- synchronized (this) {
- if (mListenersMultiMap.get(sensorType) == null) {
- mListenersMultiMap.put(sensorType,
- new HashSet<CarSensorManager.OnSensorChangedListener>());
- sensorSetChanged = true;
- }
- mListenersMultiMap.get(sensorType).add(listener);
- }
-
- pushSensorChanges(sensorType);
-
- if (sensorSetChanged) {
- updateSensorListeners();
- }
- return true;
- }
-
- public void unregisterSensorListener(CarSensorManager.OnSensorChangedListener listener,
- int sensorType) {
- if (listener == null) {
- return;
- }
- boolean sensorSetChanged = false;
- synchronized (this) {
- Set<CarSensorManager.OnSensorChangedListener> sensorTypeListeneres =
- mListenersMultiMap.get(sensorType);
- if (sensorTypeListeneres != null) {
- sensorTypeListeneres.remove(listener);
- if (sensorTypeListeneres.isEmpty()) {
- mListenersMultiMap.remove(sensorType);
- sensorSetChanged = true;
- }
- }
- }
- if (sensorSetChanged) {
- updateSensorListeners();
- };
- }
-
- public void unregisterSensorListener(CarSensorManager.OnSensorChangedListener listener) {
- if (listener == null) {
- return;
- }
- Set<Integer> sensorsToRemove = new HashSet<>();
- synchronized (this) {
- for (Map.Entry<Integer, Set<CarSensorManager.OnSensorChangedListener>> entry :
- mListenersMultiMap.entrySet()) {
- if (entry.getValue().contains(listener)) {
- entry.getValue().remove(listener);
- }
- if (entry.getValue().isEmpty()) {
- sensorsToRemove.add(entry.getKey());
- }
- }
- }
- if (!sensorsToRemove.isEmpty()) {
- for (Integer s : sensorsToRemove) {
- mListenersMultiMap.remove(s);
- }
- updateSensorListeners();
- };
- }
-
- public CarSensorEvent getLatestSensorEvent(int type) {
- return getSensorEvent(type);
- }
-
- private void pushSensorChanges(int sensorType) {
- CarSensorEvent event = getSensorEvent(sensorType);
- if (event == null) {
- return;
- }
- Message msg = mHandler.obtainMessage(MSG_SENSORT_EVENT, sensorType, 0, event);
- mHandler.sendMessage(msg);
- }
-
- private CarSensorEvent getSensorEvent(int sensorType) {
- CarSensorEvent event = null;
- synchronized (this) {
- switch (sensorType) {
- case CarSensorManager.SENSOR_TYPE_COMPASS:
- if (mLastMagneticFieldDataTime != 0 && mLastAccelerometerDataTime != 0) {
- event = new CarSensorEvent(sensorType, Math.max(mLastMagneticFieldDataTime,
- mLastAccelerometerDataTime), 3, 0, 0);
- SensorManager.getRotationMatrix(mR, mI, mLastAccelerometerData,
- mLastMagneticFieldData);
- SensorManager.getOrientation(mR, mOrientation);
- event.floatValues[CarSensorEvent.INDEX_COMPASS_BEARING] =
- (float) Math.toDegrees(mOrientation[0]);
- event.floatValues[CarSensorEvent.INDEX_COMPASS_PITCH] =
- (float) Math.toDegrees(mOrientation[1]);
- event.floatValues[CarSensorEvent.INDEX_COMPASS_ROLL] =
- (float) Math.toDegrees(mOrientation[2]);
- }
- break;
- case CarSensorManager.SENSOR_TYPE_LOCATION:
- if (mLastLocationTime != 0) {
- event = new CarSensorEvent(sensorType, mLastLocationTime, 6, 3, 0);
- populateLocationCarSensorEvent(event, mLastLocation);
- }
- break;
- case CarSensorManager.SENSOR_TYPE_ACCELEROMETER:
- if (mLastAccelerometerDataTime != 0) {
- event = new CarSensorEvent(sensorType, mLastAccelerometerDataTime, 3, 0, 0);
- event.floatValues[CarSensorEvent.INDEX_ACCELEROMETER_X] =
- mLastAccelerometerData[0];
- event.floatValues[CarSensorEvent.INDEX_ACCELEROMETER_Y] =
- mLastAccelerometerData[1];
- event.floatValues[CarSensorEvent.INDEX_ACCELEROMETER_Z] =
- mLastAccelerometerData[2];
- }
- break;
- case CarSensorManager.SENSOR_TYPE_GPS_SATELLITE:
- if (mLastGpsStatusTime != 0) {
- event = createGpsStatusCarSensorEvent(mLastGpsStatus);
- }
- break;
- case CarSensorManager.SENSOR_TYPE_GYROSCOPE:
- if (mLastGyroscopeDataTime != 0) {
- event = new CarSensorEvent(sensorType, mLastGyroscopeDataTime, 3, 0, 0);
- event.floatValues[CarSensorEvent.INDEX_GYROSCOPE_X] = mLastGyroscopeData[0];
- event.floatValues[CarSensorEvent.INDEX_GYROSCOPE_Y] = mLastGyroscopeData[1];
- event.floatValues[CarSensorEvent.INDEX_GYROSCOPE_Z] = mLastGyroscopeData[2];
- }
- break;
- default:
- // Should not happen.
- Log.w(TAG, "[getSensorEvent]: Unsupported sensor type:" + sensorType);
- return null;
- }
- }
- return event;
- }
-
- private void populateLocationCarSensorEvent(CarSensorEvent event, Location location) {
- if (location == null) {
- return;
- }
- int present = 0;
- present |= (0x1 << CarSensorEvent.INDEX_LOCATION_LONGITUDE);
- event.intValues[CarSensorEvent.INDEX_LOCATION_LONGITUDE_INTS] =
- (int) (location.getLongitude() * 1E7);
-
- present |= (0x1 << CarSensorEvent.INDEX_LOCATION_LATITUDE);
- event.intValues[CarSensorEvent.INDEX_LOCATION_LATITUDE_INTS] =
- (int) (location.getLatitude() * 1E7);
-
- if (location.hasAccuracy()) {
- present |= (0x1 << CarSensorEvent.INDEX_LOCATION_ACCURACY);
- event.floatValues[CarSensorEvent.INDEX_LOCATION_ACCURACY] = location.getAccuracy();
- }
-
- if (location.hasAltitude()) {
- present |= (0x1 << CarSensorEvent.INDEX_LOCATION_ALTITUDE);
- event.floatValues[CarSensorEvent.INDEX_LOCATION_ALTITUDE] =
- (float) location.getAltitude();
- }
-
- if (location.hasSpeed()) {
- present |= (0x1 << CarSensorEvent.INDEX_LOCATION_SPEED);
- event.floatValues[CarSensorEvent.INDEX_LOCATION_SPEED] = location.getSpeed();
- }
-
- if (location.hasBearing()) {
- present |= (0x1 << CarSensorEvent.INDEX_LOCATION_BEARING);
- event.floatValues[CarSensorEvent.INDEX_LOCATION_BEARING] = location.getBearing();
- }
-
- event.intValues[0] = present;
- }
-
- private CarSensorEvent createGpsStatusCarSensorEvent(GpsStatus gpsStatus) {
- CarSensorEvent event = null;
-
- if (gpsStatus == null) {
- return event;
- }
-
- int numberInView = 0;
- int numberInUse = 0;
- for (GpsSatellite satellite : gpsStatus.getSatellites()) {
- ++numberInView;
- if (satellite.usedInFix()) {
- ++numberInUse;
- }
- }
- int floatValuesSize = CarSensorEvent.INDEX_GPS_SATELLITE_ARRAY_FLOAT_INTERVAL * numberInView
- + CarSensorEvent.INDEX_GPS_SATELLITE_ARRAY_FLOAT_OFFSET;
- int intValuesSize = CarSensorEvent.INDEX_GPS_SATELLITE_ARRAY_INT_INTERVAL * numberInView
- + CarSensorEvent.INDEX_GPS_SATELLITE_ARRAY_INT_OFFSET;
- event = new CarSensorEvent(CarSensorManager.SENSOR_TYPE_GPS_SATELLITE, mLastGpsStatusTime,
- floatValuesSize, intValuesSize, 0);
- event.intValues[CarSensorEvent.INDEX_GPS_SATELLITE_NUMBER_IN_USE] = numberInUse;
- event.intValues[CarSensorEvent.INDEX_GPS_SATELLITE_NUMBER_IN_VIEW] = numberInView;
- int i = 0;
- for (GpsSatellite satellite : gpsStatus.getSatellites()) {
- int iInt = CarSensorEvent.INDEX_GPS_SATELLITE_ARRAY_INT_OFFSET
- + CarSensorEvent.INDEX_GPS_SATELLITE_ARRAY_INT_INTERVAL * i;
- int iFloat = CarSensorEvent.INDEX_GPS_SATELLITE_ARRAY_FLOAT_OFFSET
- + CarSensorEvent.INDEX_GPS_SATELLITE_ARRAY_FLOAT_INTERVAL * i;
- event.floatValues[iFloat + CarSensorEvent.INDEX_GPS_SATELLITE_PRN_OFFSET] =
- satellite.getPrn();
- event.floatValues[iFloat + CarSensorEvent.INDEX_GPS_SATELLITE_SNR_OFFSET] =
- satellite.getSnr();
- event.floatValues[iFloat + CarSensorEvent.INDEX_GPS_SATELLITE_AZIMUTH_OFFSET] =
- satellite.getAzimuth();
- event.floatValues[iFloat + CarSensorEvent.INDEX_GPS_SATELLITE_ELEVATION_OFFSET] =
- satellite.getElevation();
- event.intValues[iInt] = satellite.usedInFix() ? 1 : 0;
- i++;
- }
- return event;
- }
-
- private void updateSensorListeners() {
- Set<Integer> activeSensors;
- synchronized (this) {
- activeSensors = mListenersMultiMap.keySet();
- }
-
- if (activeSensors.contains(CarSensorManager.SENSOR_TYPE_LOCATION)
- && mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
- mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,
- mLocationListener);
- } else {
- mLocationManager.removeUpdates(mLocationListener);
- }
-
- if (activeSensors.contains(CarSensorManager.SENSOR_TYPE_GPS_SATELLITE)) {
- mLocationManager.addGpsStatusListener(mGpsStatusListener);
- } else {
- mLocationManager.removeGpsStatusListener(mGpsStatusListener);
- }
-
- if (activeSensors.contains(CarSensorManager.SENSOR_TYPE_ACCELEROMETER)
- || activeSensors.contains(CarSensorManager.SENSOR_TYPE_COMPASS)) {
- mSensorManager.registerListener(mSensorListener, mAccelerometerSensor,
- SensorManager.SENSOR_DELAY_FASTEST);
- } else {
- mSensorManager.unregisterListener(mSensorListener, mAccelerometerSensor);
- }
-
- if (activeSensors.contains(CarSensorManager.SENSOR_TYPE_COMPASS)) {
- mSensorManager.registerListener(mSensorListener, mMagneticFieldSensor,
- SensorManager.SENSOR_DELAY_FASTEST);
- } else {
- mSensorManager.unregisterListener(mSensorListener, mMagneticFieldSensor);
- }
-
- if (activeSensors.contains(CarSensorManager.SENSOR_TYPE_GYROSCOPE)) {
- mSensorManager.registerListener(mSensorListener, mGyroscopeSensor,
- SensorManager.SENSOR_DELAY_FASTEST);
- } else {
- mSensorManager.unregisterListener(mSensorListener, mGyroscopeSensor);
- }
- }
-}
diff --git a/car-support-lib/src/android/support/car/input/CarEditable.java b/car-support-lib/src/android/support/car/input/CarEditable.java
deleted file mode 100644
index dfa7571..0000000
--- a/car-support-lib/src/android/support/car/input/CarEditable.java
+++ /dev/null
@@ -1,29 +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.support.car.input;
-
-import android.view.inputmethod.EditorInfo;
-import android.view.inputmethod.InputConnection;
-
-/**
- * Views that implement this interface are editable by the Car IME system.
- * @hide
- */
-public interface CarEditable {
- InputConnection onCreateInputConnection(EditorInfo outAttrs);
- void setCarEditableListener(CarEditableListener listener);
- void setInputEnabled(boolean enabled);
-}
diff --git a/car-support-lib/src/android/support/car/input/CarEditableListener.java b/car-support-lib/src/android/support/car/input/CarEditableListener.java
deleted file mode 100644
index bca02cb..0000000
--- a/car-support-lib/src/android/support/car/input/CarEditableListener.java
+++ /dev/null
@@ -1,33 +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.support.car.input;
-
-/**
- * Callbacks from the {@link CarEditable} to the Car IME. These methods should be called on
- * the main thread.
- * @hide
- */
-public interface CarEditableListener {
- /**
- * Callback to indicate that the selection has changed on the current {@link CarEditable}. Note
- * that selection changes include cursor movements.
- * @param oldSelStart the old selection starting index
- * @param oldSelEnd the old selection ending index
- * @param newSelStart the new selection starting index
- * @param newSelEnd the new selection ending index
- */
- void onUpdateSelection(int oldSelStart, int oldSelEnd, int newSelStart, int newSelEnd);
-}
\ No newline at end of file
diff --git a/car-support-lib/src/android/support/car/input/CarInputManager.java b/car-support-lib/src/android/support/car/input/CarInputManager.java
deleted file mode 100644
index 0704a54..0000000
--- a/car-support-lib/src/android/support/car/input/CarInputManager.java
+++ /dev/null
@@ -1,62 +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.support.car.input;
-
-import android.widget.EditText;
-
-/**
- * Manages use of the in-car IME. All methods should only be called on the main thread.
- * Instances should be obtained by calling
- * {@link android.support.car.app.CarActivity#getInputManager()}.
- * @hide
- */
-public abstract class CarInputManager {
- /**
- * Starts input on the requested {@link android.widget.EditText}, showing the IME.
- * If IME input is already occurring for another view, this call stops input on the previous
- * view and starts input on the new view.
- *
- * This method must only be called from the UI thread. Calling this method from a stopped
- * activity is an illegal operation.
- */
- abstract public void startInput(EditText view);
-
- /**
- * Stops input, hiding the IME. This method fails silently if the calling application didn't
- * request input and isn't the active IME.
- *
- * This function must only be called from the UI thread.
- */
- abstract public void stopInput();
-
- /**
- * Returns {@code true} while the InputManager is valid. The InputManager is valid as long as
- * the {@link android.support.car.app.CarActivity} from which it was obtained has
- * been created and not destroyed.
- */
- abstract public boolean isValid();
-
- /**
- * Returns {@code true} if this InputManager is valid and the IME is active.
- */
- abstract public boolean isInputActive();
-
- /**
- * Returns {@code true} if IME is active on the given {@link android.widget.EditText}.
- */
- abstract public boolean isCurrentCarEditable(EditText view);
-
-}
diff --git a/car-support-lib/src/android/support/car/input/CarRestrictedEditText.java b/car-support-lib/src/android/support/car/input/CarRestrictedEditText.java
deleted file mode 100644
index a19dff1..0000000
--- a/car-support-lib/src/android/support/car/input/CarRestrictedEditText.java
+++ /dev/null
@@ -1,153 +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.support.car.input;
-
-import android.content.Context;
-import android.text.InputType;
-import android.util.AttributeSet;
-import android.view.ActionMode;
-import android.view.KeyEvent;
-import android.view.inputmethod.EditorInfo;
-import android.view.inputmethod.InputConnection;
-import android.view.inputmethod.InputConnectionWrapper;
-import android.widget.EditText;
-import android.widget.TextView;
-
-/**
- * A special EditText for use in-car. This EditText:
- * <ul>
- * <li>Disables selection</li>
- * <li>Disables Cut/Copy/Paste</li>
- * <li>Force-disables suggestions</li>
- * </ul>
- * @hide
- */
-public class CarRestrictedEditText extends EditText implements CarEditable {
-
- private static final boolean SELECTION_CLAMPING_ENABLED = false;
-
- private int mLastSelEnd = 0;
- private int mLastSelStart = 0;
- private boolean mCursorClamped;
-
- private CarEditableListener mCarEditableListener;
- private KeyListener mListener;
-
- public interface KeyListener {
- void onKeyDown(int keyCode);
- void onKeyUp(int keyCode);
- void onCommitText(String input);
- void onCloseKeyboard();
- void onDelete();
- }
-
- public CarRestrictedEditText(Context context, AttributeSet attrs) {
- super(context, attrs);
- setInputType(getInputType() | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
- setTextIsSelectable(false);
- setSelection(getText().length());
- mCursorClamped = true;
- setOnEditorActionListener(new OnEditorActionListener() {
- @Override
- public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
- if (mListener != null && actionId == EditorInfo.IME_ACTION_DONE) {
- mListener.onCloseKeyboard();
- }
- // Return false because we don't want to hijack the default behavior.
- return false;
- }
- });
- }
-
- public void setKeyListener(KeyListener listener) {
- mListener = listener;
- }
-
- @SuppressWarnings("unused")
- @Override
- protected void onSelectionChanged(int selStart, int selEnd) {
- if (mCursorClamped && SELECTION_CLAMPING_ENABLED) {
- setSelection(mLastSelStart, mLastSelEnd);
- return;
- }
- if (mCarEditableListener != null) {
- mCarEditableListener.onUpdateSelection(mLastSelStart, mLastSelEnd, selStart, selEnd);
- }
- mLastSelStart = selStart;
- mLastSelEnd = selEnd;
- }
-
- @Override
- public ActionMode startActionMode(ActionMode.Callback callback) {
- return null;
- }
-
- @Override
- public void setCarEditableListener(CarEditableListener listener) {
- mCarEditableListener = listener;
- }
-
- @Override
- public void setInputEnabled(boolean enabled) {
- mCursorClamped = !enabled;
- }
-
- @Override
- public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
- InputConnection inputConnection = super.onCreateInputConnection(outAttrs);
- return new InputConnectionWrapper(inputConnection, false) {
- @Override
- public boolean sendKeyEvent(android.view.KeyEvent event) {
- if (mListener != null) {
- if (event.getAction() == KeyEvent.ACTION_DOWN) {
- mListener.onKeyDown(event.getKeyCode());
- } else if (event.getAction() == KeyEvent.ACTION_UP) {
- mListener.onKeyUp(event.getKeyCode());
-
- // InputMethodService#sendKeyChar doesn't call
- // InputConnection#commitText for digit chars.
- // TODO: fix projected IME to be in coherence with system IME.
- char unicodeChar = (char) event.getUnicodeChar();
- if (Character.isDigit(unicodeChar)) {
- commitText(String.valueOf(unicodeChar), 1);
- }
- }
- return true;
- } else {
- return super.sendKeyEvent(event);
- }
- }
-
- @Override
- public boolean commitText(java.lang.CharSequence charSequence, int i) {
- if (mListener != null) {
- mListener.onCommitText(charSequence.toString());
- return true;
- }
- return super.commitText(charSequence, i);
- }
-
- @Override
- public boolean deleteSurroundingText(int i, int i1) {
- if (mListener != null) {
- mListener.onDelete();
- return true;
- }
- return super.deleteSurroundingText(i, i1);
- }
- };
- }
-}
diff --git a/car-support-lib/src/android/support/car/media/CarAudioManager.java b/car-support-lib/src/android/support/car/media/CarAudioManager.java
deleted file mode 100644
index e3b783a..0000000
--- a/car-support-lib/src/android/support/car/media/CarAudioManager.java
+++ /dev/null
@@ -1,74 +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.support.car.media;
-
-import android.Manifest;
-import android.media.AudioFormat;
-import android.media.AudioManager;
-import android.support.car.CarManagerBase;
-import android.support.car.CarNotConnectedException;
-
-import androidx.annotation.RequiresPermission;
-
-/**
- * APIs for handling car-specific audio use cases. Provides a set of CAR_AUDIO_USAGE_* constants
- * that can be used to route audio by use case to the car. Important beyond the normal
- * {@link AudioManager} class methods because it handles multi channel audio. Includes use cases
- * such as routing call audio only to the driver and not through all speakers.
- */
-public abstract class CarAudioManager implements CarManagerBase {
-
- /**
- * Get {@link AudioFormat} for audio record.
- * @return {@link AudioFormat} for audio record.
- */
- public abstract AudioFormat getAudioRecordAudioFormat() throws CarNotConnectedException;
-
- public abstract boolean isAudioRecordSupported() throws CarNotConnectedException;
-
- /**
- * Get minimum buffer size for {@link CarAudioRecord}.
- *
- * @return Buffer size in bytes.
- */
- public abstract int getAudioRecordMinBufferSize()
- throws CarNotConnectedException;
-
- /**
- * Get maximum buffer size for {@link CarAudioRecord}.
- *
- * @return Buffer size in bytes.
- */
- public abstract int getAudioRecordMaxBufferSize()
- throws CarNotConnectedException;
-
- /**
- * Create a {@link CarAudioRecord} for the current {@link CarAudioManager}. There can be
- * multiple instances of {@link CarAudioRecord}. Requires {@link
- * android.Manifest.permission#RECORD_AUDIO} permission.
- *
- * @param bufferSize Should be a multiple of minimum buffer size acquired from {@link
- * #getAudioRecordMinBufferSize()}. Cannot exceed {@link #getAudioRecordMaxBufferSize()}.
- *
- * @return {@link CarAudioRecord} instance for the given stream.
- * @throws IllegalArgumentException if passed parameter (such as bufferSize) is wrong.
- * @throws SecurityException if client does not have
- * {@link android.Manifest.permission#RECORD_AUDIO} permission.
- */
- @RequiresPermission(Manifest.permission.RECORD_AUDIO)
- public abstract CarAudioRecord createCarAudioRecord(int bufferSize)
- throws SecurityException, CarNotConnectedException;
-}
diff --git a/car-support-lib/src/android/support/car/media/CarAudioManagerEmbedded.java b/car-support-lib/src/android/support/car/media/CarAudioManagerEmbedded.java
deleted file mode 100644
index 518058a..0000000
--- a/car-support-lib/src/android/support/car/media/CarAudioManagerEmbedded.java
+++ /dev/null
@@ -1,82 +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.support.car.media;
-
-import static androidx.annotation.RestrictTo.Scope.GROUP_ID;
-
-import android.media.AudioFormat;
-import android.media.AudioRecord;
-import android.support.car.CarNotConnectedException;
-
-import androidx.annotation.RestrictTo;
-
-/**
- * @hide
- */
-@RestrictTo(GROUP_ID)
-public class CarAudioManagerEmbedded extends CarAudioManager {
-
- private static final int MAX_BUFFER_SIZE_BYTE = 512 * 1024;
- private static final int SAMPLING_RATE = 16000;
- private static final AudioFormat AUDIO_RECORD_FORMAT = new AudioFormat.Builder()
- .setEncoding(AudioFormat.ENCODING_PCM_16BIT)
- .setChannelMask(AudioFormat.CHANNEL_IN_MONO)
- .setSampleRate(SAMPLING_RATE)
- .build();
-
- private final android.car.media.CarAudioManager mManager;
-
- public CarAudioManagerEmbedded(Object manager) {
- mManager = (android.car.media.CarAudioManager) manager;
- }
-
- @Override
- public boolean isAudioRecordSupported() throws CarNotConnectedException {
- //always true in embedded
- return true;
- }
-
- @Override
- public AudioFormat getAudioRecordAudioFormat() throws CarNotConnectedException {
- return AUDIO_RECORD_FORMAT;
- }
-
- @Override
- public int getAudioRecordMinBufferSize() throws CarNotConnectedException {
- return AudioRecord.getMinBufferSize(SAMPLING_RATE, AUDIO_RECORD_FORMAT.getChannelMask(),
- AUDIO_RECORD_FORMAT.getEncoding());
- }
-
- @Override
- public int getAudioRecordMaxBufferSize() throws CarNotConnectedException {
- return Math.max(getAudioRecordMinBufferSize(), MAX_BUFFER_SIZE_BYTE);
- }
-
- @Override
- public CarAudioRecord createCarAudioRecord(int bufferSize)
- throws CarNotConnectedException, SecurityException {
- if (bufferSize < getAudioRecordMinBufferSize() ||
- bufferSize > getAudioRecordMaxBufferSize()) {
- throw new IllegalArgumentException("Bad bufferSize value");
- }
- return new CarAudioRecordEmbedded(AUDIO_RECORD_FORMAT, bufferSize);
- }
-
- @Override
- public void onCarDisconnected() {
- //nothing to do
- }
-}
diff --git a/car-support-lib/src/android/support/car/media/CarAudioRecord.java b/car-support-lib/src/android/support/car/media/CarAudioRecord.java
deleted file mode 100644
index c3f09ca..0000000
--- a/car-support-lib/src/android/support/car/media/CarAudioRecord.java
+++ /dev/null
@@ -1,67 +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.support.car.media;
-
-import android.media.AudioRecord;
-import android.support.car.CarNotConnectedException;
-
-/**
- * Enables applications to use the microphone.
- */
-public abstract class CarAudioRecord {
- /**
- * Get the buffer size specified in {@link CarAudioManager#createCarAudioRecord(int)}.
- * @return Buffer size in bytes.
- */
- public abstract int getBufferSize() throws CarNotConnectedException;
-
- /**
- * Start audio recording.
- */
- public abstract void startRecording() throws CarNotConnectedException;
-
- /**
- * Stop audio recording. Calling stop multiple times is a safe operation.
- */
- public abstract void stop();
-
- /**
- * Release native resource allocated for this instance. {@link CarAudioRecord} can no longer
- * be used after release is called.
- */
- public abstract void release();
-
- /** See {@link AudioRecord#getRecordingState() }. */
- public abstract int getRecordingState() throws CarNotConnectedException;
-
- /** See {@link AudioRecord#getState() }. */
- public abstract int getState() throws CarNotConnectedException;
-
- /** See {@link AudioRecord#getAudioSessionId() }. */
- public abstract int getAudioSessionId() throws CarNotConnectedException;
-
- /**
- * Read recorded audio. Be sure to start audio recording with {@link #startRecording()}
- * before this.
- * @param audioData
- * @param offsetInBytes
- * @param sizeInBytes
- * @return Number of bytes read. Returns {@link android.media.AudioRecord#ERROR} on error.
- * @throws IllegalStateException if audio recording was not started.
- */
- public abstract int read(byte[] audioData, int offsetInBytes, int sizeInBytes)
- throws IllegalStateException, CarNotConnectedException;
-}
diff --git a/car-support-lib/src/android/support/car/media/CarAudioRecordEmbedded.java b/car-support-lib/src/android/support/car/media/CarAudioRecordEmbedded.java
deleted file mode 100644
index 7a614cc..0000000
--- a/car-support-lib/src/android/support/car/media/CarAudioRecordEmbedded.java
+++ /dev/null
@@ -1,87 +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.support.car.media;
-
-import static androidx.annotation.RestrictTo.Scope.GROUP_ID;
-
-import android.media.AudioFormat;
-import android.media.AudioRecord;
-import android.support.car.CarNotConnectedException;
-
-import androidx.annotation.RestrictTo;
-
-/**
- * CarAudioRecordEmbedded allows apps to use microphone.
- * @hide
- */
-@RestrictTo(GROUP_ID)
-public class CarAudioRecordEmbedded extends CarAudioRecord {
-
- private final AudioFormat mFormat;
- private final int mBufferSize;
- private final AudioRecord mAudioRecord;
-
-
- CarAudioRecordEmbedded(AudioFormat format, int bufferSize) {
- mFormat = format;
- mBufferSize = bufferSize;
- mAudioRecord = new AudioRecord.Builder()
- .setAudioFormat(mFormat)
- .setBufferSizeInBytes(mBufferSize)
- .build();
- }
-
- @Override
- public int getBufferSize() throws CarNotConnectedException {
- return mBufferSize;
- }
-
- @Override
- public void startRecording() throws CarNotConnectedException {
- mAudioRecord.startRecording();
- }
-
- @Override
- public void stop() {
- mAudioRecord.stop();
- }
-
- @Override
- public void release() {
- mAudioRecord.release();
- }
-
- @Override
- public int getRecordingState() throws CarNotConnectedException {
- return mAudioRecord.getRecordingState();
- }
-
- @Override
- public int getState() throws CarNotConnectedException {
- return mAudioRecord.getState();
- }
-
- @Override
- public int getAudioSessionId() throws CarNotConnectedException {
- return mAudioRecord.getAudioSessionId();
- }
-
- @Override
- public int read(byte[] audioData, int offsetInBytes, int sizeInBytes)
- throws CarNotConnectedException, IllegalStateException {
- return mAudioRecord.read(audioData, offsetInBytes, sizeInBytes);
- }
-}
diff --git a/car-support-lib/src/android/support/car/navigation/CarNavigationInstrumentCluster.java b/car-support-lib/src/android/support/car/navigation/CarNavigationInstrumentCluster.java
deleted file mode 100644
index 9f70ef0..0000000
--- a/car-support-lib/src/android/support/car/navigation/CarNavigationInstrumentCluster.java
+++ /dev/null
@@ -1,179 +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.support.car.navigation;
-
-import static androidx.annotation.RestrictTo.Scope.GROUP_ID;
-
-import android.os.Bundle;
-
-import androidx.annotation.IntDef;
-import androidx.annotation.Nullable;
-import androidx.annotation.RestrictTo;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * Holds options related to navigation for the car's instrument cluster.
- */
-public class CarNavigationInstrumentCluster {
-
- /** Navigation Next Turn messages contain an image, as well as an enum. */
- public static final int CLUSTER_TYPE_CUSTOM_IMAGES_SUPPORTED = 1;
- /** Navigation Next Turn messages contain only an enum. */
- public static final int CLUSTER_TYPE_IMAGE_CODES_ONLY = 2;
-
- /** @hide */
- @Retention(RetentionPolicy.SOURCE)
- @IntDef({
- CLUSTER_TYPE_CUSTOM_IMAGES_SUPPORTED,
- CLUSTER_TYPE_IMAGE_CODES_ONLY
- })
- public @interface ClusterType {}
-
- private int mMinIntervalMillis;
-
- @ClusterType
- private final int mType;
-
- private final int mImageWidth;
-
- private final int mImageHeight;
-
- private final int mImageColorDepthBits;
-
- private final Bundle mExtra;
-
- /** @hide */
- @RestrictTo(GROUP_ID)
- public static CarNavigationInstrumentCluster createCluster(int minIntervalMillis) {
- return new CarNavigationInstrumentCluster(minIntervalMillis, CLUSTER_TYPE_IMAGE_CODES_ONLY,
- 0, 0, 0);
- }
-
- /** @hide */
- @RestrictTo(GROUP_ID)
- public static CarNavigationInstrumentCluster createCustomImageCluster(int minIntervalMs,
- int imageWidth, int imageHeight, int imageColorDepthBits) {
- return new CarNavigationInstrumentCluster(minIntervalMs,
- CLUSTER_TYPE_CUSTOM_IMAGES_SUPPORTED,
- imageWidth, imageHeight, imageColorDepthBits);
- }
-
- /** Minimum time between instrument cluster updates in milliseconds.*/
- public int getMinIntervalMillis() {
- return mMinIntervalMillis;
- }
-
- /**
- * Type of instrument cluster, can be {@link #CLUSTER_TYPE_CUSTOM_IMAGES_SUPPORTED} or
- * {@link #CLUSTER_TYPE_IMAGE_CODES_ONLY}.
- */
- @ClusterType
- public int getType() {
- return mType;
- }
-
- /**
- * If instrument cluster is image, width of instrument cluster in pixels.
- * @return the width of the image in pixels, 0 otherwise.
- */
- public int getImageWidth() {
- return mImageWidth;
- }
-
- /**
- * If instrument cluster is image, height of instrument cluster in pixels.
- * @return the width of the image in pixels, 0 otherwise.
- */
- public int getImageHeight() {
- return mImageHeight;
- }
-
- /**
- * Contains extra information about instrument cluster.
- * @hide
- */
- public Bundle getExtra() { return mExtra; }
-
- /**
- * @return If instrument cluster is image, number of bits of colour depth it supports (8, 16,
- * or 32), 0 otherwise.
- */
- public int getImageColorDepthBits() {
- return mImageColorDepthBits;
- }
-
- /** @hide */
- @RestrictTo(GROUP_ID)
- public CarNavigationInstrumentCluster(CarNavigationInstrumentCluster that) {
- this(that.mMinIntervalMillis,
- that.mType,
- that.mImageWidth,
- that.mImageHeight,
- that.mImageColorDepthBits);
- }
-
- /**
- * Whether cluster support custom images or not. If not generally the cluster will provide
- * its own images.
- * @return True if supported, false otherwise.
- */
- public boolean supportsCustomImages() {
- return mType == CLUSTER_TYPE_CUSTOM_IMAGES_SUPPORTED;
- }
-
- /** @hide */
- @RestrictTo(GROUP_ID)
- CarNavigationInstrumentCluster(
- int minIntervalMillis,
- @ClusterType int type,
- int imageWidth,
- int imageHeight,
- int imageColorDepthBits) {
- this(minIntervalMillis, type, imageWidth, imageHeight, imageColorDepthBits, null);
- }
-
- /** @hide */
- @RestrictTo(GROUP_ID)
- CarNavigationInstrumentCluster(
- int minIntervalMillis,
- @ClusterType int type,
- int imageWidth,
- int imageHeight,
- int imageColorDepthBits,
- @Nullable Bundle extra) {
- mMinIntervalMillis = minIntervalMillis;
- mType = type;
- mImageWidth = imageWidth;
- mImageHeight = imageHeight;
- mImageColorDepthBits = imageColorDepthBits;
- mExtra = extra == null ? new Bundle() : new Bundle(extra);
- }
-
-
- /** Converts to string for debug purpose. */
- @Override
- public String toString() {
- return CarNavigationInstrumentCluster.class.getSimpleName() + "{ " +
- "minIntervalMillis: " + mMinIntervalMillis + ", " +
- "type: " + mType + ", " +
- "imageWidth: " + mImageWidth + ", " +
- "imageHeight: " + mImageHeight + ", " +
- "imageColourDepthBits: " + mImageColorDepthBits + ", " +
- "extra: " + mExtra + " }";
- }
-}
diff --git a/car-support-lib/src/android/support/car/navigation/CarNavigationStatusManager.java b/car-support-lib/src/android/support/car/navigation/CarNavigationStatusManager.java
deleted file mode 100644
index 3583827..0000000
--- a/car-support-lib/src/android/support/car/navigation/CarNavigationStatusManager.java
+++ /dev/null
@@ -1,307 +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.support.car.navigation;
-
-import android.annotation.IntDef;
-import android.graphics.Bitmap;
-import android.os.Bundle;
-import android.support.car.CarManagerBase;
-import android.support.car.CarNotConnectedException;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * APIs for providing navigation status to the instrument cluster. For cars that have a navigation
- * display built into the instrument cluster, a navigation application should also provide
- * turn-by-turn information to the cluster through this manager.
- * <p/>
- * Navigation applications should first call
- * {@link android.support.car.CarAppFocusManager#requestAppFocus(int,
- * android.support.car.CarAppFocusManager.OnAppFocusOwnershipCallback)} and request
- * {@link android.support.car.CarAppFocusManager#APP_FOCUS_TYPE_NAVIGATION}.
- * <p/>
- * After navigation focus is granted, applications should call {@code
- * sendNavigationStatus(STATUS_ACTIVE);} to initialize the cluster and let it know the app will be
- * sending turn events. Then, for each turn of the turn-by-turn guidance, the app calls {@link
- * #sendNavigationTurnEvent(int, CharSequence, int, int, int)}; this sends image data to the cluster
- * (and is why that data is not sent in subsequent turn distance events). To update the distance
- * and time to the next turn, the app should make periodic calls to {@link
- * #sendNavigationTurnDistanceEvent(int, int, int, int)}.
- * <p/>
- * Calling {@code sendNavigationStatus(STATUS_INACTIVE);} when the route is completed allows the
- * car to use the cluster panel for other data (such as media, weather, etc.) and is what a well
- * behaved app is expected to do.
- */
-public abstract class CarNavigationStatusManager implements CarManagerBase {
-
- /**
- * Listener for navigation related events. Callbacks are called in the Looper context.
- */
- public interface CarNavigationCallback {
- /**
- * Instrument Cluster started in navigation mode.
- * @param manager The manager the callback is attached to. Useful if the app wishes to
- * unregister.
- * @param instrumentCluster An object describing the configuration and state of the car's
- * navigation instrument cluster.
- */
- void onInstrumentClusterStarted(CarNavigationStatusManager manager,
- CarNavigationInstrumentCluster instrumentCluster);
-
- /**
- * Instrument cluster ended.
- * @param manager The manager the callback is attached to. Useful if the app wished to
- * unregister.
- */
- void onInstrumentClusterStopped(CarNavigationStatusManager manager);
- }
-
- /* Navigation statuses */
- /** @hide */
- public static final int STATUS_UNAVAILABLE = 0;
- /** @hide */
- public static final int STATUS_ACTIVE = 1;
- /** @hide */
- public static final int STATUS_INACTIVE = 2;
-
- /** @hide */
- @IntDef({
- STATUS_UNAVAILABLE,
- STATUS_ACTIVE,
- STATUS_INACTIVE
- })
- @Retention(RetentionPolicy.SOURCE)
- public @interface Status {}
-
- /* Turn Types */
- /** @hide */
- public static final int TURN_UNKNOWN = 0;
- /** @hide */
- public static final int TURN_DEPART = 1;
- /** @hide */
- public static final int TURN_NAME_CHANGE = 2;
- /** @hide */
- public static final int TURN_SLIGHT_TURN = 3;
- /** @hide */
- public static final int TURN_TURN = 4;
- /** @hide */
- public static final int TURN_SHARP_TURN = 5;
- /** @hide */
- public static final int TURN_U_TURN = 6;
- /** @hide */
- public static final int TURN_ON_RAMP = 7;
- /** @hide */
- public static final int TURN_OFF_RAMP = 8;
- /** @hide */
- public static final int TURN_FORK = 9;
- /** @hide */
- public static final int TURN_MERGE = 10;
- /** @hide */
- public static final int TURN_ROUNDABOUT_ENTER = 11;
- /** @hide */
- public static final int TURN_ROUNDABOUT_EXIT = 12;
- /** @hide */
- public static final int TURN_ROUNDABOUT_ENTER_AND_EXIT = 13;
- /** @hide */
- public static final int TURN_STRAIGHT = 14;
- /** @hide */
- public static final int TURN_FERRY_BOAT = 16;
- /** @hide */
- public static final int TURN_FERRY_TRAIN = 17;
- /** @hide */
- public static final int TURN_DESTINATION = 19;
-
- /** @hide */
- @IntDef({
- TURN_UNKNOWN,
- TURN_DEPART,
- TURN_NAME_CHANGE,
- TURN_SLIGHT_TURN,
- TURN_TURN,
- TURN_SHARP_TURN,
- TURN_U_TURN,
- TURN_ON_RAMP,
- TURN_OFF_RAMP,
- TURN_FORK,
- TURN_MERGE,
- TURN_ROUNDABOUT_ENTER,
- TURN_ROUNDABOUT_EXIT,
- TURN_ROUNDABOUT_ENTER_AND_EXIT,
- TURN_STRAIGHT,
- TURN_FERRY_BOAT,
- TURN_FERRY_TRAIN,
- TURN_DESTINATION
- })
- @Retention(RetentionPolicy.SOURCE)
- public @interface TurnEvent {}
-
- /** @hide */
- public static final int TURN_SIDE_LEFT = 1;
- /** @hide */
- public static final int TURN_SIDE_RIGHT = 2;
- /** @hide */
- public static final int TURN_SIDE_UNSPECIFIED = 3;
-
- /** @hide */
- @IntDef({
- TURN_SIDE_LEFT,
- TURN_SIDE_RIGHT,
- TURN_SIDE_UNSPECIFIED
- })
- public @interface TurnSide {}
-
- /** @hide */
- public static final int DISTANCE_METERS = 1;
- /** @hide */
- public static final int DISTANCE_KILOMETERS = 2;
- /** @hide */
- public static final int DISTANCE_MILES = 3;
- /** @hide */
- public static final int DISTANCE_FEET = 4;
- /** @hide */
- public static final int DISTANCE_YARDS = 5;
-
- /** @hide */
- @IntDef({
- DISTANCE_METERS,
- DISTANCE_KILOMETERS,
- DISTANCE_MILES,
- DISTANCE_FEET,
- DISTANCE_YARDS
- })
- public @interface DistanceUnit {}
-
- /**
- * Event type that holds information about next maneuver.
- * @hide
- */
- public static final int EVENT_TYPE_NEXT_MANEUVER_INFO = 1;
- /**
- * Event type that holds information regarding distance/time to the next maneuver.
- * @hide
- */
- public static final int EVENT_TYPE_NEXT_MANEUVER_COUNTDOWN = 2;
- /**
- * All custom (vendor-specific) event types should be equal or greater than this constant.
- * @hide
- */
- public static final int EVENT_TYPE_VENDOR_FIRST = 1024;
-
- /**
- * Inform the instrument cluster if navigation is active or not.
- * @param status New instrument cluster navigation status, one of the STATUS_* constants in
- * this class.
- * @throws CarNotConnectedException if the connection to the car service has been lost.
- *
- * @deprecated Use {@link #sendEvent(int, Bundle)} instead.
- * @hide
- */
- @Deprecated
- public abstract void sendNavigationStatus(@Status int status) throws CarNotConnectedException;
-
- /**
- * Send a Navigation Next Step event to the car.
- * <p/>
- * Roundabout Example: In a roundabout with four, evenly spaced exits, the
- * first exit is turnNumber=1, turnAngle=90; the second exit is turnNumber=2,
- * turnAngle=180; the third exit is turnNumber=3, turnAngle=270. turnNumber and turnAngle are
- * counted in the direction of travel around the roundabout (clockwise for roads where the car
- * drives on the left side of the road, such as Australia; counter-clockwise for roads
- * where the car drives on the right side of the road, such as the USA).
- *
- * @param turnEvent Turn event type ({@link #TURN_TURN}, {@link #TURN_U_TURN}, {@link
- * #TURN_ROUNDABOUT_ENTER_AND_EXIT}, etc).
- * @param eventName Name of the turn event like road name to turn. For example "Charleston road"
- * in "Turn right to Charleston road"
- * @param turnAngle Turn angle in degrees between the roundabout entry and exit (0..359). Used
- * only for event type {@link #TURN_ROUNDABOUT_ENTER_AND_EXIT}. -1 if unused.
- * @param turnNumber Turn number, counting from the roundabout entry to the exit. Used only
- * for event type {@link #TURN_ROUNDABOUT_ENTER_AND_EXIT}. -1 if unused.
- * @param turnSide Turn side ({@link #TURN_SIDE_LEFT}, {@link #TURN_SIDE_RIGHT} or {@link
- * #TURN_SIDE_UNSPECIFIED}).
- * @throws CarNotConnectedException if the connection to the car service has been lost.
- *
- * @deprecated Use {@link #sendEvent(int, Bundle)} instead.
- * @hide
- */
- @Deprecated
- public abstract void sendNavigationTurnEvent(@TurnEvent int turnEvent, CharSequence eventName,
- int turnAngle, int turnNumber, @TurnSide int turnSide) throws CarNotConnectedException;
-
- /**
- * Same as the public version ({@link #sendNavigationTurnEvent(int, CharSequence, int, int,
- * Bitmap, int)}) except a custom image can be sent to the cluster. See documentation for that
- * method.
- *
- * @param image image to be shown in the instrument cluster. Null if instrument cluster type is
- * {@link CarNavigationInstrumentCluster.ClusterType#CLUSTER_TYPE_IMAGE_CODES_ONLY}, or if
- * the image parameters are malformed (length or width non-positive, or illegal
- * imageColorDepthBits) in the initial NavigationStatusService call.
- *
- * @hide only first party applications may send a custom image to the cluster.
- * @deprecated Use {@link #sendEvent(int, Bundle)} instead.
- */
- @Deprecated
- public abstract void sendNavigationTurnEvent(@TurnEvent int turnEvent, CharSequence eventName,
- int turnAngle, int turnNumber, Bitmap image, @TurnSide int turnSide)
- throws CarNotConnectedException;
-
- /**
- * Send a Navigation Next Step Distance event to the car.
- *
- * @param distanceMeters Distance to next event in meters.
- * @param timeSeconds Time to next event in seconds.
- * @param displayDistanceMillis Distance to the next event formatted as it will be displayed by
- * the calling app, in milli-units. For example, 1.25 should be supplied as 1250.
- * @param displayDistanceUnit Unit type to use on of the DISTANCE_* types defined in this
- * file.
- * @returns {@code true} if successful.
- * @throws CarNotConnectedException if the connection to the car service has been lost.
- *
- * @deprecated Use {@link #sendEvent(int, Bundle)} instead.
- * @hide
- */
- @Deprecated
- public abstract void sendNavigationTurnDistanceEvent(int distanceMeters, int timeSeconds,
- int displayDistanceMillis, int displayDistanceUnit) throws CarNotConnectedException;
-
- /**
- * Sends events from navigation app to instrument cluster.
- *
- * @param eventType event type, the value could be either
- * {@link #EVENT_TYPE_NEXT_MANEUVER_INFO}, {@link #EVENT_TYPE_NEXT_MANEUVER_COUNTDOWN}, or
- * vendor-specific code.
- *
- * @param bundle object that holds data about the event
- * @throws CarNotConnectedException if the connection to the car service has been lost.
- */
- public abstract void sendEvent(int eventType, Bundle bundle)
- throws CarNotConnectedException;
-
- /**
- * @param callback {@link CarNavigationCallback} to be registered, replacing any existing
- * listeners.
- * @throws CarNotConnectedException if the connection to the car service has been lost.
- */
- public abstract void addListener(CarNavigationCallback callback)
- throws CarNotConnectedException;
-
- /**
- * Unregister the {@link CarNavigationCallback} associated with this instance.
- */
- public abstract void removeListener();
-}
diff --git a/car-support-lib/src/android/support/car/navigation/CarNavigationStatusManagerEmbedded.java b/car-support-lib/src/android/support/car/navigation/CarNavigationStatusManagerEmbedded.java
deleted file mode 100644
index 4ab5ec6..0000000
--- a/car-support-lib/src/android/support/car/navigation/CarNavigationStatusManagerEmbedded.java
+++ /dev/null
@@ -1,105 +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.support.car.navigation;
-
-import android.graphics.Bitmap;
-import android.os.Bundle;
-import android.support.car.CarNotConnectedException;
-
-/**
- * @hide
- */
-public class CarNavigationStatusManagerEmbedded extends CarNavigationStatusManager {
-
- private final android.car.navigation.CarNavigationStatusManager mManager;
-
- public CarNavigationStatusManagerEmbedded(Object manager) {
- mManager = (android.car.navigation.CarNavigationStatusManager) manager;
- }
-
- /**
- * @param status new instrument cluster navigation status.
- * @throws CarNotConnectedException if the connection to the car service has been lost.
- */
- @Override
- public void sendNavigationStatus(int status) throws CarNotConnectedException {
- // Not implemented in embedded.
- }
-
- @Override
- public void sendNavigationTurnEvent(int event, CharSequence eventName, int turnAngle,
- int turnNumber, int turnSide) throws CarNotConnectedException {
- // Not implemented in embedded.
- }
-
- @Override
- public void sendNavigationTurnEvent(int event, CharSequence eventName, int turnAngle,
- int turnNumber, Bitmap image, int turnSide) throws CarNotConnectedException {
- // Not implemented in embedded.
- }
-
- @Override
- public void sendNavigationTurnDistanceEvent(int distanceMeters, int timeSeconds,
- int displayDistanceMillis, int displayDistanceUnit) throws CarNotConnectedException {
- // Not implemented in embedded.
- }
-
- @Override
- public void sendEvent(int eventType, Bundle bundle) throws CarNotConnectedException {
- try {
- mManager.sendEvent(eventType, bundle);
- } catch (android.car.CarNotConnectedException e) {
- throw new CarNotConnectedException(e);
- }
- }
-
- @Override
- public void onCarDisconnected() {
- //nothing to do
- }
-
- /**
- * In this implementation we just immediately call {@code listener#onInstrumentClusterStarted}
- * as we expect instrument cluster to be working all the time.
- *
- * @throws CarNotConnectedException if the connection to the car service has been lost.
- */
- @Override
- public void addListener(CarNavigationCallback callback)
- throws CarNotConnectedException {
-
- try {
- callback.onInstrumentClusterStarted(this, convert(mManager.getInstrumentClusterInfo()));
- } catch (android.car.CarNotConnectedException e) {
- throw new CarNotConnectedException(e);
- }
- }
-
- @Override
- public void removeListener() {
- // Nothing to do.
- }
-
- private static CarNavigationInstrumentCluster convert(
- android.car.navigation.CarNavigationInstrumentCluster ic) {
- if (ic == null) {
- return null;
- }
- return new CarNavigationInstrumentCluster(ic.getMinIntervalMillis(), ic.getType(),
- ic.getImageWidth(), ic.getImageHeight(), ic.getImageColorDepthBits(),
- ic.getExtra());
- }
-}
diff --git a/car-usb-handler/AndroidManifest.xml b/car-usb-handler/AndroidManifest.xml
index be64f82..7803318 100644
--- a/car-usb-handler/AndroidManifest.xml
+++ b/car-usb-handler/AndroidManifest.xml
@@ -23,7 +23,11 @@
android:directBootAware="true" >
<activity android:name=".UsbHostManagementActivity"
android:theme="@android:style/Theme.Material.Light.Dialog"
- android:launchMode="singleTop" />
+ android:launchMode="singleTop">
+ <meta-data
+ android:name="distractionOptimized"
+ android:value="true" />
+ </activity>
<receiver android:name=".BootUsbScanner" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
diff --git a/car-usb-handler/res/layout/usb_host.xml b/car-usb-handler/res/layout/usb_host.xml
index fbcc608..7a13c4f 100644
--- a/car-usb-handler/res/layout/usb_host.xml
+++ b/car-usb-handler/res/layout/usb_host.xml
@@ -28,7 +28,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
- android:text="@+string/usb_resolving_handlers"
+ android:text="@string/usb_resolving_handlers"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" />
diff --git a/car-usb-handler/res/values-af/strings.xml b/car-usb-handler/res/values-af/strings.xml
new file mode 100644
index 0000000..f09d44c
--- /dev/null
+++ b/car-usb-handler/res/values-af/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"USB-hanteerder"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Gestoorde toestelle"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"Verwyder hanteringprogram vir USB-toestel"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"Is jy seker jy wil verstekhanteringprogram vir %1$s uitvee?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Ja"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Kanselleer"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Kry tans gesteunde hanteerders"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Onbekende USB-toestel"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-am/strings.xml b/car-usb-handler/res/values-am/strings.xml
new file mode 100644
index 0000000..5564940
--- /dev/null
+++ b/car-usb-handler/res/values-am/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"ዩኤስቢ መያዣ"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"የተቀመጡ መሣሪያዎች"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"ለዩኤስቢ መሣሪያ ማስተናገጃ መተግበሪያን አስወግድ"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"ለ %1$s ነባሪ መያዣ መተግበሪያን ለመሰረዝ እንደሚፈልጉ እርግጠኛ ነዎት?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"አዎ"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"ይቅር"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"የሚደገፉ መያዣዎችን በማግኘት ላይ"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"የማይታወቅ የዩኤስቢ መሣሪያ"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-ar/strings.xml b/car-usb-handler/res/values-ar/strings.xml
new file mode 100644
index 0000000..15c6e5a
--- /dev/null
+++ b/car-usb-handler/res/values-ar/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"معالج USB"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"الأجهزة المحفوظة"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"إزالة تطبيق التناول في جهاز USB"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"هل تريد فعلاً حذف تطبيق التناول التلقائي في %1$s؟"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"نعم"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"إلغاء"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"الحصول على معالجات متوافقة"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"جهاز USB غير معروف"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-as/strings.xml b/car-usb-handler/res/values-as/strings.xml
new file mode 100644
index 0000000..e1a4dac
--- /dev/null
+++ b/car-usb-handler/res/values-as/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"ইউএছবি হেণ্ডলাৰ"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"ছেভ কৰি থোৱা ডিভাইচ"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"ইউএছবি ডিভাইচ পৰিচালনা কৰা এপ্ আঁতৰাওক"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"আপুনি %1$sৰ বাবে থকা ডিফ’ল্ট পৰিচালক এপটো মচিব বিচৰাটো নিশ্চিতনে?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"হয়"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"বাতিল কৰক"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"সমৰ্থিত হেণ্ডলাৰসমূহ গোটোৱা হৈছে"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"অজ্ঞাত ইউএছবি ডিভাইচ"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-az/strings.xml b/car-usb-handler/res/values-az/strings.xml
new file mode 100644
index 0000000..7a61e6e
--- /dev/null
+++ b/car-usb-handler/res/values-az/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"USB İdarəedici"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Yadda saxlanmış cihazlar"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"USB cihazı üçün idarəetmə tətbiqini silmək"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"%1$s üçün defolt idarəetmə tətbiqini silmək istədiyinizə əminsiniz?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Bəli"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Ləğv edin"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Dəstəklənən idarəedicilərin əldə edilməsi"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Naməlum USB cihazı"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-b+sr+Latn/strings.xml b/car-usb-handler/res/values-b+sr+Latn/strings.xml
new file mode 100644
index 0000000..d58180f
--- /dev/null
+++ b/car-usb-handler/res/values-b+sr+Latn/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"Aplikacija za upravljanje USB-om"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Sačuvani uređaji"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"Uklonite aplikacije za upravljanje za USB uređaj"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"Želite li stvarno da izbrišete podrazumevanu aplikaciju za upravljanje za %1$s?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Da"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Otkaži"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Preuzimaju se podržane aplikacije za upravljanje"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Nepoznat USB uređaj"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-be/strings.xml b/car-usb-handler/res/values-be/strings.xml
new file mode 100644
index 0000000..d655db9
--- /dev/null
+++ b/car-usb-handler/res/values-be/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"Апрацоўшчык USB"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Захаваныя прылады"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"Выдаленне праграмы для працы з USB-прыладай"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"Выдаліць стандартную праграму для працы з прыладай \"%1$s\"?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Так"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Скасаваць"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Усталёўваюцца апрацоўшчыкі, якія падтрымліваюцца"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Невядомая USB-прылада"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-bg/strings.xml b/car-usb-handler/res/values-bg/strings.xml
new file mode 100644
index 0000000..241e281
--- /dev/null
+++ b/car-usb-handler/res/values-bg/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"Манипулатор за USB"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Запазени устройства"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"Премахване на приложението манипулатор за USB устройството"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"Наистина ли искате да изтриете стандартното приложение манипулатор за %1$s?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Да"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Отказ"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Поддържаните манипулатори се изтеглят"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Неизвестно USB устройство"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-bn/strings.xml b/car-usb-handler/res/values-bn/strings.xml
new file mode 100644
index 0000000..6686288
--- /dev/null
+++ b/car-usb-handler/res/values-bn/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"ইউএসবি হ্যান্ডলার"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"সেভ করা ডিভাইস"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"ইউএসবি ডিভাইস থেকে হ্যান্ডলিং অ্যাপ সরান"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"আপনি কি %1$s-এর ডিফল্ট হ্যান্ডলিং অ্যাপ মুছে ফেলা সম্পর্কে নিশ্চিত?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"হ্যাঁ"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"বাতিল করুন"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"ব্যবহারযোগ্য হ্যান্ডলার নিয়ে আসা হচ্ছে"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"অজানা ইউএসবি ডিভাইস"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-bs/strings.xml b/car-usb-handler/res/values-bs/strings.xml
new file mode 100644
index 0000000..b98e5b8
--- /dev/null
+++ b/car-usb-handler/res/values-bs/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"Rukovatelj USB-om"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Sačuvani uređaji"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"Uklonite upravljačku aplikaciju za USB uređaj"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"Jeste li sigurni da želite izbrisati zadanu aplikaciju za rukovanje za %1$s?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Da"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Otkaži"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Pribavljanje kompatibilnih upravljačkih programa"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Nepoznat USB uređaj"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-ca/strings.xml b/car-usb-handler/res/values-ca/strings.xml
new file mode 100644
index 0000000..6e6c96e
--- /dev/null
+++ b/car-usb-handler/res/values-ca/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"Gestor USB"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Dispositius desats"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"Suprimeix l\'aplicació de gestió del dispositiu USB"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"Confirmes que vols suprimir l\'aplicació de gestió predeterminada per a %1$s?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Sí"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Cancel·la"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Obtenció de gestors admesos"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Dispositiu USB desconegut"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-cs/strings.xml b/car-usb-handler/res/values-cs/strings.xml
new file mode 100644
index 0000000..5e7ee0c
--- /dev/null
+++ b/car-usb-handler/res/values-cs/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"Obslužný nástroj USB"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Uložená zařízení"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"Odstranit obslužnou aplikaci zařízení USB"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"Opravdu chcete výchozí obslužnou aplikaci pro %1$s vymazat?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Ano"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Zrušit"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Načítání podporovaných obslužných nástrojů"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Neznámé zařízení USB"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-da/strings.xml b/car-usb-handler/res/values-da/strings.xml
new file mode 100644
index 0000000..ebf1531
--- /dev/null
+++ b/car-usb-handler/res/values-da/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"USB-handler"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Gemte enheder"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"Fjern håndteringsapp for USB-enhed"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"Er du sikker på, at du vil slette standardhåndteringsappen for %1$s?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Ja"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Annuller"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Hentning af understøttede handlere"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Ukendt USB-enhed"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-de/strings.xml b/car-usb-handler/res/values-de/strings.xml
new file mode 100644
index 0000000..fb1313a
--- /dev/null
+++ b/car-usb-handler/res/values-de/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"USB-Handler"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Gespeicherte Geräte"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"USB-Handler-App entfernen"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"Möchtest du die Standard-App für %1$s wirklich löschen?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Ja"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Abbrechen"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Unterstützte Handler erhalten"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Unbekanntes USB-Gerät"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-el/strings.xml b/car-usb-handler/res/values-el/strings.xml
new file mode 100644
index 0000000..88ac995
--- /dev/null
+++ b/car-usb-handler/res/values-el/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"Δείκτης χειρισμού USB"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Αποθηκευμένες συσκευές"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"Κατάργηση εφαρμογής χειρισμού για συσκευή USB"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"Είστε βέβαιοι ότι θέλετε να διαγράψετε την προεπιλεγμένη εφαρμογή χειρισμού για το %1$s;"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Ναι"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Ακύρωση"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Λήψη υποστηριζόμενων δεικτών χειρισμού"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Άγνωστη συσκευή USB"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-en-rAU/strings.xml b/car-usb-handler/res/values-en-rAU/strings.xml
new file mode 100644
index 0000000..16d80ef
--- /dev/null
+++ b/car-usb-handler/res/values-en-rAU/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"USB Handler"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Saved devices"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"Remove handling app for USB device"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"Are you sure that you want to delete default handling app for %1$s?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Yes"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Cancel"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Getting supported handlers"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Unknown USB device"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-en-rCA/strings.xml b/car-usb-handler/res/values-en-rCA/strings.xml
new file mode 100644
index 0000000..16d80ef
--- /dev/null
+++ b/car-usb-handler/res/values-en-rCA/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"USB Handler"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Saved devices"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"Remove handling app for USB device"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"Are you sure that you want to delete default handling app for %1$s?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Yes"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Cancel"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Getting supported handlers"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Unknown USB device"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-en-rGB/strings.xml b/car-usb-handler/res/values-en-rGB/strings.xml
new file mode 100644
index 0000000..16d80ef
--- /dev/null
+++ b/car-usb-handler/res/values-en-rGB/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"USB Handler"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Saved devices"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"Remove handling app for USB device"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"Are you sure that you want to delete default handling app for %1$s?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Yes"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Cancel"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Getting supported handlers"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Unknown USB device"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-en-rIN/strings.xml b/car-usb-handler/res/values-en-rIN/strings.xml
new file mode 100644
index 0000000..16d80ef
--- /dev/null
+++ b/car-usb-handler/res/values-en-rIN/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"USB Handler"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Saved devices"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"Remove handling app for USB device"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"Are you sure that you want to delete default handling app for %1$s?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Yes"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Cancel"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Getting supported handlers"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Unknown USB device"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-en-rXC/strings.xml b/car-usb-handler/res/values-en-rXC/strings.xml
new file mode 100644
index 0000000..0eb177b
--- /dev/null
+++ b/car-usb-handler/res/values-en-rXC/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"USB Handler"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Saved devices"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"Remove handling app for USB device"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"Are you sure you wan to delete dafault handling app for %1$s?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Yes"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Cancel"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Getting supported handlers"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Unknown USB device"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-es-rUS/strings.xml b/car-usb-handler/res/values-es-rUS/strings.xml
new file mode 100644
index 0000000..08d7396
--- /dev/null
+++ b/car-usb-handler/res/values-es-rUS/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"Controlador de USB"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Dispositivos guardados"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"Quitar la app de control del dispositivo USB"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"¿Estás seguro de que quieres borrar la app de control predeterminada para %1$s?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Sí"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Cancelar"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Obteniendo controladores compatibles"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Dispositivo USB desconocido"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-es/strings.xml b/car-usb-handler/res/values-es/strings.xml
new file mode 100644
index 0000000..a3e746a
--- /dev/null
+++ b/car-usb-handler/res/values-es/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"Controlador USB"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Dispositivos guardados"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"Quitar aplicación de gestión de dispositivo USB"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"¿Seguro que quieres eliminar la aplicación de gestión predeterminada de %1$s?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Sí"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Cancelar"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Obtener controladores compatibles"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Dispositivo USB desconocido"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-et/strings.xml b/car-usb-handler/res/values-et/strings.xml
new file mode 100644
index 0000000..31e2907
--- /dev/null
+++ b/car-usb-handler/res/values-et/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"USB-töötleja"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Salvestatud seadmed"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"USB-seadme töötlemisrakenduse eemaldamine"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"Kas soovite kindlasti kustutada üksuse %1$s vaiketöötlemisrakenduse?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Jah"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Tühista"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Toetatud töötlejate hankimine"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Tundmatu USB-seade"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-eu/strings.xml b/car-usb-handler/res/values-eu/strings.xml
new file mode 100644
index 0000000..b3459a5
--- /dev/null
+++ b/car-usb-handler/res/values-eu/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"USB kudeatzailea"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Gordetako gailuak"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"Kendu USB gailua kudeatzen ari den aplikazioa"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"Ziur %1$s gailua kudeatzeko aplikazio lehenetsia ezabatu nahi duzula?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Bai"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Utzi"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Kudeatzaile bateragarriak eskuratzen"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"USB gailu ezezaguna"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-fa/strings.xml b/car-usb-handler/res/values-fa/strings.xml
new file mode 100644
index 0000000..07bce7a
--- /dev/null
+++ b/car-usb-handler/res/values-fa/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"کنترلکننده USB"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"دستگاههای ذخیرهشده"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"برداشتن برنامه کنترل برای دستگاه USB"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"مطمئن هستید میخواهید برنامه کنترل پیشفرض را برای %1$s حذف کنید؟"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"بله"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"لغو"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"دریافت کنترلکنندههای پشتیبانیشده"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"دستگاه USB ناشناس"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-fi/strings.xml b/car-usb-handler/res/values-fi/strings.xml
new file mode 100644
index 0000000..d6adadf
--- /dev/null
+++ b/car-usb-handler/res/values-fi/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"USB-käsittelijä"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Tallennetut laitteet"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"poistaa USB-laitteen käsittelysovelluksen"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"Haluatko varmasti poistaa käsittelyn oletussovelluksen (%1$s)?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Kyllä"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Peruuta"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Haetaan tuettuja käsittelijöitä"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Tuntematon USB-laite"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-fr-rCA/strings.xml b/car-usb-handler/res/values-fr-rCA/strings.xml
new file mode 100644
index 0000000..47bb880
--- /dev/null
+++ b/car-usb-handler/res/values-fr-rCA/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"Gestionnaire USB"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Appareils enregistrés"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"Supprimer l\'application de gestion de l\'appareil USB"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"Voulez-vous vraiment supprimer l\'application de gestion par défaut pour %1$s?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Oui"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Annuler"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Obtention de gestionnaires compatibles"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Appareil USB inconnu"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-fr/strings.xml b/car-usb-handler/res/values-fr/strings.xml
new file mode 100644
index 0000000..821d5de
--- /dev/null
+++ b/car-usb-handler/res/values-fr/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"Gestionnaire USB"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Périphériques enregistrés"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"Supprimer l\'application de gestion du périphérique USB"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"Voulez-vous vraiment supprimer l\'application de gestion par défaut pour %1$s ?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Oui"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Annuler"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Obtenir des gestionnaires compatibles"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Périphérique USB non reconnu"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-gl/strings.xml b/car-usb-handler/res/values-gl/strings.xml
new file mode 100644
index 0000000..6646096
--- /dev/null
+++ b/car-usb-handler/res/values-gl/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"Controlador de USB"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Dispositivos gardados"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"Quitar a aplicación de xestión do dispositivo USB"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"Seguro que queres eliminar a aplicación de control predeterminada para %1$s?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Si"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Cancelar"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Obter controladores compatibles"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Dispositivo USB descoñecido"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-gu/strings.xml b/car-usb-handler/res/values-gu/strings.xml
new file mode 100644
index 0000000..217bd6a
--- /dev/null
+++ b/car-usb-handler/res/values-gu/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"USB હૅન્ડલર"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"સાચવેલ ડિવાઇસ"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"USB ડિવાઇસ માટે હૅન્ડલિંગ ઍપ કાઢી નાખો"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"શું તમે ખરેખર ડિફૉલ્ટ હેન્ડલિંગ ઍપ્લિકેશન %1$s માટે કાઢી નાખવા માગો છો?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"હા"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"રદ કરો"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"સમર્થિત હૅન્ડલર મેળવી રહ્યાં છીએ"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"અજ્ઞાત USB ડિવાઇસ"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-hi/strings.xml b/car-usb-handler/res/values-hi/strings.xml
new file mode 100644
index 0000000..aba6708
--- /dev/null
+++ b/car-usb-handler/res/values-hi/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"यूएसबी हैंडलर"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"सेव किए गए डिवाइस"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"यूएसबी डिवाइस को हैंडल करने वाला ऐप्लिकेशन हटाएं"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"क्या आप वाकई %1$s को हैंडल करने वाला डिफ़ॉल्ट ऐप्लिकेशन मिटाना चाहते हैं?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"हां"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"रद्द करें"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"साथ काम करने वाले हैंडलर ला सकता है"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"अनजान यूएसबी डिवाइस"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-hr/strings.xml b/car-usb-handler/res/values-hr/strings.xml
new file mode 100644
index 0000000..9844549
--- /dev/null
+++ b/car-usb-handler/res/values-hr/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"Rukovatelj USB-om"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Spremljeni uređaji"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"Uklanjanje aplikacije za rukovanje za USB uređaj"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"Jeste li sigurni da želite izbrisati zadanu aplikaciju za rukovanje za %1$s?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Da"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Odustani"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Dohvaćanje podržanih rukovatelja"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Nepoznati USB uređaj"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-hu/strings.xml b/car-usb-handler/res/values-hu/strings.xml
new file mode 100644
index 0000000..a9908ce
--- /dev/null
+++ b/car-usb-handler/res/values-hu/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"USB-kezelő"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Mentett eszközök"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"USB-eszközt kezelő alkalmazás eltávolítása"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"Biztosan törölni szeretné a(z) %1$s alapértelmezett kezelőalkalmazását?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Igen"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Mégse"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Támogatott kezelők lekérése…"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Ismeretlen USB-eszköz"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-hy/strings.xml b/car-usb-handler/res/values-hy/strings.xml
new file mode 100644
index 0000000..f203930
--- /dev/null
+++ b/car-usb-handler/res/values-hy/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"USB մշակիչ"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Պահված սարքեր"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"Հեռացնել USB սարքի հետ աշխատելու համար հավելվածը"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"Ջնջե՞լ %1$s սարքի հետ աշխատելու կանխադրված հավելվածը:"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Այո"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Չեղարկել"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Աջակցվող մշակիչների տեղադրում"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Անհայտ USB սարք"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-in/strings.xml b/car-usb-handler/res/values-in/strings.xml
new file mode 100644
index 0000000..5542bcc
--- /dev/null
+++ b/car-usb-handler/res/values-in/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"Pengendali USB"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Perangkat yang disimpan"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"Menghapus aplikasi penanganan untuk perangkat USB"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"Yakin ingin menghapus aplikasi penanganan default untuk %1$s?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Ya"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Batal"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Mendapatkan pengendali yang didukung"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Perangkat USB tidak diketahui"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-is/strings.xml b/car-usb-handler/res/values-is/strings.xml
new file mode 100644
index 0000000..a524ff1
--- /dev/null
+++ b/car-usb-handler/res/values-is/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"USB-hjálparforrit"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Vistuð tæki"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"Fjarlægja umsjónarforrit fyrir USB-tæki"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"Viltu örugglega eyða sjálfgefnu umsjónarforriti fyrir %1$s?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Já"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Hætta við"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Sækir studd hjálparforrit"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Óþekkt USB-tæki"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-it/strings.xml b/car-usb-handler/res/values-it/strings.xml
new file mode 100644
index 0000000..43f5206
--- /dev/null
+++ b/car-usb-handler/res/values-it/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"USB Handler"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Dispositivi salvati"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"Rimuovi l\'app di gestione per il dispositivo USB"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"Vuoi eliminare l\'app di gestione predefinita per %1$s?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Sì"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Annulla"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Recupero dei gestori supportati"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Dispositivo USB sconosciuto"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-iw/strings.xml b/car-usb-handler/res/values-iw/strings.xml
new file mode 100644
index 0000000..90cdb2a
--- /dev/null
+++ b/car-usb-handler/res/values-iw/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"אפליקציית ניהול של התקני USB"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"התקנים שמורים"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"הסרה של אפליקציית ניהול עבור התקן USB"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"בחרת למחוק את אפליקציית הניהול המוגדרת כברירת מחדל עבור %1$s. להמשיך?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"כן"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"ביטול"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"קבלת אפליקציות ניהול נתמכות"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"התקן USB לא ידוע"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-ja/strings.xml b/car-usb-handler/res/values-ja/strings.xml
new file mode 100644
index 0000000..0f4b672
--- /dev/null
+++ b/car-usb-handler/res/values-ja/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"USB ハンドラ"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"保存済みのデバイス"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"USB デバイス向け操作アプリの削除"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"%1$s のデフォルト操作アプリを削除してもよろしいですか?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"はい"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"キャンセル"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"サポートされているハンドラを取得しています"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"不明な USB デバイスです"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-ka/strings.xml b/car-usb-handler/res/values-ka/strings.xml
new file mode 100644
index 0000000..30c74bb
--- /dev/null
+++ b/car-usb-handler/res/values-ka/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"USB-დამმუშავებელი"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"შენახული მოწყობილობები"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"USB მოწყობილობის დამმუშავებელი აპის ამოშლა"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"ნამდვილად გსურთ, წაშალოთ %1$s-ის დამმუშავებელი ნაგულისხმევი აპი?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"დიახ"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"გაუქმება"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"მხარდაჭერილი დამმუშავებლების შესახებ ინფორმაციის მიღება"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"უცნობი USB მოწყობილობა"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-kk/strings.xml b/car-usb-handler/res/values-kk/strings.xml
new file mode 100644
index 0000000..3f91599
--- /dev/null
+++ b/car-usb-handler/res/values-kk/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"USB модулі"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Сақталған құрылғылар"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"USB құрылғысына арналған қолданбаны өшіру"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"%1$s әдепкі қолданбасын шынымен жою керек пе?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Иә"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Бас тарту"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Қолдау көрсетілетін модульдерді алу"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Белгісіз USB құрылғысы"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-km/strings.xml b/car-usb-handler/res/values-km/strings.xml
new file mode 100644
index 0000000..07108cd
--- /dev/null
+++ b/car-usb-handler/res/values-km/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"ឧបករណ៍ដោះស្រាយ USB"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"ឧបករណ៍ដែលបានរក្សាទុក"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"លុបកម្មវិធីគ្រប់គ្រងសម្រាប់ឧបករណ៍ USB"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"តើអ្នកពិតជាចង់លុបកម្មវិធីគ្រប់គ្រងលំនាំដើមសម្រាប់ %1$s មែនឬ?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"បាទ/ចាស"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"បោះបង់"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"កំពុងទាញយកឧបករណ៍ដោះស្រាយដែលស្គាល់"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"មិនស្គាល់ឧបករណ៍ USB ទេ"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-kn/strings.xml b/car-usb-handler/res/values-kn/strings.xml
new file mode 100644
index 0000000..20ed98a
--- /dev/null
+++ b/car-usb-handler/res/values-kn/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"ಯುಎಸ್ಬಿ ಹಾಂಡ್ಲರ್"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"ಉಳಿಸಲಾದ ಸಾಧನಗಳು"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"ಯುಎಸ್ಬಿ ಡ್ರೈವ್ ಅನ್ನು ನಿರ್ವಹಿಸುವ ಆಪ್ ಅನ್ನು ತೆಗೆ"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"ನೀವು ಖಂಡಿತವಾಗಿಯೂ %1$s ಕ್ಕೆ ಪೂರ್ವನಿಯೋಜಿತ ಆಪ್ ಅನ್ನು ಅಳಿಸಲು ಅಳಿಸಲು ಬಯಸುತ್ತೀರಾ?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"ಹೌದು"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"ರದ್ದುಗೊಳಿಸಿ"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"ಬೆಂಬಲಿತ ಹ್ಯಾಂಡ್ಲರ್ಗಳನ್ನು ಪಡೆಯುತ್ತಿದ್ದೇವೆ"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"ಗೊತ್ತಿಲ್ಲದ ಯುಎಸ್ಬಿ ಸಾಧನ"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-ko/strings.xml b/car-usb-handler/res/values-ko/strings.xml
new file mode 100644
index 0000000..8750746
--- /dev/null
+++ b/car-usb-handler/res/values-ko/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"USB 핸들러"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"저장된 기기"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"USB 기기 처리 앱 삭제"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"%1$s의 기본 처리 앱을 삭제하시겠습니까?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"예"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"취소"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"지원되는 핸들러 다운로드 중"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"알 수 없는 USB 기기"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-ky/strings.xml b/car-usb-handler/res/values-ky/strings.xml
new file mode 100644
index 0000000..7b1d56a
--- /dev/null
+++ b/car-usb-handler/res/values-ky/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"USB иштеткичи"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Сакталган түзмөктөр"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"USB түзмөгү үчүн иштетилген колдонмону алып салуу"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"%1$s үчүн демейки колдонмону чын эле жок кылгыңыз келеби?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Ооба"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Жок"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Колдоого алынган иштеткичтерди алуу"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Белгисиз USB түзмөгү"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-lo/strings.xml b/car-usb-handler/res/values-lo/strings.xml
new file mode 100644
index 0000000..2b4a123
--- /dev/null
+++ b/car-usb-handler/res/values-lo/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"ຕົວຈັດການ USB"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"ອຸປະກອນທີ່ບັນທຶກໄວ້"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"ລຶບແອັບຈັດການສຳລັບອຸປະກອນ USB ອອກ"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"ທ່ານແນ່ໃຈບໍ່ວ່າທ່ານຕ້ອງການລຶບແອັບການຈັດການເລີ່ມຕົ້ນສຳລັບ %1$s?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"ແມ່ນ"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"ຍົກເລີກ"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"ກຳລັງຮັບເອົາຕົວຈັດການທີ່ຮອງຮັບ"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"ອຸປະກອນ USB ທີ່ບໍ່ຮູ້ຈັກ"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-lt/strings.xml b/car-usb-handler/res/values-lt/strings.xml
new file mode 100644
index 0000000..7c04396
--- /dev/null
+++ b/car-usb-handler/res/values-lt/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"USB doroklė"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Išsaugoti įrenginiai"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"Pašalinti USB įrenginio apdorojimo programą"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"Ar tikrai norite išjungti numatytąją %1$s apdorojimo programą?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Taip"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Atšaukti"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Palaikomų doroklių gavimas"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Nežinomas USB įrenginys"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-lv/strings.xml b/car-usb-handler/res/values-lv/strings.xml
new file mode 100644
index 0000000..5f599d9
--- /dev/null
+++ b/car-usb-handler/res/values-lv/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"USB apdarinātājs"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Saglabātās ierīces"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"Noņemt USB ierīces apstrādes lietotni"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"Vai tiešām vēlaties izdzēst “%1$s” noklusējuma apstrādes lietotni?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Jā"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Atcelt"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Atbalstītu apdarinātāju ieguve"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Nezināma USB ierīce"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-mk/strings.xml b/car-usb-handler/res/values-mk/strings.xml
new file mode 100644
index 0000000..eb45cc5
--- /dev/null
+++ b/car-usb-handler/res/values-mk/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"USB-ракувач"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Зачувани уреди"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"Отстранете ја апликацијата за ракување за USB-уредот"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"Дали сигурно сакате да ја избришете стандардната апликација за ракување за %1$s?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Да"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Откажи"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Се преземаат поддржани ракувачи"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Непознат USB-уред"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-ml/strings.xml b/car-usb-handler/res/values-ml/strings.xml
new file mode 100644
index 0000000..181cdd1
--- /dev/null
+++ b/car-usb-handler/res/values-ml/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"USB കൈകാര്യം ചെയ്യുന്ന സംവിധാനം"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"സംരക്ഷിച്ച ഉപകരണങ്ങൾ"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"USB ഉപകരണത്തിനായി, കൈകാര്യം ചെയ്യുന്ന ആപ്പ് നീക്കം ചെയ്യുക"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"%1$s എന്നതിനുള്ള ഡിഫോൾട്ടായ കൈകാര്യം ചെയ്യുന്ന സംവിധാനം മായ്ക്കണമെന്ന് നിങ്ങൾക്കുറപ്പാണോ?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"അതെ"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"റദ്ദാക്കുക"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"പിന്തുണയുള്ള കൈകാര്യം ചെയ്യുന്ന സംവിധാനം ലഭ്യമാക്കുന്നു"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"അജ്ഞാത USB ഉപകരണം"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-mn/strings.xml b/car-usb-handler/res/values-mn/strings.xml
new file mode 100644
index 0000000..869ba24
--- /dev/null
+++ b/car-usb-handler/res/values-mn/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"USB Хариуцагч"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Хадгалсан төхөөрөмжүүд"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"USB төхөөрөмжийн хариуцагч аппыг устгах"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"Та %1$s-н өгөгдмөл хариуцагч аппыг устгахдаа итгэлтэй байна уу?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Тийм"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Цуцлах"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Дэмжигдсэн хариуцагчийг авч байна"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Үл мэдэгдэх USB төхөөрөмж"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-mr/strings.xml b/car-usb-handler/res/values-mr/strings.xml
new file mode 100644
index 0000000..7475f26
--- /dev/null
+++ b/car-usb-handler/res/values-mr/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"USB हँडलर"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"सेव्ह केलेली डिव्हाइस"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"USB डिव्हाइससाठी हँडलिंग अॅप काढा"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"तुम्हाला नक्की %1$s साठी डीफॉल्ट हँडलिंग अॅप हटवायचे आहे का?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"होय"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"रद्द करा"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"सपोर्ट असलेले हँडलर मिळवत आहे"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"अज्ञात USB डिव्हाइस"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-ms/strings.xml b/car-usb-handler/res/values-ms/strings.xml
new file mode 100644
index 0000000..30c60c9
--- /dev/null
+++ b/car-usb-handler/res/values-ms/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"Pengendali USB"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Peranti disimpan"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"Alih keluar apl pengendali bagi peranti USB"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"Adakah anda pasti anda mahu memadamkan apl pengendali lalai bagi %1$s?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Ya"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Batal"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Mendapatkan pengendali disokong"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Peranti USB tidak diketahui"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-my/strings.xml b/car-usb-handler/res/values-my/strings.xml
new file mode 100644
index 0000000..3901b54
--- /dev/null
+++ b/car-usb-handler/res/values-my/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"USB စီမံသူ"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"သိမ်းထားသည့် စက်ပစ္စည်းများ"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"USB ကိရိယာအတွက် အသုံးပြုလျက်ရှိသည့် အက်ပ်ကို ဖယ်ရှားခြင်း"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"သင်သည် %1$s အတွက် မူရင်းသုံးစွဲလျက်ရှိသည့် အက်ပ်ကို ဖယ်ရှားလိုသည်မှာ သေချာပါသလား။"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Yes"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"မလုပ်တော့"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"ပံ့ပိုးထားသည့် စီမံသူများကို ရယူခြင်း"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"အမျိုးအမည်မသိ USB စက်ပစ္စည်း"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-nb/strings.xml b/car-usb-handler/res/values-nb/strings.xml
new file mode 100644
index 0000000..b930d62
--- /dev/null
+++ b/car-usb-handler/res/values-nb/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"USB-behandler"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Lagrede enheter"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"Fjerning av behandlingsapp for USB-enhet"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"Er du sikker på at du vil slette standardappen for behandling av %1$s?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Ja"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Avbryt"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Innhenting av støttede behandlere"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Ukjent USB-enhet"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-ne/strings.xml b/car-usb-handler/res/values-ne/strings.xml
new file mode 100644
index 0000000..4278c92
--- /dev/null
+++ b/car-usb-handler/res/values-ne/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"USB ह्यान्ड्लर"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"सुरक्षित गरिएका यन्त्रहरू"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"USB यन्त्रको व्यवस्थापन गर्ने अनुप्रयोग हटाउनुहोस्"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"तपाईंले %1$s को व्यवस्थापन गर्ने पूर्वनिर्धारित अनुप्रयोग मेट्न खोज्नुभएकै हो?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"हो"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"रद्द गर्नुहोस्"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"समर्थित ह्यान्ड्लरहरू प्राप्त गर्दै"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"अज्ञात USB यन्त्र"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-nl/strings.xml b/car-usb-handler/res/values-nl/strings.xml
new file mode 100644
index 0000000..02d1a45
--- /dev/null
+++ b/car-usb-handler/res/values-nl/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"USB-handler"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Opgeslagen apparaten"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"Verwerkende app voor USB-apparaat verwijderen"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"Weet je zeker dat je de standaard verwerkings-app voor %1$s wilt verwijderen?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Ja"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Annuleren"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Ondersteunde handlers verkrijgen"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Onbekend USB-apparaat"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-or/strings.xml b/car-usb-handler/res/values-or/strings.xml
new file mode 100644
index 0000000..5b8443d
--- /dev/null
+++ b/car-usb-handler/res/values-or/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"USB ହ୍ୟାଣ୍ଡଲର୍"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"ସେଭ୍ ହୋଇଥିବା ଡିଭାଇସ୍ଗୁଡ଼ିକ"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"USB ଡିଭାଇସ୍ ପାଇଁ ହ୍ୟାଣ୍ଡଲିଂ ଆପ୍କୁ କାଢ଼ିଦିଅନ୍ତୁ"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"ଆପଣ କ\'ଣ ନିଶ୍ଚିତ ଭାବରେ %1$s ପାଇଁ ଡିଫଲ୍ଟ ହ୍ୟାଣ୍ଡଲିଂ ଆପ୍କୁ ଡିଲିଟ୍ କରିବାକୁ ଚାହୁଁଛନ୍ତି?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"ହଁ"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"ବାତିଲ୍ କରନ୍ତୁ"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"ସମର୍ଥିତ ହ୍ୟାଣ୍ଡଲର୍ ପ୍ରାପ୍ତ କରାଯାଉଛି"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"ଅଜଣା USB ଡିଭାଇସ୍"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-pa/strings.xml b/car-usb-handler/res/values-pa/strings.xml
new file mode 100644
index 0000000..35f95e9
--- /dev/null
+++ b/car-usb-handler/res/values-pa/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"USB ਹੈਂਡਲਰ"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"ਰੱਖਿਅਤ ਕੀਤੇ ਡੀਵਾਈਸ"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"USB ਡੀਵਾਈਸ ਨੂੰ ਹੈਂਡਲ ਕਰਨ ਵਾਲੀ ਐਪ ਹਟਾਓ"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"ਕੀ ਤੁਸੀਂ ਪੱਕਾ %1$s ਲਈ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਹੈਂਡਲਿੰਗ ਐਪ ਨੂੰ ਮਿਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"ਹਾਂ"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"ਰੱਦ ਕਰੋ"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"ਸਮਰਥਿਤ ਹੈਂਡਲਰਾਂ ਨੂੰ ਪ੍ਰਾਪਤ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"ਅਗਿਆਤ USB ਡੀਵਾਈਸ"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-pl/strings.xml b/car-usb-handler/res/values-pl/strings.xml
new file mode 100644
index 0000000..8439ad6
--- /dev/null
+++ b/car-usb-handler/res/values-pl/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"Moduł obsługi USB"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Zapisane urządzenia"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"Usuwanie aplikacji do obsługi urządzenia USB"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"Czy na pewno chcesz usunąć domyślną aplikację do obsługi: %1$s?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Tak"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Anuluj"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Pobieranie obsługiwanych modułów"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Nieznane urządzenie USB"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-pt-rPT/strings.xml b/car-usb-handler/res/values-pt-rPT/strings.xml
new file mode 100644
index 0000000..e817fc7
--- /dev/null
+++ b/car-usb-handler/res/values-pt-rPT/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"Controlador USB"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Dispositivos guardados"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"Remova a aplicação de processamento para o dispositivo USB"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"Tem a certeza de que pretende eliminar a aplicação de processamento predefinida para %1$s?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Sim"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Cancelar"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"A obter os controladores suportados…"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Dispositivo USB desconhecido."</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-pt/strings.xml b/car-usb-handler/res/values-pt/strings.xml
new file mode 100644
index 0000000..3e3f91a
--- /dev/null
+++ b/car-usb-handler/res/values-pt/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"Gerenciador de USB"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Dispositivos salvos"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"Remover o app de gerenciamento de dispositivo USB"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"Tem certeza de que quer excluir o app de gerenciamento padrão de %1$s?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Sim"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Cancelar"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Instalar gerenciadores compatíveis"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Dispositivo USB desconhecido"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-ro/strings.xml b/car-usb-handler/res/values-ro/strings.xml
new file mode 100644
index 0000000..eaa754a
--- /dev/null
+++ b/car-usb-handler/res/values-ro/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"Handler USB"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Dispozitive salvate"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"Elimină aplicația de gestionare pentru dispozitivul USB"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"Sigur ștergeți aplicația prestabilită de gestionare pentru %1$s?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Da"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Anulați"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Se preiau handlerele acceptate"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Dispozitiv USB necunoscut"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-ru/strings.xml b/car-usb-handler/res/values-ru/strings.xml
new file mode 100644
index 0000000..913a460
--- /dev/null
+++ b/car-usb-handler/res/values-ru/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"Обработчик USB"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Сохраненные устройства"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"Удаление приложения для работы с USB-устройством"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"Удалить приложение по умолчанию для работы с устройством \"%1$s\"?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Да"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Отмена"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Установка поддерживаемых обработчиков…"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Неизвестное USB-устройство"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-si/strings.xml b/car-usb-handler/res/values-si/strings.xml
new file mode 100644
index 0000000..f088f8d
--- /dev/null
+++ b/car-usb-handler/res/values-si/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"USB හසුරුවනය"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"සුරැකි උපාංග"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"USB උපාංගය සඳහා යෙදුම් පරිහරණය ඉවත් කරන්න"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"ඔබට %1$s සඳහා වන පෙරනිමි පරිහරණ යෙදුම මැකිය යුතු බව ඔබට තහවුරුද?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"ඔව්"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"අවලංගු කරන්න"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"සහය දැක්වෙන හසුරුවන ලබා ගැනීම"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"නොදන්නා USB උපාංගය"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-sk/strings.xml b/car-usb-handler/res/values-sk/strings.xml
new file mode 100644
index 0000000..8ba43d7
--- /dev/null
+++ b/car-usb-handler/res/values-sk/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"Obslužný nástroj USB"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Uložené zariadenia"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"Odstrániť spravujúcu aplikáciu pre zariadenie USB"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"Naozaj chcete odstrániť predvolenú spravujúcu aplikáciu zariadenia %1$s?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Áno"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Zrušiť"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Získavajú sa podporované obslužné nástroje"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Neznáme zariadenie USB"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-sl/strings.xml b/car-usb-handler/res/values-sl/strings.xml
new file mode 100644
index 0000000..ffdb3d7
--- /dev/null
+++ b/car-usb-handler/res/values-sl/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"Rutina za obravnavo USB-ja"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Shranjene naprave"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"Odstranitev aplikacije za obdelavo za napravo USB"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"Ali ste prepričani, da želite izbrisati privzeti aplikacijo za obravnavo za %1$s?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Da"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Prekliči"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Pridobivanje podprtih rutin za obravnavo"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Neznana naprava USB"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-sq/strings.xml b/car-usb-handler/res/values-sq/strings.xml
new file mode 100644
index 0000000..5c5e75a
--- /dev/null
+++ b/car-usb-handler/res/values-sq/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"Përpunuesi USB"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Pajisjet e ruajtura"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"Hiq aplikacionin e trajtimit për pajisjen USB"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"Je i sigurt që dëshiron ta fshish aplikacionin e parazgjedhur të trajtimit për %1$s?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Po"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Anulo"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Po merren përpunuesit e mbështetur"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Pajisje USB e panjohur"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-sr/strings.xml b/car-usb-handler/res/values-sr/strings.xml
new file mode 100644
index 0000000..2121fbb
--- /dev/null
+++ b/car-usb-handler/res/values-sr/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"Апликација за управљање USB-ом"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Сачувани уређаји"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"Уклоните апликације за управљање за USB уређај"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"Желите ли стварно да избришете подразумевану апликацију за управљање за %1$s?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Да"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Откажи"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Преузимају се подржане апликације за управљање"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Непознат USB уређај"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-sv/strings.xml b/car-usb-handler/res/values-sv/strings.xml
new file mode 100644
index 0000000..77bece0
--- /dev/null
+++ b/car-usb-handler/res/values-sv/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"USB-hanterare"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Sparade enheter"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"Ta bort hanteringsapp för USB-enhet"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"Vill du ta bort standardappen för hantering av %1$s?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Ja"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Avbryt"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Hämtar hanterare som stöds"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Okänd USB-enhet"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-sw/strings.xml b/car-usb-handler/res/values-sw/strings.xml
new file mode 100644
index 0000000..befc61d
--- /dev/null
+++ b/car-usb-handler/res/values-sw/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"Kidhibiti cha USB"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Vifaa ulivyohifadhi"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"Kuondoa programu ya kudhibiti kwenye kifaa cha USB"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"Je, una uhakika unataka kufuta programu chaguomsingi inayodhibiti %1$s?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Ndiyo"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Ghairi"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Kupata vidhibiti vinavyoweza kutumika"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Kifaa cha USB kisichojulikana"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-ta/strings.xml b/car-usb-handler/res/values-ta/strings.xml
new file mode 100644
index 0000000..7ccbec1
--- /dev/null
+++ b/car-usb-handler/res/values-ta/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"USB ஹேண்ட்லர்"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"சேமிக்கப்பட்ட சாதனங்கள்"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"USB சாதனத்தைக் கையாளும் ஆப்ஸை அகற்றுதல்"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"%1$sஐக் கையாளும் இயல்புநிலை ஆப்ஸை நீக்கவா?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"சரி"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"வேண்டாம்"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"ஆதரிக்கும் ஹேண்ட்லர்களைப் பெறுதல்"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"அறியப்படாத USB சாதனம்"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-te/strings.xml b/car-usb-handler/res/values-te/strings.xml
new file mode 100644
index 0000000..c158f23
--- /dev/null
+++ b/car-usb-handler/res/values-te/strings.xml
@@ -0,0 +1,32 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"USB హ్యాండ్లర్"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"సేవ్ చేసిన పరికరాలు"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"USB పరికర కొరకు హాండీలింగ్ యాప్ని తొలగించండి"</string>
+ <!-- String.format failed for translation -->
+ <!-- no translation found for usb_pref_delete_message (5849493572520646218) -->
+ <skip />
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"అవును"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"రద్దు చేయి"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"మద్దతుగల హ్యాండ్లర్లను పొందడం"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"తెలియని USB పరికరం"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-th/strings.xml b/car-usb-handler/res/values-th/strings.xml
new file mode 100644
index 0000000..dad363d
--- /dev/null
+++ b/car-usb-handler/res/values-th/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"เครื่องจัดการ USB"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"อุปกรณ์ที่บันทึกไว้"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"นำแอปที่จัดการอุปกรณ์ USB ออก"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"คุณแน่ใจไหมว่าต้องการลบแอปการจัดการเริ่มต้นสำหรับ %1$s"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"ใช่"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"ยกเลิก"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"การรับเครื่องจัดการที่รองรับ"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"อุปกรณ์ USB ที่ไม่รู้จัก"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-tl/strings.xml b/car-usb-handler/res/values-tl/strings.xml
new file mode 100644
index 0000000..d5c7827
--- /dev/null
+++ b/car-usb-handler/res/values-tl/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"Handler ng USB"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Mga naka-save na device"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"Alisin ang app sa pangangasiwa para sa USB device"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"Sigurado ka bang gusto mong i-delete ang default na app sa pangangasiwa para sa %1$s?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Oo"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Kanselahin"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Kinukuha ang mga sinusuportahang handler"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Hindi alam na USB device"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-tr/strings.xml b/car-usb-handler/res/values-tr/strings.xml
new file mode 100644
index 0000000..daf300e
--- /dev/null
+++ b/car-usb-handler/res/values-tr/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"USB İşleyici"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Kayıtlı cihazlar"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"USB cihazı için kullanım uygulamasını kaldırma"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"%1$s için varsayılan kullanım uygulamasını silmek istediğinizden emin misiniz?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Evet"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"İptal"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Desteklenen işleyiciler alınıyor"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Bilinmeyen USB cihazı"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-uk/strings.xml b/car-usb-handler/res/values-uk/strings.xml
new file mode 100644
index 0000000..063c640
--- /dev/null
+++ b/car-usb-handler/res/values-uk/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"Обробник USB"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Збережені пристрої"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"Вилучити додаток для роботи з USB-пристроєм"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"Видалити стандартний додаток для обробки пристрою %1$s?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Так"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Скасувати"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Отримання підтримуваних обробників"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Невідомий USB-пристрій"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-ur/strings.xml b/car-usb-handler/res/values-ur/strings.xml
new file mode 100644
index 0000000..0f29d02
--- /dev/null
+++ b/car-usb-handler/res/values-ur/strings.xml
@@ -0,0 +1,32 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"USB ہینڈلر"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"محفوظ کردہ آلات"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"USB آلہ کو ہینڈل کرنے والی اپپ کو ہٹائیں"</string>
+ <!-- String.format failed for translation -->
+ <!-- no translation found for usb_pref_delete_message (5849493572520646218) -->
+ <skip />
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"ہاں"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"منسوخ کریں"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"تعاون یافتہ ہینڈلرز حاصل کر رہے ہیں"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"نامعلوم USB آلہ"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-uz/strings.xml b/car-usb-handler/res/values-uz/strings.xml
new file mode 100644
index 0000000..0fd6b6e
--- /dev/null
+++ b/car-usb-handler/res/values-uz/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"USB bilan ishlash vositasi"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Saqlangan qurilmalar"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"USB qurilma bilan ishlovchi ilovani olib tashlash"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"%1$s bilan ishlovchi standart ilovani olib tashlashni xohlaysizmi?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Ha"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Bekor qilish"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"USB bilan ishlash ilovalari"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Notanish USB qurilma"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-vi/strings.xml b/car-usb-handler/res/values-vi/strings.xml
new file mode 100644
index 0000000..c60ee41
--- /dev/null
+++ b/car-usb-handler/res/values-vi/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"Trình xử lý USB"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Thiết bị đã lưu"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"Xóa ứng dụng xử lý cho thiết bị USB"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"Bạn có chắc chắn muốn xóa ứng dụng xử lý mặc định cho %1$s không?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Có"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Hủy"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Đang tải trình xử lý được hỗ trợ"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Thiết bị USB không xác định"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-zh-rCN/strings.xml b/car-usb-handler/res/values-zh-rCN/strings.xml
new file mode 100644
index 0000000..4f3b3ef
--- /dev/null
+++ b/car-usb-handler/res/values-zh-rCN/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"USB 处理程序"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"保存的设备"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"移除 USB 设备的处理应用"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"确定要删除%1$s的默认处理应用吗?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"是"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"取消"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"正在获取受支持的处理程序"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"未知 USB 设备"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-zh-rHK/strings.xml b/car-usb-handler/res/values-zh-rHK/strings.xml
new file mode 100644
index 0000000..0cf2801
--- /dev/null
+++ b/car-usb-handler/res/values-zh-rHK/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"USB 處理常式"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"已儲存的裝置"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"移除 USB 裝置的處理應用程式"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"您確定要為 %1$s 刪除預設的處理應用程式嗎?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"是"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"取消"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"正在取得支援的處理常式"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"不明 USB 裝置"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-zh-rTW/strings.xml b/car-usb-handler/res/values-zh-rTW/strings.xml
new file mode 100644
index 0000000..fd58c32
--- /dev/null
+++ b/car-usb-handler/res/values-zh-rTW/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"USB 處理常式"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"已儲存的裝置"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"移除 USB 裝置的處理應用程式"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"確定要刪除「%1$s」的處理應用程式嗎?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"是"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"取消"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"取得支援的處理常式"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"不明的 USB 裝置"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values-zu/strings.xml b/car-usb-handler/res/values-zu/strings.xml
new file mode 100644
index 0000000..69e56e5
--- /dev/null
+++ b/car-usb-handler/res/values-zu/strings.xml
@@ -0,0 +1,30 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="6963366455471441257">"Isibambi se-USB"</string>
+ <string name="usb_saved_devices" msgid="2829442070749964872">"Amadivayisi alondoloziwe"</string>
+ <string name="usb_pref_delete_title" msgid="3885061814853467483">"Susa uhlelo lokusebenza lokubamba ledivayisi ye-USB"</string>
+ <string name="usb_pref_delete_message" msgid="5849493572520646218">"Ingabe uqinisekile ukuthi ufuna ukususa uhlelo lokusebenza lokuphatha oluzenzakalelayo lwe-%1$s?"</string>
+ <string name="usb_pref_delete_yes" msgid="7803356145103146036">"Yebo"</string>
+ <string name="usb_pref_delete_cancel" msgid="5999791462730255929">"Khansela"</string>
+ <string name="usb_resolving_handlers" msgid="1943100136172948686">"Ukuthola izibambi ezisekelwayo"</string>
+ <string name="usb_unknown_device" msgid="4211439272338937095">"Idivayisi ye-USB engaziwa"</string>
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item msgid="4267974637522344258">"18d1:9302"</item>
+ </string-array>
+</resources>
diff --git a/car-usb-handler/res/values/strings.xml b/car-usb-handler/res/values/strings.xml
index be1e7a2..e73a03a 100644
--- a/car-usb-handler/res/values/strings.xml
+++ b/car-usb-handler/res/values/strings.xml
@@ -17,9 +17,6 @@
<string name="app_name">USB Handler</string>
<!-- USB Manager Settings -->
- <string name="usb_title">USB Devices settings</string>
- <string name="usb_description">Customize your USB Devices settings</string>
- <string name="usb_available_devices">Connected devices</string>
<string name="usb_saved_devices">Saved devices</string>
<string name="usb_pref_delete_title">Remove handling app for USB device</string>
<string name="usb_pref_delete_message">Are you sure you wan to delete dafault handling app for %1$s?</string>
@@ -27,4 +24,11 @@
<string name="usb_pref_delete_cancel">Cancel</string>
<string name="usb_resolving_handlers">Getting supported handlers</string>
<string name="usb_unknown_device">Unknown USB device</string>
+
+ <!-- VID:PID pairs (in hexadecimal and separated by a colon, e.g. 18d1:4e11)
+ of Android devices known to be incompatible with AOAP. Devices in this
+ list will not be probed by UsbHostManagementActivity for AOAP support. -->
+ <string-array name="config_AoapIncompatibleDeviceIds">
+ <item>18d1:9302</item>
+ </string-array>
</resources>
diff --git a/car-usb-handler/src/android/car/usb/handler/AoapInterface.java b/car-usb-handler/src/android/car/usb/handler/AoapInterface.java
index e4d843f..35b570a 100644
--- a/car-usb-handler/src/android/car/usb/handler/AoapInterface.java
+++ b/car-usb-handler/src/android/car/usb/handler/AoapInterface.java
@@ -13,11 +13,16 @@
*/
package android.car.usb.handler;
+import android.content.Context;
import android.hardware.usb.UsbConstants;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbDeviceConnection;
import android.util.Log;
+import android.util.Pair;
+
import java.io.IOException;
+import java.util.HashSet;
+import java.util.Set;
final class AoapInterface {
/**
@@ -94,6 +99,12 @@
*/
public static final int AOAP_TIMEOUT_MS = 2000;
+ /**
+ * Set of VID:PID pairs blacklisted through config_AoapIncompatibleDeviceIds. Only
+ * isDeviceBlacklisted() should ever access this variable.
+ */
+ private static Set<Pair<Integer, Integer>> sBlacklistedVidPidPairs;
+
private static final String TAG = AoapInterface.class.getSimpleName();
public static int getProtocol(UsbDeviceConnection conn) {
@@ -107,8 +118,8 @@
return (buffer[1] << 8) | buffer[0];
}
- public static boolean isSupported(UsbDeviceConnection conn) {
- return getProtocol(conn) >= 1;
+ public static boolean isSupported(Context context, UsbDevice device, UsbDeviceConnection conn) {
+ return !isDeviceBlacklisted(context, device) && getProtocol(conn) >= 1;
}
public static void sendString(UsbDeviceConnection conn, int index, String string)
@@ -134,6 +145,33 @@
}
}
+ public static synchronized boolean isDeviceBlacklisted(Context context, UsbDevice device) {
+ if (sBlacklistedVidPidPairs == null) {
+ sBlacklistedVidPidPairs = new HashSet<>();
+ String[] idPairs =
+ context.getResources().getStringArray(R.array.config_AoapIncompatibleDeviceIds);
+ for (String idPair : idPairs) {
+ boolean success = false;
+ String[] tokens = idPair.split(":");
+ if (tokens.length == 2) {
+ try {
+ sBlacklistedVidPidPairs.add(Pair.create(Integer.parseInt(tokens[0], 16),
+ Integer.parseInt(tokens[1], 16)));
+ success = true;
+ } catch (NumberFormatException e) {
+ }
+ }
+ if (!success) {
+ Log.e(TAG, "config_AoapIncompatibleDeviceIds contains malformed value: "
+ + idPair);
+ }
+ }
+ }
+
+ return sBlacklistedVidPidPairs.contains(Pair.create(device.getVendorId(),
+ device.getProductId()));
+ }
+
public static boolean isDeviceInAoapMode(UsbDevice device) {
if (device == null) {
return false;
diff --git a/car-usb-handler/src/android/car/usb/handler/BootUsbScanner.java b/car-usb-handler/src/android/car/usb/handler/BootUsbScanner.java
index 5255f16..9658a37 100644
--- a/car-usb-handler/src/android/car/usb/handler/BootUsbScanner.java
+++ b/car-usb-handler/src/android/car/usb/handler/BootUsbScanner.java
@@ -20,11 +20,14 @@
} else {
UsbDeviceConnection connection = UsbUtil.openConnection(manager, device);
try {
- if (AoapInterface.isSupported(connection)) {
+ if (connection != null
+ && AoapInterface.isSupported(context, device, connection)) {
handle(context, device);
}
} finally {
- connection.close();
+ if (connection != null) {
+ connection.close();
+ }
}
}
}
diff --git a/car-usb-handler/src/android/car/usb/handler/UsbDeviceHandlerResolver.java b/car-usb-handler/src/android/car/usb/handler/UsbDeviceHandlerResolver.java
index c0eebbe..b5abc58 100644
--- a/car-usb-handler/src/android/car/usb/handler/UsbDeviceHandlerResolver.java
+++ b/car-usb-handler/src/android/car/usb/handler/UsbDeviceHandlerResolver.java
@@ -15,6 +15,7 @@
*/
package android.car.usb.handler;
+import android.annotation.Nullable;
import android.car.IUsbAoapSupportCheckService;
import android.content.ComponentName;
import android.content.Context;
@@ -37,13 +38,16 @@
import android.os.RemoteException;
import android.util.Log;
import android.util.Pair;
+
import com.android.internal.util.XmlUtils;
+
+import org.xmlpull.v1.XmlPullParser;
+
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
-import org.xmlpull.v1.XmlPullParser;
/** Resolves supported handlers for USB device. */
public final class UsbDeviceHandlerResolver {
@@ -70,7 +74,7 @@
private class DeviceContext {
public final UsbDevice usbDevice;
- public final UsbDeviceConnection connection;
+ @Nullable public final UsbDeviceConnection connection;
public final UsbDeviceSettings settings;
public final List<UsbDeviceSettings> activeDeviceSettings;
public final Queue<Pair<ResolveInfo, DeviceFilter>> mActiveDeviceOptions =
@@ -484,7 +488,8 @@
}
DeviceContext deviceContext =
new DeviceContext(device, UsbDeviceSettings.constructSettings(device), settings);
- if (AoapInterface.isSupported(deviceContext.connection)) {
+ if (deviceContext.connection != null
+ && AoapInterface.isSupported(mContext, device, deviceContext.connection)) {
deviceContext.mActiveDeviceOptions.addAll(getDeviceMatches(device, intent, true));
queryNextAoapHandler(deviceContext);
} else {
@@ -516,6 +521,10 @@
private void requestAoapSwitch(UsbDevice device, DeviceFilter filter) {
UsbDeviceConnection connection = UsbUtil.openConnection(mUsbManager, device);
+ if (connection == null) {
+ Log.e(TAG, "Failed to connect to usb device.");
+ return;
+ }
try {
UsbUtil.sendAoapAccessoryStart(
connection,
diff --git a/car-usb-handler/src/android/car/usb/handler/UsbHostController.java b/car-usb-handler/src/android/car/usb/handler/UsbHostController.java
index 5c61a98..e4b6df3 100644
--- a/car-usb-handler/src/android/car/usb/handler/UsbHostController.java
+++ b/car-usb-handler/src/android/car/usb/handler/UsbHostController.java
@@ -25,7 +25,9 @@
import android.os.Looper;
import android.os.Message;
import android.util.Log;
+
import com.android.internal.annotations.GuardedBy;
+
import java.util.ArrayList;
import java.util.List;
@@ -90,7 +92,6 @@
filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
context.registerReceiver(mUsbBroadcastReceiver, filter);
-
}
private synchronized void setActiveDeviceIfMatch(UsbDevice device) {
@@ -129,11 +130,11 @@
return activeDevice != null && UsbUtil.isDevicesMatching(activeDevice, device);
}
- private String generateTitle() {
- String manufacturer = mActiveDevice.getManufacturerName();
- String product = mActiveDevice.getProductName();
+ private static String generateTitle(Context context, UsbDevice usbDevice) {
+ String manufacturer = usbDevice.getManufacturerName();
+ String product = usbDevice.getProductName();
if (manufacturer == null && product == null) {
- return mContext.getString(R.string.usb_unknown_device);
+ return context.getString(R.string.usb_unknown_device);
}
if (manufacturer != null && product != null) {
return manufacturer + " " + product;
@@ -158,14 +159,14 @@
UsbDeviceSettings settings = mUsbSettingsStorage.getSettings(device);
if (settings != null && mUsbResolver.dispatch(
- mActiveDevice, settings.getHandler(), settings.getAoap())) {
+ device, settings.getHandler(), settings.getAoap())) {
if (LOCAL_LOGV) {
Log.v(TAG, "Usb Device: " + device + " was sent to component: "
+ settings.getHandler());
}
return;
}
- mCallback.titleChanged(generateTitle());
+ mCallback.titleChanged(generateTitle(mContext, device));
mUsbResolver.resolve(device);
}
diff --git a/car-usb-handler/src/android/car/usb/handler/UsbSettingsStorage.java b/car-usb-handler/src/android/car/usb/handler/UsbSettingsStorage.java
index 1b251f8..7e8704e 100644
--- a/car-usb-handler/src/android/car/usb/handler/UsbSettingsStorage.java
+++ b/car-usb-handler/src/android/car/usb/handler/UsbSettingsStorage.java
@@ -24,6 +24,7 @@
import android.database.sqlite.SQLiteOpenHelper;
import android.hardware.usb.UsbDevice;
import android.util.Log;
+
import java.util.ArrayList;
import java.util.List;
@@ -51,25 +52,23 @@
private Cursor queryFor(SQLiteDatabase db, UsbDevice device) {
String serial = device.getSerialNumber();
String selection;
- String[] selectionArgs;
+ List<String> selectionArgs = new ArrayList<>();
if (AoapInterface.isDeviceInAoapMode(device)) {
selection = COLUMN_SERIAL + " = ? AND " + COLUMN_AOAP + " = 1";
- selectionArgs = new String[] {serial};
+ selectionArgs.add(serial);
} else if (serial == null) {
- selection = COLUMN_SERIAL + " IS NULL AND "
- + COLUMN_VID + " = ? AND " + COLUMN_PID + " = ?";
- selectionArgs = new String[] {
- Integer.toString(device.getVendorId()),
- Integer.toString(device.getProductId())};
+ selection = COLUMN_SERIAL + " IS NULL";
} else {
- selection =
- COLUMN_SERIAL + " = ? AND " + COLUMN_VID + " = ? AND " + COLUMN_PID + " = ?";
- selectionArgs = new String[] {
- device.getSerialNumber(),
- Integer.toString(device.getVendorId()),
- Integer.toString(device.getProductId())};
+ selection = COLUMN_SERIAL + " = ?";
+ selectionArgs.add(serial);
}
- return db.query(TABLE_USB_SETTINGS, null, selection, selectionArgs, null, null, null);
+
+ selection += " AND " + COLUMN_VID + " = ? AND " + COLUMN_PID + " = ?";
+ selectionArgs.add(String.valueOf(device.getVendorId()));
+ selectionArgs.add(String.valueOf(device.getProductId()));
+
+ return db.query(TABLE_USB_SETTINGS, null, selection,
+ selectionArgs.toArray(new String[0]), null, null, null);
}
/**
diff --git a/car-usb-handler/src/android/car/usb/handler/UsbUtil.java b/car-usb-handler/src/android/car/usb/handler/UsbUtil.java
index 939fe3f..b251715 100644
--- a/car-usb-handler/src/android/car/usb/handler/UsbUtil.java
+++ b/car-usb-handler/src/android/car/usb/handler/UsbUtil.java
@@ -15,10 +15,13 @@
*/
package android.car.usb.handler;
+import android.annotation.Nullable;
+import android.content.Context;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbDeviceConnection;
import android.hardware.usb.UsbManager;
import android.text.TextUtils;
+
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
@@ -28,12 +31,13 @@
* Util methods to work with USB devices.
*/
class UsbUtil {
- public static List<UsbDevice> findAllPossibleAndroidDevices(UsbManager usbManager) {
+ public static List<UsbDevice> findAllPossibleAndroidDevices(Context context,
+ UsbManager usbManager) {
HashMap<String, UsbDevice> devices = usbManager.getDeviceList();
- ArrayList<UsbDevice> androidDevices = new ArrayList<>(devices.size());
+ ArrayList<UsbDevice> androidDevices = new ArrayList<>(devices.size());
for (UsbDevice device : devices.values()) {
UsbDeviceConnection connection = openConnection(usbManager, device);
- if (AoapInterface.isSupported(connection)) {
+ if (AoapInterface.isSupported(context, device, connection)) {
androidDevices.add(device);
}
connection.close();
@@ -41,11 +45,12 @@
return androidDevices;
}
+ @Nullable
public static UsbDeviceConnection openConnection(UsbManager manager, UsbDevice device) {
- manager.grantPermission(device);
- return manager.openDevice(device);
+ manager.grantPermission(device);
+ return manager.openDevice(device);
}
-
+
public static void sendAoapAccessoryStart(UsbDeviceConnection connection, String manufacturer,
String model, String description, String version, String uri, String serial)
throws IOException {
diff --git a/car_product/build/car.mk b/car_product/build/car.mk
index 0250813..405f461 100644
--- a/car_product/build/car.mk
+++ b/car_product/build/car.mk
@@ -23,7 +23,6 @@
Bluetooth \
OneTimeInitializer \
Provision \
- SystemUI \
SystemUpdater
PRODUCT_PACKAGES += \
@@ -41,15 +40,14 @@
VmsSubscriberClientSample \
android.car.cluster.loggingrenderer \
DirectRenderingClusterSample \
- com.android.car.powertestservice \
+ GarageModeTestApp \
# SEPolicy for test apps / services
BOARD_SEPOLICY_DIRS += packages/services/Car/car_product/sepolicy/test
endif
-PRODUCT_COPY_FILES := \
- frameworks/av/media/libeffects/data/audio_effects.conf:system/etc/audio_effects.conf \
- packages/services/Car/car_product/preloaded-classes-car:system/etc/preloaded-classes \
+PRODUCT_COPY_FILES += \
+ frameworks/av/media/libeffects/data/audio_effects.conf:system/etc/audio_effects.conf
PRODUCT_PROPERTY_OVERRIDES += \
ro.carrier=unknown \
@@ -86,15 +84,15 @@
# Automotive specific packages
PRODUCT_PACKAGES += \
CarService \
- CarTrustAgentService \
CarDialerApp \
CarRadioApp \
OverviewApp \
CarLauncher \
- CarLensPickerApp \
+ CarSystemUI \
LocalMediaPlayer \
CarMediaApp \
CarMessengerApp \
+ CarNotification \
CarHvacApp \
CarMapsPlaceholder \
CarLatinIME \
@@ -112,13 +110,6 @@
PRODUCT_COPY_FILES += \
packages/services/Car/car_product/bootanimations/bootanimation-832.zip:system/media/bootanimation.zip
-PRODUCT_PROPERTY_OVERRIDES += \
- fmas.spkr_6ch=35,20,110 \
- fmas.spkr_2ch=35,25 \
- fmas.spkr_angles=10 \
- fmas.spkr_sgain=0 \
- media.aac_51_output_enabled=true
-
PRODUCT_LOCALES := en_US af_ZA am_ET ar_EG bg_BG bn_BD ca_ES cs_CZ da_DK de_DE el_GR en_AU en_GB en_IN es_ES es_US et_EE eu_ES fa_IR fi_FI fr_CA fr_FR gl_ES hi_IN hr_HR hu_HU hy_AM in_ID is_IS it_IT iw_IL ja_JP ka_GE km_KH ko_KR ky_KG lo_LA lt_LT lv_LV km_MH kn_IN mn_MN ml_IN mk_MK mr_IN ms_MY my_MM ne_NP nb_NO nl_NL pl_PL pt_BR pt_PT ro_RO ru_RU si_LK sk_SK sl_SI sr_RS sv_SE sw_TZ ta_IN te_IN th_TH tl_PH tr_TR uk_UA vi_VN zh_CN zh_HK zh_TW zu_ZA en_XA ar_XB
# should add to BOOT_JARS only once
@@ -132,5 +123,8 @@
PRODUCT_HIDDENAPI_STUBS_SYSTEM := \
android.car-system-stubs
+PRODUCT_HIDDENAPI_STUBS_TEST := \
+ android.car-test-stubs
+
INCLUDED_ANDROID_CAR_TO_PRODUCT_BOOT_JARS := yes
endif
diff --git a/car_product/build/car_base.mk b/car_product/build/car_base.mk
index 2f3bbaa..385a2ea 100644
--- a/car_product/build/car_base.mk
+++ b/car_product/build/car_base.mk
@@ -53,6 +53,7 @@
libwebrtc_audio_preprocessing \
wifi-service \
A2dpSinkService \
+ PackageInstaller
# EVS resources
PRODUCT_PACKAGES += android.automotive.evs.manager@1.0
diff --git a/car_product/overlay/frameworks/base/core/res/res/color/car_borderless_button_text_color.xml b/car_product/overlay/frameworks/base/core/res/res/color/car_borderless_button_text_color.xml
new file mode 100644
index 0000000..01fc20b
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/color/car_borderless_button_text_color.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+<!-- Default text colors for car buttons when enabled/disabled. -->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:color="@color/car_grey_700" android:state_enabled="false"/>
+ <item android:color="?android:attr/colorButtonNormal"/>
+</selector>
diff --git a/car_product/overlay/frameworks/base/core/res/res/color/car_button_text_color.xml b/car_product/overlay/frameworks/base/core/res/res/color/car_button_text_color.xml
new file mode 100644
index 0000000..7add316
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/color/car_button_text_color.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+<!-- Default text colors for car buttons when enabled/disabled. -->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:color="@color/car_grey_700" android:state_enabled="false"/>
+ <item android:color="@color/car_action1"/>
+</selector>
diff --git a/car_product/overlay/frameworks/base/core/res/res/color/car_switch.xml b/car_product/overlay/frameworks/base/core/res/res/color/car_switch.xml
new file mode 100644
index 0000000..ebf3841
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/color/car_switch.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item
+ android:color="?attr/colorControlActivated"
+ android:state_checked="true"/>
+ <item
+ android:color="?attr/colorSwitchThumbNormal"/>
+</selector>
diff --git a/car_product/overlay/frameworks/base/core/res/res/color/primary_text.xml b/car_product/overlay/frameworks/base/core/res/res/color/primary_text.xml
new file mode 100644
index 0000000..6caf472
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/color/primary_text.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item
+ android:alpha="0.5"
+ android:color="@color/car_body1"
+ android:state_enabled="false"/>
+ <item android:color="@color/car_body1"/>
+</selector>
diff --git a/car_product/overlay/frameworks/base/core/res/res/drawable/car_button_background.xml b/car_product/overlay/frameworks/base/core/res/res/drawable/car_button_background.xml
new file mode 100644
index 0000000..ccc4e22
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/drawable/car_button_background.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+<!-- Default background styles for car buttons when enabled/disabled. -->
+<ripple
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:color="?attr/colorControlHighlight">
+ <item>
+ <selector>
+ <item android:state_enabled="false">
+ <shape android:shape="rectangle">
+ <corners android:radius="@dimen/car_button_radius"/>
+ <solid android:color="@color/car_grey_300"/>
+ </shape>
+ </item>
+ <item>
+ <shape android:shape="rectangle">
+ <corners android:radius="@dimen/car_button_radius"/>
+ <solid android:color="?android:attr/colorButtonNormal"/>
+ </shape>
+ </item>
+ </selector>
+ </item>
+</ripple>
diff --git a/car_product/overlay/frameworks/base/core/res/res/drawable/car_checkbox.xml b/car_product/overlay/frameworks/base/core/res/res/drawable/car_checkbox.xml
new file mode 100644
index 0000000..00e3a19
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/drawable/car_checkbox.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item
+ android:width="@dimen/car_primary_icon_size"
+ android:height="@dimen/car_primary_icon_size"
+ android:drawable="@drawable/btn_check_material_anim"/>
+</layer-list>
diff --git a/car_product/overlay/frameworks/base/core/res/res/drawable/car_seekbar_thumb.xml b/car_product/overlay/frameworks/base/core/res/res/drawable/car_seekbar_thumb.xml
new file mode 100644
index 0000000..3729a3b
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/drawable/car_seekbar_thumb.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
+<shape
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="oval">
+ <solid android:color="@color/car_accent" />
+ <size
+ android:width="@dimen/car_seekbar_thumb_size"
+ android:height="@dimen/car_seekbar_thumb_size" />
+</shape>
diff --git a/car_product/overlay/frameworks/base/core/res/res/drawable/car_seekbar_thumb_dark.xml b/car_product/overlay/frameworks/base/core/res/res/drawable/car_seekbar_thumb_dark.xml
new file mode 100644
index 0000000..a469ada
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/drawable/car_seekbar_thumb_dark.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
+<shape
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="oval">
+ <solid android:color="@color/car_accent_dark" />
+ <size
+ android:width="@dimen/car_seekbar_thumb_size"
+ android:height="@dimen/car_seekbar_thumb_size" />
+</shape>
diff --git a/car_product/overlay/frameworks/base/core/res/res/drawable/car_seekbar_thumb_light.xml b/car_product/overlay/frameworks/base/core/res/res/drawable/car_seekbar_thumb_light.xml
new file mode 100644
index 0000000..0509858
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/drawable/car_seekbar_thumb_light.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
+<shape
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="oval">
+ <solid android:color="@color/car_accent_light" />
+ <size
+ android:width="@dimen/car_seekbar_thumb_size"
+ android:height="@dimen/car_seekbar_thumb_size" />
+</shape>
diff --git a/car_product/overlay/frameworks/base/core/res/res/drawable/car_seekbar_track.xml b/car_product/overlay/frameworks/base/core/res/res/drawable/car_seekbar_track.xml
new file mode 100644
index 0000000..fd112b0
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/drawable/car_seekbar_track.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:id="@android:id/background">
+ <shape android:shape="line">
+ <stroke
+ android:width="@dimen/car_seekbar_height"
+ android:color="@color/car_seekbar_track_background" />
+ </shape>
+ </item>
+ <item android:id="@android:id/secondaryProgress">
+ <clip>
+ <shape android:shape="line">
+ <stroke
+ android:width="@dimen/car_seekbar_height"
+ android:color="@color/car_seekbar_track_secondary_progress" />
+ </shape>
+ </clip>
+ </item>
+ <item android:id="@android:id/progress">
+ <clip>
+ <shape android:shape="line">
+ <stroke
+ android:width="@dimen/car_seekbar_height"
+ android:color="@color/car_accent" />
+ </shape>
+ </clip>
+ </item>
+</layer-list>
diff --git a/car_product/overlay/frameworks/base/core/res/res/drawable/car_seekbar_track_dark.xml b/car_product/overlay/frameworks/base/core/res/res/drawable/car_seekbar_track_dark.xml
new file mode 100644
index 0000000..b7fa379
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/drawable/car_seekbar_track_dark.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
+<!-- Drawable of seekbar track. Uses dark color for track. -->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:id="@android:id/background">
+ <shape android:shape="line">
+ <stroke
+ android:width="@dimen/car_seekbar_height"
+ android:color="@color/car_seekbar_track_background_dark" />
+ </shape>
+ </item>
+ <item android:id="@android:id/secondaryProgress">
+ <clip>
+ <shape android:shape="line">
+ <stroke
+ android:width="@dimen/car_seekbar_height"
+ android:color="@color/car_seekbar_track_secondary_progress" />
+ </shape>
+ </clip>
+ </item>
+ <item android:id="@android:id/progress">
+ <clip>
+ <shape android:shape="line">
+ <stroke
+ android:width="@dimen/car_seekbar_height"
+ android:color="@color/car_accent_light" />
+ </shape>
+ </clip>
+ </item>
+</layer-list>
diff --git a/car_product/overlay/frameworks/base/core/res/res/drawable/car_seekbar_track_light.xml b/car_product/overlay/frameworks/base/core/res/res/drawable/car_seekbar_track_light.xml
new file mode 100644
index 0000000..a9df2b6
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/drawable/car_seekbar_track_light.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
+<!-- Drawable of seekbar track. Uses light color for track. -->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:id="@android:id/background">
+ <shape android:shape="line">
+ <stroke
+ android:width="@dimen/car_seekbar_height"
+ android:color="@color/car_seekbar_track_background_light" />
+ </shape>
+ </item>
+ <item android:id="@android:id/secondaryProgress">
+ <clip>
+ <shape android:shape="line">
+ <stroke
+ android:width="@dimen/car_seekbar_height"
+ android:color="@color/car_seekbar_track_secondary_progress" />
+ </shape>
+ </clip>
+ </item>
+ <item android:id="@android:id/progress">
+ <clip>
+ <shape android:shape="line">
+ <stroke
+ android:width="@dimen/car_seekbar_height"
+ android:color="@color/car_accent_dark" />
+ </shape>
+ </clip>
+ </item>
+</layer-list>
diff --git a/car_product/overlay/frameworks/base/core/res/res/drawable/car_switch_thumb.xml b/car_product/overlay/frameworks/base/core/res/res/drawable/car_switch_thumb.xml
new file mode 100644
index 0000000..03efc18
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/drawable/car_switch_thumb.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<shape
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="oval">
+ <solid android:color="@color/car_switch"/>
+ <size
+ android:width="@dimen/car_seekbar_thumb_size"
+ android:height="@dimen/car_seekbar_thumb_size"/>
+</shape>
diff --git a/car_product/overlay/frameworks/base/core/res/res/drawable/toast_frame.xml b/car_product/overlay/frameworks/base/core/res/res/drawable/toast_frame.xml
new file mode 100644
index 0000000..fd542f5
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/drawable/toast_frame.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/* Copyright 2018, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="rectangle">
+ <solid android:color="@*android:color/car_toast_background"/>
+ <corners android:radius="22dp" />
+</shape>
+
diff --git a/car_product/overlay/frameworks/base/core/res/res/layout/alert_dialog_button_bar_material.xml b/car_product/overlay/frameworks/base/core/res/res/layout/alert_dialog_button_bar_material.xml
index 7203849..f929d10 100644
--- a/car_product/overlay/frameworks/base/core/res/res/layout/alert_dialog_button_bar_material.xml
+++ b/car_product/overlay/frameworks/base/core/res/res/layout/alert_dialog_button_bar_material.xml
@@ -26,9 +26,9 @@
<com.android.internal.widget.ButtonBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginStart="@dimen/car_keyline_1"
- android:layout_marginEnd="@dimen/car_keyline_1"
- android:layout_marginTop="@dimen/car_padding_2"
+ android:paddingStart="@dimen/car_keyline_1"
+ android:paddingEnd="@dimen/car_keyline_1"
+ android:paddingTop="@dimen/car_padding_2"
android:layoutDirection="locale"
android:orientation="horizontal"
android:gravity="center_vertical">
diff --git a/car_product/overlay/frameworks/base/core/res/res/layout/alert_dialog_material.xml b/car_product/overlay/frameworks/base/core/res/res/layout/alert_dialog_material.xml
index a302a5d..0298cce 100644
--- a/car_product/overlay/frameworks/base/core/res/res/layout/alert_dialog_material.xml
+++ b/car_product/overlay/frameworks/base/core/res/res/layout/alert_dialog_material.xml
@@ -21,6 +21,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="start|top"
+ android:background="@color/car_card"
android:orientation="vertical">
<include layout="@layout/alert_dialog_title_material" />
diff --git a/car_product/overlay/frameworks/base/core/res/res/layout/alert_dialog_title_material.xml b/car_product/overlay/frameworks/base/core/res/res/layout/alert_dialog_title_material.xml
index 0071d5c..3a9da1f 100644
--- a/car_product/overlay/frameworks/base/core/res/res/layout/alert_dialog_title_material.xml
+++ b/car_product/overlay/frameworks/base/core/res/res/layout/alert_dialog_title_material.xml
@@ -51,7 +51,7 @@
android:layout_centerVertical="true"
android:layout_marginStart="@dimen/car_keyline_1"
android:layout_marginEnd="@dimen/car_keyline_1"
- style="@style/CarTitle"/>
+ style="?attr/windowTitleStyle" />
</RelativeLayout>
<Space
diff --git a/car_product/overlay/frameworks/base/core/res/res/layout/car_preference.xml b/car_product/overlay/frameworks/base/core/res/res/layout/car_preference.xml
new file mode 100644
index 0000000..899fe6a
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/layout/car_preference.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<RelativeLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:background="?attr/selectableItemBackground"
+ android:focusable="true"
+ android:minHeight="?attr/listPreferredItemHeightSmall"
+ android:paddingEnd="?attr/listPreferredItemPaddingEnd"
+ android:paddingStart="?attr/listPreferredItemPaddingStart">
+
+ <com.android.internal.widget.PreferenceImageView
+ android:id="@id/icon"
+ android:layout_width="@dimen/car_primary_icon_size"
+ android:layout_height="@dimen/car_primary_icon_size"
+ android:layout_alignParentStart="true"
+ android:layout_centerVertical="true"
+ android:layout_marginBottom="@dimen/car_padding_2"
+ android:layout_marginEnd="?attr/listPreferredItemPaddingEnd"
+ android:layout_marginTop="@dimen/car_padding_2"/>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_centerVertical="true"
+ android:layout_marginBottom="@dimen/car_padding_2"
+ android:layout_marginTop="@dimen/car_padding_2"
+ android:layout_toEndOf="@id/icon"
+ android:layout_toStartOf="@id/widget_frame"
+ android:orientation="vertical">
+
+ <TextView
+ android:id="@id/title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:ellipsize="end"
+ android:singleLine="true"
+ android:textAppearance="?attr/textAppearanceListItem"/>
+
+ <TextView
+ android:id="@id/summary"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="?attr/textAppearanceListItemSecondary"/>
+
+ </LinearLayout>
+
+ <!-- Preference should place its actual preference widget here. -->
+ <FrameLayout
+ android:id="@id/widget_frame"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentEnd="true"
+ android:layout_centerVertical="true"/>
+
+</RelativeLayout>
diff --git a/car_product/overlay/frameworks/base/core/res/res/layout/car_preference_category.xml b/car_product/overlay/frameworks/base/core/res/res/layout/car_preference_category.xml
new file mode 100644
index 0000000..6bc0306
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/layout/car_preference_category.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:background="?attr/selectableItemBackground"
+ android:focusable="true"
+ android:gravity="center_vertical"
+ android:minHeight="@dimen/car_card_header_height"
+ android:orientation="horizontal"
+ android:paddingEnd="?attr/listPreferredItemPaddingEnd"
+ android:paddingStart="?attr/listPreferredItemPaddingStart">
+
+ <com.android.internal.widget.PreferenceImageView
+ android:id="@id/icon"
+ android:layout_width="@dimen/car_primary_icon_size"
+ android:layout_height="@dimen/car_primary_icon_size"
+ android:layout_gravity="center_vertical"
+ android:layout_marginBottom="@dimen/car_padding_2"
+ android:layout_marginEnd="?attr/listPreferredItemPaddingEnd"
+ android:layout_marginTop="@dimen/car_padding_2"/>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="@dimen/car_padding_2"
+ android:layout_marginTop="@dimen/car_padding_2"
+ android:orientation="vertical">
+
+ <TextView
+ android:id="@id/title"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:fontFamily="sans-serif-medium"
+ android:textAlignment="viewStart"
+ android:textAppearance="?attr/textAppearanceSmall"
+ android:textColor="?attr/colorAccent"/>
+
+ <TextView
+ android:id="@id/summary"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:ellipsize="end"
+ android:singleLine="true"
+ android:textColor="?attr/textColorSecondary"/>
+
+ </LinearLayout>
+
+</LinearLayout>
diff --git a/car_product/overlay/frameworks/base/core/res/res/layout/resolve_list_item.xml b/car_product/overlay/frameworks/base/core/res/res/layout/resolve_list_item.xml
new file mode 100644
index 0000000..2cdb228
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/layout/resolve_list_item.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+* Copyright 2018, The Android Open Source Project
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="horizontal"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ android:minHeight="?attr/listPreferredItemHeightLarge"
+ android:paddingTop="4dp"
+ android:paddingBottom="4dp"
+ android:background="?attr/activatedBackgroundIndicator">
+ <ImageView android:id="@+id/icon"
+ android:layout_width="75dp"
+ android:layout_height="75dp"
+ android:layout_gravity="start|center_vertical"
+ android:layout_marginStart="?attr/listPreferredItemPaddingStart"
+ android:layout_marginTop="12dp"
+ android:layout_marginBottom="12dp"
+ android:scaleType="fitXY" />
+
+ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:gravity="start|center_vertical"
+ android:orientation="vertical"
+ android:paddingStart="?attr/listPreferredItemPaddingStart"
+ android:paddingEnd="?attr/listPreferredItemPaddingEnd"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:layout_gravity="start|center_vertical">
+ <!-- Activity name -->
+ <TextView android:id="@android:id/text1"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="start|center_vertical"
+ android:textAppearance="?attr/textAppearanceLarge"
+ android:minHeight="50sp"
+ android:minLines="1"
+ android:maxLines="1"
+ android:textColor="@color/white"
+ android:ellipsize="marquee" />
+ <!-- Extended activity info to distinguish between duplicate activity names -->
+ <TextView android:id="@android:id/text2"
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:textColor="@color/white"
+ android:minLines="1"
+ android:maxLines="1"
+ android:ellipsize="marquee" />
+ </LinearLayout>
+</LinearLayout>
diff --git a/car_product/overlay/frameworks/base/core/res/res/layout/resolver_list.xml b/car_product/overlay/frameworks/base/core/res/res/layout/resolver_list.xml
new file mode 100644
index 0000000..9d64d65
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/layout/resolver_list.xml
@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+* Copyright 2018, The Android Open Source Project
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+-->
+<com.android.internal.widget.ResolverDrawerLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:theme="@android:style/Theme.DeviceDefault.NoActionBar"
+ android:id="@id/contentPanel">
+
+ <LinearLayout
+ android:id="@+id/button_bar"
+ android:visibility="gone"
+ style="?attr/buttonBarStyle"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_ignoreOffset="true"
+ android:layout_alwaysShow="true"
+ android:layout_hasNestedScrollIndicator="true"
+ android:background="?attr/colorBackgroundFloating"
+ android:orientation="horizontal"
+ android:paddingTop="8dp"
+ android:paddingBottom="8dp"
+ android:paddingStart="12dp"
+ android:weightSum="5"
+ android:paddingEnd="12dp"
+ android:elevation="8dp">
+
+ <TextView
+ android:id="@+id/profile_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginEnd="8dp"
+ android:paddingStart="8dp"
+ android:paddingEnd="8dp"
+ android:textSize="40sp"
+ android:layout_weight="5"
+ android:layout_gravity = "left"
+ android:visibility="gone"
+ android:textColor="?attr/colorAccent"
+ android:singleLine="true"/>
+
+ <TextView
+ android:id="@+id/title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:minHeight="56dp"
+ android:layout_gravity = "left"
+ android:layout_weight="3"
+ android:paddingTop="8dp"
+ android:layout_below="@id/profile_button"
+ android:paddingBottom="8dp"/>
+
+ <Button
+ android:id="@+id/button_once"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:enabled="false"
+ android:layout_gravity = "right"
+ android:text="@string/activity_resolver_use_once"
+ android:layout_weight="1"
+ android:onClick="onButtonClick"/>
+
+ <Button
+ android:id="@+id/button_always"
+ android:layout_marginLeft="10dp"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:enabled="false"
+ android:layout_gravity = "right"
+ android:text="@string/activity_resolver_use_always"
+ android:layout_weight="1"
+ android:onClick="onButtonClick"/>
+ </LinearLayout>
+
+ <ListView
+ android:layout_width="match_parent"
+ android:layout_height="500dp"
+ android:id="@+id/resolver_list"
+ android:clipToPadding="false"
+ android:scrollbarStyle="outsideOverlay"
+ android:background="?attr/colorBackgroundFloating"
+ android:elevation="8dp"
+ android:nestedScrollingEnabled="true"
+ android:scrollIndicators="top|bottom"/>
+
+ <TextView android:id="@+id/empty"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:background="?attr/colorBackgroundFloating"
+ android:elevation="8dp"
+ android:layout_alwaysShow="true"
+ android:text="@string/noApplications"
+ android:padding="32dp"
+ android:gravity="center"
+ android:visibility="gone"/>
+
+</com.android.internal.widget.ResolverDrawerLayout>
diff --git a/car_product/overlay/frameworks/base/core/res/res/layout/resolver_list_with_default.xml b/car_product/overlay/frameworks/base/core/res/res/layout/resolver_list_with_default.xml
new file mode 100644
index 0000000..62d4d69
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/layout/resolver_list_with_default.xml
@@ -0,0 +1,163 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+* Copyright 2018, The Android Open Source Project
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+-->
+<com.android.internal.widget.ResolverDrawerLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:theme="@android:style/Theme.DeviceDefault"
+ android:maxCollapsedHeight="200dp"
+ android:id="@id/contentPanel">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:weightSum="5"
+ android:layout_alwaysShow="true"
+ android:orientation="vertical"
+ android:background="?attr/colorBackgroundFloating"
+ android:elevation="8dp">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="0.5"
+ android:orientation="horizontal">
+
+ <ImageView
+ android:id="@+id/icon"
+ android:layout_width="24dp"
+ android:layout_height="24dp"
+ android:layout_gravity="start|top"
+ android:layout_marginStart="16dp"
+ android:layout_marginEnd="16dp"
+ android:layout_marginTop="20dp"
+ android:src="@drawable/resolver_icon_placeholder"
+ android:scaleType="fitCenter"/>
+
+ <TextView
+ android:id="@+id/title"
+ android:layout_width="0dp"
+ android:layout_weight="1"
+ android:layout_height="?attr/listPreferredItemHeight"
+ android:layout_marginStart="16dp"
+ android:textAppearance="?attr/textAppearanceMedium"
+ android:gravity="start|center_vertical"
+ android:paddingEnd="16dp"/>
+
+ <LinearLayout
+ android:id="@+id/profile_button"
+ android:layout_width="wrap_content"
+ android:layout_height="48dp"
+ android:layout_marginTop="4dp"
+ android:layout_marginEnd="4dp"
+ android:paddingStart="8dp"
+ android:paddingEnd="8dp"
+ android:paddingTop="4dp"
+ android:paddingBottom="4dp"
+ android:focusable="true"
+ android:visibility="gone"
+ style="?attr/borderlessButtonStyle">
+
+ <ImageView
+ android:id="@+id/icon"
+ android:layout_width="24dp"
+ android:layout_height="24dp"
+ android:layout_gravity="start|center_vertical"
+ android:layout_marginEnd="?attr/listPreferredItemPaddingEnd"
+ android:layout_marginTop="12dp"
+ android:layout_marginBottom="12dp"
+ android:scaleType="fitCenter"/>
+
+ <TextView
+ android:id="@id/text1"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="start|center_vertical"
+ android:layout_marginEnd="?attr/listPreferredItemPaddingEnd"
+ android:textAppearance="?attr/textAppearanceButton"
+ android:textColor="?attr/textColorPrimary"
+ android:minLines="1"
+ android:maxLines="1"
+ android:ellipsize="marquee"/>
+ </LinearLayout>
+ </LinearLayout>
+
+ <LinearLayout
+ android:id="@+id/button_bar"
+ android:visibility="gone"
+ style="?attr/buttonBarStyle"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_alwaysShow="true"
+ android:gravity="end|center_vertical"
+ android:layout_weight="0.5"
+ android:orientation="horizontal"
+ android:layoutDirection="locale"
+ android:measureWithLargestChild="true"
+ android:paddingTop="8dp"
+ android:paddingBottom="8dp"
+ android:paddingStart="12dp"
+ android:paddingEnd="12dp"
+ android:elevation="8dp">
+
+ <Button
+ android:id="@+id/button_once"
+ android:layout_width="wrap_content"
+ android:layout_gravity="start"
+ android:maxLines="2"
+ style="?attr/buttonBarNegativeButtonStyle"
+ android:minHeight="@dimen/alert_dialog_button_bar_height"
+ android:layout_height="wrap_content"
+ android:enabled="false"
+ android:text="@string/activity_resolver_use_once"
+ android:onClick="onButtonClick"/>
+
+ <Button
+ android:id="@+id/button_always"
+ android:layout_width="wrap_content"
+ android:layout_gravity="end"
+ android:maxLines="2"
+ android:minHeight="@dimen/alert_dialog_button_bar_height"
+ style="?attr/buttonBarPositiveButtonStyle"
+ android:layout_height="wrap_content"
+ android:enabled="false"
+ android:text="@string/activity_resolver_use_always"
+ android:onClick="onButtonClick"/>
+ </LinearLayout>
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1dp"
+ android:background="?attr/dividerVertical"/>
+
+
+ <ListView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:id="@+id/resolver_list"
+ android:layout_weight="4"
+ android:clipToPadding="false"
+ android:scrollbarStyle="outsideOverlay"
+ android:background="?attr/colorBackgroundFloating"
+ android:elevation="8dp"
+ android:nestedScrollingEnabled="true"
+ android:divider="@null"/>
+ </LinearLayout>
+
+</com.android.internal.widget.ResolverDrawerLayout>
\ No newline at end of file
diff --git a/car_product/overlay/frameworks/base/core/res/res/layout/transient_notification.xml b/car_product/overlay/frameworks/base/core/res/res/layout/transient_notification.xml
new file mode 100644
index 0000000..aff87b2
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/layout/transient_notification.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+** Copyright 2018, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ android:background="?android:attr/toastFrameBackground">
+
+ <TextView
+ android:id="@android:id/message"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:layout_marginHorizontal="24dp"
+ android:layout_marginVertical="15dp"
+ android:layout_gravity="center_horizontal"
+ android:textAppearance="@style/TextAppearance.Toast"
+ android:textColor="?android:attr/textColorPrimary"
+ />
+
+</LinearLayout>
+
+
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-af/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-af/strings.xml
new file mode 100644
index 0000000..cf04334
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-af/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Bestuurder"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-am/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-am/strings.xml
new file mode 100644
index 0000000..4afdf25
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-am/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"ነጂ"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-ar/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-ar/strings.xml
new file mode 100644
index 0000000..874ff29
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-ar/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"السائق"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-as/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-as/strings.xml
new file mode 100644
index 0000000..9091503
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-as/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"চালক"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-az/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-az/strings.xml
new file mode 100644
index 0000000..67b565b
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-az/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Sürücü"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-b+sr+Latn/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-b+sr+Latn/strings.xml
new file mode 100644
index 0000000..5f857c2
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-b+sr+Latn/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Vozač"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-be/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-be/strings.xml
new file mode 100644
index 0000000..7cc0826
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-be/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Вадзіцель"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-bg/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-bg/strings.xml
new file mode 100644
index 0000000..ad2abf6
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-bg/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Шофьор"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-bn/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-bn/strings.xml
new file mode 100644
index 0000000..cb6d8a6
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-bn/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"ড্রাইভার"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-bs/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-bs/strings.xml
new file mode 100644
index 0000000..5f857c2
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-bs/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Vozač"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-ca/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-ca/strings.xml
new file mode 100644
index 0000000..130c869
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-ca/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Conductor"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-cs/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-cs/strings.xml
new file mode 100644
index 0000000..40d9e58
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-cs/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Řidič"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-da/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-da/strings.xml
new file mode 100644
index 0000000..25c544c
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-da/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Chauffør"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-de/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-de/strings.xml
new file mode 100644
index 0000000..6a1deea
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-de/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Fahrer"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-el/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-el/strings.xml
new file mode 100644
index 0000000..4c317af
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-el/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Οδηγός"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-en-rAU/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-en-rAU/strings.xml
new file mode 100644
index 0000000..a4a3e1a
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-en-rAU/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Driver"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-en-rCA/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-en-rCA/strings.xml
new file mode 100644
index 0000000..a4a3e1a
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-en-rCA/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Driver"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-en-rGB/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-en-rGB/strings.xml
new file mode 100644
index 0000000..a4a3e1a
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-en-rGB/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Driver"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-en-rIN/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-en-rIN/strings.xml
new file mode 100644
index 0000000..a4a3e1a
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-en-rIN/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Driver"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-en-rXC/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-en-rXC/strings.xml
new file mode 100644
index 0000000..725d577
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-en-rXC/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Driver"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-es-rUS/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-es-rUS/strings.xml
new file mode 100644
index 0000000..130c869
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-es-rUS/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Conductor"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-es/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-es/strings.xml
new file mode 100644
index 0000000..130c869
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-es/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Conductor"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-et/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-et/strings.xml
new file mode 100644
index 0000000..4cffa81
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-et/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Sõitja"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-eu/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-eu/strings.xml
new file mode 100644
index 0000000..14ccb8e
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-eu/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Gidaria"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-fa/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-fa/strings.xml
new file mode 100644
index 0000000..19c4ff9
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-fa/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"راننده"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-fi/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-fi/strings.xml
new file mode 100644
index 0000000..07853e1
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-fi/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Kuljettaja"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-fr-rCA/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-fr-rCA/strings.xml
new file mode 100644
index 0000000..3cfdaf3
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-fr-rCA/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Conducteur"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-fr/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-fr/strings.xml
new file mode 100644
index 0000000..3cfdaf3
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-fr/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Conducteur"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-gl/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-gl/strings.xml
new file mode 100644
index 0000000..fa09574
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-gl/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Condutor"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-gu/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-gu/strings.xml
new file mode 100644
index 0000000..62dd43e
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-gu/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"ડ્રાઇવર"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-h1752dp/dimens.xml b/car_product/overlay/frameworks/base/core/res/res/values-h1752dp/dimens.xml
index f975711..da38586 100644
--- a/car_product/overlay/frameworks/base/core/res/res/values-h1752dp/dimens.xml
+++ b/car_product/overlay/frameworks/base/core/res/res/values-h1752dp/dimens.xml
@@ -15,6 +15,9 @@
-->
<resources>
+ <!-- Application Bar -->
+ <dimen name="car_app_bar_height">112dp</dimen>
+
<!-- Text size for car -->
<dimen name="car_title2_size">32sp</dimen>
<dimen name="car_body1_size">32sp</dimen>
@@ -32,4 +35,7 @@
<dimen name="car_keyline_2">108dp</dimen>
<dimen name="car_keyline_3">152dp</dimen>
<dimen name="car_keyline_4">182dp</dimen>
+
+ <!-- Minimum height of list items. -->
+ <dimen name="car_single_line_list_item_height">128dp</dimen>
</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-h600dp/dimens.xml b/car_product/overlay/frameworks/base/core/res/res/values-h600dp/dimens.xml
index b659bef..ba726d9 100644
--- a/car_product/overlay/frameworks/base/core/res/res/values-h600dp/dimens.xml
+++ b/car_product/overlay/frameworks/base/core/res/res/values-h600dp/dimens.xml
@@ -14,6 +14,9 @@
limitations under the License.
-->
<resources>
+ <!-- Application Bar -->
+ <dimen name="car_app_bar_height">96dp</dimen>
+
<!-- Size of notification text titles (see TextAppearance.StatusBar.EventContent.Title) -->
<dimen name="notification_title_text_size">40sp</dimen>
@@ -36,4 +39,7 @@
<!-- The size of the media actions in the media notification. -->
<dimen name="media_notification_action_button_size">56dp</dimen>
+
+ <!-- Minimum height of list items. -->
+ <dimen name="car_single_line_list_item_height">116dp</dimen>
</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-hi/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-hi/strings.xml
new file mode 100644
index 0000000..fbe93e1
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-hi/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"ड्राइवर"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-hr/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-hr/strings.xml
new file mode 100644
index 0000000..5f857c2
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-hr/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Vozač"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-hu/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-hu/strings.xml
new file mode 100644
index 0000000..83dc49a
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-hu/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Sofőr"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-hy/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-hy/strings.xml
new file mode 100644
index 0000000..cbaa105
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-hy/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Վարորդ"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-in/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-in/strings.xml
new file mode 100644
index 0000000..89fa52e
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-in/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Pengemudi"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-is/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-is/strings.xml
new file mode 100644
index 0000000..38bba6e
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-is/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Ökumaður"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-it/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-it/strings.xml
new file mode 100644
index 0000000..c9491dd
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-it/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Autista"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-iw/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-iw/strings.xml
new file mode 100644
index 0000000..f1383ea
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-iw/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"נהג/ת"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-ja/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-ja/strings.xml
new file mode 100644
index 0000000..7872368
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-ja/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"ドライバー"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-ka/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-ka/strings.xml
new file mode 100644
index 0000000..55879f3
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-ka/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"მძღოლი"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-kk/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-kk/strings.xml
new file mode 100644
index 0000000..68714f3
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-kk/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Көлік жүргізуші"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-km/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-km/strings.xml
new file mode 100644
index 0000000..f2d19e7
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-km/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"អ្នកបើកបរ"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-kn/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-kn/strings.xml
new file mode 100644
index 0000000..1812f01
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-kn/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"ಡ್ರೈವರ್"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-ko/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-ko/strings.xml
new file mode 100644
index 0000000..6fb8bbd
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-ko/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"운전자"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-ky/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-ky/strings.xml
new file mode 100644
index 0000000..a961e34
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-ky/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Айдоочу"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-lo/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-lo/strings.xml
new file mode 100644
index 0000000..a2e075b
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-lo/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"ຄົນຂັບລົດ"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-lt/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-lt/strings.xml
new file mode 100644
index 0000000..20d10d8
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-lt/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Vairuotojas"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-lv/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-lv/strings.xml
new file mode 100644
index 0000000..f8a9b63
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-lv/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Vadītājs"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-mk/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-mk/strings.xml
new file mode 100644
index 0000000..ea97216
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-mk/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Возач"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-ml/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-ml/strings.xml
new file mode 100644
index 0000000..e09eaeb
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-ml/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"ഡ്രൈവർ"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-mn/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-mn/strings.xml
new file mode 100644
index 0000000..5a1682e
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-mn/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Жолооч"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-mr/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-mr/strings.xml
new file mode 100644
index 0000000..de33088
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-mr/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"ड्रायव्हर"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-ms/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-ms/strings.xml
new file mode 100644
index 0000000..837f538
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-ms/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Pemandu"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-my/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-my/strings.xml
new file mode 100644
index 0000000..5c96457
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-my/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"ယာဉ်မောင်းသူ"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-nb/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-nb/strings.xml
new file mode 100644
index 0000000..139517b
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-nb/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Sjåfør"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-ne/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-ne/strings.xml
new file mode 100644
index 0000000..21d4f74
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-ne/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"चालक"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-night/colors.xml b/car_product/overlay/frameworks/base/core/res/res/values-night/colors.xml
deleted file mode 100644
index 9865fe7..0000000
--- a/car_product/overlay/frameworks/base/core/res/res/values-night/colors.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?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.
-*/
--->
-<resources>
- <!-- The background color for the container of notification actions. -->
- <color name="notification_action_list">#ff11181d</color> <!-- Dark Blue Grey 800 -->
-
- <!-- The primary text color if the text is on top of a dark background. -->
- <color name="notification_primary_text_color_light">#fff5f5f5</color> <!-- Grey 100 -->
-
- <!-- The primary text color if the text is on top of a light background. -->
- <color name="notification_primary_text_color_dark">#ff212121</color> <!-- Grey 900 -->
-
- <!-- The secondary text color if the text is on top of a dark background. -->
- <color name="notification_secondary_text_color_light">#ffe0e0e0</color> <!-- Grey 300 -->
-
- <!-- The background color of a notification card. -->
- <color name="notification_material_background_color">#ff172026</color> <!-- Dark Blue Grey 700 -->
-
- <!-- The secondary text color if the text is on top of a dark background. -->
- <color name="notification_secondary_text_color_dark">#ff6B6B6B</color> <!-- Grey 650 -->
-</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-night/colors_car.xml b/car_product/overlay/frameworks/base/core/res/res/values-night/colors_car.xml
new file mode 100644
index 0000000..74a60bf
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-night/colors_car.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright 2018, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<resources>
+
+ <color name="car_colorPrimary">@color/car_grey_958</color>
+ <color name="car_tint_light">@color/car_grey_300</color>
+
+ <color name="car_colorSecondary">@color/car_grey_972</color>
+ <color name="car_colorPrimaryDark">@color/car_grey_958</color>
+
+ <color name="car_body1_light">@color/car_grey_300</color>
+ <color name="car_body1">@color/car_body1_light</color>
+
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-nl/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-nl/strings.xml
new file mode 100644
index 0000000..c634d43
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-nl/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Chauffeur"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-or/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-or/strings.xml
new file mode 100644
index 0000000..04f5336
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-or/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"ଡ୍ରାଇଭର୍"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-pa/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-pa/strings.xml
new file mode 100644
index 0000000..354b580
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-pa/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"ਡਰਾਈਵਰ"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-pl/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-pl/strings.xml
new file mode 100644
index 0000000..315bf44
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-pl/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Kierowca"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-pt-rPT/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-pt-rPT/strings.xml
new file mode 100644
index 0000000..fa09574
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-pt-rPT/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Condutor"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-pt/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-pt/strings.xml
new file mode 100644
index 0000000..af84856
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-pt/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Motorista"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-ro/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-ro/strings.xml
new file mode 100644
index 0000000..c6ca011
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-ro/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Șofer"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-ru/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-ru/strings.xml
new file mode 100644
index 0000000..87359fb
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-ru/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Водитель"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-si/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-si/strings.xml
new file mode 100644
index 0000000..a2aa811
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-si/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"රියදුරු"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-sk/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-sk/strings.xml
new file mode 100644
index 0000000..94a4723
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-sk/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Vodič"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-sl/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-sl/strings.xml
new file mode 100644
index 0000000..9f75529
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-sl/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Voznik"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-sq/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-sq/strings.xml
new file mode 100644
index 0000000..4e6cd54
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-sq/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Drejtuesi"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-sr/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-sr/strings.xml
new file mode 100644
index 0000000..ea97216
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-sr/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Возач"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-sv/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-sv/strings.xml
new file mode 100644
index 0000000..12d2369
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-sv/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Förare"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-sw/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-sw/strings.xml
new file mode 100644
index 0000000..90924e1
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-sw/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Dereva"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-sw900dp/dimens.xml b/car_product/overlay/frameworks/base/core/res/res/values-sw900dp/dimens.xml
deleted file mode 100644
index d1af884..0000000
--- a/car_product/overlay/frameworks/base/core/res/res/values-sw900dp/dimens.xml
+++ /dev/null
@@ -1,27 +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.
-*/
--->
-<resources>
-
- <!-- Height of the bottom navigation / system bar. -->
- <dimen name="navigation_bar_height">112dp</dimen>
-
- <!-- Height of the bottom navigation bar in landscape; often
- the same as @dimen/navigation_bar_height -->
- <dimen name="navigation_bar_height_landscape">112dp</dimen>
-
-</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-ta/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-ta/strings.xml
new file mode 100644
index 0000000..47a7058
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-ta/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"கார் உரிமையாளர்"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-te/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-te/strings.xml
new file mode 100644
index 0000000..ebbb6b3
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-te/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"డ్రైవర్"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-th/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-th/strings.xml
new file mode 100644
index 0000000..c3d4c8c
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-th/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"ผู้ขับรถ"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-tl/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-tl/strings.xml
new file mode 100644
index 0000000..a4a3e1a
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-tl/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Driver"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-tr/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-tr/strings.xml
new file mode 100644
index 0000000..67b565b
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-tr/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Sürücü"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-uk/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-uk/strings.xml
new file mode 100644
index 0000000..1bc0b22
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-uk/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Водій"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-ur/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-ur/strings.xml
new file mode 100644
index 0000000..f69a738
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-ur/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"ڈرائیور"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-uz/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-uz/strings.xml
new file mode 100644
index 0000000..07264f4
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-uz/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Haydovchi"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-vi/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-vi/strings.xml
new file mode 100644
index 0000000..ef6b702
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-vi/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Tài xế"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-w1280dp/dimens.xml b/car_product/overlay/frameworks/base/core/res/res/values-w1280dp/dimens.xml
index 2e2f851..de9bc8b 100644
--- a/car_product/overlay/frameworks/base/core/res/res/values-w1280dp/dimens.xml
+++ b/car_product/overlay/frameworks/base/core/res/res/values-w1280dp/dimens.xml
@@ -19,4 +19,5 @@
<dimen name="car_keyline_2">108dp</dimen>
<dimen name="car_keyline_3">128dp</dimen>
<dimen name="car_keyline_4">168dp</dimen>
+ <dimen name="car_margin">148dp</dimen>
</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-w1920dp/dimens.xml b/car_product/overlay/frameworks/base/core/res/res/values-w1920dp/dimens.xml
index dcb92dc..7a0f7a5 100644
--- a/car_product/overlay/frameworks/base/core/res/res/values-w1920dp/dimens.xml
+++ b/car_product/overlay/frameworks/base/core/res/res/values-w1920dp/dimens.xml
@@ -15,6 +15,6 @@
-->
<resources>
- <dimen name="status_bar_height">56dp</dimen>
<dimen name="car_keyline_4">184dp</dimen>
+ <dimen name="car_margin">192dp</dimen>
</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-w690dp/dimens.xml b/car_product/overlay/frameworks/base/core/res/res/values-w690dp/dimens.xml
index ce66163..4757cd2 100644
--- a/car_product/overlay/frameworks/base/core/res/res/values-w690dp/dimens.xml
+++ b/car_product/overlay/frameworks/base/core/res/res/values-w690dp/dimens.xml
@@ -18,4 +18,5 @@
<dimen name="car_keyline_2">96dp</dimen>
<dimen name="car_keyline_3">112dp</dimen>
<dimen name="car_keyline_4">148dp</dimen>
+ <dimen name="car_margin">112dp</dimen>
</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-zh-rCN/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-zh-rCN/strings.xml
new file mode 100644
index 0000000..0347e14
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-zh-rCN/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"司机"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-zh-rHK/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-zh-rHK/strings.xml
new file mode 100644
index 0000000..37aab13
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-zh-rHK/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"司機"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-zh-rTW/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-zh-rTW/strings.xml
new file mode 100644
index 0000000..8ecce72
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-zh-rTW/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"駕駛"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values-zu/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values-zu/strings.xml
new file mode 100644
index 0000000..b5ec2c1
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values-zu/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="owner_name" msgid="3416113395996003764">"Umshayeli"</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values/colors.xml b/car_product/overlay/frameworks/base/core/res/res/values/colors.xml
index 37dc0bf..82398bb 100644
--- a/car_product/overlay/frameworks/base/core/res/res/values/colors.xml
+++ b/car_product/overlay/frameworks/base/core/res/res/values/colors.xml
@@ -17,171 +17,27 @@
*/
-->
<resources>
+
<!-- The background color for the container of notification actions. -->
- <color name="notification_action_list">#ffeeeeee</color> <!-- Grey 200 -->
+ <color name="notification_action_list">@color/car_colorSecondary</color>
<!-- The primary text color if the text is on top of a light background. -->
- <color name="notification_primary_text_color_light">#ff212121</color> <!-- Grey 900 -->
+ <color name="notification_primary_text_color_light">@color/car_body1</color>
<!-- The primary text color if the text is on top of a dark background. -->
- <color name="notification_primary_text_color_dark">#fff5f5f5</color> <!-- Grey 100 -->
+ <color name="notification_primary_text_color_dark">@color/car_body1</color>
+
+ <!-- The secondary text color if the text is on top of a light background. -->
+ <color name="notification_secondary_text_color_light">@color/car_body2</color>
<!-- The secondary text color if the text is on top of a dark background. -->
- <color name="notification_secondary_text_color_light">#ff6B6B6B</color> <!-- Grey 650 -->
-
- <!-- The secondary text color if the text is on top of a dark background. -->
- <color name="notification_secondary_text_color_dark">#ffe0e0e0</color> <!-- Grey 300 -->
+ <color name="notification_secondary_text_color_dark">@color/car_body2</color>
<!-- The background color of a notification card. -->
- <color name="notification_material_background_color">#fffafafa</color> <!-- Grey 50 -->
+ <color name="notification_material_background_color">@color/car_colorPrimary</color>
<!-- The default color for text in a notification. This color is also the default color for
icons. -->
- <color name="notification_default_color">@color/notification_primary_text_color_light</color>
+ <color name="notification_default_color">@color/car_accent</color>
- <!-- Keep in sync with //frameworks/support/car/res/values/colors.xml -->
- <color name="car_grey_50">#fffafafa</color>
- <color name="car_grey_100">#fff5f5f5</color>
- <color name="car_grey_200">#ffeeeeee</color>
- <color name="car_grey_300">#ffe0e0e0</color>
- <color name="car_grey_400">#ffbdbdbd</color>
- <color name="car_grey_500">#ff9e9e9e</color>
- <color name="car_grey_600">#ff757575</color>
- <color name="car_grey_650">#ff6B6B6B</color>
- <color name="car_grey_700">#ff616161</color>
- <color name="car_grey_800">#ff424242</color>
- <color name="car_grey_900">#ff212121</color>
- <color name="car_grey_1000">#cc000000</color>
- <color name="car_white_1000">#1effffff</color>
- <color name="car_blue_grey_800">#ff37474F</color>
- <color name="car_blue_grey_900">#ff263238</color>
- <color name="car_dark_blue_grey_600">#ff1d272d</color>
- <color name="car_dark_blue_grey_700">#ff172026</color>
- <color name="car_dark_blue_grey_800">#ff11181d</color>
- <color name="car_dark_blue_grey_900">#ff0c1013</color>
- <color name="car_dark_blue_grey_1000">#ff090c0f</color>
- <color name="car_light_blue_300">#ff4fc3f7</color>
- <color name="car_light_blue_500">#ff03A9F4</color>
- <color name="car_light_blue_600">#ff039be5</color>
- <color name="car_light_blue_700">#ff0288d1</color>
- <color name="car_light_blue_800">#ff0277bd</color>
- <color name="car_light_blue_900">#ff01579b</color>
- <color name="car_blue_300">#ff91a7ff</color>
- <color name="car_blue_500">#ff5677fc</color>
- <color name="car_green_500">#ff0f9d58</color>
- <color name="car_green_700">#ff0b8043</color>
- <color name="car_yellow_500">#fff4b400</color>
- <color name="car_yellow_800">#ffee8100</color>
- <color name="car_red_400">#ffe06055</color>
- <color name="car_red_500">#ffdb4437</color>
- <color name="car_red_500a">#ffd50000</color>
- <color name="car_red_700">#ffc53929</color>
- <color name="car_teal_200">#ff80cbc4</color>
- <color name="car_teal_700">#ff00796b</color>
- <color name="car_indigo_800">#ff283593</color>
-
- <!-- Various colors for text sizes. "Light" and "dark" here refer to the lighter or darker
- shades. -->
- <color name="car_title_light">@color/car_grey_100</color>
- <color name="car_title_dark">@color/car_grey_900</color>
- <color name="car_title">@color/car_title_dark</color>
-
- <color name="car_title2_light">@color/car_grey_100</color>
- <color name="car_title2_dark">@color/car_grey_900</color>
- <color name="car_title2">@color/car_title2_dark</color>
-
- <color name="car_headline1_light">@color/car_grey_100</color>
- <color name="car_headline1_dark">@color/car_grey_800</color>
- <color name="car_headline1">@color/car_headline1_dark</color>
-
- <color name="car_headline2_light">@color/car_grey_100</color>
- <color name="car_headline2_dark">@color/car_grey_900</color>
- <color name="car_headline2">@color/car_headline2_dark</color>
-
- <color name="car_headline3_light">@android:color/white</color>
- <color name="car_headline3_dark">@color/car_grey_900</color>
- <color name="car_headline3">@color/car_headline3_dark</color>
-
- <color name="car_headline4_light">@android:color/white</color>
- <color name="car_headline4_dark">@android:color/black</color>
- <color name="car_headline4">@color/car_headline4_dark</color>
-
- <color name="car_body1_light">@color/car_grey_100</color>
- <color name="car_body1_dark">@color/car_grey_900</color>
- <color name="car_body1">@color/car_body1_dark</color>
-
- <color name="car_body2_light">@color/car_grey_300</color>
- <color name="car_body2_dark">@color/car_grey_650</color>
- <color name="car_body2">@color/car_body2_dark</color>
-
- <color name="car_body3_light">@android:color/white</color>
- <color name="car_body3_dark">@android:color/black</color>
- <color name="car_body3">@color/car_body3_dark</color>
-
- <color name="car_body4_light">@android:color/white</color>
- <color name="car_body4_dark">@android:color/black</color>
- <color name="car_body4">@color/car_body4_dark</color>
-
- <color name="car_action1_light">@color/car_grey_900</color>
- <color name="car_action1_dark">@color/car_grey_50</color>
- <color name="car_action1">@color/car_action1_dark</color>
-
- <!-- The tinting colors to create a light- and dark-colored icon respectively. -->
- <color name="car_tint_light">@color/car_grey_50</color>
- <color name="car_tint_dark">@color/car_grey_900</color>
-
- <!-- The tinting color for an icon. This icon is assumed to be on a light background. -->
- <color name="car_tint">@color/car_tint_dark</color>
-
- <!-- An inverted tinting from car_tint. -->
- <color name="car_tint_inverse">@color/car_tint_light</color>
-
- <!-- The color of the divider. The color here is a lighter shade. -->
- <color name="car_list_divider_light">#1fffffff</color>
-
- <!-- The color of the divider. The color here is a darker shade. -->
- <color name="car_list_divider_dark">#1f000000</color>
-
- <!-- The color of the dividers in the list. This color is assumed to be on a light colored
- view. -->
- <color name="car_list_divider">@color/car_list_divider_dark</color>
-
- <!-- A light and dark colored card. -->
- <color name="car_card_light">@color/car_grey_50</color>
- <color name="car_card_dark">@color/car_dark_blue_grey_700</color>
-
- <!-- The default color of a card in car UI. -->
- <color name="car_card">@color/car_card_light</color>
-
- <!-- The ripple colors. The "dark" and "light" designation here refers to the color of the
- ripple itself. -->
- <color name="car_card_ripple_background_dark">#8F000000</color>
- <color name="car_card_ripple_background_light">#27ffffff</color>
-
- <!-- The ripple color for a light colored card. -->
- <color name="car_card_ripple_background">@color/car_card_ripple_background_dark</color>
-
- <!-- The ripple color for a dark-colored card. This color is the opposite of
- car_card_ripple_background. -->
- <color name="car_card_ripple_background_inverse">@color/car_card_ripple_background_light</color>
-
- <!-- The top margin before the start of content in an application. -->
- <dimen name="app_header_height">96dp</dimen>
-
- <!-- The lighter and darker color for the scrollbar thumb. -->
- <color name="car_scrollbar_thumb_light">#99ffffff</color>
- <color name="car_scrollbar_thumb_dark">#7f0b0f12</color>
-
- <!-- The color of the scroll bar indicator in the PagedListView. This color is assumed to be on
- a light-colored background. -->
- <color name="car_scrollbar_thumb">@color/car_scrollbar_thumb_dark</color>
-
- <!-- The inverted color of the scroll bar indicator. This color is always the opposite of
- car_scrollbar_thumb. -->
- <color name="car_scrollbar_thumb_inverse">@color/car_scrollbar_thumb_light</color>
-
- <!-- Misc colors -->
- <color name="car_highlight_light">@color/car_teal_700</color>
- <color name="car_highlight_dark">@color/car_teal_200</color>
- <color name="car_highlight">@color/car_highlight_light</color>
</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values/colors_device_defaults.xml b/car_product/overlay/frameworks/base/core/res/res/values/colors_device_defaults.xml
new file mode 100644
index 0000000..110be4f
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values/colors_device_defaults.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2018, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<resources>
+ <color name="primary_device_default_dark">@color/car_colorPrimary</color>
+ <color name="primary_device_default_light">@color/car_colorPrimary</color>
+
+ <color name="primary_device_default_settings">@color/car_colorPrimary</color>
+ <color name="primary_device_default_settings_light">@color/car_colorPrimary</color>
+
+ <color name="primary_dark_device_default_dark">@color/car_colorSecondary</color>
+ <color name="primary_dark_device_default_light">@color/car_colorSecondary</color>
+
+ <color name="primary_dark_device_default_settings">@color/car_colorSecondary</color>
+ <color name="primary_dark_device_default_settings_light">@color/car_colorSecondary</color>
+
+ <color name="secondary_device_default_settings">@color/car_colorSecondary</color>
+ <color name="secondary_device_default_settings_light">@color/car_colorSecondary</color>
+
+ <color name="tertiary_device_default_settings">@color/car_grey_772</color>
+ <color name="quaternary_device_default_settings">@color/car_grey_746</color>
+
+ <color name="accent_device_default_light">@color/car_accent</color>
+ <color name="accent_device_default_dark">@color/car_accent</color>
+
+ <color name="background_device_default_dark">@color/car_background</color>
+ <color name="background_device_default_light">@color/car_background</color>
+
+ <color name="background_floating_device_default_dark">@color/car_colorSecondary</color>
+ <color name="background_floating_device_default_light">@color/car_colorSecondary</color>
+
+ <color name="error_color_device_default_dark">@color/car_red_a700</color>
+ <color name="error_color_device_default_light">@color/car_red_a700</color>
+</resources>
\ No newline at end of file
diff --git a/car_product/overlay/frameworks/base/core/res/res/values/config.xml b/car_product/overlay/frameworks/base/core/res/res/values/config.xml
index 65559c0..1de7df0 100644
--- a/car_product/overlay/frameworks/base/core/res/res/values/config.xml
+++ b/car_product/overlay/frameworks/base/core/res/res/values/config.xml
@@ -22,8 +22,6 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- Enable multi-user. -->
<bool name="config_enableMultiUserUI">true</bool>
- <!-- Arbitrary max 8 users. -->
- <integer name="config_multiuserMaximumUsers">8</integer>
<!-- If true, all guest users created on the device will be ephemeral. -->
<bool name="config_guestUserEphemeral">true</bool>
<!-- Car Mode -->
@@ -52,10 +50,6 @@
<!-- Automotive Bluetooth pairing option -->
<bool name="enable_pbap_pce_profile">true</bool>
- <!-- Component name of a custom ResolverActivity (Intent resolver) to be used instead of
- the default framework version. -->
- <string name="config_customResolverActivity" translatable="false">com.android.support.car.lenspicker/.LensResolverActivity</string>
-
<!-- Flag indicating that the entire notification header can be clicked to expand the
notification. If false, then the expand icon has to be clicked in order for the expand
to occur. -->
@@ -74,4 +68,6 @@
<!-- Corner radius of system dialogs -->
<dimen name="config_dialogCornerRadius">16dp</dimen>
+
+ <string name="config_headlineFontFamilyMedium">sans-serif-medium</string>
</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values/dimens.xml b/car_product/overlay/frameworks/base/core/res/res/values/dimens.xml
index 2adc535..cf09310 100644
--- a/car_product/overlay/frameworks/base/core/res/res/values/dimens.xml
+++ b/car_product/overlay/frameworks/base/core/res/res/values/dimens.xml
@@ -17,12 +17,13 @@
*/
-->
<resources>
- <dimen name="status_bar_height">36dp</dimen>
-
- <!-- Both of these are used in separate positions so make sure that they remain the same. -->
- <dimen name="navigation_bar_height_car_mode">112dp</dimen>
+ <dimen name="status_bar_height">76dp</dimen>
+ <dimen name="status_bar_height_landscape">76dp</dimen>
+ <dimen name="status_bar_height_portrait">76dp</dimen>
+ <dimen name="car_qs_header_system_icons_area_height">76dp</dimen>
+ <dimen name="navigation_bar_height">112dp</dimen>
<dimen name="navigation_bar_height_landscape">112dp</dimen>
- <dimen name="status_bar_icon_size">40dp</dimen>
+ <dimen name="status_bar_icon_size">36dp</dimen>
<!-- The height of the header of a notification. -->
<dimen name="notification_header_height">58dp</dimen>
@@ -108,37 +109,6 @@
<!-- The top margin before the notification progress bar. -->
<dimen name="notification_progress_margin_top">16dp</dimen>
- <!-- Text size for car -->
- <dimen name="car_title2_size">40sp</dimen>
- <dimen name="car_body1_size">40sp</dimen>
- <dimen name="car_body2_size">32sp</dimen>
- <dimen name="car_action1_size">32sp</dimen>
-
- <!-- Common icon size for car app -->
- <dimen name="car_icon_size">56dp</dimen>
-
- <dimen name="car_card_header_height">96dp</dimen>
- <dimen name="car_card_action_bar_height">96dp</dimen>
-
- <!-- Paddings -->
- <dimen name="car_padding_1">4dp</dimen>
- <dimen name="car_padding_2">10dp</dimen>
- <dimen name="car_padding_3">16dp</dimen>
- <dimen name="car_padding_4">28dp</dimen>
- <dimen name="car_padding_5">32dp</dimen>
-
- <!-- Radius -->
- <dimen name="car_radius_1">4dp</dimen>
- <dimen name="car_radius_2">8dp</dimen>
- <dimen name="car_radius_3">16dp</dimen>
- <dimen name="car_radius_5">100dp</dimen>
-
- <!-- Keylines for content. -->
- <dimen name="car_keyline_1">48dp</dimen>
- <dimen name="car_keyline_2">108dp</dimen>
- <dimen name="car_keyline_3">152dp</dimen>
- <dimen name="car_keyline_4">182dp</dimen>
-
<!-- Make the dots in lock pattern thicker in Car -->
<dimen name="lock_pattern_dot_size">20dp</dimen>
</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values/strings.xml b/car_product/overlay/frameworks/base/core/res/res/values/strings.xml
new file mode 100644
index 0000000..9217647
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- Default name of the owner user [CHAR LIMIT=20] -->
+ <string name="owner_name">Driver</string>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values/styles.xml b/car_product/overlay/frameworks/base/core/res/res/values/styles.xml
index f654f3d..99b7015 100644
--- a/car_product/overlay/frameworks/base/core/res/res/values/styles.xml
+++ b/car_product/overlay/frameworks/base/core/res/res/values/styles.xml
@@ -75,48 +75,5 @@
<item name="paddingBottom">@dimen/media_notification_actions_padding_bottom</item>
<item name="gravity">center</item>
</style>
-
- <!-- Car text -->
- <style name="CarBody2">
- <item name="android:textStyle">normal</item>
- <item name="android:textSize">@dimen/car_body2_size</item>
- <item name="android:textColor">@color/car_body2</item>
- </style>
-
- <style name="CarBody2.Dark">
- <item name="android:textColor">@color/car_body2_dark</item>
- </style>
- <style name="CarBody2.Light">
- <item name="android:textColor">@color/car_body2_light</item>
- </style>
-
- <style name="CarAction1">
- <item name="android:textStyle">bold</item>
- <item name="android:textSize">@dimen/car_action1_size</item>
- <item name="android:textColor">@color/car_highlight</item>
- </style>
-
- <style name="CarAction1.Dark">
- <item name="android:textColor">@color/car_highlight_dark</item>
- </style>
- <style name="CarAction1.Light">
- <item name="android:textColor">@color/car_highlight_light</item>
- </style>
-
- <!-- The styling for title text. The color of this text changes based on day/night mode. -->
- <style name="CarTitle" >
- <item name="android:textStyle">bold</item>
- <item name="android:textSize">@dimen/car_title2_size</item>
- <item name="android:textColor">@color/car_title</item>
- </style>
- <!-- Title text that is permanently a dark color. -->
- <style name="CarTitle.Dark" >
- <item name="android:textColor">@color/car_title_dark</item>
- </style>
-
- <!-- Title text that is permanently a light color. -->
- <style name="CarTitle.Light" >
- <item name="android:textColor">@color/car_title_light</item>
- </style>
</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values/styles_device_default.xml b/car_product/overlay/frameworks/base/core/res/res/values/styles_device_default.xml
new file mode 100644
index 0000000..443996f
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values/styles_device_default.xml
@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<!--
+ This is an override of frameworks/base/core/res/res/values/styles_device_default.xml
+ It is how the device default is changed to match the desired look for a car theme.
+-->
+<resources>
+
+ <style name="TextAppearance.DeviceDefault" parent="TextAppearance.Material.Large">
+ <item name="textSize">@dimen/car_body3_size</item>
+ </style>
+ <style name="TextAppearance.DeviceDefault.Inverse" parent="TextAppearance.Material.Inverse">
+ <item name="textSize">@dimen/car_body3_size</item>
+ </style>
+
+ <style name="TextAppearance.DeviceDefault.Large" parent="TextAppearance.Material.Large">
+ <item name="textSize">@dimen/car_body1_size</item>
+ </style>
+ <style name="TextAppearance.DeviceDefault.Large.Inverse" parent="TextAppearance.Material.Large.Inverse">
+ <item name="textSize">@dimen/car_body1_size</item>
+ </style>
+
+ <style name="TextAppearance.DeviceDefault.Medium" parent="TextAppearance.Material.Medium">
+ <item name="textSize">@dimen/car_body2_size</item>
+ </style>
+ <style name="TextAppearance.DeviceDefault.Medium.Inverse" parent="TextAppearance.Material.Medium.Inverse">
+ <item name="textSize">@dimen/car_body2_size</item>
+ </style>
+
+ <style name="TextAppearance.DeviceDefault.Small" parent="TextAppearance.Material.Small">
+ <item name="textSize">@dimen/car_body4_size</item>
+ </style>
+ <style name="TextAppearance.DeviceDefault.Small.Inverse" parent="TextAppearance.Material.Small.Inverse">
+ <item name="textSize">@dimen/car_body4_size</item>
+ </style>
+
+ <style name="TextAppearance.DeviceDefault.Widget.Button.Borderless.Colored"
+ parent="TextAppearance.DeviceDefault.Widget.Button">
+ <item name="textColor">@color/car_borderless_button_text_color</item>
+ </style>
+
+ <style name="DialogWindowTitle.DeviceDefault" parent="DialogWindowTitle.Material">
+ <item name="textAppearance">@style/TextAppearance.DeviceDefault.DialogWindowTitle</item>
+ </style>
+ <style name="TextAppearance.DeviceDefault.DialogWindowTitle" parent="TextAppearance.Material.DialogWindowTitle">
+ <item name="fontFamily">@string/config_headlineFontFamilyMedium</item>
+ <item name="textStyle">normal</item>
+ <item name="textSize">@dimen/car_body2_size</item>
+ <item name="textColor">@color/car_body2</item>
+ </style>
+ <style name="TextAppearance.Material.DialogWindowTitle" parent="TextAppearance.Material.Title" />
+ <style name="TextAppearance.Material.Title">
+ <item name="textSize">@dimen/text_size_title_material</item>
+ <item name="fontFamily">@string/font_family_title_material</item>
+ <item name="textColor">?attr/textColorPrimary</item>
+ </style>
+
+ <style name="TextAppearance.DeviceDefault.Widget.Button" parent="TextAppearance.Material.Widget.Button">
+ <item name="fontFamily">@string/config_headlineFontFamilyMedium</item>
+ <item name="textAllCaps">@bool/config_buttonTextAllCaps</item>
+ <item name="textSize">@dimen/car_action1_size</item>
+ <item name="textColor">@color/car_button_text_color</item>
+ </style>
+
+ <style name="Widget.DeviceDefault.Button" parent="Widget.Material.Button">
+ <item name="background">@drawable/car_button_background</item>
+ <item name="layout_height">@dimen/car_button_height</item>
+ <item name="minWidth">@dimen/car_button_min_width</item>
+ <item name="paddingStart">@dimen/car_button_horizontal_padding</item>
+ <item name="paddingEnd">@dimen/car_button_horizontal_padding</item>
+ </style>
+
+ <style name="Widget.DeviceDefault.CompoundButton.CheckBox" parent="Widget.Material.CompoundButton.CheckBox">
+ <item name="button">@drawable/car_checkbox</item>
+ </style>
+
+ <style name="Widget.DeviceDefault.CompoundButton.Switch" parent="Widget.Material.CompoundButton.Switch">
+ <item name="thumb">@drawable/car_switch_thumb</item>
+ <item name="switchMinWidth">@dimen/car_primary_icon_size</item>
+ </style>
+
+ <style name="Widget.DeviceDefault.ProgressBar.Horizontal" parent="Widget.Material.ProgressBar.Horizontal">
+ <item name="minHeight">@dimen/car_progress_bar_height</item>
+ <item name="maxHeight">@dimen/car_progress_bar_height</item>
+ </style>
+
+ <style name="Widget.DeviceDefault.SeekBar" parent="Widget.Material.SeekBar">
+ <item name="progressDrawable">@drawable/car_seekbar_track</item>
+ <item name="thumb">@drawable/car_seekbar_thumb</item>
+ </style>
+
+ <style name="Widget.DeviceDefault.ActionBar.Solid" parent="Widget.Material.ActionBar.Solid">
+ <item name="textSize">@dimen/car_body3_size</item>
+ </style>
+
+ <!-- Preference Styles -->
+ <style name="Preference.DeviceDefault" parent="Preference.Material">
+ <item name="layout">@layout/car_preference</item>
+ </style>
+ <style name="Preference.DeviceDefault.Category" parent="Preference.Material.Category">
+ <item name="layout">@layout/car_preference_category</item>
+ </style>
+ <style name="Preference.DeviceDefault.CheckBoxPreference" parent="Preference.Material.CheckBoxPreference">
+ <item name="layout">@layout/car_preference</item>
+ </style>
+ <style name="Preference.DeviceDefault.DialogPreference" parent="Preference.Material.DialogPreference">
+ <item name="layout">@layout/car_preference</item>
+ </style>
+ <style name="Preference.DeviceDefault.DialogPreference.EditTextPreference" parent="Preference.Material.DialogPreference.EditTextPreference">
+ <item name="layout">@layout/car_preference</item>
+ </style>
+ <style name="Preference.DeviceDefault.SwitchPreference" parent="Preference.Material.SwitchPreference">
+ <item name="layout">@layout/car_preference</item>
+ </style>
+
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values/themes_device_defaults.xml b/car_product/overlay/frameworks/base/core/res/res/values/themes_device_defaults.xml
new file mode 100644
index 0000000..4f2e0fe
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values/themes_device_defaults.xml
@@ -0,0 +1,134 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<!--
+ This is an override of frameworks/base/core/res/res/values/themes_device_default.xml
+ It is how the device default is changed to match the desired look for a car theme.
+-->
+<resources>
+ <style name="Theme.DeviceDefault" parent="Theme.DeviceDefaultBase">
+ <item name="borderlessButtonStyle">@style/Widget.DeviceDefault.Button.Borderless.Colored</item>
+ <item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item>
+ <item name="buttonStyle">@style/Widget.DeviceDefault.Button</item>
+ <item name="colorAccent">@color/accent_device_default_light</item>
+ <item name="colorBackground">@color/background_device_default_light</item>
+ <item name="colorBackgroundFloating">@color/background_floating_device_default_light</item>
+ <item name="colorButtonNormal">@color/car_highlight</item>
+ <item name="colorControlHighlight">@color/car_card_ripple_background</item>
+ <item name="colorControlNormal">@color/car_body2</item>
+ <item name="colorPrimary">@color/primary_device_default_light</item>
+ <item name="colorPrimaryDark">@color/primary_device_default_dark</item>
+ <item name="colorForeground">@color/car_card_light</item>
+ <item name="editTextColor">@color/car_body1</item>
+ <item name="listPreferredItemHeightSmall">@dimen/car_single_line_list_item_height</item>
+ <item name="textColorHint">@color/car_body2</item>
+ <item name="textColorPrimary">@color/primary_text</item>
+ <item name="textColorSecondary">@color/car_body2</item>
+ <item name="textColorHint">@color/car_grey_400</item>
+ <item name="toastFrameBackground">@drawable/toast_frame</item>
+ <item name="textAppearanceListItem">@style/TextAppearance.DeviceDefault.Large</item>
+ <item name="textAppearanceListItemSmall">@style/TextAppearance.DeviceDefault.Large</item>
+ <item name="textAppearanceListItemSecondary">@style/TextAppearance.DeviceDefault.Small</item>
+ <item name="actionBarSize">@dimen/car_app_bar_height</item>
+ </style>
+ <style name="Theme.DeviceDefault.Dialog" parent="Theme.Material.Dialog">
+ <item name="textAppearanceLarge">@style/TextAppearance.DeviceDefault.Large</item>
+ <item name="textAppearanceMedium">@style/TextAppearance.DeviceDefault.Medium</item>
+ <item name="textAppearanceSmall">@style/TextAppearance.DeviceDefault.Small</item>
+ <item name="textAppearanceLargeInverse">@style/TextAppearance.DeviceDefault.Large.Inverse</item>
+ <item name="textAppearanceMediumInverse">@style/TextAppearance.DeviceDefault.Medium.Inverse</item>
+ <item name="textAppearanceSmallInverse">@style/TextAppearance.DeviceDefault.Small.Inverse</item>
+ <item name="textAppearanceListItem">@style/TextAppearance.DeviceDefault.Large</item>
+ <item name="textAppearanceListItemSmall">@style/TextAppearance.DeviceDefault.Large</item>
+ <item name="textAppearanceListItemSecondary">@style/TextAppearance.DeviceDefault.Small</item>
+ <item name="borderlessButtonStyle">@style/Widget.DeviceDefault.Button.Borderless.Colored</item>
+ <item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item>
+ <item name="buttonStyle">@style/Widget.DeviceDefault.Button</item>
+ <item name="colorAccent">@color/accent_device_default_light</item>
+ <item name="colorBackgroundFloating">@color/background_floating_device_default_light</item>
+ <item name="colorButtonNormal">@color/car_highlight</item>
+ <item name="colorControlHighlight">@color/car_card_ripple_background</item>
+ <item name="colorControlNormal">@color/car_body2</item>
+ <item name="colorPrimary">@color/primary_device_default_light</item>
+ <item name="colorPrimaryDark">@color/primary_device_default_dark</item>
+ <item name="colorForeground">@color/car_card_light</item>
+ <item name="editTextColor">@color/car_body1</item>
+ <item name="textColorHint">@color/car_body2</item>
+ <item name="textColorPrimary">@color/car_body1</item>
+ <item name="textColorSecondary">@color/car_body2</item>
+ <item name="toastFrameBackground">@drawable/toast_frame</item>
+ </style>
+ <style name="Theme.DeviceDefault.Dialog.NoActionBar">
+ <item name="windowActionBar">false</item>
+ <item name="windowNoTitle">true</item>
+ </style>
+ <style name="Theme.DeviceDefault.Dialog.Alert" parent="Theme.Material.Dialog.Alert">
+ <item name="borderlessButtonStyle">@style/Widget.DeviceDefault.Button.Borderless.Colored</item>
+ <item name="buttonBarButtonStyle">@style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item>
+ <item name="buttonStyle">@style/Widget.DeviceDefault.Button</item>
+ <item name="colorAccent">@color/accent_device_default_light</item>
+ <item name="colorBackgroundFloating">@color/background_floating_device_default_light</item>
+ <item name="colorButtonNormal">@color/car_highlight</item>
+ <item name="colorControlHighlight">@color/car_card_ripple_background</item>
+ <item name="colorControlNormal">@color/car_body2</item>
+ <item name="colorPrimary">@color/primary_device_default_light</item>
+ <item name="colorPrimaryDark">@color/primary_device_default_dark</item>
+ <item name="colorForeground">@color/car_card_light</item>
+ <item name="editTextColor">@color/car_body1</item>
+ <item name="textColorHint">@color/car_body2</item>
+ <item name="textColorPrimary">@color/car_body1</item>
+ <item name="textColorSecondary">@color/car_body2</item>
+ <item name="toastFrameBackground">@drawable/toast_frame</item>
+ <item name="textAppearanceListItem">@style/TextAppearance.DeviceDefault.Large</item>
+ <item name="textAppearanceListItemSmall">@style/TextAppearance.DeviceDefault.Large</item>
+ <item name="textAppearanceListItemSecondary">@style/TextAppearance.DeviceDefault.Small</item>
+ </style>
+
+ <style name="Theme.DeviceDefault.Settings.Dialog" parent="Theme.DeviceDefault.Dialog.Alert">
+ </style>
+
+ <!-- The light theme is defined to be the same as the default since currently there is only one
+ defined theme palette -->
+ <style name="Theme.DeviceDefault.Light"/>
+ <style name="Theme.DeviceDefault.Light.Dialog" parent="Theme.DeviceDefault.Dialog"/>
+ <style name="Theme.DeviceDefault.Light.Dialog.Alert" parent="Theme.DeviceDefault.Dialog.Alert"/>
+ <style name="Theme.DeviceDefault.Light.Dialog.NoActionBar" parent="Theme.DeviceDefault.Dialog.NoActionBar"/>
+
+ <style name="Theme.DeviceDefault.Light.NoActionBar">
+ <item name="windowActionBar">false</item>
+ <item name="windowNoTitle">true</item>
+ </style>
+ <style name="Theme.DeviceDefault.NoActionBar">
+ <item name="windowActionBar">false</item>
+ <item name="windowNoTitle">true</item>
+ </style>
+
+ <style name="Theme.DeviceDefault.InputMethod" parent="Theme.Material.InputMethod">
+ <!-- Color palette -->
+ <item name="colorAccent">@color/accent_device_default_light</item>
+ <item name="colorBackground">@color/primary_device_default_light</item>
+ <item name="listDivider">@color/car_keyboard_divider_line</item>
+ <item name="textColorPrimary">@color/car_keyboard_text_primary_color</item>
+ <item name="textColorSecondary">@color/car_keyboard_text_secondary_color</item>
+ </style>
+
+ <style name="Theme.DeviceDefault.Settings"/>
+ <style name="Theme.DeviceDefault.Settings.NoActionBar" parent="Theme.DeviceDefault.NoActionBar"/>
+
+ <style name="Theme.DeviceDefault.Light.DarkActionBar" parent="Theme.DeviceDefault"/>
+ <!-- DeviceDefault theme for the default system theme. -->
+ <style name="Theme.DeviceDefault.System" parent="Theme.DeviceDefault.Light.DarkActionBar" />
+</resources>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res/values-h600dp/dimens.xml b/car_product/overlay/frameworks/base/packages/CarSystemUI/res/values-h600dp/dimens.xml
similarity index 100%
rename from car_product/overlay/frameworks/base/packages/SystemUI/res/values-h600dp/dimens.xml
rename to car_product/overlay/frameworks/base/packages/CarSystemUI/res/values-h600dp/dimens.xml
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res/values-sw600dp/dimens.xml b/car_product/overlay/frameworks/base/packages/CarSystemUI/res/values-sw600dp/dimens.xml
similarity index 100%
rename from car_product/overlay/frameworks/base/packages/SystemUI/res/values-sw600dp/dimens.xml
rename to car_product/overlay/frameworks/base/packages/CarSystemUI/res/values-sw600dp/dimens.xml
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res/values-w1024dp/dimens.xml b/car_product/overlay/frameworks/base/packages/CarSystemUI/res/values-w1024dp/dimens.xml
similarity index 100%
rename from car_product/overlay/frameworks/base/packages/SystemUI/res/values-w1024dp/dimens.xml
rename to car_product/overlay/frameworks/base/packages/CarSystemUI/res/values-w1024dp/dimens.xml
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res/values-w550dp-land/dimens.xml b/car_product/overlay/frameworks/base/packages/CarSystemUI/res/values-w550dp-land/dimens.xml
similarity index 100%
rename from car_product/overlay/frameworks/base/packages/SystemUI/res/values-w550dp-land/dimens.xml
rename to car_product/overlay/frameworks/base/packages/CarSystemUI/res/values-w550dp-land/dimens.xml
diff --git a/car_product/overlay/frameworks/base/packages/CarSystemUI/res/values/config.xml b/car_product/overlay/frameworks/base/packages/CarSystemUI/res/values/config.xml
new file mode 100644
index 0000000..d8d8516
--- /dev/null
+++ b/car_product/overlay/frameworks/base/packages/CarSystemUI/res/values/config.xml
@@ -0,0 +1,83 @@
+<?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.
+*/
+-->
+
+<!-- Resource overrides for car system ui. -->
+<resources>
+
+ <!-- Notifications on the car should not show the gear icon. Swiping should only dismiss the
+ cards. -->
+ <bool name="config_showNotificationGear">false</bool>
+
+ <!-- No need to draw a background around a notification because there is no gear icon. -->
+ <bool name="config_drawNotificationBackground">false</bool>
+
+ <!-- The notification shade should only be shown on a facet click and not by dragging. -->
+ <bool name="config_enableNotificationShadeDrag">false</bool>
+
+ <!-- There should not be the ability to clear all notifications with a button. -->
+ <bool name="config_enableNotificationsClearAll">false</bool>
+
+ <!-- Hide the notification shelf so that the cards in the notification center scroll smoothly
+ off-screen. -->
+ <bool name="config_showNotificationShelf">false</bool>
+
+ <!-- The notifications should always fade when being dismissed. -->
+ <bool name="config_fadeNotificationsOnDismiss">true</bool>
+
+ <!-- The entire notification row should be translated because the cards are smaller than the
+ width of the screen. If the row is not translated, then they will be clipped. -->
+ <bool name="config_translateNotificationContentsOnSwipe">false</bool>
+
+ <!-- The notifications should fade as they are being swiped off screen. -->
+ <bool name="config_fadeDependingOnAmountSwiped">true</bool>
+
+ <!-- The expand icon should be displayed at the top right corner of the notifications. -->
+ <bool name="config_showNotificationExpandButtonAtEnd">true</bool>
+
+ <!-- A notification card that has been scrolled off screen should not be clipped in height. This
+ maintains the illusion that the cards are being scrolled underneath the status bar
+ shelf. -->
+ <bool name="config_clipNotificationScrollToTop">false</bool>
+
+ <!-- The auto notification have rounded corners. Ensure that any content is clipped to these
+ corners. -->
+ <bool name="config_clipNotificationsToOutline">true</bool>
+
+ <!-- Notifications should always be in their expanded state so that the actions are visible.
+ This will make it easier for a auto user to interact with them. -->
+ <bool name="config_alwaysExpandNonGroupedNotifications">true</bool>
+
+ <!-- Auto does not allow notifications to be toggled to and from their expanded states to
+ reduce driver distraction. -->
+ <bool name="config_enableNonGroupedNotificationExpand">false</bool>
+
+ <!-- There should always be a dividing line between notifications. -->
+ <bool name="config_showDividersWhenGroupNotificationExpanded">true</bool>
+
+ <!--- Hide the dividing lines when the notification group is expanding. -->
+ <bool name="config_hideDividersDuringTransition">true</bool>
+
+ <!-- Child notifications are displayed with no dividing space between them in auto, so disable
+ the shadow. -->
+ <bool name="config_enableShadowOnChildNotifications">false</bool>
+
+ <!-- Keep the notification background when the container has been expanded. The children will
+ expand inline within the container, so it can keep its original background. -->
+ <bool name="config_showGroupNotificationBgWhenExpanded">true</bool>
+</resources>
diff --git a/car_product/overlay/frameworks/base/packages/CarSystemUI/res/values/dimens.xml b/car_product/overlay/frameworks/base/packages/CarSystemUI/res/values/dimens.xml
new file mode 100644
index 0000000..b57fcb9
--- /dev/null
+++ b/car_product/overlay/frameworks/base/packages/CarSystemUI/res/values/dimens.xml
@@ -0,0 +1,94 @@
+<?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>
+ <!-- The alpha for the scrim behind the notification shade. This value is 1 so that the
+ scrim has no transparency. -->
+ <item name="scrim_behind_alpha" format="float" type="dimen">1.0</item>
+
+ <!-- Largest size an avatar might need to be drawn in the user picker, status bar, or
+ quick settings header -->
+ <dimen name="max_avatar_size">128dp</dimen>
+
+ <!-- The width of panel holding the notification card. -->
+ <dimen name="notification_panel_width">522dp</dimen>
+
+ <!-- The width of the quick settings panel. -1 for match_parent. -->
+ <dimen name="qs_panel_width">-1px</dimen>
+
+ <!-- Height of a small notification in the status bar-->
+ <dimen name="notification_min_height">192dp</dimen>
+
+ <!-- Height of a small notification in the status bar which was used before android N -->
+ <dimen name="notification_min_height_legacy">192dp</dimen>
+
+ <!-- Height of a large notification in the status bar -->
+ <dimen name="notification_max_height">400dp</dimen>
+
+ <!-- Height of a heads up notification in the status bar for legacy custom views -->
+ <dimen name="notification_max_heads_up_height_legacy">400dp</dimen>
+
+ <!-- Height of a heads up notification in the status bar -->
+ <dimen name="notification_max_heads_up_height">400dp</dimen>
+
+ <!-- Height of the status bar header bar -->
+ <dimen name="status_bar_header_height">54dp</dimen>
+
+ <!-- The height of the divider between the individual notifications. -->
+ <dimen name="notification_divider_height">16dp</dimen>
+
+ <!-- The height of the divider between the individual notifications when the notification
+ wants it to be increased. This value is the same as notification_divider_height so that
+ the spacing between all notifications will always be the same. -->
+ <dimen name="notification_divider_height_increased">@dimen/notification_divider_height</dimen>
+
+ <!-- The alpha of the dividing line between child notifications of a notification group. -->
+ <item name="notification_divider_alpha" format="float" type="dimen">1.0</item>
+
+ <!-- The width of each individual notification card. -->
+ <dimen name="notification_child_width">522dp</dimen>
+
+ <!-- The top margin of the notification panel. -->
+ <dimen name="notification_panel_margin_top">32dp</dimen>
+
+ <!-- The bottom margin of the panel that holds the list of notifications. -->
+ <dimen name="notification_panel_margin_bottom">@dimen/notification_divider_height</dimen>
+
+ <!-- The corner radius of the shadow behind the notification. -->
+ <dimen name="notification_shadow_radius">16dp</dimen>
+
+ <!-- The amount of space below the notification list. This value is 0 so the list scrolls
+ all the way to the bottom. -->
+ <dimen name="close_handle_underlap">0dp</dimen>
+
+ <!-- The height of the divider between the individual notifications in a notification group. -->
+ <dimen name="notification_children_container_divider_height">1dp</dimen>
+
+ <!-- The height of the header for a container containing child notifications. -->
+ <dimen name="notification_children_container_header_height">76dp</dimen>
+
+ <!-- The top margin for the notification children container in its non-expanded form. This
+ value is smaller than notification_children_container_header_height to bring the first
+ child closer so there is less wasted space. -->
+ <dimen name="notification_children_container_margin_top">68dp</dimen>
+
+ <!-- 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/car_product/overlay/frameworks/base/packages/SettingsProvider/res/values/default.xml b/car_product/overlay/frameworks/base/packages/SettingsProvider/res/values/default.xml
index a8b1fa2..6009626 100644
--- a/car_product/overlay/frameworks/base/packages/SettingsProvider/res/values/default.xml
+++ b/car_product/overlay/frameworks/base/packages/SettingsProvider/res/values/default.xml
@@ -22,4 +22,6 @@
<bool name="def_user_setup_complete">true</bool>
<bool name="def_bluetooth_on">true</bool>
<bool name="def_wifi_on">false</bool>
+ <!-- Disable system heads-up notifications -->
+ <integer name="def_heads_up_enabled">0</integer>
</resources>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res-keyguard/drawable/ic_backspace.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res-keyguard/drawable/ic_backspace.xml
deleted file mode 100644
index f3a2f0f..0000000
--- a/car_product/overlay/frameworks/base/packages/SystemUI/res-keyguard/drawable/ic_backspace.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright 2018, The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License")
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="36dp"
- android:height="36dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:fillColor="#FF000000"
- android:pathData="M9,15.59L12.59,12L9,8.41L10.41,7L14,10.59L17.59,7L19,8.41L15.41,12L19,15.59L17.59,17L14,13.41L10.41,17L9,15.59zM21,6H8l-4.5,6L8,18h13V6M21,4c1.1,0 2,0.9 2,2v12c0,1.1 -0.9,2 -2,2H8c-0.63,0 -1.22,-0.3 -1.6,-0.8L1,12l5.4,-7.2C6.78,4.3 7.37,4 8,4H21L21,4z"/>
-</vector>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res-keyguard/drawable/ic_done.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res-keyguard/drawable/ic_done.xml
deleted file mode 100644
index ef0aac2..0000000
--- a/car_product/overlay/frameworks/base/packages/SystemUI/res-keyguard/drawable/ic_done.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright 2018, The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License")
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="36dp"
- android:height="36dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:fillColor="#FF000000"
- android:pathData="M9,16.2l-3.5,-3.5a0.984,0.984 0,0 0,-1.4 0,0.984 0.984,0 0,0 0,1.4l4.19,4.19c0.39,0.39 1.02,0.39 1.41,0L20.3,7.7a0.984,0.984 0,0 0,0 -1.4,0.984 0.984,0 0,0 -1.4,0L9,16.2z"/>
-</vector>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res-keyguard/drawable/keyguard_button_background.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res-keyguard/drawable/keyguard_button_background.xml
deleted file mode 100644
index b428931..0000000
--- a/car_product/overlay/frameworks/base/packages/SystemUI/res-keyguard/drawable/keyguard_button_background.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright 2018, The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License")
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_pressed="true">
- <shape android:shape="rectangle">
- <corners android:radius="@dimen/car_button_radius"/>
- <solid android:color="#131315"/>
- </shape>
- </item>
- <item>
- <shape android:shape="rectangle">
- <corners android:radius="@dimen/car_button_radius"/>
- <solid android:color="@color/button_background"/>
- </shape>
- </item>
-</selector>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res-keyguard/layout-land/keyguard_pattern_view.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res-keyguard/layout-land/keyguard_pattern_view.xml
deleted file mode 100644
index bd94b20..0000000
--- a/car_product/overlay/frameworks/base/packages/SystemUI/res-keyguard/layout-land/keyguard_pattern_view.xml
+++ /dev/null
@@ -1,85 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License")
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<!-- Car customizations
- - Added title "Enter your Pattern" at the top
- - Hid the emergency call at the bottom
--->
-
-<com.android.keyguard.KeyguardPatternView
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/keyguard_pattern_view"
- android:orientation="horizontal"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:paddingHorizontal="@dimen/car_margin">
-
- <FrameLayout
- android:layout_height="match_parent"
- android:layout_width="0dp"
- android:layout_weight="1">
-
- <com.android.internal.widget.LockPatternView
- android:id="@+id/lockPatternView"
- android:layout_width="@dimen/keyguard_pattern_dimension"
- android:layout_height="@dimen/keyguard_pattern_dimension"
- android:layout_gravity="center"/>
- </FrameLayout>
-
- <LinearLayout
- android:id="@+id/container"
- android:layout_height="match_parent"
- android:layout_width="0dp"
- android:layout_weight="1"
- android:orientation="vertical"
- android:gravity="center_vertical">
-
- <TextView
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_margin="@dimen/car_padding_2"
- android:gravity="center"
- android:textColor="@android:color/white"
- android:textSize="@dimen/car_body1_size"
- android:text="@string/keyguard_enter_your_pattern" />
-
- <include layout="@layout/keyguard_message_area"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginBottom="@dimen/car_padding_4"/>
-
- <Button
- android:id="@+id/cancel_button"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- style="@style/KeyguardButton"
- android:text="@string/cancel"/>
-
- <include layout="@layout/keyguard_eca"
- android:id="@+id/keyguard_selector_fade_container"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:layout_gravity="bottom|center_horizontal"
- android:gravity="center_horizontal"
- android:visibility="gone" />
- </LinearLayout>
-
-</com.android.keyguard.KeyguardPatternView>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res-keyguard/layout-land/keyguard_pin_view.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res-keyguard/layout-land/keyguard_pin_view.xml
deleted file mode 100644
index 788ecfc..0000000
--- a/car_product/overlay/frameworks/base/packages/SystemUI/res-keyguard/layout-land/keyguard_pin_view.xml
+++ /dev/null
@@ -1,191 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright 2018, The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License")
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- Car customizations
- - Added title "Enter your PIN" under the entry field
- - Put backspace and enter buttons in row 4
- - PIN pad is on start side while entry field and title are on the end side
- - Hid the emergency call at the bottom
--->
-
-<com.android.keyguard.KeyguardPINView
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- android:id="@+id/keyguard_pin_view"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="horizontal"
- android:paddingHorizontal="@dimen/car_margin">
-
- <FrameLayout
- android:layout_width="0dp"
- android:layout_weight="1"
- android:layout_height="match_parent">
-
- <GridLayout
- android:id="@+id/container"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:gravity="center"
- android:columnCount="3">
-
- <!-- Row 1 -->
- <com.android.keyguard.NumPadKey
- android:id="@+id/key1"
- style="@style/NumPadKeyButton"
- app:digit="@string/one" />
- <com.android.keyguard.NumPadKey
- android:id="@+id/key2"
- style="@style/NumPadKeyButton"
- app:digit="@string/two" />
- <com.android.keyguard.NumPadKey
- android:id="@+id/key3"
- style="@style/NumPadKeyButton"
- app:digit="@string/three" />
-
- <!-- Row 2 -->
- <com.android.keyguard.NumPadKey
- android:id="@+id/key4"
- style="@style/NumPadKeyButton"
- app:digit="@string/four" />
- <com.android.keyguard.NumPadKey
- android:id="@+id/key5"
- style="@style/NumPadKeyButton"
- app:digit="@string/five" />
- <com.android.keyguard.NumPadKey
- android:id="@+id/key6"
- style="@style/NumPadKeyButton"
- app:digit="@string/six" />
-
- <!-- Row 3 -->
- <com.android.keyguard.NumPadKey
- android:id="@+id/key7"
- style="@style/NumPadKeyButton"
- app:digit="@string/seven" />
- <com.android.keyguard.NumPadKey
- android:id="@+id/key8"
- style="@style/NumPadKeyButton"
- app:digit="@string/eight" />
- <com.android.keyguard.NumPadKey
- android:id="@+id/key9"
- style="@style/NumPadKeyButton"
- app:digit="@string/nine" />
-
- <!-- Row 4 -->
- <ImageButton
- android:id="@+id/delete_button"
- style="@style/NumPadKeyButton"
- android:gravity="center_vertical"
- android:src="@drawable/ic_backspace"
- android:clickable="true"
- android:tint="@android:color/white"
- android:background="@drawable/ripple_drawable"
- android:contentDescription="@string/keyboardview_keycode_delete" />
- <com.android.keyguard.NumPadKey
- android:id="@+id/key0"
- style="@style/NumPadKeyButton"
- app:digit="@string/zero" />
- <ImageButton
- android:id="@+id/key_enter"
- style="@style/NumPadKeyButton"
- android:src="@drawable/ic_done"
- android:tint="@android:color/white"
- android:background="@drawable/ripple_drawable"
- android:contentDescription="@string/keyboardview_keycode_enter" />
- </GridLayout>
- </FrameLayout>
-
- <LinearLayout
- android:layout_width="0dp"
- android:layout_height="match_parent"
- android:layout_weight="1"
- android:gravity="center"
- android:orientation="vertical">
-
- <com.android.keyguard.PasswordTextView
- android:id="@+id/pinEntry"
- android:layout_width="@dimen/keyguard_security_width"
- android:layout_height="@dimen/pin_entry_height"
- android:gravity="center"
- app:scaledTextSize="@integer/password_text_view_scale"
- android:contentDescription="@string/keyguard_accessibility_pin_area" />
-
- <View
- android:id="@+id/divider"
- android:layout_width="@dimen/keyguard_security_width"
- android:layout_height="@dimen/divider_height"
- android:background="@android:color/white" />
-
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_margin="@dimen/car_padding_2"
- android:gravity="center"
- android:textColor="@android:color/white"
- android:textSize="@dimen/car_body1_size"
- android:text="@string/keyguard_enter_your_pin" />
-
- <include layout="@layout/keyguard_message_area"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginBottom="@dimen/car_padding_4"/>
-
- <Button
- android:id="@+id/cancel_button"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- style="@style/KeyguardButton"
- android:text="@string/cancel"/>
- </LinearLayout>
-
- <!-- KeyguardPinView references these resources ids in code so removing them will cause the
- keyguard to crash. Instead put them down here where they are out of the way and set their
- visibility to gone. -->
- <com.android.keyguard.AlphaOptimizedRelativeLayout
- android:id="@+id/row0"
- android:layout_width="0dp"
- android:layout_height="0dp"
- android:visibility="gone" />
- <LinearLayout
- android:id="@+id/row1"
- android:layout_width="0dp"
- android:layout_height="0dp"
- android:visibility="gone" />
- <LinearLayout
- android:id="@+id/row2"
- android:layout_width="0dp"
- android:layout_height="0dp"
- android:visibility="gone" />
- <LinearLayout
- android:id="@+id/row3"
- android:layout_width="0dp"
- android:layout_height="0dp"
- android:visibility="gone" />
- <LinearLayout
- android:id="@+id/row4"
- android:layout_width="0dp"
- android:layout_height="0dp"
- android:visibility="gone" />
-
- <include layout="@layout/keyguard_eca"
- android:id="@+id/keyguard_selector_fade_container"
- android:layout_width="0dp"
- android:layout_height="0dp"
- android:visibility="gone" />
-</com.android.keyguard.KeyguardPINView>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res-keyguard/layout/keyguard_bouncer.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res-keyguard/layout/keyguard_bouncer.xml
deleted file mode 100644
index 062f7bd..0000000
--- a/car_product/overlay/frameworks/base/packages/SystemUI/res-keyguard/layout/keyguard_bouncer.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
- ~ Copyright (C) 2018 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License
- -->
-
-<!-- Car customizations
- Car has solid black background instead of a transparent one
--->
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:background="@android:color/black"
- android:fitsSystemWindows="true">
-
- <include
- style="@style/BouncerSecurityContainer"
- layout="@layout/keyguard_host_view"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
-</FrameLayout>
-
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res-keyguard/layout/keyguard_num_pad_key.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res-keyguard/layout/keyguard_num_pad_key.xml
deleted file mode 100644
index c7eda38..0000000
--- a/car_product/overlay/frameworks/base/packages/SystemUI/res-keyguard/layout/keyguard_num_pad_key.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
- ~ Copyright (C) 2018 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License
- -->
-
-<!-- Car customizations
- The mnemonics is not shown for car but KeyguardPinView references the resource id in code.
- Removing it will cause the keyguard to crash. Hide them instead
--->
-<merge xmlns:android="http://schemas.android.com/apk/res/android">
- <TextView
- android:id="@+id/digit_text"
- style="@style/Widget.TextView.NumPadKey"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- />
- <!-- The mnemonics is not shown for car but KeyguardPinView references the resource id in code.
- Removing it will cause the keyguard to crash. Hide them instead -->
- <TextView
- android:id="@+id/klondike_text"
- android:layout_width="0dp"
- android:layout_height="0dp"
- android:visibility="gone"
- />
-</merge>
-
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res-keyguard/layout/keyguard_password_view.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res-keyguard/layout/keyguard_password_view.xml
deleted file mode 100644
index cab52e8..0000000
--- a/car_product/overlay/frameworks/base/packages/SystemUI/res-keyguard/layout/keyguard_password_view.xml
+++ /dev/null
@@ -1,109 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License")
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<!-- Car customizations
- - Added title "Enter your Password" below the password field
- - Hid the emergency call at the bottom
--->
-
-<com.android.keyguard.KeyguardPasswordView
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:androidprv="http://schemas.android.com/apk/res-auto"
- android:id="@+id/keyguard_password_view"
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- androidprv:layout_maxWidth="@dimen/keyguard_security_width"
- androidprv:layout_maxHeight="@dimen/keyguard_security_height"
- android:gravity="center"
- >
-
- <include
- layout="@layout/keyguard_message_area"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginBottom="@dimen/car_padding_2"/>
-
- <!-- Password entry field -->
- <LinearLayout
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:layout_gravity="center_horizontal"
- android:orientation="vertical"
- android:theme="?attr/passwordStyle">
-
- <EditText
- android:id="@+id/passwordEntry"
- android:layout_width="@dimen/password_field_width"
- android:layout_height="wrap_content"
- android:gravity="center_horizontal"
- android:singleLine="true"
- android:textStyle="normal"
- android:inputType="textPassword"
- android:textSize="@dimen/car_body1_size"
- android:textColor="?attr/wallpaperTextColor"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:imeOptions="flagForceAscii|actionDone"
- android:maxLength="@integer/password_text_view_scale"
- />
-
- <TextView
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_margin="@dimen/car_padding_2"
- android:gravity="center"
- android:textColor="@android:color/white"
- android:textSize="@dimen/car_body1_size"
- android:text="@string/keyguard_enter_your_password" />
-
- <Button
- android:id="@+id/cancel_button"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- style="@style/KeyguardButton"
- android:text="@string/cancel"/>
-
- <ImageView android:id="@+id/switch_ime_button"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginBottom="12dp"
- android:src="@drawable/ic_lockscreen_ime"
- android:contentDescription="@string/accessibility_ime_switch_button"
- android:clickable="true"
- android:padding="8dp"
- android:tint="@color/background_protected"
- android:layout_gravity="end|center_vertical"
- android:background="?android:attr/selectableItemBackground"
- android:visibility="gone"
- />
- </LinearLayout>
-
- <include layout="@layout/keyguard_eca"
- android:id="@+id/keyguard_selector_fade_container"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginBottom="12dp"
- android:orientation="vertical"
- android:layout_gravity="bottom|center_horizontal"
- android:gravity="center_horizontal"
- android:visibility="gone"
- />
-
-</com.android.keyguard.KeyguardPasswordView>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res-keyguard/layout/keyguard_pattern_view.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res-keyguard/layout/keyguard_pattern_view.xml
deleted file mode 100644
index de879e0..0000000
--- a/car_product/overlay/frameworks/base/packages/SystemUI/res-keyguard/layout/keyguard_pattern_view.xml
+++ /dev/null
@@ -1,86 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License")
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<!-- Car customizations
- - Added title "Enter your Pattern" at the top
- - Hid the emergency call at the bottom
--->
-
-<com.android.keyguard.KeyguardPatternView
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:androidprv="http://schemas.android.com/apk/res-auto"
- android:id="@+id/keyguard_pattern_view"
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- androidprv:layout_maxWidth="@dimen/keyguard_security_width"
- android:gravity="center_horizontal">
-
- <FrameLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <LinearLayout
- android:id="@+id/container"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:orientation="vertical"
- android:layout_gravity="center">
-
- <TextView
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_margin="@dimen/car_padding_2"
- android:gravity="center"
- android:textColor="@android:color/white"
- android:textSize="@dimen/car_body1_size"
- android:text="@string/keyguard_enter_your_pattern" />
-
- <include layout="@layout/keyguard_message_area"
- android:layout_width="match_parent"
- android:layout_height="wrap_content" />
-
- <com.android.internal.widget.LockPatternView
- android:id="@+id/lockPatternView"
- android:layout_width="@dimen/keyguard_pattern_dimension"
- android:layout_height="@dimen/keyguard_pattern_dimension"
- android:layout_marginVertical="@dimen/pin_pattern_pad_margin_vertical"
- android:layout_gravity="center_horizontal"
- android:gravity="center" />
-
- <Button
- android:id="@+id/cancel_button"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- style="@style/KeyguardButton"
- android:text="@string/cancel"/>
-
- <include layout="@layout/keyguard_eca"
- android:id="@+id/keyguard_selector_fade_container"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:layout_gravity="bottom|center_horizontal"
- android:gravity="center_horizontal"
- android:visibility="gone" />
- </LinearLayout>
- </FrameLayout>
-
-</com.android.keyguard.KeyguardPatternView>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res-keyguard/layout/keyguard_pin_view.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res-keyguard/layout/keyguard_pin_view.xml
deleted file mode 100644
index 657595b..0000000
--- a/car_product/overlay/frameworks/base/packages/SystemUI/res-keyguard/layout/keyguard_pin_view.xml
+++ /dev/null
@@ -1,191 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright 2018, The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License")
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- Car customizations
- - Added title "Enter your PIN" under the entry field
- - Put backspace and enter buttons in row 4
- - Hid the emergency call at the bottom
--->
-
-<com.android.keyguard.KeyguardPINView
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- android:id="@+id/keyguard_pin_view"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_marginLeft="@dimen/num_pad_margin_left"
- android:layout_marginRight="@dimen/num_pad_margin_right"
- android:orientation="vertical"
- android:gravity="center">
-
- <LinearLayout
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:gravity="center"
- android:orientation="vertical">
-
- <com.android.keyguard.PasswordTextView
- android:id="@+id/pinEntry"
- android:layout_width="@dimen/keyguard_security_width"
- android:layout_height="@dimen/pin_entry_height"
- android:gravity="center"
- app:scaledTextSize="@integer/password_text_view_scale"
- android:contentDescription="@string/keyguard_accessibility_pin_area" />
-
- <View
- android:id="@+id/divider"
- android:layout_width="@dimen/keyguard_security_width"
- android:layout_height="@dimen/divider_height"
- android:background="@android:color/white" />
-
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_margin="@dimen/car_padding_2"
- android:gravity="center"
- android:textColor="@android:color/white"
- android:textSize="@dimen/car_body1_size"
- android:text="@string/keyguard_enter_your_pin" />
-
- <include
- layout="@layout/keyguard_message_area"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
- </LinearLayout>
-
- <GridLayout
- android:id="@+id/container"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginVertical="@dimen/pin_pattern_pad_margin_vertical"
- android:columnCount="3">
-
- <!-- Row 1 -->
- <com.android.keyguard.NumPadKey
- android:id="@+id/key1"
- style="@style/NumPadKeyButton"
- app:digit="@string/one" />
- <com.android.keyguard.NumPadKey
- android:id="@+id/key2"
- style="@style/NumPadKeyButton"
- app:digit="@string/two" />
- <com.android.keyguard.NumPadKey
- android:id="@+id/key3"
- style="@style/NumPadKeyButton"
- app:digit="@string/three" />
-
- <!-- Row 2 -->
- <com.android.keyguard.NumPadKey
- android:id="@+id/key4"
- style="@style/NumPadKeyButton"
- app:digit="@string/four" />
- <com.android.keyguard.NumPadKey
- android:id="@+id/key5"
- style="@style/NumPadKeyButton"
- app:digit="@string/five" />
- <com.android.keyguard.NumPadKey
- android:id="@+id/key6"
- style="@style/NumPadKeyButton"
- app:digit="@string/six" />
-
- <!-- Row 3 -->
- <com.android.keyguard.NumPadKey
- android:id="@+id/key7"
- style="@style/NumPadKeyButton"
- app:digit="@string/seven" />
- <com.android.keyguard.NumPadKey
- android:id="@+id/key8"
- style="@style/NumPadKeyButton"
- app:digit="@string/eight" />
- <com.android.keyguard.NumPadKey
- android:id="@+id/key9"
- style="@style/NumPadKeyButton"
- app:digit="@string/nine" />
-
- <!-- Row 4 -->
- <ImageButton
- android:id="@+id/delete_button"
- style="@style/NumPadKeyButton"
- android:gravity="center_vertical"
- android:src="@drawable/ic_backspace"
- android:clickable="true"
- android:tint="@android:color/white"
- android:background="@drawable/ripple_drawable"
- android:contentDescription="@string/keyboardview_keycode_delete" />
- <com.android.keyguard.NumPadKey
- android:id="@+id/key0"
- style="@style/NumPadKeyButton"
- app:digit="@string/zero" />
- <ImageButton
- android:id="@+id/key_enter"
- style="@style/NumPadKeyButton"
- android:src="@drawable/ic_done"
- android:tint="@android:color/white"
- android:background="@drawable/ripple_drawable"
- android:contentDescription="@string/keyboardview_keycode_enter" />
- </GridLayout>
-
- <Button
- android:id="@+id/cancel_button"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- style="@style/KeyguardButton"
- android:text="@string/cancel"/>
-
- </LinearLayout>
-
- <!-- KeyguardPinView references these resources ids in code so removing them will cause the
- keyguard to crash. Instead put them down here where they are out of the way and set their
- visibility to gone. -->
- <com.android.keyguard.AlphaOptimizedRelativeLayout
- android:id="@+id/row0"
- android:layout_width="0dp"
- android:layout_height="0dp"
- android:visibility="gone" />
- <LinearLayout
- android:id="@+id/row1"
- android:layout_width="0dp"
- android:layout_height="0dp"
- android:visibility="gone" />
- <LinearLayout
- android:id="@+id/row2"
- android:layout_width="0dp"
- android:layout_height="0dp"
- android:visibility="gone" />
- <LinearLayout
- android:id="@+id/row3"
- android:layout_width="0dp"
- android:layout_height="0dp"
- android:visibility="gone" />
- <LinearLayout
- android:id="@+id/row4"
- android:layout_width="0dp"
- android:layout_height="0dp"
- android:visibility="gone" />
-
- <include
- layout="@layout/keyguard_eca"
- android:id="@+id/keyguard_selector_fade_container"
- android:layout_width="0dp"
- android:layout_height="0dp"
- android:visibility="gone" />
-</com.android.keyguard.KeyguardPINView>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res-keyguard/values-h1000dp/dimens.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res-keyguard/values-h1000dp/dimens.xml
deleted file mode 100644
index 24f1ee3..0000000
--- a/car_product/overlay/frameworks/base/packages/SystemUI/res-keyguard/values-h1000dp/dimens.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright 2018s, The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License")
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT 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>
- <dimen name="pin_pattern_pad_margin_vertical">178dp</dimen>
-</resources>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res-keyguard/values/colors.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res-keyguard/values/colors.xml
deleted file mode 100644
index a75dd88..0000000
--- a/car_product/overlay/frameworks/base/packages/SystemUI/res-keyguard/values/colors.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright 2018, The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License")
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<resources>
- <color name="button_background">@color/car_dark_blue_grey_600</color>
- <color name="button_text">@color/car_action1_dark</color>
-</resources>
\ No newline at end of file
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res-keyguard/values/dimens.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res-keyguard/values/dimens.xml
deleted file mode 100644
index b7967c4..0000000
--- a/car_product/overlay/frameworks/base/packages/SystemUI/res-keyguard/values/dimens.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?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.
--->
-<resources>
- <dimen name="num_pad_margin_left">112dp</dimen>
- <dimen name="num_pad_margin_right">144dp</dimen>
- <dimen name="num_pad_key_width">120dp</dimen>
- <dimen name="num_pad_key_height">80dp</dimen>
- <dimen name="num_pad_key_margin">12dp</dimen>
- <dimen name="pin_entry_height">@dimen/num_pad_key_height</dimen>
- <dimen name="divider_height">1dp</dimen>
- <dimen name="key_enter_margin_top">128dp</dimen>
- <dimen name="keyguard_pattern_dimension">400dp</dimen>
- <dimen name="password_field_width">350dp</dimen>
- <dimen name="pin_pattern_pad_margin_vertical">0dp</dimen>
-</resources>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res-keyguard/values/integers.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res-keyguard/values/integers.xml
deleted file mode 100644
index bad1346..0000000
--- a/car_product/overlay/frameworks/base/packages/SystemUI/res-keyguard/values/integers.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?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.
--->
-<resources>
- <integer name="password_text_view_scale">40</integer>
- <integer name="password_max_length">500</integer>
-</resources>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res-keyguard/values/strings.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res-keyguard/values/strings.xml
deleted file mode 100644
index cabeec2..0000000
--- a/car_product/overlay/frameworks/base/packages/SystemUI/res-keyguard/values/strings.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?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.
--->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="zero">0</string>
- <string name="one">1</string>
- <string name="two">2</string>
- <string name="three">3</string>
- <string name="four">4</string>
- <string name="five">5</string>
- <string name="six">6</string>
- <string name="seven">7</string>
- <string name="eight">8</string>
- <string name="nine">9</string>
-</resources>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res-keyguard/values/styles.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res-keyguard/values/styles.xml
deleted file mode 100644
index e26c515..0000000
--- a/car_product/overlay/frameworks/base/packages/SystemUI/res-keyguard/values/styles.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?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.
--->
-<resources xmlns:android="http://schemas.android.com/apk/res/android">
-
- <!-- The style for the volume icons in the volume dialog. This style makes the icon scale to
- fit its container since auto wants the icon to be larger. The padding is added to make it
- so the icon does not press along the edges of the dialog. -->
- <style name="NumPadKeyButton">
- <item name="android:layout_width">@dimen/num_pad_key_width</item>
- <item name="android:layout_height">@dimen/num_pad_key_height</item>
- <item name="android:layout_margin">@dimen/num_pad_key_margin</item>
- <item name="textView">@id/pinEntry</item>
- </style>
-
- <style name="KeyguardButton" parent="Widget.Car.Button">
- <item name="android:background">@drawable/keyguard_button_background</item>
- <item name="android:textColor">@color/button_text</item>
- <item name="android:textAllCaps">false</item>
- </style>
-
- <style name="Widget.TextView.NumPadKey" parent="@android:style/Widget.TextView">
- <!-- Only replaces the text size. -->
- <item name="android:textSize">@dimen/car_body1_size</item>
- </style>
-</resources>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_apps.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_apps.xml
deleted file mode 100644
index f5fbe6d..0000000
--- a/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_apps.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="56dp"
- android:height="56dp"
- android:viewportWidth="48"
- android:viewportHeight="48">
-
- <path
- android:fillColor="#FFFFFF"
- android:pathData="M8 16h8V8H8v8zm12 24h8v-8h-8v8zM8 40h8v-8H8v8zm0-12h8v-8H8v8zm12 0h8v-8h-8v8zM32
-8v8h8V8h-8zm-12 8h8V8h-8v8zm12 12h8v-8h-8v8zm0 12h8v-8h-8v8z" />
- <path
- android:pathData="M0 0h48v48H0z" />
-</vector>
\ No newline at end of file
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_car.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_car.xml
deleted file mode 100644
index ba52f1f..0000000
--- a/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_car.xml
+++ /dev/null
@@ -1,24 +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.
--->
-<vector android:height="56dp" android:viewportHeight="24.0"
- android:viewportWidth="24.0" android:width="56dp" xmlns:android="http://schemas.android.com/apk/res/android">
- <path android:fillColor="#FFFFFFFF"
- android:pathData="M7.289,7.507C7.166,7.242 7.282,7.126 7.546,7.249L12.688,10.138C13.325,10.442 13.77,11.087 13.77,11.841C13.77,12.884 12.923,13.73 11.88,13.73C11.126,13.73 10.481,13.286 10.178,12.648L7.289,7.507Z"
- android:strokeColor="#00000000" android:strokeWidth="1"/>
- <path android:fillColor="#FFFFFFFF"
- android:pathData="M19.068,4.928C15.534,1.392 10.027,1.061 6.114,3.922L7.544,5.353C10.655,3.263 14.905,3.525 17.653,6.276C20.778,9.402 20.779,14.862 17.653,17.531L6.337,17.531C3.562,14.862 3.256,10.517 5.411,7.397L3.982,6.001C1.06,9.922 1.366,15.506 4.922,19.065C8.829,22.974 15.163,22.981 19.071,19.069C22.98,15.159 22.974,8.837 19.068,4.928L19.068,4.928Z"
- android:strokeColor="#00000000" android:strokeWidth="1"/>
-</vector>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_hvac.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_hvac.xml
deleted file mode 100644
index bdc44b3..0000000
--- a/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_hvac.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="37dp"
- android:height="31dp"
- android:viewportWidth="37"
- android:viewportHeight="31">
-
- <group
- android:translateX="-4.000000"
- android:translateY="-6.000000">
- <group
- android:translateX="5.000000"
- android:translateY="5.000000">
- <path
- android:fillType="evenOdd"
- android:strokeColor="#FAFAFA"
- android:strokeWidth="3.5"
- android:pathData="M0.320769938,6.07518051 C6.46754647,1.46509811 12.4222362,1.46509811
-18.1848392,6.07518051 C23.9474422,10.6852629 29.3258717,10.4931761
-34.3201276,5.49892021" />
- <path
- android:fillType="evenOdd"
- android:strokeColor="#FAFAFA"
- android:strokeWidth="3.5"
- android:pathData="M0.320769938,17.0751805 C6.46754647,12.4650981 12.4222362,12.4650981
-18.1848392,17.0751805 C23.9474422,21.6852629 29.3258717,21.4931761
-34.3201276,16.4989202" />
- <path
- android:fillType="evenOdd"
- android:strokeColor="#FAFAFA"
- android:strokeWidth="3.5"
- android:pathData="M0.320769938,28.0751805 C6.46754647,23.4650981 12.4222362,23.4650981
-18.1848392,28.0751805 C23.9474422,32.6852629 29.3258717,32.4931761
-34.3201276,27.4989202" />
- </group>
- </group>
-</vector>
\ No newline at end of file
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_music.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_music.xml
deleted file mode 100644
index 5ad7537..0000000
--- a/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_music.xml
+++ /dev/null
@@ -1,30 +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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="56dp"
- android:height="56dp"
- android:viewportWidth="48"
- android:viewportHeight="48">
-
- <path
- android:fillAlpha=".1"
- android:strokeAlpha=".1"
- android:pathData="M0 0h48v48H0z" />
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M24 2C14.06 2 6 10.06 6 20v14c0 3.31 2.69 6 6 6h6V24h-8v-4c0-7.73 6.27-14
-14-14s14 6.27 14 14v4h-8v16h6c3.31 0 6-2.69 6-6V20c0-9.94-8.06-18-18-18z" />
-</vector>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_navigation.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_navigation.xml
deleted file mode 100644
index 980c4d8..0000000
--- a/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_navigation.xml
+++ /dev/null
@@ -1,28 +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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="56dp"
- android:height="56dp"
- android:viewportWidth="48"
- android:viewportHeight="48">
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M43.41 22.59l-18-18c-.78-.78-2.05-.78-2.82 0l-18 18c-.78 .78 -.78 2.05 0 2.83l18
-17.99v.01c.78 .78 2.05 .78 2.83 0l18-18c.78-.79 .78 -2.05-.01-2.83zM28
-29v-5h-8v6h-4v-8c0-1.11 .89 -2 2-2h10v-5l7 7-7 7z" />
- <path
- android:pathData="M0 0h48v48H0z" />
-</vector>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_notification.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_notification.xml
deleted file mode 100644
index 61d937b..0000000
--- a/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_notification.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<!--
- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="56dp"
- android:height="56dp"
- android:viewportWidth="48"
- android:viewportHeight="48">
-
- <path
- android:fillColor="#FFFFFF"
- android:pathData="M24 44c2.21 0 4-1.79 4-4h-8c0 2.21 1.79 4 4
-4zm12-12V22c0-6.15-3.27-11.28-9-12.64V8c0-1.66-1.34-3-3-3s-3 1.34-3 3v1.36c-5.73
-1.36-9 6.49-9 12.64v10l-4 4v2h32v-2l-4-4zm-4 2H16V22c0-4.97 3.03-9 8-9s8 4.03 8
-9v12z" />
-</vector>
\ No newline at end of file
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_overview.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_overview.xml
deleted file mode 100644
index 4651dcb..0000000
--- a/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_overview.xml
+++ /dev/null
@@ -1,28 +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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="56dp"
- android:height="56dp"
- android:viewportWidth="48"
- android:viewportHeight="48">
-
- <path
- android:pathData="M0 0h48v48H0z" />
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M24 4C12.95 4 4 12.95 4 24s8.95 20 20 20 20-8.95 20-20S35.05 4 24 4zm0 36c-8.82
-0-16-7.18-16-16S15.18 8 24 8s16 7.18 16 16-7.18 16-16 16z" />
-</vector>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_phone.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_phone.xml
deleted file mode 100644
index 87bfdf7..0000000
--- a/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_phone.xml
+++ /dev/null
@@ -1,30 +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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="56dp"
- android:height="56dp"
- android:viewportWidth="48"
- android:viewportHeight="48">
-
- <path
- android:pathData="M0 0h48v48H0z" />
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M13.25 21.59c2.88 5.66 7.51 10.29 13.18 13.17l4.4-4.41c.55-.55 1.34-.71
-2.03-.49C35.1 30.6 37.51 31 40 31c1.11 0 2 .89 2 2v7c0 1.11-.89 2-2 2C21.22 42 6
-26.78 6 8c0-1.11 .9 -2 2-2h7c1.11 0 2 .89 2 2 0 2.49 .4 4.9 1.14 7.14 .22 .69
-.06 1.48-.49 2.03l-4.4 4.42z" />
-</vector>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_seekbar_thumb.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_seekbar_thumb.xml
deleted file mode 100644
index a29ddc8..0000000
--- a/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_seekbar_thumb.xml
+++ /dev/null
@@ -1,28 +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
- -->
-
-<shape
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:shape="oval">
- <solid android:color="@color/car_teal_700" />
- <size
- android:width="30dp"
- android:height="30dp" />
- <stroke
- android:width="1dp"
- android:color="@color/car_teal_700" />
-</shape>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_seekbar_track.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_seekbar_track.xml
deleted file mode 100644
index 2b42d9d..0000000
--- a/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_seekbar_track.xml
+++ /dev/null
@@ -1,38 +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
- -->
-
-<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
- <!-- Use android provided id, as seekbar is expecting that -->
- <item android:id="@android:id/background">
- <shape android:shape="line">
- <corners
- android:radius="3dp"/>
- <stroke
- android:width="3dp"
- android:color="@color/car_grey_300" />
- </shape>
- </item>
- <item android:id="@android:id/progress">
- <clip>
- <shape android:shape="line">
- <stroke
- android:width="6dp"
- android:color="@color/car_teal_700" />
- </shape>
- </clip>
- </item>
-</layer-list>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/notification_material_bg.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/notification_material_bg.xml
deleted file mode 100644
index 039833b..0000000
--- a/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/notification_material_bg.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- 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.
--->
-<ripple xmlns:android="http://schemas.android.com/apk/res/android"
- android:color="@color/notification_ripple_untinted_color">
- <item>
- <shape xmlns:android="http://schemas.android.com/apk/res/android">
- <solid android:color="@color/notification_material_background_color" />
- <corners
- android:radius="@dimen/notification_shadow_radius"/>
- </shape>
- </item>
-</ripple>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/notification_material_bg_dim.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/notification_material_bg_dim.xml
deleted file mode 100644
index 90c793f..0000000
--- a/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/notification_material_bg_dim.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-<ripple xmlns:android="http://schemas.android.com/apk/res/android"
- android:color="@color/notification_ripple_untinted_color">
- <item>
- <shape xmlns:android="http://schemas.android.com/apk/res/android">
- <solid android:color="@color/notification_material_background_color" />
- <corners
- android:radius="@dimen/notification_shadow_radius"/>
- </shape>
- </item>
-</ripple>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/volume_dialog_background.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/volume_dialog_background.xml
deleted file mode 100644
index 345692f..0000000
--- a/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/volume_dialog_background.xml
+++ /dev/null
@@ -1,26 +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.
--->
-<shape xmlns:android="http://schemas.android.com/apk/res/android" >
- <solid android:color="?android:attr/colorBackgroundFloating" />
- <padding
- android:bottom="5dp"
- android:left="5dp"
- android:right="5dp"
- android:top="5dp" />
- <corners android:bottomLeftRadius="20dp"
- android:bottomRightRadius="20dp"/>
-</shape>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res/layout/car_navigation_bar.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res/layout/car_navigation_bar.xml
deleted file mode 100644
index a4902cd..0000000
--- a/car_product/overlay/frameworks/base/packages/SystemUI/res/layout/car_navigation_bar.xml
+++ /dev/null
@@ -1,165 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<com.android.systemui.statusbar.car.CarNavigationBarView
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:systemui="http://schemas.android.com/apk/res-auto"
- android:layout_height="match_parent"
- android:layout_width="match_parent"
- android:background="@drawable/system_bar_background">
-
- <LinearLayout
- android:layout_height="match_parent"
- android:layout_width="wrap_content"
- android:paddingStart="@dimen/car_keyline_1"
- android:paddingEnd="@dimen/car_keyline_1"
- android:orientation="horizontal"
- android:id="@+id/nav_buttons"
- android:gravity="center"
- android:layout_weight="1"
- android:animateLayoutChanges="true">
-
- <com.android.systemui.statusbar.car.CarNavigationButton
- android:id="@+id/home"
- style="@style/NavigationBarButton"
- systemui:intent="intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.HOME;launchFlags=0x14000000;end"
- android:src="@drawable/car_ic_overview"
- android:background="?android:attr/selectableItemBackground"
- />
-
- <com.android.systemui.statusbar.car.CarFacetButton
- android:id="@+id/maps_nav"
- style="@style/NavigationBarButton"
- systemui:icon="@drawable/car_ic_navigation"
- systemui:intent="intent:#Intent;component=com.android.car.mapsplaceholder/.MapsPlaceholderActivity;launchFlags=0x24000000;end"
- systemui:componentNames="com.android.car.mapsplaceholder/.MapsPlaceholderActivity"
- />
-
- <com.android.systemui.statusbar.car.CarFacetButton
- android:id="@+id/music_nav"
- style="@style/NavigationBarButton"
- systemui:icon="@drawable/car_ic_music"
- systemui:intent="intent:#Intent;component=com.android.car.media/.MediaActivity;launchFlags=0x14000000;end"
- systemui:packages="com.android.car.media"
- />
-
- <com.android.systemui.statusbar.car.CarFacetButton
- android:id="@+id/phone_nav"
- style="@style/NavigationBarButton"
- systemui:icon="@drawable/car_ic_phone"
- systemui:intent="intent:#Intent;component=com.android.car.dialer/.TelecomActivity;launchFlags=0x14000000;end"
- systemui:componentNames="com.android.car.dialer/.TelecomActivity"
- />
-
- <com.android.systemui.statusbar.car.CarFacetButton
- android:id="@+id/grid_nav"
- style="@style/NavigationBarButton"
- systemui:icon="@drawable/car_ic_apps"
- systemui:intent="intent:#Intent;component=com.android.car.carlauncher/.AppGridActivity;launchFlags=0x24000000;end"
- systemui:componentNames="com.android.car.carlauncher/.AppGridActivity"
- />
-
- <Space
- android:layout_height="match_parent"
- android:layout_width="0dp"
- android:layout_weight="1"/>
-
- <com.android.systemui.statusbar.car.CarNavigationButton
- android:id="@+id/hvac"
- style="@style/NavigationBarButton"
- systemui:intent="intent:#Intent;action=android.car.intent.action.TOGGLE_HVAC_CONTROLS;end"
- systemui:broadcast="true"
- android:src="@drawable/car_ic_hvac"
- android:background="?android:attr/selectableItemBackground"
- />
-
- <com.android.keyguard.AlphaOptimizedImageButton
- android:id="@+id/notifications"
- style="@style/NavigationBarButton"
- android:src="@drawable/car_ic_notification"
- android:background="?android:attr/selectableItemBackground"
- />
-
- <FrameLayout
- android:id="@+id/clock_container"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:layout_centerInParent="true"
- >
- <com.android.systemui.statusbar.car.CarNavigationButton
- android:id="@+id/qs"
- android:layout_height="match_parent"
- android:layout_width="match_parent"
- android:background="@null"
- systemui:intent="intent:#Intent;component=com.android.car.settings/.common.CarSettingActivity;launchFlags=0x14008000;end"
- />
- <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"
- />
- </FrameLayout>
- </LinearLayout>
-
- <LinearLayout
- android:layout_height="match_parent"
- android:layout_width="wrap_content"
- android:gravity="center"
- android:paddingStart="@dimen/car_keyline_1"
- android:paddingEnd="@dimen/car_keyline_1"
- android:id="@+id/lock_screen_nav_buttons"
- android:layout_weight="1"
- android:visibility="gone">
-
- <Space
- android:layout_height="match_parent"
- android:layout_width="0dp"
- android:layout_weight="1"/>
-
- <com.android.systemui.statusbar.car.CarNavigationButton
- android:id="@+id/hvac_lockscreen"
- style="@style/NavigationBarButton"
- systemui:intent="intent:#Intent;action=android.car.intent.action.TOGGLE_HVAC_CONTROLS;end"
- systemui:broadcast="true"
- android:src="@drawable/car_ic_hvac"
- android:background="?android:attr/selectableItemBackground"
- />
-
- <Space
- style="@style/NavigationBarButton"/>
-
- <com.android.systemui.statusbar.policy.Clock
- android:id="@+id/clock_lockscreen"
- 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"
- />
- </LinearLayout>
-
-</com.android.systemui.statusbar.car.CarNavigationBarView>
-
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res/layout/status_bar.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res/layout/status_bar.xml
deleted file mode 100644
index b99bfe8..0000000
--- a/car_product/overlay/frameworks/base/packages/SystemUI/res/layout/status_bar.xml
+++ /dev/null
@@ -1,91 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 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.
-*/
--->
-
-<com.android.systemui.statusbar.phone.PhoneStatusBarView
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:systemui="http://schemas.android.com/apk/res/com.android.systemui"
- android:id="@+id/status_bar"
- android:layout_width="match_parent"
- android:layout_height="@dimen/status_bar_height"
- android:background="@drawable/system_bar_background"
- android:orientation="vertical"
- android:focusable="false"
- android:descendantFocusability="afterDescendants"
- >
-
- <ImageView
- android:id="@+id/notification_lights_out"
- android:layout_width="@dimen/status_bar_icon_size"
- android:layout_height="match_parent"
- android:paddingStart="6dip"
- android:paddingBottom="2dip"
- android:src="@drawable/ic_sysbar_lights_out_dot_small"
- android:scaleType="center"
- android:visibility="gone"
- />
-
- <LinearLayout android:id="@+id/status_bar_contents"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:paddingStart="6dp"
- android:paddingEnd="8dp"
- android:orientation="horizontal"
- >
-
- <include layout="@layout/heads_up_status_bar_layout" />
-
- <!-- The alpha of this area is controlled from both PhoneStatusBarTransitions and
- PhoneStatusBar (DISABLE_NOTIFICATION_ICONS). -->
- <com.android.systemui.statusbar.AlphaOptimizedFrameLayout
- android:id="@+id/notification_icon_area"
- android:layout_width="0dip"
- android:layout_height="match_parent"
- android:layout_weight="1"
- android:orientation="horizontal"
- android:visibility="gone" />
-
- <com.android.keyguard.AlphaOptimizedLinearLayout android:id="@+id/system_icon_area"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="horizontal"
- >
-
- <include layout="@layout/system_icons" />
-
- <!-- Sort of a crude hack but we can't do much here without refactoring
- system ui code. -->
- <Space
- android:layout_width="0dp"
- android:layout_height="match_parent"
- android:layout_weight="1" />
-
- <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|end"
- />
- </com.android.keyguard.AlphaOptimizedLinearLayout>
- </LinearLayout>
-
-</com.android.systemui.statusbar.phone.PhoneStatusBarView>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res/values-night/colors.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res/values-night/colors.xml
deleted file mode 100644
index 26479a5..0000000
--- a/car_product/overlay/frameworks/base/packages/SystemUI/res/values-night/colors.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>
- <color name="status_bar_background_color">#ff000000</color>
- <color name="system_bar_background_opaque">#ff0c1013</color>
-
- <!-- The color of the ripples on the untinted notifications -->
- <color name="notification_ripple_untinted_color">@color/ripple_material_dark</color>
-</resources>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res/values-sw720dp/dimens.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res/values-sw720dp/dimens.xml
deleted file mode 100644
index 3ab2968..0000000
--- a/car_product/overlay/frameworks/base/packages/SystemUI/res/values-sw720dp/dimens.xml
+++ /dev/null
@@ -1,22 +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>
- <!-- gap on either side of status bar notification icons -->
- <dimen name="status_bar_icon_padding">8dp</dimen>
-</resources>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res/values/arrays_car.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res/values/arrays_car.xml
deleted file mode 100644
index 1fa0b3b..0000000
--- a/car_product/overlay/frameworks/base/packages/SystemUI/res/values/arrays_car.xml
+++ /dev/null
@@ -1,62 +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>
- <!-- There needs to be correspondence per index between these arrays, which means that if there
- isn't a longpress action associated with a shortcut item, put in an empty item to make
- sure everything lines up.
- -->
- <array name="car_facet_icons">
- <item>@drawable/car_ic_navigation</item>
- <item>@drawable/car_ic_phone</item>
- <item>@drawable/car_ic_overview</item>
- <item>@drawable/car_ic_music</item>
- <item>@drawable/car_ic_car</item>
- </array>
- <array name="car_facet_intent_uris">
- <!-- Launch the lenspicker for all the facets. The lens picker will trampoline into the last run app or display a list of valid apps -->
- <item>intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x14000000;package=com.android.support.car.lenspicker;end</item>
- <item>intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x14000000;package=com.android.support.car.lenspicker;end</item>
- <item>intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.HOME;launchFlags=0x14000000;S.system_command=toggle_notifications;end</item>
- <item>intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x14000000;package=com.android.support.car.lenspicker;end</item>
- <item>intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x14000000;package=com.android.support.car.lenspicker;end</item>
- </array>
- <array name="car_facet_longpress_intent_uris">
- <item></item>
- <item></item>
- <item></item>
- <item></item>
- <!-- Long pressing the overflow triggers a bug report -->
- <item>intent:#Intent;component=com.google.android.car.bugreport/.BugReportActivity;end</item>
- </array>
- <array name="car_facet_category_filters">
- <item>android.intent.category.APP_MAPS</item>
- <item>android.intent.category.APP_MESSAGING</item>
- <item></item>
- <item>android.intent.category.APP_MUSIC</item>
- <item></item>
- </array>
- <array name="car_facet_package_filters">
- <item>com.android.car.mapsplaceholder</item>
- <item>com.android.car.dialer</item>
- <item>com.android.car.overview</item>
- <item></item>
- <item>com.android.car.hvac;com.android.settings;com.android.car.settings;com.android.vending;com.google.android.car.bugreport;com.google.android.car.kitchensink;com.android.car.systemupdater;org.chromium.webview_shell;com.android.contacts;org.codeaurora.bluetooth.bttestapp;com.google.android.projection.sink;com.google.android.googlequicksearchbox</item>
- </array>
-</resources>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res/values/colors.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res/values/colors.xml
deleted file mode 100644
index 30c0c58..0000000
--- a/car_product/overlay/frameworks/base/packages/SystemUI/res/values/colors.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?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.
-*/
--->
-<resources>
- <!-- System ui can't depend on car libs so redefine. -->
- <color name="car_grey_50">#fffafafa</color>
-
- <color name="docked_divider_background">@color/car_grey_50</color>
- <color name="system_bar_background_opaque">#ff172026</color>
-
- <color name="status_bar_background_color">#33000000</color>
- <drawable name="system_bar_background">@color/status_bar_background_color</drawable>
-
- <!-- The scrim color for the background of the notifications shade. -->
- <color name="scrim_behind_color">#172026</color>
-
- <!-- The color of the dividing line between grouped notifications. -->
- <color name="notification_divider_color">@*android:color/notification_action_list</color>
-
- <!-- The color of the ripples on the untinted notifications -->
- <color name="notification_ripple_untinted_color">@color/ripple_material_light</color>
-
- <color name="car_teal_700">#ff00796b</color>
- <color name="car_grey_300">#ffe0e0e0</color>
- <color name="car_grey_900">#ff212121</color>
-
- <color name="keyguard_button_text_color">@android:color/black</color>
-</resources>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res/values/config.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res/values/config.xml
deleted file mode 100644
index e48a06a..0000000
--- a/car_product/overlay/frameworks/base/packages/SystemUI/res/values/config.xml
+++ /dev/null
@@ -1,86 +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.
-*/
--->
-
-<!-- Resource overrides for car system ui. -->
-<resources>
- <string name="config_statusBarComponent" translatable="false">com.android.systemui.statusbar.car.CarStatusBar</string>
- <string name="config_systemUIFactoryComponent" translatable="false">com.android.systemui.car.CarSystemUIFactory</string>
- <bool name="config_enableFullscreenUserSwitcher">true</bool>
-
- <!-- Notifications on the car should not show the gear icon. Swiping should only dismiss the
- cards. -->
- <bool name="config_showNotificationGear">false</bool>
-
- <!-- No need to draw a background around a notification because there is no gear icon. -->
- <bool name="config_drawNotificationBackground">false</bool>
-
- <!-- The notification shade should only be shown on a facet click and not by dragging. -->
- <bool name="config_enableNotificationShadeDrag">false</bool>
-
- <!-- There should not be the ability to clear all notifications with a button. -->
- <bool name="config_enableNotificationsClearAll">false</bool>
-
- <!-- Hide the notification shelf so that the cards in the notification center scroll smoothly
- off-screen. -->
- <bool name="config_showNotificationShelf">false</bool>
-
- <!-- The notifications should always fade when being dismissed. -->
- <bool name="config_fadeNotificationsOnDismiss">true</bool>
-
- <!-- The entire notification row should be translated because the cards are smaller than the
- width of the screen. If the row is not translated, then they will be clipped. -->
- <bool name="config_translateNotificationContentsOnSwipe">false</bool>
-
- <!-- The notifications should fade as they are being swiped off screen. -->
- <bool name="config_fadeDependingOnAmountSwiped">true</bool>
-
- <!-- The expand icon should be displayed at the top right corner of the notifications. -->
- <bool name="config_showNotificationExpandButtonAtEnd">true</bool>
-
- <!-- A notification card that has been scrolled off screen should not be clipped in height. This
- maintains the illusion that the cards are being scrolled underneath the status bar
- shelf. -->
- <bool name="config_clipNotificationScrollToTop">false</bool>
-
- <!-- The auto notification have rounded corners. Ensure that any content is clipped to these
- corners. -->
- <bool name="config_clipNotificationsToOutline">true</bool>
-
- <!-- Notifications should always be in their expanded state so that the actions are visible.
- This will make it easier for a auto user to interact with them. -->
- <bool name="config_alwaysExpandNonGroupedNotifications">true</bool>
-
- <!-- Auto does not allow notifications to be toggled to and from their expanded states to
- reduce driver distraction. -->
- <bool name="config_enableNonGroupedNotificationExpand">false</bool>
-
- <!-- There should always be a dividing line between notifications. -->
- <bool name="config_showDividersWhenGroupNotificationExpanded">true</bool>
-
- <!--- Hide the dividing lines when the notification group is expanding. -->
- <bool name="config_hideDividersDuringTransition">true</bool>
-
- <!-- Child notifications are displayed with no dividing space between them in auto, so disable
- the shadow. -->
- <bool name="config_enableShadowOnChildNotifications">false</bool>
-
- <!-- Keep the notification background when the container has been expanded. The children will
- expand inline within the container, so it can keep its original background. -->
- <bool name="config_showGroupNotificationBgWhenExpanded">true</bool>
-</resources>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res/values/config_car.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res/values/config_car.xml
deleted file mode 100644
index 9c8dcb1..0000000
--- a/car_product/overlay/frameworks/base/packages/SystemUI/res/values/config_car.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>
- <!-- These next two work together, if you enable this first one you need to provide an intent
- uri that will be launched into the docked window. -->
- <bool name="config_enablePersistentDockedActivity">false</bool>
- <string name="config_persistentDockedActivityIntentUri" translatable="false"></string>
-</resources>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res/values/dimens.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res/values/dimens.xml
deleted file mode 100644
index 37a6238..0000000
--- a/car_product/overlay/frameworks/base/packages/SystemUI/res/values/dimens.xml
+++ /dev/null
@@ -1,158 +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>
- <!-- The alpha for the scrim behind the notification shade. This value is 1 so that the
- scrim has no transparency. -->
- <item name="scrim_behind_alpha" format="float" type="dimen">1.0</item>
-
- <!-- The amount by which to scale up the status bar icons. -->
- <item name="status_bar_icon_scale_factor" format="float" type="dimen">2.3</item>
-
- <!-- The font size for the clock in the status bar. -->
- <dimen name="status_bar_clock_size">24sp</dimen>
-
- <!-- The starting padding for the clock in the status bar. -->
- <dimen name="status_bar_clock_starting_padding">12dp</dimen>
-
- <!-- The end padding for the clock in the status bar. -->
- <dimen name="status_bar_clock_end_padding">@dimen/status_bar_clock_starting_padding</dimen>
-
- <!-- size at which Notification icons will be drawn in the status bar -->
- <dimen name="status_bar_icon_drawing_size">32dp</dimen>
-
- <!-- Starting margin before the signal cluster -->
- <dimen name="signal_cluster_margin_start">8dp</dimen>
-
- <!-- Padding between signal cluster and battery icon -->
- <dimen name="signal_cluster_battery_padding">@dimen/status_bar_clock_starting_padding</dimen>
-
- <!-- Spacing after the wifi signals that is present if there are any icons following it. -->
- <dimen name="status_bar_wifi_signal_spacer_width">@dimen/status_bar_clock_starting_padding</dimen>
-
- <!-- Spacing before the airplane mode icon if there are any icons preceding it. -->
- <dimen name="status_bar_airplane_spacer_width">@dimen/status_bar_clock_starting_padding</dimen>
-
- <!-- Padding at the end of the view that displays the mobile signal icons. This value should
- be double the signal_cluster_margin_start. -->
- <dimen name="mobile_signal_group_end_padding">16dp</dimen>
-
- <!-- Padding between the mobile data type and the strength indicator. -->
- <dimen name="mobile_data_icon_start_padding">@dimen/mobile_signal_group_end_padding</dimen>
-
- <!-- gap on either side of status bar notification icons -->
- <dimen name="status_bar_icon_padding">8dp</dimen>
-
- <!-- Standard image button size for volume dialog buttons -->
- <dimen name="volume_button_size">84dp</dimen>
-
- <!-- The maximum width allowed for the volume dialog. For auto, we allow this to span a good
- deal of the screen. This value accounts for the side margins. -->
- <dimen name="volume_dialog_panel_width">1920dp</dimen>
-
- <dimen name="car_navigation_button_width">56dp</dimen>
- <dimen name="car_navigation_button_holder_width">96dp</dimen>
-
- <dimen name="navigation_bar_padding_top">0dp</dimen>
- <dimen name="navigation_bar_padding_side">264dp</dimen>
-
- <!-- Largest size an avatar might need to be drawn in the user picker, status bar, or
- quick settings header -->
- <dimen name="max_avatar_size">128dp</dimen>
-
- <!-- The width of panel holding the notification card. -->
- <dimen name="notification_panel_width">522dp</dimen>
-
- <!-- The width of the quick settings panel. -1 for match_parent. -->
- <dimen name="qs_panel_width">-1px</dimen>
-
- <!-- Height of a small notification in the status bar-->
- <dimen name="notification_min_height">192dp</dimen>
-
- <!-- Height of a small notification in the status bar which was used before android N -->
- <dimen name="notification_min_height_legacy">192dp</dimen>
-
- <!-- Height of a large notification in the status bar -->
- <dimen name="notification_max_height">400dp</dimen>
-
- <!-- Height of a heads up notification in the status bar for legacy custom views -->
- <dimen name="notification_max_heads_up_height_legacy">400dp</dimen>
-
- <!-- Height of a heads up notification in the status bar -->
- <dimen name="notification_max_heads_up_height">400dp</dimen>
-
- <!-- Height of the status bar header bar -->
- <dimen name="status_bar_header_height">54dp</dimen>
-
- <!-- The height of the divider between the individual notifications. -->
- <dimen name="notification_divider_height">16dp</dimen>
-
- <!-- The height of the divider between the individual notifications when the notification
- wants it to be increased. This value is the same as notification_divider_height so that
- the spacing between all notifications will always be the same. -->
- <dimen name="notification_divider_height_increased">@dimen/notification_divider_height</dimen>
-
- <!-- The alpha of the dividing line between child notifications of a notification group. -->
- <item name="notification_divider_alpha" format="float" type="dimen">1.0</item>
-
- <!-- The width of each individual notification card. -->
- <dimen name="notification_child_width">522dp</dimen>
-
- <!-- The top margin of the notification panel. -->
- <dimen name="notification_panel_margin_top">32dp</dimen>
-
- <!-- The bottom margin of the panel that holds the list of notifications. -->
- <dimen name="notification_panel_margin_bottom">@dimen/notification_divider_height</dimen>
-
- <!-- The corner radius of the shadow behind the notification. -->
- <dimen name="notification_shadow_radius">16dp</dimen>
-
- <!-- The amount of space below the notification list. This value is 0 so the list scrolls
- all the way to the bottom. -->
- <dimen name="close_handle_underlap">0dp</dimen>
-
- <!-- The height of the divider between the individual notifications in a notification group. -->
- <dimen name="notification_children_container_divider_height">1dp</dimen>
-
- <!-- The height of the header for a container containing child notifications. -->
- <dimen name="notification_children_container_header_height">76dp</dimen>
-
- <!-- The top margin for the notification children container in its non-expanded form. This
- value is smaller than notification_children_container_header_height to bring the first
- child closer so there is less wasted space. -->
- <dimen name="notification_children_container_margin_top">68dp</dimen>
-
- <!-- 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>
-
- <dimen name="volume_dialog_side_margin">@dimen/side_margin</dimen>
-
- <dimen name="volume_dialog_elevation">6dp</dimen>
-
- <dimen name="volume_dialog_row_margin_end">@dimen/car_keyline_3</dimen>
-
- <dimen name="volume_dialog_row_padding_end">0dp</dimen>
-
- <dimen name="line_item_height">128dp</dimen>
- <dimen name="volume_icon_size">96dp</dimen>
- <dimen name="side_margin">148dp</dimen>
- <dimen name="car_keyline_1">24dp</dimen>
- <dimen name="car_keyline_2">96dp</dimen>
- <dimen name="car_keyline_3">128dp</dimen>
-</resources>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res/values/styles.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res/values/styles.xml
deleted file mode 100644
index 68fc641..0000000
--- a/car_product/overlay/frameworks/base/packages/SystemUI/res/values/styles.xml
+++ /dev/null
@@ -1,37 +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:android="http://schemas.android.com/apk/res/android">
-
- <!-- The style for the volume icons in the volume dialog. This style makes the icon scale to
- fit its container since auto wants the icon to be larger. The padding is added to make it
- so the icon does not press along the edges of the dialog. -->
- <style name="VolumeButtons" parent="@android:style/Widget.Material.Button.Borderless">
- <item name="android:background">@drawable/btn_borderless_rect</item>
- <item name="android:scaleType">fitCenter</item>
- <item name="android:padding">22dp</item>
- </style>
-
- <style name="NavigationBarButton">
- <item name="android:layout_height">56dp</item>
- <item name="android:layout_width">76dp</item>
- <item name="android:paddingStart">@dimen/car_padding_1</item>
- <item name="android:paddingEnd">@dimen/car_padding_1</item>
- </style>
-
-</resources>
diff --git a/car_product/overlay/packages/apps/PackageInstaller/res/drawable/background_round_corners.xml b/car_product/overlay/packages/apps/PackageInstaller/res/drawable/background_round_corners.xml
index 03d7418..1b71555 100644
--- a/car_product/overlay/packages/apps/PackageInstaller/res/drawable/background_round_corners.xml
+++ b/car_product/overlay/packages/apps/PackageInstaller/res/drawable/background_round_corners.xml
@@ -15,6 +15,6 @@
limitations under the License.
-->
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
- <solid android:color="@color/car_card" />
- <corners android:radius="@dimen/car_radius_3" />
+ <solid android:color="?android:attr/colorBackgroundFloating" />
+ <corners android:radius="@*android:dimen/car_radius_3" />
</shape>
diff --git a/car_product/overlay/packages/apps/PackageInstaller/res/drawable/dialog_button_background.xml b/car_product/overlay/packages/apps/PackageInstaller/res/drawable/dialog_button_background.xml
index 17df216..c4c91c5 100644
--- a/car_product/overlay/packages/apps/PackageInstaller/res/drawable/dialog_button_background.xml
+++ b/car_product/overlay/packages/apps/PackageInstaller/res/drawable/dialog_button_background.xml
@@ -15,8 +15,8 @@
~ limitations under the License.
-->
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
- android:color="@color/car_card_ripple_background">
+ android:color="@*android:color/car_card_ripple_background">
<item android:id="@android:id/mask">
- <color android:color="@color/car_white_1000" />
+ <color android:color="@*android:color/car_white_1000" />
</item>
</ripple>
diff --git a/car_product/overlay/packages/apps/PackageInstaller/res/drawable/ic_check_box.xml b/car_product/overlay/packages/apps/PackageInstaller/res/drawable/ic_check_box.xml
new file mode 100644
index 0000000..e985f39
--- /dev/null
+++ b/car_product/overlay/packages/apps/PackageInstaller/res/drawable/ic_check_box.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android" >
+ <item android:drawable="@drawable/ic_check_box_unchecked"
+ android:state_checked="false"/>
+ <item android:drawable="@drawable/ic_check_box_checked"
+ android:state_checked="true"/>
+ <item android:drawable="@drawable/ic_check_box_unchecked"/>
+</selector>
diff --git a/car_product/overlay/packages/apps/PackageInstaller/res/drawable/ic_check_box_checked.xml b/car_product/overlay/packages/apps/PackageInstaller/res/drawable/ic_check_box_checked.xml
new file mode 100644
index 0000000..8e9369a
--- /dev/null
+++ b/car_product/overlay/packages/apps/PackageInstaller/res/drawable/ic_check_box_checked.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="@dimen/checkbox_size"
+ android:height="@dimen/checkbox_size"
+ android:tint="@color/checkbox_color_checked"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:pathData="M19,3L5,3c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.11,0 2,-0.9 2,-2L21,5c0,-1.1 -0.89,-2 -2,-2zM10,17l-5,-5 1.41,-1.41L10,14.17l7.59,-7.59L19,8l-9,9z"
+ android:fillColor="#000000"/>
+</vector>
diff --git a/car_product/overlay/packages/apps/PackageInstaller/res/drawable/ic_check_box_unchecked.xml b/car_product/overlay/packages/apps/PackageInstaller/res/drawable/ic_check_box_unchecked.xml
new file mode 100644
index 0000000..c4916ee
--- /dev/null
+++ b/car_product/overlay/packages/apps/PackageInstaller/res/drawable/ic_check_box_unchecked.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="@dimen/checkbox_size"
+ android:height="@dimen/checkbox_size"
+ android:tint="@color/checkbox_color_unchecked"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:pathData="M19,5v14H5V5h14m0,-2H5c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V5c0,-1.1 -0.9,-2 -2,-2z"
+ android:fillColor="#000000"/>
+</vector>
diff --git a/car_product/overlay/packages/apps/PackageInstaller/res/layout/grant_permissions.xml b/car_product/overlay/packages/apps/PackageInstaller/res/layout/grant_permissions.xml
index 08e5fd8..b9874a5 100644
--- a/car_product/overlay/packages/apps/PackageInstaller/res/layout/grant_permissions.xml
+++ b/car_product/overlay/packages/apps/PackageInstaller/res/layout/grant_permissions.xml
@@ -33,10 +33,10 @@
android:id="@+id/desc_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginTop="@dimen/car_padding_4"
- android:layout_marginStart="@dimen/car_keyline_1"
- android:layout_marginBottom="@dimen/car_padding_2"
- android:layout_marginEnd="@dimen/car_keyline_1">
+ android:layout_marginTop="@dimen/permission_description_top_margin"
+ android:layout_marginStart="@dimen/permission_description_start_margin"
+ android:layout_marginBottom="@dimen/permission_description_bottom_margin"
+ android:layout_marginEnd="@dimen/permission_description_end_margin">
<include
layout="@layout/permission_description" />
@@ -50,15 +50,14 @@
<CheckBox
android:id="@+id/do_not_ask_checkbox"
android:layout_width="wrap_content"
- android:layout_height="@dimen/car_single_line_list_item_height"
- android:layout_marginStart="@dimen/car_keyline_1"
- android:layout_marginEnd="@dimen/car_keyline_1"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="@dimen/checkbox_start_margin"
+ android:layout_marginEnd="@dimen/checkbox_end_margin"
android:gravity="center_vertical"
- android:paddingLeft="@dimen/car_keyline_1_keyline_3_diff"
+ android:paddingLeft="@dimen/checkbox_left_padding"
android:button="@drawable/ic_check_box"
+ android:textAppearance="@style/PermissionDialogCheckboxText"
android:text="@string/never_ask_again"
- android:textColor="?android:attr/textColorSecondary"
- android:textSize="@dimen/car_action1_size"
android:visibility="gone">
</CheckBox>
@@ -66,7 +65,7 @@
android:id="@+id/button_group"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginTop="@dimen/car_padding_2"
+ android:layout_marginTop="@dimen/permission_dialog_button_margin_top"
android:layoutDirection="locale"
android:gravity="center_vertical"
android:orientation="horizontal">
@@ -74,27 +73,17 @@
<Button
android:id="@+id/permission_deny_button"
android:layout_width="wrap_content"
- android:layout_height="@dimen/car_dialog_action_bar_height"
- android:background="@drawable/dialog_button_background"
- android:paddingStart="@dimen/car_keyline_1"
- android:paddingEnd="@dimen/car_padding_4"
+ android:layout_height="wrap_content"
android:text="@string/grant_dialog_button_deny"
- android:textColor="@color/car_highlight"
- android:textSize="@dimen/car_action1_size"
- android:textStyle="bold">
+ style="?android:attr/buttonBarButtonStyle">
</Button>
<Button
android:id="@+id/permission_allow_button"
android:layout_width="wrap_content"
- android:layout_height="@dimen/car_dialog_action_bar_height"
- android:background="@drawable/dialog_button_background"
- android:paddingStart="@dimen/car_padding_4"
- android:paddingEnd="@dimen/car_padding_4"
+ android:layout_height="@dimen/permission_dialog_allow_button_height"
android:text="@string/grant_dialog_button_allow"
- android:textColor="@color/car_highlight"
- android:textSize="@dimen/car_action1_size"
- android:textStyle="bold">
+ style="?android:attr/buttonBarButtonStyle">
</Button>
<Space
@@ -109,9 +98,9 @@
android:id="@+id/current_page_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:paddingEnd="@dimen/car_keyline_1"
+ android:paddingEnd="@dimen/permission_dialog_appearance_padding_end"
android:maxLines="1"
- android:textAppearance="@style/TextAppearance.Car.Body2"
+ android:textAppearance="?android:attr/textAppearanceMedium"
android:visibility="invisible">
</TextView>
diff --git a/car_product/overlay/packages/apps/PackageInstaller/res/layout/permission_description.xml b/car_product/overlay/packages/apps/PackageInstaller/res/layout/permission_description.xml
index cdbaf56..4ab185a 100644
--- a/car_product/overlay/packages/apps/PackageInstaller/res/layout/permission_description.xml
+++ b/car_product/overlay/packages/apps/PackageInstaller/res/layout/permission_description.xml
@@ -35,7 +35,7 @@
android:id="@+id/permission_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:textSize="@dimen/car_body2_size"
- android:textColor="@color/car_body2"/>
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ />
</LinearLayout>
diff --git a/car_product/overlay/packages/apps/PackageInstaller/res/values/colors.xml b/car_product/overlay/packages/apps/PackageInstaller/res/values/colors.xml
new file mode 100644
index 0000000..c3f7b7b
--- /dev/null
+++ b/car_product/overlay/packages/apps/PackageInstaller/res/values/colors.xml
@@ -0,0 +1,19 @@
+<?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>
+ <color name="checkbox_color_unchecked">@*android:color/car_tint</color>
+ <color name="checkbox_color_checked">@*android:color/accent_device_default_light</color>
+</resources>
\ No newline at end of file
diff --git a/car_product/overlay/packages/apps/PackageInstaller/res/values/dimens.xml b/car_product/overlay/packages/apps/PackageInstaller/res/values/dimens.xml
new file mode 100644
index 0000000..078ad7f
--- /dev/null
+++ b/car_product/overlay/packages/apps/PackageInstaller/res/values/dimens.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<resources>
+
+ <!-- Margin between description text and the top-->
+ <dimen name="permission_description_top_margin">@*android:dimen/car_padding_4</dimen>
+ <!-- Margin between description text and the bottom-->
+ <dimen name="permission_description_bottom_margin">@*android:dimen/car_padding_2</dimen>
+ <!-- Margin between description text and the start-->
+ <dimen name="permission_description_start_margin">@*android:dimen/car_keyline_1</dimen>
+ <!-- Margin between description text and the end-->
+ <dimen name="permission_description_end_margin">@*android:dimen/car_keyline_1</dimen>
+ <!-- Margin between checkbox and the start-->
+ <dimen name="checkbox_start_margin">@*android:dimen/car_keyline_1</dimen>
+ <!-- Margin between checkbox and the end-->
+ <dimen name="checkbox_end_margin">@*android:dimen/car_keyline_1</dimen>
+
+ <dimen name="checkbox_left_padding">@*android:dimen/car_keyline_1_keyline_3_diff</dimen>
+ <dimen name="checkbox_text_size">@*android:dimen/car_label1_size</dimen>
+ <dimen name="checkbox_text_height">@*android:dimen/car_single_line_list_item_height</dimen>
+
+ <dimen name="permission_dialog_button_margin_top">@*android:dimen/car_padding_2</dimen>
+ <dimen name="permission_dialog_allow_button_height">@*android:dimen/car_dialog_action_bar_height</dimen>
+
+ <dimen name="permission_dialog_appearance_padding_end">@*android:dimen/car_keyline_1</dimen>
+
+ <dimen name="checkbox_size">@*android:dimen/car_primary_icon_size</dimen>
+</resources>
\ No newline at end of file
diff --git a/car_product/overlay/packages/apps/PackageInstaller/res/values/styles.xml b/car_product/overlay/packages/apps/PackageInstaller/res/values/styles.xml
new file mode 100644
index 0000000..6f045bf
--- /dev/null
+++ b/car_product/overlay/packages/apps/PackageInstaller/res/values/styles.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources>
+
+ <style name="PermissionDialogCheckboxText" parent="@android:TextAppearance.DeviceDefault">
+ <item name="android:textColor">?android:attr/textColorSecondary</item>
+ <item name="android:textSize">@dimen/checkbox_text_size</item>
+ </style>
+
+</resources>
diff --git a/car_product/overlay/packages/apps/PackageInstaller/res/values/themes.xml b/car_product/overlay/packages/apps/PackageInstaller/res/values/themes.xml
new file mode 100644
index 0000000..08e67a8
--- /dev/null
+++ b/car_product/overlay/packages/apps/PackageInstaller/res/values/themes.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources>
+ <style name="Settings"
+ parent="@*android:style/Theme.DeviceDefault.Settings.NoActionBar">
+ </style>
+</resources>
diff --git a/car_product/preloaded-classes-car b/car_product/preloaded-classes-car
deleted file mode 100644
index 962099f..0000000
--- a/car_product/preloaded-classes-car
+++ /dev/null
@@ -1 +0,0 @@
-# Classes which are preloaded by com.android.internal.os.ZygoteInit.
diff --git a/car_product/sepolicy/public/carservice_app.te b/car_product/sepolicy/public/carservice_app.te
index fd276b6..7825a86 100644
--- a/car_product/sepolicy/public/carservice_app.te
+++ b/car_product/sepolicy/public/carservice_app.te
@@ -1,2 +1,3 @@
# Domain to run Car Service (com.android.car)
type carservice_app, domain, coredomain;
+type carservice_app_tmpfs, file_type;
diff --git a/car_product/sepolicy/test/kitchensink_app.te b/car_product/sepolicy/test/kitchensink_app.te
index 8bd5a68..eef426a 100644
--- a/car_product/sepolicy/test/kitchensink_app.te
+++ b/car_product/sepolicy/test/kitchensink_app.te
@@ -1,5 +1,6 @@
# Domain to run EmbeddedKitchenSink app (for test-purpose)
type kitchensink_app, domain;
+type kitchensink_app_tmpfs, file_type;
app_domain(kitchensink_app);
# Allow Car Service to be the client of Vehicle HAL
diff --git a/procfs-inspector/server/server.cpp b/procfs-inspector/server/server.cpp
index 82e196f..402b37b 100644
--- a/procfs-inspector/server/server.cpp
+++ b/procfs-inspector/server/server.cpp
@@ -21,14 +21,15 @@
#include <private/android_filesystem_config.h>
static bool isSystemUser() {
- uid_t uid = IPCThreadState::self()->getCallingUid();
- switch (uid) {
+ uid_t uid = IPCThreadState::self()->getCallingUid();
+ uid_t aid = uid % AID_USER_OFFSET;
+ switch (aid) {
case AID_ROOT:
case AID_SYSTEM: {
return true;
} break;
default: {
- ALOGE("uid %u is not root nor system - access denied", uid);
+ ALOGE("aid %u (uid %u) is not root nor system - access denied", aid, uid);
} break;
}
return false;
diff --git a/service/Android.mk b/service/Android.mk
index e961fbb..39c7386 100644
--- a/service/Android.mk
+++ b/service/Android.mk
@@ -40,7 +40,9 @@
LOCAL_PROGUARD_ENABLED := disabled
LOCAL_JAVA_LIBRARIES += android.car
+
LOCAL_STATIC_JAVA_LIBRARIES += \
+ android.car.userlib \
android.hidl.base-V1.0-java \
android.hardware.automotive.audiocontrol-V1.0-java \
android.hardware.automotive.vehicle-V2.0-java \
@@ -68,7 +70,9 @@
LOCAL_JAVA_LIBRARIES += android.car \
car-frameworks-service
+
LOCAL_STATIC_JAVA_LIBRARIES += \
+ android.car.userlib \
android.hidl.base-V1.0-java \
android.hardware.automotive.audiocontrol-V1.0-java \
android.hardware.automotive.vehicle-V2.0-java \
diff --git a/service/AndroidManifest.xml b/service/AndroidManifest.xml
index 24c9cd7..1f221ac 100644
--- a/service/AndroidManifest.xml
+++ b/service/AndroidManifest.xml
@@ -23,7 +23,7 @@
<original-package android:name="com.android.car" />
<permission-group
android:name="android.car.permission-group.CAR_MONITORING"
- android:icon="@drawable/car_ic_mode"
+ android:icon="@drawable/perm_group_car"
android:description="@string/car_permission_desc"
android:label="@string/car_permission_label" />
<permission
@@ -129,6 +129,11 @@
android:label="@string/car_permission_label_control_car_exterior_lights"
android:description="@string/car_permission_desc_control_car_exterior_lights" />
<permission
+ android:name="android.car.permission.CAR_POWER"
+ android:protectionLevel="system|signature"
+ android:label="@string/car_permission_label_car_power"
+ android:description="@string/car_permission_desc_car_power" />
+ <permission
android:name="android.car.permission.CAR_POWERTRAIN"
android:protectionLevel="normal"
android:label="@string/car_permission_label_car_powertrain"
@@ -183,29 +188,37 @@
android:description="@string/car_permission_desc_audio_settings" />
<permission
- android:name="android.car.permission.BIND_INSTRUMENT_CLUSTER_RENDERER_SERVICE"
- android:protectionLevel="signature"
- android:label="@string/car_permission_label_bind_instrument_cluster_rendering"
- android:description="@string/car_permission_desc_bind_instrument_cluster_rendering"/>
+ android:name="android.car.permission.BIND_INSTRUMENT_CLUSTER_RENDERER_SERVICE"
+ android:protectionLevel="signature"
+ android:label="@string/car_permission_label_bind_instrument_cluster_rendering"
+ android:description="@string/car_permission_desc_bind_instrument_cluster_rendering"/>
<permission
- android:name="android.car.permission.BIND_CAR_INPUT_SERVICE"
- android:protectionLevel="signature"
- android:label="@string/car_permission_label_bind_input_service"
- android:description="@string/car_permission_desc_bind_input_service"/>
+ android:name="android.car.permission.BIND_CAR_INPUT_SERVICE"
+ android:protectionLevel="signature"
+ android:label="@string/car_permission_label_bind_input_service"
+ android:description="@string/car_permission_desc_bind_input_service"/>
<permission
- android:name="android.car.permission.CAR_DISPLAY_IN_CLUSTER"
- android:protectionLevel="system|signature"
- android:label="@string/car_permission_car_display_in_cluster"
- android:description="@string/car_permission_desc_car_display_in_cluster" />
+ android:name="android.car.permission.CAR_DISPLAY_IN_CLUSTER"
+ android:protectionLevel="system|signature"
+ android:label="@string/car_permission_car_display_in_cluster"
+ android:description="@string/car_permission_desc_car_display_in_cluster" />
- <permission android:name="android.car.permission.CAR_INSTRUMENT_CLUSTER_CONTROL"
- android:protectionLevel="system|signature"
- android:label="@string/car_permission_car_cluster_control"
- android:description="@string/car_permission_desc_car_cluster_control" />
+ <permission
+ android:name="android.car.permission.CAR_INSTRUMENT_CLUSTER_CONTROL"
+ android:protectionLevel="system|signature"
+ android:label="@string/car_permission_car_cluster_control"
+ android:description="@string/car_permission_desc_car_cluster_control" />
- <permission android:name="android.car.permission.STORAGE_MONITORING"
+ <permission
+ android:name="android.car.permission.CAR_UX_RESTRICTIONS_CONFIGURATION"
+ android:protectionLevel="system|signature"
+ android:label="@string/car_permission_label_car_ux_restrictions_configuration"
+ android:description="@string/car_permission_desc_car_ux_restrictions_configuration" />
+
+ <permission
+ android:name="android.car.permission.STORAGE_MONITORING"
android:protectionLevel="system|signature"
android:label="@string/car_permission_label_storage_monitoring"
android:description="@string/car_permission_desc_storage_monitoring" />
diff --git a/service/res/drawable-hdpi/car_ic_mode.png b/service/res/drawable-hdpi/car_ic_mode.png
deleted file mode 100644
index a8f719f..0000000
--- a/service/res/drawable-hdpi/car_ic_mode.png
+++ /dev/null
Binary files differ
diff --git a/service/res/drawable-mdpi/car_ic_mode.png b/service/res/drawable-mdpi/car_ic_mode.png
deleted file mode 100644
index 38a9747..0000000
--- a/service/res/drawable-mdpi/car_ic_mode.png
+++ /dev/null
Binary files differ
diff --git a/service/res/drawable-xhdpi/car_ic_mode.png b/service/res/drawable-xhdpi/car_ic_mode.png
deleted file mode 100644
index 58a1aca..0000000
--- a/service/res/drawable-xhdpi/car_ic_mode.png
+++ /dev/null
Binary files differ
diff --git a/service/res/drawable/button_background.xml b/service/res/drawable/button_background.xml
new file mode 100644
index 0000000..c714124
--- /dev/null
+++ b/service/res/drawable/button_background.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+ <solid android:color="@color/button_background"/>
+ <corners android:radius="@dimen/button_radius"/>
+</shape>
diff --git a/service/res/drawable/button_ripple_background.xml b/service/res/drawable/button_ripple_background.xml
new file mode 100644
index 0000000..418c508
--- /dev/null
+++ b/service/res/drawable/button_ripple_background.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+<ripple
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:color="@color/ripple_background">
+ <item android:drawable="@drawable/button_background" />
+</ripple>
diff --git a/service/res/drawable/exit_button_background.xml b/service/res/drawable/exit_button_background.xml
deleted file mode 100644
index 92d32fd..0000000
--- a/service/res/drawable/exit_button_background.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-<shape xmlns:android="http://schemas.android.com/apk/res/android">
- <solid android:color="@color/exit_button_background"/>
- <corners android:radius="@dimen/exit_button_radius"/>
-</shape>
diff --git a/service/res/drawable/exit_button_ripple_background.xml b/service/res/drawable/exit_button_ripple_background.xml
deleted file mode 100644
index 54fd00f..0000000
--- a/service/res/drawable/exit_button_ripple_background.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-<ripple
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:color="@color/ripple_background">
- <item android:drawable="@drawable/exit_button_background" />
-</ripple>
diff --git a/service/res/drawable/perm_group_car.xml b/service/res/drawable/perm_group_car.xml
new file mode 100644
index 0000000..79e3f03
--- /dev/null
+++ b/service/res/drawable/perm_group_car.xml
@@ -0,0 +1,24 @@
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportHeight="192.0"
+ android:viewportWidth="192.0">
+
+ <path android:fillColor="#FFFFFFFF"
+ android:pathData="M36.9,180.4l5.6,5.6L96,164l53.4,22l5.6,-5.6L96,73L36.9,180.4zM184,145.8L105.7,11.6C103.7,8.1 100,6 96,6c-4,0 -7.7,2.1 -9.8,5.6L7.5,146.5c-2,3.5 -2.1,7.3 0,10.8c2,3.5 5.8,5.7 9.8,5.7H38l54.6,-99h6.8l54.6,99h20.3c6.2,0 11.7,-4.6 11.7,-10.8C186,149.8 185.3,147.6 184,145.8z"/>
+</vector>
diff --git a/service/res/layout/activity_blocking.xml b/service/res/layout/activity_blocking.xml
index 687afbe..0c10016 100644
--- a/service/res/layout/activity_blocking.xml
+++ b/service/res/layout/activity_blocking.xml
@@ -19,19 +19,63 @@
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@color/activity_blocking_activity_background"
- android:padding="@dimen/blocking_activity_padding"
android:gravity="center">
+ <LinearLayout
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ android:orientation="horizontal"
+ android:gravity="center">
+ <ImageView
+ android:id="@+id/blocked_app_icon"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content" />
+ <TextView
+ android:id="@+id/blocked_app_name"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:layout_marginStart="@dimen/common_margin"
+ android:textColor="@color/blocking_text"
+ android:textAppearance="@style/ActivityBlockingActivityText" />
+ </LinearLayout>
+
<TextView
- android:id="@+id/activity_blocked_title"
+ android:id="@+id/blocking_text"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
- android:textColor="@color/blocking_text"
+ android:layout_marginTop="@dimen/common_margin"
+ android:gravity="center"
+ android:textAppearance="@style/ActivityBlockingActivityText" />
+
+ <!-- Show exit button if we need to (and are able to) restart the blocked task -->
+ <TextView
+ android:id="@+id/exit_button_message"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:layout_marginTop="@dimen/common_margin"
android:textAppearance="@style/ActivityBlockingActivityText" />
<Button
- android:id="@+id/exit"
+ android:id="@+id/exit_button"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
- android:layout_marginTop="@dimen/exit_button_top_margin"
+ android:layout_marginTop="@dimen/common_margin"
android:text="@string/exit_button"
- style="@style/ExitButtonStyle"/>
+ style="@style/ButtonStyle"/>
+
+ <!-- Widgets to display debug info. They should not show for non-user build. -->
+ <Button
+ android:id="@+id/toggle_debug_info"
+ android:visibility="gone"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:layout_marginTop="@dimen/common_margin"
+ android:text="@string/debug_button_text"
+ style="@style/ButtonStyle"/>
+
+ <TextView
+ android:id="@+id/debug_info"
+ android:visibility="gone"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:layout_marginTop="@dimen/common_margin"
+ android:textAppearance="@style/ActivityBlockingActivityText" />
</LinearLayout>
diff --git a/service/res/values-af/config.xml b/service/res/values-af/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-af/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-af/strings.xml b/service/res/values-af/strings.xml
new file mode 100644
index 0000000..721cfa9
--- /dev/null
+++ b/service/res/values-af/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Motorinligting"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Toegang tot jou motor se inligting."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Motorkajuit"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Toegang tot jou motor se bykomstighede, insluitend deure, spieëls, sitplekke en vensters."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Motorkamera"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Toegang tot motor se kamera(s)."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Motorenergie"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Toegang tot jou motor se energie-inligting."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"Motor-HVAC (verhitting, ventilasie en lugversorging)"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Toegang tot jou motor se HVAC (verhitting, venitalise en lugversorging)."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Motorryafstand"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Toegang tot jou motor se ryafstandinligting."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Motorspoed"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Toegang tot jou motor se spoed."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Voertuigdinamikastaat"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Toegang tot jou motor se dinamikastaat"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Motorverskafferkanaal"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Toegang tot jou motor se verskafferkanaal om motorspesifieke inligting uit te ruil."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Motorradio"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Toegang tot jou motor se radio."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Motorprojeksie"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Motoroudiovolume"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Motoroudio-instellings"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Wys foonkoppelvlak op motorskerm"</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Boots voertuig-HAL na"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Boots jou motor se voertuig-HAL na vir interne toetsdoeleindes."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Beheer jou motor se oudiovolume."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Beheer jou motor se oudio-instellings."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Programblokkering"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Beheer programblokkering terwyl jy bestuur."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Navigasiebestuurder"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Rapporteer navigasiedata aan instrumentgroep"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Direkte lewering na instrumentgroep"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Laat \'n program toe om aktiwiteite te verklaar om in die instrumentgroep gewys te word"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Instrumentgroepbeheer"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Begin programme in die instrumentgroep"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Instrumentgroeplewering"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Ontvang instrumentgroepdata"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"UX-beperkingsopstelling"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"Stel UX-beperkings op"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Motorinvoerdiens"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Hanteer invoergebeurtenisse"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"CAN-bus het misluk"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN-bus reageer nie. Ontprop hoofeenheidkas, prop dit weer in, en herbegin die motor"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"Vir jou veiligheid is dié aktiwiteit nie beskikbaar terwyl jy bestuur nie.\nWag totdat jy geparkeer het om voort te gaan."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"Kies <xliff:g id="EXIT_BUTTON">%s</xliff:g> om oor te begin met veilige programkenmerke."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Terug"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Ontfoutin."</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Diagnostiese data"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Lees diagnostiese data van die motor af"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Diagnostiese data"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Vee diagnostiese data in die motor uit"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"VMS-publiseerder"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"Publiseer VMS-boodskappe"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"VMS-intekenaar"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"Teken in op VMS-boodskappe"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Flitsbergingkontrolering"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Monitor flitsberginggebruik"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Bestuurstaat"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Luister na bestuurstaatveranderinge"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Engin gedetailleerd"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Toegang tot motor se gedetailleerde enjininligting"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Energiepoorte"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Toegang tot energiepoorte"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Motoridentifikasie"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Toegang tot motor se identifikasie"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Motordeure"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Beheer motor se deure"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Motorvensters"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Beheer motor se vensters"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Motorspieëls"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Beheer motor se spieëls"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Motorsitplekke"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Beheer motor se sitplekke"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Basiese motorinligting"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Toegang tot basiese motorinligting"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Motorbuiteligte"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Toegang tot motorbuiteligtestaat"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Motorbuiteligte"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Beheer buitemotorligte"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Motorbuitetemperatuur"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Toegang tot buitetemperatuur"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Motorbande"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Toegang tot motorbandinligting"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Motorkragoorbringstelsel"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Toegang tot kragoorbringstelselinligting"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Motorkrag"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Toegang tot motorkragstaat"</string>
+</resources>
diff --git a/service/res/values-am/config.xml b/service/res/values-am/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-am/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-am/strings.xml b/service/res/values-am/strings.xml
new file mode 100644
index 0000000..e66ba66
--- /dev/null
+++ b/service/res/values-am/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"የመኪና መረጃ"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"የመኪናዎን መረጃ ይድረሱበት።"</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"የመኪና ጋቢና"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"የእርስዎን መኪና ተቀፅላዎች በሮችን፣ መስታውቶችን፣ ወንበሮችን እና መስኮቶችን ጨምሮ ይድረሱባቸው።"</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"የመኪና ካሜራ"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"የእርስዎን ካሜራ(ዎች) ይደርሱበት(ባቸው)።"</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"የመኪና ኃይል"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"የእርስዎን መኪና ኃይል መረጃ ይድረሱበት።"</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"የመኪና Hvac"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"የእርስዎን መኪና hvac ይድረሱበት።"</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"መኪና የተነዳበት ርቀት"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"የመኪናዎን የጉዞ ርቀት መለኪያ መረጃ ይድረሱበት።"</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"የመኪና ፍጥነት"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"የመኪናዎን ፍጥነት ይድረሱበት።"</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"የመኪና ተለዋዋጭ ውሂብ"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"የእርስዎን መኪና ተለዋዋጭ ሁኔታ ይድረሱባቸው"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"የመኪና አቅራቢ ሰርጥ"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"መኪና ተኮር መረጃ ለመለዋወጥ የመኪናዎ አቅራቢ ሰርጥ ላይ ይድረሱበት።"</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"የመኪና ሬዲዮ"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"የእርስዎን መኪና ሬዲዮ ይድረሱበት።"</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"የመኪና ማሳያ"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"የመኪና ኦዲዮ ድምፅ መጠን"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"የመኪና ኦዲዮ ቅንብሮች"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"የስልክ በይነገጽ በመኪና ማሳያ ላይ አሳይ።"</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"የመኪና HAL አቅርብ"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"ለውስጣዊ ምርመራ ዓላማ የእርስዎን መኪና HAL ያቅርቡ።"</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"የእርስዎን መኪና ኦዲዮ ድምፅ መጠንን ይቆጣጠሩ።"</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"የእርስዎን መኪና ኦዲዮ ቅንብሮች ይቆጣጠሩ።"</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"የመተግበሪያ እገዳ"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"እየነዱ እያሉ የመተግበሪያ እገዳን ይቆጣጠሩ።"</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"የዳሰሳ አስተዳዳሪ"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"የዳሰሳ ውሂብ ወደ መሣሪያ ስብስብ ሪፖርት ያድርጉ"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"ወደ መሣሪያ ስብስብ በቀጥታ ማቅረብ"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"በመሣሪያ ስብስብ ውስጥ የሚታዩትን እንቅስቃሴዎች ይፋ ለማድረግ እንዲችል ለመተግበሪያው ይፍቀዱለት"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"የመሣሪያ ስብስብ ቁጥጥር"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"መተግበሪያዎችን በመሣሪያ ስብስብ ውስጥ አስጀምር"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"የመሣሪያ ስብስብ አቅርቦት"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"የመሣሪያ ስብስብ ውሂብን ተቀበል"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"UX ገደቦች ውቅረት"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"የUX ገደቦችን ያዋቅሩ"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"የመኪና ግቤት አገልግሎት"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"የግቤት ክስተቶችን ያስተናግዱ"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"CAN አውቶብስ አልተሳካም"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN አውቶብስ ምላሽ አይሰጥም። የጭንቅላት አሃድ መያዣ ሳጥኑን ይሰኩ እና ይንቀሉ በመቀጠል መኪናውን ዳግም ያስጀምሩ"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"ለእርስዎ ደህንነት ሲባል፣ ይህ እንቅስቃሴ እርስዎ በሚነዱበት ጊዜ አይገኝም። \nለመቀጠል እንዲችሉ፣ መኪናዎ እስከሚቆም ድረስ ይጠብቁ።"</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"ከደህንነት አስተማማኝ የሆኑ የመተግበሪያ ባህሪያት ጋር መልሶ ለመጀመር፣ <xliff:g id="EXIT_BUTTON">%s</xliff:g>ን ይምረጡ።"</string>
+ <string name="exit_button" msgid="5829638404777671253">"ተመለስ"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"የአርም መረጃ"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"የምርመራ ውሂብ"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"ከመኪናው ላይ የምርመራ ውሂብን ያንብቡ"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"የምርመራ ውሂብ"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"ከመኪናው ላይ የምርመራ ውሂብን አጽዳ"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"VMS አታሚ"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"የvms መልእክቶችን ያትሙ"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"VMS ደንበኝነት ተመዝጋቢ"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"ወደ vms መልዕክቶች በደንበኝነት ይመዝገቡ"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"የማከማቻ ቁጥጥር አደራረግ ብልጭታ"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"የብልጭታ ማከማቻ አጠቃቀምን ይቆጣጠሩ"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"የመንዳት ሁኔታ"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"ለመኪና አነዳድ ሁኔታ ለውጦች ያዳምጡ"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"የሞተር ዝርዝር መረጃ"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"የእርስዎን መኪና በዝርዝር የቀረበ የሞተር መረጃ ይድረሱበት።"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"የጉልበት ወደቦች"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"የኃይል ወደቦችን ይድረሱባቸው"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"የመኪና ለይቶ ማወቂያ"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"የመኪና ለይቶ ማወቂያን ይድረሱበት"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"የመኪና በሮች"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"የመኪና በሮችን ይቆጣጠሩ"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"የመኪና መስኮቶች"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"የመኪና መስኮቶችን ይቆጣጠሩ።"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"የመኪና መስታውቶች"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"የመኪና መስታውቶችን ይቆጣጠሩ"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"የመኪና ወንበሮች"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"የመኪና ወንበሮችን ይቆጣጠሩ"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"የመኪና መሠረታዊ መረጃ"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"የመኪና መሠረታዊ መረጃን ይድረሱበት"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"የመኪና ውጫዊ መብራቶች"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"የመኪና ውጫዊ መብራቶችን ሁኔታ ይድረሱባቸው"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"የመኪና ውጫዊ መብራቶች"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"የመኪና ውጫዊ መብራቶችን ይቆጣጠሩ"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"የመኪና ውጫዊ ሙቀት"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"የመኪናውን ውጫዊ ሙቀት ይደረሱበት"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"የመኪና ጎማዎች"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"የመኪና ጎማ መረጃን ይድረሱበት"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"የመኪና ኃይል ባቡር"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"የመኪና የጉልበት ባቡር መረጃን ይደረሱበት"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"የመኪና ጉልበት"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"የመኪና የኃይል ሁኔታን ይድረሱበት"</string>
+</resources>
diff --git a/service/res/values-ar/config.xml b/service/res/values-ar/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-ar/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-ar/strings.xml b/service/res/values-ar/strings.xml
new file mode 100644
index 0000000..2f503f7
--- /dev/null
+++ b/service/res/values-ar/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"معلومات السيارة"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"الحصول على معلومات عن السيارة"</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"مقصورة القيادة"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"الحصول على معلومات ملحقات السيارة، بما في ذلك الأبواب والمرايا والمقاعد والنوافذ"</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"كاميرا السيارة"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"الوصول إلى الكاميرات في السيارة"</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"طاقة السيارة"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"الحصول على معلومات الطاقة في السيارة"</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"التدفئة والتهوية وتكييف الهواء في السيارة"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"الحصول على معلومات التدفئة والتهوية وتكييف الهواء في السيارة"</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"المسافة التي تقطعها السيارة بالأميال"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"الحصول على معلومات المسافة المقطوعة بالأميال في سيارتك"</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"سرعة السيارة"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"الحصول على معلومات عن سرعة السيارة"</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"الحالة الديناميكية للسيارة"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"الحصول على معلومات عن الحالة الديناميكية للسيارة"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"قناة مورِّد السيارة"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"الحصول على معلومات قناة المورِّد في السيارة لتبادل معلومات خاصة بالسيارة."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"راديو السيارة"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"الوصول إلى راديو السيارة"</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"العرض متعدّد الأبعاد للسيارة"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"مستوى الصوت في السيارة"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"إعدادات الصوت في السيارة"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"عرض واجهة الهاتف على شاشة السيارة"</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"محاكاة HAL في السيارة"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"محاكاة HAL في السيارة لغرض الاختبار الداخلي"</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"التحكم في مستوى الصوت داخل السيارة"</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"التحكم في إعدادات الصوت في السيارة"</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"حظر التطبيقات"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"التحكم في حظر التطبيقات أثناء القيادة"</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"مدير التنقّل"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"إبلاغ مجموعة الأدوات ببيانات التنقل"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"العرض المباشر في مجموعة العدادات"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"يمكنك السماح لتطبيق بإعلان الأنشطة المطلوب عرضها في مجموعة العدادات."</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"التحكم في مجموعة العدادات"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"تشغيل التطبيقات في مجموعة العدادات"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"جارٍ عرض مجموعة العدادات"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"تلقّي بيانات مجموعة الأدوات"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"ضبط قيود تجربة المستخدم"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"ضبط قيود تجربة المُستخدِم"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"خدمة إدخال السيارة"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"التعامل مع أحداث الإدخال"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"حدث خطأ في موصّل CAN"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"لا استجابة من موصّل CAN. يمكنك فصل صندوق وحدة الرأس وإعادة تشغيل السيارة."</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"حرصًا على سلامتك، لا يتوفّر هذا النشاط أثناء القيادة.\nللمتابعة، يمكنك الانتظار حتى تتوقّف السيارة."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"للبدء من جديد باستخدام ميزات تطبيق آمنة، اختَر <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
+ <string name="exit_button" msgid="5829638404777671253">"رجوع"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"التصحيح"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"البيانات التشخيصية"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"قراءة البيانات التشخيصية من السيارة"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"البيانات التشخيصية"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"محو البيانات التشخيصية من السيارة"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"ناشر الأجهزة الافتراضية"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"نشر رسائل الأجهزة الافتراضية"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"المشترك في الجهاز الافتراضي"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"الاشتراك في رسائل الأجهزة الافتراضية"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"مراقبة سعة تخزين الفلاش"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"مراقبة استخدام سعة تخزين الفلاش"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"وضع القيادة"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"الاستماع إلى التغييرات في حالة \"القيادة\""</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"تفاصيل المحرّك"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"الحصول على معلومات مفصّلة عن محرّك السيارة"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"منافذ الطاقة"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"الحصول على معلومات منافذ الطاقة"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"تحديد هوية السيارة"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"الحصول على معلومات عن تحديد هوية السيارة"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"أبواب السيارة"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"التحكم في أبواب السيارة"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"نوافذ السيارة"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"التحكم في نوافذ السيارة"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"مرايا السيارة"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"التحكم في مرايا السيارة"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"مقاعد السيارة"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"التحكم في مقاعد السيارة"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"المعلومات الأساسية عن السيارة"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"الحصول على معلومات أساسية عن السيارة"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"الإضاءة الخارجية للسيارة"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"الحصول على معلومات عن حالة الإضاءة الخارجية في السيارة"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"الإضاءة الخارجية للسيارة"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"التحكّم في الإضاءة الخارجية للسيارة"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"درجة الحرارة الخارجية للسيارة"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"الحصول على معلومات درجة الحرارة الخارجية في السيارة"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"إطارات السيارة"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"الحصول على معلومات عن إطارات السيارة"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"مجموعة قدرة السيارة"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"الحصول على معلومات مجموعة القدرة"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"قدرة السيارة"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"الحصول على معلومات عن حالة قدرة السيارة"</string>
+</resources>
diff --git a/service/res/values-as/config.xml b/service/res/values-as/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-as/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-as/strings.xml b/service/res/values-as/strings.xml
new file mode 100644
index 0000000..80f9d42
--- /dev/null
+++ b/service/res/values-as/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"গাড়ীৰ তথ্য"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"আপোনাৰ গাড়ীৰ তথ্য এক্সেছ কৰিব।"</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"গাড়ীৰ কেবিন"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"দৰ্জা, আইনা, আসন আৰু খিৰিকীসহ আপোনাৰ গাড়ীৰ আনুষংগিক সামগ্ৰীসমূহ এক্সেছ কৰিব।"</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"গাড়ীৰ কেমেৰা"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"আপোনাৰ গাড়ীৰ কেমেৰা এক্সেছ কৰিব।"</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"গাড়ীৰ শক্তি বিষয়ক তথ্য"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"আপোনাৰ গাড়ীৰ শক্তি সম্পৰ্কীয় তথ্য এক্সেছ কৰিব।"</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"গাড়ীৰ Hvac"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"আপোনাৰ গাড়ীৰ hvac এক্সেছ কৰিব।"</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"গাড়ীৰ মাইলেজ"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"আপোনাৰ গাড়ীৰ মাইলেজৰ তথ্য চাব।"</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"গাড়ীৰ গতিবেগ"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"আপোনাৰ গাড়ীৰ বেগ চাব।"</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"বাহনৰ ডায়নামিক্স স্থিতি"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"আপোনাৰ গাড়ীৰ ডায়নামিক্স স্থিতি এক্সেছ কৰিব"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"গাড়ী বিক্ৰেতাৰ চ্চেনেল"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"নিৰ্দিষ্ট গাড়ী বিষয়ক তথ্য বিনিময়ৰ বাবে গাড়ীৰ বিক্ৰেতাৰ চ্চেনেল এক্সেছ কৰিব।"</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"গাড়ীৰ ৰেডিঅ’"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"আপোনাৰ গাড়ীৰ ৰেডিঅ’ এক্সেছ কৰিব।"</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"গাড়ীৰ প্ৰজেকশ্বন"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"গাড়ীৰ অডিঅ’ৰ ভলিউম কিমান জানিব"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"গাড়ীৰ অডিঅ’ ছেটিং"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"গাড়ীৰ ডিছপ্লে’ত ফ’ন ইণ্টাৰফে’চ দেখুওৱাব"</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"বাহনৰ HAL ইমুলে’ট কৰক"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"আভ্যন্তৰীণ পৰীক্ষণৰ উদ্দেশ্যে আপোনাৰ গাড়ীৰ বাহন HAL ইমুলে’ট কৰিব।"</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"আপোনাৰ গাড়ীৰ অডিঅ’ৰ ভলিউম নিয়ন্ত্ৰণ কৰিব।"</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"আপোনাৰ গাড়ীৰ অডিঅ’ ছেটিং নিয়ন্ত্ৰণ কৰক।"</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"এপ্লিকেশ্বন অৱৰোধ"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"গাড়ী চলাই থাকোঁতে এপ্ অৱৰোধ কৰা কাৰ্য নিয়ন্ত্ৰণ কৰিব।"</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"নেভিগেশ্বন মেনেজাৰ"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"ইনষ্ট্ৰুমেণ্ট ক্লাষ্টাৰক নেভিগেশ্বন সম্পৰ্কীয় ডেটা যোগান ধৰিব"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"ইনষ্ট্ৰুমেণ্ট ক্লাষ্টাৰলৈ পোনপটীয়াকৈ ৰেণ্ডাৰ কৰা হৈছে"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"কোনো এপ্লিকেশ্বনক ইনষ্ট্ৰুমেণ্ট ক্লাষ্টাৰত প্ৰদৰ্শন কৰিবলৈ কাৰ্যকলাপ ঘোষণা কৰিবলৈ অনুমতি দিয়ক"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"ইনষ্ট্ৰুমেণ্ট ক্লাষ্টাৰ নিয়ন্ত্ৰণ"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"ইনষ্ট্ৰুমেণ্ট ক্লাষ্টাৰত এপ্ লঞ্চ কৰিব"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"ইনষ্ট্ৰুমেণ্ট ক্লাষ্টাৰ ৰেণ্ডাৰ কৰি থকা হৈছে"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"ইনষ্ট্ৰুমেণ্ট ক্লাষ্টাৰৰ ডেটা পায়"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"UX সীমাবদ্ধতা কনফিগাৰেশ্বন"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"UXৰ সীমাবদ্ধতা কনফিগাৰ কৰক"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"গাড়ীৰ ইনপুট সেৱা"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"ইনপুট ইভেণ্ট নিয়ন্ত্ৰণ কৰিব"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"CAN বাছ বিফল হৈছে"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN বাছে সঁহাৰি দিয়া নাই। হে’ড ইউনিট বাকচটো আঁতৰাই পুনৰ লগাওক"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"আপোনাৰ নিৰাপত্তাৰ বাবে এই কাৰ্যকলাপটো গাড়ী চলাই থকা সময়ত কৰিব নোৱাৰি।\nগাড়ীখন পাৰ্ক কৰি কামটো কৰক।"</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"সুৰক্ষিত এপ্ সুবিধাসহ আকৌ আৰম্ভ কৰিবলৈ <xliff:g id="EXIT_BUTTON">%s</xliff:g> বাছনি কৰক।"</string>
+ <string name="exit_button" msgid="5829638404777671253">"উভতি যাওক"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"ডিবাগ তথ্য"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"ডায়েগন’ষ্টিক ডেটা"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"গাড়ীৰ ডায়গ’ষ্টিক তথ্য পঢ়িব"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"ডায়েগন’ষ্টিক ডেটা"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"ডায়গ’ষ্টিক ডেটা গাড়ীৰ পৰা মচিব"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"VMS প্ৰকাশক"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"vms বাৰ্তা প্ৰকাশ কৰিব পাৰে"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"VMS গ্ৰাহকভুক্তি"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"vms বাৰ্তাৰ গ্ৰাহকভুক্ত কৰিব"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"সঞ্চয়াগাৰ নিৰীক্ষণ কৰিব"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"সঞ্চয়াগাৰ ব্যৱহাৰৰ তথ্য নিৰীক্ষণ কৰিব"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"গাড়ী চালনাৰ স্থিতি"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"গাড়ী চালনাৰ স্থিতি সলনি হ’লে তাক জানিব"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"ইঞ্জিন ডিটেইলড"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"আপোনাৰ গাড়ীৰ ইঞ্জিনৰ সবিশেষ তথ্য এক্সেছ কৰিব"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"এনাৰ্জী প’ৰ্ট"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"এনাৰ্জী প’ৰ্ট এক্সেছ কৰিব"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"গাড়ীৰ চিনাক্তকাৰী তথ্য"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"গাড়ীৰ চিনাক্তকাৰী তথ্য এক্সেছ কৰিব"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"গাড়ীৰ দৰ্জা"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"গাড়ীৰ দৰ্জা নিয়ন্ত্ৰণ কৰিব"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"গাড়ীৰ খিৰিকী"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"গাড়ীৰ খিৰিকী নিয়ন্ত্ৰণ কৰিব"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"গাড়ীৰ আইনা"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"গাড়ীৰ আইনা নিয়ন্ত্ৰণ কৰিব"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"গাড়ীৰ আসন"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"গাড়ীৰ আসন নিয়ন্ত্ৰণ কৰিব"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"গাড়ীৰ প্ৰাথমিক তথ্য"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"গাড়ীৰ বিষয়ে প্ৰাথমিক তথ্য এক্সেছ কৰিব"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"গাড়ীৰ বাহ্যিক লাইট"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"গাড়ীৰ বাহ্যিক লাইটৰ স্থিতি এক্সেছ কৰিব"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"গাড়ীৰ বাহ্যিক লাইট"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"গাড়ীৰ বাহ্যিক লাইট নিয়ন্ত্ৰণ কৰিব"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"গাড়ীৰ বাহ্যিক তাপমান"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"গাড়ীৰ বাহ্যিক তাপমান এক্সেছ কৰিব"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"গাড়ীৰ টায়াৰ"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"গাড়ীৰ টায়াৰৰ তথ্য এক্সেছ কৰিব"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"গাড়ীৰ পাৱাৰট্ৰেইন"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"গাড়ীৰ পাৱাৰট্ৰেইন সম্পৰ্কীয় তথ্য এক্সেছ কৰিব"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"গাড়ীৰ শক্তি"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"গাড়ীৰ শক্তিৰ স্থিতি এক্সেছ কৰিব"</string>
+</resources>
diff --git a/service/res/values-az/config.xml b/service/res/values-az/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-az/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-az/strings.xml b/service/res/values-az/strings.xml
new file mode 100644
index 0000000..831ffe4
--- /dev/null
+++ b/service/res/values-az/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Avtomobil məlumatı"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Avtomobil məlumatlarına giriş."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Avtomobilin kabinası"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Avtomobilin aksesuarlarına, o cümlədən qapılar, güzgülər, oturacaqlar və pəncərələrə giriş."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Avtomobilin kamerası"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Avtomobilin kameralarına giriş."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Avtomobil enerjisi"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Avtomobilin enerji məlumatlarına giriş."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"Avtomobilin Hvac mexanizmi"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Avtomobilin HVAC mexanizminə giriş."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Avtomobilin kilometrajı"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Avtomobilin kilometraj məlumatlarına giriş."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Avtomobilin sürəti"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Avtomobilin sürət məlumatlarına giriş."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Avtomobilin dinamik vəziyyəti"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Avtomobilin dinamik vəziyyətinə giriş"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Avtomobilin təchizatçı kanalı"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Avtomobilə aid məlumatların mübadiləsi üçün onun təchizatçı kanalına giriş."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Avtomobilin radiosu"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Avtomobilin radiosuna giriş."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Avtomobilin proyeksiyası"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Avtomobil Audio Səsi"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Avtomobilin Audio Ayarları"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Telefon interfeysinin avtomobil displeyində proyeksiyası."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Avtomobilin HAL mexanizminin emulyasiyası"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Daxili test məqsədilə avtomobilin HAL mexanizmini emulyasiya etmək."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Avtomobilin audio səsini tənzimləmək."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Avtomobilin audio ayarlarını tənzimləmək."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Tətbiqin bloklanması"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Avtomobil idarə edərkən tətbiqin bloklanmasını tənzimləmək"</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Naviqasiya Meneceri"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Naviqasiya məlumatlarının alət klasterinə bildirilməsi"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Alət klasterinə birbaşa ötürmə"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Alət klasterində göstəriləcək fəaliyyətlərin tətbiq tərəfindən bildirilməsinə icazə verin"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Alət klasterini tənzimləmək"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Alət klasterində tətbiqləri işə salmaq"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Alət Klasterinin Təchizatı"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Alət klasteri məlumatlarını almaq"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"UX Məhdudiyyətləri Konfiqurasiyası"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"UX Məhdudiyyətlərinin Konfiqurasiyası"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Avtomobil Daxiletmə Xidməti"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Daxiletmələri idarə etmək"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"CAN idarəetmə mexanizmi uğursuz oldu"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN mexanizmi cavab vermir. Əsas cihaz panelini ayırın və yenidən qoşun, sonra avtomobili yenidən işə salın"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"Təhlükəsizliyiniz üçün bu əməliyyat sürüş zamanı əlçatan deyil.\nDavam etmək üçün park edənədək gözləyin."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"Təhlükəsiz tətbiq xüsusiyyətləri ilə başlamaq üçün <xliff:g id="EXIT_BUTTON">%s</xliff:g> seçin."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Geri"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Debaq məlumatı"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Diaqnoztika Məlumatları"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Avtomobilin diaqnoztika məlumatlarını oxumaq"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Diaqnoztika Məlumatları"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Avtomobilin diaqnoztika məlumatlarını silmək"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"VMS naşiri"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"Vms mesajlarının nəşri"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"VMS abunəçisi"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"Vms mesajlara abunə olmaq"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Fleş yaddaşa nəzarət"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Fleş yaddaş istifadəsinə nəzarət"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Sürücülük Vəziyyəti"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Sürücülük vəziyyəti dəyişikliklərini dinləmək"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Ətraflı Mühərrik Məlumatları"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Avtomobilin ətraflı mühərrik məlumatlarına giriş"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Enerji Portları"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Enerji portlarına giriş"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Avtomobilin identifikasiyası"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Avtomobilin identifikasiyasına giriş"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Avtomobilin qapıları"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Avtomobilin qapılarını tənzimləmək"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Avtomobilin pəncərələri"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Avtomobil pəncərələrini tənzimləmək"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Avtomobilin güzgüləri"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Avtomobilin güzgülərini tənzimləmək"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Avtomobilin Oturacaqları"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Avtomobilin oturacaqlarını tənzimləmək"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Avtomobilin əsas məlumatları"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Avtomobilin əsas məlumatlarına giriş"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Avtomobilin eksteryer işıqları"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Avtomobilin eksteryer işıqlarının vəziyyətinə giriş"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Avtomobilin eksteryer işıqları"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Avtomobilin eksteryer işıqlarını tənzimləmək"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Avtomobilin xarici temperaturu"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Avtomobilin xarici temperaturuna giriş"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Avtomobilin şinləri"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Avtomobilin şin məlumatlarına giriş"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Avtomobilin güc mexanizmi"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Avtomobilin güc mexanizmi məlumatlarına giriş"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Avtomobilin Gücü"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Avtomobilin güc vəziyyətinə giriş"</string>
+</resources>
diff --git a/service/res/values-b+sr+Latn/config.xml b/service/res/values-b+sr+Latn/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-b+sr+Latn/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-b+sr+Latn/strings.xml b/service/res/values-b+sr+Latn/strings.xml
new file mode 100644
index 0000000..ede8513
--- /dev/null
+++ b/service/res/values-b+sr+Latn/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Informacije o automobilu"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Pristupi informacijama o automobilu."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Putnički prostor"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Pristupi opremi automobila, uključujući vrata, retrovizore, sedišta i prozore."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Kamera automobila"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Pristupi kamerama automobila."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Energija automobila"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Pristupi informacijama o energiji automobila."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"Grejanje, ventilacija i klimatizacija automobila"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Pristupi grejanju, ventilaciji i klimatizaciji automobila"</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Pređeni put automobila"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Pristupi informacijama o pređenom putu automobila."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Brzina automobila"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Pristupi brzini automobila."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Status dinamike vozila"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Pristupi statusu dinamike automobila"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Kanal prodavca automobila"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Pristupi kanalu prodavca automobila radi razmene posebnih informacija u vezi sa automobilom"</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Radio automobila"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Pristupa radiju automobila."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Projekcija u automobilu"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Jačina zvuka u automobilu"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Podešavanja zvuka u automobilu"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Projektuje interfejs telefona na ekran u automobilu."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Emulacija HAL vozila"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Emulira HAL vozila za automobil u svrhe internog testiranja"</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Kontroliše jačinu zvuka u automobilu."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Kontroliše podešavanja zvuka u automobilu."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Blokiranje aplikacija"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Kontroliše blokiranje aplikacija tokom vožnje."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Menadžer navigacije"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Šalje podatke za navigaciju instrument tabli"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Direktno prikazivanje na instrument tabli"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Dozvoli da aplikacija navede aktivnosti koje će se prikazivati na instrument tabli"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Kontrola instrument table"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Pokreće aplikacije na instrument tabli"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Prikazivanje na instrument tabli"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Prima podatke sa instrument table"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"Konfiguracija ograničenja KD-a"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"Konfiguriše ograničenja KD-a"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Usluga automobilskog unosa"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Upravlja događajima unosa"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"Greška CAN magistrale"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN magistrala ne reaguje. Isključite i ponovo uključite glavnu jedinicu i ponovo pokrenite automobil"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"Ova aktivnost nije dostupna dok vozite radi vaše bezbednosti.\nDa biste nastavili, prvo se parkirajte."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"Da biste ponovo počeli sa bezbednim funkcijama aplikacije, izaberite <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Nazad"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Dijagnostički podaci"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Čita dijagnostičke podatke iz automobila"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Dijagnostički podaci"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Briše dijagnostičke podatke iz automobila"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"Objavljivanje VMS podataka"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"Objavljuje vms poruke"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"Pretplati na VMS poruke"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"Prijavi na vms poruke"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Praćenje fleš memorije"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Nadgleda korišćenje fleš memorije"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Status vožnje"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Sluša promena statusa vožnje"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Detaljni podaci o automobilu"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Pristupi detaljnim podacima o motoru automobila"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Energetski portovi"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Pristupi energetskim portovima"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Identifikacija automobila"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Pristup podacima za identifikaciju automobila"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Vrata automobila"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Kontroliše vrata automobila"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Prozori automobila"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Kontroliše prozore automobila"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Retrovizori automobila"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Kontroliše retrovizore automobila"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Sedišta u automobilu"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Kontroliše sedišta u automobilu"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Osnovne informacije o automobilu"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Pristupi osnovnim podacima o automobilu"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Spoljna svetla automobila"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Pristupi statusu spoljnih svetla automobila"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Spoljna svetla automobila"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Kontroliše spoljna svetla automobila"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Spoljna temperatura automobila"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Pristupi spoljnoj temperaturi automobila"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Gume automobila"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Pristup podacima o gumama automobila"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Pogon automobila"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Pristupi podacima o pogonu automobila"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Napajanje automobila"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Pristup statusu napajanja automobila"</string>
+</resources>
diff --git a/service/res/values-be/config.xml b/service/res/values-be/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-be/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-be/strings.xml b/service/res/values-be/strings.xml
new file mode 100644
index 0000000..c2762af
--- /dev/null
+++ b/service/res/values-be/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Інфармацыя пра аўтамабіль"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Доступ да інфармацыі пра аўтамабіль."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Салон аўтамабіля"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Доступ да элементаў кузава і салона, такім як дзверы, люстэркі, сядзенні і вокны."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Камера ў аўтамабілі"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Доступ да камер аўтамабіля."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Энергарэсурсы аўтамабіля"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Доступ да інфармацыі пра энергарэсурсы аўтамабіля."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"АВіК аўтамабіля"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Доступ да сістэмы АВіК аўтамабіля."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Прабег аўтамабіля"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Доступ да інфармацыі пра прабег аўтамабіля."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Хуткасць аўтамабіля"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Доступ да інфармацыі пра хуткасць аўтамабіля."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Дынамічны стан транспартнага сродку"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Інфармацыя пра дынамічны стан аўтамабіля"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Канал пастаўшчыка аўтамабіля"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Доступ да канала пастаўшчыка аўтамабіля з мэтай абмену інфармацыяй, якая датычыцца аўтамабіля."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Радыё ў аўтамабілі"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Доступ да радыё ў аўтамабілі."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Трансляцыя на экран аўтамабіля"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Гучнасць аўдыя ў аўтамабілі"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Налады аўдыясістэмы аўтамабіля"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Праекцыя інтэрфейсу тэлефона на экран аўтамабіля."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Эмуляцыя інтэрфейсу HAL аўтамабіля"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Магчымасць эмуляваць інтэрфейс HAL для ўнутранага тэсціравання транспартнага сродку."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Рэгуляванне гучнасці аўдыясістэмы ў аўтамабілі."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Змяненне налад аўдыясістэмы аўтамабіля."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Блакіроўка праграм"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Магчымасць блакіраваць праграмы, калі вы за рулём."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Навігатар"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Паказ даных навігатара на прыборнай панэлі"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Паказ маршруту на прыборнай панэлі"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Дазволіць праграме вызначаць, якія даныя паказваць на прыборнай панэлі"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Кіраванне прыборнай панэллю"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Запуск праграмы з прыборнай панэлі"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Візуалізацыя на прыборнай панэлі"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Магчымасць атрымліваць даныя з прыборнай панэлі"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"Канфігурацыя абмежаванняў UX"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"Наладжванне абмежаванняў UX"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Сэрвіс уводу аўтамабіля"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Магчымасць апрацоўваць падзеі ўводу"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"CAN-шына парушана"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN-шына не адказвае. Перападключыце канектар, а затым выключыце запальванне і паўторна завядзіце аўтамабіль"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"Дзеля вашай бяспекі гэта дзеянне недаступнае, калі вы за рулём.\nСпачатку прыпаркуйцеся."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"Каб перазапусціць праграму ў бяспечным рэжыме, націсніце кнопку \"<xliff:g id="EXIT_BUTTON">%s</xliff:g>\"."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Назад"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Даныя дыягностыкі"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Счытванне дыягнастычных даных аўтамабіля"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Даныя дыягностыкі"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Выдаленне дыягнастычных даных аўтамабіля"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"Публікацыя VMS-паведамленняў"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"Магчымасць публікаваць VMS-паведамленні"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"Падпіска на VMS-паведамленні"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"Магчымасць атрымліваць VMS-паведамленні"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Маніторынг флэш-сховішча"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Магчымасць адсочваць выкарыстанне флэш-сховішча"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Стан падчас язды"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Адсочванне змен падчас язды"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Рухавік"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Доступ да падрабязнай інфармацыі пра рухавік аўтамабіля"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Парты энергарэсурсаў"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Доступ да энергетычных партоў"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Ідэнтыфікацыя аўтамабіля"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Доступ да ідэнтыфікацыйнага нумара аўтамабіля"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Дзверы аўтамабіля"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Кантроль дзвярэй аўтамабіля"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Вокны аўтамабіля"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Кіраванне вокнамі аўтамабіля"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Люстэркі аўтамабіля"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Кіраванне люстэркамі аўтамабіля"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Сядзенні аўтамабіля"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Рэгуляванне сядзенняў аўтамабіля"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Асноўная інфармацыя пра аўтамабіль"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Доступ да асноўнай інфармацыі пра аўтамабіль"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Вонкавае асвятленне аўтамабіля"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Інфармацыя пра вонкавае асвятленне аўтамабіля"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Вонкавае асвятленне аўтамабіля"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Кіраванне знешнімі асвятляльнымі прыборамі аўтамабіля"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Тэмпература звонку аўтамабіля"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Доступ да звестак пра тэмпературу звонку аўтамабіля"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Шыны аўтамабіля"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Доступ да інфармацыі пра шыны аўтамабіля"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Трансмісія аўтамабіля"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Доступ да інфармацыі пра трансмісію аўтамабіля"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Сілкаванне аўтамабіля"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Інфармацыя пра сілкаванне аўтамабіля"</string>
+</resources>
diff --git a/service/res/values-bg/config.xml b/service/res/values-bg/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-bg/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-bg/strings.xml b/service/res/values-bg/strings.xml
new file mode 100644
index 0000000..eac0abb
--- /dev/null
+++ b/service/res/values-bg/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Информация за автомобила"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Достъп до информацията за автомобила ви."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Купе на автомобила"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Достъп до аксесоарите на автомобила ви, включително врати, огледала, седалки и прозорци."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Камера на автомобила"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Достъп до камерата или съответно камерите на автомобила ви."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Енергия на автомобила"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Достъп до информацията за енергията на автомобила."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"ОВК система на автомобила"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Достъп до ОВК системата на автомобила."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Километраж на автомобила"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Достъп до информацията за километража на автомобила ви."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Скорост на автомобила"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Достъп до данните за скоростта на автомобила ви."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Състояние на динамичните компоненти на превозното средство"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Достъп до състоянието на динамичните компоненти на автомобила"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Канал на автомобилния производител"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Достъп до канала на производителя с цел обмен на конкретна информация за автомобила ви."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Радио на автомобила"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Достъп до радиото на автомобила."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Прожектиране в автомобила"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Сила на звука на автомобилната аудиосистема"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Звукови настройки на автомобила"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Прожектиране на интерфейса на телефона на автомобилния екран."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Емулиране на HAL интерфейса на превозното средство"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Емулиране на HAL интерфейса на автомобила ви с цел вътрешно тестване."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Контролиране на силата на звука на автомобилната аудиосистема."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Контролиране на звуковите настройки на автомобила."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Блокиране на приложения"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Контролиране на блокирането на приложения при шофиране."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Навигационен мениджър"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Съобщаване на навигационни данни в арматурното табло"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Директно изобразяване в арматурното табло"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Разрешаване на приложение да декларира активности, които да се показват в арматурното табло"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Контролиране на арматурното табло"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Стартиране на приложения в арматурното табло"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Изобразяване в арматурното табло"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Получаване на данни за арматурното табло"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"Конфигуриране на ограничения за ПРП"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"Конфигуриране на ограничения за ПРП"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Автомобилна услуга за входящи данни"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Обработване на входящи събития"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"Грешка в CAN шината"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN шината не реагира. Изключете и включете отново захранването на основното устройство и рестартирайте автомобила"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"От съображения за безопасност тази функция не е достъпна при шофиране.\nЗа да продължите, трябва първо да паркирате."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"За да рестартирате приложението и безопасните му функции, изберете „<xliff:g id="EXIT_BUTTON">%s</xliff:g>“."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Назад"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Диагностични данни"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Четене на диагностични данни от автомобила"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Диагностични данни"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Изчистване на диагностичните данни от автомобила"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"Публикуване на VMS"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"Публикуване на VMS съобщения"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"Абониране за VMS"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"Абониране за VMS съобщения"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Наблюдение на флаш хранилището"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Наблюдение на използването на флаш хранилището"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Състояние при шофиране"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Слушане за промени в състоянието на шофиране"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Подробни данни за двигателя"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Достъп до подробна информация за двигателя на автомобила"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Портове за зареждане"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Достъп до портовете за зареждане"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Идентификационни данни на автомобила"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Достъп до идентификационните данни на автомобила"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Врати на автомобила"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Контролиране на вратите на автомобила"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Прозорци на автомобила"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Контролиране на прозорците на автомобила"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Огледала на автомобила"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Контролиране на огледалата на автомобила"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Седалки на автомобила"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Контролиране на седалките на автомобила"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Основна информация за автомобила"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Достъп до основна информация за автомобила"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Външни светлини на автомобила"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Достъп до състоянието на външните светлини на автомобила"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Външни светлини на автомобила"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Контролиране на външните светлини на автомобила"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Външна температура на автомобила"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Достъп до данните за външната температура на автомобила"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Гуми на автомобила"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Достъп до информацията за гумите на автомобила"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Задвижваща система на автомобила"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Достъп до информацията за задвижващата система на автомобила"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Захранване на автомобила"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Достъп до състоянието на захранването на автомобила"</string>
+</resources>
diff --git a/service/res/values-bn/config.xml b/service/res/values-bn/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-bn/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-bn/strings.xml b/service/res/values-bn/strings.xml
new file mode 100644
index 0000000..f7e1cef
--- /dev/null
+++ b/service/res/values-bn/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"গাড়ির তথ্য"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"আপনার গাড়ির তথ্য অ্যাক্সেস করা।"</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"গাড়ির কেবিন"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"আপনার গাড়ির বিভিন্ন অ্যাক্সেসরি যেমন দরজা, আয়না, সিট এবং জানালা অ্যাক্সেস করা।"</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"গাড়ির ক্যামেরা"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"আপনার গাড়ির ক্যামেরা(গুলি) অ্যাক্সেস করা।"</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"গাড়ির এনার্জি"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"আপনার গাড়ির এনার্জি তথ্য অ্যাক্সেস করা।"</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"গাড়ির HVAC"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"আপনার গাড়ির HVAC অ্যাক্সেস করা।"</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"গাড়ির মাইলেজ"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"আপনার গাড়ির মাইলেজের তথ্য অ্যাক্সেস করা।"</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"গাড়ির স্পিড"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"আপনার গাড়ির স্পিড অ্যাক্সেস করা।"</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"গাড়ির ডায়নামিক অবস্থা"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"আপনার গাড়ির ডায়নামিক অবস্থা অ্যাক্সেস করা"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"গাড়ির ভেন্ডর চ্যানেল অ্যাক্সেস করা"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"গাড়ির নির্দিষ্ট তথ্য বিনিময় করতে আপনার গাড়ির ভেন্ডর চ্যানেল অ্যাক্সেস করা।"</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"গাড়ির রেডিও"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"আপনার গাড়ির রেডিও অ্যাক্সেস করা।"</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"গাড়ির প্রোজেকশন"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"গাড়ির অডিওর ভলিউম"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"গাড়ি অডিও সেটিংস"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"গাড়ির ডিসপ্লেতে ফোনের ইন্টারফেস দেখানো।"</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"গাড়ির HAL অনুকরণ করা"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"অভ্যন্তরীণ পরীক্ষার জন্য আপনার গাড়ির HAL অনুকরণ করা।"</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"আপনার গাড়ির ভলিউম নিয়ন্ত্রণ করা।"</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"আপনার গাড়ির অডিও সেটিংস নিয়ন্ত্রণ করা।"</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"অ্যাপ্লিকেশন ব্লক করা"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"ড্রাইভ করার সময় অ্যাপ্লিকেশন ব্লকিং নিয়ন্ত্রণ করা।"</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"নেভিগেশন ম্যানেজার"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"ইনস্ট্রুমেন্ট ক্লাস্টারে নেভিগেশন ডেটা রিপোর্ট করা"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"ইনস্ট্রুমেন্ট ক্লাস্টারে সরাসরি রেন্ডার করা"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"কোনও অ্যাপ্লিকেশনকে ইনস্ট্রুমেন্ট ক্লাস্টারে অ্যাক্টিভিটি দেখানোর অনুমতি দিন"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"ইনস্ট্রুমেন্ট ক্লাস্টার কন্ট্রোল"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"ইনস্ট্রুমেন্ট ক্লাস্টারে অ্যাপ চালু করা"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"ইনস্ট্রুমেন্ট ক্লাস্টার রেন্ডার করা"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"ইনস্ট্রুমেন্ট ক্লাস্টার ডেটা পান"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"UX বিধিনিষেধ কনফিগারেশন"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"UX বিধিনিষেধ কনফিগার করা"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"গাড়ির ইনপুট সার্ভিস"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"ইনপুট ইভেন্ট হ্যান্ডেল করা"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"CAN বাস কাজ করছে না"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN বাস কাজ করছে না। হেডইউনিট বক্স খুলে নিয়ে আবার লাগান ও গাড়ি রিস্টার্ট করুন"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"আপনার সুরক্ষার জন্য, ড্রাইভ করার সময় এটি করা যাবে না।\nচালিয়ে যেতে, গাড়ি পার্ক করা পর্যন্ত অপেক্ষা করুন।"</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"অ্যাপের সুরক্ষিত ফিচারগুলি নিয়ে আবার শুরু করতে, <xliff:g id="EXIT_BUTTON">%s</xliff:g> বেছে নিন।"</string>
+ <string name="exit_button" msgid="5829638404777671253">"আবার চালু করুন"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"ডিবাগ তথ্য"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"ডায়াগনস্টিক ডেটা"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"গাড়ির ডায়াগনস্টিক ডেটা পড়া"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"ডায়াগনস্টিক ডেটা"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"গাড়ি থেকে ডায়াগনস্টিক ডেটা মুছে ফেলা"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"VMS প্রকাশক"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"vms মেসেজ প্রকাশ করা"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"VMS সাবস্ক্রাইবার"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"vms মেসেজের সাবস্ক্রিপশন নিন"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"ফ্ল্যাশ স্টোরেজ মনিটর করা"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"ফ্ল্যাশ স্টোরেজের ব্যবহার মনিটর করা"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"ড্রাইভিংয়ের অবস্থা"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"ড্রাইভিংয়ের স্ট্যাটাস পরিবর্তন করার বিষয়ে শোনা"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"ইঞ্জিনের বিবরণ"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"আপনার গাড়ির ইঞ্জিনের বিবরণ অ্যাক্সেস করা"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"এনার্জি পোর্ট"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"এনার্জি পোর্ট অ্যাক্সেস করা"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"গাড়ি শনাক্তকরণ"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"গাড়ির শনাক্তকরণ অ্যাক্সেস করা"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"গাড়ির দরজা"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"গাড়ির দরজা নিয়ন্ত্রণ করা"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"গাড়ির জানালা"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"গাড়ির জানালা নিয়ন্ত্রণ করা"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"গাড়ির আয়না"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"গাড়ির আয়না নিয়ন্ত্রণ করা"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"গাড়ির সিট"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"গাড়ির সিট নিয়ন্ত্রণ করা"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"গাড়ির সাধারণ তথ্য"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"গাড়ির সাধারণ তথ্য অ্যাক্সেস করা"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"গাড়ির এক্সটিরিয়র লাইট"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"গাড়ির এক্সটিরিয়র লাইটের অবস্থা অ্যাক্সেস করা"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"গাড়ির এক্সটিরিয়র লাইট"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"গাড়ির এক্সটিরিয়র লাইট নিয়ন্ত্রণ করা"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"গাড়ির বাইরের তাপমাত্রা"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"গাড়ির বাইরের তাপমাত্রা অ্যাক্সেস করা"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"গাড়ির টায়ার"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"গাড়ির টায়ারের তথ্য অ্যাক্সেস করা"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"গাড়ির পাওয়ারট্রেন"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"গাড়ির পাওয়ারট্রেনের তথ্য অ্যাক্সেস করা"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"গাড়ির পাওয়ার"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"গাড়ির পাওয়ারের অবস্থা অ্যাক্সেস করা"</string>
+</resources>
diff --git a/service/res/values-bs/config.xml b/service/res/values-bs/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-bs/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-bs/strings.xml b/service/res/values-bs/strings.xml
new file mode 100644
index 0000000..116c959
--- /dev/null
+++ b/service/res/values-bs/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Informacije o automobilu"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Pristupiti informacijama o automobilu."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Putnički prostor"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Pristupiti perifernim uređajima automobila, uključujući vrata, retrovizore, sjedala i prozore."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Kamera automobila"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Pristupiti kameri(ama) automobila."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Energija automobila"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Pristupiti informacijama o energiji automobila."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"Grijanje, ventilacija i klimatizacija automobila"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Pristupiti grijanju, ventilaciji i klimatizaciji automobila."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Pređeni kilometri"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Pristupiti informacijama o pređenim kilometrima."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Brzina automobila"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Pristupiti informacijama o brzini automobila."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Stanje dinamike vozila"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Pristupiti stanju dinamike automobila"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Kanal trgovca automobilima"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Pristupiti kanalu trgovca automobilima radi razmjene posebnih informacija o automobilu."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Radio automobila"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Pristupiti radiju automobila."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Projekcija u automobilu"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Jačina zvuka u automobilu"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Postavke zvuka automobila"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Prikazati interfejs telefona na ekranu automobila."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Emulirati HAL vozila"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Emulirati HAL vozila u svrhu internog testiranja."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Kontrolirati jačinu zvuka u automobilu."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Kontrolirajte postavke zvuka automobila."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Blokiranje aplikacija"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Kontrolirati blokiranje aplikacija tokom vožnje."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Upravitelj navigacije"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Dostaviti podatke o navigaciji kontrolnoj tabli"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Direktno iscrtavanje na kontrolnoj ploči"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Dopustiti aplikaciji da navede aktivnosti koje će se prikazivati na kontrolnoj tabli"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Upravljanje kontrolnom tablom"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Pokrenuti aplikacije na kontrolnoj tabli"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Iscrtavanje na kontrolnoj tabli"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Primite podatke s kontrolne ploče"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"Konfiguracija ograničenja IK-a"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"Konfigurirajte ograničenja IK-a"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Usluga unosa za automobil"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Rukovati događajima unosa"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"Greška CAN busa"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN bus ne reagira. Isključite i ponovo uključite glavnu jedinicu i ponovo pokrenite automobil"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"Radi vaše sigurnosti, ova aktivnost nije dostupna tokom vožnje.\nDa nastavite, sačekajte da se zaustavite."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"Da počnete ponovo s funkcijama sigurne aplikacije, odaberite <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Nazad"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Dijagnostički podaci"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Pročitati dijagnostičke podatke automobila"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Dijagnostički podaci"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Brisati dijagnostičke podatke automobila"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"VMS izdavač"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"Objaviti vms poruke"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"VMS pretplatnik"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"Pretplatiti se na vms poruke"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Nadzor flash pohrane"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Pratiti korištenje flash pohrane"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Stanje vožnje"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Slušati izmjene stanja vožnje"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Detalji o motoru"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Pristupiti detaljnim informacijama o motoru automobila"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Energetski priključci"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Pristupiti energetskim priključcima"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Identifikacija automobila"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Pristupiti identifikaciji automobila"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Vrata automobila"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Kontrolirati vrata automobila"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Prozori automobila"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Kontrolirati prozore automobila"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Retrovizori automobila"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Kontrolirati retrovizore automobila"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Sjedala automobila"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Kontrolirati sjedala automobila"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Osnovne informacije o automobilu"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Pristupiti osnovnim informacijama o automobilu"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Vanjska svjetla automobila"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Pristupiti stanju vanjskih svjetala automobila"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Vanjska svjetla automobila"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Kontrolirati vanjska svjetla automobila"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Vanjska temperatura automobila"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Pristupiti temperaturi vanjskog dijela automobila"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Gume automobila"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Pristupiti informacijama o gumama automobila"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Pogon automobila"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Pristupiti informacijama o pogonu automobila"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Napajanje automobila"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Pristupiti stanju napajanja automobila"</string>
+</resources>
diff --git a/service/res/values-ca/config.xml b/service/res/values-ca/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-ca/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-ca/strings.xml b/service/res/values-ca/strings.xml
new file mode 100644
index 0000000..bdd4345
--- /dev/null
+++ b/service/res/values-ca/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Informació del cotxe"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Accedir a la informació del cotxe"</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Cabina del cotxe"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Accedir als accessoris del cotxe, inclosos els retrovisors, les portes, els seients i les finestres"</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Càmera del cotxe"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Accedir a la càmera del cotxe"</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Energia del cotxe"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Accedir a la informació sobre l\'energia del cotxe"</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"Sistema HVAC del cotxe"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Accedir al sistema HVAC del cotxe"</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Quilometratge del cotxe"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Accedir a la informació sobre el quilometratge del cotxe"</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Velocitat del cotxe"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Accedir a la velocitat del cotxe"</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Estat de la dinàmica del vehicle"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Accedir a l\'estat de la dinàmica del cotxe"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Canal del fabricant del cotxe"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Accedir al canal del fabricant del cotxe per intercanviar informació específica del cotxe"</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Ràdio del cotxe"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Accedir a la ràdio del cotxe"</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Projecció del cotxe"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Volum d\'àudio del cotxe"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Configuració d\'àudio del cotxe"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Projectar la interfície del telèfon al monitor del cotxe"</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Emular l\'API vehicle HAL"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Emular l\'API vehicle HAL del cotxe per fer proves internes"</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Controlar el volum d\'àudio del cotxe"</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Controlar la configuració d\'àudio del cotxe"</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Bloqueig d\'aplicacions"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Controlar el bloqueig d\'aplicacions mentre condueixes"</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Gestor de navegació"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Informar de dades de navegació al quadre de comandament"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Renderització directa al quadre de comandament"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Permetre que una aplicació determini quines activitats es mostren al quadre de comandament"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Control del quadre de comandament"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Executar aplicacions al quadre de comandament"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Renderització del quadre de comandament"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Rebre dades del quadre de comandament"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"Configuració de les restriccions de l\'experiència d\'usuari"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"Configurar les restriccions de l\'experiència d\'usuari"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Servei d\'entrada del cotxe"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Gestionar els esdeveniments d\'entrada"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"Ha fallat el bus CAN"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"El bus CAN no respon. Desendolla i torna a endollar el capçal i torna a engegar el cotxe."</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"Per motius de seguretat, aquesta activitat no està disponible mentre condueixes.\nPer continuar, has d\'estar aparcat."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"Per tornar a començar amb unes funcions d\'aplicació segures, selecciona <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Enrere"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Depuració"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Dades de diagnòstic"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Llegir les dades de diagnòstic del cotxe"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Dades de diagnòstic"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Esborrar les dades de diagnòstic del cotxe"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"Editor de VMS"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"Publicar missatges VMS"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"Subscriptor de VMS"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"Subscriure\'s als missatges VMS"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Supervisió de l\'emmagatzematge flaix"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Supervisar l\'ús d\'emmagatzematge flaix"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Estat de conducció"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Escoltar els canvis en l\'estat de conducció"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Detalls del motor"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Accedir a la informació detallada sobre el motor del cotxe"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Ports d\'energia"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Accedir als ports d\'energia"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Identificació del cotxe"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Accedir a la identificació del cotxe"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Portes del cotxe"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Controlar les portes del cotxe"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Finestres del cotxe"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Controlar les finestres del cotxe"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Retrovisors del cotxe"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Controlar els retrovisors del cotxe"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Seients del cotxe"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Controlar els seients del cotxe"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Informació bàsica del cotxe"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Accedir a la informació bàsica del cotxe"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Llums exteriors del cotxe"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Accedir a l\'estat dels llums exteriors del cotxe"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Llums exteriors del cotxe"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Controlar els llums exteriors del cotxe"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Temperatura exterior del cotxe"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Accedir a la temperatura exterior del cotxe"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Rodes del cotxe"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Accedir a la informació sobre les rodes del cotxe"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Potència del cotxe"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Accedir a la informació sobre la potència del cotxe"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Potència del cotxe"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Accedir a l\'estat de la potència del cotxe"</string>
+</resources>
diff --git a/service/res/values-cs/config.xml b/service/res/values-cs/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-cs/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-cs/strings.xml b/service/res/values-cs/strings.xml
new file mode 100644
index 0000000..5317b61
--- /dev/null
+++ b/service/res/values-cs/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Informace o autě"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Přístup k informacím o autě"</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Kabina auta"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Přístup k příslušenství auta včetně dveří, zrcátek, sedadel a okének."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Kamera auta"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Přístup ke kamerám auta."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Energie auta"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Přístup k údajům o energii auta."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"Systém HVAC auta"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Přístup k systému HVAC auta."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Ujeté kilometry"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Přístup k údajům o spotřebě auta."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Rychlost auta"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Přístup k rychlosti auta."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Dynamický stav vozidla"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Přístup k dynamickému stavu auta"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Kanál dodavatele auta"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Přístup do kanálu dodavatele auta za účelem výměny informací o autě."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Autorádio"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Přístup k autorádiu."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Promítání do auta"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Hlasitost zvuku v autě"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Nastavení zvuku v autě"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Promítání rozhraní telefonu na displeji auta."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Emulace vrstvy HAL"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Emulace vrstvy HAL auta pro účely interního testování."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Ovládání hlasitosti zvuku v autě."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Ovládání nastavení zvuku v autě."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Blokování aplikací"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Ovládání blokování aplikací při řízení."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Správce navigace"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Hlášení navigačních údajů do přístrojové desky"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Přímé vykreslování do přístrojové desky"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Povolit aplikaci deklarovat aktivity, které mají být zobrazeny na přístrojové desce"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Ovládání přístrojové desky"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Spouštění aplikací na přístrojové desce"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Vykreslování na přístrojové desce"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Přijímat údaje z přístrojové desky"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"Konfigurace omezení uživatelského prostředí"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"Konfigurace omezení uživatelského prostředí"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Služba vstupu auta"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Zpracování vstupních událostí"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"Sběrnice CAN selhala"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"Sběrnice CAN neodpovídá. Odpojte a opět zapojte autorádio a znovu nastartujte auto"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"Tato aktivita není při řízení z bezpečnostních důvodů dostupná.\nPokračovat můžete, až zaparkujete."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"Chcete-li začít znovu s bezpečnými funkcemi aplikace, vyberte <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Zpět"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Diagnostická data"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Čtení diagnostických dat z auta"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Diagnostická data"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Vymazání diagnostických údajů z auta"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"Vydavatel VMS"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"Publikování zpráv VMS"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"Odběratel VMS"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"Přihlášení k odběru zpráv vms"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Sledování úložiště flash"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Sledování využití úložiště flash"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Jízda autem"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Poslech změn jízdy autem"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Podrobnosti o motoru"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Přístup k podrobným údajům o motoru auta"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Energetické porty"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Přístup k energetickým portům"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Identifikace auta"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Přístup k identifikaci auta"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Dveře auta"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Ovládání dveří auta"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Okénka auta"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Ovládání okének auta"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Zrcátka auta"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Ovládání zrcátek auta"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Autosedačky"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Ovládání autosedaček"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Základní informace o autě"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Přístup k základním údajům o autě"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Venkovní světla auta"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Přístup ke stavu venkovních světel auta"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Venkovní světla auta"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Ovládání venkovních světel auta"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Venkovní teplota vozidla"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Přístup k venkovní teplotě auta"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Pneumatiky auta"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Přístup k údajům o pneumatikách auta"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Pohon auta"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Přístup k údajům o pohonu auta"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Výkon auta"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Přístup ke stavu výkonu auta"</string>
+</resources>
diff --git a/service/res/values-da/config.xml b/service/res/values-da/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-da/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-da/strings.xml b/service/res/values-da/strings.xml
new file mode 100644
index 0000000..7e61019
--- /dev/null
+++ b/service/res/values-da/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Biloplysninger"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Få adgang til oplysninger om din bil."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Bilens kabine"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Få adgang til bilens tilbehør, bl.a. døre, spejle, sæder og vinduer."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Bilkamera"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Få adgang til bilens kameraer."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Bilens energiforbrug"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Få adgang til oplysninger om bilens energiforbrug"</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"Bilens VVAC-system"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Få adgang til bilens VVAC-system."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Bilens kilometertal"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Få adgang til oplysninger om bilens kilometertal."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Bilens hastighed"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Få adgang til oplysninger om bilens hastighed."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Køretøjets tilstand Dynamik"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Få adgang til bilens tilstand Dynamik"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Bilens producentkanal"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Få adgang til bilens producentkanal for at udveksle bilspecifikke oplysninger."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Bilradio"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Få adgang til bilens radio."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Bilprojicering"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Bilens lydstyrke"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Bilens lydindstillinger"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Projicer telefonens grænseflade til bilens display."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Efterlign Vehicle HAL (Hardware Abstraction Layer)"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Efterlign bilens Vehicle HAL (Hardware Abstraction Layer) til interne testformål."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Styr lydstyrken i din bil."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Styr bilens lydindstillinger."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Appblokering"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Styr appblokering, mens du kører."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Navigationsadministrator"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Rapportér navigationsdata på instrumentbrættet"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Direkte gengivelse på instrumentbrættet"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Giv en app tilladelse til at angive aktiviteter, der skal vises på instrumentbrættet"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Styring af instrumentbrættet"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Start apps på instrumentbrættet"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Gengivelse af instrumentbrættet"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Modtag instrumentbrætdata"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"Konfiguration af UX-begrænsninger"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"Konfigurer UX-begrænsninger"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Bilens inputservice"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Håndter input"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"CAN-bus (Controller Area Network) mislykkedes"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN-bus (Controller Area Network) svarer ikke. Afbryd forbindelsen til bilens hovedenhed, tilslut den igen, og genstart bilen"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"Af hensyn til din sikkerhed kan du ikke få adgang til denne aktivitet, mens du kører.\nParkér, før du kan fortsætte."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"Vælg <xliff:g id="EXIT_BUTTON">%s</xliff:g> for at starte forfra med sikre appfunktioner."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Tilbage"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Diagnosticeringsdata"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Se diagnosticeringsdata fra bilen"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Diagnosticeringsdata"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Ryd diagnosticeringsdata fra bilen"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"VMS-udgiver"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"Udgiv VMS-meddelelser"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"VMS-abonnent"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"Abonner på VMS-meddelelser"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Overvågning af Flash-lager"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Overvåg Flash-lagerforbrug"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Tilstanden Kører"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Lyt til ændringer i tilstanden Kører"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Detaljerede oplysninger om motoren"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Få adgang til detaljerede oplysninger om bilens motor"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Tankdæksel og batteriport"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Få adgang til tankdæksel og batteriport"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Bilidentifikation"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Få adgang til bilens identifikation"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Bildøre"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Styr bilens døre"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Bilvinduer"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Styr bilens vinduer"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Bilens spejle"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Styr bilens spejle"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Bilsæder"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Styr bilens sæder"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Grundlæggende oplysninger om bilen"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Få adgang til grundlæggende oplysninger om bilen"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Bilens lygter"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Få adgang til bilens lygter"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Bilens lygter"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Styr bilens lygter"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Bilens udvendige temperatur"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Få adgang til bilens udvendige temperatur"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Bildæk"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Få adgang til oplysninger om bilens dæk"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Bilens motor og transmission"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Få adgang til oplysninger om bilens motor og transmission"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Bilens batteri"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Få adgang til bilens batteritilstand"</string>
+</resources>
diff --git a/service/res/values-de/config.xml b/service/res/values-de/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-de/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-de/strings.xml b/service/res/values-de/strings.xml
new file mode 100644
index 0000000..df6a0e0
--- /dev/null
+++ b/service/res/values-de/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Fahrzeuginformationen"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Auf Fahrzeuginformationen zugreifen."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Fahrzeuginnenraum"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Auf Autozubehör zugreifen, wie Türen, Spiegel, Sitze und Fenster."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Autokamera"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Auf Autokamera(s) zugreifen."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Energieinformationen für das Auto"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Auf Energieinformationen des Autos zugreifen."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"Klimaanlage"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Auf Klimaanlage des Autos zugreifen."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Kilometerstand"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Auf Informationen zum Kilometerstand zugreifen."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Fahrzeuggeschwindigkeit"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Auf Informationen zur Fahrzeuggeschwindigkeit zugreifen."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Fahrdynamikzustand"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Auf Fahrdynamikinformationen zugreifen"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Herstellerkanal"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Zum Abrufen fahrzeugspezifischer Informationen auf den Herstellerkanal zugreifen."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Autoradio"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Auf Autoradio zugreifen."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Übertragung an Auto"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Lautstärke der Audioanlage des Autos"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Einstellungen der Auto-Audioanlage"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Smartphone-Benutzeroberfläche auf Autodisplay übertragen."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Fahrzeug-HAL emulieren"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Zu Testzwecken Vehicle HAL des Autos emulieren."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Lautstärke der Audioanlage des Autos steuern."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Audioeinstellungen des Autos steuern."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Apps blockieren"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"App-Sperre während der Fahrt steuern."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Navigationsmanager"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Navigationsdaten an Kombi-Instrument senden"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Direktes Rendering auf Kombi-Instrument"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Apps erlauben, Aktivitäten für die Anzeige auf dem Kombi-Instrument freizugeben"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Steuerung des Kombi-Instruments"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Apps im Kombi-Instrument starten"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Kombi-Instrument-Rendering"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Daten von Kombi-Instrument erhalten"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"UX-Einschränkungen konfigurieren"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"UX-Einschränkungen konfigurieren"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Eingabedienst für das Auto"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Eingabe-Ereignisse verwalten"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"CAN-Bus ausgefallen"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN-Bus reagiert nicht. Trenne die Haupteinheit vom Stromnetz, schließe sie wieder an und starte das Auto."</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"Aus Sicherheitsgründen ist diese Aktivität während der Fahrt nicht verfügbar.\nWarte, bis das Fahrzeug geparkt ist."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"Wähle <xliff:g id="EXIT_BUTTON">%s</xliff:g>, um die App mit sicheren Funktionen neu zu starten."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Zurück"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Diagnosedaten"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Diagnosedaten zum Auto lesen"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Diagnosedaten"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Diagnosedaten des Fahrzeugs löschen"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"VMS-Herausgeber"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"VMS-Meldungen senden"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"VMS-Abonnent"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"VMS-Meldungen abonnieren"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Flash-Speicher-Nutzung verfolgen"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Flash-Speicher-Nutzung verfolgen"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Fahrzustand"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Informationen zu Fahrzustandsänderungen entgegennehmen"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Detaillierte Motorinformationen"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Auf detaillierte Motorinformationen zugreifen"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Tanköffnungen"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Auf Tanköffnungen zugreifen"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Fahrzeug-Identifizierungsnummer"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Auf Fahrzeug-Identifizierungsnummer zugreifen"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Autotüren"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Autotüren steuern"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Autofenster"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Autofenster steuern"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Autospiegel"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Autospiegel steuern"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Autositze"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Autositze steuern"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Grundlegende Fahrzeuginformationen"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Auf grundlegende Fahrzeuginformationen zugreifen"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Informationen zur Außenbeleuchtung"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Auf Zustand der Außenbeleuchtung zugreifen"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Außenbeleuchtung"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Außenbeleuchtung steuern"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Außentemperaturangabe des Autos"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Auf Außentemperaturangabe zugreifen"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Angaben zu den Autoreifen"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Auf Reifeninformationen zugreifen"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Antriebsstrang"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Auf Antriebsstrang-Informationen zugreifen"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Energieinformationen für das Auto"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Auf Status der Energieversorgung zugreifen"</string>
+</resources>
diff --git a/service/res/values-el/config.xml b/service/res/values-el/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-el/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-el/strings.xml b/service/res/values-el/strings.xml
new file mode 100644
index 0000000..3d4e95c
--- /dev/null
+++ b/service/res/values-el/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Πληροφορίες αυτοκινήτου"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Πρόσβαση στις πληροφορίες του αυτοκινήτου σας."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Καμπίνα αυτοκινήτου"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Πρόσβαση στα αξεσουάρ του αυτοκινήτου σας, συμπεριλαμβανομένων των θυρών, καθρεπτών, καθισμάτων και παραθύρων."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Κάμερα αυτοκινήτου"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Πρόσβαση στις κάμερες του αυτοκινήτου σας."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Ενέργεια αυτοκινήτου"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Πρόσβαση σε πληροφορίες ενέργειας του αυτοκινήτου σας."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"Σύστημα θέρμανσης, αερισμού, και κλιματισμού αυτοκινήτου"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Πρόσβαση στο σύστημα θέρμανσης, αερισμού, και κλιματισμού του αυτοκινήτου σας."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Διανυθείσα απόσταση αυτοκινήτου"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Πρόσβαση στις πληροφορίες σχετικά με τα χιλιόμετρα που διένυσε το αυτοκίνητό σας."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Ταχύτητα αυτοκινήτου"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Πρόσβαση στην ταχύτητα του αυτοκινήτου σας."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Κατάσταση δυναμικής οχήματος"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Πρόσβαση στην κατάσταση δυναμικής του αυτοκινήτου σας"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Κανάλι προμηθευτή αυτοκινήτου"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Πρόσβαση στο κανάλι προμηθευτή του αυτοκινήτου σας, για ανταλλαγή πληροφοριών σχετικά με το αυτοκίνητο."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Ραδιόφωνο αυτοκινήτου"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Πρόσβαση στο ραδιόφωνο του αυτοκινήτου σας."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Προβολή στο αυτοκίνητο"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Ένταση ήχου αυτοκινήτου"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Ρυθμίσεις ήχου αυτοκινήτου"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Προβολή διεπαφής τηλεφώνου στην οθόνη του αυτοκινήτου."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Προσομοίωση HAL οχήματος"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Προσομοίωση του HAL οχήματος του αυτοκινήτου σας για εσωτερική δοκιμή."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Έλεγχος έντασης ήχου του αυτοκινήτου σας."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Ελέγξτε τις ρυθμίσεις ήχου του αυτοκινήτου σας."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Αποκλεισμός εφαρμογών"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Έλεγχος αποκλεισμού εφαρμογών όταν οδηγείτε."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Διαχείριση πλοήγησης"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Αναφορά δεδομένων πλοήγησης στο καντράν"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Απευθείας απόδοση στο καντράν"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Να επιτρέπεται σε μια εφαρμογή η δήλωση δραστηριοτήτων για προβολή στο καντράν"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Έλεγχος καντράν"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Εκκίνηση εφαρμογών στο καντράν"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Απόδοση καντράν"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Λήψη δεδομένων καντράν"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"Διαμόρφωση περιορισμών εμπειρίας χρήστη"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"Διαμόρφωση περιορισμών εμπειρίας χρήστη"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Υπηρεσία εισόδου αυτοκινήτου"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Χειρισμός συμβάντων εισόδου"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"Αποτυχία διαύλου CAN"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"Ο δίαυλος CAN δεν αποκρίνεται. Αποσυνδέστε και συνδέστε ξανά το πλαίσιο μονάδας κεφαλής και έπειτα επανεκκινήστε το αυτοκίνητο"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"Για λόγους ασφαλείας, η δραστηρ. δεν είναι διαθέσιμη όταν οδηγείτε.\nΓια να συνεχίσετε, περιμένετε μέχρι να σταθμεύσετε."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"Για να ξεκινήσετε από την αρχή με ασφαλείς λειτουργίες εφαρμογής, επιλέξτε <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Πίσω"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Πλ. εντ. σφ."</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Δεδομένα διαγνωστικών στοιχείων"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Ανάγνωση διαγνωστικών δεδομένων από το αυτοκίνητο"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Δεδομένα διαγνωστικών στοιχείων"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Διαγραφή διαγνωστικών δεδομένων από το αυτοκίνητο"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"Εκδότης VMS"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"Δημοσίευση μηνυμάτων vms"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"Συνδρομητής VMS"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"Εγγραφή σε μηνύματα vms"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Παρακολούθηση αποθηκευτικού χώρου flash"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Παρακολούθηση χρήσης αποθηκευτικού χώρου flash"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Κατάσταση οδήγησης"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Ακρόαση αλλαγών κατάστασης οδήγησης"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Λεπτομέρειες κινητήρα"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Πρόσβαση σε λεπτομερείς πληροφορίες του κινητήρα του αυτοκινήτου σας"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Θύρες ενέργειας"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Πρόσβαση στις θύρες ενέργειας"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Στοιχεία αυτοκινήτου"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Πρόσβαση στα στοιχεία αυτοκινήτου"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Θύρες αυτοκινήτου"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Έλεγχος θυρών αυτοκινήτου"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Παράθυρα αυτοκινήτου"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Έλεγχος παραθύρων αυτοκινήτου"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Καθρέπτες αυτοκινήτου"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Έλεγχος καθρεπτών αυτοκινήτου"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Καθίσματα αυτοκινήτου"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Έλεγχος καθισμάτων αυτοκινήτου"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Βασικές πληροφορίες αυτοκινήτου"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Πρόσβαση σε βασικές πληροφορίες αυτοκινήτου"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Εξωτερικά φώτα αυτοκινήτου"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Πρόσβαση στην κατάσταση εξωτερικών φωτών"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Εξωτερικά φώτα αυτοκινήτου"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Έλεγχος εξωτερικών φωτών αυτοκινήτου"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Εξωτερική θερμοκρασία αυτοκινήτου"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Πρόσβαση στην εξωτερική θερμοκρασία αυτοκινήτου"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Ελαστικά αυτοκινήτου"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Πρόσβαση σε πληροφορίες ελαστικών αυτοκινήτου"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Μετάδοση αυτοκινήτου"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Πρόσβαση σε πληροφορίες μετάδοσης αυτοκινήτου"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Ισχύς αυτοκινήτου"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Πρόσβαση στην κατάσταση ισχύος αυτοκινήτου"</string>
+</resources>
diff --git a/service/res/values-en-rAU/config.xml b/service/res/values-en-rAU/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-en-rAU/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-en-rAU/strings.xml b/service/res/values-en-rAU/strings.xml
new file mode 100644
index 0000000..0314f14
--- /dev/null
+++ b/service/res/values-en-rAU/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Car information"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Access your car’s information."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Car cabin"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Access your car’s accessories, including doors, mirrors, seats and windows."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Car camera"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Access your car’s camera(s)."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Car energy"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Access your car’s energy information."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"Car HVAC"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Access your car’s HVAC."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Car mileage"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Access your car’s mileage information."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Car speed"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Access your car’s speed."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Vehicle dynamic\'s state"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Access your car’s dynamics state"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Car vendor channel"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Access your car’s vendor channel to exchange car-specific information."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Car radio"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Access your car’s radio."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Car projection"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Car audio volume"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Car audio settings"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Project phone interface on car display."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Emulate vehicle HAL"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Emulate your car’s vehicle HAL for internal testing purpose."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Control your car’s audio volume."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Control your car’s audio settings."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Application blocking"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Control application blocking while driving."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Navigation manager"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Report navigation data to instrument cluster"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Direct rendering to instrument cluster"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Allow an application to declare activities to be displayed in the instrument cluster"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Instrument cluster control"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Launch apps in the instrument cluster"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Instrument cluster rendering"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Receive instrument cluster data"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"UX restrictions configuration"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"Configure UX restrictions"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Car input service"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Handle input events"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"CAN bus failed"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN bus does not respond. Unplug and plug back in head unit box and restart the car"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"For your safety, this activity isn’t available while driving.\nTo continue, wait until you’ve parked."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"To start again with safe app features, select <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Back"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Debug info"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Diagnostic data"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Read diagnostic data from the car"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Diagnostic data"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Clear diagnostic data from the car"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"VMS publisher"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"Publish VMS messages"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"VMS subscriber"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"Subscribe to VMS messages"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Flash storage monitoring"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Monitor flash storage usage"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Driving state"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Listen to driving state changes"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Engine detailed"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Access your car’s detailed engine information"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Energy ports"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Access energy ports"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Car identification"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Access car’s identification"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Car doors"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Control car’s doors"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Car windows"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Control car’s windows"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Car mirrors"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Control car’s mirrors"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Car seats"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Control car’s seats"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Car basic information"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Access car basic information"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Car exterior lights"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Access car exterior lights state"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Car exterior lights"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Control car exterior lights"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Car exterior temperature"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Access car exterior temperature"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Car tyres"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Access car tyre information"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Car powertrain"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Access car powertrain information"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Car power"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Access car\'s power state"</string>
+</resources>
diff --git a/service/res/values-en-rCA/config.xml b/service/res/values-en-rCA/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-en-rCA/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-en-rCA/strings.xml b/service/res/values-en-rCA/strings.xml
new file mode 100644
index 0000000..0314f14
--- /dev/null
+++ b/service/res/values-en-rCA/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Car information"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Access your car’s information."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Car cabin"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Access your car’s accessories, including doors, mirrors, seats and windows."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Car camera"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Access your car’s camera(s)."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Car energy"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Access your car’s energy information."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"Car HVAC"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Access your car’s HVAC."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Car mileage"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Access your car’s mileage information."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Car speed"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Access your car’s speed."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Vehicle dynamic\'s state"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Access your car’s dynamics state"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Car vendor channel"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Access your car’s vendor channel to exchange car-specific information."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Car radio"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Access your car’s radio."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Car projection"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Car audio volume"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Car audio settings"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Project phone interface on car display."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Emulate vehicle HAL"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Emulate your car’s vehicle HAL for internal testing purpose."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Control your car’s audio volume."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Control your car’s audio settings."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Application blocking"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Control application blocking while driving."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Navigation manager"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Report navigation data to instrument cluster"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Direct rendering to instrument cluster"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Allow an application to declare activities to be displayed in the instrument cluster"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Instrument cluster control"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Launch apps in the instrument cluster"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Instrument cluster rendering"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Receive instrument cluster data"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"UX restrictions configuration"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"Configure UX restrictions"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Car input service"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Handle input events"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"CAN bus failed"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN bus does not respond. Unplug and plug back in head unit box and restart the car"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"For your safety, this activity isn’t available while driving.\nTo continue, wait until you’ve parked."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"To start again with safe app features, select <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Back"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Debug info"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Diagnostic data"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Read diagnostic data from the car"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Diagnostic data"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Clear diagnostic data from the car"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"VMS publisher"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"Publish VMS messages"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"VMS subscriber"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"Subscribe to VMS messages"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Flash storage monitoring"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Monitor flash storage usage"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Driving state"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Listen to driving state changes"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Engine detailed"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Access your car’s detailed engine information"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Energy ports"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Access energy ports"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Car identification"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Access car’s identification"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Car doors"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Control car’s doors"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Car windows"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Control car’s windows"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Car mirrors"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Control car’s mirrors"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Car seats"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Control car’s seats"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Car basic information"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Access car basic information"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Car exterior lights"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Access car exterior lights state"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Car exterior lights"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Control car exterior lights"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Car exterior temperature"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Access car exterior temperature"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Car tyres"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Access car tyre information"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Car powertrain"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Access car powertrain information"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Car power"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Access car\'s power state"</string>
+</resources>
diff --git a/service/res/values-en-rGB/config.xml b/service/res/values-en-rGB/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-en-rGB/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-en-rGB/strings.xml b/service/res/values-en-rGB/strings.xml
new file mode 100644
index 0000000..0314f14
--- /dev/null
+++ b/service/res/values-en-rGB/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Car information"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Access your car’s information."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Car cabin"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Access your car’s accessories, including doors, mirrors, seats and windows."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Car camera"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Access your car’s camera(s)."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Car energy"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Access your car’s energy information."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"Car HVAC"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Access your car’s HVAC."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Car mileage"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Access your car’s mileage information."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Car speed"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Access your car’s speed."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Vehicle dynamic\'s state"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Access your car’s dynamics state"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Car vendor channel"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Access your car’s vendor channel to exchange car-specific information."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Car radio"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Access your car’s radio."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Car projection"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Car audio volume"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Car audio settings"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Project phone interface on car display."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Emulate vehicle HAL"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Emulate your car’s vehicle HAL for internal testing purpose."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Control your car’s audio volume."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Control your car’s audio settings."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Application blocking"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Control application blocking while driving."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Navigation manager"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Report navigation data to instrument cluster"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Direct rendering to instrument cluster"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Allow an application to declare activities to be displayed in the instrument cluster"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Instrument cluster control"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Launch apps in the instrument cluster"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Instrument cluster rendering"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Receive instrument cluster data"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"UX restrictions configuration"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"Configure UX restrictions"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Car input service"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Handle input events"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"CAN bus failed"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN bus does not respond. Unplug and plug back in head unit box and restart the car"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"For your safety, this activity isn’t available while driving.\nTo continue, wait until you’ve parked."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"To start again with safe app features, select <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Back"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Debug info"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Diagnostic data"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Read diagnostic data from the car"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Diagnostic data"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Clear diagnostic data from the car"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"VMS publisher"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"Publish VMS messages"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"VMS subscriber"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"Subscribe to VMS messages"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Flash storage monitoring"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Monitor flash storage usage"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Driving state"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Listen to driving state changes"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Engine detailed"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Access your car’s detailed engine information"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Energy ports"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Access energy ports"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Car identification"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Access car’s identification"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Car doors"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Control car’s doors"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Car windows"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Control car’s windows"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Car mirrors"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Control car’s mirrors"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Car seats"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Control car’s seats"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Car basic information"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Access car basic information"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Car exterior lights"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Access car exterior lights state"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Car exterior lights"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Control car exterior lights"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Car exterior temperature"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Access car exterior temperature"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Car tyres"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Access car tyre information"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Car powertrain"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Access car powertrain information"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Car power"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Access car\'s power state"</string>
+</resources>
diff --git a/service/res/values-en-rIN/config.xml b/service/res/values-en-rIN/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-en-rIN/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-en-rIN/strings.xml b/service/res/values-en-rIN/strings.xml
new file mode 100644
index 0000000..0314f14
--- /dev/null
+++ b/service/res/values-en-rIN/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Car information"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Access your car’s information."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Car cabin"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Access your car’s accessories, including doors, mirrors, seats and windows."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Car camera"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Access your car’s camera(s)."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Car energy"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Access your car’s energy information."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"Car HVAC"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Access your car’s HVAC."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Car mileage"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Access your car’s mileage information."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Car speed"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Access your car’s speed."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Vehicle dynamic\'s state"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Access your car’s dynamics state"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Car vendor channel"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Access your car’s vendor channel to exchange car-specific information."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Car radio"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Access your car’s radio."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Car projection"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Car audio volume"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Car audio settings"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Project phone interface on car display."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Emulate vehicle HAL"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Emulate your car’s vehicle HAL for internal testing purpose."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Control your car’s audio volume."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Control your car’s audio settings."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Application blocking"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Control application blocking while driving."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Navigation manager"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Report navigation data to instrument cluster"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Direct rendering to instrument cluster"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Allow an application to declare activities to be displayed in the instrument cluster"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Instrument cluster control"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Launch apps in the instrument cluster"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Instrument cluster rendering"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Receive instrument cluster data"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"UX restrictions configuration"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"Configure UX restrictions"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Car input service"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Handle input events"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"CAN bus failed"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN bus does not respond. Unplug and plug back in head unit box and restart the car"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"For your safety, this activity isn’t available while driving.\nTo continue, wait until you’ve parked."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"To start again with safe app features, select <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Back"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Debug info"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Diagnostic data"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Read diagnostic data from the car"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Diagnostic data"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Clear diagnostic data from the car"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"VMS publisher"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"Publish VMS messages"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"VMS subscriber"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"Subscribe to VMS messages"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Flash storage monitoring"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Monitor flash storage usage"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Driving state"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Listen to driving state changes"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Engine detailed"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Access your car’s detailed engine information"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Energy ports"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Access energy ports"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Car identification"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Access car’s identification"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Car doors"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Control car’s doors"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Car windows"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Control car’s windows"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Car mirrors"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Control car’s mirrors"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Car seats"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Control car’s seats"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Car basic information"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Access car basic information"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Car exterior lights"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Access car exterior lights state"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Car exterior lights"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Control car exterior lights"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Car exterior temperature"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Access car exterior temperature"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Car tyres"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Access car tyre information"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Car powertrain"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Access car powertrain information"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Car power"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Access car\'s power state"</string>
+</resources>
diff --git a/service/res/values-en-rXC/config.xml b/service/res/values-en-rXC/config.xml
new file mode 100644
index 0000000..8d50dad
--- /dev/null
+++ b/service/res/values-en-rXC/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-en-rXC/strings.xml b/service/res/values-en-rXC/strings.xml
new file mode 100644
index 0000000..bb90c3e
--- /dev/null
+++ b/service/res/values-en-rXC/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Car information"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Access your car’s information."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Car Cabin"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Access your car’s accessories, including doors, mirrors, seats, and windows."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Car Camera"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Access your car’s camera(s)."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Car energy"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Access your car’s energy information."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"Car Hvac"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Access your car’s hvac."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Car mileage"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Access your car’s mileage information."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Car speed"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Access your car’s speed."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Vehicle dynamics state"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Access your car’s dynamics state"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Car vendor channel"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Access your car’s vendor channel to exchange car-specific information."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Car Radio"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Access your car’s radio."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Car Projection"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Car Audio Volume"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Car Audio Settings"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Project phone interface on car display."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Emulate vehicle HAL"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Emulate your car’s vehicle HAL for internal testing purpose."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Control your car’s audio volume."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Control your car’s audio settings."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Application blocking"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Control application blocking while driving."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Navigation Manager"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Report navigation data to instrument cluster"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Direct rendering to instrument cluster"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Allow an application to declare activities to be displayed in the instrument cluster"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Instrument cluster control"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Launch apps in the instrument cluster"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Instrument Cluster Rendering"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Receive instrument cluster data"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"UX Restrictions Configuration"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"Configure UX Restrictions"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Car Input Service"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Handle input events"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"CAN bus failed"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN bus does not respond. Unplug and plug back headunit box and restart the car"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"For your safety, this activity isn’t available while driving.\nTo continue, wait until you’re parked."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"To start over with safe app features, select <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Back"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Diagnostic Data"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Read diagnostic data from the car"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Diagnostic Data"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Clear diagnostic data from the car"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"VMS publisher"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"Publish vms messages"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"VMS subscriber"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"Subscribe to vms messages"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Flash storage monitoring"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Monitor flash storage usage"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Driving State"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Listen to Driving state changes"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Engine Detailed"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Access your car’s detailed engine information"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Energy Ports"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Access energy ports"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Car identification"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Access car’s identification"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Car Doors"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Control car’s doors"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Car Windows"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Control car’s windows"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Car Mirrors"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Control car’s mirrors"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Car Seats"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Control car’s seats"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Car basic information"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Access car basic information"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Car exterior lights"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Access car exterior lights state"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Car exterior lights"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Control car exterior lights"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Car exterior temperature"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Access car exterior temperature"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Car tires"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Access car tire information"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Car Powertrain"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Access car powertrain information"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Car Power"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Access car power state"</string>
+</resources>
diff --git a/service/res/values-es-rUS/config.xml b/service/res/values-es-rUS/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-es-rUS/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-es-rUS/strings.xml b/service/res/values-es-rUS/strings.xml
new file mode 100644
index 0000000..066376a
--- /dev/null
+++ b/service/res/values-es-rUS/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Información del auto"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Acceder a la información del auto"</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Cabina del auto"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Acceder a los accesorios del auto, incluidas las puertas, espejos, asientos y ventanillas"</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Cámara del auto"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Acceder a las cámaras del auto"</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Batería del auto"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Acceder a la información de energía del auto"</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"Sistema HVAC del auto"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Acceder al sistema HVAC del auto."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Kilometraje del auto"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Acceder a la información de kilometraje del auto"</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Velocidad del auto"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Acceder a la velocidad del auto"</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Estado de dinámicas del vehículo"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Acceder al estado de dinámicas del auto"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Canal del fabricante del auto"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Acceder al canal del fabricante del auto para intercambiar información específica"</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Radio del auto"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Acceder a la radio del auto"</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Proyección del auto"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Volumen del audio del auto"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Configuración del audio del auto"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Proyectar la interfaz del teléfono en la pantalla del auto"</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Emular API de vehicle HAL"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Emular API de vehicle HAL del auto para realizar pruebas internas"</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Controlar el volumen del audio del auto"</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Controlar la configuración de audio del auto"</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Bloqueo de aplicaciones"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Controlar el bloqueo de aplicaciones al conducir"</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Administrador de navegación"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Informar los datos de navegación al clúster de instrumentos"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Procesamiento directo de clúster de instrumentos"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Permitir que una aplicación declare las actividades que se mostrarán en el clúster de instrumentos"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Control del clúster de instrumentos"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Iniciar apps en el clúster de instrumentos"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Procesamiento de clúster de instrumentos"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Recibir datos del clúster de instrumentos"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"Configuración de restricciones de UX"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"Configurar restricciones de UX"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Servicio de entrada del auto"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Controlar eventos de entrada"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"Error de bus CAN"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN bus no responde. Desconecta y vuelve a conectar la caja de la unidad central y enciende nuevamente el auto"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"Por razones de seguridad, esta actividad no está disponible al conducir.\nPara continuar espera hasta que estaciones."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"Para volver a comenzar con funciones de app seguras, selecciona <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Atrás"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Depuración"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Datos de diagnóstico"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Leer datos de diagnóstico del auto"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Datos de diagnóstico"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Borrar datos de diagnóstico del auto"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"Publicador de VMS"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"Publicar mensajes VMS"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"Suscriptor de VMS"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"Suscribirse a mensajes VMS"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Supervisión del almacenamiento flash"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Controlar el uso del almacenamiento flash"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Estado de la conducción"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Escuchar los cambios de estado de la conducción"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Detalles del motor"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Acceder a la información detallada del motor del auto"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Puertos de carga de batería"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Acceder a los puertos de carga de batería"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Identificación del auto"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Acceder a la identificación del auto"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Puertas del auto"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Controlar las puertas del auto"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Ventanillas del auto"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Controlar las ventanillas del auto"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Espejos del auto"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Controlar los espejos del auto"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Asientos del auto"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Controlar asientos del auto"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Información básica del auto"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Acceder a la información básica del auto"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Luces exteriores del auto"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Acceder al estado de las luces exteriores del auto"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Luces exteriores del auto"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Controlar las luces exteriores del auto"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Temperatura exterior del auto"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Acceder a la temperatura exterior del auto"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Neumáticos del auto"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Acceder a la información de los neumáticos del auto"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Sistema de transmisión del auto"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Acceder a la información del sistema de transmisión del auto"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Energía del auto"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Acceder al estado de energía del auto"</string>
+</resources>
diff --git a/service/res/values-es/config.xml b/service/res/values-es/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-es/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-es/strings.xml b/service/res/values-es/strings.xml
new file mode 100644
index 0000000..2e3141a
--- /dev/null
+++ b/service/res/values-es/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Información sobre el coche"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Acceder a la información del coche."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Cabina del coche"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Acceder a los accesorios del coche, como puertas, espejos, asientos y ventanillas."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Cámara del coche"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Acceder a las cámaras del coche."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Energía del coche"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Acceder a la información sobre el nivel de energía del coche."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"CVAA"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Acceder al sistema de CVAA del coche."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Kilometraje del coche"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Accede a la información del kilometraje de tu coche."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Velocidad del coche"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Acceder a la velocidad del coche."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Estado de dinámicas del vehículo"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Acceder al estado de dinámicas del coche"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Canal del fabricante del coche"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Acceder al canal de fabricante para intercambiar información específica del coche."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Radio del coche"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Acceder a la radio del coche."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Proyección del coche"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Volumen del audio del coche"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Ajustes del audio del coche"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Proyectar interfaz del teléfono en la pantalla del coche."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Emular HAL del vehículo"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Emular HAL del vehículo para realizar pruebas internas."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Controlar el volumen del audio del coche."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Controlar los ajustes de audio del coche."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Bloqueo de aplicaciones"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Controlar el bloqueo de aplicaciones mientras conduces."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Administrador de navegación"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Mostrar datos de navegación en el panel de instrumentos"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Representación directa de datos en el panel de instrumentos"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Permitir que una aplicación determine las actividades que se pueden mostrar en el panel de instrumentos"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Control de panel de instrumentos"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Iniciar aplicaciones en el panel de instrumentos"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Representación de datos en el panel de instrumentos"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Recibir datos del panel de instrumentos"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"Configuración de restricciones de la experiencia de usuario"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"Configurar restricciones de la experiencia de usuario"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Servicio de entrada del coche"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Gestionar eventos de entrada"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"Fallo de bus CAN"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"El bus CAN no responde. Desconecta el cabezal, conéctalo de nuevo y reinicia el coche"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"Por tu seguridad, esta actividad no está disponible mientras conduces.\nPuedes continuar cuando hayas aparcado."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"Para volver a empezar con funciones de aplicaciones seguras, selecciona <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Atrás"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Depuración"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Datos de diagnóstico"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Leer datos de diagnóstico del coche"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Datos de diagnóstico"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Borrar datos de diagnóstico del coche"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"Publicar VMS"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"Publicar mensajes VMS"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"Suscriptor de VMS"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"Suscribirse a mensajes VMS"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Supervisión de almacenamiento flash"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Supervisar uso del almacenamiento flash"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Estado de conducción"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Escuchar cambios en el estado de conducción"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Información detallada del motor"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Acceder a información detallada sobre el motor del coche"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Puertos de energía"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Acceder a los puertos de energía"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Identificación del coche"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Acceder a la identificación del coche"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Puertas del coche"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Controlar las puertas del coche"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Ventanillas del coche"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Controlar las ventanillas del coche"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Espejos del coche"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Controlar los espejos del coche"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Asientos del coche"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Controlar asientos del coche"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Información básica del coche"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Acceder a la información básica del coche"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Luces exteriores del coche"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Acceder al estado de las luces exteriores del coche"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Luces exteriores del coche"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Controlar las luces exteriores del coche"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Temperatura exterior del coche"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Acceder a la temperatura exterior del coche"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Neumáticos del coche"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Acceder a información sobre los neumáticos del coche"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Potencia del coche"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Acceder a información sobre la potencia del coche"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Potencia del coche"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Acceder al estado de la potencia del coche"</string>
+</resources>
diff --git a/service/res/values-et/config.xml b/service/res/values-et/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-et/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-et/strings.xml b/service/res/values-et/strings.xml
new file mode 100644
index 0000000..47800e1
--- /dev/null
+++ b/service/res/values-et/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Auto teave"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Juurdepääs auto andmetele."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Auto salong"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Juurdepääs auto osadele (nagu uksed, peeglid, istmed ja aknad)."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Auto kaamera"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Juurdepääs auto kaameratele."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Auto energia"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Juurdepääs auto energiateabele."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"Auto kliimatehnika"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Juurdepääs auto kliimatehnikale."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Auto läbisõit"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Juurdepääs auto läbisõidu andmetele."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Auto kiirus"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Juurdepääs auto kiirusele."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Sõiduki dünaamiline olek"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Juurdepääs auto dünaamilisele olekule"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Auto edasimüüja kanal"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Juurdepääs auto edasimüüja kanalile, et autopõhist teavet vahetada."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Auto raadio"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Juurdepääs auto raadiole."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Auto projektsioon"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Auto helitugevus"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Auto heliseaded"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Telefoniliidese kuvamine auto ekraanil."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Sõiduki HAL-i jäljendamine"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Jälgige sisemise testimise eesmärgil oma auto sõiduki HAL-i."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Auto helitugevuse kontrollimine."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Auto heliseadete kontrollimine"</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Rakenduste blokeerimine"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Rakenduste blokeerimise kontrollimine sõidu ajal."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Navigeerimishaldur"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Näidikulauale navigeerimisandmete edastamine"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Otsene renderdamine näidikulauale"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Lubage rakendusel valida toimingud, mis kuvatakse näidikulaual"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Näidikulaua kontrollimine"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Kuva rakendusi näidikulaual"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Näidikulaua renderdamine"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Näidikulaua teabe saamine"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"Kasutuskogemuse piirangute seadistus"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"Kasutuskogemuse piirangute seadistamine"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Auto sisendteenus"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Sisestussündmuste töötlemine"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"CAN-siin ebaõnnestus"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN-siin ei reageeri. Eemaldage autoraadio üksus ja pange see tagasi ning taaskäivitage auto"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"Teie turvalisuse tõttu ei ole see toiming sõitmise ajal saadaval.\nJätkamiseks oodake, kuni olete parkinud."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"Uuesti alustamiseks turvaliste rakenduste funktsioonidega valige <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Tagasi"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Sil.-teave"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Diagnostikaandmed"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Auto diagnostikaandmete lugemine"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Diagnostikaandmed"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Auto diagnostikaandmete kustutamine"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"VMS-avaldaja"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"VMS-sõnumite avaldamine"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"VMS-tellija"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"VMS-sõnumite tellimine"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Välkmälu jälgimine"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Välkmälu kasutuse jälgimine"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Sõitmise olek"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Sõitmise oleku muudatuste kuulamine"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Mootor, üksikasjalik"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Juurdepääs auto üksikasjalikule mootoriteabele"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Energiapordid"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Juurdepääs energiaportidele"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Auto tuvastamine"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Juurdepääs auto tuvastamisteabele"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Autouksed"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Autouste kontrollimine"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Autoaknad"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Autoakende kontrollimine"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Autopeeglid"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Autopeeglite kontrollimine"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Autoistmed"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Autoistmete kontrollimine"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Auto põhiteave"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Juurdepääs auto põhiteabele"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Auto välistuled"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Juurdepääs auto välistulede olekule"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Auto välistuled"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Auto välistulede kontrollimine"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Auto välistemperatuur"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Juurdepääs auto välistemperatuurile"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Autorehvid"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Juurdepääs auto rehviteabele"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Auto jõuülekanne"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Juurdepääs auto jõuülekande teabele"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Auto toide"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Juurdepääs auto toiteolekule"</string>
+</resources>
diff --git a/service/res/values-eu/config.xml b/service/res/values-eu/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-eu/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-eu/strings.xml b/service/res/values-eu/strings.xml
new file mode 100644
index 0000000..2a757b7
--- /dev/null
+++ b/service/res/values-eu/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Autoari buruzko informazioa"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Atzitu autoari buruzko informazioa."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Autoaren kabina"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Atzitu autoaren osagarriak; besteak beste, ateak, ispiluak, eserlekuak eta leihoak."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Autoaren kamera"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Atzitu autoaren kamerak."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Autoaren energia"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Atzitu autoaren energiari buruzko informazioa"</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"Autoaren berogailua, haizagailua eta aire-girogailua."</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Atzitu autoaren berogailua, haizagailua eta aire-girogailua."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Autoaren kilometro kopurua"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Atzitu autoaren kilometro kopuruari buruzko informazioa."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Autoaren abiadura"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Atzitu autoaren abiadura."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Ibilgailuaren egoera dinamikoa"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Atzitu autoaren egoera dinamikoa"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Auto-saltzailearen kanala"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Atzitu auto-saltzailearen kanala autoari buruzko informazio zehatza trukatzeko."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Autoaren irratia"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Atzitu autoaren irratia."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Autoaren proiekzioa"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Autoaren audioaren bolumena"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Autoaren audio-ezarpenak"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Proiektatu telefonoaren interfazea autoaren pantailan."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Emulatu autoaren hardware-abstrakzioaren geruza (HAL)"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Emulatu autoaren hardware-abstrakzioaren geruza (HAL) barneko probak egiteko."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Kontrolatu autoaren audioaren bolumena."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Kontrolatu autoaren audio-ezarpenak."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Aplikazioak blokeatzea"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Kontrolatu gidatu bitartean blokeatzen diren aplikazioak."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Nabigazio-kudeatzailea"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Jakinarazi nabigazio-datuak instrumentu lukuari"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Zuzeneko errendatzea instrumentu lukuan"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Baimendu aplikazioari instrumentu lukuan bistaratu beharreko jarduerak erabakitzea"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Instrumentu lukua kontrolatzeko aukera"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Abiarazi aplikazioak instrumentu lukuan"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Instrumentu lukuaren errendatzea"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Jaso instrumentu lukuaren datuak"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"Erabiltzaileen esperientziaren murriztapenen konfigurazioa"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"Konfiguratu erabiltzaileen esperientziaren murriztapenak"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Autoaren sarrerako zerbitzua"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Kudeatu sarrerako gertaerak"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"CAN autobusak huts egin du"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN bus-ak ez du erantzuten. Desentxufatu eta entxufatu berriro gailu nagusia eta berrabiarazi autoa."</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"Zure segurtasuna bermatzeko, eginbide hau ezin da erabili gidatu bitartean.\nAurrera egiteko, itxaron autoa aparkatu arte."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"Berriro hasi nahi baduzu aplikazioaren eginbide seguruekin, hautatu <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Atzera"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Datu diagnostikoak"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Irakurri autoaren datu diagnostikoak"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Datu diagnostikoak"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Garbitu autoaren datu diagnostikoak"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"VMS argitaratzailea"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"Argitaratu VMS mezuak"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"VMS harpideduna"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"Harpidetu VMS mezuetara"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Flash-memoria gainbegiratzea"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Gainbegiratu flash-memoriaren erabilera"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Gidatze-egoera"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Entzun gidatze-egoeraren inguruko aldaketak"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Motorrari buruzko xehetasunak"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Atzitu autoaren motorrari buruzko informazio xehatua"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Energia-atakak"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Atzitu energia-atakak"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Autoaren identifikazioa"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Atzitu autoaren identifikazioa"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Autoaren ateak"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Kontrolatu autoaren ateak"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Autoaren leihoak"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Kontrolatu autoaren leihoak"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Autoaren ispiluak"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Kontrolatu autoaren ispiluak"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Autoaren eserlekuak"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Kontrolatu autoaren eserlekuak"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Autoari buruzko oinarrizko informazioa"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Atzitu autoari buruzko oinarrizko informazioa"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Autoaren kanpoaldeko argiak"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Atzitu autoaren kanpoaldeko argien egoera"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Autoaren kanpoaldeko argiak"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Kontrolatu autoaren kanpoaldeko argiak"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Autoaren kanpoaldeko tenperatura"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Atzitu autoaren kanpoaldeko tenperatura"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Pneumatikoak"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Atzitu autoaren pneumatikoei buruzko informazioa"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Atzitu autoaren transmisio-sistema"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Atzitu autoaren transmisio-sistemari buruzko oinarrizko informazioa"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Autoaren energia"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Atzitu autoaren energia-egoera"</string>
+</resources>
diff --git a/service/res/values-fa/config.xml b/service/res/values-fa/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-fa/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-fa/strings.xml b/service/res/values-fa/strings.xml
new file mode 100644
index 0000000..500f049
--- /dev/null
+++ b/service/res/values-fa/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"اطلاعات خودرو"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"دسترسی به اطلاعات خودرو"</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"اتاقک خودرو"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"دسترسی به لوازم جانبی خودرو، ازجمله درها، آینهها، صندلیها و پنجرهها."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"دوربین خودرو"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"دسترسی به دوربین(های) خودرو."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"انرژی خودرو"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"دسترسی اطلاعات انرژی خودرو."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"اچویایسی خودرو"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"دسترسی به اچویایسی خودرو."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"مسافت طیشده خودرو"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"دسترسی به اطلاعات مسافت پیمودهشده خودرو."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"سرعت خودکار"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"دسترسی به سرعت خودرو."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"حالت پویای خودرو"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"دسترسی به حالت پویای خودرو"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"کانال فروشنده خودرو"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"دسترسی به کانال فروشنده خودروی شما برای تبادل اطلاعات خاص خودرو."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"رادیو خودرو"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"دسترسی به رادیو خودرو."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"طرح سهبعدی خودرو"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"میزان صدای خودرو"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"تنظیمات صدای خودرو"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"نمایش واسط تلفن روی نمایشگر خودرو."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"شبیهسازی HAL خودرو"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"شبیهسازی HAL خودرو برای هدف آزمایش داخلی."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"کنترل میزان صدای خودرو"</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"کنترل تنظیمات صدای خودرو."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"انسداد برنامه"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"کنترل انسداد برنامه درحین رانندگی."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"مدیر ناوبری"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"گزارش دادههای ناوبری به داشبورد"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"پرداز مستقیم در داشبورد"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"اجازه به برنامه برای اعلام فعالیتهایی که باید در داشبورد نمایش داده شوند"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"کنترل داشبورد"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"راهاندازی برنامهها در داشبورد"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"پرداز داشبورد"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"دریافت دادههای داشبورد"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"پیکربندی محدودیتهای UX"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"پیکربندی محدودیتهای UX"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"سرویس ورودی خودرو"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"مدیریت رویدادهای ورودی"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"گذرگاه CAN ناموفق بود"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"گذرگاه CAN پاسخ نمیدهد. محفظه ضبطوپخش را جدا و سپس وصل کنید و خودرو را دوباره روشن کنید"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"بنا به دلایل ایمنی، این فعالیت درحین رانندگی دردسترس نیست.\n برای ادامه، تا زمان توقف خودرو صبر کنید."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"برای شروع مجدد با ویژگیهای برنامه امن، <xliff:g id="EXIT_BUTTON">%s</xliff:g> را انتخاب کنید."</string>
+ <string name="exit_button" msgid="5829638404777671253">"برگشت"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"اطلاعات اشکالزدایی"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"دادههای عیبیابی"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"خواندن دادههای عیبیابی خودرو"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"دادههای عیبیابی"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"پاک کردن دادههای عیبیابی خودرو"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"ناشر VMS"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"انتشار پیامهای vms"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"مشترک VMS"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"مشترک شدن در پیامهای vms"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"پایش فضای ذخیرهسازی فلاش"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"پایش مصرف فضای ذخیرهسازی فلاش"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"حالت رانندگی"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"گوش دادن تغییرات حالت رانندگی"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"اطلاعات کامل موتور"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"دسترسی به اطلاعات کامل موتور خودرو"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"درگاههای انرژی"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"دسترسی به درگاههای انرژی"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"شناسه خودرو"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"دسترسی به شناسه خودرو"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"دربهای خودرو"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"کنترل درهای خودرو"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"پنجرههای خودرو"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"کنترل پنجرههای خودرو"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"آینههای خودرو"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"کنترل آینههای خودرو"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"صندلیهای کودک"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"کنترل صندلیهای کودک"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"اطلاعات اصلی خودرو"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"دسترسی به اطلاعات اصلی خودرو"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"چراغهای خارجی خودرو"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"دسترسی به حالت چراغهای خارجی خودرو"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"چراغهای خارجی خودرو"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"کنترل چراغهای خارج خودرو"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"دمای خارجی خودرو"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"دسترسی به دمای خارجی خودرو"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"تایرهای خودرو"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"دسترسی به اطلاعات تایر خودرو"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"انتقال نیروی خودرو"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"دسترسی به اطلاعات انتقال قدرت خودرو"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"برق خودرو"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"دسترسی به حالت برق خودرو"</string>
+</resources>
diff --git a/service/res/values-fi/config.xml b/service/res/values-fi/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-fi/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-fi/strings.xml b/service/res/values-fi/strings.xml
new file mode 100644
index 0000000..7389553
--- /dev/null
+++ b/service/res/values-fi/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Auton tiedot"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"nähdä auton tiedot"</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Auton sisätilat"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"käyttää auton lisälaitteita, kuten ovia, peilejä, istuimia ja ikkunoita"</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Auton kamera"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"käyttää auton kameroita"</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Auton energiatiedot"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"nähdä auton energiatiedot"</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"Auton lämmitys-, ilmanvaihto- ja ilmastointijärjestelmä"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"käyttää auton lämmitys-,ilmanvaihto- ja ilmastointijärjestelmää"</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Matkamittarilukema"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"nähdä auton matkamittarilukeman"</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Auton nopeus"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"tarkistaa auton nopeuden"</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Ajoneuvon dynamiikan tila"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"nähdä auton dynamiikan tilan"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Auton myyjän kanava"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"tarkistaa auton myyjän kanavalta autokohtaisia tietoja"</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Autoradio"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"käyttää autoradiota"</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Auton suoratoisto"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Auton äänenvoimakkuus"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Auton ääniasetukset"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"suoratoistaa puhelimen käyttöliittymän auton näytölle"</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"jäljitellä auton ajoneuvo-HAL:ää"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"jäljitellä auton ajoneuvo-HAL:ää sisäistä testausta varten"</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"säätää auton äänenvoimakkuutta"</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"ohjata auton ääniasetuksia"</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Sovellusten esto"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"ohjata sovellusten estoa ajon aikana"</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Navigoinnin määritys"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"raportoida navigointidataa instrumenttijoukolle"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Suora renderöinti instrumenttijoukkoon"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Salli sovelluksen ilmoittaa instrumenttijoukossa näytettävistä toiminnoista"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Instrumenttijoukon hallinta"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"käynnistää sovelluksia instrumenttijoukossa"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Instrumenttijoukon renderöinti"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"vastaanottaa instrumenttijoukkojen dataa"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"UX-rajoitusten määritys"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"Määritä UX-rajoitukset"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Auton syötepalvelu"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"käsitellä syötteitä"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"CAN-väylä hylättiin"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN-väylä ei vastaa. Irrota pääyksikkö ja liitä se takaisin. Käynnistä auto sitten uudelleen."</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"Turvallisuussyistä toiminto ei ole käytettävissä ajon aikana.\nVoit jatkaa, kun olet pysäköinyt auton."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"Jos haluat aloittaa alusta turvallisilla sovellusominaisuuksilla, valitse <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Takaisin"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Diagnostiikkadata"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"lukea auton diagnostiikkadataa"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Diagnostiikkadata"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"tyhjentää auton diagnostiikkadatan"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"VMS-julkaisija"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"julkaista vms-viestejä"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"VMS-tilaaja"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"tilata vms-viestejä"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"seurata flash-tallennustilaa"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"valvoa flash-tallennustilan käyttöä"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Ajotila"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"kuunnella ajotilan muutoksia"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Moottorin tarkat tiedot"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"nähdä yksityiskohtaisia tietoja auton moottorista"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Virtaportit"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"käyttää virtaportteja"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Auton tunnistetiedot"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"nähdä auton tunnistetiedot"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Auton ovet"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"ohjata auton ovia"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Auton ikkunat"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"ohjata auton ikkunoita."</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Auton peilit"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"ohjata auton peilejä"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Auton istuimet"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"ohjata auton istuimia"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Auton perustiedot"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"nähdä auton perustiedot"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Auton ulkovalot"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"ohjata auton ulkovalojen tilaa"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Auton ulkovalot"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"ohjata auton ulkovaloja"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Auton ulkolämpötila"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"nähdä auton ulkolämpötilan"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Auton renkaat"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"nähdä auton renkaiden tiedot"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Auton voimansiirtolaite"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"nähdä auton voimansiirtolaitteen tiedot"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Auton virta"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"nähdä auton virran tilan"</string>
+</resources>
diff --git a/service/res/values-fr-rCA/config.xml b/service/res/values-fr-rCA/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-fr-rCA/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-fr-rCA/strings.xml b/service/res/values-fr-rCA/strings.xml
new file mode 100644
index 0000000..5e91500
--- /dev/null
+++ b/service/res/values-fr-rCA/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Renseignements sur la voiture"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Accéder aux renseignements relatifs à la voiture."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Habitacle de la voiture"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Accéder aux accessoires de la voiture, y compris les portières, les rétroviseurs, les sièges et les vitres."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Caméra de la voiture"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Accéder aux caméras de la voiture."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Énergie de la voiture"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Accéder aux renseignements énergétiques de la voiture."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"Élément CVC de la voiture"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Accéder à l\'élément CVC de la voiture."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Kilométrage de la voiture"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Accéder au kilométrage de la voiture."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Vitesse de la voiture"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Accéder à la vitesse de la voiture."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"État des éléments dynamiques de la voiture"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Accéder à l\'état de la dynamique de la voiture"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Chaîne du fournisseur de la voiture"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Accéder à la chaîne du fournisseur de la voiture afin d\'échanger de l\'information propre à cette dernière."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Radio de la voiture"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Accéder à la radio de la voiture."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Projection de la voiture"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Volume audio de la voiture"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Paramètres audio de la voiture"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Projeter l\'interface du téléphone sur l\'écran de la voiture."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Émuler le système HAL du véhicule"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Émuler le système HAL de la voiture à des fins de test interne."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Contrôlez le volume audio de la voiture."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Contrôler les paramètres audio de la voiture."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Blocage d\'applications"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Contrôler le blocage des applications pendant la conduite."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Gestionnaire de navigation"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Transmettre les données de navigation au groupe d\'instruments"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Diriger le rendu vers le groupe d\'instruments"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Autoriser une application à déclarer des activités à afficher dans le groupe d\'instruments"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Contrôle du groupe d\'instruments"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Lancer les applications dans le groupe d\'instruments"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Rendu du groupe d\'instruments"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Recevoir les données du groupe d\'instruments"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"Configuration des restrictions relatives à l\'expérience utilisateur"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"Configurer les restrictions relatives à l\'expérience utilisateur"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Service d\'entrée de la voiture"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Gérer les événements d\'entrée"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"Défaillance du bus de données CAN"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"Le bus de données CAN ne répond pas. Débranchez et rebranchez le boîtier de l\'unité centrale, puis redémarrez la voiture"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"Pour votre sécurité, cette activité est bloquée lorsque vous conduisez.\nVous devez être stationné pour continuer."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"Pour recommencer avec des fonctionnalités d\'application sécurisées, sélectionnez <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Retour"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Info débog"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Données de diagnostic"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Lire les données de diagnostic à partir de la voiture"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Données de diagnostic"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Effacer les données de diagnostic de la voiture"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"Éditeur de messages de signalisation dynamique"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"Publier les messages de signalisation dynamique"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"Abonné aux messages de signalisation dynamique"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"S\'abonner aux messages de signalisation dynamique"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Surveillance de la mémoire flash"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Surveiller l\'utilisation de la mémoire flash"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"État de la conduite"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Détecter les changements relatifs à la conduite"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Détails sur le moteur"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Accéder aux renseignements détaillés sur le moteur de la voiture"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Ports énergétiques"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Accéder aux ports énergétiques"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Identification de la voiture"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Accéder à l\'identification de la voiture"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Portières de la voiture"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Contrôler les portières de la voiture"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Vitres de la voiture"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Contrôler les vitres de la voiture"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Rétroviseurs de la voiture"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Contrôler les rétroviseurs de la voiture"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Sièges de la voiture"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Contrôler les sièges de la voiture"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Renseignements de base sur la voiture"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Accéder aux renseignements de base de la voiture"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Feux extérieurs de la voiture"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Accéder à l\'état des feux extérieurs de la voiture"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Feux extérieurs de la voiture"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Contrôler les feux extérieurs de la voiture"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Température extérieure de la voiture"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Accéder à la température extérieure de la voiture"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Pneus de la voiture"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Accéder aux renseignements sur les pneus de la voiture"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Groupe motopropulseur de la voiture"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Accéder aux renseignements sur le groupe motopropulseur de la voiture"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Alimentation de la voiture"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Accéder à l\'état de l\'alimentation de la voiture"</string>
+</resources>
diff --git a/service/res/values-fr/config.xml b/service/res/values-fr/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-fr/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-fr/strings.xml b/service/res/values-fr/strings.xml
new file mode 100644
index 0000000..2015153
--- /dev/null
+++ b/service/res/values-fr/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Informations relatives à la voiture"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Accéder aux informations relatives à la voiture."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Habitacle de la voiture"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Accéder aux accessoires de la voiture, y compris les portes, les rétroviseurs, les sièges et les fenêtres."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Caméra de la voiture"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Accéder aux caméras de la voiture."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Énergie de la voiture"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Accéder aux informations énergétiques de la voiture."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"Éléments CVC de la voiture"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Accéder aux éléments CVC de la voiture"</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Kilométrage de la voiture"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Accéder aux informations relatives au kilométrage de la voiture."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Vitesse de la voiture"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Accéder à la vitesse de la voiture."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"État des éléments dynamiques de la voiture"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Accéder à l\'état des éléments dynamiques de la voiture"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Chaîne du fournisseur de la voiture"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Accéder à la chaîne du fournisseur de votre voiture afin d\'échanger des informations spécifiques à cette dernière."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Autoradio"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Accéder à l\'autoradio."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Système de projection de la voiture"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Volume audio de la voiture"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Paramètres audio de la voiture"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Afficher l\'interface du téléphone sur l\'écran de la voiture."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Émuler la couche d\'abstraction du matériel de la voiture"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Émuler la couche d\'abstraction du matériel de la voiture afin d\'effectuer des tests internes."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Contrôler le volume audio de la voiture."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Contrôler les paramètres audio de la voiture."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Blocage d\'applications"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Contrôler le blocage des applications pendant la conduite."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Gestionnaire de navigation"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Reporter les données de navigation dans le groupe d\'instruments"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Rediriger le rendu vers le groupe d\'instruments"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Autoriser une application à déclarer des activités à afficher au niveau du groupe d\'instruments"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Contrôle du groupe d\'instruments"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Lancer des applications au niveau du groupe d\'instruments"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Rendu du groupe d\'instruments"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Recevoir les données du groupe d\'instruments"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"Configuration des restrictions relatives à l\'expérience utilisateur"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"Configurer les restrictions relatives à l\'expérience utilisateur"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Service d\'entrée de la voiture"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Gérer les événements d\'entrée"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"Échec du bus de données CAN"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"Le bus de données CAN ne répond pas. Débranchez et rebranchez le boîtier de l\'unité principale, puis redémarrez la voiture"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"Pour votre sécurité, cette activité n\'est pas disponible pendant la conduite.\nPour continuer, attendez d\'être garé."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"Pour recommencer avec des fonctionnalités d\'application sécurisées, sélectionnez <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Retour"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Données de diagnostic"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Lire les données de diagnostic de la voiture"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Données de diagnostic"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Effacer les données de diagnostic de la voiture"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"Éditeur de messages VMS"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"Publier des messages VMS"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"Abonné VMS"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"S\'abonner aux messages VMS"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Contrôle du stockage Adobe Flash Player"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Contrôler l\'utilisation du stockage Adobe Flash Player"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"État de la conduite"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Détecter les changements de conduite"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Informations détaillées sur le moteur"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Accéder à des informations détaillées sur le moteur de la voiture"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Ports d\'énergie"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Accéder aux ports d\'énergie"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Identification de la voiture"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Accéder à l\'identification de la voiture"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Portes de la voiture"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Contrôler les portes de la voiture"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Fenêtres de la voiture"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Contrôler les fenêtres de la voiture"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Rétroviseurs de la voiture"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Contrôler les rétroviseurs de la voiture"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Sièges de la voiture"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Contrôler les sièges de la voiture"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Informations de base de la voiture"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Accéder aux informations de base de la voiture"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Phares de la voiture"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Accéder à l\'état des phares de la voiture"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Phares de la voiture"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Contrôler les phares de la voiture"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Température à l\'extérieur de la voiture"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Accéder à la température à l\'extérieur de la voiture"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Pneus de la voiture"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Accéder aux informations relatives aux pneus de la voiture"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Groupe propulseur de la voiture"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Accéder aux informations sur le groupe propulseur de la voiture"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Puissance de la voiture"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Accéder à l\'état de la puissance de la voiture"</string>
+</resources>
diff --git a/service/res/values-gl/config.xml b/service/res/values-gl/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-gl/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-gl/strings.xml b/service/res/values-gl/strings.xml
new file mode 100644
index 0000000..b1be01d
--- /dev/null
+++ b/service/res/values-gl/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Información do coche"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Acceder a información do coche."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Cabina do coche"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Acceder aos accesorios do coche, como as portas, os espellos, os asentos e as ventás."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Cámara do coche"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Acceder ás cámaras do coche."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Enerxía do coche"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Acceder a información de enerxía do coche."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"Sistema de HVAC"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Acceder ao sistema de HVAC coche."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Quilometraxe do coche"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Acceder a información da quilometraxe do coche."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Velocidade do coche"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Acceder á velocidade do coche."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Estado da dinámica do vehículo"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Acceder ao estado da dinámica do coche"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Canle do vendedor do coche"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Acceder á canle do vendedor do coche para intercambiar información específica do coche."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Radio do coche"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Acceder á radio do coche."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Proxección do coche"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Volume do audio do coche"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Configuración do audio do coche"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Proxectar a interface do teléfono na pantalla do coche."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Emular a API vehicle HAL"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Emular a API vehicle HAL do coche para realizar probas internas."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Controlar o volume de audio do coche."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Controlar a configuración do audio do coche."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Bloqueo de aplicacións"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Controlar o bloqueo das aplicacións mentres conduces."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Xestor de navegación"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Notificar os datos de navegación ao panel de instrumentos"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Representación directa dos datos no panel de instrumentos"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Permitir que unha aplicación determine as actividades que se poden mostrar no panel de instrumentos"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Control do panel de instrumentos"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Iniciar aplicacións do panel de instrumentos"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Representación do panel de instrumentos"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Recibir datos do panel de instrumentos"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"Configuración de restricións da experiencia de usuario"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"Configurar restricións da experiencia de usuario"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Servizo de entrada do coche"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Controlar os eventos de entrada"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"Produciuse un erro no bus CAN"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"O bus CAN non responde. Desconecta a caixa da unidade principal, conéctaa de novo e reinicia o coche"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"Pola túa seguranza, esta actividade non está dispoñible mentres conduces.\nPodes continuar cando aparques."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"Para comezar de novo coas funcións de aplicacións seguras, selecciona o botón <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Atrás"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Info. dep."</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Datos de diagnóstico"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Ler datos de diagnóstico do coche"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Datos de diagnóstico"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Borrar datos de diagnóstico do coche"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"Editor de VMS"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"Publicar mensaxes VMS"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"Subscritor de VMS"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"Subscribirse ás mensaxes VMS"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Supervisión de almacenamento da unidade flash"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Controlar o uso de almacenamento da unidade flash"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Estado de condución"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Escoitar cambios no estado de condución"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Motor detallado"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Acceder a información detallada sobre o motor do coche"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Portos de enerxía"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Acceder aos portos de enerxía"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Identificación do coche"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Acceder á identificación do coche"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Portas do coche"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Controlar as portas do coche"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Ventás do coche"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Controlar as ventás do coche"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Espellos do coche"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Controlar espellos do coche"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Asentos do coche"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Controlar os asentos do coche"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Información básica do coche"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Acceder a información básica do coche"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Luces exteriores do coche"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Acceder ao estado das luces exteriores do coche"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Luces exteriores do coche"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Controlar as luces exteriores do coche"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Temperatura exterior do coche"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Acceder á temperatura exterior do coche"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Neumáticos do coche"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Acceder a información de neumáticos do coche"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Potencia do coche"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Acceder a información sobre o a potencia do coche"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Potencia do coche"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Acceder ao estado da potencia do coche"</string>
+</resources>
diff --git a/service/res/values-gu/config.xml b/service/res/values-gu/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-gu/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-gu/strings.xml b/service/res/values-gu/strings.xml
new file mode 100644
index 0000000..87572a8
--- /dev/null
+++ b/service/res/values-gu/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"કારની માહિતી"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"તમારી કારની માહિતીને ઍક્સેસ કરો."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"કારની કેબિન"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"તમારી કારની ઍક્સેસરી સહિત દરવાજા, અરીસા, સીટ્સ અને બારીઓ ઍક્સેસ કરો."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"કારનો કૅમેરા"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"તમારી કારના કૅમેરાને ઍક્સેસ કરવાની મંજૂરી આપો."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"કારની ઊર્જા"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"તમારી કારની ઊર્જાની માહિતી ઍક્સેસ કરવાની મંજૂરી આપો."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"કારની hvac"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"તમારી કારની hvac ઍક્સેસ કરો."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"કારનું માઇલેજ"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"તમારી કારના માઇલેજની માહિતી ઍક્સેસ કરો."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"કારની ઝડપ"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"તમારી કારની ગતિ ઍક્સેસ કરો."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"તમારી કારના ગતિશાસ્ત્રની સ્થિતિ"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"તમારી કારના ગતિશાસ્ત્રની સ્થિતિ ઍક્સેસ કરો"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"કારની વિક્રેતા ચેનલ"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"કાર સંબંધિત માહિતીના વિનિમય માટે તમારી કારના વિક્રેતાની ચૅનલ ઍક્સેસ કરો."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"કારનો રેડિયો"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"તમારી કારનો રેડિયો ઍક્સેસ કરો."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"કારનું પ્રોજેક્શન"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"કારના ઑડિયોનું વૉલ્યૂમ"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"કારની ઑડિયો સેટિંગ નિયંત્રિત કરવાની મંજૂરી આપો"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"કારના ડિસ્પ્લે પર ફોન ઇન્ટરફેસ પ્રોજેક્ટ કરવાની મંજૂરી આપો."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"કારના HALનું અનુસરણ કરો"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"આંતરિક પરીક્ષણ હેતુથી તમારી કારના HALનું અનુસરણ કરો."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"તમારી કારના ઑડિયોનું વૉલ્યૂમ નિયંત્રિત કરવાની મંજૂરી આપો."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"તમારી કારના ઑડિઓ સેટિંગ્સ નિયંત્રિત કરો."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"ઍપ્લિકેશન બ્લૉકિંગ"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"ડ્રાઇવિંગ કરતી વખતે ઍપ્લિકેશન બ્લૉકિંગ નિયંત્રિત કરો."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"નૅવિગેશન મેનેજર"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"નૅવિગેશન ડેટાની ઇન્સ્ટ્રુમેન્ટ ક્લસ્ટરને જાણ કરો"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"ઇન્સ્ટ્રુમેન્ટ ક્લસ્ટરને સીધું રેન્ડરિંગ કરવાની સુવિધા"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"પ્રવૃત્તિઓ ઇન્સ્ટ્રુમેન્ટ ક્લસ્ટરમાં પ્રદર્શિત થાય તેવું જાહેર કરવાની ઍપ્લિકેશનને મંજૂરી આપો"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"ઇન્સ્ટ્રુમેન્ટ ક્લસ્ટર નિયંત્રણ"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"ઇન્સ્ટ્રુમેન્ટ ક્લસ્ટરમાં ઍપ્લિકેશન લૉન્ચ કરો"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"ઇન્સ્ટ્રુમેન્ટ ક્લસ્ટર રેન્ડર કરી રહ્યું છે"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"ઇન્સ્ટ્રુમેન્ટ ક્લસ્ટરનો ડેટા પ્રાપ્ત કરો"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"UX પ્રતિબંધોની ગોઠવણી"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"UX પ્રતિબંધોને ગોઠવણી કરો"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"કારની ઇનપુટ સેવા"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"ઇનપુટ ઇવેન્ટ્સને હૅન્ડલ કરો"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"CAN બસ નિષ્ફળ રહી"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN બસ પ્રતિસાદ આપતી નથી. હેડયુનિટ બોક્સને અનપ્લગ કરી ફરી પ્લગ કરો અને કારને ફરી શરૂ કરો"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"તમારી સલામતી માટે કાર ચલાવતી વખતે આ પ્રવૃત્તિ ઉપલબ્ધ નથી.\nચાલુ રાખવા માટે કાર પાર્ક થવા સુધી રાહ જુઓ."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"સુરક્ષિત ઍપ્લિકેશન સુવિધાઓ સાથે ફરી શરૂ કરવા, <xliff:g id="EXIT_BUTTON">%s</xliff:g> પસંદ કરો."</string>
+ <string name="exit_button" msgid="5829638404777671253">"પાછળ"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"ડિબગમાહિતી"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"નિદાનના ડેટાને ઍક્સેસ કરવાની મંજૂરી આપો"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"કારમાંથી ડાયગ્નોસ્ટિક ડેટા વાંચો"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"નિદાનના ડેટાને ઍક્સેસ કરવાની મંજૂરી આપો"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"કારમાંથી ડાયગ્નોસ્ટિક ડેટા સાફ કરો"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"VMS પ્રકાશકની મંજૂરી"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"vms સંદેશા પ્રકાશિત કરવાની મંજૂરી આપો"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"VMS સબસ્ક્રાઇબર"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"vms સંદેશાને સબ્સ્ક્રાઇબ કરો"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"પેન ડ્રાઇવના સ્ટોરેજનું નિરીક્ષણ કરવાની મંજૂરી આપો"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"ફ્લૅશ સ્ટોરેજના વપરાશનું નિરીક્ષણ કરો"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"ડ્રાઇવિંગના ફેરફારો નોંધવાની મંજૂરી"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"ડ્રાઇવ કરવાની સ્થિતિના ફેરફારો સાંભળવાની મંજૂરી આપો"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"એન્જિન વિગતવાર"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"તમારી કારના એન્જિનની વિગતવાર માહિતી ઍક્સેસ કરવાની મંજૂરી આપો"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"ઊર્જાના પોર્ટના ઍક્સેસની મંજૂરી"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"ઊર્જાના પોર્ટ ઍક્સેસ કરો"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"કારની ઓળખ"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"કારની ઓળખ ઍક્સેસ કરો"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"કારના દરવાજા"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"કારના દરવાજા નિયંત્રિત કરો"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"કારની બારીઓ"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"કારની બારીઓ નિયંત્રિત કરો"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"કારના અરીસા"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"કારના અરીસા નિયંત્રિત કરો"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"કારની સીટના નિયંત્રણની મંજૂરી"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"કારની સીટ્સ નિયંત્રિત કરો"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"કારની મૂળભૂત માહિતી"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"કારની મૂળભૂત માહિતી ઍક્સેસ કરવાની મંજૂરી આપો"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"કારની બાહ્ય લાઇટ"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"કારની બાહ્ય લાઇટની સ્થિતિ ઍક્સેસ કરો"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"કારની બાહ્ય લાઇટ"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"કારની બાહ્ય લાઇટ નિયંત્રિત કરવાની મંજૂરી આપો"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"કારનું બાહ્ય તાપમાન"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"કારના બાહ્ય તાપમાનને ઍક્સેસ કરવાની મંજૂરી આપો"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"કારના ટાયરની માહિતી ઍક્સેસ કરવાની મંજૂરી આપો"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"કારના ટાયરની માહિતી ઍક્સેસ કરો"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"કારની પાવરટ્રેન"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"કારના પાવરટ્રેનની માહિતી ઍક્સેસ કરવાની મંજૂરી આપો"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"કારનો પાવર"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"કારના પાવરની સ્થિતિ ઍક્સેસ કરો"</string>
+</resources>
diff --git a/service/res/values-h1920dp/dimens.xml b/service/res/values-h1920dp/dimens.xml
index 938fb17..42de507 100644
--- a/service/res/values-h1920dp/dimens.xml
+++ b/service/res/values-h1920dp/dimens.xml
@@ -19,8 +19,6 @@
<resources>
<!-- Text size in ActivityBlockingActivity. -->
<dimen name="blocking_text_size">40sp</dimen>
- <!-- Padding of exit button in ActivityBlockingActivity. -->
- <dimen name="exit_button_padding">28dp</dimen>
- <!-- Top margin of exit button in ActivityBlockingActivity. -->
- <dimen name="exit_button_top_margin">20dp</dimen>
+ <!-- Padding of button in ActivityBlockingActivity. -->
+ <dimen name="button_padding">28dp</dimen>
</resources>
diff --git a/service/res/values-h800dp/dimens.xml b/service/res/values-h800dp/dimens.xml
index 9594554..6dd33fe 100644
--- a/service/res/values-h800dp/dimens.xml
+++ b/service/res/values-h800dp/dimens.xml
@@ -17,6 +17,6 @@
*/
-->
<resources>
- <!-- Padding of exit button in ActivityBlockingActivity. -->
- <dimen name="exit_button_padding">28dp</dimen>
+ <!-- Padding of button in ActivityBlockingActivity. -->
+ <dimen name="button_padding">28dp</dimen>
</resources>
diff --git a/service/res/values-hi/config.xml b/service/res/values-hi/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-hi/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-hi/strings.xml b/service/res/values-hi/strings.xml
new file mode 100644
index 0000000..94c2364
--- /dev/null
+++ b/service/res/values-hi/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"कार की जानकारी"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"आपकी कार की जानकारी एक्सेस कर सकता है"</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"कार का केबिन"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"आपकी कार के दरवाज़ों, शीशों, सीटों, और खिड़कियों के साथ ही उसकी एक्सेसरी एक्सेस कर सकता है."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"कार का कैमरा"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"आपकी कार के कैमरे एक्सेस कर सकता है."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"कार की ऊर्जा"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"आपकी कार की ऊर्जा से जुड़ी जानकारी एक्सेस कर सकता है."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"कार का एचवीएसी"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"आपकी कार का एचवीएसी एक्सेस कर सकता है."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"कार की माइलेज"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"आपकी कार की माइलेज से जुड़ी जानकारी एक्सेस कर सकता है."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"कार की रफ़्तार"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"आपकी कार की रफ़्तार की जानकारी एक्सेस कर सकता है."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"वाहन की गतिशीलता की स्थिति"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"आपकी कार की गतिशीलता की स्थिति एक्सेस कर सकता है"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"कार का विक्रेता चैनल"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"कार की खास जानकारी लेने-देने के लिए आपकी कार का विक्रेता, चैनल एक्सेस कर सकता है."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"कार का रेडियो"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"आपकी कार का रेडियो एक्सेस कर सकता है."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"कार का प्रोजेक्शन"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"कार के ऑडियो की आवाज़"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"कार की ऑडियो सेटिंग"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"फ़ोन इंटरफ़ेस को कार के डिसप्ले पर ला सकता है."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"vehicle HAL की तरह काम करना"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"अंदरूनी टेस्ट के मकसद से आपकी कार के vehicle HAL की तरह काम कर सकता है."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"आपकी कार के ऑडियो की आवाज़ नियंत्रित कर सकता है."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"आपकी कार की ऑडियो सेटिंग नियंत्रित कर सकता है."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"ऐप्लिकेशन ब्लॉक करना"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"गाड़ी चलाते समय ऐप्लिकेशन ब्लॉक करने की सुविधा नियंत्रित कर सकता है."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"नेविगेशन मैनेजर"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"इंस्ट्रूमेंट क्लस्टर में नेविगेशन डेटा की रिपोर्ट कर सकता है"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"इंस्ट्रूमेंट क्लस्टर में सीधे तौर पर होने वाली रेंडरिंग"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"ऐप्लिकेशन को इंस्ट्रूमेंट क्लस्टर में दिखाई जाने वाली गतिविधियों की घोषणा करने दें"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"इंस्ट्रूमेंट क्लस्टर का नियंत्रण"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"इंस्ट्रूमेंट क्लस्टर में ऐप्लिकेशन लॉन्च करें"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"इंस्ट्रूमेंट क्लस्टर रेंडर करने की सुविधा"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"इंस्ट्रूमेंट क्लस्टर का डेटा पाएं"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"UX पाबंदियों का कॉन्फ़िगरेशन"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"UX की पाबंदियां कॉन्फ़िगर करें"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"कार की इनपुट सेवा"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"इनपुट से जुड़े इवेंट प्रबंधित कर सकता है"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"\'CAN बस\' काम नहीं कर पा रहा है"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"\'CAN बस\' जवाब नहीं दे रहा है. हेडयूनिट बॉक्स का प्लग निकालकर वापस लगाएं और कार को रीस्टार्ट करें"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"आपकी सुरक्षा के लिए, गाड़ी चलाते समय यह गतिविधि मौजूद नहीं रहती है.\nजारी रखने के लिए गाड़ी पार्क करनी होगी."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"सुरक्षित ऐप्लिकेशन सुविधाएं फिर से शुरू करने के लिए, <xliff:g id="EXIT_BUTTON">%s</xliff:g> चुनें."</string>
+ <string name="exit_button" msgid="5829638404777671253">"वापस शुरू करें"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"निदान का डेटा"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"कार से निदान का डेटा पढ़ सकता है"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"निदान का डेटा"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"कार से निदान का डेटा हटा सकता है"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"VMS प्रकाशित कर सकता है"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"vms मैसेज प्रकाशित कर सकता है"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"VMS का सदस्य"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"vms मैसेज की सदस्यता ले सकता है"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"फ़्लैश डिवाइस की मेमोरी पर नज़र रख सकता है"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"फ़्लैश डिवाइस की मेमोरी के इस्तेमाल की निगरानी कर सकता है"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"गाड़ी चलाने के दौरान की स्थिति"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"गाड़ी चलाने के समय की स्थिति में होने वाले बदलावों पर नज़र रख सकता है"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"इंजन की पूरी जानकारी"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"आपकी कार के इंजन की पूरी जानकारी एक्सेस कर सकता है"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"एनर्जी पोर्ट"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"इनर्जी पोर्ट एक्सेस कर सकता है"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"कार की पहचान"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"कार की पहचान एक्सेस कर सकता है"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"कार के दरवाज़े"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"कार के दरवाज़े नियंत्रित कर सकता है"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"कार की खिड़कियां"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"कार की खिड़कियां नियंत्रित कर सकता है"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"कार के शीशे"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"कार के शीशे नियंत्रित कर सकता है"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"कार की सीटें"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"कार की सीटें नियंत्रित कर सकता है"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"कार की बुनियादी जानकारी"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"कार की बुनियादी जानकारी एक्सेस कर सकता है"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"कार की बाहर की लाइटें"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"कार की बाहर की लाइटों की स्थिति एक्सेस कर सकता है"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"कार की बाहर की लाइटें"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"कार की बाहर की लाइटें नियंत्रित कर सकता है"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"कार के बाहर का तापमान"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"कार के बाहर के तापमान की जानकारी एक्सेस कर सकता है"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"कार के टायर"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"कार के टायर की जानकारी एक्सेस कर सकता है"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"कार का पावरट्रेन"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"कार के पावरट्रेन की जानकारी एक्सेस कर सकता है"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"कार का पावर"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"कार के पावर की स्थिति एक्सेस कर सकता है"</string>
+</resources>
diff --git a/service/res/values-hr/config.xml b/service/res/values-hr/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-hr/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-hr/strings.xml b/service/res/values-hr/strings.xml
new file mode 100644
index 0000000..1c190ac
--- /dev/null
+++ b/service/res/values-hr/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"podaci o automobilu"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"pristupiti podacima o automobilu"</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"putnički prostor"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"pristupiti opremi automobila, uključujući vrata, retrovizore, sjedala i prozore"</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"automobilska kamera"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"pristupiti kamerama automobila"</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"energija automobila"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"pristupiti informacijama o energiji automobila"</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"grijanje, ventilacija i klimatizacija automobila"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"pristupiti grijanju, ventilaciji i klimatizaciji vašeg automobila"</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"kilometraža automobila"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"pristupiti informacijama o kilometraži automobila"</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"brzina automobila"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"pristupiti brzini automobila"</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"stanje dinamike vozila"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"pristupiti stanju dinamike automobila"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"kanal dobavljača automobila"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"pristupiti kanalu dobavljača automobila radi razmjene podataka o automobilu"</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"automobilski radio"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"pristupiti automobilskom radiju"</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"projekcija u automobilu"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"glasnoća zvuka za automobil"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"postavke zvuka za automobil"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"projicirati sučelje telefona na zaslonu automobila"</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"emulirati HAL vozila"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"emulirati HAL vozila za vaš automobil u svrhu internog testiranja"</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"upravljati glasnoćom zvuka za automobil"</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"upravljati postavkama zvuka za automobil"</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"blokiranje aplikacija"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"upravljati blokiranjem aplikacija tijekom vožnje"</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"upravitelj navigacije"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"dostaviti instrumentnoj ploči podatke o navigaciji"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"izravno generiranje na instrumentnoj ploči"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"dopustiti aplikaciji da navede aktivnosti koje će se prikazivati na instrumentnoj ploči"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"upravljanje instrumentnom pločom"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"pokretati aplikacije na instrumentnoj ploči"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"generiranje na instrumentnoj ploči"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"primati podatke instrumentne ploče"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"konfiguracija ograničenja UX-a"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"konfigurirati ograničenja UX-a"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"usluga automobilskog unosa"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"rukovati događajima unosa"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"Pogreška CAN busa"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN bus ne odgovara. Iskopčajte i ponovo ukopčajte glavnu jedinicu i ponovo pokrenite automobil"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"Radi vaše sigurnosti ta aktivnost nije dostupna tijekom vožnje.\nDa biste nastavili, pričekajte dok se ne zaustavite."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"Da biste započeli ponovo sa sigurnim značajkama aplikacije, odaberite <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Natrag"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Inf. o otkl. pogrešaka"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"dijagnostički podaci"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"čitati dijagnostičke podatke automobila"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"dijagnostički podaci"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"brisati dijagnostičke podatke automobila"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"VMS izdavač"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"objavljivati VMS poruke"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"VMS pretplatnik"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"pretplatiti se na VMS poruke"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"nadzor flash pohrane"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"nadzirati upotrebu flash pohrane"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Stanje vožnje"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"slušati promjene stanja vožnje"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"pojedinosti o motoru"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"pristupiti detaljnim podacima o motoru automobila"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"energetski priključci"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"pristupiti energetskim priključcima"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"identifikacija automobila"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"pristupiti identifikaciji automobila"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"automobilska vrata"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"upravljati automobilskim vratima"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"automobilski prozori"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"upravljati automobilskim prozorima"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"automobilski retrovizori"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"upravljati automobilskim retrovizorima"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"automobilska sjedala"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"upravljati automobilskim sjedalima"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"osnovni podaci o automobilu"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"pristupiti osnovnim podacima o automobilu"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"vanjska svjetla automobila"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"pristupiti stanju vanjskih svjetala automobila"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"vanjska svjetla automobila"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"upravljati vanjskim svjetlima automobila"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"temperatura vanjskog prostora automobila"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"pristupiti temperaturi vanjskog prostora automobila"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"automobilske gume"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"pristupiti podacima o automobilskim gumama"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"pogonski sklop automobila"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"pristupiti podacima o pogonskom sklopu automobila"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"napajanje automobila"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"pristupiti stanju napajanja automobila"</string>
+</resources>
diff --git a/service/res/values-hu/config.xml b/service/res/values-hu/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-hu/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-hu/strings.xml b/service/res/values-hu/strings.xml
new file mode 100644
index 0000000..1b531fb
--- /dev/null
+++ b/service/res/values-hu/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Az autó adatai"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Hozzáférhet az autó adataihoz."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Az autó utastere"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Hozzáférhet az autó részeihez (pl. ajtók, tükrök, ülések és ablakok)."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Az autó kamerája"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Hozzáférhet az autó kameráihoz."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Az autó energiafelhasználása"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Hozzáférhet az autó energiafelhasználására vonatkozó adatokhoz."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"Az autó HVAC-adatai"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Hozzáférhet az autó HVAC-adataihoz."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Az autó kilométeradatai"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Hozzáférhet az autó kilométeradataihoz."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Az autó sebessége"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Hozzáférhet az autó sebességadataihoz."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Jármű dinamikai állapota"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Hozzáférhet az autó dinamikai állapotához"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Az autó gyártói csatornája"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Hozzáférhet az autó gyártói csatornájához az autóval kapcsolatos információcsere céljából."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Autórádió"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Hozzáférhet az autó rádiójához."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Kivetítés az autó képernyőjére"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Az autó multimédia-rendszerének hangereje"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Az autó multimédia-rendszerének beállításai"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"A telefon kezelőfelületét az autó képernyőjére vetítheti."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Jármű hardverabsztrakciós rétegének (HAL) emulálása"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Emulálhatja a jármű hardverabsztrakciós rétegét (HAL) belső tesztelési célokból."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Vezérelheti az autó multimédia-rendszerének hangerejét."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Vezérelheti az autó multimédia-rendszerének beállításait."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Alkalmazás letiltása"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Vezérelheti az alkalmazások vezetés közbeni letiltását."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Navigációkezelő"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Jelentheti a navigációs adatokat a műszerfalon"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Közvetlen megjelenítés a műszerfalon"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Engedélyezheti az alkalmazásnak a műszerfalon megjelenítendő tevékenységek bejelentését"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"A műszerfal vezérlése"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Az alkalmazások műszerfalon való indítása"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Műszerfalon való megjelenítés"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Műszerfaladatok fogadása"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"Felhasználói élményre vonatkozó korlátozások beállítása"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"Felhasználói élményre vonatkozó korlátozások beállítása"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Az autó beviteli szolgáltatása"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Kezelheti a beviteli eseményeket"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"A CAN-busz hibát észlelt"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"A CAN-busz nem válaszol. Csatlakoztassa újra a fejegységet, és indítsa újra az autót."</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"Az Ön biztonsága érdekében ez a tevékenység nem végezhető vezetés közben.\nLeparkolás után folytathatja a tevékenységet."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"Ha biztonságos alkalmazásfunkciókkal szeretné újrakezdeni, válassza a következő gombot: <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Vissza"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Hibakeresési adatok"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Diagnosztikai adatok"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Olvashatja az autó diagnosztikai adatait"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Diagnosztikai adatok"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Törölheti az autó diagnosztikai adatait"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"Megjeleníthet változtatható jelzésképű táblákat"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"Változtatható jelzésképű táblák üzeneteinek megjelenítése"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"Feliratkozva a változtatható jelzésképű táblák üzeneteire"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"Feliratkozhat a változtatható jelzésképű táblák üzeneteire"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Flash-tárhely figyelése"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Figyelheti a Flash-tárhely használatát"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Vezetési állapot"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Meghallgathatja a vezetési állapot változásait"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Részletes motoradatok"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Hozzáférhet az autó részletes motoradataihoz"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Töltőnyílás/tanksapka"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Hozzáférhet a töltőnyíláshoz/tanksapkához"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Jármű-azonosító szám"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Hozzáférhet a jármű-azonosító számhoz"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Az autó ajtói"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Vezérelheti az autó ajtóit"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Az autó ablakai"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Vezérelheti az autó ablakait"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Az autó tükrei"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Vezérelheti az autó tükreit"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Az autó ülései"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Vezérelheti az autó üléseit"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Az autó alapvető adatai"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Hozzáférhet az autó alapvető adataihoz"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Az autó külső világítása"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Hozzáférhet az autó külső világításának állapotához"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Az autó külső világítása"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Vezérelheti az autó külső világítását"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Az autó külső hőmérséklete"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Hozzáférhet az autó külső hőmérsékletéhez"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Gumiabroncsok"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Hozzáférhet a gumiabroncsok adataihoz"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Az autó hajtáslánca"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Hozzáférhet az autó hajtásláncával kapcsolatos adatokhoz"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Az autó energiaszintje"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Hozzáférhet az autó energiaszintjével kapcsolatos adataihoz"</string>
+</resources>
diff --git a/service/res/values-hy/config.xml b/service/res/values-hy/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-hy/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-hy/strings.xml b/service/res/values-hy/strings.xml
new file mode 100644
index 0000000..3bf00a7
--- /dev/null
+++ b/service/res/values-hy/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Տեղեկություններ մեքենայի մասին"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Ընթերցել մեքենայի մասին տեղեկությունները"</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Խցիկ"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Կառավարել թափքի և խցիկի տարրերը՝ դռները, հայելիները, նստատեղերը և պատուհանները"</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Մեքենայի տեսախցիկ"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Կառավարել մեքենայի տեսախցիկ(ներ)ը"</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Էներգառեսուրսներ"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Ընթերցել մեքենայի էներգառեսուրսների մասին տվյալները"</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"HVAC համակարգ"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Կառավարել HVAC համակարգը"</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Մեքենայի վազքը"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Օգտագործել մեքենայի վազքի մասին տեղեկությունները"</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Մեքենայի արագություն"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Ընթերցել մեքենայի արագության մասին տեղեկությունները"</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Մեքենայի դինամիկայի մասին տվյալներ"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Ընթերցել մեքենայի դինամիկայի մասին տվյալները"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Մեքենայի վաճառողի ալիք"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Մուտք գործել վաճառողի ալիք՝ մեքենային բնորոշ տեղեկություններ փոխանակելու համար"</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Ռադիո"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Կառավարել մեքենայի ռադիոն"</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"ՀԵռարձակում մեքենայի էկրանին"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Աուդիո համակարգի ձայնի ուժգնություն"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Մեքենայի աուդիո համակարգի կարգավորումներ"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Ցուցադրել հեռախոսի միջերեսը մեքենայի էկրանին"</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Նմանակել HAL միջերեսը"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Նմանակել HAL միջերեսը ներքին փորձարկման համար"</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Կառավարել մեքենայի աուդիո համակարգի ձայնի ուժգնությունը"</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Կառավարել մեքենայի աուդիո համակարգի կարգավորումները"</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Հավելվածների արգելափակում"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Արգելափակել հավելվածները վարելու ռեժիմում"</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Նավիգատոր"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Ցույց տալ նավիգացիայի տվյալները սարքերի վահանակի վրա"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Տվյալների ցուցադրում սարքերի վահանակի վրա"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Թույլատրել հավելվածին որոշել՝ ինչ տվյալներ ցուցադրվեն սարքերի վահանակի վրա"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Սարքերի վահանակի կառավարում"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Գործարկել հավելվածներ սարքերի վահանակի վրա"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Սարքերի վահանակի արտապատկերում"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Ստանալ տվյալներ սարքերի վահանակից"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"Գործառույթների օգտագործման սահմանափակում"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"Սահմանափակել գործառույթների օգտագործումը"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Ներածման ծառայություն"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Մշակել ներածման իրադարձությունները"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"CAN անվադողի սխալ"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN անվադողը չի պատասխանում: Անջատեք և նորից միացրեք միակցիչը, ապա անջատեք վառոցքը և վերագործարկեք մեքենան:"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"Անվտանգության նկատառումներով այս գործողությունը հասանելի չէ վարելու ռեժիմում:\nՇարունակելու համար կայանեք մեքենան:"</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"Հավելվածն անվտանգ ռեժիմում վերագործարկելու համար սեղմեք<xliff:g id="EXIT_BUTTON">%s</xliff:g> կոճակը:"</string>
+ <string name="exit_button" msgid="5829638404777671253">"Հետ"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Ախտորոշման տվյալներ"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Ընթերցել մեքենայի ախտորոշման տվյալները"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Ախտորոշման տվյալներ"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Ջնջել մեքենայի ախտորոշման տվյալները"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"VMS հաղորդագրությունների հրապարակում"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"Հրապարակել VMS հաղորդագրություններ"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"Բաժանորդագրում VMS հաղորդագրություններին"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"Բաժանորդագրվել VMS հաղորդագրություններին"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Ֆլեշ պահեստի մոնիթորինգ"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Հետագծել ֆլեշ պահեստի օգտագործումը"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Վարելու ռեժիմ"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Հետագծել վարելու ռեժիմի փոփոխությունները"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Շարժիչ"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Ընթերցել շարժիչի մասին մանրամասն տեղեկությունները"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Վառելիքի բաքի դռնակ կամ լիցքավորման վարդակ"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Կառավարել վառելիքի բաքի դռնակը կամ լիցքավորման վարդակը"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Մեքենայի նույնականացում"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Ընթերցել մեքենայի նույնականացման տվյալները"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Մեքենայի դռներ"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Կառավարել մեքենայի դռները"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Պատուհաններ"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Կառավարել մեքենայի պատուհանները"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"ՄԵքենայի հայելիներ"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Կառավարել մեքենայի հայելիները"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Նստատեղեր"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Կառավարել նստատեղերը"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Ընդհանուր տեղեկություններ մեքենայի մասին"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Ընթերցել մեքենայի մասին ընդհանուր տեղեկությունները"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Մեքենայի արտաքին լույսեր"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Ընթերցել արտաքին լույսերի վիճակի մասին տվյալները"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Մեքենայի արտաքին լույսեր"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Կառավարել մեքենայի արտաքին լույսերը"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"ՄԵքենայի արտաքին ջերմաստիճանը"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Իմանալ մեքենայի արտաքին ջերմաստիճանը"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Անվադողեր"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Ընթերցել անվադողերի մասին տվյալները"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Շարժահաղորդում"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Ընթերցել շարժահաղորդման մասին տվյալները"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Էլեկտրասնուցում"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Ընթերցել մեքենայի էլեկտրասնուցման մասին տվյալները"</string>
+</resources>
diff --git a/service/res/values-in/config.xml b/service/res/values-in/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-in/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-in/strings.xml b/service/res/values-in/strings.xml
new file mode 100644
index 0000000..ab880c0
--- /dev/null
+++ b/service/res/values-in/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Informasi mobil"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Mengakses informasi mobil Anda."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Kabin Mobil"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Mengakses aksesori mobil Anda, termasuk pintu, spion, kursi, dan jendela."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Kamera Mobil"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Mengakses kamera mobil Anda."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Energi mobil"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Mengakses informasi energi mobil Anda."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"Hvac Mobil"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Mengakses hvac mobil Anda."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Jarak tempuh mobil"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Mengakses informasi jarak tempuh mobil."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Kecepatan mobil"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Mengakses kecepatan mobil Anda."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Status dinamika kendaraan"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Mengakses status dinamika mobil Anda"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Saluran vendor mobil"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Mengakses saluran vendor mobil untuk bertukar informasi mengenai mobil."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Radio Mobil"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Mengakses radio mobil Anda."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Proyeksi Mobil"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Volume Audio Mobil"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Setelan Audio Mobil"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Memproyeksikan antarmuka ponsel di layar mobil."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Mengemulasi HAL kendaraan"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Mengemulasi HAL kendaraan mobil Anda untuk tujuan pengujian internal."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Mengontrol volume audio mobil Anda."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Mengontrol setelan audio mobil Anda."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Pemblokiran aplikasi"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Mengontrol pemblokiran aplikasi saat mengemudi."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Pengelola Navigasi"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Melaporkan data navigasi ke kluster instrumen"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Melakukan rendering langsung ke kluster instrumen"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Mengizinkan aplikasi mendeklarasikan aktivitas untuk ditampilkan di kluster instrumen"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Kontrol kluster instrumen"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Luncurkan aplikasi di kluster instrumen"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Rendering Kluster Instrumen"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Menerima data kluster instrumen"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"Konfigurasi Batasan UX"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"Mengonfigurasi Batasan UX"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Layanan Masukan Mobil"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Menangani aktivitas masukan"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"CAN bus gagal"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN bus tidak merespons. Cabut dan colokkan kembali boks headunit, lalu nyalakan ulang mobil"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"Demi keamanan Anda, aktivitas ini tidak tersedia saat Anda mengemudi.\nUntuk melanjutkan, tunggu hingga mobil terparkir."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"Untuk mulai dari awal dengan fitur apl yang aman, pilih <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Kembali"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Info Debug"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Data Diagnostik"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Membaca data diagnostik dari mobil"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Data Diagnostik"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Menghapus data diagnostik dari mobil"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"Penayang VMS"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"Memublikasikan pesan vms"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"Pelanggan VMS"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"Berlangganan ke pesan vms"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Pemantauan penyimpanan flash"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Memantau penggunaan penyimpanan flash"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Status Mengemudi"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Mendengar perubahan status Mengemudi"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Detail Mesin"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Mengakses informasi mendetail tentang mesin mobil Anda"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Port Energi"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Mengakses port energi"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Identifikasi mobil"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Mengakses identifikasi mobil"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Pintu Mobil"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Mengontrol pintu mobil"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Jendela Mobil"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Mengontrol jendela mobil"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Spion Mobil"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Mengontrol spion mobil"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Kursi Mobil"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Mengontrol kursi mobil"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Informasi dasar mobil"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Mengakses informasi dasar mobil"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Lampu eksterior mobil"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Mengakses status lampu eksterior mobil"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Lampu eksterior mobil"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Mengontrol lampu eksterior mobil"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Suhu eksterior mobil"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Mengakses suhu eksterior mobil"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Ban mobil"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Mengakses informasi ban mobil"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Pembangkit Tenaga Mobil"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Mengakses informasi pembangkit tenaga mobil"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Daya Mobil"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Mengakses status daya mobil"</string>
+</resources>
diff --git a/service/res/values-is/config.xml b/service/res/values-is/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-is/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-is/strings.xml b/service/res/values-is/strings.xml
new file mode 100644
index 0000000..b43a60c
--- /dev/null
+++ b/service/res/values-is/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Upplýsingar um bíl"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Fá aðgang að upplýsingum um bílinn."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Farþegarými bíls"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Aðgangur að aukahlutum bílsins, þ.m.t. hurðum, speglum, sætum og gluggum."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Myndavél bíls"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Fá aðgang að myndavél(um) bílsins."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Orka bílsins"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Aðgangur að upplýsingum um orkunotkun bílsins."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"Hita- og loftræstikerfi bíls"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Fá aðgang að hitun og loftræstingu bílsins."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Ekin vegalengd bíls"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Fá aðgang að upplýsingum um ekna vegalengd bílsins."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Hraði bíls"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Fá upplýsingar um hraða bílsins."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Staða aksturseiginleika bíls"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Aðgangur að stöðu aksturseiginleika bílsins"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Framleiðandarás bíls"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Fá aðgang að framleiðandarás bílsins til að skiptast á bílatengdum upplýsingum."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Útvarp bíls"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Fá aðgang að útvarpi bílsins."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Vörpun bíls"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Hljóðstyrkur í bílnum"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Stillingar á hljóðkerfi bíls"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Sýna viðmót síma á skjá bílsins."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Líkja eftir HAL ökutækis"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Líkja eftir HAL ökutækis til að gera innri prófanir."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Stjórna hljóðstyrk í bílnum."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Stjórna stillingum fyrir hljóðkerfi bílsins."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Lokað á forrit"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Stjórna útilokun forrita við akstur."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Umsjón með leiðsögn"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Tilkynna leiðsagnargögn til mælaborðs"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Bein teiknun á mælaborði"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Leyfa forriti að velja aðgerðir til birtingar á mælaborði."</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Stjórnun mælaborðs"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Opna forrit á mælaborði"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Teiknun mælaborðs"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Fá mælaborðsgögn"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"Grunnstilling takmarkana á upplifun notanda"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"Stilla takmarkanir á upplifun notanda"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Inntaksþjónusta bíls"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Stjórna inntakstilvikum"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"Bilun í CAN-gagnabraut"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN-gagnabraut svarar ekki. Taktu stjórneiningarboxið úr sambandi, settu það aftur í samband og gangsettu bílinn aftur."</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"Af öryggisástæðum er þessi aðgerð ekki í boði við akstur.\nLeggðu ökutækinu áður en þú heldur áfram."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"Til að byrja aftur að setja upp örugga forritseiginleika skaltu velja <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Til baka"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Villuleit"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Greiningargögn"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Lesa greiningargögn úr bílnum"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Greiningargögn"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Hreinsa greiningargögn úr bíl"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"VMS-útgefandi"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"Birta VMS-skilaboð"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"VMS-áskrifandi"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"Gerast áskrifandi að VMS-skilaboðum"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Eftirlit með Flash-geymslu"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Fylgjast með notkun á Flash-geymslu"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Akstursstaða"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Hlusta á breytingar í akstursstöðu"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Upplýsingar um vél"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Fá aðgang að ítarlegum upplýsingum um vél bílsins"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Áfyllingarop"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Aðgangur að áfyllingaropum"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Auðkenni bíls"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Fá aðgang að auðkenni bílsins"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Bílhurðir"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Stjórna hurðum bílsins"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Gluggar bíls"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Stjórna gluggum bílsins"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Speglar bíls"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Stjórna speglum bíls"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Bílsæti"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Stjórna bílsætum"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Grunnupplýsingar um bíl"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Fá aðgang að grunnupplýsingum bílsins"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Ljós bíls að utanverðu"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Aðgangur að stöðu ljósa bíls að utanverðu"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Ljós bíls að utanverðu"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Stjórna ljósum bíls að utanverðu"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Ytra hitastig bíls"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Fá aðgang að útihitamæli bílsins"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Bíldekk"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Fá aðgang að upplýsingum um dekk bílsins"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Aflrás bíls"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Fá aðgang að upplýsingum um aflrás bílsins"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Orka bíls"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Aðgangur að orkustöðu bíls"</string>
+</resources>
diff --git a/service/res/values-it/config.xml b/service/res/values-it/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-it/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-it/strings.xml b/service/res/values-it/strings.xml
new file mode 100644
index 0000000..4f434c1
--- /dev/null
+++ b/service/res/values-it/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Informazioni sull\'auto"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Consente di accedere alle informazioni dell\'automobile."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Abitacolo"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Consente di accedere agli accessori dell\'automobile, inclusi specchietti, portiere, sedili e finestrini."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Videocamera dell\'automobile"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Consente di accedere alle videocamere dell\'automobile."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Livello di batteria dell\'auto"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Consente di accedere alle informazioni sulla carica dell\'automobile."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"Sistema HVAC dell\'automobile"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Consente di accedere al sistema HVAC dell\'automobile."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Consumo di carburante dell\'automobile"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Consente di accedere alle informazioni sul consumo di carburante dell\'automobile."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Velocità dell\'auto"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Consente di accedere alle informazioni sulla velocità dell\'automobile."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Stato dei componenti dinamici del veicolo"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Consente di accedere allo stato dei componenti dinamici dell\'automobile."</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Canale del produttore dell\'automobile"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Consente di accedere al canale del produttore per uno scambio di informazioni specifiche sull\'automobile."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Autoradio"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Consente di accedere alla radio dell\'automobile."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Proiezione nell\'automobile"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Volume dell\'audio dell\'automobile"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Impostazioni audio dell\'automobile"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Consente di proiettare l\'interfaccia del telefono sul display dell\'automobile."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Emulazione vehicle HAL"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Consente di emulare la vehicle HAL dell\'automobile per test interni."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Consente di regolare il volume dell\'audio dell\'automobile."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Consente di controllare le impostazioni audio dell\'automobile."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Blocco di app"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Consente di controllare il blocco delle app durante la guida."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Gestione della navigazione"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Consente di segnalare dati di navigazione al quadro strumenti."</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Visualizzazione diretta sul quadro strumenti"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Consente a un\'app di comunicare la visualizzazione delle attività sul quadro strumenti."</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Controllo del quadro strumenti"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Consente di avviare app nel quadro strumenti."</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Visualizzazione sul quadro strumenti"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Consente di ricevere dati del quadro strumenti."</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"Configurazione delle limitazioni dell\'esperienza utente"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"Consente di configurare le limitazioni dell\'esperienza utente."</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Servizio di input dell\'auto"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Consente di gestire gli eventi di input."</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"Comunicazione tramite bus CAN non riuscita"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"Il bus CAN non risponde. Scollega e ricollega l\'unità principale e riaccendi il motore."</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"Per motivi di sicurezza, questa attività non è disponibile durante la guida.\nPotrai continuare quando avrai parcheggiato."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"Seleziona <xliff:g id="EXIT_BUTTON">%s</xliff:g> per ricominciare con le funzionalità sicure dell\'app."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Indietro"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Info debug"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Dati diagnostici"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Consente di leggere i dati diagnostici dell\'automobile."</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Dati diagnostici"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Consente di cancellare i dati diagnostici dell\'automobile."</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"Publisher VMS"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"Consente di pubblicare messaggi VMS."</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"Abbonamento ai dati VMS"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"Consente di abbonarsi ai messaggi VMS."</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Monitoraggio della memoria flash"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Consente di monitorare l\'uso della memoria flash."</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Stato Alla guida"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Ascolto delle modifiche dello stato Alla guida."</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Informazioni dettagliate sul motore"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Consente di accedere a informazioni dettagliate sul motore dell\'automobile."</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Porte di alimentazione"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Consente di accedere alle porte di alimentazione."</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Identificazione dell\'auto"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Consente di accedere all\'identificazione dell\'automobile."</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Portiere dell\'automobile"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Consente di controllare le portiere dell\'automobile."</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Finestrini dell\'automobile"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Consente di controllare i finestrini dell\'automobile."</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Specchietti dell\'automobile"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Consente di regolare gli specchietti dell\'automobile."</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Sedili"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Consente di regolare i sedili dell\'automobile."</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Informazioni di base sull\'automobile"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Consente di accedere alle informazioni di base dell\'automobile."</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Luci esterne dell\'automobile"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Consente di accedere allo stato delle luci esterne dell\'automobile."</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Luci esterne dell\'automobile"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Consente di controllare le luci esterne dell\'automobile."</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Temperatura esterna indicata dall\'automobile"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Consente di accedere alla temperatura esterna indicata dall\'automobile."</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Pneumatici"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Consente di accedere alle informazioni sui pneumatici dell\'automobile."</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Gruppo motopropulsore dell\'automobile"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Consente di accedere alle informazioni sul gruppo motopropulsore dell\'automobile."</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Alimentazione"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Consente di accedere allo stato di alimentazione dell\'automobile."</string>
+</resources>
diff --git a/service/res/values-iw/config.xml b/service/res/values-iw/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-iw/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-iw/strings.xml b/service/res/values-iw/strings.xml
new file mode 100644
index 0000000..0b82dc4
--- /dev/null
+++ b/service/res/values-iw/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"פרטי הרכב"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"גישה לנתוני הרכב."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"תא הנהג ברכב"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"גישה לאביזרי הרכב, כולל דלתות, מראות, מושבים וחלונות."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"מצלמת הרכב"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"גישה למצלמות הרכב."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"אנרגיית הרכב"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"גישה למידע על אנרגיית הרכב"</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"מערכת החימום, האוורור ומיזוג האוויר (HVAC) של הרכב"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"גישה למערכת החימום, האוורור ומיזוג האוויר (HVAC) של הרכב."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"קילומטראז\' של הרכב"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"גישה אל נתוני הקילומטראז\' של הרכב."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"מהירות הרכב"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"גישה לנתוני המהירות של הרכב."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"מצב דינמי של הרכב"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"גישה למצב הדינמי של הרכב"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"ערוץ הספק של הרכב"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"גישה אל ערוץ הספק של הרכב לצורך חילופי מידע הספציפי לרכב."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"הרדיו של הרכב"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"גישה לרדיו של הרכב."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"מערכת ההקרנה של הרכב"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"עוצמת האודיו ברכב"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"הגדרות האודיו של הרכב"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"הקרנת ממשק הטלפון במסך הרכב."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"אמולציה של ממשק vehicle HAL"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"אמולציה של ממשק vehicle HAL של הרכב למטרות בדיקה פנימית."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"שליטה בעוצמת האודיו של הרכב."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"שליטה בהגדרות האודיו של הרכב."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"חסימת אפליקציות"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"שליטה בחסימת האפליקציות בזמן נהיגה."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"מנהל ניווט"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"דיווח על נתוני ניווט לאשכול הכלים"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"עיבוד ישיר לאשכול כלים"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"מתן הרשאה לאפליקציה להכריז על הצגת פעיליויות באשכול הכלים"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"שליטה באשכול הכלים"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"הפעלת אפליקציות באשכול הכלים"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"עיבוד של אשכול הכלים"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"קבלת נתונים של אשכול כלים"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"הגדרת הגבלות של חוויית משתמש (UX)"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"הגדרת הגבלות של חוויית משתמש (UX)"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"שירות הקלט של הרכב"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"ניהול אירועי קלט"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"פרוטוקול CAN bus נכשל"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"פרוטוקול CAN bus לא מגיב. יש לנתק ולחבר שוב את מערכת הסטריאו ולהתניע מחדש את הרכב"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"מטעמי בטיחות, פעילות זו אינה זמינה בזמן נהיגה.\nכדי להמשיך, צריך להמתין עד לחניית הרכב."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"כדי להפעיל מחדש את האפליקציה במצב בטוח, יש ללחוץ על <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
+ <string name="exit_button" msgid="5829638404777671253">"הקודם"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"נתוני אבחון"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"קריאת נתוני אבחון מהרכב"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"נתוני אבחון"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"מחיקת נתוני אבחון מהרכב"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"מפרסם נתוני VMS"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"פרסום הודעות VMS"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"מנוי לנתוני VMS"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"הרשמה להודעות VMS"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"מעקב אחר אחסון הבזק"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"מעקב אחר השטח האחסון הפנוי בכונן ההבזק"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"מצב נהיגה"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"האזנה לשינויים במצב הנהיגה"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"נתונים מפורטים של המנוע"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"גישה למידע המפורט של מנוע הרכב"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"שקעי טעינה"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"גישה לשקעי הטעינה"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"פרטי זיהוי של הרכב"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"גישה לפרטי הזיהוי של הרכב"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"דלתות הרכב"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"שליטה בדלתות הרכב"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"חלונות הרכב"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"שליטה בחלונות הרכב"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"מראות הרכב"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"שליטה במראות הרכב"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"מושבי הרכב"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"שליטה במושבי הרכב"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"נתונים בסיסיים של הרכב"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"גישה לנתונים הבסיסיים של הרכב"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"הפנסים החיצוניים של הרכב"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"גישה למצב הפנסים החיצוניים של הרכב"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"הפנסים החיצוניים של הרכב"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"שליטה בפנסים החיצוניים של הרכב"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"הטמפרטורה החיצונית של הרכב"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"גישה לטמפרטורה החיצונית של הרכב"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"צמיגי הרכב"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"גישה לנתוני הצמיגים של הרכב"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"מערכת ההינע של הרכב"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"גישה למידע על מערכת ההינע של הרכב"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"מצב הטעינה של הרכב"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"גישה למצב הטעינה של הרכב"</string>
+</resources>
diff --git a/service/res/values-ja/config.xml b/service/res/values-ja/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-ja/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-ja/strings.xml b/service/res/values-ja/strings.xml
new file mode 100644
index 0000000..85e4f47
--- /dev/null
+++ b/service/res/values-ja/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"自動車の情報"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"車の情報にアクセスします。"</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"車のキャビン"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"車のアクセサリ(ドア、ミラー、シート、ウィンドウなど)にアクセスします。"</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"車載カメラ"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"車載カメラにアクセスします。"</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"車のエネルギー"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"車のエネルギー情報にアクセスします。"</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"車のエアコン ユニット"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"車のエアコン ユニットにアクセスします。"</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"自動車の走行距離"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"車の走行距離情報にアクセスします。"</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"自動車の速度"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"車の速度にアクセスします。"</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"車両の動態"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"車の動態情報にアクセスします"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"自動車のメーカー チャンネル"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"車のメーカー チャンネルにアクセスして仕様情報をやり取りします。"</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"カーラジオ"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"カーラジオにアクセスします。"</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"車での投影"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"カーオーディオの音量"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"カーオーディオの設定"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"車のディスプレイに電話インターフェースを映します。"</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"車両ハードウェア抽象化レイヤのエミュレート"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"内部テスト用に車の車両ハードウェア抽象化レイヤをエミュレートします。"</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"カーオーディオの音量を調節します。"</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"カーオーディオの設定を調節します。"</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"アプリのブロック"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"運転中のアプリのブロックを制御します。"</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"ナビゲーション マネージャー"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"ナビゲーション データをインストルメント クラスタにレポートします"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"インストルメント クラスタに直接レンダリング"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"アプリがインストルメント クラスタに表示されるアクティビティを指定できるようにします"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"インストルメント クラスタ制御"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"インストルメント クラスタでアプリを起動します"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"インストルメント クラスタのレンダリング"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"インストルメント クラスタ データを受信します"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"UX 制限の設定"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"UX 制限を設定します"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"車の入力サービス"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"入力イベントを処理します"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"CAN バスでエラーが発生しました"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN バスが応答しません。ヘッドユニット ボックスのプラグを抜いて接続し直し、車を再始動してください"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"安全上の理由により、運転中はこのアクティビティをご利用いただけません。\n続行するには駐車してください。"</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"アプリをセーフモードで再起動するには、<xliff:g id="EXIT_BUTTON">%s</xliff:g> を選択します。"</string>
+ <string name="exit_button" msgid="5829638404777671253">"戻る"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"デバッグ情報"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"診断データ"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"車から診断データを読み取ります"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"診断データ"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"車から診断データを消去します"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"VMS パブリッシャー"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"VMS メッセージを送信します"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"VMS サブスクライバー"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"VMS メッセージに登録します"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"フラッシュ ストレージのモニタリング"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"フラッシュ ストレージの使用状況をモニタリングします"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"車の状態"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"車の状態が変わると通知されます"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"エンジンの詳細情報"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"車の詳細なエンジン情報にアクセスします"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"エネルギー ポート"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"エネルギー ポートにアクセスします"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"車の ID"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"車の ID にアクセスします"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"車のドア"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"車のドアを制御します"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"カーウィンドウ"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"カーウィンドウを調節します"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"カーミラー"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"カーミラーを調節します"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"カーシート"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"カーシートを調節します"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"車の基本情報"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"車の基本情報にアクセスします"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"車のエクステリア ライト"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"車のエクステリア ライトの状態にアクセスします"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"車のエクステリア ライト"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"車のエクステリア ライトを調節します"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"車の外気温度"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"車の外気温度を確認します"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"車のタイヤ"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"車のタイヤ情報にアクセスします"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"車のパワートレイン"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"車のパワートレイン情報にアクセスします"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"車の電力"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"車の電力状態にアクセスします"</string>
+</resources>
diff --git a/service/res/values-ka/config.xml b/service/res/values-ka/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-ka/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-ka/strings.xml b/service/res/values-ka/strings.xml
new file mode 100644
index 0000000..74c6bfd
--- /dev/null
+++ b/service/res/values-ka/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"მანქანის ინფორმაცია"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"თქვენი მანქანის ინფორმაციაზე წვდომა."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"მანქანის სალონი"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"თქვენი მანქანის აქსესუარებზე (მათ შორის, კარებზე, სარკეებზე, სავარძლებსა და ფანჯრებზე) წვდომა."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"მანქანის კამერა"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"თქვენი მანქანის კამერებზე წვდომა."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"მანქანის ენერგორესურსები"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"თქვენი მანქანის ენერგორესურსების ინფორმაციაზე წვდომა."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"მანქანის HVAC-სისტემა"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"თქვენი მანქანის HVAC (გათბობა, ვენტილაცია და ჰაერის კონდიცირება) სისტემაზე წვდომა."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"მანქანის გარბენი"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"თქვენი მანქანის გარბენის შესახებ ინფორმაციაზე წვდომა."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"მანქანის სიჩქარე"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"თქვენი მანქანის სიჩქარეზე წვდომა."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"ავტომობილის დინამიკური მდგომარეობა"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"თქვენი მანქანის დინამიკურ მდგომარეობაზე წვდომა"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"მანქანის მწარმოებლის არხი"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"თქვენი მანქანის მწარმოებლის არხზე წვდომა მანქანასთან დაკავშირებული ინფორმაციის მიმოცვლისთვის."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"მანქანის რადიო"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"თქვენი მანქანის რადიოზე წვდომა."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"მანქანის ეკრანზე პროეცირება"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"მანქანაში აუდიოს ხმის სიძლიერე"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"მანქანის აუდიოს პარამეტრები"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"ტელეფონის ინტერფეისის პროეცირება მანქანის ეკრანზე."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"ავტომობილის HAL-ინტერფეისის ემულაცია"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"თქვენი მანქანის HAL-ინტერფეისის ემულაცია შიდა ტესტირების მიზნით."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"თქვენი მანქანის აუდიოს ხმის სიძლიერის გაკონტროლება."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"თქვენი მანქანის აუდიოს პარამეტრების გაკონტროლება."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"აპლიკაციების დაბლოკვა"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"მანქანის მართვისას აპლიკაციების დაბლოკვის გაკონტროლება."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"ნავიგაციის მენეჯერი"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"ხელსაწყოთა პანელისთვის ნავიგაციის მონაცემების შეტყობინება"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"პირდაპირი რენდერი ხელსაწყოთა პანელზე"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"აპლიკაციისთვის იმ აქტივობის განსაზღვრის დაშვება, რომელიც უნდა გამოჩნდეს ხელსაწყოთა პანელზე"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"ხელსაწყოთა პანელის გაკონტროლება"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"აპების გაშვება ხელსაწყოთა პანელზე"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"რენდერი ხელსაწყოთა პანელზე"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"ხელსაწყოთა პანელის მონაცემების მიღება"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"UX შეზღუდვების კონფიგურაცია"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"UX შეზღუდვების კონფიგურაცია"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"მანქანის შეყვანის სერვისი"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"შეტანის მოვლენების დამუშავება"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"წარმოიშვა CAN-სალტის შეცდომა"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN-სალტე არ რეაგირებს. გამოაერთეთ და ხელახლა მიაერთეთ საინფორმაციო-გასართობი მოწყობილობა, შემდეგ კი ხელახლა დაქოქეთ მანქანა"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"ეს აქტივობა მიუწვდომელია მანქანის მართვისას, უსაფრთხოების მოსაზრებებიდან გამომდინარე.\nგთხოვთ, ჯერ გააჩეროთ მანქანა."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"აპის უსაფრთხო რეჟიმში გასაშვებად აირჩიეთ „<xliff:g id="EXIT_BUTTON">%s</xliff:g>“."</string>
+ <string name="exit_button" msgid="5829638404777671253">"უკან"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"გამართვის ინფორმაცია"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"დიაგნოსტიკური მონაცემები"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"დიაგნოსტიკური მონაცემების წაკითხვა მანქანიდან"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"დიაგნოსტიკური მონაცემები"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"დიაგნოსტიკური მონაცემების გასუფთავება მანქანიდან"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"VMS-შეტყობინებების გამომქვეყნებელი"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"VMS-შეტყობინებების გამოქვეყნება"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"VMS-შეტყობინებების გამომწერი"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"VMS-შეტყობინებების გამოწერა"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"ფლეშ-მეხსიერების მონიტორინგი"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"ფლეშ-მეხსიერების გამოყენების მონიტორინგი"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"მანქანის მართვის მდგომარეობა"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"მანქანის მართვის მდგომარეობის ცვლილებებისთვის თვალის მიდევნება"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"ძრავას დეტალური ინფორმაცია"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"თქვენი მანქანის ძრავას დეტალურ ინფორმაციაზე წვდომა"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"ენერგოპორტები"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"ენერგოპორტებზე წვდომა"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"მანქანის საიდენტიფიკაციო მონაცემები"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"მანქანის საიდენტიფიკაციო მონაცემებზე წვდომა"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"მანქანის კარები"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"მანქანის კარების გაკონტროლება"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"მანქანის ფანჯრები"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"მანქანის ფანჯრების გაკონტროლება"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"მანქანის სარკეები"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"მანქანის სარკეების გაკონტროლება"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"მანქანის სავარძლები"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"მანქანის სავარძლების გაკონტროლება"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"მანქანის ძირითადი ინფორმაცია"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"მანქანის ძირითად ინფორმაციაზე წვდომა"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"მანქანის გარე განათება"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"მანქანის გარე განათების მდგომარეობაზე წვდომა"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"მანქანის გარე განათება"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"მანქანის გარე განათების გაკონტროლება"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"მანქანის გარე ტემპერატურა"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"მანქანის გარე ტემპერატურაზე წვდომა"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"მანქანის საბურავები"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"მანქანის საბურავების შესახებ ინფორმაციაზე წვდომა"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"მანქანის ძალური აგრეგატი"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"მანქანის ძალური აგრეგატის ინფორმაციაზე წვდომა"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"მანქანის ელკვება"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"მანქანის ელკვების მდგომარეობაზე წვდომა"</string>
+</resources>
diff --git a/service/res/values-kk/config.xml b/service/res/values-kk/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-kk/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-kk/strings.xml b/service/res/values-kk/strings.xml
new file mode 100644
index 0000000..f3e782a
--- /dev/null
+++ b/service/res/values-kk/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Көлік туралы ақпарат"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Көлік туралы ақпаратты көруге болады."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Көлік салоны"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Көліктің есіктері, айналары, орындықтары және терезелері сияқты керек-жарақтарын пайдалануға болады."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Көлік камерасы"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Көліктің камераларын пайдалануға болады."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Көліктің қуаты"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Көліктің қуаты туралы ақпаратты көруге болады."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"Көліктің климат басқару жүйесі"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Көліктің кондиционерін пайдалануға болады."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Көлік километражы"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Көліктің километражы туралы ақпаратты көруге болады."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Көлік жылдамдығы"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Көлік жылдамдығын көруге болады."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Көліктің жүріп бара жатқандағы күйі"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Көліктің жүріп бара жатқандағы күйін көруге болады"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Көлік жеткізушісінің арнасы"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Көлік туралы ақпарат алмасу үшін көлік жеткізушісінің арнасына кіруіңізге болады."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Көлік радиосы"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Көліктің радиосын пайдалануға болады."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Көлік проекциясы"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Көліктегі аудионың дыбыс деңгейі"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Көліктің аудио параметрлері"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Көлік дисплейінде телефон интерфейсін көруге болады."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Көліктің HAL интерфейсін қолдану"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Ішкі сынақтар үшін көліктің HAL интерфейсін қолдануға болады."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Көліктегі аудионың дыбыс деңгейін басқаруға болады."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Көліктің аудио параметрлерін басқару"</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Қолданбаны бөгеу"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Жүргізу кезінде қолданбаны блоктау функциясын басқаруға болады."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Навигация басқарушысы"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Навигациялық деректерді құралдар кластеріне хабарлауға болады"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Құралдар кластеріне тікелей рендеринг"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Қолданбаға құралдар кластерінде көрсетілетін әрекеттерді мәлімдеуге рұқсат ету"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Құралдар кластерін басқару"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Құралдар кластеріндегі қолданбаларды іске қосу"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Құралдар кластерін көрсету"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Құралдар кластері туралы дерек алу"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"UX шектеулеріне қатысты конфигурация"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"UX шектеулерін конфигурациялау"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Көліктің дерек енгізу қызметі"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Деректерді енгізу оқиғаларын басқаруға болады"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"CAN шинасы істен шықты"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN шинасы жауап бермейді. Негізгі модульді ажыратып, қайта жалғаңыз және көлікті қайта оталдырыңыз"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"Көлік жүргізгенде, қауіпсіздік мақсатында бұл әрекетті орындау мүмкін емес.\nЖалғастыру үшін көлікті тұраққа қойыңыз."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"Қолданбаны қауіпсіз күйде қайта іске қосу үшін <xliff:g id="EXIT_BUTTON">%s</xliff:g> түймесін басыңыз."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Артқа"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Түзету"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Диагностикалық дерек"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Көліктен диагностикалық деректі оқуға болады"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Диагностикалық дерек"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Көліктен диагностикалық деректерді өшіріп тастауға болады"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"VMS жариялаушы"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"VMS хабарларын жариялау"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"VMS жазылушысы"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"VMS хабарларына жазылуға болады"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Флэш жадын бақылау"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Флэш жадының қолданысын бақылау"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Көлік жүргізу күйі"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Жүргізу кезіндегі өзгерістерді тыңдауға болады"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Қозғалтқыш туралы толық ақпаратты көруге болады"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Көлігіңіздің қозғалтқышы туралы толық ақпарат көруге болады"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Жанармай құю немесе зарядтау порттары"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Жанармай құю немесе зарядтау порттарын көруге болады"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Көліктің идентификациялық нөмірі"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Көліктің идентификациялық нөмірін көруге болады"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Көлік есіктері"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Көліктің есіктерін басқаруға болады"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Көлік терезелері"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Көліктің терезелерін басқаруға болады"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Көлік айналары"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Көліктің айналарын басқаруға болады"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Көлік орындықтары"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Көліктің орындықтарын басқаруға болады"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Көлік туралы негізгі ақпарат"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Көлік туралы негізгі ақпаратты көруге болады"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Көліктің сыртқы шамдарын басқаруға болады"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Көліктің сыртқы шамдарының күйін көруге болады"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Көліктің сыртқы шамдарын басқаруға болады"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Көліктің сыртқы шамдарын басқаруға болады"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Көлік сыртындағы температура"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Көлік сыртындағы температура өзгерісін көруге болады"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Көлік шиналары"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Көліктің шиналары туралы ақпаратты көруге болады"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Көлік трансмиссиясы"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Көлік трансмиссиясы туралы ақпаратты көруге болады"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Көліктің қуаты"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Көліктің қуатын көруге болады"</string>
+</resources>
diff --git a/service/res/values-km/config.xml b/service/res/values-km/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-km/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-km/strings.xml b/service/res/values-km/strings.xml
new file mode 100644
index 0000000..b1b1c29
--- /dev/null
+++ b/service/res/values-km/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"ព័ត៌មានរថយន្ត"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"ចូលប្រើព័ត៌មានរបស់រថយន្តអ្នក។"</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"កាប៊ីនរថយន្ត"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"ចូលប្រើគ្រឿងបរិក្ខាររបស់រថយន្តអ្នក រួមមានទ្វារ កញ្ចក់ កៅអី និងបង្អួច។"</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"កាមេរ៉ារថយន្ត"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"ចូលប្រើកាមេរ៉ារបស់រថយន្តអ្នក។"</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"ថាមពលរបស់រថយន្ត"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"ចូលប្រើព័ត៌មានថាមពលរបស់រថយន្តអ្នក។"</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"ប្រព័ន្ធកម្តៅ ខ្យល់ និងម៉ាស៊ីនត្រជាក់របស់រថយន្ត"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"ចូលប្រើប្រព័ន្ធកម្តៅ ខ្យល់ និងម៉ាស៊ីនត្រជាក់របស់រថយន្តអ្នក។"</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"រយៈចម្ងាយរត់របស់រថយន្ត"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"ចូលប្រើព័ត៌មានអំពីរយៈចម្ងាយរត់របស់រថយន្តអ្នក។"</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"ល្បឿនរថយន្ត"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"ចូលប្រើល្បឿនរបស់រថយន្តអ្នក។"</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"ស្ថានភាពឌីណាមិចរបស់យានជំនិះ"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"ចូលប្រើស្ថានភាពឌីណាមិចរបស់រថយន្តអ្នក"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"បណ្តាញអ្នកលក់រថយន្ត"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"ចូលប្រើបណ្ដាញអ្នកលក់របស់រថយន្តអ្នក ដើម្បីផ្លាស់ប្ដូរព័ត៌មានជាក់លាក់ទាក់ទងនឹងរថយន្ត។"</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"វិទ្យុរថយន្ត"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"ចូលប្រើវិទ្យុរបស់រថយន្តអ្នក។"</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"ការបញ្ចាំងរបស់រថយន្ត"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"កម្រិតសំឡេងរបស់រថយន្ត"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"ការកំណត់សំឡេងរបស់រថយន្ត"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"បញ្ចាំងផ្ទៃទូរសព្ទនៅលើឧបករណ៍បញ្ចាំងរបស់រថយន្ត។"</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"ត្រាប់តាម HAL នៃយានជំនិះ"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"ត្រាប់តាម HAL នៃយានជំនិះរបស់រថយន្តអ្នក ក្នុងបំណងធ្វើតេស្តផ្នែកខាងក្នុង។"</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"គ្រប់គ្រងកម្រិតសំឡេងរបស់រថយន្តអ្នក។"</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"គ្រប់គ្រងការកំណត់សំឡេងរបស់រថយន្តអ្នក។"</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"ការទប់ស្កាត់កម្មវិធី"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"គ្រប់គ្រងការទប់ស្កាត់កម្មវិធី ខណៈពេលកំពុងបើកបរ។"</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"អ្នកគ្រប់គ្រងការរុករក"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"រាយការណ៍ទិន្នន័យរុករកទៅបណ្ដុំឧបករណ៍"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"ការបំប្លែងផ្ទាល់ទៅបណ្ដុំឧបករណ៍"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"អនុញ្ញាតឱ្យកម្មវិធីប្រកាសសកម្មភាព ដែលត្រូវបង្ហាញនៅក្នុងបណ្ដុំឧបករណ៍"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"ការគ្រប់គ្រងបណ្ដុំឧបករណ៍"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"ចាប់ផ្ដើមកម្មវិធីនៅក្នុងបណ្ដុំឧបករណ៍"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"ការបំប្លែងបណ្ដុំឧបករណ៍"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"ទទួលបានទិន្នន័យបណ្ដុំឧបករណ៍"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"ការកំណត់រចនាសម្ព័ន្ធការរឹតបន្តឹង UX"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"កំណត់រចនាសម្ព័ន្ធការរឹតបន្តឹង UX"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"សេវាកម្មបញ្ចូលរបស់រថយន្ត"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"គ្រប់គ្រងព្រឹត្តិការណ៍បញ្ចូល"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"មិនអាចដំណើរការ CAN bus បានទេ"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN bus មិនឆ្លើយតបទេ។ សូមផ្ដាច់ រួចភ្ជាប់ប្រអប់ឧបករណ៍ចាក់តន្ត្រីម្តងទៀត បន្ទាប់មកបញ្ឆេះរថយន្តឡើងវិញ"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"ដើម្បីសុវត្ថិភាពរបស់អ្នក សកម្មភាពនេះមិនអាចប្រើបានទេ ពេលកំពុងបើកបរ។\nដើម្បីបន្ត សូមរង់ចាំរហូតទាល់តែអ្នកចតរថយន្តរួច។"</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"ដើម្បីចាប់ផ្តើមឡើងវិញដោយប្រើមុខងារកម្មវិធីដែលមានសុវត្ថិភាព សូមជ្រើសរើស <xliff:g id="EXIT_BUTTON">%s</xliff:g> ។"</string>
+ <string name="exit_button" msgid="5829638404777671253">"ថយក្រោយ"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"ព័ត៌មានជួសជុល"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"ទិន្នន័យវិភាគ"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"អានទិន្នន័យវិភាគពីរថយន្ត"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"ទិន្នន័យវិភាគ"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"សម្អាតទិន្នន័យវិភាគពីរថយន្ត"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"អ្នកបោះផ្សាយ VMS"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"បោះផ្សាយសារ vms"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"អ្នកជាវ VMS"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"ជាវសារ vms"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"ការតាមដានឧបករណ៍ផ្ទុកទិន្នន័យ"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"តាមដានការប្រើប្រាស់ឧបករណ៍ផ្ទុកទិន្នន័យ"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"ស្ថានភាពបើកបរ"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"ស្តាប់ការផ្លាស់ប្តូរស្ថានភាពបើកបរ"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"ព័ត៌មានលម្អិតរបស់ម៉ាស៊ីន"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"ចូលប្រើព័ត៌មានលម្អិតនៃម៉ាស៊ីនរបស់រថយន្តអ្នក"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"រន្ធថាមពល"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"ចូលប្រើរន្ធថាមពល"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"ការកំណត់អត្តសញ្ញាណរបស់រថយន្ត"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"ចូលប្រើការកំណត់អត្តសញ្ញាណរបស់រថយន្ត"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"ទ្វាររបស់រថយន្ត"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"គ្រប់គ្រងទ្វាររបស់រថយន្ត"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"បង្អួចរថយន្ត"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"គ្រប់គ្រងបង្អួចរបស់រថយន្ត"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"កញ្ចក់របស់រថយន្ត"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"គ្រប់គ្រងកញ្ចក់របស់រថយន្ត"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"កៅអីរបស់រថយន្ត"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"គ្រប់គ្រងកៅអីរបស់រថយន្ត"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"ព័ត៌មានមូលដ្ឋានរបស់រថយន្ត"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"ចូលប្រើព័ត៌មានមូលដ្ឋានរបស់រថយន្ត"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"អំពូលភ្លើងផ្នែកខាងក្រៅរថយន្ត"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"ចូលប្រើស្ថានភាពអំពូលភ្លើងផ្នែកខាងក្រៅរបស់រថយន្ត"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"អំពូលភ្លើងផ្នែកខាងក្រៅរថយន្ត"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"គ្រប់គ្រងអំពូលភ្លើងផ្នែកខាងក្រៅរបស់រថយន្ត"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"សីតុណ្ហភាពផ្នែកខាងក្រៅរបស់រថយន្ត"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"ចូលប្រើសីតុណ្ហភាពផ្នែកខាងក្រៅរបស់រថយន្ត"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"សំបកកង់របស់រថយន្ត"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"ចូលប្រើព័ត៌មានអំពីសំបកកង់របស់រថយន្ត"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"ប្រព័ន្ធម៉ាស៊ីនរបស់រថយន្ត"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"ចូលប្រើព័ត៌មាននៃប្រព័ន្ធម៉ាស៊ីនរបស់រថយន្ត"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"ថាមពលរបស់រថយន្ត"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"ចូលប្រើស្ថានភាពថាមពលរបស់រថយន្ត"</string>
+</resources>
diff --git a/service/res/values-kn/config.xml b/service/res/values-kn/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-kn/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-kn/strings.xml b/service/res/values-kn/strings.xml
new file mode 100644
index 0000000..a040550
--- /dev/null
+++ b/service/res/values-kn/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"ಕಾರಿನ ಮಾಹಿತಿ"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"ನಿಮ್ಮ ಕಾರಿನ ಮಾಹಿತಿಯನ್ನು ಪಡೆಯಿರಿ"</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"ಕಾರಿನ ಕ್ಯಾಬಿನ್"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"ಬಾಗಿಲುಗಳು, ಕನ್ನಡಿಗಳು, ಆಸನಗಳು ಮತ್ತು ಕಿಟಿಕಿಗಳು ಸಹಿತ ನಿಮ್ಮ ಕಾರಿನ ಭಾಗಗಳನ್ನು ನಿಯಂತ್ರಿಸಿ."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"ಕಾರಿನ ಕ್ಯಾಮರ"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"ನಿಮ್ಮ ಕಾರಿನ ಕ್ಯಾಮರವನ್ನು(ಗಳನ್ನು) ಪ್ರವೇಶಿಸಿ."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"ಕಾರಿನ ಶಕ್ತಿ"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"ನಿಮ್ಮ ಕಾರಿನ ಶಕ್ತಿ ಮಾಹಿತಿಯನ್ನು ಪಡೆಯಿರಿ."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"ಕಾರಿನ ಎಚ್ವಿಎಸಿ"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"ಕಾರಿನ ಎಚ್ವಿಎಸಿಯ ಮಾಹಿತಿನ್ನು ಪಡೆಯಿರಿ."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"ಕಾರಿನ ಮೈಲೇಜ್"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"ನಿಮ್ಮ ಕಾರ್ನ ಮೈಲೇಜ್ ಮಾಹಿತಿಯನ್ನು ಪಡೆಯಿರಿ."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"ಕಾರಿನ ವೇಗ"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"ಕಾರಿನ ವೇಗದ ಮಾಹಿತಿಯನ್ನು ಪಡೆಯಿರಿ."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"ವಾಹನದ ಚಲನಶೀಲ ಸ್ಥಿತಿ"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"ಕಾರಿನ ಚಲನಶೀಲ ಸ್ಥಿತಿಯ ಮಾಹಿತಿಯನ್ನು ಪಡೆಯಿರಿ"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"ಕಾರಿನ ಮಾರಾಟಗಾರ ಚಾನಲ್"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"ನಿಮ್ಮ ಕಾರಿನ ನಿರ್ದಿಷ್ಟ ಮಾಹಿತಿಯನ್ನು ವಿನಿಮಯ ಮಾಡಿಕೊಳ್ಳಲು, ನಿಮ್ಮ ಕಾರಿನ ಮಾರಾಟಗಾರ ಚಾನಲ್ ಅನ್ನು ಪ್ರವೇಶಿಸಿ"</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"ಕಾರಿನ ರೇಡಿಯೊ"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"ಕಾರಿನ ರೇಡಿಯೋವನ್ನು ನಿಯಂತ್ರಿಸಿ."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"ಕಾರಿನ ಪ್ರೊಜೆಕ್ಷನ್"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"ಕಾರಿನ ಆಡಿಯೋ ವಾಲ್ಯೂಮ್"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"ಕಾರಿನ ಆಡಿಯೋ ಆಯ್ಕೆಗಳು"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"ಫೋನ್ ಇಂಟರ್ಫೇಸ್ ಅನ್ನು ಕಾರಿನ ಪರದೆಯಲ್ಲಿ ಪ್ರದರ್ಶಿಸಿ."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"ವಾಹನ ಎಚ್ಎಎಲ್ ಅನ್ನು ಅನುಕರಿಸು"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"ನಿಮ್ಮ ಕಾರಿನ ವಾಹನ ಎಚ್ಎಎಲ್ ಅನ್ನು ಆಂತರಿಕ ಪರೀಕ್ಷೆಗಾಗಿ ಅನುಕರಿಸಿ"</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"ಕಾರಿನ ಆಡಿಯೋ ವಾಲ್ಯೂಮ್ ಅನ್ನು ನಿಯಂತ್ರಿಸು."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"ನಿಮ್ಮ ಕಾರಿನ ಆಡಿಯೋ ಆಯ್ಕೆಗಳನ್ನು ನಿಯಂತ್ರಿಸಿ."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"ಅಪ್ಲಿಕೇಶನ್ ನಿರ್ಬಂಧ"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"ಅಪ್ಲಿಕೇಶನ್ ನಿರ್ಬಂಧನೆಯನ್ನು ವಾಹನ ಚಲಾಯಿಸುತ್ತಿರುವಾಗ ನಿಯಂತ್ರಿಸಿ."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"ನ್ಯಾವಿಗೇಷನ್ ಮ್ಯಾನೇಜರ್"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"ನ್ಯಾವಿಗೇಶನ್ ಮಾಹಿತಿಯನ್ನು ಸಲಕರಣೆ ಸಂಚಯಕ್ಕೆ ವರದಿ ಮಾಡಿ"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"ಸಲಕರಣೆ ಸಂಚಯಕ್ಕೆ ನೇರ ವರ್ಗಾವಣೆ"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"ಸಲಕರಣೆ ಸಂಚಯದಲ್ಲಿ ಚಟುವಟಿಕೆಗಳ ಘೋಷಣೆಯನ್ನು ಪ್ರದರ್ಶಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುವು ಮಾಡಿ"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"ಸಲಕರಣೆ ಸಂಚಯ ನಿಯಂತ್ರಣ"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"ಸಲಕರಣೆ ಸಂಚಯದಲ್ಲಿ ಆಪ್ಗಳನ್ನು ಪ್ರಾರಂಭಿಸಿ"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"ಸಲಕರಣೆ ಸಂಚಯ ತೋರಿಸು"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"ಸಲಕರಣೆ ಸಂಚಯ ಮಾಹಿತಿಯನ್ನು ಸ್ವೀಕರಿಸು"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"UX ನಿರ್ಬಂಧಗಳ ಸಂರಚನೆ"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"ಯುಎಕ್ಸ್ ನಿರ್ಬಂಧಗಳನ್ನು ಸಂರಚಿಸು"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"ಕಾರಿನ ಇನ್ಪುಟ್ ಸೇವೆ"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"ಊಡಿಕೆ ಘಟನೆಗಳನ್ನು ನಿಯಂತ್ರಿಸಿ"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"ಸಿಎಎನ್ ಬಸ್ ಕೆಟ್ಟಿದೆ"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN ಬಸ್ ಸ್ಪಂದಿಸುತ್ತಿಲ್ಲ. ಹೆಡ್ ಯುನಿಟ್ ಪೆಟ್ಟಿಗೆಯನ್ನು ಅನ್ಪ್ಲಗ್ ಮಾಡಿ ಮತ್ತೆ ಪ್ಲಗ್ ಮಾಡಿ ಕಾರನ್ನು ಪುನರಾರಂಭಿಸಿ"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"ನಿಮ್ಮ ಸುರಕ್ಷೆಗಾಗಿ, ಈ ಚಟುವಟಿಕೆಯು ವಾಹನ ಚಲಾಯಿಸುತ್ತಿರುವಾಗ ಲಭ್ಯವಿಲ್ಲ. ಮುಂದುವರೆಯಲು \n ಮಾಡಿ, ನೀವು ಪಾರ್ಕ್ ಮಾಡುವ ತನಕ ಕಾಯಿರಿ."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"ಆಪ್ನ ಸುರಕ್ಷೆ ಗುಣಲಕ್ಷಣಗಳನ್ನು ಒಳಗೊಂಡು ಮತ್ತೆ ಪ್ರಾರಂಭಿಸಲು, <xliff:g id="EXIT_BUTTON">%s</xliff:g> ಆಯ್ಕೆ ಮಾಡಿ."</string>
+ <string name="exit_button" msgid="5829638404777671253">"ಹಿಂದಕ್ಕೆ"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"ಡೀಬಗ್ ಮಾಹಿ"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"ಪರಿಶೀಲನೆಯ ಮಾಹಿತಿ"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"ಕಾರಿನಿಂದ ಅದರ ಪರಿಶೀಲನೆಯ ಮಾಹಿತಿಯನ್ನು ಪಡೆಯಿರಿ"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"ಪರಿಶೀಲನೆಯ ಮಾಹಿತಿ"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"ಕಾರಿನಿಂದ ಪರಿಶೀಲನಾ ಮಾಹಿತಿಯನ್ನು ಅಳಿಸಿ"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"ವಿಎಂಎಸ್ ಪ್ರಕಾಶಕ"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"ವಿಎಂಎಸ್ ಸಂದೇಶಗಳನ್ನು ಪ್ರಕಟಿಸು"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"VMS ಸಬ್ಸ್ಕ್ರೈಬರ್"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"vms ಸಂದೇಶಗಳಿಗೆ ಸಬ್ಸ್ಕ್ರೈಬರ್ ಆಗಿ"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"ಫ್ಲಾಶ್ ಸಂಗ್ರಹದ ಉಸ್ತುವಾರಿ"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"ಫ್ಲಾಶ್ ಸಂಗ್ರಹ ಬಳಕೆಯ ಉಸ್ತುವಾರಿ"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"ವಾಹನ ಚಾಲನಾ ಸ್ಥಿತಿ"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"ಚಾಲನೆಯ ಸ್ಥಿತಿಯ ಬದಲಾವಣೆಯನ್ನು ಆಲಿಸಿ"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"ಇಂಜಿನ್ ವಿವರ"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"ಕಾರಿನ ಇಂಜಿನಿನ ವಿವರವಾದ ಮಾಹಿತಿಯನ್ನು ಪಡೆಯು"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"ಶಕ್ತಿ ಕಿಂಡಿಗಳು"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"ಶಕ್ತಿ ಕಿಂಡಿಗಳನ್ನು ಪ್ರವೇಶಿಸಿ"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"ಕಾರು ಪರಿಚಯ"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"ಕಾರಿನ ಗುರುತನ್ನು ಪಡೆಯಿರಿ"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"ಕಾರಿನ ಬಾಗಿಲುಗಳು"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"ಕಾರಿನ ಬಾಗಿಲುಗಳನ್ನು ನಿಯಂತ್ರಿಸಿ"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"ಕಾರಿನ ಕಿಟಿಕಿಗಳು"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"ಕಾರಿನ ಕಿಟಿಕಿಗಳನ್ನು ನಿಯಂತ್ರಿಸಿ"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"ಕಾರಿನ ಕನ್ನಡಿಗಳು"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"ಕಾರಿನ ಕನ್ನಡಿಗಳನ್ನು ನಿಯಂತ್ರಿಸಿ"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"ಕಾರಿನ ಆಸನಗಳು"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"ಕಾರಿನ ಆಸನಗಳನ್ನು ನಿಯಂತ್ರಿಸಿ"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"ಕಾರಿನ ಮೂಲಭೂತ ಮಾಹಿತಿ"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"ಕಾರಿನ ಮೂಲಭೂತ ಮಾಹಿತಿ ಪಡೆಯಿರಿ"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"ಕಾರಿನ ಬಾಹ್ಯ ದೀಪಗಳು"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"ಕಾರಿನ ಬಾಹ್ಯ ದೀಪಗಳ ಸ್ಥಿತಿಯ ಮಾಹಿತಿಯನ್ನು ಪಡೆಯಿರಿ"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"ಕಾರಿನ ಬಾಹ್ಯ ದೀಪಗಳು"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"ಕಾರಿನ ಬಾಹ್ಯ ದೀಪಗಳನ್ನು ನಿಯಂತ್ರಿಸಿ"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"ಕಾರಿನ ಬಾಹ್ಯ ತಾಪಮಾನ"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"ಕಾರಿನ ಬಾಹ್ಯ ತಾಪಮಾನವನ್ನು ತಿಳಿಯಿರಿ"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"ಕಾರಿನ ಟಯರ್ಗಳು"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"ಕಾರಿನ ಟಯರ್ ಮಾಹಿತಿಯನ್ನು ಪಡೆಯಿರಿ"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"ಕಾರ್ ಪವರ್ಟ್ರೈನ್"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"ಕಾರಿನ ಪವರ್ಟ್ರೈನ್ ಮಾಹಿತಿಯನ್ನು ಪಡೆಯು"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"ಕಾರಿನ ಶಕ್ತಿ"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"ಕಾರಿನ ಶಕ್ತಿಯ ಸ್ಥಿತಿಯ ಮಾಹಿತಿಯನ್ನು ಪಡೆಯಿರಿ"</string>
+</resources>
diff --git a/service/res/values-ko/config.xml b/service/res/values-ko/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-ko/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-ko/strings.xml b/service/res/values-ko/strings.xml
new file mode 100644
index 0000000..cc9d6c0
--- /dev/null
+++ b/service/res/values-ko/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"차량 정보"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"차량 정보에 액세스"</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"차량 실내"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"차량의 도어, 미러, 시트, 윈도와 같은 부속품에 액세스"</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"차량 카메라"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"차량 카메라에 액세스"</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"차량 에너지"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"차량 에너지 정보에 액세스"</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"차량 공조기"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"차량 공조기에 액세스합니다."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"차량 주행거리"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"차량 주행거리 정보에 액세스"</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"차량 속도"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"차량 속도에 액세스"</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"차량 운동 상태"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"차량 운동 상태에 액세스"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"차량 공급업체 채널"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"차량 정보 교환을 위해 차량 공급업체 채널에 액세스"</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"차량 라디오"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"차량 라디오에 액세스"</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"차량 프로젝션"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"차량 오디오 볼륨"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"차량 오디오 설정"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"차량 디스플레이에 스마트폰 인터페이스 표시"</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"차량 HAL 에뮬레이션"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"내부 테스트 목적으로 차량의 HAL을 에뮬레이션"</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"차량 오디오 볼륨 제어"</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"차량 오디오 설정 제어"</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"애플리케이션 차단"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"운전 중 애플리케이션 차단 제어"</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"내비게이션 관리자"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"내비게이션 데이터를 계기판에 보냄"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"계기판으로 렌더링 보내기"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"애플리케이션이 계기판에 표시할 활동을 선언하도록 허용"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"계기판 제어"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"계기판에서 앱 실행"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"계기판 렌더링"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"계기판 데이터 수신"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"UX 제한사항 설정"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"UX 제한사항 설정"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"차량 입력 서비스"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"입력 이벤트 처리"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"CAN 버스 실패"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN 버스가 응답하지 않습니다. 헤드유닛 박스를 분리한 후 다시 연결한 다음 시동을 다시 걸어 보세요."</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"안전을 위해 운전 중에는 이용할 수 없는 활동입니다.\n계속하려면 먼저 주차하세요."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"안전한 앱 기능으로 다시 시작하려면 <xliff:g id="EXIT_BUTTON">%s</xliff:g>을(를) 선택하세요."</string>
+ <string name="exit_button" msgid="5829638404777671253">"뒤로"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"디버그 정보"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"진단 데이터"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"차량의 진단 데이터 읽기"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"진단 데이터"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"차량에서 진단 데이터 삭제"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"VMS 게시자"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"VMS 메시지 게시"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"VMS 구독자"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"VMS 메시지 구독"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"플래시 저장소 모니터링"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"플래시 저장소 사용 모니터링"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"운전 상태"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"운전 상태 변화 감지"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"상세한 엔진 정보"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"차량의 상세한 엔진 정보에 액세스"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"에너지 포트"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"에너지 포트에 액세스"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"차량 ID"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"차량 ID에 액세스"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"차량 도어"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"차량 도어 제어"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"차량 윈도"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"차량 윈도 제어"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"차량 미러"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"차량 미러 제어"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"차량 시트"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"차량 시트 제어"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"차량 기본 정보"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"차량 기본 정보 액세스"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"차량 외부 조명"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"차량 외부 조명 상태에 액세스"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"차량 외부 조명"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"차량 외부 조명 제어"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"차량 외부 온도"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"차량 외부 온도 액세스"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"차량 타이어"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"차량 타이어 정보에 액세스"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"차량 동력 전달 장치"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"차량 동력 전달 장치 정보에 액세스"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"차량 전원"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"전원 상태 액세스"</string>
+</resources>
diff --git a/service/res/values-ky/config.xml b/service/res/values-ky/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-ky/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-ky/strings.xml b/service/res/values-ky/strings.xml
new file mode 100644
index 0000000..ccf77e6
--- /dev/null
+++ b/service/res/values-ky/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Унаа тууралуу маалымат"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Унааңыздын маалыматына мүмкүнчүлүк алуу."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Унаанын кабинасы"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Унааңыздын шаймандарын, анын ичинде эшиктерди, терезелерди, орундуктарды жана терезелерди башкаруу."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Унаанын камерасы"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Унааңыздын камераларын колдонуу."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Унаанын кубаты"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Унааңыздын кубаты тууралуу маалыматты көрүү."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"Унаанын жылыткыч жана вентиляция тутумдары"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Унааңыздын жылыткыч жана вентилиция тутумдарын көрүү."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Унаанын километражы"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Унааңыздын километраж маалыматын көрүү."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Унаанын ылдамдыгы"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Унааңыздын ылдамдыгын билип туруу."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Унаанын динамикалык абалы"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Унааңыздын динамикалык абалын билип туруу"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Унаа сатуучусунун каналы"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Унаага тиешелүү маалыматты алмашуу үчүн унаа сатуучунун каналына кириңиз."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Унаанын радиосу"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Унаадагы радиону колдонуу."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Унааны долбоорлоо"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Унаадагы аудионун үнүнүн катуулугу"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Унаадагы аудионун жөндөөлөрү"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Унаанын дисплейиндеги телефондун интерфейсинин долбоору."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Унаадагы HAL\'ды иштетип көрүү"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Ички сыноо үчүн унааңыздагы HAL\'ды иштетип көрүү."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Унааңыздагы аудионун үнүнүн катуулугун көзөмөлдөө."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Унааңыздагы аудионун жөндөөлөрүн көзөмөлдөө."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Колдонмолорду бөгөттөө"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Унаа айдап баратканда колдонмолордун бөгөттөлүшүн көзөмөлдөө."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Чабыттоону башкаруучу"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Чабытоо дайындарын куралдар кластерине өткөрүү"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Куралдар кластерине түздөн-түз өткөрүү"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Колдонмого куралдар кластеринде көрсөтүлүүчү иш-аракеттерди жарыялоого уруксат берүү"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Куралдар кластерин көзөмөлдөө"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Куралдар кластериндеги колдонмолорду иштетүү"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Куралдар кластери түзүлүүдө"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Куралдар кластеринин дайындарын алуу"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"UX чектөөлөрүнүн конфигурациясы"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"КТ чектөөлөрүн конфигурациялоо"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Унаанын киргизүү кызматы"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Киргизүү аракеттерин башкаруу"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"CAN иштебей калды"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN жооп бербей жатат. Башкы шайман блогун сууруп, кайра сайгандан кийин унааны кайра жүргүзүңүз"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"Коопсуздугуңузду коргоо максатында, бул иш-аракетти унаа айдап баратканда аткарууга болбойт.\nТоктоп туруп, улантыңыз."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"Колдонмонун коопсуз функцияларын иштетүү үчүн <xliff:g id="EXIT_BUTTON">%s</xliff:g> баскычын басыңыз."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Артка"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Мүчүлүштүк"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Мүчүлүштүктөрдү аныктоо дайындары"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Унаадагы мүчүлүштүктөрдү аныктоо дайындарын окуу"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Мүчүлүштүктөрдү аныктоо дайындары"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Унаадагы мүчүлүштүктөрдү аныктоо дайындарын тазалоо"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"VMS жарыялоочу"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"VMS билдирүүлөрүн жарыялоо"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"VMS жазылуучу"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"VMS билдирүүлөрүн алып туруу үчүн жазылуу"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Флэш-сактагычты көзөмөлдөө"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Флэш-сактагычтын колдонулушун көзөмөлдөө"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Унаа айдоо абалы"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Унаа айдоо абалынын өзгөрүүлөрүн угуу"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Кыймылдаткычтын чоо-жайы"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Унааңыздын кыймылдаткычы тууралуу толук маалыматты көрүү"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Кубаттагыч порттору"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Кубаттагыч портторун колдонуу"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Унаанын идентификатору"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Унаанын идентификаторун көрүү"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Унаанын эшиктери"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Унаанын эшиктерин көзөмөлдөө"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Унаанын терезелери"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Унаанын терезелерин көзөмөлдөө"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Унаанын күзгүлөрү"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Унаанын күзгүлөрүн көзөмөлдөө"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Унаадагы орундуктар"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Унаадагы орундуктарды көзөмөлдөө"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Унаа тууралуу негизги маалымат"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Унаа тууралуу негизги маалыматты колдонуу"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Унаанын сыртындагы жарыктар"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Унаанын сыртындагы жарыктардын абалын көрүү"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Унаанын сыртындагы жарыктар"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Унаанын сыртындагы жарыктарды көзөмөлдөө"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Унаанын сыртындагы температура"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Унаанын ичиндеги температураны көрүү"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Унаанын дөңгөлөктөрү"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Унаанын дөңгөлөктөрү тууралуу маалыматты көрүү"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Унаанын кубат агрегаты"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Унаанын кубат агрегаты тууралуу маалыматты колдонуу"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Унаанын кубаты"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Унаанын кубаттуулук абалын көрүү"</string>
+</resources>
diff --git a/service/res/values-lo/config.xml b/service/res/values-lo/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-lo/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-lo/strings.xml b/service/res/values-lo/strings.xml
new file mode 100644
index 0000000..4d99a47
--- /dev/null
+++ b/service/res/values-lo/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"ຂໍ້ມູນລົດ"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"ເຂົ້າເຖິງຂໍ້ມູນລົດຂອງທ່ານ."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"ຫ້ອງໂດຍສານໃນລົດ"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"ເຂົ້າເຖິງອຸປະກອນເສີມຂອງລົດທ່ານ, ຮວມທັງປະຕູ, ແວ່ນ, ບ່ອນນັ່ງ ແລະ ປ່ອງຢ້ຽມ."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"ກ້ອງຂອງລົດ"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"ເຂົ້າເຖິງກ້ອງຂອງລົດທ່ານ."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"ພະລັງງານຂອງລົດ"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"ເຂົ້າເຖິງຂໍ້ມູນພະລັງງານຂອງລົດທ່ານ."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"HVAC ຂອງລົດ"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"ເຂົ້າເຖິງ HVAC ຂອງລົດທ່ານ."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"ຈຳນວນໄມລ໌ຂອງລົດ"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"ເຂົ້າຫາຂໍ້ມູນຈໍານວນໄມລ໌ຂອງລົດທ່ານ."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"ຄວາມໄວລົດ"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"ເຂົ້າເຖິງຂໍ້ມູນຄວາມໄວຂອງລົດທ່ານ."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"ສະຖານະໄດນາມິກຂອງພາຫະນະ"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"ເຂົ້າເຖິງສະພາວະໄດນາມິກຂອງລົດທ່ານ"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"ຊ່ອງທາງຜູ້ຂາຍລົດ"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"ເຂົ້າເຖິງຊ່ອງທາງຜູ້ຂາຍລົດຂອງທ່ານເພື່ອແລກປ່ຽນຂໍ້ມູນສະເພາະຂອງລົດ."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"ວິທະຍຸຂອງລົດ"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"ເຂົ້າເຖິງວິທະຍຸຂອງລົດທ່ານ."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"ການສາຍພາບໃນຈໍສະແດງຜົນຂອງລົດ"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"ລະດັບສຽງຂອງເຄື່ອງສຽງໃນລົດ"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"ການຕັ້ງຄ່າເຄື່ອງສຽງໃນລົດ"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"ສາຍພາບສ່ວນຕິດຕໍ່ຂອງໂທລະສັບຢູ່ໃນໜ້າຈໍຂອງລົດ."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"ຈຳລອງ HAL ພາຫະນະ"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"ຈໍາລອງ HAL ພາຫະນະຂອງລົດທ່ານສຳລັບຈຸດປະສົງການທົດສອບພາຍໃນ."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"ຄວບຄຸມລະດັບສຽງຂອງເຄື່ອງສຽງໃນລົດຂອງທ່ານ."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"ຄວບຄຸມການຕັ້ງຄ່າເຄື່ອງສຽງໃນລົດຂອງທ່ານ."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"ການບລັອກແອັບພລິເຄຊັນ"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"ຄວບຄຸມການບລັອກແອັບພລິເຄຊັນໃນຂະນະຂັບລົດ."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"ຕົວຈັດການການນໍາທາງ"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"ລາຍງານຂໍ້ມູນການນໍາທາງຫາແຜງໜ້າປັດ"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"ການສະແດງຜົນໄປຍັງແຜງໜ້າປັດໂດຍກົງ"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"ອະນຸຍາດໃຫ້ແອັບພລິເຄຊັນປະກາດກິດຈະກຳທີ່ຈະສະແດງໃນແຜງໜ້າປັດ"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"ການຄວບຄຸມແຜງໜ້າປັດ"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"ເປີດໃຊ້ແອັບໃນແຜງໜ້າປັດ"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"ການສະແດງຜົນແຜງໜ້າປັດ"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"ຮັບຂໍ້ມູນຈາກແຜງໜ້າປັດ"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"ການກຳນົດຄ່າຂໍ້ຈຳກັດ UX"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"ກຳນົດຄ່າຂໍ້ຈຳກັດ UX"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"ການບໍລິການປ້ອນຂໍ້ມູນຂອງລົດ"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"ຈັດການເຫດການປ້ອນຂໍ້ມູນ"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"CAN bus ບໍ່ສຳເລັດ"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN bus ບໍ່ຕອບສະໜອງ. ຖອດປລັກກ່ອງເຄື່ອງຫຼິ້ນວິທະຍຸ (Headunit) ແລ້ວສຽບເຂົ້າຄືນໃໝ່ ແລະ ຣິສະຕາດລົດ"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"ເພື່ອຄວາມປອດໄພຂອງທ່ານ, ກິດຈະກຳນີ້ບໍ່ມີໃຫ້ນໍາໃຊ້ໃນຂະນະທີ່ທ່ານກຳລັງຂັບລົດຢູ່. \nເພື່ອສືບຕໍ່, ກະລຸນາລໍຖ້າຈົນກວ່າວ່າທ່ານຈອດລົດ."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"ເພື່ອເລີ່ມຕົ້ນຄືນໃໝ່ດ້ວຍຄຸນສົມບັດແອັບທີ່ປອດໄພ, ກະລຸນາເລືອກ <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
+ <string name="exit_button" msgid="5829638404777671253">"ກັບຄືນ"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"ຂໍ້ມູນການວິເຄາະ"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"ອ່ານຂໍ້ມູນການວິເຄາະຈາກລົດ"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"ຂໍ້ມູນການວິເຄາະ"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"ລຶບລ້າງຂໍ້ມູນການວິເຄາະຈາກລົດ"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"ຜູ້ເຜີຍແຜ່ຂໍ້ມູນ VMS"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"ເຜີຍແຜ່ຂໍ້ຄວາມ VMS"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"ຜູ້ສະໝັກໃຊ້ VMS"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"ສະໝັກໃຊ້ຂໍ້ຄວາມ VMS"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"ການຕິດຕາມພື້ນທີ່ຈັດເກັບຂໍ້ມູນຂອງແຟລດ"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"ຕິດຕາມການໃຊ້ພື້ນທີ່ເກັບຂໍ້ມູນແຟລດ"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"ສະຖານະການຂັບລົດ"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"ຟັງການປ່ຽນແປງສະພາບການຂັບຂີ່"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"ລາຍລະອຽດເຄື່ອງຈັກ"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"ເຂົ້າເຖິງຂໍ້ມູນເຄື່ອງຈັກລະອຽດຂອງລົດທ່ານ"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"ຝາຖັງນໍ້າມັນ ຫຼື ຜອດສາກໄຟ"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"ເຂົ້າເຖິງຝາຖັງນໍ້າມັນ ຫຼື ຜອດສາກໄຟ"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"ການລະບຸຕົວລົດ"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"ເຂົ້າເຖິງການລະບຸຕົວລົດ"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"ປະຕູລົດ"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"ຄວບຄຸມປະຕູລົດ"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"ປ່ອງຢ້ຽມລົດ"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"ຄວບຄຸມປ່ອງຢ້ຽມລົດ"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"ແວ່ນລົດ"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"ຄວບຄຸມແວ່ນລົດ"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"ບ່ອນນັ່ງໃນລົດ"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"ຄວບຄຸມບ່ອນນັ່ງໃນລົດ"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"ຂໍ້ມູນພື້ນຖານຂອງລົດ"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"ເຂົ້າເຖິງຂໍ້ມູນພື້ນຖານຂອງລົດ"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"ແສງພາຍນອກລົດ"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"ເຂົ້າເຖິງສະຖານະແສງພາຍນອກລົດ"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"ແສງພາຍນອກລົດ"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"ຄວບຄຸມແສງພາຍນອກລົດ"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"ອຸນຫະພູມພາຍນອກລົດ"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"ເຂົ້າເຖິງຂໍ້ມູນອຸນຫະພູມພາຍນອກລົດ"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"ຢາງລົດ"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"ເຂົ້າເຖິງຂໍ້ມູນຢາງລົດ"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"ລະບົບສົ່ງກໍາລັງຂອງລົດ"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"ເຂົ້າເຖິງຂໍ້ມູນລະບົບສົ່ງກໍາລັງຂອງລົດ"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"ພະລັງງານຂອງລົດ"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"ເຂົ້າເຖິງສະຖານະພະລັງງານຂອງລົດ"</string>
+</resources>
diff --git a/service/res/values-lt/config.xml b/service/res/values-lt/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-lt/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-lt/strings.xml b/service/res/values-lt/strings.xml
new file mode 100644
index 0000000..d01aee7
--- /dev/null
+++ b/service/res/values-lt/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Automobilio informacija"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Pasiekti automobilio informaciją."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Automobilio salonas"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Pasiekti automobilio priedus, įskaitant duris, veidrodėlius, sėdynes ir langus."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Automobilio fotoaparatas"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Pasiekti automobilio fotoaparatą (-us)."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Automobilio energija"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Pasiekti automobilio energijos informaciją."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"Automobilio HVAC"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Pasiekti automobilio HVAC."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Automobilio rida"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Pasiekti automobilio ridos informaciją."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Automobilio greitis"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Pasiekti automobilio greičio informaciją."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Transporto priemonės varomosios jėgos būsena"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Pasiekti automobilio varomosios jėgos būseną."</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Automobilio paslaugų teikėjo kanalas"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Pasiekti automobilio paslaugų teikėjo kanalą, kad būtų galima siųsti ir gauti automobilio informaciją."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Automobilio radijas"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Pasiekti automobilio radiją."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Automobilio projekcija"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Automobilio garsų garsumas"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Automobilio garso nustatymai"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Projektuoti telefono sąsają automobilio ekrane."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Imituoti transporto priemonės HAL"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Imituoti automobilio transporto priemonės HAL vidinio testavimo tikslais."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Valdyti automobilio garsų garsumą."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Valdyti automobilio garso nustatymus."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Programos blokavimas"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Valdyti programos blokavimą vairuojant."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Navigacijos tvarkymo priemonė"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Pranešti navigacijos duomenis instrumentų blokiniui."</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Tiesioginis pateikimas instrumentų blokinyje"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Leisti programai skelbti veiklą, kuri turėtų būti pateikta instrumentų blokinyje"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Instrumentų blokinio valdymas"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Pristatyti programas instrumentų blokinyje"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Instrumentų blokinio pateikimas"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Gauti instrumentų blokinio duomenis"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"NP apribojimų konfigūravimas"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"Konfigūruoti NP apribojimus"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Automobilio įvesties paslauga"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Apdoroti įvesties įvykius."</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"CAN BUS klaida"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN BUS nereaguoja. Atjunkite ir vėl prijunkite pagrindinio įtaiso dėžutę."</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"Siekiant užtikrinti jūsų saugą, ši veikla nepasiekiama vairuojant.\nJei norite tęsti, palaukite, kol sustosite."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"Jei norite pradėti iš naujo naudodami saugias programos funkcijas, pasirinkite <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Atgal"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Der. inf."</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Diagnostikos duomenys"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Skaityti automobilio diagnostikos duomenis."</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Diagnostikos duomenys"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Išvalyti diagnostikos duomenis iš automobilio."</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"VMS leidėjas"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"Skelbti VMS pranešimus."</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"VMS prenumeratorius"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"Prenumeruoti VMS pranešimus."</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Atmintuko stebėjimas"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Stebėti atmintuko naudojimą."</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Vairavimo būsena"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Klausyti vairavimo būsenos pakeitimų."</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Išsami variklio informacija"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Pasiekti išsamią automobilio variklio informaciją."</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Energijos prievadai"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Pasiekti energijos prievadus."</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Automobilio identifikavimo duomenys"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Pasiekti automobilio identifikavimo duomenis"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Automobilio durys"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Valdyti automobilio duris."</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Automobilio langai"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Valdyti automobilio langus."</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Automobilio veidrodėliai"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Valdyti automobilio veidrodėlius."</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Automobilio sėdynės"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Valdyti automobilio sėdynes."</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Pagrindinė automobilio informacija"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Pasiekti pagrindinę automobilio informaciją."</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Automobilio išoriniai žibintai"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Pasiekti automobilio išorinių žibintų būseną."</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Automobilio išoriniai žibintai"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Valdyti automobilio išorinius žibintus"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Automobilio išorės temperatūra"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Pasiekti automobilio išorės temperatūrą."</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Automobilio padangos"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Pasiekti automobilio padangų informaciją."</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Automobilio transmisija"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Pasiekti automobilio transmisijos informaciją."</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Automobilio maitinimas"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Pasiekti automobilio maitinimo būseną."</string>
+</resources>
diff --git a/service/res/values-lv/config.xml b/service/res/values-lv/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-lv/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-lv/strings.xml b/service/res/values-lv/strings.xml
new file mode 100644
index 0000000..1afe700
--- /dev/null
+++ b/service/res/values-lv/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Informācija par automašīnu"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Piekļūt informācijai par automašīnu."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Automašīnas salons"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Piekļūt automašīnas piederumiem, tostarp durvīm, spoguļiem, sēdekļiem un logiem."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Automašīnas kamera"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Piekļūt automašīnas kamerai(-ām)."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Automašīnas enerģija"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Piekļūt informācijai par automašīnas enerģiju."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"Automašīnas gaisa kondicionēšanas sistēma"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Piekļūt automašīnas gaisa kondicionēšanas sistēmai."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Automašīnas nobraukuma informācija"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Piekļūt informācijai par automašīnas nobraukumu."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Informācija par automašīnas ātrumu"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Piekļūt informācijai par automašīnas ātrumu."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Transportlīdzekļa dinamikas stāvoklis"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Piekļūt informācijai par automašīnas dinamikas stāvokli."</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Automašīnas ražotāja kanāls"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Piekļūt automašīnas ražotāja kanālam, lai veiktu ar automašīnu saistītas informācijas apmaiņu."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Automašīnas radio"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Piekļūt automašīnas radio."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Projicēšana automašīnā"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Automašīnas audio skaļums"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Automašīnas audio iestatījumi"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Projicēt tālruņa saskarni automašīnas displejā."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Transportlīdzekļa HAL imitēšana"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Imitēt jūsu automašīnas Vehicle HAL, lai veiktu iekšējo testēšanu."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Kontrolēt automašīnas audio skaļumu."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Kontrolēt automašīnas audio iestatījumus."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Lietojumprogrammu bloķēšana"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Kontrolēt lietojumprogrammu bloķēšanu braukšanas laikā."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Navigācijas pārvaldnieks"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Reģistrēt navigācijas datus mēraparātu blokā."</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Tieša renderēšana uz mēraparātu bloku"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Atļaut lietojumprogrammai deklarēt, kuras darbības jāattēlo mēraparātu blokā."</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Mēraparātu bloka kontrole"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Palaist lietotnes mēraparātu blokā."</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Atveide mēraparātu blokā"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Saņemt datus no mēraparātu bloka."</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"Lietotāja pieredzes ierobežojumu konfigurēšana"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"Konfigurēt lietotāja pieredzes ierobežojumus."</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Automašīnas ievades pakalpojums"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Apstrādāt ievades notikumus."</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"Radās atteice datu maģistrālē"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"Datu maģistrāle nereaģē. Atvienojiet un atkal pievienojiet stereosistēmas paneļa kabeli un atkārtoti iedarbiniet automašīnu"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"Drošības apsvērumu dēļ šī darbība nav pieejama braukšanas laikā.\nTurpiniet, kad automašīna būs novietota stāvēšanai."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"Lai atsāktu darbu ar drošām lietotnes funkcijām, atlasiet pogu <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Atpakaļ"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Diagnostikas dati"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Nolasīt no automašīnas diagnostikas datus."</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Diagnostikas dati"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Notīrīt diagnostikas datus no automašīnas."</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"VMS publicētājs"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"Publicēt VMS ziņojumus."</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"VMS abonents"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"Abonēt VMS ziņojumus."</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Zibatmiņas uzraudzība"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Uzraudzīt zibatmiņas lietojumu."</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Braukšanas režīms"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Noklausīties braukšanas režīma izmaiņas."</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Detalizēta informācija par dzinēju"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Piekļūt detalizētai informācijai par automašīnas dzinēju."</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Enerģijas pieslēgvietas"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Piekļūt enerģijas pieslēgvietām."</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Automašīnas identifikācija"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Piekļūt automašīnas identifikācijas numuram."</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Automašīnas durvis"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Kontrolēt automašīnas durvis."</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Automašīnas logi"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Kontrolēt automašīnas logus."</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Automašīnas spoguļi"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Kontrolēt automašīnas spoguļus."</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Automašīnas sēdekļi"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Kontrolēt automašīnas sēdekļus."</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Pamatinformācija par automašīnu"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Piekļūt pamatinformācijai par automašīnu"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Automašīnas ārējās ugunis"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Piekļūt informācijai par automašīnas ārējo uguņu stāvokli."</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Automašīnas ārējās ugunis"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Kontrolēt automašīnas ārējās ugunis."</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Temperatūra automašīnas ārpusē"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Piekļūt informācijai par temperatūru automašīnas ārpusē."</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Automašīnas riepas"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Piekļūt informācijai par automašīnas riepām."</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Automašīnas jaudas piedziņas ķēde"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Piekļūt informācijai par automašīnas jaudas piedziņas ķēdi."</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Automašīnas aizdedzes stāvoklis"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Piekļūt informācijai par automašīnas aizdedzes stāvokli."</string>
+</resources>
diff --git a/service/res/values-mk/config.xml b/service/res/values-mk/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-mk/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-mk/strings.xml b/service/res/values-mk/strings.xml
new file mode 100644
index 0000000..4e6d64a
--- /dev/null
+++ b/service/res/values-mk/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Информации за автомобилот"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Пристапува до информациите за автомобилот."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Кабина на автомобилот"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Пристапува до додатоците на автомобилот, вклучувајќи ги вратите, ретровизорите, седиштата и прозорците."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Камера на автомобилот"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Пристапува до камерите на автомобилот."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Енергија на автомобилот"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Пристапува до информациите за енергијата на автомобилот."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"Клима-уред на автомобилот"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Пристапува до клима-уредот на автомобилот."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Поминати километри на автомобилот"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Пристапува до информациите за поминатите километри на автомобилот."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Брзина на автомобилот"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Пристапува до информациите за брзината на автомобилот."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Динамичка состојба на автомобилот"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Пристапува до динамичката состојба на автомобилот"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Канал на продавачот на автомобилот"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Пристапува до каналот на продавачот на автомобилот за да размени информации во врска со автомобилот."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Радио на автомобилот"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Пристапува до радиото на автомобилот."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Прикажување во автомобилот"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Јачина на звукот на автомобилот"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Поставки за звук на автомобилот"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Го прикажува интерфејсот на телефонот на екранот на автомобилот."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Го поддржува HAL за возило"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Го поддржува HAL за возило на автомобилот за внатрешно тестирање."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Ја контролира јачината на звукот на автомобилот."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Ги контролира поставките за звук на автомобилот."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Блокирање на апликацијата"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Го контролира блокирањето на апликацијата додека возите"</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Управник за навигација"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Пријавува податоци за навигацијата до инструменталната табла."</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Директно прикажување на инструменталната табла"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Овозможува апликацијата да најавува активности за прикажување на инструменталната табла"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Контрола на инструменталната табла"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Стартува апликации на инструменталната табла"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Прикажување на инструменталната табла"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Примајте податоци од инструменталната табла"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"Конфигурација на ограничувањата на корисничкото искуство"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"Конфигурирајте ги ограничувањата на корисничкото искуство"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Влезна услуга на автомобилот"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Ракува со влезните настани"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"CAN-магистралата не успеа"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN-магистралата не реагира. Откачете ја и повторно прикачете ја кутијата на главната единица и рестартирајте го автомобилот"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"За ваша безбедност, оваа активност не е достапна додека возите.\nЗа да продолжите, почекајте да се паркирате."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"За да започнете одново со безбедносните фунции на апликацијата, изберете <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Назад"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Дијагностички податоци"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Чита дијагностички податоци од автомобилот"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Дијагностички податоци"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Ги брише дијагностичките податоци од автомобилот"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"Издавач на VMS"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"Објавува vms-пораки"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"Претплатник на VMS"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"Се претплатува на vms-пораки"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Следење на флеш меморијата"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Го следи користењето на флеш меморијата"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Состојба на возење"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Ги слуша промените во состојбата на возење"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Темелно чистење на моторот"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Пристапува до деталните информации за моторот на автомобилот."</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Енергетски порти"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Пристапува до енергетските порти"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Идентификација на автомобилот"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Пристапува до идентификацијата на автомобилот"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Врати на автомобилот"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Ги контролира вратите на автомобилот"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Прозорци на автомобилот"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Ги контролира прозорците на автомобилот"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Ретровизори на автомобилот"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Ги контролира ретровизорите на автомобилот"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Седишта на автомобилот"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Ги контролира седиштата на автомобилот"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Основни информации за автомобилот"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Пристапува до основните информации за автомобилот"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Надворешни светла на автомобилот"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Пристапува до состојбата на надворешните светла на автомобилот"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Надворешни светла на автомобилот"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Ги контролира надворешните светла на автомобилот"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Надворешна температура на автомобилот"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Пристапува до надворешната температура на автомобилот"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Гуми на автомобилот"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Пристапува до информациите за гумите на автомобилот"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Електроника на автомобилот"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Пристапува до информациите за електрониката на автомобилот"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Моќност на автомобилот"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Пристапува до состојбата на моќност на автомобилот"</string>
+</resources>
diff --git a/service/res/values-ml/config.xml b/service/res/values-ml/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-ml/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-ml/strings.xml b/service/res/values-ml/strings.xml
new file mode 100644
index 0000000..b928745
--- /dev/null
+++ b/service/res/values-ml/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"കാർ വിവരങ്ങൾ"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"നിങ്ങളുടെ കാർ വിവരങ്ങൾ ആക്സസ് ചെയ്യുക."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"കാർ ക്യാബിൻ"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"വിൻഡോകൾ, സീറ്റുകൾ, കണ്ണാടികൾ, ഡോറുകൾ ഉൾപ്പെടെയുള്ള നിങ്ങളുടെ കാറിന്റെ ഘടകഭാഗങ്ങൾ ആക്സസ് ചെയ്യുക."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"കാറിന്റെ ക്യാമറ"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"നിങ്ങളുടെ കാറിന്റെ ക്യാമറ(കൾ) ആക്സസ് ചെയ്യുക."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"കാർ എനർജി"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"നിങ്ങളുടെ കാറിന്റെ എനർജി വിവരങ്ങൾ ആക്സസ് ചെയ്യുക."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"കാർ Hvac"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"നിങ്ങളുടെ കാറിന്റെ hvac ആക്സസ് ചെയ്യുക."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"കാറിന്റെ മൈലേജ്"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"നിങ്ങളുടെ കാറിന്റെ മൈലേജ് വിവരങ്ങൾ ആക്സസ് ചെയ്യുക."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"കാറിന്റെ വേഗത"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"നിങ്ങളുടെ കാറിന്റെ വേഗത ആക്സസ് ചെയ്യുക."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"വാഹനത്തിന്റെ ചലനാത്മക നില"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"നിങ്ങളുടെ കാറിന്റെ ചലനാത്മക നില ആക്സസ് ചെയ്യുക"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"കാർ വെൻഡർ ചാനൽ"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"കാർ-നിർദ്ദിഷ്ട വിവരം മാറ്റാൻ കൈമാറാൻ കാറിന്റെ വെൻഡർ ചാനൽ ആക്സസ് ചെയ്യുക."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"കാർ റേഡിയോ"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"നിങ്ങളുടെ കാർ റേഡിയോ ആക്സസ് ചെയ്യുക."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"കാർ പ്രൊജക്ഷൻ"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"കാറിന്റെ ഓഡിയോ വോളിയം"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"കാറിന്റെ ഓഡിയോ ക്രമീകരണം"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"കാർ പ്രദർശനത്തിൽ, ഫോൺ ഇന്റർഫേസ് പ്രൊജക്റ്റ് ചെയ്യുക."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"വാഹന HAL എമുലേറ്റ് ചെയ്യുക"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"ആന്തരിക പരിശോധനയ്ക്കായി, നിങ്ങളുടെ കാറിന്റെ വാഹന HAL എമുലേറ്റ് ചെയ്യുക."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"നിങ്ങളുടെ കാറിന്റെ ഓഡിയോ വോളിയം നിയന്ത്രിക്കുക."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"നിങ്ങളുടെ കാറിന്റെ ഓഡിയോ ക്രമീകരണം നിയന്ത്രിക്കുക."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"ആപ്പ് ബ്ലോക്ക് ചെയ്യൽ"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"ഡ്രൈവ് ചെയ്യുമ്പോൾ ആപ്പ് ബ്ലോക്ക് ചെയ്യുന്നത് നിയന്ത്രിക്കുക."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"നാവിഗേഷൻ മാനേജർ"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"ഇൻസ്ട്രുമെന്റ് ക്ലസ്റ്ററിൽ നാവിഗേഷൻ ഡാറ്റ റിപ്പോർട്ട് ചെയ്യുക"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"ഇൻസ്ട്രുമെന്റ് ക്ലസ്റ്ററിലേക്ക് നേരിട്ട് റെൻഡർ ചെയ്യുക"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"ഇൻസ്ട്രുമെന്റ് ക്ലസ്റ്ററിൽ പ്രദർശിപ്പിക്കാനുള്ള ആക്റ്റിവിറ്റികൾ പ്രഖ്യാപിക്കാൻ ആപ്പിനെ അനുവദിക്കുക"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"ഇൻസ്ട്രുമെന്റ് ക്ലസ്റ്റർ നിയന്ത്രണം"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"ഇൻസ്ട്രുമെന്റ് ക്ലസ്റ്ററിൽ ആപ്പുകൾ ലോഞ്ച് ചെയ്യുക"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"ഇൻസ്ട്രുമെന്റ് ക്ലസ്റ്റർ റെൻഡർ ചെയ്യൽ"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"ഇൻസ്ട്രുമെന്റ് ക്ലസ്റ്റർ ഡാറ്റ സ്വീകരിക്കുക"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"UX നിയന്ത്രണങ്ങളുടെ കോൺഫിഗറേഷൻ"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"UX നിയന്ത്രണങ്ങൾ കോൺഫിഗർ ചെയ്യുക"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"കാറിന്റെ ഇൻപുട്ട് സേവനം"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"ഇൻപുട്ട് ഇവന്റുകൾ കൈകാര്യം ചെയ്യുക"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"CAN ബസ് പരാജയപ്പെട്ടു"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN ബസ് പ്രതികരിക്കുന്നില്ല. ഹെഡ്യൂണിറ്റ് ബോക്സ്, അൺപ്ലഗ് ചെയ്ത്, വീണ്ടും പ്ലഗ് ചെയ്ത്, കാർ റീസ്റ്റാർട്ട് ചെയ്യുക"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"നിങ്ങളുടെ സുരക്ഷയ്ക്ക്, ഡ്രൈവ് ചെയ്യുമ്പോൾ ഈ ആക്റ്റിവിറ്റി ലഭ്യമല്ല.\nതുടരാൻ, നിങ്ങൾ പാർക്ക് ചെയ്യുന്നതുവരെ കാത്തിരിക്കുക."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"സുരക്ഷിതമായ ആപ്പ് ഫീച്ചറുകൾ ഉപയോഗിച്ച് പുനരാരംഭിക്കാൻ, <xliff:g id="EXIT_BUTTON">%s</xliff:g> തിരഞ്ഞെടുക്കുക."</string>
+ <string name="exit_button" msgid="5829638404777671253">"മടങ്ങുക"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"ഡീബഗ് വിവരം"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"പ്രശ്നനിർണ്ണയ ഡാറ്റ"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"കാറിൽ നിന്ന് പ്രശ്നനിർണ്ണയ ഡാറ്റ വായിക്കുക"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"പ്രശ്നനിർണ്ണയ ഡാറ്റ"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"കാറിൽ നിന്ന് ഡയഗ്നോസ്റ്റിക് ഡാറ്റ മായ്ക്കുക"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"VMS പ്രസാധകൻ"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"vms മെസേജുകൾ പ്രസിദ്ധീകരിക്കുക"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"VMS വരിക്കാർ"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"vms മെസേജിന്റെ വരിക്കാരാകുക"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"ഫ്ലാഷ് സ്റ്റോറേജ് നിരീക്ഷിക്കുന്നു"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"ഫ്ലാഷ് സ്റ്റോറേജ് ഉപയോഗം നിരീക്ഷിക്കുക"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"ഡ്രൈവിംഗ് നില"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"ഡ്രൈവിംഗ് നിലയിലെ മാറ്റങ്ങൾ ശ്രദ്ധിക്കുക"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"എഞ്ചിൻ വിശദാംശങ്ങൾ നൽകിയിരിക്കുന്നു"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"നിങ്ങളുടെ കാറിന്റെ വിശദമായ എഞ്ചിൻ വിവരങ്ങൾ ആക്സസ് ചെയ്യുക"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"എനർജി പോർട്ടുകൾ"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"എനർജി പോർട്ടുകൾ ആക്സസ് ചെയ്യുക"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"കാറിന്റെ ഐഡന്റിഫിക്കേഷൻ"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"കാറിന്റെ ഐഡന്റിഫിക്കേഷൻ ആക്സസ് ചെയ്യുക"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"കാറിന്റെ ഡോറുകൾ"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"കാറിന്റെ ഡോറുകൾ നിയന്ത്രിക്കുക"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"കാർ വിൻഡോകൾ"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"കാറിന്റെ വിൻഡോകൾ നിയന്ത്രിക്കുക"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"കാറിന്റെ കണ്ണാടികൾ"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"കാറിന്റെ കണ്ണാടികളെ നിയന്ത്രിക്കുക"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"കാറിന്റെ സീറ്റുകൾ"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"കാറിന്റെ സീറ്റുകൾ നിയന്ത്രിക്കുക"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"കാറിന്റെ അടിസ്ഥാന വിവരങ്ങൾ"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"കാറിന്റെ അടിസ്ഥാന വിവരങ്ങൾ ആക്സസ് ചെയ്യുക"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"കാറിന്റെ പുറംഭാഗത്തെ ലൈറ്റുകൾ"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"കാറിന്റെ പുറംഭാഗത്തെ ലൈറ്റുകളുടെ നില ആക്സസ് ചെയ്യുക"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"കാറിന്റെ പുറംഭാഗത്തെ ലൈറ്റുകൾ"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"കാറിന്റെ പുറംഭാഗത്തുള്ള ലൈറ്റുകൾ നിയന്ത്രിക്കുക"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"കാറിന്റെ പുറംഭാഗത്തെ താപനില"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"കാറിന്റെ പുറംഭാഗത്തെ താപനില ആക്സസ് ചെയ്യുക"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"കാർ ടയറുകൾ"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"കാർ ടയറിന്റെ വിവരങ്ങൾ ആക്സസ് ചെയ്യുക"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"കാർ Powertrain"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"കാറിന്റെ powertrain വിവരങ്ങൾ ആക്സസ് ചെയ്യുക"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"കാറിന്റെ പവർ"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"കാറിന്റെ പവർ നില ആക്സസ് ചെയ്യുക"</string>
+</resources>
diff --git a/service/res/values-mn/config.xml b/service/res/values-mn/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-mn/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-mn/strings.xml b/service/res/values-mn/strings.xml
new file mode 100644
index 0000000..b8a2d1c
--- /dev/null
+++ b/service/res/values-mn/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Машины мэдээлэл"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Машиныхаа мэдээлэлд хандана уу."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Машины бүхээг"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Машиныхаа хаалга, толь, суудал болон цонх зэрэг нэмэлт хэрэгсэлд хандана уу."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Машины камер"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Машиныхаа камерт хандана уу."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Машины эрчим хүч"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Машиныхаа эрчим хүчний мэдээлэлд хандана уу."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"Машины халаалт, агааржуулалт болон aгаар цэвэршүүлэгч"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Машиныхаа халаалт, агааржуулалт болон aгаар цэвэршүүлэгчид хандана уу."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Машины явсан миль"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Машиныхаа явсан милийн мэдээлэлд хандана уу."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Машины хурд"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Машиныхаа хурдны мэдээлэлд хандана уу."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Тээврийн хэрэгслийн динамик төлөв"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Машиныхаа динамик төлөвт хандах"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Машины нийлүүлэгчийн суваг"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Машинтай холбоотой мэдээллийг солилцохын тулд машин нийлүүлэгчийнхээ сувагт хандана уу."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Машины радио"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Машиныхаа радионд хандана уу."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Машины проекц"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Машины аудионы түвшин"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Машины аудионы тохиргоо"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Утасны харагдах байдлыг машины дэлгэцэд тооцоолно уу."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Тээврийн хэрэгслийн HAL-г дахин боловсруулах"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Машиныхаа тээврийн хэрэгслийн HAL-г дотоод шалгалтын зорилгоор дахин боловсруулна уу."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Машиныхаа аудионы түвшнийг хянана уу."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Машиныхаа аудионы тохиргоог хянана уу."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Апп блоклолт"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Жолоодох үеийн аппын блоклолтыг хянана уу."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Навигацийн менежер"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Навигацийн өгөгдлийг хяналтын самбарт мэдээлэх"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Хяналтын самбарын тайлбарт шууд харуулах"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Үйл ажиллагааг хяналтын самбарт мэдэгдэхийг аппад зөвшөөрөх"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Хяналтын самбарын хяналт"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Аппуудыг хяналтын самбарт эхлүүлэх"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Хяналтын самбарын буулгалт"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Хяналтын самбарын өгөгдлийг хүлээн авах"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"UX Хязгаарлалтын тохируулга"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"UX хязгаарлалтыг тохируулах"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Машины оролтын үйлчилгээ"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Оролтын арга хэмжээг боловсруулах"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"CAN bus амжилтгүй болсон"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN bus хариу өгөхгүй байна. Хөгжим тоглуулагчийн хайрцгийг салгаад, дахин залгаж, машиныг дахин эхлүүлнэ үү"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"Таны аюулгүй байдлын үүднээс жолоодох явцад энэ үйл ажиллагааг хийх боломжгүй.\nМашинаа зогсоолд байршуулаад үргэлжлүүлнэ үү."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"Аппын аюулгүй онцлогуудтайгаар дахин эхлүүлэхийн тулд <xliff:g id="EXIT_BUTTON">%s</xliff:g>-г сонгоно уу."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Буцах"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Дебаг хийх мэдээлэл"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Оношилгооны өгөгдөл"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Машины оношилгооны өгөгдлийг унших"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Оношилгооны өгөгдөл"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Машины оношилгооны өгөгдлийг устгах"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"VMS нийтлэгч"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"Vms мессежийг нийтлэх"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"VMS-н захиалагч"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"Vms мессежийг захиалах"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Гэрэл хадгалалтын хяналт"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Гэрэл хадгалалтын ашиглалтыг хянах"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Жолоодлогын төлөв"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Жолоодлогын төлөвийн өөрчлөлтийг сонсох"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Хөдөлгүүрийн дэлгэрэнгүй мэдээлэл"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Машиныхаа хөдөлгүүрийн дэлгэрэнгүй мэдээлэлд хандах"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Эрчим хүчний порт"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Эрчим хүчний портод хандах"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Машины тодорхойлолт"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Машины тодорхойлолтод хандах"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Машины хаалга"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Машины хаалгыг хянах"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Машины цонх"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Машины цонхыг хянах"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Машины толь"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Машины цонхыг хянах"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Машины суудал"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Машины суудлыг хянах"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Машины ерөнхий мэдээлэл"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Машины ерөнхий мэдээлэлд хандах"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Машины гадна талын гэрэлтүүлэг"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Машины гадна талын гэрэлтүүлгийн төлөвт хандах"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Машины гадна талын гэрэлтүүлэг"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Машины гадна талын гэрлийг хянах"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Машины гадна талын температур"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Машины гадаад температурт хандах"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Машины дугуй"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Машины дугуйны мэдээлэлд хандах"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Машин хүч дамжуулах анги"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Машины хүч дамжуулах ангийн мэдээлэлд хандах"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Машины хөдөлгүүрийн хүч"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Машины хөдөлгүүрийн хүчний төлөвт хандах"</string>
+</resources>
diff --git a/service/res/values-mr/config.xml b/service/res/values-mr/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-mr/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-mr/strings.xml b/service/res/values-mr/strings.xml
new file mode 100644
index 0000000..b14d138
--- /dev/null
+++ b/service/res/values-mr/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"कार माहिती"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"तुमच्या कारची माहिती अॅक्सेस करा."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"कार केबिन"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"दारे, आरसे, आसने आणि खिडक्यांसह, तुमच्या कारच्या अॅक्सेसरी अॅक्सेस करा."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"कार कॅमेरा"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"तुमच्या कारचा(चे) कॅमेरा(रे) अॅक्सेस करा."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"कार ऊर्जा"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"तुमच्या कारची ऊर्जा माहिती अॅक्सेस करा."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"कार Hvac"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"तुमच्या कारचे hvac अॅक्सेस करा."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"कार मायलेज"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"तुमच्या कारची मायलेज माहिती अॅक्सेस करा."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"कार गती"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"तुमच्या कारची गती अॅक्सेस करा."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"वाहन डायनॅमिक्स स्थिती"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"तुमच्या कारची डायनॅमिक्स स्थिती अॅक्सेस करा"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"कार विक्रेता चॅनेल"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"कारसंबंधी माहितीच्या देवाण-घेवाणीसाठी तुमच्या कारचे विक्रेता चॅनेल अॅक्सेस करा."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"कार रेडिओ"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"तुमच्या कारचा रेडिओ अॅक्सेस करा."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"कार प्रोजेक्शन"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"कार ऑडिओ व्हॉल्यूम"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"कार ऑडिओ सेटिंग्ज"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"कार डिस्प्लेवर फोन इंटरफेस प्रोजेक्ट करा."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"वाहन HAL चे अनुकरण करा"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"अंतर्गत चाचणी उद्देशांसाठी तुमच्या कारच्या वाहन HAL चे अनुकरण करा."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"तुमच्या कारचा ऑडिओ व्हॉल्यूम नियंत्रित करा."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"तुमच्या कारची ऑडिओ सेटिंग्ज नियंत्रित करा."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"अॅप्लिकेशन ब्लॉक करणे"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"ड्रायव्हिंग करत असताना अॅप्लिकेशन ब्लॉक करणे नियंत्रित करा."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"नेव्हिगेशन व्यवस्थापक"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"इंस्ट्रुमेंट क्लस्टरला नेव्हिगेशन डेटाचा अहवाल द्या"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"इंस्ट्रुमेंट क्लस्टरवर थेट रेंडरिंग"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"अॅप्लिकेशनला इंस्ट्रुमेंट क्लस्टरमध्ये अॅक्टिव्हिटी दाखवल्या जाण्याची घोषणा करू द्या"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"इंस्ट्रुमेंट क्लस्टर नियंत्रण"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"इंस्ट्रुमेंट क्लस्टरमध्ये अॅप्स लाँच करा"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"इंस्ट्रुमेंट क्लस्टर रेंडरिंग"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"इंस्ट्रुमेंट क्लस्टर डेटा मिळवा"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"UX निर्बंध कॉन्फिगरेशन"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"UX निर्बंध कॉन्फिगर करा"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"कार इनपुट सेवा"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"इनपुट इव्हेंट हाताळा"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"CAN बस अयशस्वी"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN बस प्रतिसाद देत नाही. हेडयुनिट बॉक्स अनप्लग करून पुन्हा प्लग करा आणि कार रीस्टार्ट करा"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"तुमच्या सुरक्षेसाठी, ड्रायव्हिंग करत असताना ही अॅक्टिव्हिटी उपलब्ध नाही.\nसुरू ठेवण्यासाठी, पार्क करेपर्यंत वाट पहा."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"सुरक्षित अॅप वैशिष्ट्यांसोबत पुन्हा सुरुवात करण्यासाठी, <xliff:g id="EXIT_BUTTON">%s</xliff:g> निवडा."</string>
+ <string name="exit_button" msgid="5829638404777671253">"मागे जा"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"डीबग माहिती"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"निदान डेटा"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"कारचा निदान डेटा वाचा"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"निदान डेटा"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"कारचा निदान डेटा साफ करा"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"VMS प्रकाशक"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"vms मेसेज प्रकाशित करा"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"VMS सदस्य"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"vms मेसेजचे सदस्य व्हा"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"फ्लॅश स्टोरेज परीक्षण"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"फ्लॅश स्टोरेज वापराचे परीक्षण करा"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"ड्रायव्हिंग स्थिती"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"ड्रायव्हिंग स्थितीतील बदल ऐका"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"इंजिन तपशीलवार"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"तुमच्या कारची तपशीलवार इंजिन माहिती अॅक्सेस करा"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"ऊर्जा पोर्ट"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"ऊर्जा पोर्ट ॲक्सेस करा"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"कार ओळख"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"कारची ओळख अॅक्सेस करा"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"कारची दारे"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"कारची दारे नियंत्रित करा"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"कारच्या खिडक्या"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"कारच्या खिडक्या नियंत्रित करा"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"कारचे आरसे"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"कारचे आरसे नियंत्रित करा"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"कार आसने"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"कारची आसने नियंत्रित करा"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"कारची प्राथमिक माहिती"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"कारची प्राथमिक माहिती अॅक्सेस करा"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"कारचे बाह्य लाइट"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"कारची बाह्य लाइट स्थिती अॅक्सेस करा"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"कारचे बाह्य लाइट"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"कारचे बाह्य लाइट नियंत्रित करा"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"कारचे बाह्य तापमान"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"कारचे बाह्य तापमान अॅक्सेस करा"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"कार टायर"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"कार टायरची माहिती अॅक्सेस करा"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"कार पॉवरट्रेन"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"कारची पॉवरट्रेन माहिती अॅक्सेस करा"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"कार पॉवर"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"कारची पॉवर स्थिती अॅक्सेस करा"</string>
+</resources>
diff --git a/service/res/values-ms/config.xml b/service/res/values-ms/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-ms/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-ms/strings.xml b/service/res/values-ms/strings.xml
new file mode 100644
index 0000000..81e8941
--- /dev/null
+++ b/service/res/values-ms/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Maklumat kereta"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Akses maklumat kereta anda."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Kabin Kereta"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Akses aksesori kereta anda, termasuk pintu, cermin, tempat duduk dan tingkap."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Kamera Kereta"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Akses kamera kereta anda."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Tenaga kereta"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Akses maklumat tenaga kereta anda."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"Hvac Kereta"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Akses hvac kereta anda."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Perbatuan kereta"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Akses maklumat perbatuan kereta anda."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Kelajuan kereta"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Akses kelajuan kereta anda."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Keadaan dinamik kenderaan"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Akses keadaan dinamik kereta anda"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Saluran penjual kereta"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Akses saluran penjual kereta anda untuk bertukar maklumat khusus kereta."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Radio Kereta"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Akses radio kereta anda."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Unjuran Kereta"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Kelantangan Audio Kereta"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Tetapan Audio Kereta"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Tayangkan antara muka telefon pada paparan kereta."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Tiru HAL kenderaan"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Tiru HAL kenderaan kereta anda untuk tujuan ujian dalaman."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Kawal kelantangan audio kereta anda."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Kawal tetapan audio kereta anda."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Penyekatan aplikasi"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Kawal penyekatan aplikasi semasa memandu."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Pengurus Navigasi"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Laporkan data navigasi ke kluster alatan"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Pemaparan langsung ke kluster alatan"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Benarkan aplikasi mengisytiharkan aktiviti yang akan dipaparkan dalam kluster alatan"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Kawalan kluster alatan"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Lancarkan apl dalam kluster alatan"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Pemaparan Kluster Alatan"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Terima data kluster alatan"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"Konfigurasi Sekatan UX"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"Konfigurasikan Sekatan UX"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Perkhidmatan Input Kereta"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Kendalikan peristiwa input"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"Bas CAN gagal"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"Bas CAN tidak bertindak balas. Cabut dan palamkan kembali kotak unit stereo dan mulakan semula kereta"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"Untuk keselamatan anda, aktiviti ini tidak tersedia semasa memandu.\nUntuk meneruskan, tunggu kereta diberhentikan."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"Untuk bermula semula dengan ciri apl selamat, pilih <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Kembali"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Nyhpepijat"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Data Diagnostik"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Baca data diagnostik daripada kereta"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Data Diagnostik"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Kosongkan data diagnostik daripada kereta"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"Penerbit VMS"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"Terbitkan mesej vms"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"Pelanggan VMS"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"Langgan mesej vms"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Pemantauan storan pemacu kilat"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Pantau penggunaan storan pemacu kilat"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Keadaan Pemanduan"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Dengar Perubahan keadaan pemanduan"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Perincian Enjin"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Akses maklumat enjin terperinci kereta anda"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Port Tenaga"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Akses port tenaga"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Pengenalan kereta"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Akses pengenalan kereta"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Pintu Kereta"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Kawal pintu kereta"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Tingkap Kereta"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Kawal tingkap kereta"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Cermin Kereta"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Kawal cermin kereta"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Tempat Duduk Kereta"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Kawal tempat duduk kereta"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Maklumat asas kereta"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Akses maklumat asas kereta"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Cahaya luar kereta"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Akses keadaan cahaya luar kereta"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Cahaya luar kereta"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Kawal cahaya luar kereta"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Suhu luar kereta"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Akses suhu luar kereta"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Tayar kereta"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Akses maklumat tayar kereta"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Rangkaian Kuasa Kereta"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Akses maklumat rangkaian kuasa kereta"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Kuasa Kereta"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Akses keadaan kuasa kereta"</string>
+</resources>
diff --git a/service/res/values-my/config.xml b/service/res/values-my/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-my/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-my/strings.xml b/service/res/values-my/strings.xml
new file mode 100644
index 0000000..799ece1
--- /dev/null
+++ b/service/res/values-my/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"ကားအချက်အလက်"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"သင့်ကား၏ အချက်အလက်ကို အသုံးပြုပါမည်။"</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"ကားရှေ့ခန်း"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"တံခါးများ၊ ကြည့်မှန်များ၊ ထိုင်ခုံများနှင့် ပြတင်းပေါက်များပါဝင်သည့် သင့်ကား၏ ဆက်စပ်ပစ္စည်းများကို အသုံးပြုပါမည်။"</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"ကားကင်မရာ"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"သင့်ကား၏ ကင်မရာ(များ)ကို ဝင်ရောက်အသုံးပြုပါမည်။"</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"ကား၏ စွမ်းအင်"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"ကား၏ စွမ်းအင်ဆိုင်ရာ အချက်အလက်ကို အသုံးပြုပါမည်။"</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"Car Hvac"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"သင့်ကား၏ \"havc စနစ်\" ကို အသုံးပြုပါမည်။"</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"ကားခရီးမိုင်"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"သင့်ကား၏ ခရီးမိုင်အချက်အလက်ကို အသုံးပြုပါမည်။"</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"ကားအမြန်နှုန်း"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"သင့်ကား၏ အမြန်နှုန်းကို အသုံးပြုပါမည်။"</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"ယာဉ်၏ လှုပ်ရှားမှုစက်အား အခြေအနေ"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"သင့်ကား၏ လှုပ်ရှားမှုစက်အား အခြေအနေကို အသုံးပြုပါမည်"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"ကားရောင်းချသူ ချန်နယ်"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"ကား၏တိကျသည့်အချက်အလက်များကို ဖလှယ်ရန် သင့်ကားအား ရောင်းချသူ၏ချန်နယ်ကို အသုံးပြုပါမည်။"</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"ကားရေဒီယို"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"သင့်ကား၏ ရေဒီယိုကို အသုံးပြုပါမည်။"</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"ကားအား ပုံရိပ်ဖော်ပြသမှု"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"ကားတွင် အသံအတိုးအကျယ်"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"ကားတွင် အသံဆက်တင်များ"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"ကားရှိ မျက်နှာပြင်ပြသမှုပေါ်တွင် ဖုန်းအင်တာဖေ့စ်ကို ဖော်ပြပါမည်။"</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"ယာဉ်၏ \"HAL အလွှာ\" ကို အသွင်ယူလုပ်ဆောင်ရန်"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"အတွင်းပိုင်းစမ်းသပ်မှုဆိုင်ရာ ရည်ရွယ်ချက်အတွက် သင့်ယာဉ်၏ HAL အလွှာကို အသွင်ယူလုပ်ဆောင်ပါမည်။"</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"သင့်ကားတွင် အသံအတိုးအကျယ်ကို ထိမ်းချုပ်သည်။"</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"သင့်ကားတွင် အသံဆက်တင်များကို ထိမ်းချုပ်ပါမည်။"</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"အပလီကေးရှင်းကို ပိတ်ထားခြင်း"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"ကားမောင်းနေစဉ် အပလီကေးရှင်းပိတ်ထားခြင်းကို ထိန်းချုပ်ပါမည်။"</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"လမ်းညွှန်မှု မန်နေဂျာ"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"လမ်းညွှန်ချက်ဒေတာကို ကိရိယာအစုအဝေးထံသို့ သတင်းပို့ပါမည်"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"ကိရိယာပစ္စည်းများ အစုအဝေးကို တိုက်ရိုက်ပြင်ဆင်ခြင်း"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"လုပ်ဆောင်ချက်များကို ကိရိယာအစုအဝေးအတွင်း၌ ပြသရန် အပလီကေးရှင်းတစ်ခုအား ခွင့်ပြုရန်"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"ကိရိယာအစုအဝေး ထိန်းချုပ်စနစ်"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"ကိရိယာအစုအဝေးအတွင်းရှိ အက်ပ်များကို စတင်ရန်"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"ကိရိယာအစုအဝေးကို ပြင်ဆင်ခြင်း"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"ကိရိယာအစုအဝေး ဒေတာကို လက်ခံရန်"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"UX ကန့်သတ်ချက်များ စီစဉ်သတ်မှတ်မှု"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"UX ကန့်သတ်ချက်များကို စီစဉ်သတ်မှတ်ရန်"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"ကား၏ အချက်အလက်ထည့်သွင်းခြင်း ဝန်ဆောင်မှု"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"အချက်အလက်ထည့်သွင်းခြင်း အစီအစဉ်များကို စီမံပါမည်"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"\"CAN bus\" စနစ် အသုံးပြုမှု မအောင်မြင်ပါ"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN bus စနစ်က တုန့်ပြန်မှုမရှိပါ။ စက်အထိုင်ဘောက်စ်ကို ပလတ်ဖြုတ်ပြီး ပြန်တပ်ကာ ကားကို ပြန်လည်စတင်ပါ"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"သင့် လုံခြုံမှုအတွက် ဤလုပ်ဆောင်ချက်ကို ကားမောင်းနေစဉ် အသုံးမပြုနိုင်ပါ။\nဆက်လက်လုပ်ဆောင်ရန် ကားရပ်နားသည်အထိစောင့်ပါ။"</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"စိတ်ချရသော အက်ပ်လုပ်ဆောင်ချက်များနှင့်အတူ အစမှပြန်စရန် <xliff:g id="EXIT_BUTTON">%s</xliff:g> ကို ရွေးချယ်ပါ။"</string>
+ <string name="exit_button" msgid="5829638404777671253">"နောက်သို့"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"တွေ့ရှိမှု"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"စစ်ဆေးတွေ့ရှိသည့် ဒေတာ"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"ကားမှ စစ်ဆေးတွေ့ရှိသည့် ဒေတာကို ဖတ်ရှုပါမည်"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"စစ်ဆေးတွေ့ရှိသည့် ဒေတာ"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"ကားမှ စစ်ဆေးတွေ့ရှိသည့် ရှင်းလင်းပြတ်သားသောဒေတာ"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"VMS ထုတ်ဝေသူ"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"VMS မက်ဆေ့ဂျ်များကို ထုတ်ဝေပါမည်"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"\"VMS \" အတွက် စာရင်းသွင်းသူ"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"VMS မက်ဆေ့ဂျ်များရယူရန်အတွက် စာရင်းသွင်းရန်"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"မြန်နှုန်းမြင့် သိုလှောင်မှုအား စောင့်ကြည့်ခြင်း"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"မြန်နှုန်းမြင့်သိုလှောင်မှုအား အသုံးပြုခြင်းကို စောင့်ကြည့်ပါမည်"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"မောင်းနှင်မှုအခြေအနေ"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"\'မောင်းနှင်မှုဆိုင်ရာ\' အခြေအနေ ပြောင်းလဲမှုများကို နားထောင်ပါမည်"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"အသေးစိတ်ဖော်ပြထားသည့် အင်ဂျင်"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"သင့်ကား၏ အင်ဂျင်ဆိုင်ရာ အသေးစိတ်အချက်အလက်ကို အသုံးပြုပါမည်"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"စွမ်းအင်ပို့တ်များ"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"စွမ်းအင်ပို့တ်များကို အသုံးပြုပါမည်"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"ကား၏ အထောက်အထား"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"ကား၏ အထောက်အထားကို အသုံးပြုပါမည်"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"ကားတံခါးများ"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"ကားပြတင်းပေါက်များကို ထိန်းချုပ်ရန်"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"ကားပြတင်းပေါက်များ"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"သင့်ကား၏ ပြတင်းပေါက်များကို ထိမ်းချုပ်ပါမည်"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"ကားကြည့်မှန်များ"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"ကားကြည့်မှန်များကို ထိန်းချုပ်ပါမည်"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"ကားထိုင်ခုံများ"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"ကားထိုင်ခုံများကို ထိန်းချုပ်ပါမည်"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"ကား၏ အခြေခံအချက်အလက်"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"ကား၏ အခြေခံအချက်အလက်ကို အသုံးပြုပါမည်"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"ကားပြင်ပမီးများ"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"ကားပြင်ပမီးများ၏ အခြေအနေကို အသုံးပြုပါမည်"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"ကားပြင်ပမီးများ"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"ကားပြင်ပမီးများကို ထိမ်းချုပ်ပါမည်"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"ကားပြင်ပ အပူချိန်"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"ကား၏ ပြင်ပအပူချိန်ကို အသုံးပြုပါမည်"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"ကားတာယာများ"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"ကားတာယာ အချက်အလက်ကို အသုံးပြုပါမည်"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"ကား၏ ပင်မစက်အားစီမံမှုစနစ်"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"ကား၏ ပင်မစက်အားစီမံမှုစနစ်ဆိုင်ရာ အချက်အလက်များ အသုံးပြုရန်"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"ကား၏ စက်စွမ်းအား"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"ကား၏ စက်စွမ်းအားအခြေအနေကို အသုံးပြုပါမည်"</string>
+</resources>
diff --git a/service/res/values-nb/config.xml b/service/res/values-nb/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-nb/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-nb/strings.xml b/service/res/values-nb/strings.xml
new file mode 100644
index 0000000..c637b0e
--- /dev/null
+++ b/service/res/values-nb/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Informasjon om bilen"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Tilgang til informasjon om bilen."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Kupé"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Tilgang til bildeler, inkludert dørene, speilene, setene og vinduene."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Bilkamera"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Tilgang til bilens kamera(er)."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Bilens energibruk"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Tilgang til informasjon om bilens energibruk."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"Bilens klimaanlegg"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Tilgang til bilens klimaanlegg."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Bilens kjørelengde"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Tilgang til informasjon om bilens kjørelengde."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Bilens hastighet"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Tilgang til bilens hastighet."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Kjøretøyets dynamiske tilstand"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Tilgang til bilens dynamiske status"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Billeverandør"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Tilgang til billeverandøren for utveksling av informasjon som er spesifikk for bilen."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Bilradio"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Tilgang til bilradioen."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Speiling i bilen"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Lydvolumet i bilen"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Lydinnstillinger i bilen"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Speiling av telefongrensesnittet på skjermen i bilen."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Emulering av kjøretøys-HAL"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Emulering av bilens kjøretøys-HAL for intern testing."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Styring av lydvolumet i bilen."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Styring av lydinnstillingene i bilen."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Appblokkering"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Styring av appblokkering mens du kjører."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Navigeringsadministrering"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Rapportering av navigeringsdata til instrumentpanelet"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Direkte gjengivelse på instrumentpanelet"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Tillatelsestildeling for at apper skal kunne erklære at aktiviteter skal vises på instrumentpanelet"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Styring av instrumentpanelet"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Åpning av apper på instrumentpanelet"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Gjengivelse på instrumentpanelet"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Mottak av data fra instrumentpanelet"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"Konfigurering av begrensninger tilknyttet brukeropplevelsen"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"Konfigurering av begrensninger tilknyttet brukeropplevelsen"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Bilens inndatatjeneste"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Behandling av inndatahendelser"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"CAN-bus mislyktes"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN-bus svarer ikke. Koble bilens hovedenhet ut og inn igjen, og start bilen på nytt"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"Av sikkerhetshensyn er denne aktiviteten utilgjengelig når du kjører.\nDu kan ikke fortsette før du stopper bilen."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"For å starte på nytt med sikre appfunksjoner, velg <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Tilbake"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Diagnostikkdata"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Avlesing av diagnostikkdata fra bilen"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Diagnostikkdata"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Fjerning av diagnostikkdata fra bilen"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"VMS-publisist"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"Publisering av VMS-meldinger"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"VMS-abonnent"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"Oppstart av abonnement på VMS-meldinger"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Overvåking av flash-lagring"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Overvåking av bruk av flash-lagring"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Kjøretilstand"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Lytting etter endringer i kjøretilstanden"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Motordetaljer"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Tilgang til detaljert informasjon om bilmotoren"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Energiporter"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Tilgang til energiporten(e)"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Bilidentifikasjon"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Tilgang til bilens identifikasjon"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Bildører"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Styring av bildørene"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Bilvinduer"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Styring av bilvinduene"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Bilens speil"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Styring av bilens speil"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Bilseter"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Styring av bilsetene"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Grunnleggende informasjon om bilen"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Tilgang til grunnleggende informasjon om bilen"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Bilens utvendige lys"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Tilgang til tilstanden til bilens utvendige lys"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Bilens utvendige lys"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Styring av bilens utvendige lys"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Temperatur utenfor bilen"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Tilgang til temperaturen utenfor bilen"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Bildekk"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Tilgang til informasjon om bildekkene"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Bilens drivlinje"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Tilgang til informasjon om bilens drivlinje"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Bilens tenning"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Tilgang til bilens tenningstilstand"</string>
+</resources>
diff --git a/service/res/values-ne/config.xml b/service/res/values-ne/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-ne/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-ne/strings.xml b/service/res/values-ne/strings.xml
new file mode 100644
index 0000000..bc4ecd3
--- /dev/null
+++ b/service/res/values-ne/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"कारको जानकारी"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"तपाईंको कारको जानकारीमाथि पहुँच राख्ने।"</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"कारको क्याबिन"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"ढोका, ऐना, सिट तथा झ्यालहरूलगायत तपाईंको कारका सामग्रीहरूमाथि पहुँच राख्ने।"</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"कारको क्यामेरा"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"तपाईंको कारका क्यामेरा(हरू) माथि पहुँच राख्ने।"</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"कारको ऊर्जा"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"तपाईंको कारको ऊर्जासम्बन्धी जानकारीमाथि पहुँच राख्ने।"</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"कारको Hvac"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"तपाईंको कारको hvac माथि पहुँच राख्ने।"</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"कारको माइलेज"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"तपाईंको कारको माइलेजसम्बन्धी जानकारीमाथि पहुँच राख्ने।"</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"कारको गति"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"तपाईंको कारको गतिमाथि पहुँच राख्ने।"</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"सवारी साधनको गतिशील स्थिति"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"तपाईंको कारको गतिशील स्थितिमाथि पहुँच राख्ने"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"कार विक्रेताको च्यानल"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"कार विशेष जानकारी आदान प्रदान गर्न तपाईंको कार विक्रेताको च्यानलमाथि पहुँच राख्ने।"</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"कारको रेडियो"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"तपाईंको कारको रेडियोमाथि पहुँच राख्ने।"</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"कारको प्रक्षेपण"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"कारको अडियोको भोल्युम"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"कारको अडियोका सेटिङहरू"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"कारको डिस्प्लेमा फोनको इन्टरफेस देखाउने।"</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"सवारी साधनको HAL को अनुकरण गर्नुहोस्"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"आन्तरिक परीक्षण गर्ने प्रयोजनका लागि तपाईंको कारको सवारी साधन HAL को अनुकरण गर्ने।"</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"तपाईंको कारको अडियोको भोल्युम नियन्त्रण गर्ने।"</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"आफ्नो कारको अडियोसम्बन्धी सेटिङहरू नियन्त्रण गर्नुहोस्।"</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"अनुप्रयोगमाथि रोक लगाउने कार्य"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"सवारी साधन चलाइरहेका बेलामा अनुप्रयोगलाई रोक लगाउने प्रक्रिया नियन्त्रण गर्ने।"</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"नेभिगेसन प्रबन्धक"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"नेभिगेसनसम्बन्धी डेटालाई उपकरणको क्लस्टरमा रिपोर्ट गर्ने"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"उपकरणको क्लस्टरमा प्रत्यक्ष रेन्डर गर्ने प्रक्रिया"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"कुनै अनुप्रयोगलाई उपकरणको क्लस्टरमा देखाइने क्रियाकलापहरूको घोषणा गर्न दिनुहोस्"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"उपकरणको क्लस्टरको नियन्त्रण"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"उपकरणको क्लस्टरमा अनुप्रयोगहरू सुरु गर्नुहोस्"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"उपकरणको क्लस्टर रेन्डर गर्ने प्रक्रिया"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"उपकरणको क्लस्टरको डेटा प्राप्त गर्नुहोस्"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"UX सम्बन्धी प्रतिबन्धहरूको कन्फिगुरेसन"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"UX सम्बन्धी प्रतिबन्धहरू कन्फिगर गर्नुहोस्"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"कारको इनपुट सेवा"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"इनपुट गरिएका कार्यक्रमहरू व्यवस्थापन गर्ने"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"CAN bus असफल भयो"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN bus ले प्रतिक्रिया जनाएन। हेडयुनिट बाकसलाई प्लगबाट निकालेर फेरि प्लगमा घुसाउनुहोस् र कार पुनःसुरु गर्नुहोस्"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"तपाईंको सुरक्षाका लागि, तपाईंले सवारी साधन चलाइरहेका बेलामा यो क्रियाकलाप उपलब्ध हुँदैन।\nजारी राख्न, पार्क नगरुन्जेल पर्खनुहोस्।"</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"अनुप्रयोगका सुरक्षित सुविधाहरूको प्रयोग गरी फेरि सुरु गर्न <xliff:g id="EXIT_BUTTON">%s</xliff:g> चयन गर्नुहोस्।"</string>
+ <string name="exit_button" msgid="5829638404777671253">"पछाडि"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"डिबगसम्बन्धी जानकारी"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"निदानसम्बन्धी डेटा"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"कारको निदानसम्बन्धी डेटा पढ्ने"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"निदानसम्बन्धी डेटा"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"कारको निदानसम्बन्धी डेटा खाली गर्ने"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"VMS प्रकाशक"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"vms सन्देशहरू प्रकाशित गर्ने"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"VMS को सदस्य"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"vms का सन्देशहरूको सदस्यता लिने"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"फ्ल्यास भण्डारणको अनुगमन"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"फ्ल्यास भण्डारणको प्रयोगको अनुगमन गर्ने"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"ड्राइभिङको स्थिति"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"ड्राइभिङको स्थितिमा हुने परिवर्तनहरू सुन्ने"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"इन्जिनका विस्तृत विवरणहरू"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"तपाईंको कारको इन्जिनको विस्तृत जानकारीमाथि पहुँच राख्ने"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"ऊर्जाका पोर्टहरू"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"ऊर्जाका पोर्टहरूमाथि पहुँच राख्ने"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"कारको पहिचानसम्बन्धी जानकारी"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"कारको पहिचानसम्बन्धी जानकारीमाथि पहुँच राख्ने"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"कारका ढोकाहरू"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"कारका ढोकाहरू नियन्त्रण गर्ने"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"कारका झ्यालहरू"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"कारका झ्यालहरू नियन्त्रण गर्ने"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"कारका ऐनाहरू"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"कारका ऐनाहरू नियन्त्रण गर्ने"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"कारका सिटहरू"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"कारका सिटहरू नियन्त्रण गर्ने"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"कारको आधारभूत जानकारी"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"कारको आधारभूत जानकारीमाथि पहुँच राख्ने"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"कारका बाहिरी बत्तीहरू"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"कारका बाहिरी बत्तीहरूको स्थितिमाथि पहुँच राख्ने"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"कारका बाहिरी बत्तीहरू"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"कारका बाहिरी बत्तीहरू नियन्त्रण गर्ने"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"कारको बाहिरी भागको तापक्रम"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"कारको बाहिरी भागको तापक्रममाथि पहुँच राख्ने"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"कारका टायरहरू"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"कारको टायरसम्बन्धी जानकारीमाथि पहुँच राख्ने"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"कारको पावरट्रेन"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"कारको पावरट्रेनसम्बन्धी जानकारीमाथि पहुँच राख्ने"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"कारको ऊर्जा"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"कारको ऊर्जाको स्थितिमाथि पहुँच राख्ने"</string>
+</resources>
diff --git a/service/res/values-night/colors.xml b/service/res/values-night/colors.xml
index 65f8fb1..6f30b68 100644
--- a/service/res/values-night/colors.xml
+++ b/service/res/values-night/colors.xml
@@ -18,17 +18,17 @@
-->
<resources>
<!-- Semi-transparent background color of blocking activity. -->
- <!-- In Call background scrim: black @ 80% -->
- <color name="activity_blocking_activity_background">#cc000000</color>
+ <!-- In Call background scrim: black -->
+ <color name="activity_blocking_activity_background">@android:color/black</color>
<!-- Color of text in blocking activity. -->
<color name="blocking_text">#fff5f5f5</color>
- <!-- Background color of exit button. -->
- <color name="exit_button_background">#ff80cbc4</color>
+ <!-- Background color of button. -->
+ <color name="button_background">#ff80cbc4</color>
- <!-- Color of exit button text. -->
- <color name="exit_button_text">#ff212121</color>
+ <!-- Color of button text. -->
+ <color name="button_text">#ff212121</color>
<!-- Ripple color. -->
<color name="ripple_background">#3dffffff</color>
diff --git a/service/res/values-nl/config.xml b/service/res/values-nl/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-nl/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-nl/strings.xml b/service/res/values-nl/strings.xml
new file mode 100644
index 0000000..5cc1d8f
--- /dev/null
+++ b/service/res/values-nl/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Autogegevens"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Toegang tot gegevens van je auto."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Auto-interieur"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Toegang tot de accessoires van je auto, zoals de deuren, spiegels, stoelen en ramen."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Camera van auto"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Toegang tot de camera(\'s) van je auto."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Energieniveau van auto"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Toegang tot informatie over het energieniveau van je auto."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"HVAC van auto"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Toegang tot de HVAC van je auto."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Brandstofverbruik van auto"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Toegang tot informatie over het brandstofverbruik van je auto."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Snelheid van auto"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Toegang tot de snelheid van je auto."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Dynamische staat van voertuig"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Toegang tot de dynamische staat van je auto"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Leverancierskanaal van auto"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Toegang tot het leverancierskanaal van je auto om autospecifieke informatie uit te wisselen."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Autoradio"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Toegang tot je autoradio."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Projectie van auto"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Audiovolume van auto"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Audio-instellingen voor auto"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Telefooninterface weergeven op display van auto."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Voertuig-HAL emuleren"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"De voertuig-HAL van je auto emuleren voor interne tests"</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Het volume van je auto bedienen."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"De audio-instellingen van je auto bedienen."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"App-blokkering"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"App-blokkering tijdens het rijden bedienen"</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Navigatiebeheer"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Navigatiegegevens rapporteren aan instrumentcluster"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Rechtstreekse weergave naar instrumentcluster"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Een app toestaan om activiteiten te declareren die worden weergegeven in de instrumentcluster"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Instrumentcluster bedienen"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Apps openen in de instrumentcluster"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Weergave instrumentcluster"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Gegevens van instrumentcluster ontvangen"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"Configuratie van beperkingen voor gebruikerservaring"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"Beperkingen voor gebruikerservaring configureren"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Invoerservice van auto"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Invoergebeurtenissen verwerken"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"CAN-bus is mislukt"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN-bus reageert niet. Koppel de hoofdeenheid los en sluit deze vervolgens weer aan. Start de auto daarna opnieuw."</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"Voor jouw veiligheid is deze activiteit niet beschikbaar als je aan het rijden bent.\nJe moet parkeren om door te gaan."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"Selecteer <xliff:g id="EXIT_BUTTON">%s</xliff:g> om opnieuw te beginnen met de veilige app-functies."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Vorige"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Debug-info"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Diagnostische gegevens"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Diagnostische gegevens van de auto lezen"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Diagnostische gegevens"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Diagnostische gegevens van de auto wissen"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"VMS-uitgever"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"VMS-berichten publiceren"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"VMS-abonnee"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"Abonneren op VMS-berichten"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Flash-geheugen controleren"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Gebruik van Flash-geheugen controleren"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Rijstand"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Luisteren naar wijzigingen van de rijstand"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Gedetailleerde informatie over motor"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Toegang tot gedetailleerde informatie over de motor van je auto"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Energiepoorten"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Toegang tot energiepoorten"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Identificatie van auto"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Toegang tot identificatie van je auto"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Autodeuren"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Autodeuren bedienen"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Autoramen"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"De ramen van je auto bedienen"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Autospiegels"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"De spiegels van je auto bedienen"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Autostoelen"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Autostoelen bedienen"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Basisgegevens van auto"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Toegang tot basisgegevens over je auto"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Buitenverlichting van auto"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Toegang tot de staat van de buitenverlichting van je auto"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Buitenverlichting van auto"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Buitenverlichting van je auto bedienen"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Buitentemperatuur van je auto"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Toegang tot de buitentemperatuur van de auto"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Autobanden"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Toegang tot informatie over de banden van je auto"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Powertrain van auto"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Toegang tot informatie over de powertrain van je auto"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Stroom van auto"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Toegang tot de stroomstatus van je auto"</string>
+</resources>
diff --git a/service/res/values-or/config.xml b/service/res/values-or/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-or/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-or/strings.xml b/service/res/values-or/strings.xml
new file mode 100644
index 0000000..5a6b215
--- /dev/null
+++ b/service/res/values-or/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"କାର୍ର ସୂଚନା"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"ଆପଣଙ୍କ କାର୍ର ସୂଚନା ଆକ୍ସେସ୍ କରିପାରେ।"</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"କାର୍ର କ୍ୟାବିନ୍"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"ଆପଣଙ୍କ କାର୍ର ଡୋର୍, ମିରର୍, ସିଟ୍ ଓ ୱିଣ୍ଡୋ ପରି ଆକ୍ସେସରିଗୁଡ଼ିକ ଆକ୍ସେସ୍ କରିପାରେ।"</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"କାର୍ର କ୍ୟାମେରା"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"ଆପଣଙ୍କ କାର୍ର କ୍ୟାମେରା(ଗୁଡ଼ିକ) ଆକ୍ସେସ୍ କରିପାରେ।"</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"କାର୍ର ଶକ୍ତି"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"ଆପଣଙ୍କ କାର୍ର ଶକ୍ତି ସୂଚନା ଆକ୍ସେସ୍ କରିପାରେ।"</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"କାର୍ର Hvac"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"ଆପଣଙ୍କ କାର୍ର hvac ଆକ୍ସେସ୍ କରିପାରେ।"</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"କାର୍ର ମାଇଲେଜ୍"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"ଆପଣଙ୍କ କାର୍ର ମାଇଲେଜ୍ ସୂଚନା ଆକ୍ସେସ୍ କରିପାରେ।"</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"କାର୍ର ସ୍ପିଡ୍"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"ଆପଣଙ୍କ କାର୍ର ସ୍ପିଡ୍ ଆକ୍ସେସ୍ କରିପାରେ।"</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"ଯାନବାହନର ଡାଇନାମିକ୍ ସ୍ଥିତି"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"ଆପଣଙ୍କ କାର୍ର ଡାଇନାମିକ୍ ସ୍ଥିତି ଆକ୍ସେସ୍ କରିପାରେ"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"କାର୍ର ବିକ୍ରେତା ଚ୍ୟାନେଲ୍"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"କାର୍ର ନିର୍ଦ୍ଦିଷ୍ଟ ସୂଚନା ଆଦାନପ୍ରଦାନ କରିବା ପାଇଁ ଆପଣଙ୍କ କାର୍ର ବିକ୍ରେତା ଚ୍ୟାନେଲ୍ ଆକ୍ସେସ୍ କରିପାରେ।"</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"କାର୍ର ରେଡିଓ"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"ଆପଣଙ୍କ କାର୍ର ରେଡିଓ ଆକ୍ସେସ୍ କରିପାରେ।"</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"କାର୍ର ପ୍ରୋଜେକ୍ସନ୍"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"କାର୍ର ଅଡିଓ ଭଲ୍ୟୁମ୍"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"କାର୍ର ଅଡିଓ ସେଟିଂସ୍"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"କାର୍ର ଡିସ୍ପ୍ଲେରେ ଫୋନ୍ ଇର୍ଣ୍ଟଫେସ୍ ଦେଖାଏ।"</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"ଯାନବାହନ HALକୁ ଅନୁକରଣ କରିପାରେ"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"ଇଣ୍ଟର୍ନଲ୍ ପରୀକ୍ଷଣ ଉଦ୍ଦେଶ୍ୟରେ ଆପଣଙ୍କ କାର୍ର ଯାନବାହନ HALକୁ ଅନୁକରଣ କରିପାରେ।"</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"ଆପଣଙ୍କ କାର୍ର ଅଡିଓ ଭଲ୍ୟୁମ୍ ନିୟନ୍ତ୍ରଣ କରିପାରେ।"</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"ଆପଣଙ୍କ କାର୍ର ଅଡିଓ ସେଟିଂସ୍ ନିୟନ୍ତ୍ରଣ କରନ୍ତୁ।"</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"ଆପ୍ଲିକେସନ୍ ବ୍ଲକ୍ କରିବା ପ୍ରକ୍ରିୟା"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"ଡ୍ରାଇଭ୍ କରିବା ସମୟରେ ଆପ୍ଲିକେସନ୍ ବ୍ଲକ୍ କରିବାର ସୁବିଧା ନିୟନ୍ତ୍ରଣ କରିପାରେ।"</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"ନେଭିଗେସନ୍ ପରିଚାଳକ"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"ଇନ୍ଷ୍ଟ୍ରୁମେଣ୍ଟ କ୍ଲଷ୍ଟର୍ରେ ନେଭିଗେସନ୍ ଡାଟାର ରିପୋର୍ଟ କରନ୍ତୁ"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"ଇନ୍ଷ୍ଟ୍ରୁମେଣ୍ଟ କ୍ଲଷ୍ଟର୍ରେ ପ୍ରତ୍ୟକ୍ଷ ରେଣ୍ଡରିଂ"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"ଏକ ଆପ୍ଲିକେସନ୍କୁ ଇନ୍ଷ୍ଟ୍ରୁମେଣ୍ଟ କ୍ଲଷ୍ଟର୍ରେ ପ୍ରଦର୍ଶିତ ହେବାକୁ ଥିବା ଗତିବିଧିକୁ ଘୋଷଣା କରିବାର ଅନୁମତି ଦିଅନ୍ତୁ"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"ଇନ୍ଷ୍ଟ୍ରୁମେଣ୍ଟ କ୍ଲଷ୍ଟର୍ର ନିୟନ୍ତ୍ରଣ"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"ଇନ୍ଷ୍ଟ୍ରୁମେଣ୍ଟ କ୍ଲଷ୍ଟର୍ରେ ଆପ୍ସ ଲଞ୍ଚ କରନ୍ତୁ"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"ଇନ୍ଷ୍ଟ୍ରୁମେଣ୍ଟ କ୍ଲଷ୍ଟର୍ ରେଣ୍ଡରିଂ"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"ଇନ୍ଷ୍ଟ୍ରୁମେଣ୍ଟ କ୍ଲଷ୍ଟର୍ର ଡାଟା ପ୍ରାପ୍ତ କରନ୍ତୁ"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"UX ପ୍ରତିବନ୍ଧତା କନଫିଗ୍ରେଶନ୍"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"UX ପ୍ରତିବନ୍ଧତା କନ୍ଫିଗର୍ କରନ୍ତୁ"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"କାର୍ର ଇନ୍ପୁଟ୍ ସେବା"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"ଇନ୍ପୁଟ୍ ଇଭେଣ୍ଟଗୁଡ଼ିକ ପରିଚାଳନା କରିପାରେ"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"CAN ବସ୍ ବିଫଳ ହେଲା"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN ବସ୍ ପ୍ରତିକ୍ରିୟା ଦେଉନାହିଁ। ହେଡୟୁନିଟ୍ ବାକ୍ସର ପ୍ଲଗ୍ କାଢ଼ି ପୁଣି ଲଗାନ୍ତୁ ଏବଂ କାର୍କୁ ରିଷ୍ଟାର୍ଟ କରନ୍ତୁ"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"ଆପଣଙ୍କ ସୁରକ୍ଷା ପାଇଁ, ଡ୍ରାଇଭିଂ କରିବା ସମୟରେ ଏହି ଗତିବିଧି ଉପଲବ୍ଧ ନାହିଁ।\nଜାରି ରଖିବା ପାଇଁ, ପାର୍କ କରିବା ପର୍ଯ୍ୟନ୍ତ ଅପେକ୍ଷା କରନ୍ତୁ।"</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"ସୁରକ୍ଷିତ ଆପ୍ ବୈଶିଷ୍ଟ୍ୟଗୁଡ଼ିକୁ ନେଇ ପୁଣି ଆରମ୍ଭ କରିବା ପାଇଁ, <xliff:g id="EXIT_BUTTON">%s</xliff:g> ଚୟନ କରନ୍ତୁ।"</string>
+ <string name="exit_button" msgid="5829638404777671253">"ପଛକୁ ଫେରନ୍ତୁ"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"ଡିବଗ୍ ସୂଚନା"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"ଡାଏଗ୍ନୋଷ୍ଟିକ୍ ଡାଟା"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"କାର୍ର ଡାଏଗ୍ନୋଷ୍ଟିକ୍ ଡାଟା ପଢ଼ିପାରେ"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"ଡାଏଗ୍ନୋଷ୍ଟିକ୍ ଡାଟା"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"କାର୍ରୁ ଡାଏଗ୍ନୋଷ୍ଟିକ୍ ଡାଟା ଖାଲି କରନ୍ତୁ"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"VMS ପ୍ରକାଶକ"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"vms ମେସେଜ୍ ମାଧ୍ୟମରେ ପ୍ରକାଶ କରିପାରେ"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"VMS ସଦସ୍ୟ"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"vms ମେସେଜ୍ର ସଦସ୍ୟତା ନେଇପାରେ"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"ଫ୍ଲାସ୍ ଷ୍ଟୋରେଜ୍କୁ ନିରୀକ୍ଷଣ କରିପାରେ"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"ଫ୍ଲାସ୍ ଷ୍ଟୋରେଜ୍ର ବ୍ୟବହାରକୁ ନିରୀକ୍ଷଣ କରିପାରେ"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"ଡ୍ରାଇଭିଂ କରିବା ସମୟରେ ସ୍ଥିତି"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"ଡ୍ରାଇଭିଂ କରିବା ସମୟରେ ସ୍ଥିତିରେ ହେଉଥିବା ପରିବର୍ତ୍ତନ ଉପରେ ନଜର ରଖିପାରେ"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"ଇଞ୍ଜିନ୍ର ବିସ୍ତୃତ ବିବରଣୀ"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"ଆପଣଙ୍କ କାର୍ର ବିସ୍ତୃତ ଇଞ୍ଜିନ୍ ସୂଚନା ଆକ୍ସେସ୍ କରିପାରେ"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"ଶକ୍ତି ପୋର୍ଟ"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"ଶକ୍ତି ପୋର୍ଟ ଆକ୍ସେସ୍ କରିପାରେ"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"କାର୍ର ଚିହ୍ନଟକରଣ"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"କାର୍ର ଚିହ୍ନଟକରଣ ଆକ୍ସେସ୍ କରିପାରେ"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"କାର୍ର ଡୋର୍"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"କାର୍ର ଡୋର୍ ନିୟନ୍ତ୍ରଣ କରିପାରେ"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"କାର୍ର ୱିଣ୍ଡୋ"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"କାର୍ର ୱିଣ୍ଡୋ ନିୟନ୍ତ୍ରଣ କରିପାରେ"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"କାର୍ର ମିରର୍"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"କାର୍ର ମିରର୍ ନିୟ୍ନନ୍ତ୍ରଣ କରିପାରେ"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"କାର୍ର ସିଟ୍"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"କାର୍ର ସିଟ୍ ନିୟନ୍ତ୍ରଣ କରିପାରେ"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"କାର୍ର ମୌଳିକ ସୂଚନା"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"କାର୍ର ମୌଳିକ ସୂଚନା ଆକ୍ସେସ୍ କରିପାରେ"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"କାର୍ର ବାହାରପଟର ଲାଇଟ୍"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"କାର୍ର ବାହାରପଟର ଲାଇଟ୍ର ସ୍ଥିତି ଆକ୍ସେସ୍ କରିପାରେ"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"କାର୍ର ବାହାରପଟର ଲାଇଟ୍"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"କାର୍ର ବାହାରପଟର ଲାଇଟ୍ ନିୟନ୍ତ୍ରଣ କରିପାରେ"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"କାର୍ର ବାହାରପଟର ତାପାମାତ୍ରା"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"କାର୍ର ବାହାରପଟର ତାପମାତ୍ରା ଆକ୍ସେସ୍ କରେ"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"କାର୍ର ଟାୟାର୍"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"କାର୍ର ଟାୟାର୍ର ସୂଚନା ଆକ୍ସେସ୍ କରିପାରେ"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"କାର୍ର ପାୱାର୍ଟ୍ରେନ୍"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"କାର୍ର ପାୱାର୍ଟ୍ରେନ୍ର ସୂଚନା ଆକ୍ସେସ୍ କରିପାରେ"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"କାର୍ର ପାୱାର୍"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"କାର୍ର ପାୱାର୍ ସ୍ଥିତି ଆକ୍ସେସ୍ କରିପାରେ"</string>
+</resources>
diff --git a/service/res/values-pa/config.xml b/service/res/values-pa/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-pa/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-pa/strings.xml b/service/res/values-pa/strings.xml
new file mode 100644
index 0000000..4013b25
--- /dev/null
+++ b/service/res/values-pa/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"ਕਾਰ ਦੀ ਜਾਣਕਾਰੀ"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"ਤੁਹਾਡੀ ਕਾਰ ਦੀ ਜਾਣਕਾਰੀ ਤੱਕ ਪਹੁੰਚ"</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"ਕਾਰ ਦਾ ਕੈਬਿਨ"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"ਦਰਵਾਜ਼ੇ, ਸ਼ੀਸ਼ੇ, ਸੀਟਾਂ ਅਤੇ ਤਾਕੀਆਂ ਸਮੇਤ ਤੁਹਾਡੀ ਕਾਰ ਦੇ ਉਪਸਾਧਨਾਂ ਤੱਕ ਪਹੁੰਚ।"</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"ਕਾਰ ਦਾ ਕੈਮਰਾ"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"ਤੁਹਾਡੀ ਕਾਰ ਦੇ ਕੈਮਰੇ ਤੱਕ ਪਹੁੰਚ।"</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"ਕਾਰ ਊਰਜਾ"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"ਤੁਹਾਡੀ ਕਾਰ ਦੀ ਊਰਜਾ ਸੰਬੰਧੀ ਜਾਣਕਾਰੀ ਤੱਕ ਪਹੁੰਚ।"</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"ਕਾਰ ਦਾ Hvac ਸਿਸਟਮ"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"ਤੁਹਾਡੀ ਕਾਰ ਦੇ hvac ਸਿਸਟਮ ਤੱਕ ਪਹੁੰਚ।"</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"ਕਾਰ ਮਾਈਲੇਜ"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"ਤੁਹਾਡੀ ਕਾਰ ਦੀ ਮਾਈਲੇਜ ਜਾਣਕਾਰੀ ਤੱਕ ਪਹੁੰਚ।"</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"ਕਾਰ ਦੀ ਗਤੀ"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"ਤੁਹਾਡੀ ਕਾਰ ਦੀ ਗਤੀ ਤੱਕ ਪਹੁੰਚ।"</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"ਵਾਹਨ ਦੀ ਗਤੀ ਦੀ ਸਥਿਤੀ"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"ਤੁਹਾਡੀ ਕਾਰ ਦੀ ਗਤੀ ਦੀ ਸਥਿਤੀ ਤੱਕ ਪਹੁੰਚ"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"ਕਾਰ ਵਿਕਰੇਤਾ ਚੈਨਲ"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"ਕਾਰ ਦੀ ਖਾਸ ਜਾਣਕਾਰੀ ਦੇ ਵਟਾਂਦਰੇ ਲਈ ਤੁਹਾਡੀ ਕਾਰ ਦੇ ਵਿਕਰੇਤਾ ਚੈਨਲ ਤੱਕ ਪਹੁੰਚ।"</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"ਕਾਰ ਦਾ ਰੇਡੀਓ"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"ਤੁਹਾਡੀ ਕਾਰ ਦੇ ਰੇਡੀਓ ਤੱਕ ਪਹੁੰਚ।"</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"ਕਾਰ ਦੀ ਯੋਜਨਾਬੰਦੀ"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"ਕਾਰ ਦੇ ਆਡੀਓ ਦੀ ਅਵਾਜ਼"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"ਕਾਰ ਦੀਆਂ ਆਡੀਓ ਸੈਟਿੰਗਾਂ"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"ਕਾਰ ਡਿਸਪਲੇ \'ਤੇ ਫ਼ੋਨ ਇੰਟਰਫੇਸ ਪ੍ਰੋਜੈਕਟ।"</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"ਵਾਹਨ HAL ਦੀ ਨਕਲ ਕਰੋ"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"ਅੰਦਰੂਨੀ ਜਾਂਚ ਦੇ ਉਦੇਸ਼ ਲਈ ਤੁਹਾਡੀ ਕਾਰ ਦੇ ਵਾਹਨ HAL ਦੀ ਨਕਲ।"</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"ਤੁਹਾਡੀ ਕਾਰ ਦੇ ਆਡੀਓ ਦੀ ਅਵਾਜ਼ ਨੂੰ ਕੰਟਰੋਲ।"</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"ਆਪਣੀ ਕਾਰ ਦੀਆਂ ਆਡੀਓ ਸੈਟਿੰਗਾਂ ਨੂੰ ਕੰਟਰੋਲ ਕਰੋ।"</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"ਐਪਲੀਕੇਸ਼ਨ ਬਲਾਕਿੰਗ"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"ਗੱਡੀ ਚਲਾਉਣ ਵੇਲੇ ਐਪਲੀਕੇਸ਼ਨ ਬਲਾਕਿੰਗ \'ਤੇ ਕੰਟਰੋਲ।"</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"ਨੈਵੀਗੇਸ਼ਨ ਪ੍ਰਬੰਧਕ"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"ਇੰਸਟਰੂਮੈਂਟ ਕਲੱਸਟਰ ਨੂੰ ਨੈਵੀਗੇਸ਼ਨ ਡਾਟੇ ਦੀ ਰਿਪੋਰਟ"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"ਇੰਸਟਰੂਮੈਂਟ ਕਲੱਸਟਰ \'ਤੇ ਸਿੱਧੀ ਰੈਂਡਰਿੰਗ"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"ਕਿਸੇ ਐਪ ਨੂੰ ਇੰਸਟਰੂਮੈਂਟ ਕਲੱਸਟਰ ਵਿੱਚ ਦਿਖਣ ਵਾਲੀਆਂ ਸਰਗਰਮੀਆਂ ਦੀ ਘੋਸ਼ਣਾ ਕਰਨ ਦਿਓ"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"ਇੰਸਟਰੂਮੈਂਟ ਕਲੱਸਟਰ ਕੰਟਰੋਲ"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"ਇੰਸਟਰੂਮੈਂਟ ਕਲੱਸਟਰ ਵਿੱਚ ਐਪਾਂ ਲਾਂਚ ਕਰੋ"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"ਇੰਸਟਰੂਮੈਂਟ ਕਲੱਸਟਰ ਰੈਂਡਰਿੰਗ"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"ਇੰਸਟਰੂਮੈਂਟ ਕਲੱਸਟਰ ਡਾਟਾ ਪ੍ਰਾਪਤ ਕਰੋ"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"UX ਪਾਬੰਦੀਆਂ ਦਾ ਸੰਰੂਪਣ"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"UX ਪਾਬੰਦੀਆਂ ਦਾ ਸੰਰੂਪਣ ਕਰੋ"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"ਕਾਰ ਇਨਪੁੱਟ ਸਰਵਿਸ"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"ਇਨਪੁੱਟ ਇਵੈਂਟਾਂ ਦੀ ਸੰਭਾਲ"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"CAN ਬੱਸ ਅਸਫਲ ਰਹੀ"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN ਬੱਸ ਕੰਮ ਨਹੀਂ ਕਰਦੀ। ਹੈੱਡ ਯੂਨਿਟ ਬਾਕਸ ਨੂੰ ਅਨਪਲੱਗ ਕਰੋ ਅਤੇ ਦੁਬਾਰਾ ਪਲੱਗ ਲਗਾ ਕੇ ਕਾਰ ਨੂੰ ਮੁੜ-ਚਾਲੂ ਕਰੋ"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"ਤੁਹਾਡੀ ਸੁਰੱਖਿਆ ਲਈ, ਗੱਡੀ ਚਲਾਉਣ ਵੇਲੇ ਇਹ ਸਰਗਰਮੀ ਉਪਲਬਧ ਨਹੀਂ ਹੈ।\nਜਾਰੀ ਰੱਖਣ ਲਈ, ਗੱਡੀ ਰੋਕਣ ਤੱਕ ਉਡੀਕ ਕਰੋ।"</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"ਸੁਰੱਖਿਅਤ ਐਪ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨਾਲ ਮੁੜ ਤੋਂ ਸ਼ੁਰੂ ਕਰਨ ਲਈ, <xliff:g id="EXIT_BUTTON">%s</xliff:g> ਚੁਣੋ।"</string>
+ <string name="exit_button" msgid="5829638404777671253">"ਪਿੱਛੇ"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"ਡੀਬੱਗ ਜਾਣਕਾਰੀ"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"ਤਸ਼ਖੀਸੀ ਡਾਟਾ"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"ਕਾਰ ਦਾ ਤਸ਼ਖੀਸੀ ਡਾਟਾ ਪੜ੍ਹੋ"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"ਤਸ਼ਖੀਸੀ ਡਾਟਾ"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"ਕਾਰ ਦਾ ਤਸ਼ਖੀਸੀ ਡਾਟਾ ਕਲੀਅਰ ਕਰਨਾ"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"VMS ਪ੍ਰਕਾਸ਼ਕ"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"vms ਸੁਨੇਹੇ ਪ੍ਰਕਾਸ਼ਿਤ"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"VMS ਗਾਹਕ"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"vms ਸੁਨੇਹੇ ਗਾਹਕੀ ਲਓ"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"ਫਲੈਸ਼ ਸਟੋਰੇਜ ਦਾ ਨਿਰੀਖਣ"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"ਫਲੈਸ਼ ਸਟੋਰੇਜ ਵਰਤੋਂ ਦਾ ਨਿਰੀਖਣ"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"ਗੱਡੀ ਚਲਾਉਣ ਦੀ ਸਥਿਤੀ"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"ਗੱਡੀ ਚਲਾਉਣ ਵੇਲੇ ਸਥਿਤੀ ਵਿੱਚ ਹੋਣ ਵਾਲੀਆਂ ਤਬਦੀਲੀਆਂ ਨੂੰ ਸੁਣੋ"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"ਇੰਜਣ ਦੇ ਵੇਰਵੇ"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"ਤੁਹਾਡੀ ਕਾਰ ਦੇ ਇੰਜਣ ਦੀ ਵੇਰਵੇ ਸਹਿਤ ਜਾਣਕਾਰੀ ਤੱਕ ਪਹੁੰਚ"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"ਊਰਜਾ ਪੋਰਟ"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"ਊਰਜਾ ਪੋਰਟਾਂ ਤੱਕ ਪਹੁੰਚ"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"ਕਾਰ ਦੀ ਪਛਾਣ"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"ਕਾਰ ਦੀ ਪਛਾਣ ਤੱਕ ਪਹੁੰਚ"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"ਕਾਰ ਦੇ ਦਰਵਾਜ਼ੇ"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"ਕਾਰ ਦੇ ਦਰਵਾਜ਼ਿਆਂ \'ਤੇ ਕੰਟਰੋਲ"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"ਕਾਰ ਦੀਆਂ ਤਾਕੀਆਂ"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"ਕਾਰ ਦੀਆਂ ਤਾਕੀਆਂ \'ਤੇ ਕੰਟਰੋਲ"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"ਕਾਰ ਦੇ ਸ਼ੀਸ਼ੇ"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"ਕਾਰ ਦੇ ਸ਼ੀਸ਼ਿਆਂ \'ਤੇ ਕੰਟਰੋਲ"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"ਕਾਰ ਦੀਆਂ ਸੀਟਾਂ"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"ਕਾਰ ਦੀਆਂ ਸੀਟਾਂ \'ਤੇ ਕੰਟਰੋਲ"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"ਕਾਰ ਦੀ ਮੁੱਢਲੀ ਜਾਣਕਾਰੀ"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"ਕਾਰ ਦੀ ਮੁੱਢਲੀ ਜਾਣਕਾਰੀ ਤੱਕ ਪਹੁੰਚ"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"ਕਾਰ ਦੀਆਂ ਬਾਹਰੀ ਲਾਈਟਾਂ"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"ਕਾਰ ਦੀਆਂ ਬਾਹਰੀ ਲਾਈਟਾਂ ਦੀ ਸਥਿਤੀ ਤੱਕ ਪਹੁੰਚ"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"ਕਾਰ ਦੀਆਂ ਬਾਹਰੀ ਲਾਈਟਾਂ"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"ਕਾਰ ਦੀਆਂ ਬਾਹਰੀ ਲਾਈਟਾਂ \'ਤੇ ਕੰਟਰੋਲ"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"ਕਾਰ ਦਾ ਬਾਹਰੀ ਤਾਪਮਾਨ"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"ਕਾਰ ਦੇ ਬਾਹਰੀ ਤਾਪਮਾਨ ਤੱਕ ਪਹੁੰਚ"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"ਕਾਰ ਦੇ ਟਾਇਰ"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"ਕਾਰ ਦੇ ਟਾਇਰ ਸੰਬੰਧੀ ਜਾਣਕਾਰੀ ਤੱਕ ਪਹੁੰਚ"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"ਕਾਰ ਦੀ ਪਾਵਰਟ੍ਰੇਨ"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"ਕਾਰ ਦੀ ਪਾਵਰਟ੍ਰੇਨ ਜਾਣਕਾਰੀ ਤੱਕ ਪਹੁੰਚ"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"ਕਾਰ ਦੀ ਪਾਵਰ"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"ਕਾਰ ਦੀ ਪਾਵਰ ਸਥਿਤੀ ਤੱਕ ਪਹੁੰਚ"</string>
+</resources>
diff --git a/service/res/values-pl/config.xml b/service/res/values-pl/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-pl/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-pl/strings.xml b/service/res/values-pl/strings.xml
new file mode 100644
index 0000000..ee933bc
--- /dev/null
+++ b/service/res/values-pl/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Informacje o samochodzie"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Dostęp do informacji o samochodzie."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Wnętrze samochodu"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Dostęp do wyposażenia samochodu, w tym drzwi, lusterek, foteli i szyb."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Kamera samochodu"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Dostęp do kamer samochodu."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Zasilanie w samochodzie"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Dostęp do informacji o zasilaniu w samochodzie."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"System sterowania temperaturą w samochodzie"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Dostęp do systemu sterowania temperaturą w samochodzie."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Przebieg samochodu"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Dostęp do informacji o przebiegu samochodu."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Informacje o prędkości samochodu"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Dostęp do informacji o prędkości samochodu."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Parametry jezdne pojazdu"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Dostęp do parametrów jezdnych samochodu"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Kanał sprzedawcy samochodu"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Dostęp do kanału sprzedawcy samochodu i możliwość wymiany informacji o danym samochodzie."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Radio samochodowe"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Dostęp do radia samochodowego."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Wyświetlanie treści w samochodzie"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Głośność dźwięku w samochodzie"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Ustawienia dźwięku w samochodzie"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Wyświetlanie interfejsu telefonu na wyświetlaczu w samochodzie."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Emulowanie interfejsu HAL pojazdu"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Emulowanie interfejsu HAL samochodu na potrzeby testów wewnętrznych."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Sterowanie głośnością dźwięku w samochodzie."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Sterowanie ustawieniami dźwięku w samochodzie."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Blokowanie aplikacji"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Sterowanie blokowaniem aplikacji podczas jazdy."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Menedżer nawigacji"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Raportowanie danych nawigacyjnych w klastrze przyrządów"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Renderowanie bezpośrednio w klastrze przyrządów"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Zezwolenie na deklarowanie przez aplikację wyświetlania aktywności w klastrze przyrządów"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Sterowanie klastrem przyrządów"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Uruchamianie aplikacji w klastrze przyrządów"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Renderowanie w klastrze przyrządów"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Otrzymywanie danych o klastrze przyrządów"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"Konfiguracja ograniczeń UX"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"Konfigurowanie ograniczeń UX"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Usługa wprowadzania danych w samochodzie"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Obsługa zdarzeń wprowadzania danych"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"Błąd magistrali CAN"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"Magistrala CAN nie odpowiada. Odłącz i jeszcze raz podłącz moduł główny i ponownie uruchom samochód."</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"Dla Twojego bezpieczeństwa ta funkcja jest wyłączona podczas jazdy.\nAby jej użyć, zaparkuj samochód."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"Aby jeszcze raz przejść do funkcji bezpieczeństwa w aplikacji, wybierz <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Wstecz"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Dane debugowania"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Dane diagnostyczne"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Odczytywanie danych diagnostycznych samochodu"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Dane diagnostyczne"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Usuwanie danych diagnostycznych z samochodu"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"Wydawca komunikatów VMS"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"Wysyłanie komunikatów VMS"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"Subskrypcja komunikatów VMS"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"Subskrybowanie komunikatów VMS"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Monitorowanie pamięci flash"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Monitorowanie użycia pamięci flash"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Jazda samochodem"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Nasłuchiwanie zmian podczas jazdy samochodem"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Szczegółowe informacje o silniku"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Dostęp do szczegółowych informacji o silniku"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Porty zasilania"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Dostęp do portów zasilania"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Dane identyfikacyjne samochodu"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Dostęp do danych identyfikacyjnych samochodu"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Drzwi samochodu"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Sterowanie drzwiami samochodu"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Szyby w samochodzie"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Sterowanie szybami w samochodzie"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Lusterka samochodu"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Sterowanie lusterkami samochodu"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Fotele samochodowe"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Sterowanie fotelami samochodowymi"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Podstawowe informacje o samochodzie"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Dostęp do podstawowych informacji o samochodzie"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Zewnętrzne światła samochodu"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Dostęp do stanu zewnętrznych świateł samochodu"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Zewnętrzne światła samochodu"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Sterowanie zewnętrznymi światłami samochodu"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Temperatura na zewnątrz samochodu"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Dostęp do pomiarów temperatury na zewnątrz samochodu"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Opony samochodu"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Dostęp do informacji o oponach samochodu"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Zespół napędowy samochodu"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Dostęp do informacji o zespole napędowym samochodu"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Zasilanie w samochodzie"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Dostęp do stanu zasilania w samochodzie"</string>
+</resources>
diff --git a/service/res/values-pt-rPT/config.xml b/service/res/values-pt-rPT/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-pt-rPT/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-pt-rPT/strings.xml b/service/res/values-pt-rPT/strings.xml
new file mode 100644
index 0000000..4d7f371
--- /dev/null
+++ b/service/res/values-pt-rPT/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Informações do automóvel"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Aceda às informações do seu automóvel."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Cabine do automóvel"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Aceda aos acessórios do automóvel, incluindo portas, espelhos, assentos e janelas."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Câmara do automóvel"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Aceda à(s) câmara(s) do automóvel."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Energia do automóvel"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Aceda às informações de energia do automóvel."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"AVAC do automóvel"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Aceda ao AVAC do automóvel."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Quilometragem do automóvel"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Aceda às informações de quilometragem do automóvel."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Velocidade do automóvel"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Aceda à velocidade do seu automóvel."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Estado dinâmico do automóvel"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Aceda ao estado dinâmico do automóvel."</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Canal do fabricante do automóvel"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Aceda ao canal do fabricante do seu automóvel para trocar informações específicas do automóvel."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Rádio do automóvel"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Aceda ao rádio do automóvel."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Projeção do automóvel"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Volume do áudio do automóvel"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Definições de áudio do automóvel"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Projete a interface do telemóvel no ecrã do automóvel."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Emular a HAL do veículo"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Emule a HAL do veículo automóvel para fins de testes internos."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Controle o volume do áudio do automóvel."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Controle as definições de áudio do automóvel."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Bloqueio de aplicações"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Controle o bloqueio de aplicações enquanto estiver a conduzir."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Gestor de navegação"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Comunique os dados de navegação para o cluster do instrumento."</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Renderização direta para o cluster do instrumento"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Permita que uma aplicação declare atividades a apresentar no cluster do instrumento."</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Controlo do cluster do instrumento"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Inicie aplicações no cluster do instrumento."</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Renderização do cluster do instrumento"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Receba os dados do cluster do instrumento."</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"Configuração das restrições da experiência do utilizador"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"Configure restrições da experiência do utilizador."</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Serviço de entrada do automóvel"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Processe eventos de entrada."</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"Falha no CAN bus."</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"O CAN bus não responde. Desligue e volte a ligar a caixa da unidade principal e reinicie o automóvel."</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"Para sua segurança, esta atividade não está disponível enquanto estiver a conduzir.\nPode continuar após estacionar."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"Para começar de novo com funcionalidades de aplicações seguras, selecione <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Anterior"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Informações de depuração"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Dados de diagnóstico"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Leia os dados de diagnóstico do automóvel."</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Dados de diagnóstico"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Limpe os dados de diagnóstico do automóvel."</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"Publicador de VMS"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"Publique mensagens VMS."</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"Subscritor de VMS"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"Subscreva as mensagens VMS."</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Monitorização do armazenamento flash"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Monitorize a utilização do armazenamento flash."</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Estado: condução"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Ouça as alterações no estado Condução."</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Motor detalhado"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Aceda às informações detalhadas do motor do automóvel."</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Portas de energia"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Aceda às portas de energia."</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Identificação do automóvel"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Aceda à identificação do automóvel."</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Portas do automóvel"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Controle as portas do automóvel."</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Janelas do automóvel"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Controle as janelas do automóvel."</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Espelhos do automóvel"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Controle os espelhos do automóvel."</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Assentos do automóvel"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Controle os assentos do automóvel."</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Informações básicas do automóvel"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Aceda às informações básicas do automóvel."</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Luzes exteriores do automóvel"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Aceda ao estado das luzes exteriores do automóvel."</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Luzes exteriores do automóvel"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Controle as luzes exteriores do automóvel."</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Temperatura exterior do automóvel"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Aceda à temperatura exterior do automóvel."</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Pneus do automóvel"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Aceda às informações dos pneus do automóvel."</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Grupo motopropulsor do automóvel"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Aceda às informações do grupo motopropulsor do automóvel."</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Energia do automóvel"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Aceda ao estado de energia do automóvel."</string>
+</resources>
diff --git a/service/res/values-pt/config.xml b/service/res/values-pt/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-pt/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-pt/strings.xml b/service/res/values-pt/strings.xml
new file mode 100644
index 0000000..f8bc655
--- /dev/null
+++ b/service/res/values-pt/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Informações do carro"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Acessar as informações do carro."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Cabine do carro"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Acessar os acessórios do carro, inclusive portas, espelhos, bancos e janelas."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Câmera do carro"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Acessar câmeras do carro."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Abastecimento do carro"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Acessar informações de abastecimento do carro."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"HVAC (Aquecimento, ventilação e ar condicionado) do carro"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Acessar o HVAC (Aquecimento, ventilação e ar condicionado) do carro."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Quilometragem do carro"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Acessar informações sobre a quilometragem do carro."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Velocidade do carro"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Acessar a velocidade do carro."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Estado dinâmico do veículo"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Acessar estado dinâmico do carro"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Canal do fornecedor do carro"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Acessar o canal do fornecedor do carro para trocar informações específicas sobre o veículo."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Rádio do carro"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Acessar áudio do carro."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Projeção do carro"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Volume do áudio do carro"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Configurações de áudio do carro"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Projetar interface do smartphone na tela do carro."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Emular camada de abstração de hardware (HAL, na sigla em inglês) do veículo"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Emular camada de abstração de hardware (HAL, na sigla em inglês) do carro para fins de testes internos."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Controlar volume do áudio do carro."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Controlar configurações de áudio do carro."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Bloqueio de app"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Controlar bloqueio de app ao dirigir."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Gerenciador de navegação"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Enviar dados de navegação para o cluster de instrumento"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Renderização direta para cluster de instrumento"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Permitir que um app determine a exibição de atividades no cluster de instrumento"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Controle do cluster de instrumento"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Iniciar apps no cluster de instrumento"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Renderização de cluster de instrumento"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Receber dados do cluster de instrumento"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"Configuração das restrições de UX"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"Configurar restrições de UX"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Serviço de entrada do carro"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Gerenciar eventos de entrada"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"Falha no barramento CAN"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"O barramento CAN parou de responder. Desconecte e conecte novamente a caixa da unidade principal, depois ligue o carro"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"Para sua segurança, essa atividade não está disponível enquanto você dirige.\nPara continuar, aguarde até estacionar."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"Para reiniciar o app com recursos de segurança, selecione <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Voltar"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Info de depuração"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Dados de diagnóstico"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Ler dados de diagnóstico do carro"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Dados de diagnóstico"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Limpar dados de diagnóstico do carro"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"Editor de VMS"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"Publicar mensagens de VMS"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"Inscrição em VMS"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"Inscrever-se em mensagens de VMS"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Monitoramento do armazenamento flash"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Monitorar uso do armazenamento flash"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Estado de condução"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Ouvir quando o estado de condução for alterado"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Informações detalhadas do motor"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Acessar informações detalhadas do motor do carro"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Entradas de combustível"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Acessar entradas de abastecimento"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Identificação do carro"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Acessar identificação do carro"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Portas do carro"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Controlar portas do carro"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Janelas do carro"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Controlar janelas do carro"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Espelhos do carro"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Controlar espelhos do carro"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Bancos do carro"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Controlar bancos do carro"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Informações básicas do carro"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Acessar informações básicas do carro"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Luzes externas do carro"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Acessar estado das luzes externas do carro"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Luzes externas do carro"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Controlar as luzes externas do carro"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Temperatura externa do carro"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Acessar temperatura externa do carro"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Pneus do carro"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Acessar informações dos pneus do carro"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Sistema de transmissão do carro"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Informações sobre o sistema de transmissão do carro"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Potência do carro"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Acessar estado da potência do carro"</string>
+</resources>
diff --git a/service/res/values-ro/config.xml b/service/res/values-ro/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-ro/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-ro/strings.xml b/service/res/values-ro/strings.xml
new file mode 100644
index 0000000..78e5384
--- /dev/null
+++ b/service/res/values-ro/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Accesează informațiile despre mașină"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Accesează informațiile despre mașină."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Controlează cabina mașinii"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Accesează accesoriile mașinii, inclusiv ușile, oglinzile, locurile și geamurile."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Controlează camera mașinii"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Accesează camerele mașinii."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Accesează informațiile despre energia mașinii"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Accesează informațiile despre energie ale mașinii."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"Controlează sistemul Hvac al mașinii"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Accesează sistemul hvac al mașinii."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Accesează kilometrajul mașinii"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Accesează informațiile despre kilometrajul mașinii."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Accesează viteza mașinii"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Accesează viteza mașinii"</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Accesează starea dinamică a vehiculului"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Accesează starea dinamică a mașinii"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Accesează canalul furnizorului auto"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Accesați canalul furnizorului auto pentru a face schimb de informații specifice mașinii."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Controlează radioul mașinii"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Accesează radioul mașinii."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Controlează proiecția mașinii"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Controlează volumul audio din mașină"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Setările audio pentru mașină"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Accesează interfața telefonică a proiectului pe ecranul din mașină."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Imitați nivelul HAL al vehiculului"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Imită nivelul HAL al mașinii pentru testare internă."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Controlează volumul audio din mașină."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Controlați setările audio ale mașinii"</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Blocarea aplicațiilor"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Controlează blocarea aplicațiilor în timp ce conduceți."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Manager de navigare"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Raportează datele de navigare la grupul de instrumente"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Redare directă pe grupul de instrumente"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Permiteți unei aplicații să declare activitățile de afișat în grupul de instrumente"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Control pentru grupul de instrumente"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Lansați aplicațiile din grupul de instrumente"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Redarea grupurilor de instrumente"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Primiți date despre grupul de instrumente"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"Configurarea restricțiilor UX"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"Configurați restricțiile UX"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Gestionează serviciul de intrare pentru mașină"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Gestionează evenimentele de intrare"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"Magistrala CAN nu a reușit"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"Magistrala CAN nu răspunde. Deconectați și reconectați unitatea radio, apoi reporniți mașina"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"Pentru siguranța dvs., activitatea nu este disponibilă în timp ce conduceți.\nCa să continuați, așteptați să parcați."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"Pentru a începe din nou cu funcțiile pentru aplicații sigure, selectați <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Înapoi"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Informații de remediere a erorilor"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Controlează datele de diagnosticare"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Citește datele de diagnosticare de la mașină"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Controlează datele de diagnosticare"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Șterg datele de diagnosticare despre mașină"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"Publică date VMS"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"Publică mesaje vms"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"Se abonează la datele VMS"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"Se abonează la mesajele vms"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Monitorizează stocarea Flash"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Monitorizează utilizarea stocării flash"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Starea La volan"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Ascultă modificările stării La volan"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Citesc data curățării motorului"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Accesează informațiile detaliate despre motorul mașinii"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Accesează porturile de energie"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Accesează porturile de energie"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Accesează identificarea mașinii"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Accesează identificarea mașinii"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Controlează portierele mașinii"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Controlează portierele mașinii"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Controlează geamurile mașinii"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Controlează geamurile mașinii"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Controlează oglinzile mașinii"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Controlează oglinzile mașinii"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Controlează locurile din mașină"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Controlează locurile din mașină"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Citesc informații de bază despre mașină"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Accesează informațiile de bază ale mașinii"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Controlează luminile exterioare ale mașinii"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Accesează starea luminilor exterioare ale mașinii"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Controlează luminile exterioare ale mașinii"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Controlează luminile exterioare ale mașinii"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Temperatura exterioară a mașinii"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Accesează temperatura exterioară a mașinii"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Anvelopele mașinii"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Accesează informațiile despre anvelopele mașinii"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Citește informațiile din Powertrain"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Accesează informațiile powertrain ale mașinii"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Informații despre starea de încărcare a mașinii"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Accesează starea de încărcare a mașinii"</string>
+</resources>
diff --git a/service/res/values-ru/config.xml b/service/res/values-ru/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-ru/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-ru/strings.xml b/service/res/values-ru/strings.xml
new file mode 100644
index 0000000..b60a37a
--- /dev/null
+++ b/service/res/values-ru/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Данные автомобиля"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Предоставить приложению доступ к данным автомобиля"</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Салон"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Доступ к элементам кузова и салона, таким как двери, зеркала, окна и сиденья"</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Камера автомобиля"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Доступ к камерам автомобиля"</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Энергоресурсы"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Доступ к данным об энергоресурсах автомобиля"</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"ОВиК"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Доступ к системе ОВиК"</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Пробег"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Доступ к данным о пробеге автомобиля"</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Скорость автомобиля"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Доступ к данным о скорости автомобиля"</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Данные о динамике автомобиля"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Доступ к данным о динамике автомобиля"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Фирменный канал связи"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Доступ к фирменному каналу связи для обмена информацией"</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Радио в автомобиле"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Доступ к радио в автомобиле"</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Трансляция на экран автомобиля"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Громкость аудиосистемы"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Настройки аудиосистемы автомобиля"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Возможность показывать интерфейс телефона на экране автомобиля"</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Эмуляция интерфейса HAL"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Возможность эмулировать интерфейс HAL для внутреннего тестирования"</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Возможность управлять громкостью автомобильной аудиосистемы"</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Возможность управлять настройками аудиосистемы автомобиля"</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Блокировка приложений"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Возможность блокировать приложения на время вождения"</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Навигатор"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Возможность показывать данные навигатора на приборной панели"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Показ данных на приборной панели"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Возможность определять, какие данные показывать на приборной панели"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Управление приборной панелью"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Возможность запускать приложения с приборной панели"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Визуализация данных на приборной панели"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Возможность получать данные с приборной панели"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"Установка ограничений на использование функций"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"Возможность ограничивать использование функций"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Автомобильная служба ввода"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Возможность обрабатывать события ввода"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"Произошла ошибка шины CAN."</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"Шина CAN не отвечает. Переподключите коннектор, а затем выключите зажигание и заведите машину снова."</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"Во время вождения это действие недоступно.\nСначала вам нужно припарковаться."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"Чтобы перезапустить приложение в безопасном режиме, нажмите кнопку \"<xliff:g id="EXIT_BUTTON">%s</xliff:g>\"."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Назад"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Данные отладки"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Диагностическая информация"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Возможность считывать диагностические данные автомобиля"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Диагностическая информация"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Возможность удалять диагностические данные автомобиля"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"Публикация VMS-сообщений"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"Возможность публиковать VMS-сообщения"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"Подписка на VMS-сообщения"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"Возможность получать VMS-сообщения"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Мониторинг флеш-хранилища"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Возможность отслеживать использование флеш-хранилища"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Режим \"За рулем\""</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Возможность отслеживать изменения режима \"За рулем\""</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Двигатель"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Доступ к подробным данным о двигателе автомобиля"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Лючок бензобака или разъем для зарядки"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Доступ к лючку бензобака или разъему для зарядки"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Идентификационный номер автомобиля"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Доступ к идентификационным данным автомобиля"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Двери"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Возможность управлять дверями"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Окна автомобиля"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Возможность управлять окнами автомобиля"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Зеркала"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Возможность управлять зеркалами"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Сиденья"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Возможность управлять сиденьями"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Общая информация об автомобиле"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Доступ к общей информации об автомобиле"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Внешние осветительные приборы"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Доступ к данным о состоянии внешних осветительных приборов"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Внешние осветительные приборы"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Возможность управлять внешними осветительными приборами автомобиля"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Температура снаружи"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Доступ к данным о температуре снаружи"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Шины"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Доступ к данным о шинах"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Трансмиссия"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Доступ к данным о трансмиссии"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Электропитание"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Доступ к данным об электропитании автомобиля"</string>
+</resources>
diff --git a/service/res/values-si/config.xml b/service/res/values-si/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-si/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-si/strings.xml b/service/res/values-si/strings.xml
new file mode 100644
index 0000000..5190bb9
--- /dev/null
+++ b/service/res/values-si/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"මෝටර් රථයේ තොරතුරු"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"ඔබේ මෝටර් රථයේ තොරතුරු වෙත ප්රවේශ වන්න."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"මෝටර් රථයේ කුටීරය"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"දොරවල්, දර්පණ, අසුන්, සහ කවුළු ඇතුළුව ඔබේ මෝටර් රථයේ උපාංග වෙත ප්රවේශ වන්න."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"මෝටර් රථ කැමරාව"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"ඔබේ මෝටර් රථයේ කැමරා(ව) වෙත ප්රවේශ වන්න."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"මෝටර් රථයේ බල ශක්තිය"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"ඔබේ මෝටර් රථයේ බල ශක්ති තොරතුරු වෙත ප්රවේශ වන්න."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"මෝටර් රථ Hvac"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"ඔබේ මෝටර් රථයේ hvac වෙත ප්රවේශ වන්න."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"මෝටර් රථයේ ධාවන සැතපුම්"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"ඔබගේ මෝටර් රථයේ ධාවන සැතපුම් තොරතුරුවලට ප්රවේශ වන්න"</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"මෝටර් රථයේ වේගය"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"ඔබගේ මෝටර් රථයේ වේගය වෙත ප්රවේශ වන්න."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"වාහන ගතික තත්ත්වය"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"ඔබේ මෝටර් රථයේ ගතික තත්ත්වය වෙත ප්රවේශ වන්න"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"මෝටර් රථයේ අලෙවිකරු නාලිකාව"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"මෝටර් රථයට විශේෂිත තොරතුරු හුවමාරු කිරීමට ඔබේ මෝටර් රථයේ විකුණුම්කරු නාලිකාව වෙත ප්රවේශ වන්න."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"මෝටර් රථයේ ගුවන් විදුලිය"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"ඔබේ මෝටර් රථයේ ගුවන් විදුලියට ප්රවේශ වන්න."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"මෝටර් රථ ප්රක්ෂේපය"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"මෝටර් රථ ශ්රව්ය හඬ පරිමාණය"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"මෝටර් රථයේ ශ්රව්ය සැකසීම්"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"මෝටර් රථයේ සංදර්ශකය මත ව්යාපෘති දුරකථන අතුරුමුහුණත"</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"වාහන HAL උසස් කරන්න"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"අභ්යන්තර පරීක්ෂණ අරමුණ සඳහා ඔබේ මෝටර් රථයේ HAL උසස් කරන්න."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"ඔබේ මෝටර් රථයේ හඬ පරිමාණය පාලන කරන්න"</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"ඔබේ මෝටර් රථයේ ශ්රව්ය සැකසීම් පාලන කරන්න."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"යෙදුම් අවහිර කිරීම"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"රිය පදවන විට යෙදුම් අවහිර කිරීම පාලන කරන්න."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"සංචලන කළමනාකරු"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"උපකරණ කලඹ වෙත සංචලන දත්ත වාර්තා කරන්න"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"උපකරණ කලඹ වෙත ඍජු විදහීම"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"යෙදුමකට උපකරණ කලඹ තුළ සංදර්ශන කළ යුතු ක්රියාකාරකම් ප්රකාශ කිරීමට අවසර දෙන්න"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"උපකරණ කලප් පාලනය"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"උපකරණ කලඹ තුළ යෙදුම් දියත් කරන්න"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"උපකරණ කලප් විදහීම"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"උපකරණ කලප් දත්ත ලබා ගන්න"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"UX සීමා කිරීම් වින්යාසය"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"UX සීමා කිරීම් වින්යාස කරන්න"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"මෝටර් රථ ආදාන සේවය"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"ආදාන සිදුවීම් පරිහරණ කරන්න"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"CAN බස් අසාර්ථකයි"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN බස් ප්රතිචාර නොදක්වයි. හෙඩ්යුනිට් පෙට්ටිය පේනු ඉවත් කර ආපසු පේනුගත කර, මෝටර් රථය යළි අරඹන්න"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"ඔබේ ආරක්ෂාව සඳහා, ඔබ රිය පදවන විට මෙම ක්රියාකාරකම නොලැබේ.\nඉදිරියට යාමට, ඔබ ගාල් කරන තෙක් රැඳී සිටින්න."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"ආරක්ෂිත යෙදුම් විශේෂාංග සමඟ පටන් ගැනීමට, <xliff:g id="EXIT_BUTTON">%s</xliff:g> තෝරන්න."</string>
+ <string name="exit_button" msgid="5829638404777671253">"ආපසු"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"නිදොසීම"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"දෝෂ විනිශ්ච දත්ත"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"මෝටර් රථයෙන් දෝෂ විනිශ්ච දත්ත කියවන්න"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"දෝෂ විනිශ්ච දත්ත"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"මෝටර් රථයෙන් දෝෂ විනිශ්ච හිස් කරන්න"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"VMS ප්රකාශකය"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"vms පණිවුඩ ප්රකාශන කරන්න"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"VMS දායකයා"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"vms පණිවුඩවලට දායක වන්න"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"ෆ්ලෑෂ් ආචයන නිරීක්ෂණය"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"ෆ්ලෑෂ් ආචයන භාවිතය නිරීක්ෂණ කරන්න"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"රිය පැදවීමේ තත්ත්වය"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"රිය පැදවීම් තත්ත්ව වෙනස්කම්වලට සවන් දෙන්න"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"විස්තරාත්මක එන්ජිම"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"ඔබේ මෝටර් රථයේ විස්තරාත්මක එන්ජිම් තොරතුරු වෙත ප්රවේශ වන්න"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"බල ශක්ති තොටවල්"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"බල ශක්ති තොටවල් වෙත ප්රවේශ වන්න"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"මෝටර් රථයේ අනන්යතාව"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"මෝටර් රථයේ අනන්යතාව වෙත ප්රවේශ වන්න"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"මෝටර් රථයේ දොරවල්"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"මෝටර් රථයේ දොරවල් පාලන කරන්න"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"මෝටර් රථයේ කවුළු"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"මෝටර් රථයේ කවුළු පාලන කරන්න"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"මෝටර් රථයේ දර්පණ"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"මෝටර් රථයේ දර්පණ පාලන කරන්න"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"මෝටර් රථයේ ආසන"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"මෝටර් රථයේ ආසන පාලන කරන්න"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"මෝටර් රථයේ මූලික තොරතුරු"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"මෝටර් රථයේ මූලික තොරතුරු වෙත ප්රවේශ වන්න"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"මෝටර් රථයේ බාහිර ආලෝක"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"මෝටර් රථයේ බාහිර ආලෝක වෙත ප්රවේශ වන්න"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"මෝටර් රථයේ බාහිර ආලෝක"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"මෝටර් රථයේ බාහිර ආලෝක පාලන කරන්න"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"මෝටර් රථයේ බාහිර උෂ්ණත්වය"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"මෝටර් රථයේ බාහිර උෂ්ණත්වය වෙත ප්රවේශ වන්න"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"මෝටර් රථයේ ටයර්"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"මෝටර් රථයේ ටයර් තොරතුරු වෙත ප්රවේශ වන්න"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"මෝටර් රථ බල ශක්ති දාමය"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"මෝටර් රථයේ ජව දාම තොරතුරු වෙත ප්රවේශ වන්න"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"මෝටර් රථයේ බල ශක්තිය"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"මෝටර් රථයේ බල ශක්ති තත්ත්වය වෙත ප්රවේශ වන්න"</string>
+</resources>
diff --git a/service/res/values-sk/config.xml b/service/res/values-sk/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-sk/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-sk/strings.xml b/service/res/values-sk/strings.xml
new file mode 100644
index 0000000..f854bea
--- /dev/null
+++ b/service/res/values-sk/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Informácie o aute"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Získajte prístup k informáciám o aute."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Kabína auta"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Získajte prístup k príslušenstvu auta vrátane dverí, zrkadiel, sedadiel a okien."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Kamera auta"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Získajte prístup ku kamerám auta."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Palivo a energia auta"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Získajte prístup k informáciám o palive a energii auta."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"Vykurovanie, ventilácia a klimatizácia auta"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Získajte prístup k vykurovaniu, ventilácii a klimatizácii auta."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Počet najazdených kilometrov auta"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Získajte prístup k informáciám o počte najazdených kilometrov auta."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Rýchlosť auta"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Získajte prístup k informáciám o rýchlosti auta."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Dynamický stav vozidla"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Získať prístup k dynamickému stavu auta"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Kanál dodávateľa auta"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Získajte prístup ku kanálu dodávateľa auta s cieľom výmeny konkrétnych informácií o aute."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Rádio auta"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Získajte prístup k rádiu auta."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Projekcia v aute"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Hlasitosť zvuku v aute"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Nastavenia zvuku v aute"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Zobrazujte rozhranie telefónu na obrazovke auta."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Emulovať vrstvu HAL vozidla"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Emulujte vrstvu HAL auta na účely interného testovania."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Ovládajte hlasitosť zvuku v aute."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Ovládajte nastavenia zvuku v aute."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Blokovanie aplikácií"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Ovládajte blokovanie aplikácií počas jazdy."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Správca navigácie"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Nahlasovať údaje navigácie do klastra prístrojov"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Priame vykresľovanie do klastra prístrojov"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Povoliť aplikácii deklarovať aktivity, aby sa zobrazili v klastri prístrojov"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Ovládanie klastra prístrojov"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Spustiť aplikácie v klastri nástrojov"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Vykresľovanie klastra prístrojov"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Získavať údaje o klastri prístrojov"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"Konfigurácia obmedzení dojmu používateľa"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"Konfigurovať obmedzenia dojmu používateľa"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Služba vstupov auta"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Spravovať udalosti vstupu"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"Zbernica CAN zlyhala"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"Zbernica CAN nereaguje. Odpojte autorádio a znova ho pripojte. Potom auto znova naštartujte."</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"Z bezpečnostných dôvodov nie je táto aktivita k dispozícii počas jazdy.\nAk chcete pokračovať, počkajte, kým budete parkovať."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"Ak chcete začať odznova s bezpečnými funkciami aplikácie, vyberte tlačidlo <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Späť"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Informácie o ladení"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Diagnostické údaje"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Čítať diagnostické údaje z auta"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Diagnostické údaje"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Vymazať diagnostické údaje z auta"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"Vydavateľ VMS"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"Zverejniť správy VMS"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"Odberateľ VMS"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"Odoberať správy VMS"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Monitorovanie úložiska vo formáte Flash"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Monitorovať používanie úložiska vo formáte Flash"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Stav jazdy"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Počúvať zmeny stavu jazdy"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Podrobné informácie o motore"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Získajte prístup k podrobným informáciám o motore auta."</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Porty paliva a energie"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Získať prístup k portom paliva a energie"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Identifikačné číslo auta"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Získať prístup k identifikačnému číslu auta"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Dvere auta"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Ovládať dvere auta"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Okná auta"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Ovládať okná auta"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Zrkadlá auta"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Ovládať zrkadlá auta"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Sedadlá auta"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Ovládať sedadlá auta"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Základné informácie o aute"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Získať prístup k základným informáciám o aute"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Vonkajšie svetlá auta"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Získať prístup k stavu vonkajších svetiel auta"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Vonkajšie svetlá auta"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Ovládať vonkajšie svetlá auta"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Vonkajšia teplota auta"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Získať prístup k informáciám auta o vonkajšej teplote"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Pneumatiky auta"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Získať prístup k informáciám o pneumatikách auta"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Hnací agregát auta"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Získajte prístup k informáciám o hnacom agregáte auta"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Napájanie auta"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Získať prístup k stavu napájania auta"</string>
+</resources>
diff --git a/service/res/values-sl/config.xml b/service/res/values-sl/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-sl/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-sl/strings.xml b/service/res/values-sl/strings.xml
new file mode 100644
index 0000000..ba172bc
--- /dev/null
+++ b/service/res/values-sl/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Podatki o avtomobilu"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Dostop do podatkov o avtomobilu."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Kabina avtomobila"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Dostop do dodatkov avtomobila, vključno z vrati, ogledali, sedeži in okni."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Kamera avtomobila"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Dostop do kamer avtomobila."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Energija avtomobila"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Dostop do podatkov o energiji avtomobila."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"Sistem za ogrevanje, hlajenje in prezračevanje avtomobila"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Dostop do sistema za ogrevanje, hlajenje in prezračevanje avtomobila."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Prevoženi kilometri avtomobila"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Dostop do podatkov o prevoženih kilometrih avtomobila."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Hitrost avtomobila"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Dostop do hitrosti avtomobila."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Stanje dinamike vozila"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Dostop do stanja dinamike avtomobila"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Kanal prodajalca v avtomobilu"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Dostop do kanala prodajalca v avtomobilu za izmenjavo podatkov o avtomobilu."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Radio avtomobila"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Dostop do radia avtomobila."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Projiciranje v avtomobilu"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Glasnost zvoka v avtomobilu"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Nastavitve zvoka v avtomobilu"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Projiciranje vmesnika telefona na zaslon avtomobila."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Posnemanje HAL-a vozila"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Posnemanje HAL-a vozila za avtomobil zaradi internega preizkušanja."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Nadziranje glasnosti zvoka v avtomobilu."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Nadziranje nastavitev zvoka v avtomobilu."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Blokiranje aplikacij"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Nadziranje blokiranja aplikacij med vožnjo."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Upravitelj navigacije"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Sporočanje podatkov za navigacijo instrumentni plošči"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Usmeritev upodabljanja na instrumentno ploščo"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Omogočanje aplikaciji, da najavi dejavnosti za prikaz na instrumentni plošči"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Nadziranje instrumentne plošče"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Zagon aplikacij iz instrumentne plošče"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Upodobitev instrumentne plošče"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Prejemanje podatkov instrumentne plošče"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"Konfiguracija omejitev uporabniške izkušnje"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"Konfiguriranje omejitev uporabniške izkušnje"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Storitev za vhode avtomobila"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Obravnava dogodkov vnosa"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"Napaka vodila CAN"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"Vodilo CAN se ne odziva. Odklopite in znova priklopite ohišje avtomobilskega vmesnika ter znova zaženite avtomobil"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"Zaradi varnosti ta dejavnost med vožnjo ni na voljo.\nČe želite nadaljevati, počakajte, da bo vozilo parkirano."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"Če želite začeti znova z varnimi funkcijami aplikacij, izberite <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Nazaj"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Odpr. nap."</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Diagnostični podatki"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Branje diagnostičnih podatkov avtomobila"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Diagnostični podatki"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Brisanje diagnostičnih podatkov iz avtomobila"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"Izdajatelj za VMS"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"Objavljanje sporočil vms"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"Naročnik na VMS"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"Naročanje na sporočila vms"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Nadziranje bliskovne shrambe"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Nadziranje uporabe bliskovne shrambe"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Vozno stanje"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Poslušanje sprememb voznih stanj"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Podrobno o motorju"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Dostop do podrobnih podatkov o motorju avtomobila"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Vrata za energijo"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Dostop do vrat za energijo"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Identifikacijski podatki avtomobila"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Dostop do identifikacijskih podatkov avtomobila"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Vrata avtomobila"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Nadziranje vrat avtomobila"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Okna avtomobila"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Nadziranje oken avtomobila"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Ogledala avtomobila"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Nadziranje ogledal avtomobila"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Sedeži avtomobila"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Nadziranje sedežev avtomobila"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Osnovni podatki o avtomobilu"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Dostop do osnovnih podatkov o avtomobilu"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Zunanje luči avtomobila"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Dostop do stanja zunanjih luči avtomobila"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Zunanje luči avtomobila"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Nadziranje zunanjih luči avtomobila"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Temperatura zunaj avtomobila"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Dostop do temperature zunaj avtomobila"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Pnevmatike avtomobila"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Dostop do podatkov o pnevmatikah avtomobila"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Pogonski sistem avtomobila"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Dostop do podatkov o pogonskem sistemu avtomobila"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Napajanje avtomobila"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Dostop do stanja napajanja avtomobila"</string>
+</resources>
diff --git a/service/res/values-sq/config.xml b/service/res/values-sq/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-sq/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-sq/strings.xml b/service/res/values-sq/strings.xml
new file mode 100644
index 0000000..69aa668
--- /dev/null
+++ b/service/res/values-sq/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Informacionet e makinës"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Qasu në informacionet e makinës."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Kabina e makinës"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Qasu në aksesorët e makinës, duke përfshirë dyert, pasqyrat, ndenjëset dhe dritaret."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Kamera e makinës"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Qasu te kamera(t) e makinës."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Energjia e makinës"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Qasu tek informacionet e energjisë së makinës."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"Sistemi HVAC i makinës"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Qasu në sistemin HVAC të makinës."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Kilometrazhi i makinës"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Qasu në informacionet e kilometrazhit të makinës."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Shpejtësia e makinës"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Qasu në shpejtësinë e makinës."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Gjendja e dinamikës së automjetit"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Qasu në gjendjen e dinamikës së makinës"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Kanali i distributorit të makinës"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Qasu në kanalin e distributorit të makinës për të shkëmbyer informacione specifik për makinën."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Radioja e makinës"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Qasu te radioja e makinës."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Projektimi i makinës"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Volumi i audios së makinës"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Cilësimet e audios së makinës"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Projekto ndërfaqen e telefonit në ekranin e makinës."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Emulo ndërfaqen HAL të automjetit"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Emulo ndërfaqen HAL të makinës për qëllime testimi të brendshëm."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Kontrollo volumin e audios së makinës."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Kontrollo cilësimet e audios së makinës."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Bllokimi i aplikacioneve"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Kontrollo bllokimin e aplikacioneve gjatë drejtimit të makinës."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Menaxhimi i navigimit"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Raporto të dhënat e navigimit te grupimi i instrumenteve"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Interpretimi i drejtpërdrejtë te grupimi i instrumenteve"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Lejo që një aplikacion të deklarojë aktivitetet për t\'u shfaqur në grupimin e instrumenteve"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Kontrolli i grupimit të instrumenteve"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Hap aplikacionet në grupimin e instrumenteve"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Interpretimi i grupimit të instrumenteve"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Merr të dhënat e grupimit të instrumenteve"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"Konfigurimi i kufizimeve për eksperiencën e përdoruesit"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"Konfiguro kufizimet për eksperiencën e përdoruesit"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Shërbimi i hyrjes së makinës"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Menaxho ngjarjet e hyrjes"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"Kanali i komunikimit CAN dështoi"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"Kanali i komunikimit CAN nuk përgjigjet. Shkëput dhe lidh përsëri kutinë e njësisë kryesore dhe rindiz makinës"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"Për sigurinë tënde, ky aktivitet nuk ofrohet kur je duke drejtuar makinën.\nPër të vazhduar, prit deri sa të parkosh."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"Për të filluar nga e para me funksionet e sigurta të aplikacionit, zgjidh <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Prapa"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Informacionet e defekteve në kod"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Të dhënat diagnostikuese"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Lexo të dhënat diagnostikuese nga makina"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Të dhënat diagnostikuese"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Pastro të dhënat diagnostikuese nga makina"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"Publikuesi i të dhënave VMS"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"Publiko mesazhet VMS"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"Abonenti i të dhënave VMS"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"Abonohu te mesazhet VMS"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Monitorimi i hapësirës ruajtëse të formatit flash"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Monitoro përdorimin e hapësirës ruajtëse të formatit flash"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Gjendja e drejtimit të makinës"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Dëgjo ndryshimet e gjendjes së lëvizjes me makinë"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Motori në detaje"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Qasu tek informacionet e detajuara të motorit të makinës"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Portat e energjisë"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Qasu në portat e energjisë"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Identifikimi i makinës"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Qasu tek identifikimi i makinës"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Dyert e makinës"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Kontrollo dyert e makinës"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Dritaret e makinës"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Kontrollo dritaret e makinës"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Pasqyrat e makinës"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Kontrollo pasqyrat e makinës"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Ndenjëset e makinës"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Kontrollo ndenjëset e makinës"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Informacionet bazë të makinës"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Qasu tek informacionet bazë të makinës"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Dritat e jashtme të makinës"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Qasu te gjendja e dritave të jashtme të makinës"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Dritat e jashtme të makinës"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Kontrollo dritat e jashtme të makinës"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Temperatura e jashtme e makinës"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Qasu te temperatura e jashtme e makinës"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Gomat e makinës"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Qasu në informacionet e gomave të makinës"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Sistemi i transmetimit të makinës"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Qasu tek informacionet e sistemit të transmetimit të makinës"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Fuqia e makinës"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Qasu te gjendja e fuqisë së makinës"</string>
+</resources>
diff --git a/service/res/values-sr/config.xml b/service/res/values-sr/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-sr/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-sr/strings.xml b/service/res/values-sr/strings.xml
new file mode 100644
index 0000000..45f4d00
--- /dev/null
+++ b/service/res/values-sr/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Информације о аутомобилу"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Приступи информацијама о аутомобилу."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Путнички простор"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Приступи опреми аутомобила, укључујући врата, ретровизоре, седишта и прозоре."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Камера аутомобила"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Приступи камерама аутомобила."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Енергија аутомобила"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Приступи информацијама о енергији аутомобила."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"Грејање, вентилација и климатизација аутомобила"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Приступи грејању, вентилацији и климатизацији аутомобила"</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Пређени пут аутомобила"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Приступи информацијама о пређеном путу аутомобила."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Брзина аутомобила"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Приступи брзини аутомобила."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Статус динамике возила"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Приступи статусу динамике аутомобила"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Канал продавца аутомобила"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Приступи каналу продавца аутомобила ради размене посебних информација у вези са аутомобилом"</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Радио аутомобила"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Приступа радију аутомобила."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Пројекција у аутомобилу"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Јачина звука у аутомобилу"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Подешавања звука у аутомобилу"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Пројектује интерфејс телефона на екран у аутомобилу."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Емулација HAL возила"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Емулира HAL возила за аутомобил у сврхе интерног тестирања"</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Контролише јачину звука у аутомобилу."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Контролише подешавања звука у аутомобилу."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Блокирање апликација"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Контролише блокирање апликација током вожње."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Менаџер навигације"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Шаље податке за навигацију инструмент табли"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Директно приказивање на инструмент табли"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Дозволи да апликација наведе активности које ће се приказивати на инструмент табли"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Контрола инструмент табле"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Покреће апликације на инструмент табли"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Приказивање на инструмент табли"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Прима податке са инструмент табле"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"Конфигурација ограничења КД-а"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"Конфигурише ограничења КД-а"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Услуга аутомобилског уноса"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Управља догађајима уноса"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"Грешка CAN магистрале"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN магистрала не реагује. Искључите и поново укључите главну јединицу и поново покрените аутомобил"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"Ова активност није доступна док возите ради ваше безбедности.\nДа бисте наставили, прво се паркирајте."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"Да бисте поново почели са безбедним функцијама апликације, изаберите <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Назад"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Дијагностички подаци"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Чита дијагностичке податке из аутомобила"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Дијагностички подаци"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Брише дијагностичке податке из аутомобила"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"Објављивање VMS података"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"Објављује vms поруке"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"Претплати на VMS поруке"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"Пријави на vms поруке"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Праћење флеш меморије"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Надгледа коришћење флеш меморије"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Статус вожње"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Слуша промена статуса вожње"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Детаљни подаци о аутомобилу"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Приступи детаљним подацима о мотору аутомобила"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Енергетски портови"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Приступи енергетским портовима"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Идентификација аутомобила"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Приступ подацима за идентификацију аутомобила"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Врата аутомобила"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Контролише врата аутомобила"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Прозори аутомобила"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Контролише прозоре аутомобила"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Ретровизори аутомобила"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Контролише ретровизоре аутомобила"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Седишта у аутомобилу"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Контролише седишта у аутомобилу"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Основне информације о аутомобилу"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Приступи основним подацима о аутомобилу"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Спољна светла аутомобила"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Приступи статусу спољних светла аутомобила"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Спољна светла аутомобила"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Контролише спољна светла аутомобила"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Спољна температура аутомобила"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Приступи спољној температури аутомобила"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Гуме аутомобила"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Приступ подацима о гумама аутомобила"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Погон аутомобила"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Приступи подацима о погону аутомобила"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Напајање аутомобила"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Приступ статусу напајања аутомобила"</string>
+</resources>
diff --git a/service/res/values-sv/config.xml b/service/res/values-sv/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-sv/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-sv/strings.xml b/service/res/values-sv/strings.xml
new file mode 100644
index 0000000..bacb499
--- /dev/null
+++ b/service/res/values-sv/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Information om bilen"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Åtkomst till information om bilen."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Bilens kupé"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Åtkomst till elstyrda delar som dörrar och luckor, speglar, säten och rutor."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Bilens kamera"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Åtkomst till bilens kamera eller kameror."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Bilens drivmedelsnivå"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Åtkomst till information om bilens drivmedel."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"Bilens värme-, ventilations- och AC-system"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Åtkomst till bilens värme-, ventilations- och AC-system."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Bränsleförbrukning"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Åtkomst till information om bilens bränsleförbrukning."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Bilens hastighet"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Åtkomst till information om bilens hastighet."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Fordonsdynamiskt tillstånd"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Åtkomst till bilens fordonsdynamiska tillstånd"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Information från bilens tillverkare"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Åtkomst till biltillverkarens kommunikationskanal för information om bilen."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Bilens radio"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Åtkomst till bilens radio."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Projicering i bilen"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Ljudvolym i bilen"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Inställningar för ljud i bilen"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Projicera mobilens gränssnitt på bilens skärm"</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Emulera Vehicle HAL"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Emulera bilens Vehicle HAL i internt testsyfte"</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Styra ljudvolymen i bilen."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Styra ljudinställningarna i bilen."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Appblockering"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Styra blockering av appar under körning."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Navigeringshanterare"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Visa navigeringsdata på bilens digitala instrumentbräda"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Rendering direkt på bilens digitala instrumentbräda"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Tillåt att en apps aktiviteter får visas på bilens digitala instrumentbräda"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Styrning av digital instrumentbräda"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Starta appar på bilens digitala instrumentbräda"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Rendering på digital instrumentbräda"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Ta emot data från bilens digitala instrumentbräda"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"Konfiguration för användningsbegränsningar"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"Konfigurera användningsbegränsningar"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Indatatjänst för bilen"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Hantera indatahändelser"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"Fel i CAN-bussen"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN-bussen svarar inte. Koppla från huvudenheten och koppla in den igen. Starta sedan om bilen"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"Av säkerhetsskäl är den här aktiviteten inte tillgänglig under körning.\nDu kan fortsätta med detta när du har parkerat."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"Välj <xliff:g id="EXIT_BUTTON">%s</xliff:g> om du vill starta om appen med säkra funktioner."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Tillbaka"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Diagnostikdata"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Läsa diagnostisk data om bilen"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Diagnostikdata"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Rensa bilens diagnostikdata"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"VMS-publicering"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"Publicera VMS-meddelanden"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"VMS-prenumeration"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"Prenumerera på VMS-meddelanden"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Övervaka Flash-lagringsenheter"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Övervaka användning av Flash-lagringsutrymme"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Bilkörningsläge"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Reagera på ändringar av bilkörningsläget"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Detaljerad motorinformation"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Åtkomst till detaljerad information om bilens motor"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Drivmedelsportar"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Åtkomst till drivmedelsportar"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Identifiera bilen"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Åtkomst till bilens id-information"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Bilens dörrar och luckor"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Styra bilens dörrar och luckor"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Bilens rutor"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Styra bilens rutor"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Bilens speglar"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Styra bilens speglar"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Bilens säten"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Styra bilens säten"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Grundläggande information om bilen"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Åtkomst till grundläggande information om bilen"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Bilens utvändiga belysning"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Åtkomst till status för bilens utvändiga belysning"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Bilens utvändiga belysning"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Styra bilens utvändiga belysning"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Utomhustemperatur kring bilen"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Åtkomst till utomhustemperaturen kring bilen"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Bilens däck"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Åtkomst till information om bilens däck"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Bilens drivlina"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Åtkomst till information om bilens drivlina"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Bilens laddning"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Åtkomst till bilens laddning"</string>
+</resources>
diff --git a/service/res/values-sw/config.xml b/service/res/values-sw/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-sw/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-sw/strings.xml b/service/res/values-sw/strings.xml
new file mode 100644
index 0000000..62ebe5d
--- /dev/null
+++ b/service/res/values-sw/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Maelezo ya gari"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Kufikia maelezo ya gari lako"</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Kabini ya Gari"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Kufikia maelezo ya sehemu zingine za gari lako, kwa mfano milango, vioo, viti na madirisha."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Kamera ya Gari"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Kufikia kamera ya gari lako."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Nishati ya gari"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Kufikia maelezo ya nishati ya gari lako."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"Hali ya joto, hewa na kiyoyozi (Hvac) ya Gari"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Kufikia hali ya joto, hewa na kiyoyozi (hvac) ya gari lako."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Masafa ya gari"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Kufikia maelezo ya masafa ya gari lako."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Kasi ya gari"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Kufikia maelezo ya kasi ya gari lako."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Hali ya mabadiliko kwenye gari linapowekewa vipengee mbalimbali likiwa katika mwendo"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Kufikia maelezo ya mabadiliko kwenye gari linapowekewa vipengee mbalimbali likiwa katika mwendo"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Kituo cha muuzaji gari"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Kufikia kituo cha muuzaji wa gari lako ili kubadilisha taarifa mahususi za gari."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Redio ya Gari"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Kufikia redio ya gari lako."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Kuonekana kwa Gari"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Kiwango cha Sauti ya Gari"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Mipangilio ya Sauti ya Gari"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Kuonyesha kiolesura cha simu kwenye skrini ya gari."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Kuiga HAL ya Gari"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Kuiga HAL ya gari lako kwa madhumuni ya jaribio la ndani."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Kudhibiti kiwango cha sauti ya gari lako."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Kudhibiti mipangilio ya sauti ya gari lako."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Uzuiaji wa programu"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Kudhibiti uzuiaji wa programu unapoendesha gari."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Kidhibiti cha Maelekezo"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Kuripoti data ya maelekezo kwenye kikundi cha zana"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Uwasilishaji wa moja kwa moja hadi kwenye kikundi cha zana"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Ruhusu programu itangaze shughuli zinazoonyeshwa kwenye kikundi cha zana"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Kidhibiti cha kikundi cha zana"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Kuanzisha programu katika kikundi cha data"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Uwasilishaji wa Kikundi cha Zana"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Kupokea data ya kikundi cha zana"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"Mipangilio ya Masharti ya UX"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"Weka Mipangilio ya Masharti ya UX"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Huduma ya Kuweka Data ya Gari"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Kudhibiti matukio ya kuweka data"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"Imeshindwa kuleta maelezo ya kebo CAN"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"Kebo ya CAN haifanyi kazi. Ondoa kisha urudishe tena kisanduku cha sehemu kuu na uzime kisha uwashe gari"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"Kwa usalama wako, shughuli haipatikani wakati unaendesha gari. \nIli uendelee, subiri hadi utakapoegesha gari."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"Ili uanzishe tena ukitumia vipengele salama vya programu, chagua <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Rudi Nyuma"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Data ya Uchunguzi"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Kusoma data ya uchunguzi kwenye gari"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Data ya Uchunguzi"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Kufuta data ya uchunguzi kwenye gari"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"Kichapishaji cha VMS"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"Kuchapisha ujumbe wa VMS"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"Mteja wa VMS"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"Kujisajili kwenye ujumbe wa VMS"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Kuchunguza nafasi ya kifaa cha kuhifadhi data"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Kudhibiti matumizi ya kifaa cha kuhifadhi"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Hali ya Kuendesha Gari"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Kusikiliza mabadiliko katika Hali ya Kuendesha Gari"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Maelezo ya Injini"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Kufikia maelezo ya kina ya injini ya gari lako"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Milango ya Nishati"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Kufikia milango ya nishati"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Utambulisho wa gari"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Kufikia utambulisho wa gari"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Milango ya Gari"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Kudhibiti milango ya gari"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Madirisha ya Gari"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Kudhibiti madirisha ya gari"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Vioo vya Gari"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Kudhibiti vioo vya gari"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Viti vya Gari"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Kudhibiti viti vya gari"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Maelezo ya msingi ya gari"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Kufikia maelezo ya msingi ya gari"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Taa za nje ya gari"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Kufikia hali ya taa za nje za gari"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Taa za nje ya gari"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Kudhibiti taa za nje za gari"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Halijoto ya nje ya gari lako"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Kufikia halijoto ya nje ya gari lako"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Magurudumu ya gari"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Kufikia maelezo ya magurudumu ya gari"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Mfumo wa Usambazaji wa Nishati Garini"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Kufikia maelezo ya kisambazaji cha nishati garini"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Nishati ya Gari"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Kufikia hali ya nishati ya gari"</string>
+</resources>
diff --git a/service/res/values-ta/config.xml b/service/res/values-ta/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-ta/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-ta/strings.xml b/service/res/values-ta/strings.xml
new file mode 100644
index 0000000..ce903db
--- /dev/null
+++ b/service/res/values-ta/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"காரின் தகவல்"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"காரின் தகவலை அணுகுதல்."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"காரின் கேபின்"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"காரின் கதவுகள், கண்ணாடிகள், இருக்கைகள், ஜன்னல்கள் போன்றவற்றை அணுகுதல்."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"காரின் கேமரா"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"காரின் கேமராவை அணுகுதல்."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"காரின் எரிபொருள்"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"காரின் எரிபொருள் தகவலை அணுகுதல்."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"காரில் வெப்பம், காற்றோட்டம், குளிர்சாதன வசதி ஆகியவற்றை உள்ளடக்கிய அமைப்பு (hvac)"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"காரில் வெப்பம், காற்றோட்டம், குளிர்சாதன வசதி ஆகியவற்றை உள்ளடக்கிய அமைப்பை (hvac) அணுகுதல்."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"காரின் மைலேஜ்"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"காரின் மைலேஜ் தகவலை அணுகுதல்."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"காரின் வேகம்"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"காரின் வேகத்தை அணுகுதல்."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"வாகனத்தின் இயக்கவியல் நிலை"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"காரின் இயக்கவியலை அணுகுதல்"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"காரின் தயாரிப்பாளர் விவரங்கள்"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"கார் பற்றிய தகவலைப் பகிர்ந்துகொள்ள காரின் தயாரிப்பாளர் விவரங்களை அணுகுதல்."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"கார் ரேடியோ"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"காரின் ரேடியோவை அணுகுதல்."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"காரின் காட்சிப்படுத்தல்"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"காரின் ஆடியோ அளவு"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"கார் ஆடியோ அமைப்புகள்"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"காரின் திரையில் மொபைல் திரையைக் காட்சிப்படுத்துதல்."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"வாகனத்தின் HAL போன்றே இன்னொன்றை உருவாக்குதல்"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"உள்ளுக்குள்ளேயே சோதனை செய்து பார்ப்பதற்காகக் காரின் HALலைப் போன்றே இன்னொன்றை உருவாக்குதல்."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"காரின் ஆடியோ அளவைச் சரிசெய்தல்."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"காரின் ஆடியோ அமைப்புகளை நிர்வகித்தல்."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"ஆப்ஸைத் தடுத்தல்"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"வாகனம் ஓட்டும்போது ஆப்ஸ் தடுக்கப்படுவதை நிர்வகித்தல்."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"வழிசெலுத்தல் நிர்வாகி"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"வழிசெலுத்தல் தரவை இன்ஸ்ட்ருமெண்ட் கிளஸ்டருக்கு அனுப்புதல்"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"இன்ஸ்ட்ருமெண்ட் கிளஸ்டரை நேரடியாக ஒழுங்கமைத்தல்"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"இன்ஸ்ட்ருமெண்ட் கிளஸ்டரில் காட்டப்பட வேண்டிய செயல்பாடுகளை அறிவிப்பதற்கு ஏதேனும் ஓர் ஆப்ஸை அனுமதித்தல்"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"இன்ஸ்ட்ருமெண்ட் கிளஸ்டரை இயக்குதல்"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"இன்ஸ்ட்ருமெண்ட் கிளஸ்டரில் ஆப்ஸை அறிமுகம் செய்தல்"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"இன்ஸ்ட்ருமெண்ட் கிளஸ்டரை ஒழுங்கமைத்தல்"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"இன்ஸ்ட்ருமெண்ட் கிளஸ்டர் தரவைப் பெறுதல்"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"UX கட்டுப்பாடுகள் உள்ளமைவு"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"UX கட்டுப்பாடுகளை உள்ளமைத்தல்"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"காருக்கு உற்பத்தியாளர் வழங்கும் சேவை"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"உற்பத்தியாளர் வழங்கும் சேவைகளைக் கையாளுதல்"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"CAN bus அமைப்பு தோல்வியடைந்தது"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN bus அமைப்பு இயங்கவில்லை. ஹெட்யூனிட் பாக்ஸைப் பிளக்கில் இருந்து அகற்றிச் செருகியபின் காரை மீண்டும் தொடங்கவும்"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"உங்கள் பாதுகாப்பை முன்னிட்டு இந்தச் செயல்பாடு, வாகனம் ஓட்டும்போது இயங்காது.\nதொடர வாகனத்தை நிறுத்தும்வரை காத்திருக்கவும்."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"ஆப்ஸைப் பாதுகாப்பான அம்சங்களுடன் மீண்டும் தொடங்க <xliff:g id="EXIT_BUTTON">%s</xliff:g>ஐத் தேர்ந்தெடுக்கவும்."</string>
+ <string name="exit_button" msgid="5829638404777671253">"பின்செல்"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"பிழைதிருத்தத் தகவல்"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"கண்டறியப்பட்ட தரவு"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"காரைக் குறித்துக் கண்டறிந்த தரவைப் படித்தல்"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"கண்டறியப்பட்ட தரவு"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"காரைக் குறித்துக் கண்டறிந்த தகவலை அழித்தல்"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"VMS தரவை அனுப்புதல்"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"vms மெசேஜ்களை அனுப்புதல்"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"VMS தரவை அணுகுதல்"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"vms மெசேஜ்களைப் பெறுதல்"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"ஃபிளாஷ் சேமிப்பகத்தைக் கண்காணித்தல்"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"ஃபிளாஷ் சேமிப்பகத்தின் உபயோகத்தைக் கண்காணித்தல்"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"வாகனம் ஓட்டும் நிலை"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"ஓட்டும் நிலையில் ஏற்படும் மாற்றங்களைக் கவனித்தல்"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"இன்ஜின் விவரம்"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"காரின் இன்ஜின் தகவலை முழுமையாக அணுகுதல்"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"எரிபொருள் டாங்கின் போர்ட்டுகள்"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"எரிபொருள் டாங்கின் போர்ட்டுகளை அணுகுதல்"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"காரின் VIN"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"காரின் VIN தகவலை அணுகுதல்"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"கார் கதவுகள்"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"காரின் கதவுகளை இயக்குதல்"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"காரின் ஜன்னல்கள்"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"காரின் ஜன்னல்களை இயக்குதல்"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"கார் கண்ணாடிகள்"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"காரின் கண்ணாடிகளை இயக்குதல்"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"கார் இருக்கைகள்"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"காரின் இருக்கைகளை இயக்குதல்"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"காரின் அடிப்படைத் தகவல்"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"காரின் அடிப்படைத் தகவலை அணுகுதல்"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"காரின் வெளிப்புறத்தில் உள்ள முகப்பு விளக்கு, இண்டிகேட்டர் போன்றவை"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"காரின் வெளிப்புறத்தில் உள்ள முகப்பு விளக்கு, இண்டிகேட்டர் போன்றவற்றை அணுகுதல்"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"காரின் வெளிப்புறத்தில் உள்ள முகப்பு விளக்கு, இண்டிகேட்டர் போன்றவை"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"முகப்பு விளக்கு, இண்டிகேட்டர் போன்றவற்றை இயக்குதல்"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"காரின் வெளிப்புறத்தில் உள்ள வெப்பநிலை"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"காருக்கு வெளிப்புறத்தில் உள்ள முகப்பு விளக்கு, இண்டிகேட்டர் போன்றவற்றை அணுகுதல்"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"கார் டயர்கள்"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"கார் டயர் குறித்த தகவலை அணுகுதல்"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"காரின் பவர்டிரெயின்"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"காரின் பவர்டிரெயின் தகவலை அணுகுதல்"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"காரின் பவர்"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"காரின் பவர் நிலையை அணுகுதல்"</string>
+</resources>
diff --git a/service/res/values-te/config.xml b/service/res/values-te/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-te/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-te/strings.xml b/service/res/values-te/strings.xml
new file mode 100644
index 0000000..def3ff3
--- /dev/null
+++ b/service/res/values-te/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"కారు సమాచారం"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"మీ కారు సమాచారం యాక్సెస్ చేయండి"</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"కారు క్యాబిన్"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"తలుపులు, అద్దాలు, సీట్లు మరియు విండోలతో సహా మీ కారు ఉపకరణాలను యాక్సెస్ చేయండి."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"కారు కెమెరా"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"మీ కారు యొక్క కామెరా(లు)ని యాక్సెస్ చేయండి."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"కారు శక్తి"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"మీ కారు శక్తి సమాచారాన్ని యాక్సెస్ చేయండి."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"కారు Hvac"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"మీ కారు యొక్క hvacని యాక్సెస్ చేయండి"</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"కారు మైలేజీ"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"మీ కారు మైలేజీ సమాచారాన్ని యాక్సెస్ చేయండి."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"కారు వేగం"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"మీ కారు వేగం సమాచార యాక్సెస్ చేయండి"</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"వాహన డైనమిక్స్ స్థితి"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"మీ కారు యొక్క డైనమిక్స్ స్థితిని యాక్సెస్ చేయండి"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"కారు విక్రయదారు ఛానెల్"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"కారు నిర్దిష్ట సమాచారాన్ని పంచుకోవడానికి మీ కారు విక్రేత ఛానెల్ను యాక్సెస్ చేయండి"</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"కారు రేడియో"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"మీ కారు రేడియోను యాక్సెస్ చేయండి"</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"కారు ప్రొజెక్షన్"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"కారు ఆడియో వాల్యూమ్"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"కారు సీట్లు"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"కారు ప్రదర్శన మీద ఫోన్ ఇంటర్ఫేస్ ప్రోజెక్ట్ చేయండి."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"వాహన HALని అనుకరించండి"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"అంతర్గత పరీక్ష ప్రయోజనం కోసం మీ కారు వాహనం HALను మార్చుకోండి."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"మీ కారు యొక్క ఆడియో వాల్యూమ్ని నియంత్రించండి."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"మీ కారు ఆడియో సెట్టింగ్లను నియంత్రించండి."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"యాప్ బ్లాక్ చేయడం"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"డ్రైవింగ్లో ఉన్నప్పుడు అప్లికేషన్లను బ్లాక్ చేయండి"</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"నావిగేషన్ మేనేజర్"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"పరికర గుంపుకు నావిగేషన్ డేటాని నివేదించండి"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"పరికర గుంపుకు ప్రత్యక్ష రెండరింగ్"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"పరికర గుంపులో ప్రదర్శించాల్సిన కార్యకలాపలని తెలియచెప్పడానికి అప్లికేషన్ను అనుమతించండి."</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"పరికర గుంపు నియంత్రణ"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"పరికర గుంపు యాప్లను ప్రారంభించండి"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"పరికర గుంపు రెండరింగ్"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"పరికర గుంపు డేటాని పొందండి"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"UX పరిమితుల కాన్ఫిగరేషన్"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"UX పరిమితులను కాన్ఫిగర్ చెయ్యండి"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"కారు ఇన్పుట్ సేవ"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"ఇన్పుట్ ఈవెంట్లను హ్యాండిల్ చేయండి"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"CAN బస్సు విఫలమైంది"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN బస్సు స్పందించలేదు. హెడ్ యూనిట్ బాక్స్ని ప్లగ్ మరియు అన్ప్లగ్ చేసి కారుని పునఃప్రారంభించుము"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"మీ భద్రత విషయమై, ఈ కార్యాచరణ మీరు డ్రైవింగ్లో ఉన్నప్పుడు అందుబాటులో లేదు.\n కొనసాగించడానికి, మీరు పార్క్ చేయబడేవరకు వేచి ఉండండి."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"సురక్షిత యాప్ లక్షణాలతో ప్రారంభించడానికి, <xliff:g id="EXIT_BUTTON">%s</xliff:g>ని ఎంచుకోండి."</string>
+ <string name="exit_button" msgid="5829638404777671253">"వెనుకకు"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"డీబగ్ సమాచారం"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"సమస్య విశ్లేషణ డేటా"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"కారు నుండి విశ్లేషణ డేటాను చదవండి"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"సమస్య విశ్లేషణ డేటా"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"కారు నుండి విశ్లేషణ డేటాను తొలగించండి"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"VMS ప్రచురణకర్త"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"vms సందేశాలను ప్రచురించండి"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"VMS సభ్యుడు"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"Vms సందేశాలకు సభ్యత్వం పొందండి"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"ఫ్లాష్ నిల్వ పర్యవేక్షణ"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"ఫ్లాష్ నిల్వ వినియోగాన్ని పర్యవేక్షించండి"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"డ్రైవింగ్ స్థితి"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"డ్రైవింగ్ స్థితి మార్పులను వినండి"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"ఇంజిన్ వివరాలు"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"మీ కారు యొక్క సమగ్ర ఇంజిన్ సమాచారాన్ని యాక్సెస్ చేయండి"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"శక్తి పోర్ట్లు"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"శక్తి పోర్ట్లను యాక్సెస్ చేయండి"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"కారు గుర్తింపు"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"కారు యొక్క గుర్తింపును యాక్సెస్ చేయండి"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"కారు డోర్లు"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"కార్ యొక్క డోర్లను నియంత్రించండి"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"కారు విండోలు"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"కార్ యొక్క విండోలను నియంత్రించండి"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"కారు అద్దాలు"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"కారు యొక్క అద్దాలను నియంత్రించండి"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"కారు సీట్లు"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"కారు యొక్క సీట్లను నియంత్రించండి"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"కారు ప్రాథమిక సమాచారం"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"కారు యొక్క ప్రాథమిక సమాచారాన్ని యాక్సెస్ చేయండి"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"కారు బాహ్య లైట్లు"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"కారు యొక్క బాహ్య లైట్లను యాక్సెస్ చేయండి"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"కారు బాహ్య లైట్లు"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"కారు యొక్క బాహ్య లైట్లను నియంత్రించండి"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"కారు బాహ్య ఉష్ణోగ్రత"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"కారు యొక్క బాహ్య ఉష్ణోగ్రతను యాక్సెస్ చేయండి"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"కారు టైర్లు"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"కారు టైర్ యాక్సెస్ సమాచారాన్ని చేయండి"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"కారు పవర్ ట్రైన్"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"కారు పవర్ ట్రైన్ సమాచారాన్ని యాక్సెస్ చేయండి"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"కారు పవర్"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"కారు యొక్క పవర్ స్థితిని యాక్సెస్ చేయండి"</string>
+</resources>
diff --git a/service/res/values-th/config.xml b/service/res/values-th/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-th/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-th/strings.xml b/service/res/values-th/strings.xml
new file mode 100644
index 0000000..dbabe27
--- /dev/null
+++ b/service/res/values-th/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"ข้อมูลรถยนต์"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"เข้าถึงข้อมูลรถของคุณ"</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"ห้องโดยสารรถยนต์"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"เข้าถึงอุปกรณ์ในรถ ซึ่งรวมถึงประตู กระจก ที่นั่ง และหน้าต่าง"</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"กล้องของรถ"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"เข้าถึงกล้องของรถ"</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"พลังงานของรถ"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"เข้าถึงข้อมูลพลังงานของรถ"</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"Hvac ของรถ"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"เข้าถึง HVAC ของรถ"</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"ระยะไมล์ของรถ"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"เข้าถึงข้อมูลระยะไมล์ของรถ"</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"ความเร็วรถ"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"เข้าถึงความเร็วของรถ"</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"สภาวะไดนามิกของยานพาหนะ"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"เข้าถึงสภาวะไดนามิกของรถ"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"ช่องทางของผู้ขายรถ"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"เข้าถึงช่องทางของผู้ขายรถเพื่อแลกเปลี่ยนข้อมูลเฉพาะของรถยนต์"</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"วิทยุในรถ"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"เข้าถึงวิทยุในรถ"</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"การแสดงอินเทอร์เฟซโทรศัพท์ในจอแสดงผลของรถ"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"ระดับเสียงของระบบเสียงรถ"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"การตั้งค่าระบบเสียงของรถ"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"แสดงอินเทอร์เฟซโทรศัพท์ในจอแสดงผลของรถ"</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"เลียนแบบ HAL ยานพาหนะ"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"เลียนแบบ HAL ยานพาหนะของรถคุณเพื่อจุดประสงค์ด้านการทดสอบภายใน"</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"ควบคุมระดับเสียงของระบบเสียงรถ"</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"ควบคุมการตั้งค่าระบบเสียงของรถ"</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"การบล็อกแอปพลิเคชัน"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"ควบคุมการบล็อกแอปพลิเคชันขณะขับรถ"</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"ตัวจัดการการนำทาง"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"รายงานข้อมูลการนำทางไปยังแผงหน้าปัด"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"การแสดงผลไปยังแผงหน้าปัดโดยตรง"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"อนุญาตให้แอปพลิเคชันประกาศกิจกรรมที่จะแสดงในแผงหน้าปัด"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"การควบคุมแผงหน้าปัด"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"เปิดแอปต่างๆ ในแผงหน้าปัด"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"การแสดงผลแผงหน้าปัด"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"รับข้อมูลจากแผงหน้าปัด"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"การกำหนดค่าข้อจำกัด UX"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"กำหนดค่าข้อจำกัด UX"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"บริการป้อนข้อมูลของรถ"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"จัดการเหตุการณ์การป้อนข้อมูล"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"CAN Bus ล้มเหลว"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN Bus ไม่ตอบสนอง ถอดปลั๊กกล่องเครื่องเล่นวิทยุ (Headunit) แล้วเสียบกลับเข้าไป สตาร์ทรถอีกครั้ง"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"เพื่อความปลอดภัย กิจกรรมนี้จะไม่เปิดให้ใช้งานขณะขับรถ\nคุณต้องจอดรถให้เรียบร้อยก่อน จึงจะดำเนินการต่อได้"</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"เลือก <xliff:g id="EXIT_BUTTON">%s</xliff:g> เพื่อเริ่มต้นใหม่โดยใช้ฟีเจอร์แอปที่ปลอดภัย"</string>
+ <string name="exit_button" msgid="5829638404777671253">"กลับ"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"ข้อมูลการวินิจฉัย"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"อ่านข้อมูลการวินิจฉัยจากรถ"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"ข้อมูลการวินิจฉัย"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"ล้างข้อมูลการวินิจฉัยจากรถ"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"ผู้เผยแพร่ข้อมูล VMS"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"เผยแพร่ข้อความ VMS"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"ผู้สมัครรับข้อมูล VMS"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"สมัครรับข้อมูล VMS"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"การตรวจสอบพื้นที่เก็บข้อมูลแฟลช"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"ตรวจสอบการใช้งานพื้นที่เก็บข้อมูลแฟลช"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"สถานะการขับรถ"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"ฟังการเปลี่ยนแปลงสถานะการขับรถ"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"รายละเอียดเครื่องยนต์"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"เข้าถึงข้อมูลเครื่องยนต์ของรถโดยละเอียด"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"ฝาถังน้ำมันหรือพอร์ตชาร์จไฟ"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"เข้าถึงฝาถังน้ำมันหรือพอร์ตชาร์จไฟ"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"การระบุตัวรถ"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"เข้าถึงการระบุตัวรถ"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"ประตูรถ"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"ควบคุมประตูรถ"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"หน้าต่างรถ"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"ควบคุมหน้าต่างรถ"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"กระจกรถ"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"ควบคุมกระจกรถ"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"ที่นั่งในรถ"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"ควบคุมที่นั่งในรถ"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"ข้อมูลเบื้องต้นของรถ"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"เข้าถึงข้อมูลเบื้องต้นของรถ"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"ไฟภายนอกรถ"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"เข้าถึงสถานะไฟภายนอกรถ"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"ไฟภายนอกรถ"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"ควบคุมแสงภายนอกรถ"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"อุณหภูมิภายนอกรถ"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"เข้าถึงข้อมูลอุณหภูมิภายนอกรถ"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"ยางรถ"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"เข้าถึงข้อมูลยางรถ"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"ระบบส่งกำลังของรถ"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"เข้าถึงข้อมูลระบบส่งกำลังของรถ"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"พลังงานของรถ"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"เข้าถึงสถานะพลังงานของรถ"</string>
+</resources>
diff --git a/service/res/values-tl/config.xml b/service/res/values-tl/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-tl/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-tl/strings.xml b/service/res/values-tl/strings.xml
new file mode 100644
index 0000000..5ac6e8b
--- /dev/null
+++ b/service/res/values-tl/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Impormasyon ng sasakyan"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"I-access ang impormasyon ng iyong sasakyan."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Cabin ng Sasakyan"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"I-access ang mga accessory ng iyong sasakyan, kabilang ang mga pintuan, salamin, upuan, at bintana."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Camera ng Sasakyan"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"I-access ang (mga) camera ng iyong sasakyan."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Enerhiya ng sasakyan"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"I-access ang impormasyon sa enerhiya ng iyong sasakyan."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"Hvac ng Sasakyan"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"I-access ang hvac ng iyong sasakyan."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Mileage ng sasakyan"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"I-access ang impormasyon sa mileage ng iyong sasakyan."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Bilis ng sasakyan"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"I-access ang bilis ng iyong sasakyan."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Status ng dynamics ng sasakyan"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"I-access ang status ng dynamics ng iyong sasakyan"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Channel ng vendor ng sasakyan"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"I-access ang channel ng vendor ng iyong sasakyan para makipagpalitan ng impormasyong partikular sa sasakyan."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Radyo ng Sasakyan"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"I-access ang radyo ng iyong sasakyan."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Pag-project ng Sasakyan"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Volume ng Audio ng Sasakyan"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Mga Setting ng Audio ng Sasakyan"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"I-project ang interface ng telepono sa display ng sasakyan."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Gayahin ang HAL ng sasakyan"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Gayahin ang HAL ng iyong sasakyan para sa layunin ng internal na pagsubok."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Kontrolin ang volume ng audio ng iyong sasakyan."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Kontrolin ang mga setting ng audio ng iyong sasakyan."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Pag-block ng application"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Kontrolin ang pag-block ng application habang nagmamaneho."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Navigation Manager"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Iulat ang navigation data sa cluster ng instrumento"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Idirekta ang pag-render sa cluster ng instrumento"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Payagan ang isang application na magpahayag ng mga aktibidad na ipapakita sa cluster ng instrumento"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Kontrol ng cluster ng instrumento"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Ilunsad ang mga app sa cluster ng instrumento"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Pag-render ng Cluster ng Instrumento"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Makatanggap ng data ng cluster ng instrumento"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"Configuration ng Mga Paghihigpit sa UX"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"I-configure ang Mga Paghihigpit sa UX"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Serbisyo sa Input ng Sasakyan"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Pangasiwaan ang mga event ng input"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"Hindi gumana ang CAN bus"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"Hindi tumugon ang CAN bus. Hugutin at muling isaksak ang headunit box at i-restart ang sasakyan"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"Para sa seguridad, hindi available ang aktibidad habang nagmamaneho.\nPara magpatuloy, maghintay hanggang sa makaparada."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"Para magsimula sa mga ligtas na feature ng app, piliin ang <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Bumalik"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Impormasyon sa Pag-debug"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Diagnostic Data"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Basahin ang data ng mga diagnostic mula sa sasakyan"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Diagnostic Data"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"I-clear ang data ng diagnostic sa sasakyan"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"Publisher ng VMS"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"Mag-publish ng mga mensahe ng vms"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"Subscriber ng VMS"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"Mag-subscribe sa mga mensahe ng vms"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Pagsubaybay sa storage ng flash"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Subaybayan ang paggamit ng storage ng flash"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Status ng Pagmamaneho"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Makinig sa mga Mga pagbabago ng status ng pagmamaneho"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Detalye ng Makina"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"I-access ang detalyadong impormasyon ng makina ng iyong sasakyan"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Mga Port ng Enerhiya"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"I-access ang mga port ng enerhiya"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Pagkakakilanlan ng sasakyan"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"I-access ang pagkakakilanlan ng sasakyan"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Mga Pintuan ng Sasakyan"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Kontrolin ang mga pintuan ng sasakyan"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Mga Bintana ng Sasakyan"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Kontrolin ang mga bintana ng sasakyan"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Mga Salamin ng Sasakyan"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Kontrolin ang mga salamin ng sasakyan"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Mga Upuan ng Sasakyan"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Kontrolin ang mga upuan ng sasakyan"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Pangunahing impormasyon ng sasakyan"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"I-access ang pangunahing impormasyon ng sasakyan"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Mga ilaw sa exterior ng sasakyan"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"I-access ang status ng mga ilaw sa exterior ng sasakyan"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Mga ilaw sa exterior ng sasakyan"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Kontrolin ang mga ilaw sa exterior ng sasakyan"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Temperatura ng exterior ng sasakyan"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"I-access ang temperatura ng exterior ng sasakyan"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Mga gulong ng sasakyan"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"I-access ang impormasyon sa gulong ng sasakyan"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Powertrain ng Sasakyan"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"I-access ang impormasyon ng powertrain ng sasakyan"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Power ng Sasakyan"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"I-access ang status ng power ng sasakyan"</string>
+</resources>
diff --git a/service/res/values-tr/config.xml b/service/res/values-tr/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-tr/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-tr/strings.xml b/service/res/values-tr/strings.xml
new file mode 100644
index 0000000..c3a3435
--- /dev/null
+++ b/service/res/values-tr/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Araç bilgileri"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Aracınızın bilgilerine erişim."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Araç Kabini"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Kapılar, aynalar, koltuklar ve camlar dahil aracınızın aksesuarlarına erişim."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Araç Kamerası"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Aracınızın kameralarına erişim."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Araç enerjisi"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Aracınızın enerji bilgilerine erişim."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"Araç HVAC\'si"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Aracınızın HVAC\'sine erişim."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Aracın kilometresi"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Aracınızın kilometre bilgilerine erişim."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Aracın hızı"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Aracınızın hız bilgilerine erişim."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Araç dinamiklerinin durumu"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Araç dinamiklerinin durumuna erişim"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Aracın tedarikçi firma kanalı"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Araca özel bilgileri gönderip almak için aracınızın tedarikçi firma kanalına erişim."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Araç Radyosu"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Aracınızın radyosuna erişim."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Araç Projeksiyonu"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Araç Ses Seviyesi"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Araç Ses Ayarları"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Telefon arayüzünü araç ekranına yansıtma."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Araç HAL\'sini taklit etme"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Şirket içi test amaçları için aracınızın HAL\'ini taklit etme."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Aracınızın ses seviyesini kontrol etme."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Aracınızın ses ayarlarını kontrol etme."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Uygulama engelleme"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Sürüş sırasında uygulama engellemeyi kontrol etme."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Navigasyon Yöneticisi"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Navigasyon verilerini gösterge grubuna bildirme"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Gösterge grubunda doğrudan oluşturma"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Uygulamaların, gösterge grubunda gösterilecek etkinlikleri bildirmesine izin verme"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Gösterge grubu kontrolü"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Gösterge grubunda uygulamaları başlatma"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Gösterge Grubunda Oluşturma"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Gösterge grubu verilerini alma"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"Kullanıcı Deneyimi Kısıtlamaları Yapılandırması"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"Kullanıcı Deneyimi Kısıtlamalarını Yapılandırma"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Araç Giriş Hizmeti"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Giriş olaylarını işleme"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"CAN veri yolu başarısız"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN veri yolu yanıt vermiyor. Ana birim kutusunu söküp tekrar takın ve aracı yeniden çalıştırın"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"Güvenliğiniz için bu etkinlik sürüş sırasında gerçekleştirilemez.\nDevam etmek için park edene dek bekleyin."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"Güvenli uygulama özellikleriyle baştan başlamak için <xliff:g id="EXIT_BUTTON">%s</xliff:g> düğmesini seçin."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Geri"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Hata Ayıklama Bilgileri"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Teşhis Verileri"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Araçtan teşhis verilerini okuma"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Teşhis Verileri"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Araçtan teşhis verilerini temizleme"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"VMS yayıncısı"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"VMS mesajlarını yayınlama"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"VMS abonesi"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"VMS mesajlarına abone olma"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Flash depolama alanını izleme"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Flash depolama alanı kullanımını izleme"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Araç Kullanma Durumu"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Araç kullanma durumundaki değişiklikleri dinleme"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Ayrıntılı Olarak Motor"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Aracınızın ayrıntılı motor bilgilerine erişim"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Enerji Noktaları"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Enerji noktalarına erişim"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Araç kimliği"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Aracın kimliğine erişim"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Araç Kapıları"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Aracın kapılarını kontrol etme"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Araç Camları"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Araç camlarını kontrol etme"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Araç Aynaları"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Aracın aynalarını kontrol etme"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Araç Koltukları"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Aracın koltuklarını kontrol etme"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Araçla ilgili temel bilgiler"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Araçla ilgili temel bilgilere erişim"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Araç dış ışıkları"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Araç dış ışıklarının durumuna erişim"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Araç dış ışıkları"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Araç dış ışıklarını kontrol etme"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Araç dış sıcaklığı"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Aracın dış sıcaklığına erişim"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Araç lastikleri"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Aracın lastik bilgilerine erişim"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Araç Güç Aktarma Mekanizması"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Aracın güç aktarma mekanizmasıyla ilgili bilgilere erişim"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Araç Gücü"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Aracın güç durumuna erişim"</string>
+</resources>
diff --git a/service/res/values-uk/config.xml b/service/res/values-uk/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-uk/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-uk/strings.xml b/service/res/values-uk/strings.xml
new file mode 100644
index 0000000..44f5883
--- /dev/null
+++ b/service/res/values-uk/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Інформація про автомобіль"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Доступ до інформації про автомобіль."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Салон автомобіля"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Доступ до другорядного обладнання автомобіля (зокрема, дверей, дзеркал, сидінь і вікон)."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Камера автомобіля"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Доступ до камер автомобіля."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Енергоспоживання автомобіля"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Доступ до інформації про енергоспоживання автомобіля."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"Система клімат-контролю автомобіля"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Доступ до системи клімат-контролю автомобіля."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Пробіг автомобіля"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Доступ до інформації про пробіг автомобіля."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Швидкість автомобіля"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Доступ до інформації про швидкість автомобіля."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Стан динаміки автомобіля"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Доступ до стану динаміки автомобіля"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Канал виробника автомобіля"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Доступ до каналу виробника для обміну інформацією про автомобіль."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Автомобільний радіоприймач"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Доступ до автомобільного радіоприймача."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Проекція на екран автомобіля"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Гучність аудіосистеми автомобіля"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Налаштування аудіосистеми автомобіля"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Проекція інтерфейсу телефона на екран автомобіля."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Емуляція рівня HAL автомобіля"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Імітація рівня HAL автомобіля для внутрішнього тестування."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Керування гучністю аудіосистеми автомобіля."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Керування налаштуваннями аудіосистеми автомобіля."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Блокування додатків"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Керування блокуванням додатків під час поїздки."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Навігатор"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Передавання даних навігації на панель приладів"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Відображення безпосередньо на панелі приладів"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Дозволити додатку оголошувати дії, які показуватимуться на панелі приладів"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Керування панеллю приладів"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Запуск додатків на панелі приладів"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Відображення панелі приладів"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Отримувати дані з панелі приладів"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"Конфігурація обмежень використання функцій"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"Налаштувати обмеження щодо використання функцій"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Сервіс даних про вхідні події автомобіля"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Обробка вхідних подій"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"Помилка CAN-шини"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN-шина не відповідає. Від’єднайте та знову під’єднайте головний пристрій аудіосистеми й заведіть автомобіль ще раз"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"Задля вашої безпеки ці дії недоступні під час поїздки.\nЩоб продовжити, зупиніть автомобіль."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"Щоб почати знову з безпечними функціями додатка, натисніть кнопку \"<xliff:g id="EXIT_BUTTON">%s</xliff:g>\"."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Назад"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Дані діагностики"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Перегляд даних діагностики автомобіля"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Дані діагностики"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Очищення даних діагностики автомобіля"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"Автор дорожніх повідомлень"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"Публікація дорожніх повідомлень"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"Отримувач дорожніх повідомлень"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"Підписка на дорожні повідомлення"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Відстеження флеш-пам’яті"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Відстеження використання флеш-пам’яті"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Стан кермування"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Відстеження змін стану кермування"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Детальна інформація про двигун"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Доступ до детальної інформації про двигун автомобіля"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Кришка паливного бака/порт заряджання"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Доступ до кришки паливного бака чи порту заряджання автомобіля"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Ідентифікаційний номер автомобіля"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Доступ до ідентифікаційного номера автомобіля"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Двері автомобіля"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Керування дверима автомобіля"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Вікна автомобіля"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Керування вікнами автомобіля"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Дзеркала автомобіля"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Керування дзеркалами автомобіля"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Автомобільні сидіння"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Керування сидіннями автомобіля"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Основна інформація про автомобіль"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Доступ до основної інформації про автомобіль"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Зовнішні світлові прилади автомобіля"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Доступ до стану зовнішніх світлових приладів автомобіля"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Зовнішнє освітлення автомобіля"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Керування зовнішніми світловими приладами автомобіля"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Зовнішня температура автомобіля"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Доступ до зовнішньої температури автомобіля"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Автомобільні шини"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Доступ до інформації про шини автомобіля"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Трансмісія автомобіля"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Доступ до інформації про трансмісію автомобіля"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Заряд автомобіля"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Доступ до рівня заряду автомобіля"</string>
+</resources>
diff --git a/service/res/values-ur/config.xml b/service/res/values-ur/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-ur/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-ur/strings.xml b/service/res/values-ur/strings.xml
new file mode 100644
index 0000000..56a9dba
--- /dev/null
+++ b/service/res/values-ur/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"کار کی معلومات"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"اپنی کار کی معلومات تک رسائی حاصل کریں۔"</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"کار کی کیبن"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"اپنی کار کے لوازمات بشمول دروازوں، آئینوں، سیٹوں اور کھڑکیوں تک رسائی حاصل کریں۔"</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"کار کا کیمرا"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"اپنی کار کے کیمرے (کیمروں) تک رسائی حاصل کریں۔"</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"کار کی انرجی"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"اپنی کار کی انرجی کی معلومات تک رسائی حاصل کریں۔"</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"کار کی Hvac"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"اپنی کار کی hvac تک رسائی حاصل کریں۔"</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"کار کی مائلیج"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"اپنی کار کی مائلیج کی معلومات تک رسائی حاصل کریں۔"</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"کار کی رفتار"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"اپنی کار کی رفتار تک رسائی حاصل کریں۔"</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"گاڑی کی ڈائنیمک صورتحال"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"اپنی کار کی ڈائنیمک صورتحال تک رسائی حاصل کریں"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"کار وینڈر چینل"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"کار کی مخصوص معلومات کا تبادلہ کرنے کے لیے اپنی کار کے وینڈر چینل تک رسائی حاصل کریں۔"</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"کار کی ریڈیو"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"اپنی کار کی ریڈیو تک رسائی حاصل کریں۔"</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"کار کا پروجیکشن"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"کار کی آڈیو کا والیوم"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"کار کی آڈیو کی ترتیبات"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"کار کے ڈسپلے پر فون کے انٹرفیس کا تخمینہ کریں۔"</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"HAL وہیکل کی تقلید کریں"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"اندرونی طور پر ٹیسٹنگ کے مقصد سے اپنی کار کی وہیکل HAL کو تقلید کریں۔"</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"اپنی کار کی آڈیو کا والیوم کنٹرول کریں۔"</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"اپنی کار کی آڈیو کی ترتیبات کو کنٹرول کریں۔"</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"ایپلیکیشن کو مسدود کیا جا رہا ہے"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"ڈرائیونگ کے دوران ایپلیکیشن کے مسدود کرنے کے عمل کو کنٹرول کریں۔"</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"نیویگیشن مینیجر"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"آلہ کے گروہ کو نیویگیشن ڈیٹا کی اطلاع دیں"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"آلہ کے گروہ تک براہ راست رسائی حاصل کریں"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"آلہ کے گروہ میں ڈسپلے ہونے کے لیے ایپلیکیشن کو سرگرمیوں کو واضع کرنے کی اجازت دیں"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"آلہ کے گروہ کو کنٹرول کریں"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"آلہ کے گروہ میں اپپس کو شروع کریں"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"آلہ کے گروہ کی رینڈرنگ"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"آلہ کے گروہ کا ڈیٹا موصول کریں"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"UX کی پابندیوں کی ترتیب"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"UX کی پابندیاں ترتیب دیں"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"کار کی ان پٹ سروس"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"ایونٹس کے ان پٹ کو ہینڈل کریں"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"کین بس ناکام ہو گئی"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"کین بس جواب نہیں دیتی ہے۔ ہیڈیونٹ باکس کو ان پلگ کر کے دوبارہ پلگ کریں اور کار کو دوبارہ شروع کریں"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"آپ کی حفاظت کے لیے یہ سرگرمی آپ کے کار چلانے کے دوران دستیاب نہیں ہے۔\n جاری رکھنے کے لیے کار کے پارک ہونے تک انتظار کریں۔"</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"محفوظ اپپ کی خصوصیات کے ساتھ شروع کرنے کے لیے <xliff:g id="EXIT_BUTTON">%s</xliff:g> پر کلک کریں۔"</string>
+ <string name="exit_button" msgid="5829638404777671253">"پیچھے"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"ڈیبگ کی معلومات"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"تشخیصی ڈیٹا"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"کار کے تشخیصی ڈیٹا کو پڑھیں"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"تشخیصی ڈیٹا"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"کار کے ذریعے دی گئی تشخیصی ڈیٹا کو صاف کریں"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"VMS ناشر"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"vms پیغامات شائع کریں"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"VMS سبسکرائبر"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"vms پیغامات کو سبسکرائب کریں"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"اسٹوریج کی نگرانی کو فلیش کریں"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"فلیش کے اسٹوریج کے استعمال کی نگرانی کریں"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"ڈرائیونگ کے دوران"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"کار چلانے کے دوران کی تبدیلیوں کو سنیں"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"انجن کی تفصیلات"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"اپنی کار کے انجن کی تفصیلی معلومات تک رسائی حاصل کریں"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"انرجی پورٹس"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"انرجی پورٹس تک رسائی حاصل کریں"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"کار کی شناخت"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"کار کی شناخت تک رسائی حاصل کریں"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"کار کے دروازے"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"کار کے دروازوں کو کنٹرول کریں"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"کار کی کھڑکیاں"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"کار کی کھڑکیوں کو کنٹرول کریں"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"کار کے آئینے"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"کار کے آئینوں کو کنٹرول کریں"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"کار کی سیٹیں"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"کار کی سیٹس کو کنٹرول کریں"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"کار کی بنیادی معلومات"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"کار کی بنیادی معلومات تک رسائی حاصل کریں"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"کار کی بیرونی لائٹس"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"کار کی بیرونی لائٹس کی صورتحال تک رسائی حاصل کریں"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"کار کی بیرونی لائٹس"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"کار کی بیرونی لائٹس کو کنٹرول کریں"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"کار کا بیرونی درجہ حرارت"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"کار کے باہری درجہ حرارت تک رسائی حاصل کریں"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"کار کے ٹائرز"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"کار کی ٹائر کی معلومات تک رسائی حاصل کریں"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"کار کی پاورٹرین"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"کار کی پاورٹرین معلومات تک رسائی حاصل کریں"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"کار کا پاور"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"کار کے پاور کی صورتحال تک رسائی حاصل کریں"</string>
+</resources>
diff --git a/service/res/values-uz/config.xml b/service/res/values-uz/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-uz/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-uz/strings.xml b/service/res/values-uz/strings.xml
new file mode 100644
index 0000000..df5db6d
--- /dev/null
+++ b/service/res/values-uz/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Avtomobil haqida axborot"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Avtomobil maʼlumotlariga kirish."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Avtomobil saloni"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Avtomobilning qoʻshimcha jihozlari, shuningdek, eshik, koʻzgu, oʻrindiq va oynalaridan foydalanish."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Avtomobil kamerasi"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Avtomobil kamerasidan foydalanish"</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Energiya resurslari"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Avtomobilning energiya axborotlariga kirish"</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"Avtomobildagi HVAC tizimi"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Avtomobilning HVAC tizimiga kirish."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Avtomobil bosib oʻtgan masofa"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Avtomobil yonilgʻisi qancha masofaga yetishi haqidagi axborotga kirish."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Avtomobil tezligi"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Avtomobil tezligi haqidagi axborotga kirish."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Avtomobil dinamikasi holati"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Avtomobil dinamikasi haqidagi axborotdan foydalanish"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Avtomobil ishlab chiqaruvchisining kanali"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Avtomobillarga oid maʼlumotlarni almashish uchun avtomobil ishlab chiqaruvchisining kanaliga kirish."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Avtomobil radiosi"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Avtomobil radiosidan foydalanish."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Avtomobil ekraniga translyatsiya"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Audio tizim tovushi balandligi"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Avtomobil audio tizimi sozlamalari"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Telefon interfeysini avtomobil ekraniga chiqarish"</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"HAL interfeysini emulyatsiya qilish"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Ichki sinov uchun HAL interfeysini emulyatsiya qilish."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Audio tizim tovushi balandligini boshqarish"</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Avtomobil audio tizimi sozlamalarini boshqarish."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Ilovalarni bloklash"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Haydash vaqtida ilovani bloklashni boshqarish"</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Navigator"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Asboblar panelida navigatsiya axborotini chiqarish"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Axborotlarni asboblar paneliga chiqarish"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Amalga oshirilgan faoliyatlarni asboblar paneliga chiqarish uchun ilovaga ruxsat berish"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Asboblar panelini boshqarish"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Asboblar panelida ilovalarni ishga tushirish"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Axborotlarni asboblar paneliga chiqarish"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Asboblar panelidan axborotlarni olish"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"Funksiyadan foydalanish cheklovini oʻrnatish"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"Funksiyalardan foydalanishni cheklash"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Avtomobilda matn kiritish xizmati"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Matn kiritish hodisalari bilan ishlash imkoniyati"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"CAN shinalarida xatolik yuz berdi"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN javob bermayapti. Konnektorni chiqaring va qayta ulang, keyin avtomobilni oʻt oldiring"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"Avtomobil haydayotganingizda bu harakatni amalga oshira olmaysiz.\nUni bajarish uchun avtomobilni toʻxtating."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"Ilovani xavfsiz rejimda ishga tushirish uchun <xliff:g id="EXIT_BUTTON">%s</xliff:g> tugmasini bosing."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Orqaga"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Diagnostika axboroti"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Avtomobildan diagnostika axborotini olish"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Diagnostika axboroti"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Avtomobilning diagnostika axborotini tozalash"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"VMS xabarlarni chiqarish"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"VMS xabarlarni ekranga chiqarish"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"VMS xabarlarga obuna"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"VMS xabarlarga obuna"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Flesh xotirani nazorat qilish"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Flesh xotiradan foydalanishni nazorat qilish"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Avtomobilda rejimi"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Avtomobilda rejimining oʻzgarishini kuzatish"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Dvigatel"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Avtomobil dvigateli haqidagi batafsil axborotga kirish"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Energiya portlari"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Energiya portlaridan foydalanish"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Avtomobilning identifikatsiya raqami"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Avtomobilning identifikatsiya axborotiga kirish"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Avtomobil eshiklari"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Avtomobil eshiklarini boshqarish"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Avtomobil oynalari"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Avtomobilning oynalarini boshqarish"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Avtomobil koʻzgulari"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Avtomobil oynalarini boshqarish imkoniyati"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Avtomobil oʻrindiqlari"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Avtomobil oʻrindiqlarni boshqarish"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Avtomobil haqida umumiy axborot"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Avtomobil haqidagi umumiy axborotga kirish"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Avtomobilning tashqi chiroqlari"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Avtomobilning tashqi chiroqlaridan foydalanish"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Avtomobilning tashqi chiroqlari"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Avtomobilning tashqi chiroqlarini boshqarish"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Avtomobil tashqarisidagi harorat"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Tashqaridagi harorat haqidagi axborotni olish"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Avtomobil shinalari"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Avtomobil shinalari haqidagi axborotni olish"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Avtomobil quvvat uzatmasi"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Quvvat uzatmasi (tranmissiya) haqidagi axborotga kirish"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Avtomobil quvvati"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Avtomobilning quvvati haqidagi axborotga kirish"</string>
+</resources>
diff --git a/service/res/values-vi/config.xml b/service/res/values-vi/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-vi/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-vi/strings.xml b/service/res/values-vi/strings.xml
new file mode 100644
index 0000000..5c4dbae
--- /dev/null
+++ b/service/res/values-vi/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Thông tin về ô tô"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Truy cập vào thông tin về ô tô."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Buồng lái ô tô"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Truy cập vào thông tin về phụ kiện của ô tô, bao gồm cửa, gương, ghế ngồi và cửa sổ."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Camera trên ô tô"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Truy cập vào (các) camera trên ô tô."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Mức năng lượng của ô tô"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Truy cập vào thông tin về mức năng lượng trên ô tô."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"Hvac của ô tô"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Truy cập vào hvac của ô tô."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Số dặm ô tô đã đi"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Truy cập vào thông tin về số dặm ô tô đã đi."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Tốc độ của ô tô"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Truy cập vào thông tin về tốc độ của ô tô."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Trạng thái động của phương tiện"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Truy cập vào trạng thái động của ô tô"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Kênh của nhà cung cấp ô tô"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Truy cập vào kênh của nhà cung cấp ô tô để trao đổi thông tin cụ thể về ô tô."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Đài trên ô tô"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Truy cập vào đài trên ô tô."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Chiếu trên ô tô"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Âm lượng âm thanh trên ô tô"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Tùy chọn cài đặt âm thanh trên ô tô"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Chiếu giao diện điện thoại lên màn hình trên ô tô."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Mô phỏng HAL của phương tiện"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Mô phỏng HAL phương tiện của ô tô cho mục đích kiểm tra nội bộ."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Kiểm soát âm lượng âm thanh trên ô tô."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Kiểm soát tùy chọn cài đặt âm thanh trên ô tô."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Chặn ứng dụng"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Kiểm soát tính năng chặn ứng dụng trong khi lái xe."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Trình quản lý điều hướng"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Báo cáo dữ liệu điều hướng cho nhóm dụng cụ"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Hiển thị trực tiếp với nhóm dụng cụ"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Cho phép ứng dụng khai báo các hoạt động sẽ hiển thị trong nhóm dụng cụ"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Kiểm soát nhóm dụng cụ"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Khởi chạy ứng dụng trong nhóm dụng cụ"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Hiển thị nhóm dụng cụ"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Nhận dữ liệu nhóm dụng cụ"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"Cấu hình hạn chế trải nghiệm người dùng"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"Định cấu hình các hạn chế trải nghiệm người dùng"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Dịch vụ nhập dành cho ô tô"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Xử lý sự kiện nhập"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"Đường dẫn chính CAN không hoạt động"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"Đường dẫn chính CAN không phản hồi. Rút rồi cắm lại hộp bộ đầu và khởi động lại ô tô"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"Vì lý do an toàn, bạn không sử dụng được hoạt động này trong khi lái xe.\nHãy đợi cho tới khi bạn đỗ xe để tiếp tục."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"Để bắt đầu lại với các tính năng an toàn của ứng dụng, hãy chọn <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Quay lại"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Thông tin gỡ lỗi"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Dữ liệu chẩn đoán"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Đọc dữ liệu chẩn đoán từ ô tô"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Dữ liệu chẩn đoán"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Xóa dữ liệu chẩn đoán khỏi ô tô"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"Nhà xuất bản VMS"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"Xuất bản tin nhắn vms"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"Người đăng ký nhận dữ liệu VMS"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"Đăng ký nhận tin nhắn vms"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Giám sát bộ nhớ flash"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Giám sát mức sử dụng bộ nhớ flash"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Trạng thái lái xe"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Nghe những nội dung thay đổi về trạng thái lái xe"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Thông tin chi tiết về động cơ"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Truy cập vào thông tin động cơ chi tiết của ô tô"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Cổng năng lượng"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Truy cập vào thông tin về cổng năng lượng"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Thông tin nhận dạng ô tô"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Truy cập vào thông tin nhận dạng ô tô"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Cửa trên ô tô"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Kiểm soát cửa trên ô tô"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Cửa sổ trên ô tô"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Kiểm soát cửa sổ trên ô tô"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Gương trên ô tô"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Kiểm soát gương trên ô tô"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Ghế ngồi trên ô tô"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Kiểm soát ghế ngồi trên ô tô"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Thông tin cơ bản về ô tô"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Truy cập vào thông tin cơ bản về ô tô"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Đèn bên ngoài ô tô"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Truy cập vào trạng thái đèn bên ngoài ô tô"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Đèn bên ngoài ô tô"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Kiểm soát đèn bên ngoài ô tô"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Nhiệt độ bên ngoài ô tô"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Truy cập vào thông tin về nhiệt độ bên ngoài ô tô"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Lốp ô tô"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Truy cập vào thông tin về lốp xe ô tô"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"Hệ thống truyền động của ô tô"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Truy cập vào thông tin về hệ thống truyền động của ô tô"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Nguồn điện của ô tô"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Truy cập vào thông tin về trạng thái nguồn điện của ô tô"</string>
+</resources>
diff --git a/service/res/values-w1280dp/dimens.xml b/service/res/values-w1280dp/dimens.xml
deleted file mode 100644
index f5469f2..0000000
--- a/service/res/values-w1280dp/dimens.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<resources>
- <!-- Padding of ActivityBlockingActivity. -->
- <dimen name="blocking_activity_padding">148dp</dimen>
-</resources>
diff --git a/service/res/values-w1920dp/dimens.xml b/service/res/values-w1920dp/dimens.xml
deleted file mode 100644
index 75d2deb..0000000
--- a/service/res/values-w1920dp/dimens.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<resources>
- <!-- Padding of ActivityBlockingActivity. -->
- <dimen name="blocking_activity_padding">192dp</dimen>
-</resources>
diff --git a/service/res/values-w690dp/dimens.xml b/service/res/values-w690dp/dimens.xml
deleted file mode 100644
index 0b06ada..0000000
--- a/service/res/values-w690dp/dimens.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2018, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<resources>
- <!-- Padding of ActivityBlockingActivity. -->
- <dimen name="blocking_activity_padding">112dp</dimen>
-</resources>
diff --git a/service/res/values-zh-rCN/config.xml b/service/res/values-zh-rCN/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-zh-rCN/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-zh-rCN/strings.xml b/service/res/values-zh-rCN/strings.xml
new file mode 100644
index 0000000..63ec7b1
--- /dev/null
+++ b/service/res/values-zh-rCN/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"汽车信息"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"访问汽车信息。"</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"车厢"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"访问汽车配件(包括车门、车镜、车座和车窗)。"</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"汽车摄像头"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"访问汽车摄像头。"</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"汽车能耗信息"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"访问汽车的能耗信息。"</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"汽车 HVAC"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"访问汽车的 HVAC。"</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"汽车行驶里程"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"访问汽车的里程信息。"</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"车速"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"访问车速信息。"</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"车辆移动状态"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"访问汽车的移动状态信息"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"汽车供应商渠道"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"访问汽车的供应商渠道信息,以交换汽车专属信息。"</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"汽车收音机"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"访问汽车收音机。"</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"汽车投屏"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"汽车音频音量"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"汽车音频设置"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"将手机界面投放到汽车显示屏上。"</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"模拟车载 HAL"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"模拟汽车的车载 HAL 以进行内部测试。"</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"控制汽车的音频音量。"</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"控制汽车的音频设置。"</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"应用屏蔽"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"控制驾车时的应用屏蔽情况。"</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"导航管理器"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"将导航数据报给仪表板"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"直接呈现在仪表板上"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"允许应用声明即将在仪表板上显示的活动"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"仪表板控制"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"在仪表板上启动应用"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"仪表板呈现"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"接收仪表板数据"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"用户体验限制条件配置"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"配置用户体验限制条件"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"汽车输入服务"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"处理输入事件"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"CAN 总线故障"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"CAN 总线没有响应。请将主机盒插头拔下并插回,然后重新启动汽车"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"为了确保您的安全,您无法在开车时执行这项活动。\n要继续,请先停车。"</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"要重新开始使用安全的应用功能,请选择<xliff:g id="EXIT_BUTTON">%s</xliff:g>。"</string>
+ <string name="exit_button" msgid="5829638404777671253">"返回"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"调试信息"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"诊断数据"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"读取汽车的诊断数据"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"诊断数据"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"清除汽车的诊断数据"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"VMS 发布商"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"发布 VMS 消息"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"VMS 订阅者"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"订阅 VMS 消息"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"闪存监控"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"监控闪存使用情况"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"驾车状态"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"监听驾车状态变化"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"引擎详情"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"访问汽车的详细引擎信息"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"能源端口"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"访问能量端口"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"汽车识别信息"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"访问汽车的标识信息"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"车门"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"控制车门"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"车窗"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"控制车窗"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"车镜"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"控制车镜"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"车座"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"控制车座"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"汽车基本信息"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"访问汽车基本信息"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"汽车外部灯具"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"访问汽车外部灯具状态信息"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"汽车外部灯具"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"控制汽车外部灯具"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"汽车外部温度"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"访问汽车外部温度信息"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"车胎"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"访问车胎信息"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"汽车动力总成"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"访问汽车动力总成信息"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"汽车电源"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"访问汽车电源状态信息"</string>
+</resources>
diff --git a/service/res/values-zh-rHK/config.xml b/service/res/values-zh-rHK/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-zh-rHK/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-zh-rHK/strings.xml b/service/res/values-zh-rHK/strings.xml
new file mode 100644
index 0000000..d709e0d
--- /dev/null
+++ b/service/res/values-zh-rHK/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"汽車資訊"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"存取汽車資訊。"</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"車箱"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"存取汽車配件,包括車門、倒後鏡、座位和車窗。"</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"汽車攝錄機"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"存取汽車攝錄機。"</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"汽車電量"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"存取汽車的電量資訊。"</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"汽車的暖通空調"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"存取汽車的暖通空調。"</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"行車里數"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"存取汽車里數資訊。"</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"車速"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"存取車速。"</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"汽車動力狀態"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"存取汽車的動力狀態"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"汽車供應商頻道"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"存取汽車供應商頻道,以交換汽車特定資訊。"</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"汽車收音機"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"存取汽車的收音機。"</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"汽車投影"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"汽車音響音量"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"汽車音響設定"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"將手機介面投放至汽車螢幕。"</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"模擬執行汽車 HAL"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"模擬執行汽車的 HAL 用作內部測試。"</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"控制汽車的音響音量。"</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"控制汽車的音響設定。"</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"封鎖的應用程式"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"控制駕駛時封鎖的應用程式。"</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"導航管理員"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"向儀表板報告導航資料"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"直接輸出至儀表板"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"允許應用程式於儀表板顯示活動"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"儀表板控制器"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"在儀表板啟動應用程式"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"正在輸出儀表板"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"接收儀表板資料"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"使用者體驗限制設定"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"設定使用者體驗限制"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"汽車輸入服務"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"處理輸入活動"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"控制器區域網路操作失敗"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"控制器區域網路未有回覆。請拔除並重新插上汽車音響主機,然後重新啟動汽車"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"基於安全理由,駕駛時無法執行此操作。\n如要繼續,請留待泊車後操作。"</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"如要以安全應用程式功能重新啟動,請選擇 <xliff:g id="EXIT_BUTTON">%s</xliff:g>。"</string>
+ <string name="exit_button" msgid="5829638404777671253">"返回"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"Debug Info"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"診斷資料"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"在汽車中讀取診斷資料"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"診斷資料"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"清除汽車的診斷資料"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"交通訊息顯示屏訊息發佈者"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"發佈交通訊息顯示屏訊息"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"交通訊息顯示屏訊息訂閱者"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"訂閱交通訊息顯示屏訊息"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"監控快閃儲存空間"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"監控快閃儲存空間使用狀態"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"駕駛狀態"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"聽取駕駛狀態變動"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"引擎詳情"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"存取汽車引擎詳情"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"電源連接埠"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"存取電源連接埠"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"汽車識別"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"存取汽車識別資訊"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"車門"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"控制車門"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"車窗"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"控制車窗"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"汽車倒後鏡"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"控制汽車倒後鏡"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"汽車座位"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"控制汽車座位"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"汽車基本資訊"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"存取汽車基本資訊"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"汽車外部燈光"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"存取汽車外部燈光狀態"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"汽車外部燈光"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"控制汽車外部燈光"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"汽車外的氣溫"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"存取汽車外的氣溫"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"車胎"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"存取車胎資訊"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"汽車動力傳動系統"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"存取汽車動力傳動系統資訊"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"汽車能源"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"存取汽車的能源狀態"</string>
+</resources>
diff --git a/service/res/values-zh-rTW/config.xml b/service/res/values-zh-rTW/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-zh-rTW/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-zh-rTW/strings.xml b/service/res/values-zh-rTW/strings.xml
new file mode 100644
index 0000000..f76aa3c
--- /dev/null
+++ b/service/res/values-zh-rTW/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"車輛資訊"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"存取車輛資訊。"</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"車艙"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"存取車輛的配件 (包含門、鏡子、座位和窗戶)。"</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"車輛鏡頭"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"存取車輛攝影機。"</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"車輛能源"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"存取車輛的能源資訊。"</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"車輛空調"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"存取車輛空調。"</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"車輛行駛里程"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"存取車輛的行駛里程資訊。"</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"車速"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"存取車速。"</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"車輛移動狀態"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"存取車輛移動狀態"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"車商頻道"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"存取車商頻道,交流車輛專屬資訊。"</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"車輛收音機"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"存取車輛收音機。"</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"車輛投放"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"車輛音訊音量"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"車輛音訊設定"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"將手機介面投放至車輛螢幕。"</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"模擬車輛 HAL"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"模擬車輛 HAL 做為內部測試用途。"</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"控制車輛音訊音量。"</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"控制車輛音訊設定。"</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"應用程式封鎖"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"開車期間控制應用程式封鎖。"</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"導航管理員"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"將導航資料回報至儀錶板"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"直接顯示在儀錶板"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"允許應用程式宣告顯示在儀錶板的活動"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"儀錶板控制"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"在儀錶板中啟動應用程式"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"儀錶板轉譯"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"接收儀錶板資料"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"使用者體驗限制設定"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"設定使用者體驗限制"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"車輛輸入服務"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"處理輸入事件"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"控制器區域網路發生問題"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"控制器區域網路無回應。請將主機盒插頭拔下並插回,然後重新啟動車輛"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"為了你的安全,開車期間不得進行這個活動。\n如要繼續,請先停車。"</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"如要使用安全應用程式功能重新啟動,請選取「離開」按鈕 <xliff:g id="EXIT_BUTTON">%s</xliff:g>。"</string>
+ <string name="exit_button" msgid="5829638404777671253">"返回"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"偵錯資訊"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"診斷資料"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"讀取車輛診斷資料"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"診斷資料"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"從車輛中清除診斷資料"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"VMS 發佈商"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"發佈 VMS 訊息"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"VMS 訂閱者"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"訂閱 VMS 訊息"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"快閃記憶體儲存空間監控"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"監控快閃記憶體用量"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"開車狀態"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"聽取開車狀態變化"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"引擎詳細資料"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"存取車輛詳細引擎資訊"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"油箱口/充電口"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"存取油箱口/充電口"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"車輛識別資料"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"存取車輛識別資料"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"車門"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"控制車門"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"車窗"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"控制車窗"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"車輛鏡子"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"控制車輛鏡子"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"車輛座位"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"控制車輛座位"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"車輛基礎資訊"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"存取車輛基本資訊"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"車輛外部燈光"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"存取車輛外部燈光狀態"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"車輛外部燈光"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"控制車輛外部燈光"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"車外溫度"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"存取車外溫度"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"車輪"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"存取車輪資訊"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"車輛動力傳動系統"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"存取車輛動力總成資訊"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"車輛動力"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"存取車輛動力狀態"</string>
+</resources>
diff --git a/service/res/values-zu/config.xml b/service/res/values-zu/config.xml
new file mode 100644
index 0000000..39f834b
--- /dev/null
+++ b/service/res/values-zu/config.xml
@@ -0,0 +1,34 @@
+<?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 may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT 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 to configure car service based on each OEM's preference. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="inputService" msgid="3911088558664251138">"android.car.input.service/.DefaultInputService"</string>
+ <string name="instrumentClusterRendererService" msgid="2610429499504752025">"android.car.cluster.loggingrenderer/.LoggingClusterRenderingService"</string>
+ <string name="activityBlockingActivity" msgid="1307583481022873450">"com.android.car/com.android.car.pm.ActivityBlockingActivity"</string>
+ <string name="activityWhitelist" msgid="3812149730686980242">"com.android.systemui,com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity"</string>
+ <string name="activityBlacklist" msgid="4824386090073724380"></string>
+ <string-array name="allowedAppInstallSources">
+ </string-array>
+ <string name="defaultHomeActivity" msgid="5991064545193106309"></string>
+ <string name="activityHandlerForFlashWearChanges" msgid="8628535766919400479">"com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity"</string>
+ <string name="intentReceiverForUnacceptableIoMetrics" msgid="4017502061746918341">"com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver"</string>
+</resources>
diff --git a/service/res/values-zu/strings.xml b/service/res/values-zu/strings.xml
new file mode 100644
index 0000000..78501b3
--- /dev/null
+++ b/service/res/values-zu/strings.xml
@@ -0,0 +1,107 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="car_permission_label" msgid="2215078736675564541">"Ulwazi lemoto"</string>
+ <string name="car_permission_desc" msgid="162499818870052725">"Finyelela kulwazi lwemoto yakho."</string>
+ <string name="car_permission_label_cabin" msgid="7737204489497269651">"Ikhebhini yemoto"</string>
+ <string name="car_permission_desc_cabin" msgid="4495805806748641822">"Finyelela izinsiza zemoto yakho, kufaka phakathi iminyango, izibuko, izihlalo namawindi."</string>
+ <string name="car_permission_label_camera" msgid="608969838109034886">"Ikhamera yemoto"</string>
+ <string name="car_permission_desc_camera" msgid="917024932164501426">"Finyelela ikhamera yemoto yakho."</string>
+ <string name="car_permission_label_energy" msgid="3398092932402178393">"Amandla emoto"</string>
+ <string name="car_permission_desc_energy" msgid="3392963810053235407">"Finyelela ulwazi lwamandla lwemoto yakho."</string>
+ <string name="car_permission_label_hvac" msgid="8047274427463154164">"I-Hvac yemoto"</string>
+ <string name="car_permission_desc_hvac" msgid="3754229695589774195">"Finyelela i-hvac yemoto yakho."</string>
+ <string name="car_permission_label_mileage" msgid="811821331694754443">"Amamayela emoto"</string>
+ <string name="car_permission_desc_mileage" msgid="7179735693278681090">"Finyelela ulwazi lamamayela wemoto yakho."</string>
+ <string name="car_permission_label_speed" msgid="7315924371063443241">"Isivinini semoto"</string>
+ <string name="car_permission_desc_speed" msgid="2047965198165448241">"Finyelela isivinini semoto yakho."</string>
+ <string name="car_permission_label_vehicle_dynamics_state" msgid="6475840407257670137">"Isimo sento yemoto"</string>
+ <string name="car_permission_desc_vehicle_dynamics_state" msgid="8226448484805146681">"Finyelela isimo sezinto zemoto yakho"</string>
+ <string name="car_permission_label_vendor_extension" msgid="9173884051360575867">"Isiteshi somthengisi semoto"</string>
+ <string name="car_permission_desc_vendor_extension" msgid="2970718502334714035">"Finyelela isiteshi somthengisi semoto yakho ukuze nishintshisane ngolwazi oluthile lemoto."</string>
+ <string name="car_permission_label_radio" msgid="4768692394049267617">"Irediyo yemoto"</string>
+ <string name="car_permission_desc_radio" msgid="3385999027478186964">"Finyelela irekhidiyo yemoto yakho."</string>
+ <string name="car_permission_label_projection" msgid="7830068427803303154">"Ukuthi phoko kwemoto"</string>
+ <string name="car_permission_label_audio_volume" msgid="4802249016680066596">"Ivolomu yomsindo yemoto"</string>
+ <string name="car_permission_label_audio_settings" msgid="7788327093945466775">"Izilungiselelo zomsindo zemoto"</string>
+ <string name="car_permission_desc_projection" msgid="2680001094361534439">"Isixhumanisi sokusebenzisana esibonisini semoto."</string>
+ <string name="car_permission_label_mock_vehicle_hal" msgid="7429043278386896118">"Phinda i-HAL yemoto"</string>
+ <string name="car_permission_desc_mock_vehicle_hal" msgid="5235596491098649155">"Phinda i-HAL yemoto yakho ngenhloso yokuhlola kwangaphakathi."</string>
+ <string name="car_permission_desc_audio_volume" msgid="536626185654307889">"Lawula ivolomu yemoto yakho."</string>
+ <string name="car_permission_desc_audio_settings" msgid="7192007170677915937">"Lawula izilungiselelo zomsindo zemoto yakho."</string>
+ <string name="car_permission_label_control_app_blocking" msgid="9112678596919993386">"Ukuvimbela uhlelo lokusebenza"</string>
+ <string name="car_permission_desc_control_app_blocking" msgid="7539378161760696190">"Lawula ukuvimbela uhlelo lokusebenza uma ushayela."</string>
+ <string name="car_permission_car_navigation_manager" msgid="5895461364007854077">"Isiphathi sokuzula"</string>
+ <string name="car_permission_desc_car_navigation_manager" msgid="6188751054665471537">"Bika idatha yokuzula kwinto yokusebenza"</string>
+ <string name="car_permission_car_display_in_cluster" msgid="4005987646292458684">"Ukusebenzisa okuqondile kwinto yokusebenza"</string>
+ <string name="car_permission_desc_car_display_in_cluster" msgid="2668300546822672927">"Vumela uhlelo lokusebenza ukuvuma imisebenzi ukuthi uboniswe kwinto yokusebenza"</string>
+ <string name="car_permission_car_cluster_control" msgid="1382247204230165674">"Ukulawula into yokusebenza"</string>
+ <string name="car_permission_desc_car_cluster_control" msgid="9222776665281176031">"Qalisa uhlelo lokusebenza kwinto yokusebenza"</string>
+ <string name="car_permission_label_bind_instrument_cluster_rendering" msgid="8627480897198377418">"Ukusebenzisa into yokusebenza"</string>
+ <string name="car_permission_desc_bind_instrument_cluster_rendering" msgid="5073596870485006783">"Thola idatha yento yokusebenza"</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration" msgid="6801393970411049725">"Ukulungiswa kwemikhawulo ye-UX"</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration" msgid="5711926927484813777">"Lungisa imikhawulo ye-UX"</string>
+ <string name="car_permission_label_bind_input_service" msgid="6698489034024273750">"Isevisi yokufaka yemoto"</string>
+ <string name="car_permission_desc_bind_input_service" msgid="1670323419931890170">"Phatha imicimbi yokungena"</string>
+ <string name="car_can_bus_failure" msgid="2334035748788283914">"Ibhasi ye-CAN yehlulekile"</string>
+ <string name="car_can_bus_failure_desc" msgid="4125516222786484733">"Ibhasi ye-CAN ayiphenduli. Nqamula futhi uxhume ibhokisi le-headunit ukuze uqalise kabusha imoto"</string>
+ <string name="activity_blocked_text" msgid="5342114426610711378">"Ngokuphepha kwakho, lo msebenzi awutholakali uma ushayela.\nUkuze uqhubeke, linda uze umiswe."</string>
+ <string name="exit_button_message" msgid="8554690915924055685">"Ukuze uqalise futhi ngezici zohlelo lokusebenza, khetha <xliff:g id="EXIT_BUTTON">%s</xliff:g>."</string>
+ <string name="exit_button" msgid="5829638404777671253">"Emuva"</string>
+ <string name="debug_button_text" msgid="6395881820644544676">"ulwazi Lokususa iphutha"</string>
+ <string name="car_permission_label_diag_read" msgid="2539365760945541902">"Idatha yokuxilonga"</string>
+ <string name="car_permission_desc_diag_read" msgid="6300061847723430001">"Ukufunda idatha yokuxilonga kusuka emotweni"</string>
+ <string name="car_permission_label_diag_clear" msgid="5276954546130303905">"Idatha yokuxilonga"</string>
+ <string name="car_permission_desc_diag_clear" msgid="6890216593617069473">"Sula idatha yokuxilonga kusuka emotweni"</string>
+ <string name="car_permission_label_vms_publisher" msgid="5738544816086673968">"Umshicileli we-VMS"</string>
+ <string name="car_permission_desc_vms_publisher" msgid="154858011053838907">"Shicilela imilayezo ye-vms"</string>
+ <string name="car_permission_label_vms_subscriber" msgid="2776578987390414930">"Obhalisele we-VMS"</string>
+ <string name="car_permission_desc_vms_subscriber" msgid="6846187370448294450">"Bhalisela imilayezo ye-vms"</string>
+ <string name="car_permission_label_storage_monitoring" msgid="2327639346522530549">"Ukwengamela isitoreji se-flash"</string>
+ <string name="car_permission_desc_storage_monitoring" msgid="2075712271139671318">"Ngamela ukusetshenziswa kwesitoreji semoto"</string>
+ <string name="car_permission_label_driving_state" msgid="6069696010591163256">"Isimo sokushayela"</string>
+ <string name="car_permission_desc_driving_state" msgid="4082684279226021396">"Lale izinguquko zesimo sokushayela"</string>
+ <string name="car_permission_label_car_engine_detailed" msgid="9002892724697007617">"Injini enemininingwane"</string>
+ <string name="car_permission_desc_car_engine_detailed" msgid="2207487506454195487">"Finyelela ulwazi lwenjini olunemininingwane lemoto yakho"</string>
+ <string name="car_permission_label_car_energy_ports" msgid="4263949434683308884">"Izimbobo zamandla"</string>
+ <string name="car_permission_desc_car_energy_ports" msgid="557965577468080620">"Finyelela izimbobo zamandla"</string>
+ <string name="car_permission_label_car_identification" msgid="1729154715508060432">"Ukukhomba imoto"</string>
+ <string name="car_permission_desc_car_identification" msgid="6209540619324873333">"Finyelela isihlonzi semoto"</string>
+ <string name="car_permission_label_control_car_doors" msgid="982176169678332325">"Iminyango yemoto"</string>
+ <string name="car_permission_desc_control_car_doors" msgid="4138087940094487785">"Lawula iminyango yemoto"</string>
+ <string name="car_permission_label_control_car_windows" msgid="8495424050848179521">"Amawindi emoto"</string>
+ <string name="car_permission_desc_control_car_windows" msgid="7618554178690485310">"Lawula amawindi emoto"</string>
+ <string name="car_permission_label_control_car_mirrors" msgid="5695032398073590372">"Izibuko zemoto"</string>
+ <string name="car_permission_desc_control_car_mirrors" msgid="2644116799651071636">"Lawula izibuko zemoto"</string>
+ <string name="car_permission_label_control_car_seats" msgid="4068728236135716379">"Izihlalo zemoto"</string>
+ <string name="car_permission_desc_control_car_seats" msgid="3918469592876954231">"Lawula izihlalo zemoto"</string>
+ <string name="car_permission_label_car_info" msgid="5638680944359440535">"Ulwazi oluyisisekelo lwemoto"</string>
+ <string name="car_permission_desc_car_info" msgid="1697298888275875496">"Finyelela ulwazi oluyisisekelo lwemoto"</string>
+ <string name="car_permission_label_car_exterior_lights" msgid="6756996909877627936">"Izibani zangaphandle zemoto"</string>
+ <string name="car_permission_desc_car_exterior_lights" msgid="5404593475424542202">"Finyelela isimo sezibani zangaphandle zemoto"</string>
+ <string name="car_permission_label_control_car_exterior_lights" msgid="822902629489856498">"Izibani zangaphandle zemoto"</string>
+ <string name="car_permission_desc_control_car_exterior_lights" msgid="1131149440610151914">"Lawula izibani zangaphandle zemoto"</string>
+ <string name="car_permission_label_car_exterior_environment" msgid="7617025356417480155">"Izinga lokushisa langaphandle lemoto"</string>
+ <string name="car_permission_desc_car_exterior_environment" msgid="7665860792016287191">"Finyelela izinga lokushisa langaphandle lemoto"</string>
+ <string name="car_permission_label_car_tires" msgid="7261327603773636683">"Amathayela wemoto"</string>
+ <string name="car_permission_desc_car_tires" msgid="4398458490319322940">"Finyelela ulwazi lwethaya lemoto"</string>
+ <string name="car_permission_label_car_powertrain" msgid="246182551556313624">"I-Powertrain yemoto"</string>
+ <string name="car_permission_desc_car_powertrain" msgid="3838172429633520832">"Finyelela ulwazi lwamandla lemoto"</string>
+ <string name="car_permission_label_car_power" msgid="3671174734416372201">"Amandla emoto"</string>
+ <string name="car_permission_desc_car_power" msgid="8955018800799758403">"Finyelela isimo samandla semoto"</string>
+</resources>
diff --git a/service/res/values/attrs.xml b/service/res/values/attrs.xml
index 89c4258..be20c0f 100644
--- a/service/res/values/attrs.xml
+++ b/service/res/values/attrs.xml
@@ -18,11 +18,11 @@
-->
<resources>
- <!-- Defines the attributes and values used in res/xml/car_volume_group.xml -->
- <declare-styleable name="volumeGroups" />
-
+ <!-- Defines the attributes and values used in res/xml/car_volume_groups.xml -->
+ <declare-styleable name="volumeGroups">
+ <attr name="isDeprecated" format="boolean"/>
+ </declare-styleable>
<declare-styleable name="volumeGroups_group"/>
-
<declare-styleable name="volumeGroups_context">
<!-- Align with hardware/interfaces/automotive/audiocontrol/1.0/types.hal:ContextNumber -->
<attr name="context">
@@ -37,6 +37,18 @@
</attr>
</declare-styleable>
+ <!--
+ Defines the attributes and values used in car_audio_configuration.xml
+ This is a superset of car_volume_groups.xml
+ -->
+ <declare-styleable name="carAudioConfiguration">
+ <attr name="version" format="integer"/>
+ <attr name="isPrimary" format="boolean"/>
+ <attr name="name" format="string"/>
+ <attr name="address" format="string"/>
+ <attr name="display" format="string"/>
+ </declare-styleable>
+
<!-- Defines the UX restrictions to be imposed for different driving states of a vehicle -->
<declare-styleable name="UxRestrictions"/>
<!-- 1. UX restriction Mapping from a driving state of the vehicle-->
diff --git a/service/res/values/colors.xml b/service/res/values/colors.xml
index ed86a3b..6764116 100644
--- a/service/res/values/colors.xml
+++ b/service/res/values/colors.xml
@@ -18,18 +18,18 @@
-->
<resources>
<!-- Semi-transparent background color of blocking activity. -->
- <!-- In Call background scrim: grey 200 @ 90% -->
- <color name="activity_blocking_activity_background">#e6eeeeee</color>
+ <!-- In Call background scrim: grey 200 -->
+ <color name="activity_blocking_activity_background">#ffeeeeee</color>
<!-- Color of text in blocking activity. -->
<color name="blocking_text">#ff212121</color>
- <!-- Background color of exit button. -->
- <color name="exit_button_background">#ff00796b</color>
+ <!-- Background color of button. -->
+ <color name="button_background">#ff00796b</color>
- <!-- Color of exit button text. -->
- <color name="exit_button_text">#fffafafa</color>
+ <!-- Color of button text. -->
+ <color name="button_text">#fffafafa</color>
- <!-- Ripple color of exit button background. -->
+ <!-- Ripple color of button background. -->
<color name="ripple_background">#3d000000</color>
</resources>
diff --git a/service/res/values/config.xml b/service/res/values/config.xml
index 214cf02..e8c520a 100644
--- a/service/res/values/config.xml
+++ b/service/res/values/config.xml
@@ -24,6 +24,7 @@
dynamic audio routing is disabled and audio works in legacy mode. It may be useful
during initial development where audio hal does not support bus based addressing yet. -->
<bool name="audioUseDynamicRouting">false</bool>
+
<!-- Configuration to persist master mute state. If this is set to true,
Android will restore the master mute state on boot. -->
<bool name="audioPersistMasterMuteState">true</bool>
@@ -34,7 +35,7 @@
<string name="inputService">android.car.input.service/.DefaultInputService</string>
- <string name="instrumentClusterRendererService">android.car.cluster.sample/.SampleClusterServiceImpl</string>
+ <string name="instrumentClusterRendererService">android.car.cluster.loggingrenderer/.LoggingClusterRenderingService</string>
<!-- Whether to enable Activity blocking for safety. When Activity blocking is enabled,
only whitelisted safe Activities will be allowed while car is not parked. -->
@@ -62,11 +63,6 @@
<!-- The com.android.car.VmsPublisherService will bind to this list of clients -->
<string-array translatable="false" name="vmsPublisherClients">
</string-array>
- <!-- Permissions that the com.android.car.VmsPublisherService is allowed to grant to publishers -->
- <string-array translatable="false" name="vmsSafePermissions">
- <item>"android.permission.ACCESS_FINE_LOCATION"</item>
- </string-array>
-
<!-- Number of milliseconds to wait before trying re-bind to a crashed publisher. -->
<integer name="millisecondsBeforeRebindToVmsPublisher">10000</integer>
@@ -135,4 +131,6 @@
<item>7d,3</item>
</string-array>
+ <string name="config_TetheredProjectionAccessPointSsid" translatable="false">CarAP</string>
+
</resources>
diff --git a/service/res/values/dimens.xml b/service/res/values/dimens.xml
index f75a358..23653db 100644
--- a/service/res/values/dimens.xml
+++ b/service/res/values/dimens.xml
@@ -19,18 +19,14 @@
<resources>
<!-- Text size in ActivityBlockingActivity. -->
<dimen name="blocking_text_size">32sp</dimen>
- <!-- Padding of ActivityBlockingActivity. -->
- <dimen name="blocking_activity_padding">20dp</dimen>
-
- <!-- Minimum height of exit button in ActivityBlockingActivity. -->
- <dimen name="exit_button_min_height">56dp</dimen>
- <!-- Minimum width of exit button in ActivityBlockingActivity. -->
- <dimen name="exit_button_min_width">156dp</dimen>
- <!-- Padding of exit button in ActivityBlockingActivity. -->
- <dimen name="exit_button_padding">16dp</dimen>
- <!-- Radius of exit button in ActivityBlockingActivity. -->
- <dimen name="exit_button_radius">4dp</dimen>
- <!-- Top margin of exit button. It should be half the height of
- button (exit_button_min_height). -->
- <dimen name="exit_button_top_margin">28dp</dimen>
+ <!-- Widget margin. It should be half the height of button. -->
+ <dimen name="common_margin">28dp</dimen>
+ <!-- Minimum height of button in ActivityBlockingActivity. -->
+ <dimen name="button_min_height">56dp</dimen>
+ <!-- Minimum width of button in ActivityBlockingActivity. -->
+ <dimen name="button_min_width">156dp</dimen>
+ <!-- Padding of button in ActivityBlockingActivity. -->
+ <dimen name="button_padding">16dp</dimen>
+ <!-- Radius of button in ActivityBlockingActivity. -->
+ <dimen name="button_radius">4dp</dimen>
</resources>
diff --git a/service/res/values/strings.xml b/service/res/values/strings.xml
index 1947e43..12e4511 100644
--- a/service/res/values/strings.xml
+++ b/service/res/values/strings.xml
@@ -14,51 +14,50 @@
limitations under the License.
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title">Car service</string>
-
+ <string name="app_title" translatable="false">Car service</string>
<!-- For permissions -->
<!-- Permission text: can access your car's information [CHAR LIMIT=NONE] -->
<string name="car_permission_label">Car information</string>
<!-- Permission text: can access your car's information [CHAR LIMIT=NONE] -->
- <string name="car_permission_desc">Access your car\'s information.</string>
+ <string name="car_permission_desc">Access your car\u2019s information.</string>
<!-- Permission text: apps can control car cabin [CHAR LIMIT=NONE] -->
<string name="car_permission_label_cabin">Car Cabin</string>
<!-- Permission text: apps can control car cabin [CHAR LIMIT=NONE] -->
- <string name="car_permission_desc_cabin">Access your car\'s accessories, including doors,
+ <string name="car_permission_desc_cabin">Access your car\u2019s accessories, including doors,
mirrors, seats, and windows.</string>
<!-- Permission text: apps can control car camera [CHAR LIMIT=NONE] -->
<string name="car_permission_label_camera">Car Camera</string>
<!-- Permission text: apps can control car camera [CHAR LIMIT=NONE] -->
- <string name="car_permission_desc_camera">Access your car\'s camera(s).</string>
+ <string name="car_permission_desc_camera">Access your car\u2019s camera(s).</string>
<!-- Permission text: can access your car's energy information [CHAR LIMIT=NONE] -->
<string name="car_permission_label_energy">Car energy</string>
<!-- Permission text: can access your car's energy information [CHAR LIMIT=NONE] -->
- <string name="car_permission_desc_energy">Access your car\'s energy information.</string>
+ <string name="car_permission_desc_energy">Access your car\u2019s energy information.</string>
<!-- Permission text: apps can control car hvac [CHAR LIMIT=NONE] -->
<string name="car_permission_label_hvac">Car Hvac</string>
<!-- Permission text: apps can control car hvac [CHAR LIMIT=NONE] -->
- <string name="car_permission_desc_hvac">Access your car\'s hvac.</string>
+ <string name="car_permission_desc_hvac">Access your car\u2019s hvac.</string>
<!-- Permission text: can access your car's mileage information [CHAR LIMIT=NONE] -->
<string name="car_permission_label_mileage">Car mileage</string>
<!-- Permission text: can access your car's mileage information [CHAR LIMIT=NONE] -->
- <string name="car_permission_desc_mileage">Access your car\'s mileage information.</string>
+ <string name="car_permission_desc_mileage">Access your car\u2019s mileage information.</string>
<!-- Permission text: can access your car's speed [CHAR LIMIT=NONE] -->
<string name="car_permission_label_speed">Car speed</string>
<!-- Permission text: can access your car's speed [CHAR LIMIT=NONE] -->
- <string name="car_permission_desc_speed">Access your car\'s speed.</string>
+ <string name="car_permission_desc_speed">Access your car\u2019s speed.</string>
<!-- Permission text: can access your car's dynamics state [CHAR LIMIT=NONE] -->
<string name="car_permission_label_vehicle_dynamics_state">Vehicle dynamics state</string>
<!-- Permission text: can access your car's dynamic state [CHAR LIMIT=NONE] -->
- <string name="car_permission_desc_vehicle_dynamics_state">Access your car\'s dynamics state</string>
+ <string name="car_permission_desc_vehicle_dynamics_state">Access your car\u2019s dynamics state</string>
<!-- Permission text: apps can access car-manufacturer specific data [CHAR LIMIT=NONE] -->
<string name="car_permission_label_vendor_extension">Car vendor channel</string>
<!-- Permission text: apps can access car-manufacturer specific data [CHAR LIMIT=NONE] -->
- <string name="car_permission_desc_vendor_extension">Access your car\'s vendor channel to
+ <string name="car_permission_desc_vendor_extension">Access your car\u2019s vendor channel to
exchange car-specific information.</string>
<!-- Permission text: apps can control car-radio [CHAR LIMIT=NONE] -->
<string name="car_permission_label_radio">Car Radio</string>
<!-- Permission text: apps can control car-radio [CHAR LIMIT=NONE] -->
- <string name="car_permission_desc_radio">Access your car\'s radio.</string>
+ <string name="car_permission_desc_radio">Access your car\u2019s radio.</string>
<!-- Permission text: apps can control car-projection [CHAR LIMIT=NONE] -->
<string name="car_permission_label_projection">Car Projection</string>
<!-- Permission text: apps can control car-audio-volume [CHAR LIMIT=NONE] -->
@@ -69,11 +68,11 @@
<string name="car_permission_desc_projection">Project phone interface on car display.</string>
<string name="car_permission_label_mock_vehicle_hal">Emulate vehicle HAL</string>
<!-- Permission text: can emulate information from your car [CHAR LIMIT=NONE] -->
- <string name="car_permission_desc_mock_vehicle_hal">Emulate your car\'s vehicle HAL for internal
+ <string name="car_permission_desc_mock_vehicle_hal">Emulate your car\u2019s vehicle HAL for internal
testing purpose.</string>
<!-- Permission text: can adjust the audio volume on your car [CHAR LIMIT=NONE] -->
- <string name="car_permission_desc_audio_volume">Control your car\'s audio volume.</string>
- <string name="car_permission_desc_audio_settings">Control your car\'s audio settings.</string>
+ <string name="car_permission_desc_audio_volume">Control your car\u2019s audio volume.</string>
+ <string name="car_permission_desc_audio_settings">Control your car\u2019s audio settings.</string>
<string name="car_permission_label_control_app_blocking">Application blocking</string>
<!-- Permission text: can emulate information from your car [CHAR LIMIT=NONE] -->
<string name="car_permission_desc_control_app_blocking">Control application blocking while
@@ -90,6 +89,8 @@
<string name="car_permission_desc_car_cluster_control">Launch apps in the instrument cluster</string>
<string name="car_permission_label_bind_instrument_cluster_rendering">Instrument Cluster Rendering</string>
<string name="car_permission_desc_bind_instrument_cluster_rendering">Receive instrument cluster data</string>
+ <string name="car_permission_label_car_ux_restrictions_configuration">UX Restrictions Configuration</string>
+ <string name="car_permission_desc_car_ux_restrictions_configuration">Configure UX Restrictions</string>
<!-- Permission text: apps can handle input events [CHAR LIMIT=NONE] -->
<string name="car_permission_label_bind_input_service">Car Input Service</string>
@@ -103,10 +104,14 @@
<string name="car_can_bus_failure_desc">CAN bus does not respond. Unplug and plug back headunit
box and restart the car</string>
- <!-- Blocking activity: Message to show to user when a feature of current application is not allowed. [CHAR LIMIT=60] -->
- <string name="activity_blocked_string">This <xliff:g id="app_name" example="Google Maps">%1$s</xliff:g> feature can\'t be used while driving.</string>
- <!-- Blocking activity: Button text that restarts the current blocked application. [CHAR LIMIT=10] -->
- <string name="exit_button">OK</string>
+ <!-- Blocking activity: Message to show to user when a feature of current application is not allowed. [CHAR LIMIT=120] -->
+ <string name="activity_blocked_text">For your safety, this activity isn\u2019t available while driving.\nTo continue, wait until you\u2019re parked.</string>
+ <!-- Blocking activity: Message to accompany the exit_button that restarts the blocked app. [CHAR LIMIT=120] -->
+ <string name="exit_button_message">To start over with safe app features, select <xliff:g id="exit_button" example="Back">%s</xliff:g>.</string>
+ <!-- Blocking activity: Text for button that restarts the current blocked application. [CHAR LIMIT=15] -->
+ <string name="exit_button">Back</string>
+ <!-- Blocking activity: Text for button that shows debug info for non-user build. [CHAR LIMIT=10] -->
+ <string name="debug_button_text">Debug Info</string>
<!-- Permission text: apps can control diagnostic data [CHAR LIMIT=NONE] -->
<string name="car_permission_label_diag_read">Diagnostic Data</string>
@@ -141,7 +146,7 @@
<!-- Permission text: apps read Engine Detailed [CHAR LIMIT=NONE] -->
<string name="car_permission_label_car_engine_detailed">Engine Detailed</string>
<!-- Permission text: apps can listen to Engine Detailed [CHAR LIMIT=NONE] -->
- <string name="car_permission_desc_car_engine_detailed">Access your car\'s detailed engine information</string>
+ <string name="car_permission_desc_car_engine_detailed">Access your car\u2019s detailed engine information</string>
<!-- Permission text: apps can access car's fuel door and ev charge port [CHAR LIMIT=NONE] -->
<string name="car_permission_label_car_energy_ports">Energy Ports</string>
@@ -151,27 +156,27 @@
<!-- Permission text: apps can access car's VIN information [CHAR LIMIT=NONE] -->
<string name="car_permission_label_car_identification">Car identification</string>
<!-- Permission text: apps can access car's VIN information [CHAR LIMIT=NONE] -->
- <string name="car_permission_desc_car_identification">Access car\'s identification</string>
+ <string name="car_permission_desc_car_identification">Access car\u2019s identification</string>
<!-- Permission text: apps can control car doors [CHAR LIMIT=NONE] -->
<string name="car_permission_label_control_car_doors">Car Doors</string>
<!-- Permission text: apps can control car doors [CHAR LIMIT=NONE] -->
- <string name="car_permission_desc_control_car_doors">Control car\'s doors</string>
+ <string name="car_permission_desc_control_car_doors">Control car\u2019s doors</string>
<!-- Permission text: apps can control car windows [CHAR LIMIT=NONE] -->
<string name="car_permission_label_control_car_windows">Car Windows</string>
<!-- Permission text: apps can control car windows [CHAR LIMIT=NONE] -->
- <string name="car_permission_desc_control_car_windows">Control car\'s windows</string>
+ <string name="car_permission_desc_control_car_windows">Control car\u2019s windows</string>
<!-- Permission text: apps can control car mirrors [CHAR LIMIT=NONE] -->
<string name="car_permission_label_control_car_mirrors">Car Mirrors</string>
<!-- Permission text: apps can control car mirrors [CHAR LIMIT=NONE] -->
- <string name="car_permission_desc_control_car_mirrors">Control car\'s mirrors</string>
+ <string name="car_permission_desc_control_car_mirrors">Control car\u2019s mirrors</string>
<!-- Permission text: apps can control car seats [CHAR LIMIT=NONE] -->
<string name="car_permission_label_control_car_seats">Car Seats</string>
<!-- Permission text: apps can control car seats [CHAR LIMIT=NONE] -->
- <string name="car_permission_desc_control_car_seats">Control car\'s seats</string>
+ <string name="car_permission_desc_control_car_seats">Control car\u2019s seats</string>
<!-- Permission text: apps read car's basic information [CHAR LIMIT=NONE] -->
<string name="car_permission_label_car_info">Car basic information</string>
@@ -202,4 +207,9 @@
<string name="car_permission_label_car_powertrain">Car Powertrain</string>
<!-- Permission text: apps read information of car's powertrain [CHAR LIMIT=NONE] -->
<string name="car_permission_desc_car_powertrain">Access car powertrain information</string>
+
+ <!-- Permission text: apps read information of car's power state [CHAR LIMIT=NONE] -->
+ <string name="car_permission_label_car_power">Car Power</string>
+ <!-- Permission text: apps read information of car's power state [CHAR LIMIT=NONE] -->
+ <string name="car_permission_desc_car_power">Access car power state</string>
</resources>
diff --git a/service/res/values/styles.xml b/service/res/values/styles.xml
index 4098e96..35b0b29 100644
--- a/service/res/values/styles.xml
+++ b/service/res/values/styles.xml
@@ -17,21 +17,22 @@
<!-- TextAppearances for ActivityBlockingActivity. -->
<style name="ActivityBlockingActivityText">
<item name="android:fontFamily">sans-serif-medium</item>
+ <item name="android:textColor">@color/blocking_text</item>
<item name="android:textStyle">normal</item>
<item name="android:textSize">@dimen/blocking_text_size</item>
</style>
- <!-- Style of exit button. -->
- <style name="ExitButtonStyle">
- <item name="android:background">@drawable/exit_button_ripple_background</item>
+ <!-- Style for buttons in ActivityBlockingActivity. -->
+ <style name="ButtonStyle">
+ <item name="android:background">@drawable/button_ripple_background</item>
<item name="android:fontFamily">sans-serif-medium</item>
- <item name="android:minHeight">@dimen/exit_button_min_height</item>
- <item name="android:minWidth">@dimen/exit_button_min_width</item>
- <item name="android:paddingHorizontal">@dimen/exit_button_padding</item>
+ <item name="android:minHeight">@dimen/button_min_height</item>
+ <item name="android:minWidth">@dimen/button_min_width</item>
+ <item name="android:paddingHorizontal">@dimen/button_padding</item>
<item name="android:textAllCaps">true</item>
<item name="android:textAlignment">center</item>
<item name="android:textAppearance">@style/ActivityBlockingActivityText</item>
- <item name="android:textColor">@color/exit_button_text</item>
+ <item name="android:textColor">@color/button_text</item>
</style>
</resources>
diff --git a/service/res/xml/car_volume_groups.xml b/service/res/xml/car_volume_groups.xml
index 9bfc305..c900329 100644
--- a/service/res/xml/car_volume_groups.xml
+++ b/service/res/xml/car_volume_groups.xml
@@ -15,6 +15,18 @@
-->
<!--
+ This configuration is replaced by car_audio_configuration.xml
+
+ Notes on backward compatibility
+ - A new audioUseUnifiedConfiguration flag is added, and the default value
+ is false
+ - If OEM does not explicitly set audioUseUnifiedConfiguration to be true,
+ car_volume_groups.xml will be used, CarAudioService also queries
+ IAudioControl HAL (getBusForContext)
+ - Otherwise, CarAudioService loads the new car_audio_configuration.xml
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
Defines the all available volume groups for volume control in a car.
One can overlay this configuration to customize the groups.
@@ -33,7 +45,8 @@
Important note: when overlaying this configuration,
make sure the resources are in the same package as CarAudioService.
-->
-<volumeGroups xmlns:car="http://schemas.android.com/apk/res-auto">
+<volumeGroups xmlns:car="http://schemas.android.com/apk/res-auto"
+ car:isDeprecated="true">
<group>
<context car:context="music"/>
<context car:context="call_ring"/>
diff --git a/service/src/com/android/car/BluetoothAutoConnectStateMachine.java b/service/src/com/android/car/BluetoothAutoConnectStateMachine.java
index 981db5b..cf9b98e 100644
--- a/service/src/com/android/car/BluetoothAutoConnectStateMachine.java
+++ b/service/src/com/android/car/BluetoothAutoConnectStateMachine.java
@@ -48,12 +48,9 @@
public static final int CONNECT_TIMEOUT = 103;
public static final int DEVICE_CONNECTED = 104;
public static final int DEVICE_DISCONNECTED = 105;
- // The following is used when PBAP and MAP should be connected to,
- // after device connects on HFP.
- public static final int CHECK_CLIENT_PROFILES = 1006;
+ public static final int ADAPTER_OFF = 106;
public static final int CONNECTION_TIMEOUT_MS = 8000;
- static final int CONNECT_MORE_PROFILES_TIMEOUT_MS = 2000;
BluetoothAutoConnectStateMachine(BluetoothDeviceConnectionPolicy policy) {
@@ -84,9 +81,7 @@
/**
* Idle State is the Initial State, when the system is accepting incoming 'CONNECT' requests.
- * Attempts a connection whenever the state transitions into Idle.
- * If the policy finds a device to connect on a profile, transitions to Processing.
- * If there is nothing to connect to, wait for the next 'CONNECT' message to try next.
+ * Upon 'CONNECT' message move to processing and beging connecting to devices.
*/
private class Idle extends State {
@Override
@@ -94,7 +89,6 @@
if (DBG) {
Log.d(TAG, "Enter Idle");
}
- connectToBluetoothDevice();
}
@Override
@@ -107,29 +101,21 @@
if (DBG) {
Log.d(TAG, "Idle->Connect:");
}
- connectToBluetoothDevice();
+ transitionTo(mProcessing);
break;
}
case DEVICE_CONNECTED: {
- if (DBG) {
- Log.d(TAG, "Idle->DeviceConnected: Ignored");
- }
- break;
- }
-
- case CHECK_CLIENT_PROFILES: {
- removeMessages(CHECK_CLIENT_PROFILES);
BluetoothDeviceConnectionPolicy.ConnectionParams params =
(BluetoothDeviceConnectionPolicy.ConnectionParams) msg.obj;
- BluetoothDevice device = params.getBluetoothDevice();
- // After pairing/disconnect, always try to connect to both PBAP and MAP
- if (DBG) {
- Log.d(TAG, "try to connect to PBAP/MAP after pairing or disconnect: "
- + Utils.getDeviceDebugInfo(device));
+ if (params.getBluetoothProfile() == BluetoothProfile.HEADSET_CLIENT) {
+ mPolicy.connectToDeviceOnProfile(BluetoothProfile.PBAP_CLIENT,
+ params.getBluetoothDevice());
+ mPolicy.connectToDeviceOnProfile(BluetoothProfile.MAP_CLIENT,
+ params.getBluetoothDevice());
+ } else if (DBG) {
+ Log.d(TAG, "Idle->DeviceConnected: Ignored");
}
- mPolicy.connectToDeviceOnProfile(BluetoothProfile.PBAP_CLIENT, device);
- mPolicy.connectToDeviceOnProfile(BluetoothProfile.MAP_CLIENT, device);
break;
}
@@ -143,24 +129,6 @@
return true;
}
- /**
- * Instruct the policy to find and connect to a device on a connectable profile.
- * If the policy reports that there is nothing to connect to, stay in the Idle state.
- * If it found a {device, profile} combination to attempt a connection, move to
- * Processing state
- */
- private void connectToBluetoothDevice() {
- boolean deviceToConnectFound = mPolicy.findDeviceToConnect();
- if (deviceToConnectFound) {
- transitionTo(mProcessing);
- } else {
- // Stay in Idle State and wait for the next 'CONNECT' message.
- if (DBG) {
- Log.d(TAG, "Idle->No device to connect");
- }
- }
- }
-
@Override
public void exit() {
if (DBG) {
@@ -173,20 +141,30 @@
/**
* Processing state indicates the system is processing a auto connect trigger and will ignore
* connection requests.
+ * If there are no devices to connect or upon completion, transition back to idle.
*/
private class Processing extends State {
+ int mConnectionsInProgress;
@Override
public void enter() {
if (DBG) {
Log.d(TAG, "Enter Processing");
}
-
+ mConnectionsInProgress = 0;
+ sendMessageDelayed(CONNECT_TIMEOUT, CONNECTION_TIMEOUT_MS);
+ for (Integer profile : mPolicy.mProfilesToConnect) {
+ connectDeviceOnProfile(profile);
+ }
+ if (mConnectionsInProgress == 0) {
+ transitionTo(mIdle);
+ }
}
@Override
public boolean processMessage(Message msg) {
if (DBG) {
Log.d(TAG, "Processing processMessage " + msg.what);
+ Log.d(TAG, "Connections in Progress = " + mConnectionsInProgress);
}
BluetoothDeviceConnectionPolicy.ConnectionParams params;
switch (msg.what) {
@@ -203,10 +181,21 @@
case DEVICE_CONNECTED:
// fall through
case DEVICE_DISCONNECTED: {
- removeMessages(CONNECT_TIMEOUT);
- transitionTo(mIdle);
+ mConnectionsInProgress--;
+ params = (BluetoothDeviceConnectionPolicy.ConnectionParams) msg.obj;
+ connectDeviceOnProfile(params.getBluetoothProfile());
+
+ if (mConnectionsInProgress == 0) {
+ transitionTo(mIdle);
+ } else {
+ removeMessages(CONNECT_TIMEOUT);
+ sendMessageDelayed(CONNECT_TIMEOUT, CONNECTION_TIMEOUT_MS);
+ }
break;
}
+ case ADAPTER_OFF:
+ transitionTo(mIdle);
+ break;
default:
if (DBG) {
@@ -222,6 +211,19 @@
if (DBG) {
Log.d(TAG, "Exit Processing");
}
+ removeMessages(CONNECT_TIMEOUT);
+
+ }
+
+ void connectDeviceOnProfile(int profile) {
+ BluetoothDevicesInfo devInfo = mPolicy.mProfileToConnectableDevicesMap.get(profile);
+ if (devInfo != null && devInfo.isProfileConnectableLocked()) {
+ BluetoothDevice device = devInfo.getNextDeviceInQueueLocked();
+ if (device != null) {
+ mConnectionsInProgress++;
+ mPolicy.connectToDeviceOnProfile(profile, device);
+ }
+ }
}
}
diff --git a/service/src/com/android/car/BluetoothDeviceConnectionPolicy.java b/service/src/com/android/car/BluetoothDeviceConnectionPolicy.java
index f9c8a1e..dcd7e16 100644
--- a/service/src/com/android/car/BluetoothDeviceConnectionPolicy.java
+++ b/service/src/com/android/car/BluetoothDeviceConnectionPolicy.java
@@ -20,6 +20,7 @@
import static android.car.settings.CarSettings.Secure.KEY_BLUETOOTH_AUTOCONNECT_MUSIC_DEVICES;
import static android.car.settings.CarSettings.Secure.KEY_BLUETOOTH_AUTOCONNECT_NETWORK_DEVICES;
import static android.car.settings.CarSettings.Secure.KEY_BLUETOOTH_AUTOCONNECT_PHONE_DEVICES;
+import static android.car.settings.CarSettings.Secure.KEY_BLUETOOTH_TEMPORARY_DISCONNECTS;
import android.annotation.Nullable;
import android.app.ActivityManager;
@@ -46,11 +47,16 @@
import android.content.IntentFilter;
import android.hardware.automotive.vehicle.V2_0.VehicleIgnitionState;
import android.hardware.automotive.vehicle.V2_0.VehicleProperty;
+import android.os.Binder;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Looper;
import android.os.ParcelUuid;
import android.os.Parcelable;
import android.os.RemoteException;
import android.os.UserHandle;
import android.provider.Settings;
+import android.text.TextUtils;
import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
@@ -62,8 +68,10 @@
import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
import java.util.Set;
import java.util.concurrent.locks.ReentrantLock;
+import java.util.stream.Collectors;
/**
@@ -91,13 +99,17 @@
private static final String TAG = "BTDevConnectionPolicy";
private static final String SETTINGS_DELIMITER = ",";
private static final boolean DBG = Utils.DBG;
+
+ private static final Binder RESTORED_TEMPORARY_DISCONNECT_TOKEN = new Binder();
+ private static final long RESTORE_BACKOFF_MILLIS = 1000L;
+
private final Context mContext;
private boolean mInitialized = false;
private boolean mUserSpecificInfoInitialized = false;
private final Object mSetupLock = new Object();
// The main data structure that holds on to the {profile:list of known and connectible devices}
- private HashMap<Integer, BluetoothDevicesInfo> mProfileToConnectableDevicesMap;
+ HashMap<Integer, BluetoothDevicesInfo> mProfileToConnectableDevicesMap;
/// TODO(vnori): fix this. b/70029056
private static final int NUM_SUPPORTED_PHONE_CONNECTIONS = 4; // num of HFP and PBAP connections
@@ -133,10 +145,11 @@
private final FastPairProvider mFastPairProvider;
// The Bluetooth profiles that the CarService will try to auto-connect on.
- private final List<Integer> mProfilesToConnect;
+ final List<Integer> mProfilesToConnect;
private final List<Integer> mPrioritiesSupported;
private static final int MAX_CONNECT_RETRIES = 1;
private static final int PROFILE_NOT_AVAILABLE = -1;
+ private int mUserId;
// Device & Profile currently being connected on
private ConnectionParams mConnectionInFlight;
@@ -145,6 +158,13 @@
// Maintain a list of Paired devices which haven't connected on any profiles yet.
private Set<BluetoothDevice> mPairedButUnconnectedDevices = new HashSet<>();
+ // State for temporary disconnects. Guarded by lock on `this`.
+ private final SetMultimap<ConnectionParams, DisconnectRecord> mTemporaryDisconnects;
+ private final HashSet<DisconnectRecord> mRestoredDisconnects = new HashSet<>();
+ private final HashSet<ConnectionParams> mAlreadyDisabledProfiles = new HashSet<>();
+
+ private final Handler mHandler = new Handler(Looper.getMainLooper());
+
public static BluetoothDeviceConnectionPolicy create(Context context,
CarPropertyService carPropertyService, PerUserCarServiceHelper userServiceHelper,
CarUxRestrictionsManagerService uxrService, CarBluetoothService bluetoothService) {
@@ -207,6 +227,8 @@
Log.w(TAG, "No Bluetooth Adapter Available");
}
mFastPairProvider = new FastPairProvider(mContext);
+
+ mTemporaryDisconnects = new SetMultimap<>();
}
/**
@@ -217,38 +239,142 @@
* Used as the currency that methods use to talk to each other in the policy.
*/
public static class ConnectionParams {
- private BluetoothDevice mBluetoothDevice;
- private Integer mBluetoothProfile;
+ // Examples:
+ // 01:23:45:67:89:AB/9
+ // null/0
+ // null/null
+ private static final String FLATTENED_PATTERN =
+ "^(([0-9A-F]{2}:){5}[0-9A-F]{2}|null)/([0-9]+|null)$";
+
+ @Nullable private final BluetoothDevice mBluetoothDevice;
+ @Nullable private final Integer mBluetoothProfile;
public ConnectionParams() {
- // default constructor
+ this(null, null);
}
- public ConnectionParams(Integer profile) {
- mBluetoothProfile = profile;
+ public ConnectionParams(@Nullable Integer profile) {
+ this(profile, null);
}
- public ConnectionParams(Integer profile, BluetoothDevice device) {
+ public ConnectionParams(@Nullable Integer profile, @Nullable BluetoothDevice device) {
mBluetoothProfile = profile;
mBluetoothDevice = device;
}
- // getters & Setters
- public void setBluetoothDevice(BluetoothDevice device) {
- mBluetoothDevice = device;
- }
-
- public void setBluetoothProfile(Integer profile) {
- mBluetoothProfile = profile;
- }
-
+ @Nullable
public BluetoothDevice getBluetoothDevice() {
return mBluetoothDevice;
}
+ @Nullable
public Integer getBluetoothProfile() {
return mBluetoothProfile;
}
+
+ @Override
+ public boolean equals(Object other) {
+ if (this == other) {
+ return true;
+ }
+ if (!(other instanceof ConnectionParams)) {
+ return false;
+ }
+ ConnectionParams otherParams = (ConnectionParams) other;
+ return Objects.equals(mBluetoothDevice, otherParams.mBluetoothDevice)
+ && Objects.equals(mBluetoothProfile, otherParams.mBluetoothProfile);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(mBluetoothDevice, mBluetoothProfile);
+ }
+
+ @Override
+ public String toString() {
+ return flattenToString();
+ }
+
+ /** Converts these {@link ConnectionParams} to a parseable string representation. */
+ public String flattenToString() {
+ return mBluetoothDevice + "/" + mBluetoothProfile;
+ }
+
+ /**
+ * Creates a {@link ConnectionParams} from a previous output of {@link #flattenToString()}.
+ *
+ * @param flattenedParams A flattened string representation of a {@link ConnectionParams}.
+ * @param adapter A {@link BluetoothAdapter} used to convert Bluetooth addresses into
+ * {@link BluetoothDevice} objects.
+ */
+ public static ConnectionParams parse(String flattenedParams, BluetoothAdapter adapter) {
+ if (!flattenedParams.matches(FLATTENED_PATTERN)) {
+ throw new IllegalArgumentException("Bad format for flattened ConnectionParams");
+ }
+ String[] parts = flattenedParams.split("/");
+
+ BluetoothDevice device;
+ if (!"null".equals(parts[0])) {
+ device = adapter.getRemoteDevice(parts[0]);
+ } else {
+ device = null;
+ }
+
+ Integer profile;
+ if (!"null".equals(parts[1])) {
+ profile = Integer.valueOf(parts[1]);
+ } else {
+ profile = null;
+ }
+
+ return new ConnectionParams(profile, device);
+ }
+ }
+
+ private class DisconnectRecord implements IBinder.DeathRecipient {
+ private final ConnectionParams mParams;
+ private final IBinder mToken;
+
+ private boolean mRemoved = false;
+
+ DisconnectRecord(ConnectionParams params, IBinder token) {
+ this.mParams = params;
+ this.mToken = token;
+ }
+
+ public ConnectionParams getParams() {
+ return mParams;
+ }
+
+ public IBinder getToken() {
+ return mToken;
+ }
+
+ public boolean removeSelf() {
+ synchronized (BluetoothDeviceConnectionPolicy.this) {
+ if (mRemoved) {
+ return true;
+ }
+
+ if (removeDisconnectRecord(this)) {
+ mRemoved = true;
+ return true;
+ } else {
+ return false;
+ }
+ }
+ }
+
+ @Override
+ public void binderDied() {
+ if (DBG) {
+ Log.d(TAG, "Releasing disconnect request on profile "
+ + Utils.getProfileName(mParams.getBluetoothProfile())
+ + " for device " + mParams.getBluetoothDevice()
+ + ": requesting process died");
+ }
+ removeSelf();
+ }
}
/**
@@ -318,6 +444,8 @@
initiateConnection();
} else if (currState == BluetoothAdapter.STATE_OFF) {
// Write currently connected device snapshot to file.
+ mBluetoothAutoConnectStateMachine.sendMessage(
+ BluetoothAutoConnectStateMachine.ADAPTER_OFF);
writeDeviceInfoToSettings();
resetBluetoothDevicesConnectionInfo();
}
@@ -369,6 +497,19 @@
}
if (mCarBluetoothUserService != null) {
for (Integer profile : mProfilesToConnect) {
+ // If this profile is temporarily disconnected, don't try to change its priority
+ // until the temporary disconnect is released.
+ synchronized (this) {
+ ConnectionParams params = new ConnectionParams(profile, device);
+ if (mTemporaryDisconnects.keySet().contains(params)) {
+ if (DBG) {
+ Log.i(TAG, "Not setting profile " + profile + " priority of "
+ + device.getAddress() + " to " + priority + ": "
+ + "temporarily disconnected");
+ }
+ continue;
+ }
+ }
setBluetoothProfilePriorityIfUuidFound(uuids, profile, device, priority);
}
}
@@ -437,6 +578,10 @@
mCarBluetoothUserService = setupBluetoothUserService();
// re-initialize for current user.
initializeUserSpecificInfo();
+ // Restore temporary disconnects, if any, that were saved from last run...
+ restoreTemporaryDisconnectsFromSettings();
+ // ... and start trying to remove them.
+ removeRestoredTemporaryDisconnects();
}
@Override
@@ -444,6 +589,15 @@
if (DBG) {
Log.d(TAG, "Before Unbinding from UserService");
}
+
+ // Try to release temporary disconnects now, before CarBluetoothUserService goes away.
+ // This also stops any active attempts to remove restored disconnects.
+ //
+ // If any can't be released, they'll persist in settings and will be cleaned up
+ // next time this user starts. This can happen if the Bluetooth profile proxies in
+ // CarBluetoothUserService unbind before we get the chance to make calls on them.
+ releaseAllDisconnectRecordsBeforeUnbind();
+
try {
if (mCarBluetoothUserService != null) {
mCarBluetoothUserService.closeBluetoothConnectionProxy();
@@ -453,6 +607,7 @@
"Remote Exception during closeBluetoothConnectionProxy(): "
+ e.getMessage());
}
+
// Clean up information related to user who went background.
cleanupUserSpecificInfo();
}
@@ -539,6 +694,7 @@
}
return;
}
+ mUserId = ActivityManager.getCurrentUser();
mBluetoothAutoConnectStateMachine = BluetoothAutoConnectStateMachine.make(this);
readAndRebuildDeviceMapFromSettings();
setupBluetoothEventsIntentFilterLocked();
@@ -816,6 +972,309 @@
}
/**
+ * Request to disconnect the given profile on the given device, and prevent it from reconnecting
+ * until either the request is released, or the process owning the given token dies.
+ * @return True if the profile was successfully disconnected, false if an error occurred.
+ */
+ public boolean requestProfileDisconnect(BluetoothDevice device, int profile, IBinder token) {
+ if (DBG) {
+ Log.d(TAG, "Request profile disconnect: profile " + Utils.getProfileName(profile)
+ + ", device " + device.getAddress());
+ }
+ ConnectionParams params = new ConnectionParams(profile, device);
+ DisconnectRecord record = new DisconnectRecord(params, token);
+ return addDisconnectRecord(record);
+ }
+
+ /**
+ * Undo a previous call to {@link #requestProfileDisconnect} with the same parameters,
+ * and reconnect the profile if no other requests are active.
+ *
+ * @return True if the request was released, false if an error occurred.
+ */
+ public boolean releaseProfileDisconnect(BluetoothDevice device, int profile, IBinder token) {
+ if (DBG) {
+ Log.d(TAG, "Release profile disconnect: profile " + Utils.getProfileName(profile)
+ + ", device " + device.getAddress());
+ }
+
+ ConnectionParams params = new ConnectionParams(profile, device);
+ DisconnectRecord record;
+ synchronized (this) {
+ record = findDisconnectRecordLocked(params, token);
+ }
+
+ if (record == null) {
+ Log.e(TAG, "Record not found");
+ return false;
+ }
+
+ return record.removeSelf();
+ }
+
+ /** Add a temporary disconnect record, disconnecting if necessary. */
+ private synchronized boolean addDisconnectRecord(DisconnectRecord record) {
+ ConnectionParams params = record.getParams();
+ if (!isProxyAvailable(params.getBluetoothProfile())) {
+ return false;
+ }
+
+ Set<DisconnectRecord> previousRecords = mTemporaryDisconnects.get(params);
+ if (findDisconnectRecordLocked(params, record.getToken()) != null) {
+ Log.e(TAG, "Disconnect request already registered - skipping duplicate");
+ return false;
+ }
+
+ try {
+ record.getToken().linkToDeath(record, 0);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Could not link to death on disconnect token (already dead?)", e);
+ return false;
+ }
+
+ boolean isNewlyAdded = previousRecords.isEmpty();
+ mTemporaryDisconnects.put(params, record);
+
+ if (isNewlyAdded) {
+ try {
+ int priority =
+ mCarBluetoothUserService.getProfilePriority(
+ params.getBluetoothProfile(),
+ params.getBluetoothDevice());
+ if (priority == BluetoothProfile.PRIORITY_OFF) {
+ // This profile was already disabled (and not as the result of a temporary
+ // disconnect). Add it to the already-disabled list, and do nothing else.
+ mAlreadyDisabledProfiles.add(params);
+
+ if (DBG) {
+ Log.d(TAG, "Profile " + Utils.getProfileName(params.getBluetoothProfile())
+ + " already disabled for device " + params.getBluetoothDevice()
+ + " - suppressing re-enable");
+ }
+ } else {
+ mCarBluetoothUserService.setProfilePriority(
+ params.getBluetoothProfile(),
+ params.getBluetoothDevice(),
+ BluetoothProfile.PRIORITY_OFF);
+ mCarBluetoothUserService.bluetoothDisconnectFromProfile(
+ params.getBluetoothProfile(),
+ params.getBluetoothDevice());
+ if (DBG) {
+ Log.d(TAG, "Disabled profile "
+ + Utils.getProfileName(params.getBluetoothProfile())
+ + " for device " + params.getBluetoothDevice());
+ }
+ }
+ } catch (RemoteException e) {
+ Log.e(TAG, "Could not disable profile", e);
+ record.getToken().unlinkToDeath(record, 0);
+ mTemporaryDisconnects.remove(params, record);
+ return false;
+ }
+ }
+
+ saveTemporaryDisconnectsToSettingsLocked();
+ return true;
+ }
+
+ /** Remove a given temporary disconnect record, reconnecting if necessary. */
+ private synchronized boolean removeDisconnectRecord(DisconnectRecord record) {
+ ConnectionParams params = record.getParams();
+ if (!isProxyAvailable(params.getBluetoothProfile())) {
+ return false;
+ }
+ if (!mTemporaryDisconnects.containsEntry(params, record)) {
+ Log.e(TAG, "Record already removed");
+ // Removing something a second time vacuously succeeds.
+ return true;
+ }
+
+ // Re-enable profile before unlinking and removing the record, in case of error.
+ // The profile should be re-enabled if this record is the only one left for that
+ // device and profile combination.
+ if (mTemporaryDisconnects.get(params).size() == 1) {
+ if (!restoreProfilePriority(params)) {
+ return false;
+ }
+ }
+
+ record.getToken().unlinkToDeath(record, 0);
+ mTemporaryDisconnects.remove(params, record);
+
+ saveTemporaryDisconnectsToSettingsLocked();
+ return true;
+ }
+
+ /** Find the disconnect record, if any, corresponding to the given parameters and token. */
+ @Nullable
+ private DisconnectRecord findDisconnectRecordLocked(ConnectionParams params, IBinder token) {
+ return mTemporaryDisconnects.get(params)
+ .stream()
+ .filter(r -> r.getToken() == token)
+ .findAny()
+ .orElse(null);
+ }
+
+ /** Re-enable and reconnect a given profile for a device. */
+ private boolean restoreProfilePriority(ConnectionParams params) {
+ if (!isProxyAvailable(params.getBluetoothProfile())) {
+ return false;
+ }
+
+ if (mAlreadyDisabledProfiles.remove(params)) {
+ // The profile does not need any state changes, since it was disabled
+ // before it was temporarily disconnected. Leave it disconnected.
+ if (DBG) {
+ Log.d(TAG, "Not restoring profile "
+ + Utils.getProfileName(params.getBluetoothProfile()) + " for device "
+ + params.getBluetoothDevice() + " - was manually disabled");
+ }
+ return true;
+ }
+
+ try {
+ mCarBluetoothUserService.setProfilePriority(
+ params.getBluetoothProfile(),
+ params.getBluetoothDevice(),
+ BluetoothProfile.PRIORITY_ON);
+ mCarBluetoothUserService.bluetoothConnectToProfile(
+ params.getBluetoothProfile(),
+ params.getBluetoothDevice());
+ if (DBG) {
+ Log.d(TAG, "Restored profile " + Utils.getProfileName(params.getBluetoothProfile())
+ + " for device " + params.getBluetoothDevice());
+ }
+ return true;
+ } catch (RemoteException e) {
+ Log.e(TAG, "Could not enable profile", e);
+ return false;
+ }
+ }
+
+ /** Dump all currently-active temporary disconnects to {@link Settings.Secure}. */
+ private void saveTemporaryDisconnectsToSettingsLocked() {
+ Set<ConnectionParams> disconnectedProfiles = new HashSet<>(mTemporaryDisconnects.keySet());
+ // Don't write out profiles that were disconnected before a request was made, since
+ // restoring those profiles is a no-op.
+ disconnectedProfiles.removeAll(mAlreadyDisabledProfiles);
+ String savedDisconnects =
+ disconnectedProfiles
+ .stream()
+ .map(ConnectionParams::flattenToString)
+ .collect(Collectors.joining(SETTINGS_DELIMITER));
+
+ if (DBG) {
+ Log.d(TAG, "Saving disconnects to settings for u" + mUserId + ": " + savedDisconnects);
+ }
+
+ Settings.Secure.putStringForUser(
+ mContext.getContentResolver(), KEY_BLUETOOTH_TEMPORARY_DISCONNECTS,
+ savedDisconnects, mUserId);
+ }
+
+ /** Create {@link DisconnectRecord}s for all temporary disconnects written to settings. */
+ private synchronized void restoreTemporaryDisconnectsFromSettings() {
+ if (mBluetoothAdapter == null) {
+ Log.e(TAG, "Cannot restore disconnect records - Bluetooth not available");
+ return;
+ }
+
+ String savedConnectionParams = Settings.Secure.getStringForUser(
+ mContext.getContentResolver(),
+ KEY_BLUETOOTH_TEMPORARY_DISCONNECTS,
+ mUserId);
+
+ if (TextUtils.isEmpty(savedConnectionParams)) {
+ return;
+ }
+
+ if (DBG) {
+ Log.d(TAG, "Restoring temporary disconnects: " + savedConnectionParams);
+ }
+
+ for (String paramsStr : savedConnectionParams.split(SETTINGS_DELIMITER)) {
+ try {
+ ConnectionParams params = ConnectionParams.parse(paramsStr, mBluetoothAdapter);
+ DisconnectRecord record =
+ new DisconnectRecord(params, RESTORED_TEMPORARY_DISCONNECT_TOKEN);
+ mTemporaryDisconnects.put(params, record);
+ mRestoredDisconnects.add(record);
+ if (DBG) {
+ Log.d(TAG, "Restored temporary disconnect for " + params);
+ }
+ } catch (IllegalArgumentException e) {
+ Log.e(TAG, "Bad format for saved temporary disconnect: " + paramsStr, e);
+ // We won't ever be able to fix a bad parse, so skip it and move on.
+ }
+ }
+ }
+
+ /**
+ * Try once to remove all temporary disconnects.
+ *
+ * If the CarBluetoothUserService is not yet available, or it hasn't yet bound its profile
+ * proxies, the removal will fail, and will need to be retried later.
+ */
+ private void tryRemoveRestoredTemporaryDisconnectsLocked() {
+ HashSet<DisconnectRecord> successfullyRemoved = new HashSet<>();
+
+ for (DisconnectRecord record : mRestoredDisconnects) {
+ if (removeDisconnectRecord(record)) {
+ successfullyRemoved.add(record);
+ }
+ }
+
+ mRestoredDisconnects.removeAll(successfullyRemoved);
+ }
+
+ /**
+ * Keep trying to remove all temporary disconnects that were restored from settings
+ * until all such temporary disconnects have been removed.
+ */
+ private synchronized void removeRestoredTemporaryDisconnects() {
+ tryRemoveRestoredTemporaryDisconnectsLocked();
+
+ if (!mRestoredDisconnects.isEmpty()) {
+ if (DBG) {
+ Log.d(TAG, "Could not remove all restored temporary disconnects - "
+ + "trying again in " + RESTORE_BACKOFF_MILLIS + "ms");
+ }
+ mHandler.postDelayed(
+ this::removeRestoredTemporaryDisconnects,
+ RESTORED_TEMPORARY_DISCONNECT_TOKEN,
+ RESTORE_BACKOFF_MILLIS);
+ }
+ }
+
+ /** Release all active disconnect records prior to user switch or shutdown. */
+ private synchronized void releaseAllDisconnectRecordsBeforeUnbind() {
+ if (DBG) {
+ Log.d(TAG, "Unbinding CarBluetoothUserService - releasing all temporary disconnects");
+ }
+ for (ConnectionParams params : mTemporaryDisconnects.keySet()) {
+ for (DisconnectRecord record : mTemporaryDisconnects.get(params)) {
+ record.removeSelf();
+ }
+ }
+
+ // Some disconnects might be hanging around because they couldn't be cleaned up.
+ // Make sure they get persisted...
+ saveTemporaryDisconnectsToSettingsLocked();
+ // ...then clear them from the map.
+ mTemporaryDisconnects.clear();
+
+ // We don't need to maintain previously-disconnected profiles any more - they were already
+ // skipped in saveTemporaryDisconnectsToSettingsLocked() above, and they don't need any
+ // further handling when the user resumes.
+ mAlreadyDisabledProfiles.clear();
+
+ // Clean up bookkeeping for restored disconnects. (If any are still around, they'll be
+ // restored again when this user restarts.)
+ mHandler.removeCallbacksAndMessages(RESTORED_TEMPORARY_DISCONNECT_TOKEN);
+ mRestoredDisconnects.clear();
+ }
+
+ /**
* Add or remove a device based on the bonding state change.
*
* @param device - device to add/remove
@@ -942,13 +1401,9 @@
if (DBG) {
Log.d(TAG, "Found device to connect to");
}
- BluetoothDeviceConnectionPolicy.ConnectionParams btParams =
- new BluetoothDeviceConnectionPolicy.ConnectionParams(
- mConnectionInFlight.getBluetoothProfile(),
- mConnectionInFlight.getBluetoothDevice());
// set up a time out
mBluetoothAutoConnectStateMachine.sendMessageDelayed(
- BluetoothAutoConnectStateMachine.CONNECT_TIMEOUT, btParams,
+ BluetoothAutoConnectStateMachine.CONNECT_TIMEOUT, mConnectionInFlight,
BluetoothAutoConnectStateMachine.CONNECTION_TIMEOUT_MS);
break;
} else {
@@ -1068,8 +1523,7 @@
devInfo.setConnectionStateLocked(device, BluetoothProfile.STATE_CONNECTING);
// Increment the retry count & cache what is being connected to
// This method is already called from a synchronized context.
- mConnectionInFlight.setBluetoothDevice(device);
- mConnectionInFlight.setBluetoothProfile(profile);
+ mConnectionInFlight = new ConnectionParams(profile, device);
devInfo.incrementRetryCountLocked();
if (DBG) {
Log.d(TAG, "Increment Retry to: " + devInfo.getRetryCountLocked() +
@@ -1093,8 +1547,7 @@
* @param devInfo the {@link BluetoothDevicesInfo} where the info is to be reset.
*/
private void setProfileOnDeviceToUnavailable(BluetoothDevicesInfo devInfo) {
- mConnectionInFlight.setBluetoothProfile(0);
- mConnectionInFlight.setBluetoothDevice(null);
+ mConnectionInFlight = new ConnectionParams(0, null);
devInfo.setDeviceAvailableToConnectLocked(false);
}
@@ -1217,32 +1670,6 @@
+ deviceThatConnected);
}
- // If the device just connected to HEADSET_CLIENT profile, initiate
- // connections on PBAP & MAP profiles but let that begin after a timeout period.
- // timeout allows A2DP profile to complete its connection, so that there is no race
- // condition between
- // Phone trying to connect on A2DP
- // and, Car trying to connect on PBAP & MAP.
- if (didConnect && profileToUpdate == BluetoothProfile.HEADSET_CLIENT) {
- // Unlock the profiles PBAP, MAP in BluetoothDevicesInfo, so that they can be
- // connected on.
- for (Integer profile : Arrays.asList(BluetoothProfile.PBAP_CLIENT,
- BluetoothProfile.MAP_CLIENT)) {
- BluetoothDevicesInfo devInfo = mProfileToConnectableDevicesMap.get(profile);
- if (devInfo == null) {
- Log.e(TAG, "Unexpected: No device Queue for this profile: " + profile);
- return false;
- }
- devInfo.setDeviceAvailableToConnectLocked(true);
- }
- if (DBG) {
- Log.d(TAG, "connect to PBAP/MAP after disconnect: ");
- }
- mBluetoothAutoConnectStateMachine.sendMessageDelayed(
- BluetoothAutoConnectStateMachine.CHECK_CLIENT_PROFILES, params,
- BluetoothAutoConnectStateMachine.CONNECT_MORE_PROFILES_TIMEOUT_MS);
- }
-
// If the connection update is on a different profile or device (a very rare possibility),
// it is handled automatically. Just logging it here.
if (DBG) {
@@ -1422,18 +1849,17 @@
if (DBG) {
Log.d(TAG, "Profile: " + profileToUpdate + " Writing: " + joinedDeviceNames);
}
- long userId = ActivityManager.getCurrentUser();
switch (profileToUpdate) {
case BluetoothProfile.A2DP_SINK:
Settings.Secure.putStringForUser(mContext.getContentResolver(),
KEY_BLUETOOTH_AUTOCONNECT_MUSIC_DEVICES,
- joinedDeviceNames, (int) userId);
+ joinedDeviceNames, mUserId);
break;
case BluetoothProfile.HEADSET_CLIENT:
Settings.Secure.putStringForUser(mContext.getContentResolver(),
KEY_BLUETOOTH_AUTOCONNECT_PHONE_DEVICES,
- joinedDeviceNames, (int) userId);
+ joinedDeviceNames, mUserId);
break;
case BluetoothProfile.PBAP_CLIENT:
@@ -1443,12 +1869,12 @@
case BluetoothProfile.MAP_CLIENT:
Settings.Secure.putStringForUser(mContext.getContentResolver(),
KEY_BLUETOOTH_AUTOCONNECT_MESSAGING_DEVICES,
- joinedDeviceNames, (int) userId);
+ joinedDeviceNames, mUserId);
break;
case BluetoothProfile.PAN:
Settings.Secure.putStringForUser(mContext.getContentResolver(),
KEY_BLUETOOTH_AUTOCONNECT_NETWORK_DEVICES,
- joinedDeviceNames, (int) userId);
+ joinedDeviceNames, mUserId);
break;
}
}
@@ -1489,26 +1915,25 @@
}
// Read from Settings.Secure for the current user. There are 3 keys 1 each for Phone
// (HFP & PBAP), 1 for Music (A2DP) and 1 for Messaging device (MAP)
- long userId = ActivityManager.getCurrentUser();
for (Integer profile : mProfilesToConnect) {
switch (profile) {
case BluetoothProfile.A2DP_SINK:
devices = Settings.Secure.getStringForUser(mContext.getContentResolver(),
- KEY_BLUETOOTH_AUTOCONNECT_MUSIC_DEVICES, (int) userId);
+ KEY_BLUETOOTH_AUTOCONNECT_MUSIC_DEVICES, mUserId);
break;
case BluetoothProfile.PBAP_CLIENT:
// fall through
case BluetoothProfile.HEADSET_CLIENT:
devices = Settings.Secure.getStringForUser(mContext.getContentResolver(),
- KEY_BLUETOOTH_AUTOCONNECT_PHONE_DEVICES, (int) userId);
+ KEY_BLUETOOTH_AUTOCONNECT_PHONE_DEVICES, mUserId);
break;
case BluetoothProfile.MAP_CLIENT:
devices = Settings.Secure.getStringForUser(mContext.getContentResolver(),
- KEY_BLUETOOTH_AUTOCONNECT_MESSAGING_DEVICES, (int) userId);
+ KEY_BLUETOOTH_AUTOCONNECT_MESSAGING_DEVICES, mUserId);
break;
case BluetoothProfile.PAN:
devices = Settings.Secure.getStringForUser(mContext.getContentResolver(),
- KEY_BLUETOOTH_AUTOCONNECT_NETWORK_DEVICES, (int) userId);
+ KEY_BLUETOOTH_AUTOCONNECT_NETWORK_DEVICES, mUserId);
default:
Log.e(TAG, "Unexpected profile");
break;
@@ -1649,5 +2074,11 @@
writer.println("*BluetoothDeviceConnectionPolicy*");
printDeviceMap(writer);
mBluetoothAutoConnectStateMachine.dump(writer);
+ writer.println("Temporary disconnects active:");
+ String disconnects;
+ synchronized (this) {
+ disconnects = mTemporaryDisconnects.keySet().toString();
+ }
+ writer.println(disconnects);
}
}
diff --git a/service/src/com/android/car/CarAudioDeviceInfo.java b/service/src/com/android/car/CarAudioDeviceInfo.java
deleted file mode 100644
index 65e3510..0000000
--- a/service/src/com/android/car/CarAudioDeviceInfo.java
+++ /dev/null
@@ -1,257 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.car;
-
-import android.media.AudioDeviceInfo;
-import android.media.AudioDevicePort;
-import android.media.AudioFormat;
-import android.media.AudioGain;
-import android.media.AudioGainConfig;
-import android.media.AudioManager;
-import android.media.AudioPort;
-import android.util.Log;
-
-import com.android.internal.util.Preconditions;
-
-import java.io.PrintWriter;
-
-/**
- * A helper class wraps {@link AudioDeviceInfo}, and helps get/set the gain on a specific port
- * in terms of millibels.
- * Note to the reader. For whatever reason, it seems that AudioGain contains only configuration
- * information (min/max/step, etc) while the AudioGainConfig class contains the
- * actual currently active gain value(s).
- */
-/* package */ class CarAudioDeviceInfo {
-
- private final AudioDeviceInfo mAudioDeviceInfo;
- private final int mBusNumber;
- private final int mSampleRate;
- private final int mEncodingFormat;
- private final int mChannelCount;
- private final int mDefaultGain;
- private final int mMaxGain;
- private final int mMinGain;
-
- /**
- * We need to store the current gain because it is not accessible from the current
- * audio engine implementation. It would be nice if AudioPort#activeConfig() would return it,
- * but in the current implementation, that function actually works only for mixer ports.
- */
- private int mCurrentGain;
-
- CarAudioDeviceInfo(AudioDeviceInfo audioDeviceInfo) {
- mAudioDeviceInfo = audioDeviceInfo;
- mBusNumber = parseDeviceAddress(audioDeviceInfo.getAddress());
- mSampleRate = getMaxSampleRate(audioDeviceInfo);
- mEncodingFormat = getEncodingFormat(audioDeviceInfo);
- mChannelCount = getMaxChannels(audioDeviceInfo);
- final AudioGain audioGain = Preconditions.checkNotNull(
- getAudioGain(), "No audio gain on device port " + audioDeviceInfo);
- mDefaultGain = audioGain.defaultValue();
- mMaxGain = audioGain.maxValue();
- mMinGain = audioGain.minValue();
-
- mCurrentGain = -1; // Not initialized till explicitly set
- }
-
- AudioDeviceInfo getAudioDeviceInfo() {
- return mAudioDeviceInfo;
- }
-
- AudioDevicePort getAudioDevicePort() {
- return mAudioDeviceInfo.getPort();
- }
-
- int getBusNumber() {
- return mBusNumber;
- }
-
- int getDefaultGain() {
- return mDefaultGain;
- }
-
- int getMaxGain() {
- return mMaxGain;
- }
-
- int getMinGain() {
- return mMinGain;
- }
-
- int getSampleRate() {
- return mSampleRate;
- }
-
- int getEncodingFormat() {
- return mEncodingFormat;
- }
-
- int getChannelCount() {
- return mChannelCount;
- }
-
- // Input is in millibels
- void setCurrentGain(int gainInMillibels) {
- // Clamp the incoming value to our valid range. Out of range values ARE legal input
- if (gainInMillibels < mMinGain) {
- gainInMillibels = mMinGain;
- } else if (gainInMillibels > mMaxGain) {
- gainInMillibels = mMaxGain;
- }
-
- // Push the new gain value down to our underlying port which will cause it to show up
- // at the HAL.
- AudioGain audioGain = getAudioGain();
- if (audioGain == null) {
- Log.e(CarLog.TAG_AUDIO, "getAudioGain() returned null.");
- return;
- }
-
- // size of gain values is 1 in MODE_JOINT
- AudioGainConfig audioGainConfig = audioGain.buildConfig(
- AudioGain.MODE_JOINT,
- audioGain.channelMask(),
- new int[] { gainInMillibels },
- 0);
- if (audioGainConfig == null) {
- Log.e(CarLog.TAG_AUDIO, "Failed to construct AudioGainConfig");
- return;
- }
-
- int r = AudioManager.setAudioPortGain(getAudioDevicePort(), audioGainConfig);
- if (r == AudioManager.SUCCESS) {
- // Since we can't query for the gain on a device port later,
- // we have to remember what we asked for
- mCurrentGain = gainInMillibels;
- } else {
- Log.e(CarLog.TAG_AUDIO, "Failed to setAudioPortGain: " + r);
- }
- }
-
- /**
- * Parse device address. Expected format is BUS%d_%s, address, usage hint
- * @return valid address (from 0 to positive) or -1 for invalid address.
- */
- private int parseDeviceAddress(String address) {
- String[] words = address.split("_");
- int addressParsed = -1;
- if (words[0].toLowerCase().startsWith("bus")) {
- try {
- addressParsed = Integer.parseInt(words[0].substring(3));
- } catch (NumberFormatException e) {
- //ignore
- }
- }
- if (addressParsed < 0) {
- return -1;
- }
- return addressParsed;
- }
-
- private int getMaxSampleRate(AudioDeviceInfo info) {
- int[] sampleRates = info.getSampleRates();
- if (sampleRates == null || sampleRates.length == 0) {
- return 48000;
- }
- int sampleRate = sampleRates[0];
- for (int i = 1; i < sampleRates.length; i++) {
- if (sampleRates[i] > sampleRate) {
- sampleRate = sampleRates[i];
- }
- }
- return sampleRate;
- }
-
- /** Always returns {@link AudioFormat#ENCODING_PCM_16BIT} as for now */
- private int getEncodingFormat(AudioDeviceInfo info) {
- return AudioFormat.ENCODING_PCM_16BIT;
- }
-
- /**
- * Gets the maximum channel count for a given {@link AudioDeviceInfo}
- *
- * @param info {@link AudioDeviceInfo} instance to get maximum channel count for
- * @return Maximum channel count for a given {@link AudioDeviceInfo},
- * 1 (mono) if there is no channel masks configured
- */
- private int getMaxChannels(AudioDeviceInfo info) {
- int numChannels = 1;
- int[] channelMasks = info.getChannelMasks();
- if (channelMasks == null) {
- return numChannels;
- }
- for (int channelMask : channelMasks) {
- int currentNumChannels = Integer.bitCount(channelMask);
- if (currentNumChannels > numChannels) {
- numChannels = currentNumChannels;
- }
- }
- return numChannels;
- }
-
- /**
- * @return {@link AudioGain} with {@link AudioGain#MODE_JOINT} on a given {@link AudioPort}.
- * This is useful for inspecting the configuration data associated with this gain controller
- * (min/max/step/default).
- */
- AudioGain getAudioGain() {
- final AudioDevicePort audioPort = getAudioDevicePort();
- if (audioPort != null && audioPort.gains().length > 0) {
- for (AudioGain audioGain : audioPort.gains()) {
- if ((audioGain.mode() & AudioGain.MODE_JOINT) != 0) {
- return checkAudioGainConfiguration(audioGain);
- }
- }
- }
- return null;
- }
-
- /**
- * Constraints applied to gain configuration, see also audio_policy_configuration.xml
- */
- private AudioGain checkAudioGainConfiguration(AudioGain audioGain) {
- Preconditions.checkArgument(audioGain.maxValue() >= audioGain.minValue());
- Preconditions.checkArgument((audioGain.defaultValue() >= audioGain.minValue())
- && (audioGain.defaultValue() <= audioGain.maxValue()));
- Preconditions.checkArgument(
- ((audioGain.maxValue() - audioGain.minValue()) % audioGain.stepValue()) == 0);
- Preconditions.checkArgument(
- ((audioGain.defaultValue() - audioGain.minValue()) % audioGain.stepValue()) == 0);
- return audioGain;
- }
-
- @Override
- public String toString() {
- return "bus number: " + mBusNumber
- + " address: " + mAudioDeviceInfo.getAddress()
- + " sampleRate: " + getSampleRate()
- + " encodingFormat: " + getEncodingFormat()
- + " channelCount: " + getChannelCount()
- + " currentGain: " + mCurrentGain
- + " maxGain: " + mMaxGain
- + " minGain: " + mMinGain;
- }
-
- void dump(PrintWriter writer) {
- writer.printf("Bus Number (%d) / address (%s)\n ",
- mBusNumber, mAudioDeviceInfo.getAddress());
- writer.printf("\tsample rate / encoding format / channel count: %d %d %d\n",
- getSampleRate(), getEncodingFormat(), getChannelCount());
- writer.printf("\tGain in millibel (min / max / default/ current): %d %d %d %d\n",
- mMinGain, mMaxGain, mDefaultGain, mCurrentGain);
- }
-}
diff --git a/service/src/com/android/car/CarAudioService.java b/service/src/com/android/car/CarAudioService.java
deleted file mode 100644
index 1f9fad0..0000000
--- a/service/src/com/android/car/CarAudioService.java
+++ /dev/null
@@ -1,909 +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 com.android.car;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.car.Car;
-import android.car.media.CarAudioManager;
-import android.car.media.CarAudioPatchHandle;
-import android.car.media.ICarAudio;
-import android.car.media.ICarVolumeCallback;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.pm.PackageManager;
-import android.hardware.automotive.audiocontrol.V1_0.ContextNumber;
-import android.hardware.automotive.audiocontrol.V1_0.IAudioControl;
-import android.media.AudioAttributes;
-import android.media.AudioDeviceInfo;
-import android.media.AudioDevicePort;
-import android.media.AudioFormat;
-import android.media.AudioGain;
-import android.media.AudioGainConfig;
-import android.media.AudioManager;
-import android.media.AudioPatch;
-import android.media.AudioPlaybackConfiguration;
-import android.media.AudioPortConfig;
-import android.media.AudioSystem;
-import android.media.audiopolicy.AudioMix;
-import android.media.audiopolicy.AudioMixingRule;
-import android.media.audiopolicy.AudioPolicy;
-import android.os.IBinder;
-import android.os.Looper;
-import android.os.RemoteException;
-import android.provider.Settings;
-import android.telephony.TelephonyManager;
-import android.text.TextUtils;
-import android.util.Log;
-import android.util.SparseArray;
-import android.util.SparseIntArray;
-import android.view.KeyEvent;
-
-import com.android.internal.util.Preconditions;
-
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.NoSuchElementException;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-public class CarAudioService extends ICarAudio.Stub implements CarServiceBase {
-
- private static final int DEFAULT_AUDIO_USAGE = AudioAttributes.USAGE_MEDIA;
-
- private static final int[] CONTEXT_NUMBERS = new int[] {
- ContextNumber.MUSIC,
- ContextNumber.NAVIGATION,
- ContextNumber.VOICE_COMMAND,
- ContextNumber.CALL_RING,
- ContextNumber.CALL,
- ContextNumber.ALARM,
- ContextNumber.NOTIFICATION,
- ContextNumber.SYSTEM_SOUND
- };
-
- private static final SparseIntArray USAGE_TO_CONTEXT = new SparseIntArray();
-
- // For legacy stream type based volume control.
- // Values in STREAM_TYPES and STREAM_TYPE_USAGES should be aligned.
- private static final int[] STREAM_TYPES = new int[] {
- AudioManager.STREAM_MUSIC,
- AudioManager.STREAM_ALARM,
- AudioManager.STREAM_RING
- };
- private static final int[] STREAM_TYPE_USAGES = new int[] {
- AudioAttributes.USAGE_MEDIA,
- AudioAttributes.USAGE_ALARM,
- AudioAttributes.USAGE_NOTIFICATION_RINGTONE
- };
-
- static {
- USAGE_TO_CONTEXT.put(AudioAttributes.USAGE_UNKNOWN, ContextNumber.MUSIC);
- USAGE_TO_CONTEXT.put(AudioAttributes.USAGE_MEDIA, ContextNumber.MUSIC);
- USAGE_TO_CONTEXT.put(AudioAttributes.USAGE_VOICE_COMMUNICATION, ContextNumber.CALL);
- USAGE_TO_CONTEXT.put(AudioAttributes.USAGE_VOICE_COMMUNICATION_SIGNALLING,
- ContextNumber.CALL);
- USAGE_TO_CONTEXT.put(AudioAttributes.USAGE_ALARM, ContextNumber.ALARM);
- USAGE_TO_CONTEXT.put(AudioAttributes.USAGE_NOTIFICATION, ContextNumber.NOTIFICATION);
- USAGE_TO_CONTEXT.put(AudioAttributes.USAGE_NOTIFICATION_RINGTONE, ContextNumber.CALL_RING);
- USAGE_TO_CONTEXT.put(AudioAttributes.USAGE_NOTIFICATION_COMMUNICATION_REQUEST,
- ContextNumber.NOTIFICATION);
- USAGE_TO_CONTEXT.put(AudioAttributes.USAGE_NOTIFICATION_COMMUNICATION_INSTANT,
- ContextNumber.NOTIFICATION);
- USAGE_TO_CONTEXT.put(AudioAttributes.USAGE_NOTIFICATION_COMMUNICATION_DELAYED,
- ContextNumber.NOTIFICATION);
- USAGE_TO_CONTEXT.put(AudioAttributes.USAGE_NOTIFICATION_EVENT, ContextNumber.NOTIFICATION);
- USAGE_TO_CONTEXT.put(AudioAttributes.USAGE_ASSISTANCE_ACCESSIBILITY,
- ContextNumber.VOICE_COMMAND);
- USAGE_TO_CONTEXT.put(AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE,
- ContextNumber.NAVIGATION);
- USAGE_TO_CONTEXT.put(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION,
- ContextNumber.SYSTEM_SOUND);
- USAGE_TO_CONTEXT.put(AudioAttributes.USAGE_GAME, ContextNumber.MUSIC);
- USAGE_TO_CONTEXT.put(AudioAttributes.USAGE_VIRTUAL_SOURCE, ContextNumber.INVALID);
- USAGE_TO_CONTEXT.put(AudioAttributes.USAGE_ASSISTANT, ContextNumber.VOICE_COMMAND);
- }
-
- private final Object mImplLock = new Object();
-
- private final Context mContext;
- private final TelephonyManager mTelephonyManager;
- private final AudioManager mAudioManager;
- private final boolean mUseDynamicRouting;
- private final boolean mPersistMasterMuteState;
- private final SparseIntArray mContextToBus = new SparseIntArray();
- private final SparseArray<CarAudioDeviceInfo> mCarAudioDeviceInfos = new SparseArray<>();
-
- private final AudioPolicy.AudioPolicyVolumeCallback mAudioPolicyVolumeCallback =
- new AudioPolicy.AudioPolicyVolumeCallback() {
- @Override
- public void onVolumeAdjustment(int adjustment) {
- final int usage = getSuggestedAudioUsage();
- Log.v(CarLog.TAG_AUDIO,
- "onVolumeAdjustment: " + AudioManager.adjustToString(adjustment)
- + " suggested usage: " + AudioAttributes.usageToString(usage));
- final int groupId = getVolumeGroupIdForUsage(usage);
- final int currentVolume = getGroupVolume(groupId);
- final int flags = AudioManager.FLAG_FROM_KEY | AudioManager.FLAG_SHOW_UI;
- switch (adjustment) {
- case AudioManager.ADJUST_LOWER:
- if (currentVolume > getGroupMinVolume(groupId)) {
- setGroupVolume(groupId, currentVolume - 1, flags);
- }
- break;
- case AudioManager.ADJUST_RAISE:
- if (currentVolume < getGroupMaxVolume(groupId)) {
- setGroupVolume(groupId, currentVolume + 1, flags);
- }
- break;
- case AudioManager.ADJUST_MUTE:
- setMasterMute(true, flags);
- callbackMasterMuteChange(flags);
- break;
- case AudioManager.ADJUST_UNMUTE:
- setMasterMute(false, flags);
- callbackMasterMuteChange(flags);
- break;
- case AudioManager.ADJUST_TOGGLE_MUTE:
- setMasterMute(!mAudioManager.isMasterMute(), flags);
- callbackMasterMuteChange(flags);
- break;
- case AudioManager.ADJUST_SAME:
- default:
- break;
- }
- }
- };
-
- private final BinderInterfaceContainer<ICarVolumeCallback> mVolumeCallbackContainer =
- new BinderInterfaceContainer<>();
-
- /**
- * Simulates {@link ICarVolumeCallback} when it's running in legacy mode.
- */
- private final BroadcastReceiver mLegacyVolumeChangedReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- switch (intent.getAction()) {
- case AudioManager.VOLUME_CHANGED_ACTION:
- int streamType = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, -1);
- int groupId = getVolumeGroupIdForStreamType(streamType);
- if (groupId == -1) {
- Log.w(CarLog.TAG_AUDIO, "Unknown stream type: " + streamType);
- } else {
- callbackGroupVolumeChange(groupId, 0);
- }
- break;
- case AudioManager.MASTER_MUTE_CHANGED_ACTION:
- callbackMasterMuteChange(0);
- break;
- }
- }
- };
-
- private AudioPolicy mAudioPolicy;
- private CarVolumeGroup[] mCarVolumeGroups;
-
- public CarAudioService(Context context) {
- mContext = context;
- mTelephonyManager = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
- mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
- mUseDynamicRouting = mContext.getResources().getBoolean(R.bool.audioUseDynamicRouting);
- mPersistMasterMuteState = mContext.getResources().getBoolean(
- R.bool.audioPersistMasterMuteState);
- }
-
- /**
- * Dynamic routing and volume groups are set only if
- * {@link #mUseDynamicRouting} is {@code true}. Otherwise, this service runs in legacy mode.
- */
- @Override
- public void init() {
- synchronized (mImplLock) {
- if (!mUseDynamicRouting) {
- Log.i(CarLog.TAG_AUDIO, "Audio dynamic routing not configured, run in legacy mode");
- setupLegacyVolumeChangedListener();
- } else {
- setupDynamicRouting();
- setupVolumeGroups();
- }
-
- // Restore master mute state if applicable
- if (mPersistMasterMuteState) {
- boolean storedMasterMute = Settings.Global.getInt(mContext.getContentResolver(),
- CarAudioManager.VOLUME_SETTINGS_KEY_MASTER_MUTE, 0) != 0;
- setMasterMute(storedMasterMute, 0);
- }
- }
- }
-
- @Override
- public void release() {
- synchronized (mImplLock) {
- if (mUseDynamicRouting) {
- if (mAudioPolicy != null) {
- mAudioManager.unregisterAudioPolicyAsync(mAudioPolicy);
- mAudioPolicy = null;
- }
- } else {
- mContext.unregisterReceiver(mLegacyVolumeChangedReceiver);
- }
-
- mVolumeCallbackContainer.clear();
- }
- }
-
- @Override
- public void dump(PrintWriter writer) {
- writer.println("*CarAudioService*");
- writer.println("\tRun in legacy mode? " + (!mUseDynamicRouting));
- writer.println("\tPersist master mute state? " + mPersistMasterMuteState);
- writer.println("\tMaster muted? " + mAudioManager.isMasterMute());
- // Empty line for comfortable reading
- writer.println();
- if (mUseDynamicRouting) {
- for (CarVolumeGroup group : mCarVolumeGroups) {
- group.dump(writer);
- }
- }
- }
-
- /**
- * @see {@link android.car.media.CarAudioManager#setGroupVolume(int, int, int)}
- */
- @Override
- public void setGroupVolume(int groupId, int index, int flags) {
- synchronized (mImplLock) {
- enforcePermission(Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME);
-
- callbackGroupVolumeChange(groupId, flags);
- // For legacy stream type based volume control
- if (!mUseDynamicRouting) {
- mAudioManager.setStreamVolume(STREAM_TYPES[groupId], index, flags);
- return;
- }
-
- CarVolumeGroup group = getCarVolumeGroup(groupId);
- group.setCurrentGainIndex(index);
- }
- }
-
- private void callbackGroupVolumeChange(int groupId, int flags) {
- for (BinderInterfaceContainer.BinderInterface<ICarVolumeCallback> callback :
- mVolumeCallbackContainer.getInterfaces()) {
- try {
- callback.binderInterface.onGroupVolumeChanged(groupId, flags);
- } catch (RemoteException e) {
- Log.e(CarLog.TAG_AUDIO, "Failed to callback onGroupVolumeChanged", e);
- }
- }
- }
-
- private void setMasterMute(boolean mute, int flags) {
- mAudioManager.setMasterMute(mute, flags);
-
- // When the master mute is turned ON, we want the playing app to get a "pause" command.
- // When the volume is unmuted, we want to resume playback.
- int keycode = mute ? KeyEvent.KEYCODE_MEDIA_PAUSE : KeyEvent.KEYCODE_MEDIA_PLAY;
- mAudioManager.dispatchMediaKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, keycode));
- mAudioManager.dispatchMediaKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, keycode));
- }
-
- private void callbackMasterMuteChange(int flags) {
- for (BinderInterfaceContainer.BinderInterface<ICarVolumeCallback> callback :
- mVolumeCallbackContainer.getInterfaces()) {
- try {
- callback.binderInterface.onMasterMuteChanged(flags);
- } catch (RemoteException e) {
- Log.e(CarLog.TAG_AUDIO, "Failed to callback onMasterMuteChanged", e);
- }
- }
-
- // Persists master mute state if applicable
- if (mPersistMasterMuteState) {
- Settings.Global.putInt(mContext.getContentResolver(),
- CarAudioManager.VOLUME_SETTINGS_KEY_MASTER_MUTE,
- mAudioManager.isMasterMute() ? 1 : 0);
- }
- }
-
- /**
- * @see {@link android.car.media.CarAudioManager#getGroupMaxVolume(int)}
- */
- @Override
- public int getGroupMaxVolume(int groupId) {
- synchronized (mImplLock) {
- enforcePermission(Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME);
-
- // For legacy stream type based volume control
- if (!mUseDynamicRouting) {
- return mAudioManager.getStreamMaxVolume(STREAM_TYPES[groupId]);
- }
-
- CarVolumeGroup group = getCarVolumeGroup(groupId);
- return group.getMaxGainIndex();
- }
- }
-
- /**
- * @see {@link android.car.media.CarAudioManager#getGroupMinVolume(int)}
- */
- @Override
- public int getGroupMinVolume(int groupId) {
- synchronized (mImplLock) {
- enforcePermission(Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME);
-
- // For legacy stream type based volume control
- if (!mUseDynamicRouting) {
- return mAudioManager.getStreamMinVolume(STREAM_TYPES[groupId]);
- }
-
- CarVolumeGroup group = getCarVolumeGroup(groupId);
- return group.getMinGainIndex();
- }
- }
-
- /**
- * @see {@link android.car.media.CarAudioManager#getGroupVolume(int)}
- */
- @Override
- public int getGroupVolume(int groupId) {
- synchronized (mImplLock) {
- enforcePermission(Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME);
-
- // For legacy stream type based volume control
- if (!mUseDynamicRouting) {
- return mAudioManager.getStreamVolume(STREAM_TYPES[groupId]);
- }
-
- CarVolumeGroup group = getCarVolumeGroup(groupId);
- return group.getCurrentGainIndex();
- }
- }
-
- private CarVolumeGroup getCarVolumeGroup(int groupId) {
- Preconditions.checkNotNull(mCarVolumeGroups);
- Preconditions.checkArgument(groupId >= 0 && groupId < mCarVolumeGroups.length,
- "groupId out of range: " + groupId);
- return mCarVolumeGroups[groupId];
- }
-
- private void setupLegacyVolumeChangedListener() {
- IntentFilter intentFilter = new IntentFilter();
- intentFilter.addAction(AudioManager.VOLUME_CHANGED_ACTION);
- intentFilter.addAction(AudioManager.MASTER_MUTE_CHANGED_ACTION);
- mContext.registerReceiver(mLegacyVolumeChangedReceiver, intentFilter);
- }
-
- private void setupDynamicRouting() {
- final IAudioControl audioControl = getAudioControl();
- if (audioControl == null) {
- return;
- }
- AudioPolicy audioPolicy = getDynamicAudioPolicy(audioControl);
- int r = mAudioManager.registerAudioPolicy(audioPolicy);
- if (r != AudioManager.SUCCESS) {
- throw new RuntimeException("registerAudioPolicy failed " + r);
- }
- mAudioPolicy = audioPolicy;
- }
-
- private void setupVolumeGroups() {
- Preconditions.checkArgument(mCarAudioDeviceInfos.size() > 0,
- "No bus device is configured to setup volume groups");
- final CarVolumeGroupsHelper helper = new CarVolumeGroupsHelper(
- mContext, R.xml.car_volume_groups);
- mCarVolumeGroups = helper.loadVolumeGroups();
- for (CarVolumeGroup group : mCarVolumeGroups) {
- for (int contextNumber : group.getContexts()) {
- int busNumber = mContextToBus.get(contextNumber);
- group.bind(contextNumber, busNumber, mCarAudioDeviceInfos.get(busNumber));
- }
-
- // Now that we have all our contexts, ensure the HAL gets our intial value
- group.setCurrentGainIndex(group.getCurrentGainIndex());
-
- Log.v(CarLog.TAG_AUDIO, "Processed volume group: " + group);
- }
- // Perform validation after all volume groups are processed
- if (!validateVolumeGroups()) {
- throw new RuntimeException("Invalid volume groups configuration");
- }
- }
-
- /**
- * Constraints applied here:
- *
- * - One context should not appear in two groups
- * - All contexts are assigned
- * - One bus should not appear in two groups
- * - All gain controllers in the same group have same step value
- *
- * Note that it is fine that there are buses not appear in any group, those buses may be
- * reserved for other usages.
- * Step value validation is done in {@link CarVolumeGroup#bind(int, int, CarAudioDeviceInfo)}
- *
- * See also the car_volume_groups.xml configuration
- */
- private boolean validateVolumeGroups() {
- Set<Integer> contextSet = new HashSet<>();
- Set<Integer> busNumberSet = new HashSet<>();
- for (CarVolumeGroup group : mCarVolumeGroups) {
- // One context should not appear in two groups
- for (int context : group.getContexts()) {
- if (contextSet.contains(context)) {
- Log.e(CarLog.TAG_AUDIO, "Context appears in two groups: " + context);
- return false;
- }
- contextSet.add(context);
- }
-
- // One bus should not appear in two groups
- for (int busNumber : group.getBusNumbers()) {
- if (busNumberSet.contains(busNumber)) {
- Log.e(CarLog.TAG_AUDIO, "Bus appears in two groups: " + busNumber);
- return false;
- }
- busNumberSet.add(busNumber);
- }
- }
-
- // All contexts are assigned
- if (contextSet.size() != CONTEXT_NUMBERS.length) {
- Log.e(CarLog.TAG_AUDIO, "Some contexts are not assigned to group");
- Log.e(CarLog.TAG_AUDIO, "Assigned contexts "
- + Arrays.toString(contextSet.toArray(new Integer[contextSet.size()])));
- Log.e(CarLog.TAG_AUDIO, "All contexts " + Arrays.toString(CONTEXT_NUMBERS));
- return false;
- }
-
- return true;
- }
-
- @Nullable
- private AudioPolicy getDynamicAudioPolicy(@NonNull IAudioControl audioControl) {
- AudioPolicy.Builder builder = new AudioPolicy.Builder(mContext);
- builder.setLooper(Looper.getMainLooper());
-
- // 1st, enumerate all output bus device ports
- AudioDeviceInfo[] deviceInfos = mAudioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS);
- if (deviceInfos.length == 0) {
- Log.e(CarLog.TAG_AUDIO, "getDynamicAudioPolicy, no output device available, ignore");
- return null;
- }
- for (AudioDeviceInfo info : deviceInfos) {
- Log.v(CarLog.TAG_AUDIO, String.format("output id=%d address=%s type=%s",
- info.getId(), info.getAddress(), info.getType()));
- if (info.getType() == AudioDeviceInfo.TYPE_BUS) {
- final CarAudioDeviceInfo carInfo = new CarAudioDeviceInfo(info);
- // See also the audio_policy_configuration.xml and getBusForContext in
- // audio control HAL, the bus number should be no less than zero.
- if (carInfo.getBusNumber() >= 0) {
- mCarAudioDeviceInfos.put(carInfo.getBusNumber(), carInfo);
- Log.i(CarLog.TAG_AUDIO, "Valid bus found " + carInfo);
- }
- }
- }
-
- // 2nd, map context to physical bus
- try {
- for (int contextNumber : CONTEXT_NUMBERS) {
- int busNumber = audioControl.getBusForContext(contextNumber);
- mContextToBus.put(contextNumber, busNumber);
- CarAudioDeviceInfo info = mCarAudioDeviceInfos.get(busNumber);
- if (info == null) {
- Log.w(CarLog.TAG_AUDIO, "No bus configured for context: " + contextNumber);
- }
- }
- } catch (RemoteException e) {
- Log.e(CarLog.TAG_AUDIO, "Error mapping context to physical bus", e);
- }
-
- // 3rd, enumerate all physical buses and build the routing policy.
- // Note that one can not register audio mix for same bus more than once.
- for (int i = 0; i < mCarAudioDeviceInfos.size(); i++) {
- int busNumber = mCarAudioDeviceInfos.keyAt(i);
- boolean hasContext = false;
- CarAudioDeviceInfo info = mCarAudioDeviceInfos.valueAt(i);
- AudioFormat mixFormat = new AudioFormat.Builder()
- .setSampleRate(info.getSampleRate())
- .setEncoding(info.getEncodingFormat())
- .setChannelMask(info.getChannelCount())
- .build();
- AudioMixingRule.Builder mixingRuleBuilder = new AudioMixingRule.Builder();
- for (int j = 0; j < mContextToBus.size(); j++) {
- if (mContextToBus.valueAt(j) == busNumber) {
- hasContext = true;
- int contextNumber = mContextToBus.keyAt(j);
- int[] usages = getUsagesForContext(contextNumber);
- for (int usage : usages) {
- mixingRuleBuilder.addRule(
- new AudioAttributes.Builder().setUsage(usage).build(),
- AudioMixingRule.RULE_MATCH_ATTRIBUTE_USAGE);
- }
- Log.i(CarLog.TAG_AUDIO, "Bus number: " + busNumber
- + " contextNumber: " + contextNumber
- + " sampleRate: " + info.getSampleRate()
- + " channels: " + info.getChannelCount()
- + " usages: " + Arrays.toString(usages));
- }
- }
- if (hasContext) {
- // It's a valid case that an audio output bus is defined in
- // audio_policy_configuration and no context is assigned to it.
- // In such case, do not build a policy mix with zero rules.
- AudioMix audioMix = new AudioMix.Builder(mixingRuleBuilder.build())
- .setFormat(mixFormat)
- .setDevice(info.getAudioDeviceInfo())
- .setRouteFlags(AudioMix.ROUTE_FLAG_RENDER)
- .build();
- builder.addMix(audioMix);
- }
- }
-
- // 4th, attach the {@link AudioPolicyVolumeCallback}
- builder.setAudioPolicyVolumeCallback(mAudioPolicyVolumeCallback);
-
- return builder.build();
- }
-
- private int[] getUsagesForContext(int contextNumber) {
- final List<Integer> usages = new ArrayList<>();
- for (int i = 0; i < USAGE_TO_CONTEXT.size(); i++) {
- if (USAGE_TO_CONTEXT.valueAt(i) == contextNumber) {
- usages.add(USAGE_TO_CONTEXT.keyAt(i));
- }
- }
- return usages.stream().mapToInt(i -> i).toArray();
- }
-
- @Override
- public void setFadeTowardFront(float value) {
- synchronized (mImplLock) {
- enforcePermission(Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME);
- final IAudioControl audioControlHal = getAudioControl();
- if (audioControlHal != null) {
- try {
- audioControlHal.setFadeTowardFront(value);
- } catch (RemoteException e) {
- Log.e(CarLog.TAG_AUDIO, "setFadeTowardFront failed", e);
- }
- }
- }
- }
-
- @Override
- public void setBalanceTowardRight(float value) {
- synchronized (mImplLock) {
- enforcePermission(Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME);
- final IAudioControl audioControlHal = getAudioControl();
- if (audioControlHal != null) {
- try {
- audioControlHal.setBalanceTowardRight(value);
- } catch (RemoteException e) {
- Log.e(CarLog.TAG_AUDIO, "setBalanceTowardRight failed", e);
- }
- }
- }
- }
-
- /**
- * @return Array of accumulated device addresses, empty array if we found nothing
- */
- @Override
- public @NonNull String[] getExternalSources() {
- synchronized (mImplLock) {
- enforcePermission(Car.PERMISSION_CAR_CONTROL_AUDIO_SETTINGS);
- List<String> sourceAddresses = new ArrayList<>();
-
- AudioDeviceInfo[] devices = mAudioManager.getDevices(AudioManager.GET_DEVICES_INPUTS);
- if (devices.length == 0) {
- Log.w(CarLog.TAG_AUDIO, "getExternalSources, no input devices found.");
- }
-
- // Collect the list of non-microphone input ports
- for (AudioDeviceInfo info : devices) {
- switch (info.getType()) {
- // TODO: Can we trim this set down? Especially duplicates like FM vs FM_TUNER?
- case AudioDeviceInfo.TYPE_FM:
- case AudioDeviceInfo.TYPE_FM_TUNER:
- case AudioDeviceInfo.TYPE_TV_TUNER:
- case AudioDeviceInfo.TYPE_HDMI:
- case AudioDeviceInfo.TYPE_AUX_LINE:
- case AudioDeviceInfo.TYPE_LINE_ANALOG:
- case AudioDeviceInfo.TYPE_LINE_DIGITAL:
- case AudioDeviceInfo.TYPE_USB_ACCESSORY:
- case AudioDeviceInfo.TYPE_USB_DEVICE:
- case AudioDeviceInfo.TYPE_USB_HEADSET:
- case AudioDeviceInfo.TYPE_IP:
- case AudioDeviceInfo.TYPE_BUS:
- String address = info.getAddress();
- if (TextUtils.isEmpty(address)) {
- Log.w(CarLog.TAG_AUDIO,
- "Discarded device with empty address, type=" + info.getType());
- } else {
- sourceAddresses.add(address);
- }
- }
- }
-
- return sourceAddresses.toArray(new String[sourceAddresses.size()]);
- }
- }
-
- @Override
- public CarAudioPatchHandle createAudioPatch(String sourceAddress,
- @AudioAttributes.AttributeUsage int usage, int gainInMillibels) {
- synchronized (mImplLock) {
- enforcePermission(Car.PERMISSION_CAR_CONTROL_AUDIO_SETTINGS);
- return createAudioPatchLocked(sourceAddress, usage, gainInMillibels);
- }
- }
-
- @Override
- public void releaseAudioPatch(CarAudioPatchHandle carPatch) {
- synchronized (mImplLock) {
- enforcePermission(Car.PERMISSION_CAR_CONTROL_AUDIO_SETTINGS);
- releaseAudioPatchLocked(carPatch);
- }
- }
-
- private CarAudioPatchHandle createAudioPatchLocked(String sourceAddress,
- @AudioAttributes.AttributeUsage int usage, int gainInMillibels) {
- // Find the named source port
- AudioDeviceInfo sourcePortInfo = null;
- AudioDeviceInfo[] deviceInfos = mAudioManager.getDevices(AudioManager.GET_DEVICES_INPUTS);
- for (AudioDeviceInfo info : deviceInfos) {
- if (sourceAddress.equals(info.getAddress())) {
- // This is the one for which we're looking
- sourcePortInfo = info;
- break;
- }
- }
- Preconditions.checkNotNull(sourcePortInfo,
- "Specified source is not available: " + sourceAddress);
-
- // Find the output port associated with the given carUsage
- AudioDevicePort sinkPort = Preconditions.checkNotNull(getAudioPort(usage),
- "Sink not available for usage: " + AudioAttributes.usageToString(usage));
-
- // {@link android.media.AudioPort#activeConfig()} is valid for mixer port only,
- // since audio framework has no clue what's active on the device ports.
- // Therefore we construct an empty / default configuration here, which the audio HAL
- // implementation should ignore.
- AudioPortConfig sinkConfig = sinkPort.buildConfig(0,
- AudioFormat.CHANNEL_OUT_DEFAULT, AudioFormat.ENCODING_DEFAULT, null);
- Log.d(CarLog.TAG_AUDIO, "createAudioPatch sinkConfig: " + sinkConfig);
-
- // Configure the source port to match the output port except for a gain adjustment
- final CarAudioDeviceInfo helper = new CarAudioDeviceInfo(sourcePortInfo);
- AudioGain audioGain = Preconditions.checkNotNull(helper.getAudioGain(),
- "Gain controller not available for source port");
-
- // size of gain values is 1 in MODE_JOINT
- AudioGainConfig audioGainConfig = audioGain.buildConfig(AudioGain.MODE_JOINT,
- audioGain.channelMask(), new int[] { gainInMillibels }, 0);
- // Construct an empty / default configuration excepts gain config here and it's up to the
- // audio HAL how to interpret this configuration, which the audio HAL
- // implementation should ignore.
- AudioPortConfig sourceConfig = sourcePortInfo.getPort().buildConfig(0,
- AudioFormat.CHANNEL_IN_DEFAULT, AudioFormat.ENCODING_DEFAULT, audioGainConfig);
-
- // Create an audioPatch to connect the two ports
- AudioPatch[] patch = new AudioPatch[] { null };
- int result = AudioManager.createAudioPatch(patch,
- new AudioPortConfig[] { sourceConfig },
- new AudioPortConfig[] { sinkConfig });
- if (result != AudioManager.SUCCESS) {
- throw new RuntimeException("createAudioPatch failed with code " + result);
- }
-
- Preconditions.checkNotNull(patch[0],
- "createAudioPatch didn't provide expected single handle");
- Log.d(CarLog.TAG_AUDIO, "Audio patch created: " + patch[0]);
-
- // Ensure the initial volume on output device port
- int groupId = getVolumeGroupIdForUsage(usage);
- setGroupVolume(groupId, getGroupVolume(groupId), 0);
-
- return new CarAudioPatchHandle(patch[0]);
- }
-
- private void releaseAudioPatchLocked(CarAudioPatchHandle carPatch) {
- // NOTE: AudioPolicyService::removeNotificationClient will take care of this automatically
- // if the client that created a patch quits.
-
- // FIXME {@link AudioManager#listAudioPatches(ArrayList)} returns old generation of
- // audio patches after creation
- ArrayList<AudioPatch> patches = new ArrayList<>();
- int result = AudioSystem.listAudioPatches(patches, new int[1]);
- if (result != AudioManager.SUCCESS) {
- throw new RuntimeException("listAudioPatches failed with code " + result);
- }
-
- // Look for a patch that matches the provided user side handle
- for (AudioPatch patch : patches) {
- if (carPatch.represents(patch)) {
- // Found it!
- result = AudioManager.releaseAudioPatch(patch);
- if (result != AudioManager.SUCCESS) {
- throw new RuntimeException("releaseAudioPatch failed with code " + result);
- }
- return;
- }
- }
-
- // If we didn't find a match, then something went awry, but it's probably not fatal...
- Log.e(CarLog.TAG_AUDIO, "releaseAudioPatch found no match for " + carPatch);
- }
-
- @Override
- public int getVolumeGroupCount() {
- synchronized (mImplLock) {
- enforcePermission(Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME);
-
- // For legacy stream type based volume control
- if (!mUseDynamicRouting) return STREAM_TYPES.length;
-
- return mCarVolumeGroups == null ? 0 : mCarVolumeGroups.length;
- }
- }
-
- @Override
- public int getVolumeGroupIdForUsage(@AudioAttributes.AttributeUsage int usage) {
- synchronized (mImplLock) {
- enforcePermission(Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME);
-
- if (mCarVolumeGroups == null) {
- return -1;
- }
-
- for (int i = 0; i < mCarVolumeGroups.length; i++) {
- int[] contexts = mCarVolumeGroups[i].getContexts();
- for (int context : contexts) {
- if (USAGE_TO_CONTEXT.get(usage) == context) {
- return i;
- }
- }
- }
- return -1;
- }
- }
-
- @Override
- public @NonNull int[] getUsagesForVolumeGroupId(int groupId) {
- synchronized (mImplLock) {
- enforcePermission(Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME);
-
- // For legacy stream type based volume control
- if (!mUseDynamicRouting) {
- return new int[] { STREAM_TYPE_USAGES[groupId] };
- }
-
- CarVolumeGroup group = getCarVolumeGroup(groupId);
- Set<Integer> contexts =
- Arrays.stream(group.getContexts()).boxed().collect(Collectors.toSet());
- final List<Integer> usages = new ArrayList<>();
- for (int i = 0; i < USAGE_TO_CONTEXT.size(); i++) {
- if (contexts.contains(USAGE_TO_CONTEXT.valueAt(i))) {
- usages.add(USAGE_TO_CONTEXT.keyAt(i));
- }
- }
- return usages.stream().mapToInt(i -> i).toArray();
- }
- }
-
- /**
- * See {@link android.car.media.CarAudioManager#registerVolumeCallback(IBinder)}
- */
- @Override
- public void registerVolumeCallback(@NonNull IBinder binder) {
- synchronized (mImplLock) {
- enforcePermission(Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME);
-
- mVolumeCallbackContainer.addBinder(ICarVolumeCallback.Stub.asInterface(binder));
- }
- }
-
- /**
- * See {@link android.car.media.CarAudioManager#unregisterVolumeCallback(IBinder)}
- */
- @Override
- public void unregisterVolumeCallback(@NonNull IBinder binder) {
- synchronized (mImplLock) {
- enforcePermission(Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME);
-
- mVolumeCallbackContainer.removeBinder(ICarVolumeCallback.Stub.asInterface(binder));
- }
- }
-
- private void enforcePermission(String permissionName) {
- if (mContext.checkCallingOrSelfPermission(permissionName)
- != PackageManager.PERMISSION_GRANTED) {
- throw new SecurityException("requires permission " + permissionName);
- }
- }
-
- /**
- * @return {@link AudioDevicePort} that handles the given car audio usage.
- * Multiple usages may share one {@link AudioDevicePort}
- */
- private @Nullable AudioDevicePort getAudioPort(@AudioAttributes.AttributeUsage int usage) {
- final int groupId = getVolumeGroupIdForUsage(usage);
- final CarVolumeGroup group = Preconditions.checkNotNull(mCarVolumeGroups[groupId],
- "Can not find CarVolumeGroup by usage: "
- + AudioAttributes.usageToString(usage));
- return group.getAudioDevicePortForContext(USAGE_TO_CONTEXT.get(usage));
- }
-
- /**
- * @return The suggested {@link AudioAttributes} usage to which the volume key events apply
- */
- private @AudioAttributes.AttributeUsage int getSuggestedAudioUsage() {
- int callState = mTelephonyManager.getCallState();
- if (callState == TelephonyManager.CALL_STATE_RINGING) {
- return AudioAttributes.USAGE_NOTIFICATION_RINGTONE;
- } else if (callState == TelephonyManager.CALL_STATE_OFFHOOK) {
- return AudioAttributes.USAGE_VOICE_COMMUNICATION;
- } else {
- List<AudioPlaybackConfiguration> playbacks = mAudioManager
- .getActivePlaybackConfigurations()
- .stream()
- .filter(AudioPlaybackConfiguration::isActive)
- .collect(Collectors.toList());
- if (!playbacks.isEmpty()) {
- // Get audio usage from active playbacks if there is any, last one if multiple
- return playbacks.get(playbacks.size() - 1).getAudioAttributes().getUsage();
- } else {
- // TODO(b/72695246): Otherwise, get audio usage from foreground activity/window
- return DEFAULT_AUDIO_USAGE;
- }
- }
- }
-
- /**
- * Gets volume group by a given legacy stream type
- * @param streamType Legacy stream type such as {@link AudioManager#STREAM_MUSIC}
- * @return volume group id mapped from stream type
- */
- private int getVolumeGroupIdForStreamType(int streamType) {
- int groupId = -1;
- for (int i = 0; i < STREAM_TYPES.length; i++) {
- if (streamType == STREAM_TYPES[i]) {
- groupId = i;
- break;
- }
- }
- return groupId;
- }
-
- @Nullable
- private static IAudioControl getAudioControl() {
- try {
- return IAudioControl.getService();
- } catch (RemoteException e) {
- Log.e(CarLog.TAG_AUDIO, "Failed to get IAudioControl service", e);
- } catch (NoSuchElementException e) {
- Log.e(CarLog.TAG_AUDIO, "IAudioControl service not registered yet");
- }
- return null;
- }
-}
diff --git a/service/src/com/android/car/CarBluetoothService.java b/service/src/com/android/car/CarBluetoothService.java
index d36db43..a8ffdcc 100644
--- a/service/src/com/android/car/CarBluetoothService.java
+++ b/service/src/com/android/car/CarBluetoothService.java
@@ -15,22 +15,14 @@
*/
package com.android.car;
-import static android.car.settings.CarSettings.Secure
- .KEY_BLUETOOTH_AUTOCONNECT_MESSAGING_DEVICE_PRIORITY_0;
-import static android.car.settings.CarSettings.Secure
- .KEY_BLUETOOTH_AUTOCONNECT_MESSAGING_DEVICE_PRIORITY_1;
-import static android.car.settings.CarSettings.Secure
- .KEY_BLUETOOTH_AUTOCONNECT_MUSIC_DEVICE_PRIORITY_0;
-import static android.car.settings.CarSettings.Secure
- .KEY_BLUETOOTH_AUTOCONNECT_MUSIC_DEVICE_PRIORITY_1;
-import static android.car.settings.CarSettings.Secure
- .KEY_BLUETOOTH_AUTOCONNECT_NETWORK_DEVICE_PRIORITY_0;
-import static android.car.settings.CarSettings.Secure
- .KEY_BLUETOOTH_AUTOCONNECT_NETWORK_DEVICE_PRIORITY_1;
-import static android.car.settings.CarSettings.Secure
- .KEY_BLUETOOTH_AUTOCONNECT_PHONE_DEVICE_PRIORITY_0;
-import static android.car.settings.CarSettings.Secure
- .KEY_BLUETOOTH_AUTOCONNECT_PHONE_DEVICE_PRIORITY_1;
+import static android.car.settings.CarSettings.Secure.KEY_BLUETOOTH_AUTOCONNECT_MESSAGING_DEVICE_PRIORITY_0;
+import static android.car.settings.CarSettings.Secure.KEY_BLUETOOTH_AUTOCONNECT_MESSAGING_DEVICE_PRIORITY_1;
+import static android.car.settings.CarSettings.Secure.KEY_BLUETOOTH_AUTOCONNECT_MUSIC_DEVICE_PRIORITY_0;
+import static android.car.settings.CarSettings.Secure.KEY_BLUETOOTH_AUTOCONNECT_MUSIC_DEVICE_PRIORITY_1;
+import static android.car.settings.CarSettings.Secure.KEY_BLUETOOTH_AUTOCONNECT_NETWORK_DEVICE_PRIORITY_0;
+import static android.car.settings.CarSettings.Secure.KEY_BLUETOOTH_AUTOCONNECT_NETWORK_DEVICE_PRIORITY_1;
+import static android.car.settings.CarSettings.Secure.KEY_BLUETOOTH_AUTOCONNECT_PHONE_DEVICE_PRIORITY_0;
+import static android.car.settings.CarSettings.Secure.KEY_BLUETOOTH_AUTOCONNECT_PHONE_DEVICE_PRIORITY_1;
import android.app.ActivityManager;
import android.bluetooth.BluetoothDevice;
@@ -39,6 +31,8 @@
import android.car.ICarBluetooth;
import android.content.Context;
import android.content.pm.PackageManager;
+import android.os.Binder;
+import android.os.IBinder;
import android.provider.Settings;
import android.util.Log;
@@ -57,7 +51,7 @@
private static final String TAG = "CarBluetoothService";
private final Context mContext;
private final BluetoothDeviceConnectionPolicy mBluetoothDeviceConnectionPolicy;
- private static final boolean DBG = false;
+ private static final boolean DBG = Utils.DBG;
public CarBluetoothService(Context context, CarPropertyService carPropertyService,
PerUserCarServiceHelper userSwitchService, CarUxRestrictionsManagerService uxrService) {
@@ -158,6 +152,66 @@
}
/**
+ * Request to disconnect the given profile on the given device, and prevent it from reconnecting
+ * until either the request is released, or the process owning the given token dies.
+ *
+ * @param device The device on which to disconnect a profile.
+ * @param profile The {@link android.bluetooth.BluetoothProfile} to disconnect.
+ * @param token A {@link IBinder} to be used as an identity for the request. If the process
+ * owning the token dies, the request will automatically be released.
+ * @return True if the profile was successfully disconnected, false if an error occurred.
+ */
+ @Override
+ public boolean requestTemporaryDisconnect(BluetoothDevice device, int profile, IBinder token) {
+ if (DBG) {
+ Log.d(TAG, "requestTemporaryDisconnect device=" + device + " profile=" + profile
+ + " from uid " + Binder.getCallingUid());
+ }
+ try {
+ enforceBluetoothAdminPermission();
+ if (device == null) {
+ // Will be caught by AIDL and thrown to caller.
+ throw new NullPointerException("Null device in requestTemporaryDisconnect");
+ }
+ return mBluetoothDeviceConnectionPolicy
+ .requestProfileDisconnect(device, profile, token);
+ } catch (RuntimeException e) {
+ Log.e(TAG, "Error in requestTemporaryDisconnect", e);
+ throw e;
+ }
+ }
+
+ /**
+ * Undo a previous call to {@link #requestProfileDisconnect} with the same parameters,
+ * and reconnect the profile if no other requests are active.
+ *
+ * @param device The device on which to release the disconnect request.
+ * @param profile The profile on which to release the disconnect request.
+ * @param token The token provided in the original call to {@link #requestTemporaryDisconnect}.
+ *
+ * @return True if the request was released, false if an error occurred.
+ */
+ @Override
+ public boolean releaseTemporaryDisconnect(BluetoothDevice device, int profile, IBinder token) {
+ if (DBG) {
+ Log.d(TAG, "releaseTemporaryDisconnect device=" + device + " profile=" + profile
+ + " from uid " + Binder.getCallingUid());
+ }
+ try {
+ enforceBluetoothAdminPermission();
+ if (device == null) {
+ // Will be caught by AIDL and thrown to caller.
+ throw new NullPointerException("Null device in releaseTemporaryDisconnect");
+ }
+ return mBluetoothDeviceConnectionPolicy
+ .releaseProfileDisconnect(device, profile, token);
+ } catch (RuntimeException e) {
+ Log.e(TAG, "Error in releaseTemporaryDisconnect", e);
+ throw e;
+ }
+ }
+
+ /**
* Returns the Bluetooth device address as a String that has been tagged with the given priority
* for the given profile.
*
diff --git a/service/src/com/android/car/CarBluetoothUserService.java b/service/src/com/android/car/CarBluetoothUserService.java
index 1b94742..5a57f19 100644
--- a/service/src/com/android/car/CarBluetoothUserService.java
+++ b/service/src/com/android/car/CarBluetoothUserService.java
@@ -15,22 +15,20 @@
*/
package com.android.car;
-
-import android.bluetooth.BluetoothProfile;
import android.bluetooth.BluetoothA2dpSink;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothHeadsetClient;
import android.bluetooth.BluetoothMapClient;
-import android.bluetooth.BluetoothPbapClient;
import android.bluetooth.BluetoothPan;
+import android.bluetooth.BluetoothPbapClient;
+import android.bluetooth.BluetoothProfile;
import android.car.ICarBluetoothUserService;
import android.util.Log;
import java.util.Arrays;
import java.util.List;
-
public class CarBluetoothUserService extends ICarBluetoothUserService.Stub {
private static final boolean DBG = true;
private static final String TAG = "CarBluetoothUsrSvc";
@@ -147,8 +145,13 @@
Log.e(TAG, "Cannot connect to Profile. Proxy Unavailable");
return;
}
+ if (device == null) {
+ Log.e(TAG, "Cannot connect to profile on null device");
+ return;
+ }
if (DBG) {
- Log.d(TAG, "Trying to connect to " + device.getName() + " Profile: " + profile);
+ Log.d(TAG, "Trying to connect to " + device.getName() + " (" + device.getAddress()
+ + ") Profile: " + Utils.getProfileName(profile));
}
switch (profile) {
case BluetoothProfile.A2DP_SINK:
@@ -169,12 +172,93 @@
case BluetoothProfile.PAN:
mBluetoothPan.connect(device);
+ break;
default:
Log.d(TAG, "Unknown profile");
break;
}
- return;
+ }
+
+ @Override
+ public void bluetoothDisconnectFromProfile(int profile, BluetoothDevice device) {
+ if (!isBluetoothConnectionProxyAvailable(profile)) {
+ Log.e(TAG, "Cannot disconnect from profile. Proxy Unavailable");
+ return;
+ }
+ if (device == null) {
+ Log.e(TAG, "Cannot disconnect from profile on null device");
+ return;
+ }
+ if (DBG) {
+ Log.d(TAG, "Trying to disconnect from " + device.getName() + " (" + device.getAddress()
+ + ") Profile: " + Utils.getProfileName(profile));
+ }
+ switch (profile) {
+ case BluetoothProfile.A2DP_SINK:
+ mBluetoothA2dpSink.disconnect(device);
+ break;
+
+ case BluetoothProfile.HEADSET_CLIENT:
+ mBluetoothHeadsetClient.disconnect(device);
+ break;
+
+ case BluetoothProfile.MAP_CLIENT:
+ mBluetoothMapClient.disconnect(device);
+ break;
+
+ case BluetoothProfile.PBAP_CLIENT:
+ mBluetoothPbapClient.disconnect(device);
+ break;
+
+ case BluetoothProfile.PAN:
+ mBluetoothPan.disconnect(device);
+ break;
+
+ default:
+ Log.d(TAG, "Unknown profile");
+ break;
+ }
+ }
+
+ /**
+ * Get the priority of the given Bluetooth profile for the given remote device
+ * @param profile - Bluetooth profile
+ * @param device - remote Bluetooth device
+ */
+ @Override
+ public int getProfilePriority(int profile, BluetoothDevice device) {
+ if (!isBluetoothConnectionProxyAvailable(profile)) {
+ Log.e(TAG, "Cannot get profile priority. Proxy Unavailable");
+ return BluetoothProfile.PRIORITY_UNDEFINED;
+ }
+ if (device == null) {
+ Log.e(TAG, "Cannot get profile priority on null device");
+ return BluetoothProfile.PRIORITY_UNDEFINED;
+ }
+ int priority;
+ switch (profile) {
+ case BluetoothProfile.A2DP_SINK:
+ priority = mBluetoothA2dpSink.getPriority(device);
+ break;
+ case BluetoothProfile.HEADSET_CLIENT:
+ priority = mBluetoothHeadsetClient.getPriority(device);
+ break;
+ case BluetoothProfile.MAP_CLIENT:
+ priority = mBluetoothMapClient.getPriority(device);
+ break;
+ case BluetoothProfile.PBAP_CLIENT:
+ priority = mBluetoothPbapClient.getPriority(device);
+ break;
+ default:
+ Log.d(TAG, "Unknown Profile");
+ return BluetoothProfile.PRIORITY_UNDEFINED;
+ }
+ if (DBG) {
+ Log.d(TAG, Utils.getProfileName(profile) + " priority for " + device.getName() + " ("
+ + device.getAddress() + ") = " + priority);
+ }
+ return priority;
}
/**
@@ -186,9 +270,17 @@
@Override
public void setProfilePriority(int profile, BluetoothDevice device, int priority) {
if (!isBluetoothConnectionProxyAvailable(profile)) {
- Log.e(TAG, "Cannot connect to Profile. Proxy Unavailable");
+ Log.e(TAG, "Cannot set profile priority. Proxy Unavailable");
return;
}
+ if (device == null) {
+ Log.e(TAG, "Cannot set profile priority on null device");
+ return;
+ }
+ if (DBG) {
+ Log.d(TAG, "Setting " + Utils.getProfileName(profile) + " priority for "
+ + device.getName() + " (" + device.getAddress() + ") to " + priority);
+ }
switch (profile) {
case BluetoothProfile.A2DP_SINK:
mBluetoothA2dpSink.setPriority(device, priority);
diff --git a/service/src/com/android/car/CarInputService.java b/service/src/com/android/car/CarInputService.java
index 2b97221..ab3ca3a 100644
--- a/service/src/com/android/car/CarInputService.java
+++ b/service/src/com/android/car/CarInputService.java
@@ -16,8 +16,9 @@
package com.android.car;
import static android.hardware.input.InputManager.INJECT_INPUT_EVENT_MODE_ASYNC;
-import static android.service.voice.VoiceInteractionSession.SHOW_SOURCE_ASSIST_GESTURE;
+import static android.service.voice.VoiceInteractionSession.SHOW_SOURCE_PUSH_TO_TALK;
+import android.annotation.Nullable;
import android.app.ActivityManager;
import android.car.input.CarInputHandlingService;
import android.car.input.CarInputHandlingService.InputFilter;
@@ -30,10 +31,11 @@
import android.net.Uri;
import android.os.Binder;
import android.os.Bundle;
+import android.os.Handler;
import android.os.IBinder;
+import android.os.Looper;
import android.os.Parcel;
import android.os.RemoteException;
-import android.os.SystemClock;
import android.os.UserHandle;
import android.provider.CallLog.Calls;
import android.telecom.TelecomManager;
@@ -42,84 +44,126 @@
import android.view.KeyEvent;
import com.android.car.hal.InputHalService;
+import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.app.AssistUtils;
import com.android.internal.app.IVoiceInteractionSessionShowCallback;
import java.io.PrintWriter;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
+import java.util.function.Supplier;
public class CarInputService implements CarServiceBase, InputHalService.InputListener {
+ /** An interface to receive {@link KeyEvent}s as they occur. */
public interface KeyEventListener {
- boolean onKeyEvent(KeyEvent event);
+ /** Called when a key event occurs. */
+ void onKeyEvent(KeyEvent event);
}
private static final class KeyPressTimer {
- private static final long LONG_PRESS_TIME_MS = 1000;
-
+ private final Handler mHandler;
+ private final Runnable mLongPressRunnable;
+ private final Runnable mCallback = this::onTimerExpired;
+ @GuardedBy("this")
private boolean mDown = false;
- private long mDuration = -1;
+ @GuardedBy("this")
+ private boolean mLongPress = false;
+ KeyPressTimer(Handler handler, Runnable longPressRunnable) {
+ mHandler = handler;
+ mLongPressRunnable = longPressRunnable;
+ }
+
+ /** Marks that a key was pressed, and starts the long-press timer. */
synchronized void keyDown() {
mDown = true;
- mDuration = SystemClock.elapsedRealtime();
+ mLongPress = false;
+ mHandler.removeCallbacks(mCallback);
+ mHandler.postDelayed(mCallback, LONG_PRESS_TIME_MS);
}
- synchronized void keyUp() {
- if (!mDown) {
- throw new IllegalStateException("key can't go up without being down");
- }
- mDuration = SystemClock.elapsedRealtime() - mDuration;
+ /**
+ * Marks that a key was released, and stops the long-press timer.
+ *
+ * Returns true if the press was a long-press.
+ */
+ synchronized boolean keyUp() {
+ mHandler.removeCallbacks(mCallback);
mDown = false;
+ return mLongPress;
}
- synchronized boolean isLongPress() {
- if (mDown) {
- throw new IllegalStateException("can't query press length during key down");
+ private void onTimerExpired() {
+ synchronized (this) {
+ // If the timer expires after key-up, don't retroactively make the press long.
+ if (!mDown) {
+ return;
+ }
+ mLongPress = true;
}
- return mDuration >= LONG_PRESS_TIME_MS;
+
+ mLongPressRunnable.run();
}
}
- private IVoiceInteractionSessionShowCallback mShowCallback =
+ private final IVoiceInteractionSessionShowCallback mShowCallback =
new IVoiceInteractionSessionShowCallback.Stub() {
- @Override
- public void onFailed() {
- Log.w(CarLog.TAG_INPUT, "Failed to show VoiceInteractionSession");
- }
+ @Override
+ public void onFailed() {
+ Log.w(CarLog.TAG_INPUT, "Failed to show VoiceInteractionSession");
+ }
- @Override
- public void onShown() {
- if (DBG) {
- Log.d(CarLog.TAG_INPUT, "IVoiceInteractionSessionShowCallback onShown()");
- }
- }
- };
+ @Override
+ public void onShown() {
+ if (DBG) {
+ Log.d(CarLog.TAG_INPUT, "IVoiceInteractionSessionShowCallback onShown()");
+ }
+ }
+ };
private static final boolean DBG = false;
- private static final String EXTRA_CAR_PUSH_TO_TALK =
+ @VisibleForTesting
+ static final String EXTRA_CAR_PUSH_TO_TALK =
"com.android.car.input.EXTRA_CAR_PUSH_TO_TALK";
+ private static final int LONG_PRESS_TIME_MS = 1000;
+
private final Context mContext;
private final InputHalService mInputHalService;
private final TelecomManager mTelecomManager;
- private final InputManager mInputManager;
private final AssistUtils mAssistUtils;
+ // The ComponentName of the CarInputListener service. Can be changed via resource overlay,
+ // or overridden directly for testing.
+ @Nullable
+ private final ComponentName mCustomInputServiceComponent;
+ // The default handler for main-display input events. By default, injects the events into
+ // the input queue via InputManager, but can be overridden for testing.
+ private final KeyEventListener mMainDisplayHandler;
+ // The supplier for the last-called number. By default, gets the number from the call log.
+ // May be overridden for testing.
+ private final Supplier<String> mLastCalledNumberSupplier;
- private KeyEventListener mVoiceAssistantKeyListener;
- private KeyEventListener mLongVoiceAssistantKeyListener;
+ @GuardedBy("this")
+ private Runnable mVoiceAssistantKeyListener;
+ @GuardedBy("this")
+ private Runnable mLongVoiceAssistantKeyListener;
- private final KeyPressTimer mVoiceKeyTimer = new KeyPressTimer();
- private final KeyPressTimer mCallKeyTimer = new KeyPressTimer();
+ private final KeyPressTimer mVoiceKeyTimer;
+ private final KeyPressTimer mCallKeyTimer;
+ @GuardedBy("this")
private KeyEventListener mInstrumentClusterKeyListener;
- private ICarInputListener mCarInputListener;
+ @GuardedBy("this")
+ @VisibleForTesting
+ ICarInputListener mCarInputListener;
+
+ @GuardedBy("this")
private boolean mCarInputListenerBound = false;
- private final Map<Integer, Set<Integer>> mHandledKeys = new HashMap<>();
+
+ // Maps display -> keycodes handled.
+ @GuardedBy("this")
+ private final SetMultimap<Integer, Integer> mHandledKeys = new SetMultimap<>();
private final Binder mCallback = new Binder() {
@Override
@@ -144,14 +188,18 @@
Log.d(CarLog.TAG_INPUT, "onServiceConnected, name: "
+ name + ", binder: " + binder);
}
- mCarInputListener = ICarInputListener.Stub.asInterface(binder);
+ synchronized (this) {
+ mCarInputListener = ICarInputListener.Stub.asInterface(binder);
+ }
try {
binder.linkToDeath(() -> CarServiceUtils.runOnMainSync(() -> {
Log.w(CarLog.TAG_INPUT, "Input service died. Trying to rebind...");
- mCarInputListener = null;
- // Try to rebind with input service.
- mCarInputListenerBound = bindCarInputService();
+ synchronized (this) {
+ mCarInputListener = null;
+ // Try to rebind with input service.
+ mCarInputListenerBound = bindCarInputService();
+ }
}), 0);
} catch (RemoteException e) {
Log.e(CarLog.TAG_INPUT, e.getMessage(), e);
@@ -161,29 +209,56 @@
@Override
public void onServiceDisconnected(ComponentName name) {
Log.d(CarLog.TAG_INPUT, "onServiceDisconnected, name: " + name);
- mCarInputListener = null;
- // Try to rebind with input service.
- mCarInputListenerBound = bindCarInputService();
+ synchronized (this) {
+ mCarInputListener = null;
+ // Try to rebind with input service.
+ mCarInputListenerBound = bindCarInputService();
+ }
}
};
- public CarInputService(Context context, InputHalService inputHalService) {
- mContext = context;
- mInputHalService = inputHalService;
- mTelecomManager = context.getSystemService(TelecomManager.class);
- mInputManager = context.getSystemService(InputManager.class);
- mAssistUtils = new AssistUtils(context);
+ @Nullable
+ private static ComponentName getDefaultInputComponent(Context context) {
+ String carInputService = context.getString(R.string.inputService);
+ if (TextUtils.isEmpty(carInputService)) {
+ return null;
+ }
+
+ return ComponentName.unflattenFromString(carInputService);
}
- private synchronized void setHandledKeys(InputFilter[] handledKeys) {
+ public CarInputService(Context context, InputHalService inputHalService) {
+ this(context, inputHalService, new Handler(Looper.getMainLooper()),
+ context.getSystemService(TelecomManager.class), new AssistUtils(context),
+ event ->
+ context.getSystemService(InputManager.class)
+ .injectInputEvent(event, INJECT_INPUT_EVENT_MODE_ASYNC),
+ () -> Calls.getLastOutgoingCall(context),
+ getDefaultInputComponent(context));
+ }
+
+ @VisibleForTesting
+ CarInputService(Context context, InputHalService inputHalService, Handler handler,
+ TelecomManager telecomManager, AssistUtils assistUtils,
+ KeyEventListener mainDisplayHandler, Supplier<String> lastCalledNumberSupplier,
+ @Nullable ComponentName customInputServiceComponent) {
+ mContext = context;
+ mInputHalService = inputHalService;
+ mTelecomManager = telecomManager;
+ mAssistUtils = assistUtils;
+ mMainDisplayHandler = mainDisplayHandler;
+ mLastCalledNumberSupplier = lastCalledNumberSupplier;
+ mCustomInputServiceComponent = customInputServiceComponent;
+
+ mVoiceKeyTimer = new KeyPressTimer(handler, this::handleVoiceAssistLongPress);
+ mCallKeyTimer = new KeyPressTimer(handler, this::handleCallLongPress);
+ }
+
+ @VisibleForTesting
+ synchronized void setHandledKeys(InputFilter[] handledKeys) {
mHandledKeys.clear();
for (InputFilter handledKey : handledKeys) {
- Set<Integer> displaySet = mHandledKeys.get(handledKey.mTargetDisplay);
- if (displaySet == null) {
- displaySet = new HashSet<Integer>();
- mHandledKeys.put(handledKey.mTargetDisplay, displaySet);
- }
- displaySet.add(handledKey.mKeyCode);
+ mHandledKeys.put(handledKey.mTargetDisplay, handledKey.mKeyCode);
}
}
@@ -191,9 +266,8 @@
* Set listener for listening voice assistant key event. Setting to null stops listening.
* If listener is not set, default behavior will be done for short press.
* If listener is set, short key press will lead into calling the listener.
- * @param listener
*/
- public void setVoiceAssistantKeyListener(KeyEventListener listener) {
+ public void setVoiceAssistantKeyListener(Runnable listener) {
synchronized (this) {
mVoiceAssistantKeyListener = listener;
}
@@ -203,9 +277,8 @@
* Set listener for listening long voice assistant key event. Setting to null stops listening.
* If listener is not set, default behavior will be done for long press.
* If listener is set, short long press will lead into calling the listener.
- * @param listener
*/
- public void setLongVoiceAssistantKeyListener(KeyEventListener listener) {
+ public void setLongVoiceAssistantKeyListener(Runnable listener) {
synchronized (this) {
mLongVoiceAssistantKeyListener = listener;
}
@@ -228,7 +301,9 @@
mInputHalService.setInputListener(this);
- mCarInputListenerBound = bindCarInputService();
+ synchronized (this) {
+ mCarInputListenerBound = bindCarInputService();
+ }
}
@Override
@@ -247,9 +322,13 @@
@Override
public void onKeyEvent(KeyEvent event, int targetDisplay) {
// Give a car specific input listener the opportunity to intercept any input from the car
- if (mCarInputListener != null && isCustomEventHandler(event, targetDisplay)) {
+ ICarInputListener carInputListener;
+ synchronized (this) {
+ carInputListener = mCarInputListener;
+ }
+ if (carInputListener != null && isCustomEventHandler(event, targetDisplay)) {
try {
- mCarInputListener.onKeyEvent(event, targetDisplay);
+ carInputListener.onKeyEvent(event, targetDisplay);
} catch (RemoteException e) {
Log.e(CarLog.TAG_INPUT, "Error while calling car input service", e);
}
@@ -273,58 +352,79 @@
if (targetDisplay == InputHalService.DISPLAY_INSTRUMENT_CLUSTER) {
handleInstrumentClusterKey(event);
} else {
- handleMainDisplayKey(event);
+ mMainDisplayHandler.onKeyEvent(event);
}
}
private synchronized boolean isCustomEventHandler(KeyEvent event, int targetDisplay) {
- Set<Integer> displaySet = mHandledKeys.get(targetDisplay);
- if (displaySet == null) {
- return false;
- }
- return displaySet.contains(event.getKeyCode());
+ return mHandledKeys.containsEntry(targetDisplay, event.getKeyCode());
}
private void handleVoiceAssistKey(KeyEvent event) {
int action = event.getAction();
- if (action == KeyEvent.ACTION_DOWN) {
+ if (action == KeyEvent.ACTION_DOWN && event.getRepeatCount() == 0) {
mVoiceKeyTimer.keyDown();
} else if (action == KeyEvent.ACTION_UP) {
- mVoiceKeyTimer.keyUp();
- final KeyEventListener listener;
+ if (mVoiceKeyTimer.keyUp()) {
+ // Long press already handled by handleVoiceAssistLongPress(), nothing more to do.
+ return;
+ }
+ final Runnable listener;
synchronized (this) {
- listener = (mVoiceKeyTimer.isLongPress()
- ? mLongVoiceAssistantKeyListener : mVoiceAssistantKeyListener);
+ listener = mVoiceAssistantKeyListener;
}
if (listener != null) {
- listener.onKeyEvent(event);
+ listener.run();
} else {
launchDefaultVoiceAssistantHandler();
}
}
}
+ private void handleVoiceAssistLongPress() {
+ Runnable listener;
+
+ synchronized (this) {
+ listener = mLongVoiceAssistantKeyListener;
+ }
+
+ if (listener != null) {
+ listener.run();
+ } else {
+ launchDefaultVoiceAssistantHandler();
+ }
+ }
+
private void handleCallKey(KeyEvent event) {
int action = event.getAction();
- if (action == KeyEvent.ACTION_DOWN) {
+ if (action == KeyEvent.ACTION_DOWN && event.getRepeatCount() == 0) {
mCallKeyTimer.keyDown();
} else if (action == KeyEvent.ACTION_UP) {
- mCallKeyTimer.keyUp();
-
- // Handle a phone call regardless of press length.
- if (mTelecomManager != null && mTelecomManager.isRinging()) {
- Log.i(CarLog.TAG_INPUT, "call key while ringing. Answer the call!");
- mTelecomManager.acceptRingingCall();
- } else if (mCallKeyTimer.isLongPress()) {
- dialLastCallHandler();
- } else {
- launchDialerHandler();
+ if (mCallKeyTimer.keyUp()) {
+ // Long press already handled by handleCallLongPress(), nothing more to do.
+ return;
}
+
+ if (acceptCallIfRinging()) {
+ // Ringing call answered, nothing more to do.
+ return;
+ }
+
+ launchDialerHandler();
}
}
+ private void handleCallLongPress() {
+ // Long-press answers call if ringing, same as short-press.
+ if (acceptCallIfRinging()) {
+ return;
+ }
+
+ dialLastCallHandler();
+ }
+
private void launchDialerHandler() {
Log.i(CarLog.TAG_INPUT, "call key, launch dialer intent");
Intent dialerIntent = new Intent(Intent.ACTION_DIAL);
@@ -334,8 +434,8 @@
private void dialLastCallHandler() {
Log.i(CarLog.TAG_INPUT, "call key, dialing last call");
- String lastNumber = Calls.getLastOutgoingCall(mContext);
- if (lastNumber != null && !lastNumber.isEmpty()) {
+ String lastNumber = mLastCalledNumberSupplier.get();
+ if (!TextUtils.isEmpty(lastNumber)) {
Intent callLastNumberIntent = new Intent(Intent.ACTION_CALL)
.setData(Uri.fromParts("tel", lastNumber, null))
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
@@ -343,6 +443,16 @@
}
}
+ private boolean acceptCallIfRinging() {
+ if (mTelecomManager != null && mTelecomManager.isRinging()) {
+ Log.i(CarLog.TAG_INPUT, "call key while ringing. Answer the call!");
+ mTelecomManager.acceptRingingCall();
+ return true;
+ }
+
+ return false;
+ }
+
private void launchDefaultVoiceAssistantHandler() {
Log.i(CarLog.TAG_INPUT, "voice key, invoke AssistUtils");
@@ -355,7 +465,7 @@
args.putBoolean(EXTRA_CAR_PUSH_TO_TALK, true);
mAssistUtils.showSessionForActiveService(args,
- SHOW_SOURCE_ASSIST_GESTURE, mShowCallback, null /*activityToken*/);
+ SHOW_SOURCE_PUSH_TO_TALK, mShowCallback, null /*activityToken*/);
}
private void handleInstrumentClusterKey(KeyEvent event) {
@@ -369,31 +479,26 @@
listener.onKeyEvent(event);
}
- private void handleMainDisplayKey(KeyEvent event) {
- mInputManager.injectInputEvent(event, INJECT_INPUT_EVENT_MODE_ASYNC);
- }
-
@Override
- public void dump(PrintWriter writer) {
+ public synchronized void dump(PrintWriter writer) {
writer.println("*Input Service*");
writer.println("mCarInputListenerBound:" + mCarInputListenerBound);
writer.println("mCarInputListener:" + mCarInputListener);
}
private boolean bindCarInputService() {
- String carInputService = mContext.getString(R.string.inputService);
- if (TextUtils.isEmpty(carInputService)) {
+ if (mCustomInputServiceComponent == null) {
Log.i(CarLog.TAG_INPUT, "Custom input service was not configured");
return false;
}
- Log.d(CarLog.TAG_INPUT, "bindCarInputService, component: " + carInputService);
+ Log.d(CarLog.TAG_INPUT, "bindCarInputService, component: " + mCustomInputServiceComponent);
Intent intent = new Intent();
Bundle extras = new Bundle();
extras.putBinder(CarInputHandlingService.INPUT_CALLBACK_BINDER_KEY, mCallback);
intent.putExtras(extras);
- intent.setComponent(ComponentName.unflattenFromString(carInputService));
+ intent.setComponent(mCustomInputServiceComponent);
return mContext.bindService(intent, mInputServiceConnection, Context.BIND_AUTO_CREATE);
}
}
diff --git a/service/src/com/android/car/CarLocationService.java b/service/src/com/android/car/CarLocationService.java
index a7aaf03..c8543fa 100644
--- a/service/src/com/android/car/CarLocationService.java
+++ b/service/src/com/android/car/CarLocationService.java
@@ -16,20 +16,27 @@
package com.android.car;
+import android.car.Car;
+import android.car.CarNotConnectedException;
import android.car.hardware.CarPropertyValue;
+import android.car.hardware.power.CarPowerManager;
+import android.car.hardware.power.CarPowerManager.CarPowerStateListener;
import android.car.hardware.property.CarPropertyEvent;
import android.car.hardware.property.ICarPropertyEventListener;
-import android.car.user.CarUserManagerHelper;
+import android.car.userlib.CarUserManagerHelper;
import android.content.BroadcastReceiver;
+import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
+import android.content.ServiceConnection;
import android.hardware.automotive.vehicle.V2_0.VehicleIgnitionState;
import android.hardware.automotive.vehicle.V2_0.VehicleProperty;
import android.location.Location;
import android.location.LocationManager;
import android.os.Handler;
import android.os.HandlerThread;
+import android.os.IBinder;
import android.os.RemoteException;
import android.os.SystemClock;
import android.os.UserHandle;
@@ -48,13 +55,14 @@
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.List;
+import java.util.concurrent.CompletableFuture;
/**
* This service stores the last known location from {@link LocationManager} when a car is parked
* and restores the location when the car is powered on.
*/
-public class CarLocationService extends BroadcastReceiver implements CarServiceBase,
- CarPowerManagementService.PowerEventProcessingHandler {
+public class CarLocationService extends BroadcastReceiver implements
+ CarServiceBase, CarPowerStateListener {
private static final String TAG = "CarLocationService";
private static final String FILENAME = "location_cache.json";
private static final boolean DBG = false;
@@ -69,22 +77,57 @@
private final Object mLock = new Object();
private final Context mContext;
- private final CarPowerManagementService mCarPowerManagementService;
private final CarPropertyService mCarPropertyService;
private final CarPropertyEventListener mCarPropertyEventListener;
private final CarUserManagerHelper mCarUserManagerHelper;
+ private final Car mCar;
+ private final ServiceConnection mCarServiceConnection = new ServiceConnection() {
+ @Override
+ public void onServiceConnected(ComponentName name, IBinder service) {
+ try {
+ mCarPowerManager = (CarPowerManager) mCar.getCarManager(Car.POWER_SERVICE);
+ mCarPowerManager.setListener(CarLocationService.this);
+ } catch (CarNotConnectedException e) {
+ Log.e(TAG, "Failed to get CarPowerManager instance", e);
+ }
+ }
+
+ @Override
+ public void onServiceDisconnected(ComponentName name) {
+ if (mCarPowerManager != null) {
+ mCarPowerManager.clearListener();
+ }
+ }
+ };
+
private int mTaskCount = 0;
private HandlerThread mHandlerThread;
private Handler mHandler;
+ private CarPowerManager mCarPowerManager;
- public CarLocationService(Context context, CarPowerManagementService carPowerManagementService,
- CarPropertyService carPropertyService, CarUserManagerHelper carUserManagerHelper) {
+ public CarLocationService(
+ Context context,
+ CarPropertyService carPropertyService,
+ CarUserManagerHelper carUserManagerHelper) {
+ this(context, carPropertyService, carUserManagerHelper, null);
+ }
+
+ public CarLocationService(
+ Context context,
+ CarPropertyService carPropertyService,
+ CarUserManagerHelper carUserManagerHelper,
+ Car car) {
logd("constructed");
mContext = context;
- mCarPowerManagementService = carPowerManagementService;
mCarPropertyService = carPropertyService;
mCarPropertyEventListener = new CarPropertyEventListener();
mCarUserManagerHelper = carUserManagerHelper;
+ if (car != null) {
+ mCar = car;
+ } else {
+ mCar = Car.createCar(context, mCarServiceConnection);
+ mCar.connect();
+ }
}
@Override
@@ -96,16 +139,15 @@
filter.addAction(LocationManager.MODE_CHANGED_ACTION);
filter.addAction(LocationManager.GPS_ENABLED_CHANGE_ACTION);
mContext.registerReceiver(this, filter);
- mCarPropertyService.registerListener(VehicleProperty.IGNITION_STATE, 0,
- mCarPropertyEventListener);
- mCarPowerManagementService.registerPowerEventProcessingHandler(this);
+ mCarPropertyService.registerListener(
+ VehicleProperty.IGNITION_STATE, 0, mCarPropertyEventListener);
}
@Override
public void release() {
logd("release");
- mCarPropertyService.unregisterListener(VehicleProperty.IGNITION_STATE,
- mCarPropertyEventListener);
+ mCarPropertyService.unregisterListener(
+ VehicleProperty.IGNITION_STATE, mCarPropertyEventListener);
mContext.unregisterReceiver(this);
}
@@ -118,19 +160,32 @@
}
@Override
- public long onPrepareShutdown(boolean shuttingDown) {
- logd("onPrepareShutdown " + shuttingDown);
- asyncOperation(() -> storeLocation());
- return 100;
+ public void onStateChanged(int state) {
+ throw new UnsupportedOperationException(
+ "Should not be here. This API obsolete and is not used.");
}
@Override
- public void onPowerOn(boolean displayOn) {
- }
-
- @Override
- public int getWakeupTime() {
- return 0;
+ public void onStateChanged(int state, CompletableFuture<Void> future) {
+ logd("onStateChanged: " + state);
+ switch (state) {
+ case CarPowerStateListener.SHUTDOWN_PREPARE:
+ asyncOperation(() -> {
+ storeLocation();
+ // Notify the CarPowerManager that it may proceed to shutdown or suspend.
+ if (future != null) {
+ future.complete(null);
+ }
+ });
+ break;
+ default:
+ // This service does not need to do any work for these events but should still
+ // notify the CarPowerManager that it may proceed.
+ if (future != null) {
+ future.complete(null);
+ }
+ break;
+ }
}
@Override
diff --git a/service/src/com/android/car/CarPowerManagementService.java b/service/src/com/android/car/CarPowerManagementService.java
index 57ccf62..5c744eb 100644
--- a/service/src/com/android/car/CarPowerManagementService.java
+++ b/service/src/com/android/car/CarPowerManagementService.java
@@ -20,6 +20,7 @@
import android.car.hardware.power.ICarPower;
import android.car.hardware.power.ICarPowerStateListener;
import android.content.Context;
+import android.hardware.automotive.vehicle.V2_0.VehicleApPowerStateReq;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
@@ -42,76 +43,21 @@
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.CopyOnWriteArrayList;
-public class CarPowerManagementService extends ICarPower.Stub implements CarServiceBase,
- PowerHalService.PowerEventListener {
-
- /**
- * Listener for other services to monitor power events.
- */
- public interface PowerServiceEventListener {
- /**
- * Shutdown is happening
- */
- void onShutdown();
-
- /**
- * Entering deep sleep.
- */
- void onSleepEntry();
-
- /**
- * Got out of deep sleep.
- */
- void onSleepExit();
- }
-
- /**
- * Interface for components requiring processing time before shutting-down or
- * entering sleep, and wake-up after shut-down.
- */
- public interface PowerEventProcessingHandler {
- /**
- * Called before shutdown or sleep entry to allow running some processing. This call
- * should only queue such task in different thread and should return quickly.
- * Blocking inside this call can trigger watchdog timer which can terminate the
- * whole system.
- * @param shuttingDown whether system is shutting down or not (= sleep entry).
- * @return time necessary to run processing in ms. should return 0 if there is no
- * processing necessary.
- */
- long onPrepareShutdown(boolean shuttingDown);
-
- /**
- * Called when power state is changed to ON state. Display can be either on or off.
- * @param displayOn
- */
- void onPowerOn(boolean displayOn);
-
- /**
- * Returns wake up time after system is fully shutdown. Power controller will power on
- * the system after this time. This power on is meant for regular maintenance kind of
- * operation.
- * @return 0 of wake up is not necessary.
- */
- int getWakeupTime();
- }
-
+/**
+ * Power Management service class for cars. Controls the power states and interacts with other
+ * parts of the system to ensure its own state.
+ */
+public class CarPowerManagementService extends ICarPower.Stub implements
+ CarServiceBase, PowerHalService.PowerEventListener {
private final Context mContext;
private final PowerHalService mHal;
private final SystemInterface mSystemInterface;
-
- private final CopyOnWriteArrayList<PowerServiceEventListener> mListeners =
- new CopyOnWriteArrayList<>();
- private final CopyOnWriteArrayList<PowerEventProcessingHandlerWrapper>
- mPowerEventProcessingHandlers = new CopyOnWriteArrayList<>();
private final PowerManagerCallbackList mPowerManagerListeners = new PowerManagerCallbackList();
private final Map<IBinder, Integer> mPowerManagerListenerTokens = new ConcurrentHashMap<>();
- private int mTokenValue = 1;
@GuardedBy("this")
- private PowerState mCurrentState;
+ private CpmsState mCurrentState;
@GuardedBy("this")
private Timer mTimer;
@GuardedBy("this")
@@ -119,18 +65,21 @@
@GuardedBy("this")
private long mLastSleepEntryTime;
@GuardedBy("this")
- private final LinkedList<PowerState> mPendingPowerStates = new LinkedList<>();
+ private final LinkedList<CpmsState> mPendingPowerStates = new LinkedList<>();
@GuardedBy("this")
private HandlerThread mHandlerThread;
@GuardedBy("this")
private PowerHandler mHandler;
- private int mBootReason;
- private boolean mShutdownOnNextSuspend = false;
+ private int mNextWakeupSec = 0;
+ private int mTokenValue = 1;
+ private boolean mShutdownOnFinish = false;
// TODO: Make this OEM configurable.
- private final static int APP_EXTEND_MAX_MS = 10000;
- private final static int SHUTDOWN_POLLING_INTERVAL_MS = 2000;
- private final static int SHUTDOWN_EXTEND_MAX_MS = 5000;
+ private static final int SHUTDOWN_POLLING_INTERVAL_MS = 2000;
+ private static final int SHUTDOWN_EXTEND_MAX_MS = 5000;
+
+ // Use one hour for now
+ private static int sShutdownPrepareTimeMs = 60 * 60 * 1000;
private class PowerManagerCallbackList extends RemoteCallbackList<ICarPowerStateListener> {
/**
@@ -144,8 +93,8 @@
}
}
- public CarPowerManagementService(Context context, PowerHalService powerHal,
- SystemInterface systemInterface) {
+ public CarPowerManagementService(
+ Context context, PowerHalService powerHal, SystemInterface systemInterface) {
mContext = context;
mHal = powerHal;
mSystemInterface = systemInterface;
@@ -164,6 +113,16 @@
mHandler = new PowerHandler(Looper.getMainLooper());
}
+ @VisibleForTesting
+ protected static void setShutdownPrepareTimeout(int timeoutMs) {
+ // Override the timeout to keep testing time short
+ if (timeoutMs < SHUTDOWN_EXTEND_MAX_MS) {
+ sShutdownPrepareTimeMs = SHUTDOWN_EXTEND_MAX_MS;
+ } else {
+ sShutdownPrepareTimeMs = timeoutMs;
+ }
+ }
+
@Override
public void init() {
synchronized (this) {
@@ -174,18 +133,11 @@
mHal.setListener(this);
if (mHal.isPowerStateSupported()) {
- mHal.sendBootComplete();
- PowerState currentState = mHal.getCurrentPowerState();
- if (currentState != null) {
- onApPowerStateChange(currentState);
- } else {
- Log.w(CarLog.TAG_POWER, "Unable to get get current power state during "
- + "initialization");
- }
+ // Initialize CPMS in WAIT_FOR_VHAL state
+ onApPowerStateChange(CpmsState.WAIT_FOR_VHAL, CarPowerStateListener.WAIT_FOR_VHAL);
} else {
Log.w(CarLog.TAG_POWER, "Vehicle hal does not support power state yet.");
- onApPowerStateChange(new PowerState(PowerHalService.STATE_ON_FULL, 0));
- mSystemInterface.switchToFullWakeLock();
+ onApPowerStateChange(CpmsState.ON, CarPowerStateListener.ON);
}
mSystemInterface.startDisplayStateMonitoring(this);
}
@@ -206,116 +158,47 @@
Log.e(CarLog.TAG_POWER, "Timeout while joining for handler thread to join.");
}
mSystemInterface.stopDisplayStateMonitoring();
- mListeners.clear();
- mPowerEventProcessingHandlers.clear();
mPowerManagerListeners.kill();
mPowerManagerListenerTokens.clear();
mSystemInterface.releaseAllWakeLocks();
}
- /**
- * Register listener to monitor power event. There is no unregister counter-part and the list
- * will be cleared when the service is released.
- * @param listener
- */
- public synchronized void registerPowerEventListener(PowerServiceEventListener listener) {
- mListeners.add(listener);
- }
-
- /**
- * Register PowerEventPreprocessingHandler to run pre-processing before shutdown or
- * sleep entry. There is no unregister counter-part and the list
- * will be cleared when the service is released.
- * @param handler
- */
- public synchronized void registerPowerEventProcessingHandler(
- PowerEventProcessingHandler handler) {
- mPowerEventProcessingHandlers.add(new PowerEventProcessingHandlerWrapper(handler));
- // onPowerOn will not be called if power on notification is already done inside the
- // handler thread. So request it once again here. Wrapper will have its own
- // gatekeeping to prevent calling onPowerOn twice.
- mHandler.handlePowerOn();
- }
-
- /**
- * Notifies earlier completion of power event processing. PowerEventProcessingHandler quotes
- * time necessary from onPrePowerEvent() call, but actual processing can finish earlier than
- * that, and this call can be called in such case to trigger shutdown without waiting further.
- *
- * @param handler PowerEventProcessingHandler that was already registered with
- * {@link #registerPowerEventListener(PowerServiceEventListener)} call. If it was not
- * registered before, this call will be ignored.
- */
- public void notifyPowerEventProcessingCompletion(PowerEventProcessingHandler handler) {
- long processingTime = 0;
- for (PowerEventProcessingHandlerWrapper wrapper : mPowerEventProcessingHandlers) {
- if (wrapper.handler == handler) {
- wrapper.markProcessingDone();
- } else if (!wrapper.isProcessingDone()) {
- processingTime = Math.max(processingTime, wrapper.getProcessingTime());
- }
- }
- synchronized (mPowerManagerListenerTokens) {
- if (!mPowerManagerListenerTokens.isEmpty()) {
- processingTime += APP_EXTEND_MAX_MS;
- }
- }
- long now = SystemClock.elapsedRealtime();
- long startTime;
- boolean shouldShutdown = true;
- PowerHandler powerHandler;
- synchronized (this) {
- startTime = mProcessingStartTime;
- if (mCurrentState == null) {
- return;
- }
- if (mCurrentState.mState != PowerHalService.STATE_SHUTDOWN_PREPARE) {
- return;
- }
- if (mCurrentState.canEnterDeepSleep() && !mShutdownOnNextSuspend) {
- shouldShutdown = false;
- if (mLastSleepEntryTime > mProcessingStartTime && mLastSleepEntryTime < now) {
- // already slept
- return;
- }
- }
- powerHandler = mHandler;
- }
- if ((startTime + processingTime) <= now) {
- Log.i(CarLog.TAG_POWER, "Processing all done");
- powerHandler.handleProcessingComplete(shouldShutdown);
- }
- }
-
@Override
public void dump(PrintWriter writer) {
writer.println("*PowerManagementService*");
writer.print("mCurrentState:" + mCurrentState);
writer.print(",mProcessingStartTime:" + mProcessingStartTime);
- writer.println(",mLastSleepEntryTime:" + mLastSleepEntryTime);
- writer.println("**PowerEventProcessingHandlers");
- for (PowerEventProcessingHandlerWrapper wrapper : mPowerEventProcessingHandlers) {
- writer.println(wrapper.toString());
- }
- }
-
- @Override
- public void onBootReasonReceived(int bootReason) {
- mBootReason = bootReason;
+ writer.print(",mLastSleepEntryTime:" + mLastSleepEntryTime);
+ writer.print(",mNextWakeupSec:" + mNextWakeupSec);
+ writer.print(",mTokenValue:" + mTokenValue);
+ writer.println(",mShutdownOnFinish:" + mShutdownOnFinish);
}
@Override
public void onApPowerStateChange(PowerState state) {
PowerHandler handler;
synchronized (this) {
- mPendingPowerStates.addFirst(state);
+ mPendingPowerStates.addFirst(new CpmsState(state));
+ handler = mHandler;
+ }
+ handler.handlePowerStateChange();
+ }
+
+ /**
+ * Initiate state change from CPMS directly.
+ */
+ private void onApPowerStateChange(int apState, int carPowerStateListenerState) {
+ CpmsState newState = new CpmsState(apState, carPowerStateListenerState);
+ PowerHandler handler;
+ synchronized (this) {
+ mPendingPowerStates.addFirst(newState);
handler = mHandler;
}
handler.handlePowerStateChange();
}
private void doHandlePowerStateChange() {
- PowerState state = null;
+ CpmsState state;
PowerHandler handler;
synchronized (this) {
state = mPendingPowerStates.peekFirst();
@@ -323,7 +206,9 @@
if (state == null) {
return;
}
- if (!needPowerStateChange(state)) {
+ Log.i(CarLog.TAG_POWER, "doHandlePowerStateChange: newState=" + state.mState);
+ if (!needPowerStateChangeLocked(state)) {
+ Log.d(CarLog.TAG_POWER, "doHandlePowerStateChange no change needed");
return;
}
// now real power change happens. Whatever was queued before should be all cancelled.
@@ -331,73 +216,97 @@
handler = mHandler;
}
handler.cancelProcessingComplete();
-
- Log.i(CarLog.TAG_POWER, "Power state change:" + state);
+ Log.i(CarLog.TAG_POWER, "setCurrentState " + state.toString());
+ mCurrentState = state;
switch (state.mState) {
- case PowerHalService.STATE_ON_DISP_OFF:
- handleDisplayOff(state);
- notifyPowerOn(false);
+ case CpmsState.WAIT_FOR_VHAL:
+ handleWaitForVhal(state);
break;
- case PowerHalService.STATE_ON_FULL:
- handleFullOn(state);
- notifyPowerOn(true);
+ case CpmsState.ON:
+ handleOn();
break;
- case PowerHalService.STATE_SHUTDOWN_PREPARE:
+ case CpmsState.SHUTDOWN_PREPARE:
handleShutdownPrepare(state);
break;
+ case CpmsState.WAIT_FOR_FINISH:
+ handleWaitForFinish(state);
+ break;
+ case CpmsState.SUSPEND:
+ // Received FINISH from VHAL
+ handleFinish();
+ break;
+ default:
+ // Illegal state
+ // TODO: Throw exception?
+ break;
}
}
- private void handleDisplayOff(PowerState newState) {
- setCurrentState(newState);
- mSystemInterface.setDisplayState(false);
+ private void handleWaitForVhal(CpmsState state) {
+ int carPowerStateListenerState = state.mCarPowerStateListenerState;
+ sendPowerManagerEvent(carPowerStateListenerState, false);
+ // Inspect CarPowerStateListenerState to decide which message to send via VHAL
+ switch (carPowerStateListenerState) {
+ case CarPowerStateListener.WAIT_FOR_VHAL:
+ mHal.sendWaitForVhal();
+ break;
+ case CarPowerStateListener.SHUTDOWN_CANCELLED:
+ mHal.sendShutdownCancel();
+ break;
+ case CarPowerStateListener.SUSPEND_EXIT:
+ mHal.sendSleepExit();
+ break;
+ }
}
- private void handleFullOn(PowerState newState) {
- setCurrentState(newState);
+ private void handleOn() {
mSystemInterface.setDisplayState(true);
+ sendPowerManagerEvent(CarPowerStateListener.ON, false);
+ mHal.sendOn();
}
- @VisibleForTesting
- protected void notifyPowerOn(boolean displayOn) {
- for (PowerEventProcessingHandlerWrapper wrapper : mPowerEventProcessingHandlers) {
- wrapper.callOnPowerOn(displayOn);
- }
- }
-
- @VisibleForTesting
- protected long notifyPrepareShutdown(boolean shuttingDown) {
- long processingTimeMs = 0;
- for (PowerEventProcessingHandlerWrapper wrapper : mPowerEventProcessingHandlers) {
- long handlerProcessingTime = wrapper.handler.onPrepareShutdown(shuttingDown);
- if (handlerProcessingTime > processingTimeMs) {
- processingTimeMs = handlerProcessingTime;
- }
- }
- // Add time for powerManager events
- processingTimeMs += sendPowerManagerEvent(shuttingDown);
- return processingTimeMs;
- }
-
- private void handleShutdownPrepare(PowerState newState) {
- setCurrentState(newState);
- mSystemInterface.setDisplayState(false);;
- boolean shouldShutdown = true;
- if (mHal.isDeepSleepAllowed() && mSystemInterface.isSystemSupportingDeepSleep() &&
- newState.canEnterDeepSleep() && !mShutdownOnNextSuspend) {
- Log.i(CarLog.TAG_POWER, "starting sleep");
- shouldShutdown = false;
- doHandlePreprocessing(shouldShutdown);
- return;
- } else if (newState.canPostponeShutdown()) {
- Log.i(CarLog.TAG_POWER, "starting shutdown with processing");
- doHandlePreprocessing(shouldShutdown);
+ private void handleShutdownPrepare(CpmsState newState) {
+ mSystemInterface.setDisplayState(false);
+ // Shutdown on finish if the system doesn't support deep sleep or doesn't allow it.
+ mShutdownOnFinish |= !mHal.isDeepSleepAllowed()
+ || !mSystemInterface.isSystemSupportingDeepSleep()
+ || !newState.mCanSleep;
+ if (newState.mCanPostpone) {
+ Log.i(CarLog.TAG_POWER, "starting shutdown postpone");
+ sendPowerManagerEvent(CarPowerStateListener.SHUTDOWN_PREPARE, true);
+ mHal.sendShutdownPrepare();
+ doHandlePreprocessing();
} else {
Log.i(CarLog.TAG_POWER, "starting shutdown immediately");
synchronized (this) {
releaseTimerLocked();
}
- doHandleShutdown();
+ // Notify hal that we are shutting down and since it is immediate, don't schedule next
+ // wake up
+ mHal.sendShutdownStart(0);
+ // shutdown HU
+ mSystemInterface.shutdown();
+ }
+ }
+
+ private void handleWaitForFinish(CpmsState state) {
+ sendPowerManagerEvent(state.mCarPowerStateListenerState, false);
+ switch (state.mCarPowerStateListenerState) {
+ case CarPowerStateListener.SUSPEND_ENTER:
+ mHal.sendSleepEntry(mNextWakeupSec);
+ break;
+ case CarPowerStateListener.SHUTDOWN_ENTER:
+ mHal.sendShutdownStart(mNextWakeupSec);
+ break;
+ }
+ }
+
+ private void handleFinish() {
+ if (mShutdownOnFinish) {
+ // shutdown HU
+ mSystemInterface.shutdown();
+ } else {
+ doHandleDeepSleep();
}
}
@@ -409,66 +318,45 @@
mTimer = null;
}
- private void doHandlePreprocessing(boolean shuttingDown) {
- long processingTimeMs = 0;
- for (PowerEventProcessingHandlerWrapper wrapper : mPowerEventProcessingHandlers) {
- long handlerProcessingTime = wrapper.handler.onPrepareShutdown(shuttingDown);
- if (handlerProcessingTime > 0) {
- wrapper.setProcessingTimeAndResetProcessingDone(handlerProcessingTime);
- }
- if (handlerProcessingTime > processingTimeMs) {
- processingTimeMs = handlerProcessingTime;
- }
- }
- // Add time for powerManager events
- processingTimeMs += sendPowerManagerEvent(shuttingDown);
- if (processingTimeMs > 0) {
- int pollingCount = (int)(processingTimeMs / SHUTDOWN_POLLING_INTERVAL_MS) + 1;
- Log.i(CarLog.TAG_POWER, "processing before shutdown expected for :" + processingTimeMs +
- " ms, adding polling:" + pollingCount);
- synchronized (this) {
- mProcessingStartTime = SystemClock.elapsedRealtime();
- releaseTimerLocked();
- mTimer = new Timer();
- mTimer.scheduleAtFixedRate(new ShutdownProcessingTimerTask(shuttingDown,
- pollingCount),
- 0 /*delay*/,
- SHUTDOWN_POLLING_INTERVAL_MS);
- }
- } else {
- PowerHandler handler;
- synchronized (this) {
- handler = mHandler;
- }
- handler.handleProcessingComplete(shuttingDown);
+ private void doHandlePreprocessing() {
+ int pollingCount = (sShutdownPrepareTimeMs / SHUTDOWN_POLLING_INTERVAL_MS) + 1;
+ Log.i(CarLog.TAG_POWER, "processing before shutdown expected for: "
+ + sShutdownPrepareTimeMs + " ms, adding polling:" + pollingCount);
+ synchronized (this) {
+ mProcessingStartTime = SystemClock.elapsedRealtime();
+ releaseTimerLocked();
+ mTimer = new Timer();
+ mTimer.scheduleAtFixedRate(
+ new ShutdownProcessingTimerTask(pollingCount),
+ 0 /*delay*/,
+ SHUTDOWN_POLLING_INTERVAL_MS);
}
}
- private long sendPowerManagerEvent(boolean shuttingDown) {
- long processingTimeMs = 0;
- int newState = shuttingDown ? CarPowerStateListener.SHUTDOWN_ENTER :
- CarPowerStateListener.SUSPEND_ENTER;
+ private void sendPowerManagerEvent(int newState, boolean useTokens) {
synchronized (mPowerManagerListenerTokens) {
- mPowerManagerListenerTokens.clear();
+ if (useTokens) {
+ mPowerManagerListenerTokens.clear();
+ }
int i = mPowerManagerListeners.beginBroadcast();
while (i-- > 0) {
try {
+ int token = 0;
ICarPowerStateListener listener = mPowerManagerListeners.getBroadcastItem(i);
- listener.onStateChanged(newState, mTokenValue);
- mPowerManagerListenerTokens.put(listener.asBinder(), mTokenValue);
- mTokenValue++;
+ if (useTokens) {
+ mPowerManagerListenerTokens.put(listener.asBinder(), mTokenValue);
+ listener.onStateChanged(newState, mTokenValue);
+ mTokenValue++;
+ } else {
+ listener.onStateChanged(newState, 0);
+ }
} catch (RemoteException e) {
// Its likely the connection snapped. Let binder death handle the situation.
Log.e(CarLog.TAG_POWER, "onStateChanged calling failed: " + e);
}
}
mPowerManagerListeners.finishBroadcast();
- if (!mPowerManagerListenerTokens.isEmpty()) {
- Log.i(CarLog.TAG_POWER, "mPowerMangerListenerTokens not empty, add APP_EXTEND_MAX_MS");
- processingTimeMs += APP_EXTEND_MAX_MS;
- }
}
- return processingTimeMs;
}
private void doHandleDeepSleep() {
@@ -480,114 +368,66 @@
handler = mHandler;
}
handler.cancelProcessingComplete();
- for (PowerServiceEventListener listener : mListeners) {
- listener.onSleepEntry();
- }
- int wakeupTimeSec = getWakeupTime();
- mHal.sendSleepEntry();
synchronized (this) {
mLastSleepEntryTime = SystemClock.elapsedRealtime();
}
- if (mSystemInterface.enterDeepSleep(wakeupTimeSec) == false) {
- // System did not suspend. Need to shutdown
- // TODO: Shutdown gracefully
+ if (!mSystemInterface.enterDeepSleep()) {
+ // System did not suspend. VHAL should transition CPMS to shutdown.
Log.e(CarLog.TAG_POWER, "Sleep did not succeed. Need to shutdown");
}
- mHal.sendSleepExit();
- for (PowerServiceEventListener listener : mListeners) {
- listener.onSleepExit();
- }
- // Notify applications
- int i = mPowerManagerListeners.beginBroadcast();
- while (i-- > 0) {
- try {
- ICarPowerStateListener listener = mPowerManagerListeners.getBroadcastItem(i);
- listener.onStateChanged(CarPowerStateListener.SUSPEND_EXIT, 0);
- } catch (RemoteException e) {
- // Its likely the connection snapped. Let binder death handle the situation.
- Log.e(CarLog.TAG_POWER, "onStateChanged calling failed: " + e);
- }
- }
- mPowerManagerListeners.finishBroadcast();
-
- if (mSystemInterface.isWakeupCausedByTimer()) {
- doHandlePreprocessing(false /*shuttingDown*/);
- } else {
- PowerState currentState = mHal.getCurrentPowerState();
- if (currentState != null && needPowerStateChange(currentState)) {
- onApPowerStateChange(currentState);
- } else { // power controller woke-up but no power state change. Just shutdown.
- Log.w(CarLog.TAG_POWER, "external sleep wake up, but no power state change:" +
- currentState);
- doHandleShutdown();
- }
- }
+ // On wake, reset nextWakeup time. If not set again, system will suspend/shutdown forever.
+ mNextWakeupSec = 0;
+ mSystemInterface.refreshDisplayBrightness();
+ onApPowerStateChange(CpmsState.WAIT_FOR_VHAL, CarPowerStateListener.SUSPEND_EXIT);
}
- private void doHandleNotifyPowerOn() {
- boolean displayOn = false;
- synchronized (this) {
- if (mCurrentState != null && mCurrentState.mState == PowerHalService.STATE_ON_FULL) {
- displayOn = true;
- }
- }
- for (PowerEventProcessingHandlerWrapper wrapper : mPowerEventProcessingHandlers) {
- // wrapper will not send it forward if it is already called.
- wrapper.callOnPowerOn(displayOn);
- }
- }
-
- private boolean needPowerStateChange(PowerState newState) {
- synchronized (this) {
- if (mCurrentState != null && mCurrentState.equals(newState)) {
- return false;
- }
+ private boolean needPowerStateChangeLocked(CpmsState newState) {
+ if (newState == null) {
+ return false;
+ } else if (mCurrentState == null) {
return true;
+ } else if (mCurrentState.equals(newState)) {
+ return false;
+ }
+
+ // The following switch/case enforces the allowed state transitions.
+ switch (mCurrentState.mState) {
+ case CpmsState.WAIT_FOR_VHAL:
+ return (newState.mState == CpmsState.ON)
+ || (newState.mState == CpmsState.SHUTDOWN_PREPARE);
+ case CpmsState.SUSPEND:
+ return newState.mState == CpmsState.WAIT_FOR_VHAL;
+ case CpmsState.ON:
+ return newState.mState == CpmsState.SHUTDOWN_PREPARE;
+ case CpmsState.SHUTDOWN_PREPARE:
+ // If VHAL sends SHUTDOWN_IMMEDIATELY while in SHUTDOWN_PREPARE state, do it.
+ return ((newState.mState == CpmsState.SHUTDOWN_PREPARE) && !newState.mCanPostpone)
+ || (newState.mState == CpmsState.WAIT_FOR_FINISH)
+ || (newState.mState == CpmsState.WAIT_FOR_VHAL);
+ case CpmsState.WAIT_FOR_FINISH:
+ return newState.mState == CpmsState.SUSPEND;
+ default:
+ Log.e(CarLog.TAG_POWER, "Unhandled state transition: currentState="
+ + mCurrentState.mState + ", newState=" + newState.mState);
+ return false;
}
}
- private void doHandleShutdown() {
- // now shutdown
- for (PowerServiceEventListener listener : mListeners) {
- listener.onShutdown();
- }
- int wakeupTimeSec = 0;
- if (mHal.isTimedWakeupAllowed()) {
- wakeupTimeSec = getWakeupTime();
- }
- mHal.sendShutdownStart(wakeupTimeSec);
- mSystemInterface.shutdown();
- }
-
- private int getWakeupTime() {
- int wakeupTimeSec = 0;
- for (PowerEventProcessingHandlerWrapper wrapper : mPowerEventProcessingHandlers) {
- int t = wrapper.handler.getWakeupTime();
- if (t > wakeupTimeSec) {
- wakeupTimeSec = t;
- }
- }
- return wakeupTimeSec;
- }
-
- private void doHandleProcessingComplete(boolean shutdownWhenCompleted) {
+ private void doHandleProcessingComplete() {
synchronized (this) {
releaseTimerLocked();
- if (!shutdownWhenCompleted && mLastSleepEntryTime > mProcessingStartTime) {
+ if (!mShutdownOnFinish && mLastSleepEntryTime > mProcessingStartTime) {
// entered sleep after processing start. So this could be duplicate request.
Log.w(CarLog.TAG_POWER, "Duplicate sleep entry request, ignore");
return;
}
}
- if (shutdownWhenCompleted) {
- doHandleShutdown();
- } else {
- doHandleDeepSleep();
- }
- }
- private synchronized void setCurrentState(PowerState state) {
- mCurrentState = state;
+ if (mShutdownOnFinish) {
+ onApPowerStateChange(CpmsState.WAIT_FOR_FINISH, CarPowerStateListener.SHUTDOWN_ENTER);
+ } else {
+ onApPowerStateChange(CpmsState.WAIT_FOR_FINISH, CarPowerStateListener.SUSPEND_ENTER);
+ }
}
@Override
@@ -632,6 +472,8 @@
public void registerListener(ICarPowerStateListener listener) {
ICarImpl.assertPermission(mContext, Car.PERMISSION_CAR_POWER);
mPowerManagerListeners.register(listener);
+ // TODO: Need to send current state to newly registered listener? If so, need to handle
+ // token for SHUTDOWN_PREPARE state
}
@Override
@@ -642,7 +484,6 @@
private void doUnregisterListener(ICarPowerStateListener listener) {
boolean found = mPowerManagerListeners.unregister(listener);
-
if (found) {
// Remove outstanding token if there is one
IBinder binder = listener.asBinder();
@@ -658,14 +499,7 @@
@Override
public void requestShutdownOnNextSuspend() {
ICarImpl.assertPermission(mContext, Car.PERMISSION_CAR_POWER);
- mShutdownOnNextSuspend = true;
- }
-
- @Override
- public int getBootReason() {
- ICarImpl.assertPermission(mContext, Car.PERMISSION_CAR_POWER);
- // Return the most recent bootReason value
- return mBootReason;
+ mShutdownOnFinish = true;
}
@Override
@@ -676,26 +510,54 @@
}
}
+ @Override
+ public synchronized void scheduleNextWakeupTime(int seconds) {
+ if (seconds < 0) {
+ Log.w(CarLog.TAG_POWER, "Next wake up can not be in negative time. Ignoring!");
+ return;
+ }
+ if (!mHal.isTimedWakeupAllowed()) {
+ Log.w(CarLog.TAG_POWER, "Setting timed wakeups are disabled in HAL. Skipping");
+ mNextWakeupSec = 0;
+ return;
+ }
+ if (mNextWakeupSec == 0 || mNextWakeupSec > seconds) {
+ mNextWakeupSec = seconds;
+ } else {
+ Log.d(CarLog.TAG_POWER, "Tried to schedule next wake up, but already had shorter "
+ + " scheduled time");
+ }
+ }
+
private void finishedLocked(IBinder binder, int token) {
int currentToken = mPowerManagerListenerTokens.get(binder);
if (currentToken == token) {
mPowerManagerListenerTokens.remove(binder);
if (mPowerManagerListenerTokens.isEmpty() &&
- (mCurrentState.mState == PowerHalService.STATE_SHUTDOWN_PREPARE)) {
+ (mCurrentState.mState == CpmsState.SHUTDOWN_PREPARE)) {
+ PowerHandler powerHandler;
// All apps are ready to shutdown/suspend.
- Log.i(CarLog.TAG_POWER, "Apps are finished, call notifyPowerEventProcessingCompletion");
- notifyPowerEventProcessingCompletion(null);
+ synchronized (this) {
+ if (!mShutdownOnFinish) {
+ if (mLastSleepEntryTime > mProcessingStartTime
+ && mLastSleepEntryTime < SystemClock.elapsedRealtime()) {
+ Log.i(CarLog.TAG_POWER, "finishedLocked: Already slept!");
+ return;
+ }
+ }
+ powerHandler = mHandler;
+ }
+ Log.i(CarLog.TAG_POWER, "Apps are finished, call handleProcessingComplete()");
+ powerHandler.handleProcessingComplete();
}
}
}
private class PowerHandler extends Handler {
-
private final int MSG_POWER_STATE_CHANGE = 0;
private final int MSG_DISPLAY_BRIGHTNESS_CHANGE = 1;
private final int MSG_MAIN_DISPLAY_STATE_CHANGE = 2;
private final int MSG_PROCESSING_COMPLETE = 3;
- private final int MSG_NOTIFY_POWER_ON = 4;
// Do not handle this immediately but with some delay as there can be a race between
// display off due to rear view camera and delivery to here.
@@ -721,14 +583,9 @@
sendMessageDelayed(msg, MAIN_DISPLAY_EVENT_DELAY_MS);
}
- private void handleProcessingComplete(boolean shutdownWhenCompleted) {
+ private void handleProcessingComplete() {
removeMessages(MSG_PROCESSING_COMPLETE);
- Message msg = obtainMessage(MSG_PROCESSING_COMPLETE, shutdownWhenCompleted ? 1 : 0, 0);
- sendMessage(msg);
- }
-
- private void handlePowerOn() {
- Message msg = obtainMessage(MSG_NOTIFY_POWER_ON);
+ Message msg = obtainMessage(MSG_PROCESSING_COMPLETE);
sendMessage(msg);
}
@@ -741,7 +598,6 @@
removeMessages(MSG_DISPLAY_BRIGHTNESS_CHANGE);
removeMessages(MSG_MAIN_DISPLAY_STATE_CHANGE);
removeMessages(MSG_PROCESSING_COMPLETE);
- removeMessages(MSG_NOTIFY_POWER_ON);
}
@Override
@@ -757,22 +613,17 @@
doHandleMainDisplayStateChange((Boolean) msg.obj);
break;
case MSG_PROCESSING_COMPLETE:
- doHandleProcessingComplete(msg.arg1 == 1);
- break;
- case MSG_NOTIFY_POWER_ON:
- doHandleNotifyPowerOn();
+ doHandleProcessingComplete();
break;
}
}
}
private class ShutdownProcessingTimerTask extends TimerTask {
- private final boolean mShutdownWhenCompleted;
private final int mExpirationCount;
private int mCurrentCount;
- private ShutdownProcessingTimerTask(boolean shutdownWhenCompleted, int expirationCount) {
- mShutdownWhenCompleted = shutdownWhenCompleted;
+ private ShutdownProcessingTimerTask(int expirationCount) {
mExpirationCount = expirationCount;
mCurrentCount = 0;
}
@@ -786,60 +637,124 @@
releaseTimerLocked();
handler = mHandler;
}
- handler.handleProcessingComplete(mShutdownWhenCompleted);
+ handler.handleProcessingComplete();
} else {
mHal.sendShutdownPostpone(SHUTDOWN_EXTEND_MAX_MS);
}
}
}
- private static class PowerEventProcessingHandlerWrapper {
- public final PowerEventProcessingHandler handler;
- private long mProcessingTime = 0;
- private boolean mProcessingDone = true;
- private boolean mPowerOnSent = false;
- private int mLastDisplayState = -1;
+ private static class CpmsState {
+ public static final int WAIT_FOR_VHAL = 0;
+ public static final int ON = 1;
+ public static final int SHUTDOWN_PREPARE = 2;
+ public static final int WAIT_FOR_FINISH = 3;
+ public static final int SUSPEND = 4;
- public PowerEventProcessingHandlerWrapper(PowerEventProcessingHandler handler) {
- this.handler = handler;
- }
+ /* Config values from AP_POWER_STATE_REQ */
+ public final boolean mCanPostpone;
+ public final boolean mCanSleep;
+ /* Message sent to CarPowerStateListener in response to this state */
+ public final int mCarPowerStateListenerState;
+ /* One of the above state variables */
+ public final int mState;
- public synchronized void setProcessingTimeAndResetProcessingDone(long processingTime) {
- mProcessingTime = processingTime;
- mProcessingDone = false;
- }
-
- public synchronized long getProcessingTime() {
- return mProcessingTime;
- }
-
- public synchronized void markProcessingDone() {
- mProcessingDone = true;
- }
-
- public synchronized boolean isProcessingDone() {
- return mProcessingDone;
- }
-
- public void callOnPowerOn(boolean displayOn) {
- int newDisplayState = displayOn ? 1 : 0;
- boolean shouldCall = false;
- synchronized (this) {
- if (!mPowerOnSent || (mLastDisplayState != newDisplayState)) {
- shouldCall = true;
- mPowerOnSent = true;
- mLastDisplayState = newDisplayState;
- }
+ /**
+ * This constructor takes a PowerHalService.PowerState object and creates the corresponding
+ * CPMS state from it.
+ */
+ CpmsState(PowerState halPowerState) {
+ switch (halPowerState.mState) {
+ case VehicleApPowerStateReq.ON:
+ this.mCanPostpone = false;
+ this.mCanSleep = false;
+ this.mCarPowerStateListenerState = cpmsStateToPowerStateListenerState(ON);
+ this.mState = ON;
+ break;
+ case VehicleApPowerStateReq.SHUTDOWN_PREPARE:
+ this.mCanPostpone = halPowerState.canPostponeShutdown();
+ this.mCanSleep = halPowerState.canEnterDeepSleep();
+ this.mCarPowerStateListenerState = cpmsStateToPowerStateListenerState(
+ SHUTDOWN_PREPARE);
+ this.mState = SHUTDOWN_PREPARE;
+ break;
+ case VehicleApPowerStateReq.CANCEL_SHUTDOWN:
+ this.mCanPostpone = false;
+ this.mCanSleep = false;
+ this.mCarPowerStateListenerState = CarPowerStateListener.SHUTDOWN_CANCELLED;
+ this.mState = WAIT_FOR_VHAL;
+ break;
+ case VehicleApPowerStateReq.FINISHED:
+ this.mCanPostpone = false;
+ this.mCanSleep = false;
+ this.mCarPowerStateListenerState = cpmsStateToPowerStateListenerState(SUSPEND);
+ this.mState = SUSPEND;
+ break;
+ default:
+ // Illegal state from PowerState. Throw an exception?
+ this.mCanPostpone = false;
+ this.mCanSleep = false;
+ this.mCarPowerStateListenerState = 0;
+ this.mState = 0;
+ break;
}
- if (shouldCall) {
- handler.onPowerOn(displayOn);
+ }
+
+ CpmsState(int state) {
+ this(state, cpmsStateToPowerStateListenerState(state));
+ }
+
+ CpmsState(int state, int carPowerStateListenerState) {
+ this.mCanPostpone = false;
+ this.mCanSleep = false;
+ this.mCarPowerStateListenerState = carPowerStateListenerState;
+ this.mState = state;
+ }
+
+ private static int cpmsStateToPowerStateListenerState(int state) {
+ int powerStateListenerState = 0;
+
+ // Set the CarPowerStateListenerState based on current state
+ switch (state) {
+ case ON:
+ powerStateListenerState = CarPowerStateListener.ON;
+ break;
+ case SHUTDOWN_PREPARE:
+ powerStateListenerState = CarPowerStateListener.SHUTDOWN_PREPARE;
+ break;
+ case SUSPEND:
+ powerStateListenerState = CarPowerStateListener.SUSPEND_ENTER;
+ break;
+ case WAIT_FOR_VHAL:
+ case WAIT_FOR_FINISH:
+ default:
+ // Illegal state for this constructor. Throw an exception?
+ break;
}
+ return powerStateListenerState;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (!(o instanceof CpmsState)) {
+ return false;
+ }
+ CpmsState that = (CpmsState) o;
+ return this.mState == that.mState
+ && this.mCanSleep == that.mCanSleep
+ && this.mCanPostpone == that.mCanPostpone
+ && this.mCarPowerStateListenerState == that.mCarPowerStateListenerState;
}
@Override
public String toString() {
- return "PowerEventProcessingHandlerWrapper [handler=" + handler + ", mProcessingTime="
- + mProcessingTime + ", mProcessingDone=" + mProcessingDone + "]";
+ return "CpmsState canSleep:" + mCanSleep + ", canPostpone=" + mCanPostpone
+ + ", carPowerStateListenerState=" + mCarPowerStateListenerState
+ + ", CpmsState=" + mState;
}
}
+
}
diff --git a/service/src/com/android/car/CarProjectionService.java b/service/src/com/android/car/CarProjectionService.java
index 5eb453f..d673eab 100644
--- a/service/src/com/android/car/CarProjectionService.java
+++ b/service/src/com/android/car/CarProjectionService.java
@@ -15,21 +15,57 @@
*/
package com.android.car;
+import static android.car.CarProjectionManager.PROJECTION_LONG_PRESS_VOICE_SEARCH;
+import static android.car.CarProjectionManager.PROJECTION_VOICE_SEARCH;
+import static android.car.CarProjectionManager.ProjectionAccessPointCallback.ERROR_GENERIC;
+import static android.net.wifi.WifiManager.EXTRA_PREVIOUS_WIFI_AP_STATE;
+import static android.net.wifi.WifiManager.EXTRA_WIFI_AP_FAILURE_REASON;
+import static android.net.wifi.WifiManager.EXTRA_WIFI_AP_INTERFACE_NAME;
+import static android.net.wifi.WifiManager.EXTRA_WIFI_AP_MODE;
+import static android.net.wifi.WifiManager.EXTRA_WIFI_AP_STATE;
+import static android.net.wifi.WifiManager.WIFI_AP_STATE_DISABLED;
+import static android.net.wifi.WifiManager.WIFI_AP_STATE_ENABLED;
+import static android.net.wifi.WifiManager.WIFI_AP_STATE_ENABLING;
+
+import android.annotation.Nullable;
import android.car.CarProjectionManager;
+import android.car.CarProjectionManager.ProjectionAccessPointCallback;
import android.car.ICarProjection;
import android.car.ICarProjectionCallback;
+import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
+import android.content.IntentFilter;
import android.content.ServiceConnection;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiConfiguration.GroupCipher;
+import android.net.wifi.WifiConfiguration.KeyMgmt;
+import android.net.wifi.WifiConfiguration.PairwiseCipher;
+import android.net.wifi.WifiManager;
+import android.net.wifi.WifiManager.LocalOnlyHotspotCallback;
+import android.net.wifi.WifiManager.LocalOnlyHotspotReservation;
+import android.net.wifi.WifiManager.SoftApCallback;
import android.os.Binder;
+import android.os.Handler;
import android.os.IBinder;
+import android.os.Message;
+import android.os.Messenger;
import android.os.RemoteException;
import android.os.UserHandle;
import android.util.Log;
-import android.view.KeyEvent;
+
+import com.android.internal.annotations.GuardedBy;
import java.io.PrintWriter;
+import java.lang.ref.WeakReference;
+import java.net.NetworkInterface;
+import java.net.SocketException;
+import java.security.SecureRandom;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Random;
/**
* Car projection service allows to bound to projected app to boost it prioirity.
@@ -37,32 +73,52 @@
*/
class CarProjectionService extends ICarProjection.Stub implements CarServiceBase,
BinderInterfaceContainer.BinderEventHandler<ICarProjectionCallback> {
- private final ListenerHolder mAllListeners;
+ private static final String TAG = CarLog.TAG_PROJECTION;
+ private static final boolean DBG = true;
+
+ private final ProjectionCallbackHolder mProjectionCallbacks;
private final CarInputService mCarInputService;
private final Context mContext;
+ private final WifiManager mWifiManager;
+ private final Handler mHandler;
+ private final Object mLock = new Object();
- private final CarInputService.KeyEventListener mVoiceAssistantKeyListener =
- new CarInputService.KeyEventListener() {
- @Override
- public boolean onKeyEvent(KeyEvent event) {
- handleVoiceAssitantRequest(false);
- return true;
- }
- };
+ @GuardedBy("mLock")
+ private final HashMap<IBinder, WirelessClient> mWirelessClients = new HashMap<>();
- private final CarInputService.KeyEventListener mLongVoiceAssistantKeyListener =
- new CarInputService.KeyEventListener() {
- @Override
- public boolean onKeyEvent(KeyEvent event) {
- handleVoiceAssitantRequest(true);
- return true;
- }
- };
+ @Nullable
+ @GuardedBy("mLock")
+ private LocalOnlyHotspotReservation mLocalOnlyHotspotReservation;
+
+ @Nullable
+ @GuardedBy("mLock")
+ private SoftApCallback mSoftApCallback;
+
+ @Nullable
+ private String mApBssid;
+
+ private static final int WIFI_MODE_TETHERED = 1;
+ private static final int WIFI_MODE_LOCALONLY = 2;
+
+ private static final int RAND_SSID_INT_MIN = 1000;
+ private static final int RAND_SSID_INT_MAX = 9999;
+
+ // Could be one of the WIFI_MODE_* constants.
+ // TODO: read this from user settings, support runtime switch
+ private int mWifiMode = WIFI_MODE_LOCALONLY;
+
+ private final WifiConfiguration mProjectionWifiConfiguration;
+
+ private final Runnable mVoiceAssistantKeyListener =
+ () -> handleVoiceAssistantRequest(false);
+
+ private final Runnable mLongVoiceAssistantKeyListener =
+ () -> handleVoiceAssistantRequest(true);
private final ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className, IBinder service) {
- synchronized (CarProjectionService.this) {
+ synchronized (mLock) {
mBound = true;
}
}
@@ -71,7 +127,7 @@
public void onServiceDisconnected(ComponentName className) {
// Service has crashed.
Log.w(CarLog.TAG_PROJECTION, "Service disconnected: " + className);
- synchronized (CarProjectionService.this) {
+ synchronized (mLock) {
mRegisteredService = null;
}
unbindServiceIfBound();
@@ -83,15 +139,18 @@
CarProjectionService(Context context, CarInputService carInputService) {
mContext = context;
+ mHandler = new Handler();
mCarInputService = carInputService;
- mAllListeners = new ListenerHolder(this);
+ mProjectionCallbacks = new ProjectionCallbackHolder(this);
+ mWifiManager = context.getSystemService(WifiManager.class);
+ mProjectionWifiConfiguration = createWifiConfiguration(context);
}
@Override
public void registerProjectionRunner(Intent serviceIntent) {
// We assume one active projection app running in the system at one time.
- synchronized (this) {
- if (serviceIntent.filterEquals(mRegisteredService)) {
+ synchronized (mLock) {
+ if (serviceIntent.filterEquals(mRegisteredService) && mBound) {
return;
}
if (mRegisteredService != null) {
@@ -105,7 +164,7 @@
@Override
public void unregisterProjectionRunner(Intent serviceIntent) {
- synchronized (this) {
+ synchronized (mLock) {
if (!serviceIntent.filterEquals(mRegisteredService)) {
Log.w(CarLog.TAG_PROJECTION, "Request to unbind unregistered service["
+ serviceIntent + "]. Registered service[" + mRegisteredService + "]");
@@ -117,7 +176,7 @@
}
private void bindToService(Intent serviceIntent) {
- synchronized (this) {
+ synchronized (mLock) {
mRegisteredService = serviceIntent;
}
UserHandle userHandle = UserHandle.getUserHandleForUid(Binder.getCallingUid());
@@ -126,35 +185,40 @@
}
private void unbindServiceIfBound() {
- synchronized (this) {
+ synchronized (mLock) {
if (!mBound) {
return;
}
mBound = false;
+ mRegisteredService = null;
}
mContext.unbindService(mConnection);
}
- private synchronized void handleVoiceAssitantRequest(boolean isTriggeredByLongPress) {
- for (BinderInterfaceContainer.BinderInterface<ICarProjectionCallback> listener :
- mAllListeners.getInterfaces()) {
- ListenerInfo listenerInfo = (ListenerInfo) listener;
- if ((listenerInfo.hasFilter(CarProjectionManager.PROJECTION_LONG_PRESS_VOICE_SEARCH)
- && isTriggeredByLongPress)
- || (listenerInfo.hasFilter(CarProjectionManager.PROJECTION_VOICE_SEARCH)
- && !isTriggeredByLongPress)) {
- dispatchVoiceAssistantRequest(listenerInfo.binderInterface, isTriggeredByLongPress);
+ private void handleVoiceAssistantRequest(boolean isTriggeredByLongPress) {
+ Log.i(TAG, "Voice assistant request, long press = " + isTriggeredByLongPress);
+ synchronized (mLock) {
+ for (BinderInterfaceContainer.BinderInterface<ICarProjectionCallback> listener :
+ mProjectionCallbacks.getInterfaces()) {
+ ProjectionCallback projectionCallback = (ProjectionCallback) listener;
+ if ((projectionCallback.hasFilter(PROJECTION_LONG_PRESS_VOICE_SEARCH)
+ && isTriggeredByLongPress)
+ || (projectionCallback.hasFilter(PROJECTION_VOICE_SEARCH)
+ && !isTriggeredByLongPress)) {
+ dispatchVoiceAssistantRequest(
+ projectionCallback.binderInterface, isTriggeredByLongPress);
+ }
}
}
}
@Override
- public void registerProjectionListener(ICarProjectionCallback listener, int filter) {
- synchronized (this) {
- ListenerInfo info = (ListenerInfo) mAllListeners.getBinderInterface(listener);
+ public void registerProjectionListener(ICarProjectionCallback callback, int filter) {
+ synchronized (mLock) {
+ ProjectionCallback info = mProjectionCallbacks.get(callback);
if (info == null) {
- info = new ListenerInfo(mAllListeners, listener, filter);
- mAllListeners.addBinderInterface(info);
+ info = new ProjectionCallback(mProjectionCallbacks, callback, filter);
+ mProjectionCallbacks.addBinderInterface(info);
} else {
info.setFilter(filter);
}
@@ -164,23 +228,221 @@
@Override
public void unregisterProjectionListener(ICarProjectionCallback listener) {
- synchronized (this) {
- mAllListeners.removeBinder(listener);
+ synchronized (mLock) {
+ mProjectionCallbacks.removeBinder(listener);
}
updateCarInputServiceListeners();
}
+ @Override
+ public void startProjectionAccessPoint(final Messenger messenger, IBinder binder)
+ throws RemoteException {
+ //TODO: check if access point already started with the desired configuration.
+ registerWirelessClient(WirelessClient.of(messenger, binder));
+ startAccessPoint();
+ }
+
+ @Override
+ public void stopProjectionAccessPoint(IBinder token) {
+ Log.i(TAG, "Received stop access point request from " + token);
+
+ boolean shouldReleaseAp;
+ synchronized (mLock) {
+ if (!unregisterWirelessClientLocked(token)) {
+ Log.w(TAG, "Client " + token + " was not registered");
+ return;
+ }
+ shouldReleaseAp = mWirelessClients.isEmpty();
+ }
+
+ if (shouldReleaseAp) {
+ stopAccessPoint();
+ }
+ }
+
+ private void startAccessPoint() {
+ synchronized (mLock) {
+ switch (mWifiMode) {
+ case WIFI_MODE_LOCALONLY: {
+ startLocalOnlyApLocked();
+ break;
+ }
+ case WIFI_MODE_TETHERED: {
+ startTetheredApLocked();
+ break;
+ }
+ default: {
+ Log.wtf(TAG, "Unexpected Access Point mode during starting: " + mWifiMode);
+ break;
+ }
+ }
+ }
+ }
+
+ private void stopAccessPoint() {
+ sendApStopped();
+
+ synchronized (mLock) {
+ switch (mWifiMode) {
+ case WIFI_MODE_LOCALONLY: {
+ stopLocalOnlyApLocked();
+ break;
+ }
+ case WIFI_MODE_TETHERED: {
+ stopTetheredApLocked();
+ break;
+ }
+ default: {
+ Log.wtf(TAG, "Unexpected Access Point mode during stopping : " + mWifiMode);
+ }
+ }
+ }
+ }
+
+ private void startTetheredApLocked() {
+ Log.d(TAG, "startTetheredApLocked");
+
+ final SoftApCallback callback = new ProjectionSoftApCallback();
+ mWifiManager.registerSoftApCallback(callback, mHandler);
+
+ if (!mWifiManager.startSoftAp(mProjectionWifiConfiguration)) {
+ Log.e(TAG, "Failed to start soft AP");
+ mWifiManager.unregisterSoftApCallback(callback);
+ sendApFailed(ERROR_GENERIC);
+ } else {
+ mSoftApCallback = callback;
+ }
+ }
+
+ private void stopTetheredApLocked() {
+ Log.d(TAG, "stopTetheredAp");
+
+ if (mSoftApCallback != null) {
+ mWifiManager.unregisterSoftApCallback(mSoftApCallback);
+ mSoftApCallback = null;
+ if (!mWifiManager.stopSoftAp()) {
+ Log.w(TAG, "Failed to request soft AP to stop.");
+ }
+ }
+ }
+
+ private void startLocalOnlyApLocked() {
+ if (mLocalOnlyHotspotReservation != null) {
+ Log.i(TAG, "Local-only hotspot is already registered.");
+ sendApStarted(mLocalOnlyHotspotReservation.getWifiConfiguration());
+ return;
+ }
+
+ Log.i(TAG, "Requesting to start local-only hotspot.");
+ mWifiManager.startLocalOnlyHotspot(new LocalOnlyHotspotCallback() {
+ @Override
+ public void onStarted(LocalOnlyHotspotReservation reservation) {
+ Log.d(TAG, "Local-only hotspot started");
+ synchronized (mLock) {
+ mLocalOnlyHotspotReservation = reservation;
+ }
+ sendApStarted(reservation.getWifiConfiguration());
+ }
+
+ @Override
+ public void onStopped() {
+ Log.i(TAG, "Local-only hotspot stopped.");
+ synchronized (mLock) {
+ mLocalOnlyHotspotReservation = null;
+ }
+ sendApStopped();
+ }
+
+ @Override
+ public void onFailed(int localonlyHostspotFailureReason) {
+ Log.w(TAG, "Local-only hotspot failed, reason: "
+ + localonlyHostspotFailureReason);
+ synchronized (mLock) {
+ mLocalOnlyHotspotReservation = null;
+ }
+ int reason;
+ switch (localonlyHostspotFailureReason) {
+ case LocalOnlyHotspotCallback.ERROR_NO_CHANNEL:
+ reason = ProjectionAccessPointCallback.ERROR_NO_CHANNEL;
+ break;
+ case LocalOnlyHotspotCallback.ERROR_TETHERING_DISALLOWED:
+ reason = ProjectionAccessPointCallback.ERROR_TETHERING_DISALLOWED;
+ break;
+ case LocalOnlyHotspotCallback.ERROR_INCOMPATIBLE_MODE:
+ reason = ProjectionAccessPointCallback.ERROR_INCOMPATIBLE_MODE;
+ break;
+ default:
+ reason = ProjectionAccessPointCallback.ERROR_GENERIC;
+
+ }
+ sendApFailed(reason);
+ }
+ }, mHandler);
+ }
+
+ private void stopLocalOnlyApLocked() {
+ Log.i(TAG, "stopLocalOnlyApLocked");
+
+ if (mLocalOnlyHotspotReservation == null) {
+ Log.w(TAG, "Requested to stop local-only hotspot which was already stopped.");
+ return;
+ }
+
+ mLocalOnlyHotspotReservation.close();
+ mLocalOnlyHotspotReservation = null;
+ }
+
+ private void sendApStarted(WifiConfiguration wifiConfiguration) {
+ WifiConfiguration localWifiConfig = new WifiConfiguration(wifiConfiguration);
+ localWifiConfig.BSSID = mApBssid;
+
+ Message message = Message.obtain();
+ message.what = CarProjectionManager.PROJECTION_AP_STARTED;
+ message.obj = localWifiConfig;
+ Log.i(TAG, "Sending PROJECTION_AP_STARTED, ssid: "
+ + localWifiConfig.getPrintableSsid()
+ + ", apBand: " + localWifiConfig.apBand
+ + ", apChannel: " + localWifiConfig.apChannel
+ + ", bssid: " + localWifiConfig.BSSID);
+ sendApStatusMessage(message);
+ }
+
+ private void sendApStopped() {
+ Message message = Message.obtain();
+ message.what = CarProjectionManager.PROJECTION_AP_STOPPED;
+ sendApStatusMessage(message);
+ unregisterWirelessClients();
+ }
+
+ private void sendApFailed(int reason) {
+ Message message = Message.obtain();
+ message.what = CarProjectionManager.PROJECTION_AP_FAILED;
+ message.arg1 = reason;
+ sendApStatusMessage(message);
+ unregisterWirelessClients();
+ }
+
+ private void sendApStatusMessage(Message message) {
+ List<WirelessClient> clients;
+ synchronized (mLock) {
+ clients = new ArrayList<>(mWirelessClients.values());
+ }
+ for (WirelessClient client : clients) {
+ client.send(message);
+ }
+ }
+
private void updateCarInputServiceListeners() {
boolean listenShortPress = false;
boolean listenLongPress = false;
- synchronized (this) {
+ synchronized (mLock) {
for (BinderInterfaceContainer.BinderInterface<ICarProjectionCallback> listener :
- mAllListeners.getInterfaces()) {
- ListenerInfo listenerInfo = (ListenerInfo) listener;
- listenShortPress |= listenerInfo.hasFilter(
- CarProjectionManager.PROJECTION_VOICE_SEARCH);
- listenLongPress |= listenerInfo.hasFilter(
- CarProjectionManager.PROJECTION_LONG_PRESS_VOICE_SEARCH);
+ mProjectionCallbacks.getInterfaces()) {
+ ProjectionCallback projectionCallback = (ProjectionCallback) listener;
+ listenShortPress |= projectionCallback.hasFilter(
+ PROJECTION_VOICE_SEARCH);
+ listenLongPress |= projectionCallback.hasFilter(
+ PROJECTION_LONG_PRESS_VOICE_SEARCH);
}
}
mCarInputService.setVoiceAssistantKeyListener(listenShortPress
@@ -191,13 +453,48 @@
@Override
public void init() {
- // nothing to do
+ mContext.registerReceiver(
+ new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ final int currState = intent.getIntExtra(EXTRA_WIFI_AP_STATE,
+ WIFI_AP_STATE_DISABLED);
+ final int prevState = intent.getIntExtra(EXTRA_PREVIOUS_WIFI_AP_STATE,
+ WIFI_AP_STATE_DISABLED);
+ final int errorCode = intent.getIntExtra(EXTRA_WIFI_AP_FAILURE_REASON, 0);
+ final String ifaceName =
+ intent.getStringExtra(EXTRA_WIFI_AP_INTERFACE_NAME);
+ final int mode = intent.getIntExtra(EXTRA_WIFI_AP_MODE,
+ WifiManager.IFACE_IP_MODE_UNSPECIFIED);
+ handleWifiApStateChange(currState, prevState, errorCode, ifaceName, mode);
+ }
+ },
+ new IntentFilter(WifiManager.WIFI_AP_STATE_CHANGED_ACTION));
+ }
+
+ private void handleWifiApStateChange(int currState, int prevState, int errorCode,
+ String ifaceName, int mode) {
+ if (currState == WIFI_AP_STATE_ENABLING || currState == WIFI_AP_STATE_ENABLED) {
+ Log.d(TAG,
+ "handleWifiApStateChange, curState: " + currState + ", prevState: " + prevState
+ + ", errorCode: " + errorCode + ", ifaceName: " + ifaceName + ", mode: "
+ + mode);
+
+ try {
+ NetworkInterface iface = NetworkInterface.getByName(ifaceName);
+ byte[] bssid = iface.getHardwareAddress();
+ mApBssid = String.format("%02x:%02x:%02x:%02x:%02x:%02x",
+ bssid[0], bssid[1], bssid[2], bssid[3], bssid[4], bssid[5]);
+ } catch (SocketException e) {
+ Log.e(TAG, e.toString(), e);
+ }
+ }
}
@Override
public void release() {
- synchronized (this) {
- mAllListeners.clear();
+ synchronized (mLock) {
+ mProjectionCallbacks.clear();
}
}
@@ -210,12 +507,19 @@
@Override
public void dump(PrintWriter writer) {
writer.println("**CarProjectionService**");
- synchronized (this) {
+ synchronized (mLock) {
for (BinderInterfaceContainer.BinderInterface<ICarProjectionCallback> listener :
- mAllListeners.getInterfaces()) {
- ListenerInfo listenerInfo = (ListenerInfo) listener;
- writer.println(listenerInfo.toString());
+ mProjectionCallbacks.getInterfaces()) {
+ ProjectionCallback projectionCallback = (ProjectionCallback) listener;
+ writer.println(projectionCallback.toString());
}
+
+ writer.println("Local-only hotspot reservation: " + mLocalOnlyHotspotReservation);
+ writer.println("Wireless clients: " + mWirelessClients.size());
+ writer.println("Current wifi mode: " + mWifiMode);
+ writer.println("SoftApCallback: " + mSoftApCallback);
+ writer.println("Bound to projection app: " + mBound);
+ writer.println("Registered Service: " + mRegisteredService);
}
}
@@ -227,17 +531,23 @@
}
}
- private static class ListenerHolder extends BinderInterfaceContainer<ICarProjectionCallback> {
- private ListenerHolder(CarProjectionService service) {
+ private static class ProjectionCallbackHolder
+ extends BinderInterfaceContainer<ICarProjectionCallback> {
+ ProjectionCallbackHolder(CarProjectionService service) {
super(service);
}
+
+ ProjectionCallback get(ICarProjectionCallback projectionCallback) {
+ return (ProjectionCallback) getBinderInterface(projectionCallback);
+ }
}
- private static class ListenerInfo extends
+ private static class ProjectionCallback extends
BinderInterfaceContainer.BinderInterface<ICarProjectionCallback> {
private int mFilter;
- private ListenerInfo(ListenerHolder holder, ICarProjectionCallback binder, int filter) {
+ private ProjectionCallback(ProjectionCallbackHolder holder, ICarProjectionCallback binder,
+ int filter) {
super(holder, binder);
this.mFilter = filter;
}
@@ -256,9 +566,166 @@
@Override
public String toString() {
- synchronized (this) {
- return "ListenerInfo{filter=" + Integer.toHexString(mFilter) + "}";
+ return "ListenerInfo{filter=" + Integer.toHexString(getFilter()) + "}";
+ }
+ }
+
+ private static WifiConfiguration createWifiConfiguration(Context context) {
+ //TODO: consider to read current AP configuration and modify only parts that matter for
+ //wireless projection (apBand, key management), do not modify password if it was set.
+ WifiConfiguration config = new WifiConfiguration();
+ config.apBand = WifiConfiguration.AP_BAND_5GHZ;
+ config.SSID = context.getResources()
+ .getString(R.string.config_TetheredProjectionAccessPointSsid)
+ + "_" + getRandomIntForDefaultSsid();
+ config.allowedKeyManagement.set(KeyMgmt.WPA2_PSK);
+ config.allowedPairwiseCiphers.set(PairwiseCipher.CCMP);
+ config.allowedGroupCiphers.set(GroupCipher.CCMP);
+ config.preSharedKey = RandomPassword.generate();
+ return config;
+ }
+
+ private void registerWirelessClient(WirelessClient client) throws RemoteException {
+ synchronized (mLock) {
+ if (unregisterWirelessClientLocked(client.token)) {
+ Log.i(TAG, "Client was already registered, override it.");
+ }
+ mWirelessClients.put(client.token, client);
+ }
+ client.token.linkToDeath(new WirelessClientDeathRecipient(this, client), 0);
+ }
+
+ private void unregisterWirelessClients() {
+ synchronized (mLock) {
+ for (WirelessClient client: mWirelessClients.values()) {
+ client.token.unlinkToDeath(client.deathRecipient, 0);
+ }
+ mWirelessClients.clear();
+ }
+ }
+
+ private boolean unregisterWirelessClientLocked(IBinder token) {
+ WirelessClient client = mWirelessClients.remove(token);
+ if (client != null) {
+ token.unlinkToDeath(client.deathRecipient, 0);
+ }
+
+ return client != null;
+ }
+
+ private class ProjectionSoftApCallback implements SoftApCallback {
+ @Override
+ public void onStateChanged(int state, int softApFailureReason) {
+ Log.i(TAG, "ProjectionSoftApCallback, onStateChanged, state: " + state
+ + ", failed reason: softApFailureReason");
+
+ switch (state) {
+ case WifiManager.WIFI_AP_STATE_ENABLED: {
+ sendApStarted(mProjectionWifiConfiguration);
+ break;
+ }
+ case WIFI_AP_STATE_DISABLED: {
+ sendApStopped();
+ break;
+ }
+ case WifiManager.WIFI_AP_STATE_FAILED: {
+ Log.w(TAG, "WIFI_AP_STATE_FAILED, reason: " + softApFailureReason);
+ int reason;
+ switch (softApFailureReason) {
+ case WifiManager.SAP_START_FAILURE_NO_CHANNEL:
+ reason = ProjectionAccessPointCallback.ERROR_NO_CHANNEL;
+ break;
+ default:
+ reason = ERROR_GENERIC;
+ }
+ sendApFailed(reason);
+ break;
+ }
}
}
+
+ @Override
+ public void onNumClientsChanged(int numClients) {
+ Log.i(TAG, "ProjectionSoftApCallback, onNumClientsChanged: " + numClients);
+ }
+ }
+
+ private static class WirelessClient {
+ public final Messenger messenger;
+ public final IBinder token;
+ public @Nullable DeathRecipient deathRecipient;
+
+ private WirelessClient(Messenger messenger, IBinder token) {
+ this.messenger = messenger;
+ this.token = token;
+ }
+
+ private static WirelessClient of(Messenger messenger, IBinder token) {
+ return new WirelessClient(messenger, token);
+ }
+
+ void send(Message message) {
+ try {
+ Log.d(TAG, "Sending message " + message.what + " to " + this);
+ messenger.send(message);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Failed to send message", e);
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName()
+ + "{token= " + token
+ + ", deathRecipient=" + deathRecipient + "}";
+ }
+ }
+
+ private static class WirelessClientDeathRecipient implements DeathRecipient {
+ final WeakReference<CarProjectionService> mServiceRef;
+ final WirelessClient mClient;
+
+ WirelessClientDeathRecipient(CarProjectionService service, WirelessClient client) {
+ mServiceRef = new WeakReference<>(service);
+ mClient = client;
+ mClient.deathRecipient = this;
+ }
+
+ @Override
+ public void binderDied() {
+ Log.w(TAG, "Wireless client " + mClient + " died.");
+ CarProjectionService service = mServiceRef.get();
+ if (service == null) return;
+
+ synchronized (service.mLock) {
+ service.unregisterWirelessClientLocked(mClient.token);
+ }
+ }
+ }
+
+ private static class RandomPassword {
+ private static final int PASSWORD_LENGTH = 12;
+ private static final String PW_NUMBER = "0123456789";
+ private static final String PW_LOWER_CASE = "abcdefghijklmnopqrstuvwxyz";
+ private static final String PW_UPPER_CASE = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+
+ private static final char[] SYMBOLS =
+ (PW_NUMBER + PW_LOWER_CASE + PW_UPPER_CASE).toCharArray();
+
+ static String generate() {
+ SecureRandom random = new SecureRandom();
+
+ StringBuilder password = new StringBuilder();
+ while (password.length() < PASSWORD_LENGTH) {
+ int randomIndex = random.nextInt(SYMBOLS.length);
+ password.append(SYMBOLS[randomIndex]);
+ }
+ return password.toString();
+ }
+ }
+
+ private static int getRandomIntForDefaultSsid() {
+ Random random = new Random();
+ return random.nextInt((RAND_SSID_INT_MAX - RAND_SSID_INT_MIN) + 1) + RAND_SSID_INT_MIN;
}
}
diff --git a/service/src/com/android/car/CarPropertyService.java b/service/src/com/android/car/CarPropertyService.java
index a01d4b8..35fd295 100644
--- a/service/src/com/android/car/CarPropertyService.java
+++ b/service/src/com/android/car/CarPropertyService.java
@@ -317,6 +317,26 @@
}
@Override
+ public String getReadPermission(int propId) {
+ if (mConfigs.get(propId) == null) {
+ // Property ID does not exist
+ Log.e(TAG, "getReadPermission: propId is not in config list:0x" + toHexString(propId));
+ return null;
+ }
+ return mHal.getReadPermission(propId);
+ }
+
+ @Override
+ public String getWritePermission(int propId) {
+ if (mConfigs.get(propId) == null) {
+ // Property ID does not exist
+ Log.e(TAG, "getWritePermission: propId is not in config list:0x" + toHexString(propId));
+ return null;
+ }
+ return mHal.getWritePermission(propId);
+ }
+
+ @Override
public void setProperty(CarPropertyValue prop) {
int propId = prop.getPropertyId();
if (mConfigs.get(propId) == null) {
diff --git a/service/src/com/android/car/CarUxRestrictionsConfigurationXmlParser.java b/service/src/com/android/car/CarUxRestrictionsConfigurationXmlParser.java
new file mode 100644
index 0000000..95bcb2c
--- /dev/null
+++ b/service/src/com/android/car/CarUxRestrictionsConfigurationXmlParser.java
@@ -0,0 +1,316 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car;
+
+import android.annotation.Nullable;
+import android.annotation.XmlRes;
+import android.car.drivingstate.CarDrivingStateEvent;
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.drivingstate.CarUxRestrictionsConfiguration;
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.content.res.XmlResourceParser;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.util.Pair;
+import android.util.Xml;
+
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.IOException;
+
+/**
+ * @hide
+ */
+public final class CarUxRestrictionsConfigurationXmlParser {
+ private static final String TAG = "UxRConfigParser";
+ private static final int UX_RESTRICTIONS_UNKNOWN = -1;
+ private static final float INVALID_SPEED = -1f;
+ // XML tags to parse
+ private static final String ROOT_ELEMENT = "UxRestrictions";
+ private static final String RESTRICTION_MAPPING = "RestrictionMapping";
+ private static final String RESTRICTION_PARAMETERS = "RestrictionParameters";
+ private static final String DRIVING_STATE = "DrivingState";
+ private static final String RESTRICTIONS = "Restrictions";
+ private static final String STRING_RESTRICTIONS = "StringRestrictions";
+ private static final String CONTENT_RESTRICTIONS = "ContentRestrictions";
+
+ private final Context mContext;
+
+ private CarUxRestrictionsConfiguration.Builder mConfigBuilder;
+
+ private CarUxRestrictionsConfigurationXmlParser(Context context) {
+ mContext = context;
+ }
+
+ /**
+ * Loads the UX restrictions related information from the XML resource.
+ *
+ * @return parsed CarUxRestrictionsConfiguration; {@code null} if the XML is malformed.
+ */
+ @Nullable
+ public static CarUxRestrictionsConfiguration parse(Context context, @XmlRes int xmlResource)
+ throws IOException, XmlPullParserException {
+ return new CarUxRestrictionsConfigurationXmlParser(context).parse(xmlResource);
+ }
+
+ @Nullable
+ private CarUxRestrictionsConfiguration parse(@XmlRes int xmlResource)
+ throws IOException, XmlPullParserException {
+ mConfigBuilder = new CarUxRestrictionsConfiguration.Builder();
+
+ XmlResourceParser parser = mContext.getResources().getXml(xmlResource);
+ if (parser == null) {
+ Log.e(TAG, "Invalid Xml resource");
+ return null;
+ }
+
+ if (!traverseUntilStartTag(parser)) {
+ Log.e(TAG, "XML root element invalid: " + parser.getName());
+ return null;
+ }
+
+ if (!traverseUntilEndOfDocument(parser)) {
+ Log.e(TAG, "Could not parse XML to end");
+ return null;
+ }
+
+ return mConfigBuilder.build();
+ }
+
+ private boolean traverseUntilStartTag(XmlResourceParser parser)
+ throws IOException, XmlPullParserException {
+ int type;
+ // Traverse till we get to the first tag
+ while ((type = parser.next()) != XmlResourceParser.END_DOCUMENT
+ && type != XmlResourceParser.START_TAG) {
+ // Do nothing.
+ }
+ return ROOT_ELEMENT.equals(parser.getName());
+ }
+
+ private boolean traverseUntilEndOfDocument(XmlResourceParser parser)
+ throws XmlPullParserException, IOException {
+ AttributeSet attrs = Xml.asAttributeSet(parser);
+ while (parser.getEventType() != XmlResourceParser.END_DOCUMENT) {
+ // Every time we hit a start tag, check for the type of the tag
+ // and load the corresponding information.
+ if (parser.next() == XmlResourceParser.START_TAG) {
+ switch (parser.getName()) {
+ case RESTRICTION_MAPPING:
+ if (!mapDrivingStateToRestrictions(parser, attrs)) {
+ Log.e(TAG, "Could not map driving state to restriction.");
+ return false;
+ }
+ break;
+ case RESTRICTION_PARAMETERS:
+ if (!parseRestrictionParameters(parser, attrs)) {
+ // Failure to parse is automatically handled by falling back to
+ // defaults. Just log the information here.
+ if (Log.isLoggable(TAG, Log.INFO)) {
+ Log.i(TAG, "Error reading restrictions parameters. "
+ + "Falling back to platform defaults.");
+ }
+ }
+ break;
+ default:
+ Log.w(TAG, "Unknown class:" + parser.getName());
+ }
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Parses the information in the <restrictionMapping> tag to construct the mapping from
+ * driving state to UX restrictions.
+ */
+ private boolean mapDrivingStateToRestrictions(XmlResourceParser parser, AttributeSet attrs)
+ throws IOException, XmlPullParserException {
+ if (parser == null || attrs == null) {
+ Log.e(TAG, "Invalid arguments");
+ return false;
+ }
+ // The parser should be at the <RestrictionMapping> tag at this point.
+ if (!RESTRICTION_MAPPING.equals(parser.getName())) {
+ Log.e(TAG, "Parser not at RestrictionMapping element: " + parser.getName());
+ return false;
+ }
+ if (!traverseToTag(parser, DRIVING_STATE)) {
+ Log.e(TAG, "No <" + DRIVING_STATE + "> tag in XML");
+ return false;
+ }
+ // Handle all the <DrivingState> tags.
+ while (DRIVING_STATE.equals(parser.getName())) {
+ if (parser.getEventType() == XmlResourceParser.START_TAG) {
+ // 1. Get the driving state attributes: driving state and speed range
+ TypedArray a = mContext.getResources().obtainAttributes(attrs,
+ R.styleable.UxRestrictions_DrivingState);
+ int drivingState = a
+ .getInt(R.styleable.UxRestrictions_DrivingState_state,
+ CarDrivingStateEvent.DRIVING_STATE_UNKNOWN);
+ float minSpeed = a
+ .getFloat(
+ R.styleable
+ .UxRestrictions_DrivingState_minSpeed,
+ INVALID_SPEED);
+ float maxSpeed = a
+ .getFloat(
+ R.styleable
+ .UxRestrictions_DrivingState_maxSpeed,
+ INVALID_SPEED);
+ a.recycle();
+
+ // 2. Traverse to the <Restrictions> tag
+ if (!traverseToTag(parser, RESTRICTIONS)) {
+ Log.e(TAG, "No <" + RESTRICTIONS + "> tag in XML");
+ return false;
+ }
+
+ // 3. Parse the restrictions for this driving state
+ Pair<Boolean, Integer> restrictions = parseRestrictions(parser, attrs);
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "Map " + drivingState + " : " + restrictions);
+ }
+
+ // Update the builder if the driving state and restrictions info are valid.
+ if (drivingState != CarDrivingStateEvent.DRIVING_STATE_UNKNOWN
+ && restrictions != null) {
+ addToRestrictions(drivingState, minSpeed, maxSpeed, restrictions.first,
+ restrictions.second);
+ }
+ }
+ parser.next();
+ }
+ return true;
+ }
+
+ /**
+ * Parses the <restrictions> tag nested with the <drivingState>. This provides the restrictions
+ * for the enclosing driving state.
+ */
+ @Nullable
+ private Pair<Boolean, Integer> parseRestrictions(XmlResourceParser parser, AttributeSet attrs)
+ throws IOException, XmlPullParserException {
+ int restrictions = UX_RESTRICTIONS_UNKNOWN;
+ boolean requiresOpt = true;
+ if (parser == null || attrs == null) {
+ Log.e(TAG, "Invalid Arguments");
+ return null;
+ }
+
+ while (RESTRICTIONS.equals(parser.getName())
+ && parser.getEventType() == XmlResourceParser.START_TAG) {
+ TypedArray a = mContext.getResources().obtainAttributes(attrs,
+ R.styleable.UxRestrictions_Restrictions);
+ restrictions = a.getInt(
+ R.styleable.UxRestrictions_Restrictions_uxr,
+ CarUxRestrictions.UX_RESTRICTIONS_FULLY_RESTRICTED);
+ requiresOpt = a.getBoolean(
+ R.styleable.UxRestrictions_Restrictions_requiresDistractionOptimization, true);
+ a.recycle();
+ parser.next();
+ }
+ return new Pair<>(requiresOpt, restrictions);
+ }
+
+ private void addToRestrictions(int drivingState, float minSpeed, float maxSpeed,
+ boolean requiresOpt, int restrictions) {
+ CarUxRestrictionsConfiguration.Builder.SpeedRange speedRange = null;
+ if (Float.compare(minSpeed, INVALID_SPEED) != 0) {
+ if (Float.compare(maxSpeed, INVALID_SPEED) == 0) {
+ // Setting min speed but not max implies MAX_SPEED.
+ maxSpeed = CarUxRestrictionsConfiguration.Builder.SpeedRange.MAX_SPEED;
+ }
+ speedRange = new CarUxRestrictionsConfiguration.Builder.SpeedRange(minSpeed, maxSpeed);
+ }
+ mConfigBuilder.setUxRestrictions(drivingState, speedRange, requiresOpt, restrictions);
+ }
+
+ private boolean traverseToTag(XmlResourceParser parser, String tag)
+ throws IOException, XmlPullParserException {
+ if (tag == null || parser == null) {
+ return false;
+ }
+ int type;
+ while ((type = parser.next()) != XmlResourceParser.END_DOCUMENT) {
+ if (type == XmlResourceParser.START_TAG && parser.getName().equals(tag)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Parses the information in the <RestrictionParameters> tag to read the parameters for the
+ * applicable UX restrictions
+ */
+ private boolean parseRestrictionParameters(XmlResourceParser parser, AttributeSet attrs)
+ throws IOException, XmlPullParserException {
+ if (parser == null || attrs == null) {
+ Log.e(TAG, "Invalid arguments");
+ return false;
+ }
+ // The parser should be at the <RestrictionParameters> tag at this point.
+ if (!RESTRICTION_PARAMETERS.equals(parser.getName())) {
+ Log.e(TAG, "Parser not at RestrictionParameters element: " + parser.getName());
+ return false;
+ }
+ while (parser.getEventType() != XmlResourceParser.END_DOCUMENT) {
+ int type = parser.next();
+ // Break if we have parsed all <RestrictionParameters>
+ if (type == XmlResourceParser.END_TAG && RESTRICTION_PARAMETERS.equals(
+ parser.getName())) {
+ return true;
+ }
+ if (type == XmlResourceParser.START_TAG) {
+ TypedArray a = null;
+ switch (parser.getName()) {
+ case STRING_RESTRICTIONS:
+ a = mContext.getResources().obtainAttributes(attrs,
+ R.styleable.UxRestrictions_StringRestrictions);
+ mConfigBuilder.setMaxStringLength(a.getInt(
+ R.styleable.UxRestrictions_StringRestrictions_maxLength,
+ UX_RESTRICTIONS_UNKNOWN));
+
+ break;
+ case CONTENT_RESTRICTIONS:
+ a = mContext.getResources().obtainAttributes(attrs,
+ R.styleable.UxRestrictions_ContentRestrictions);
+ mConfigBuilder.setMaxCumulativeContentItems(a.getInt(
+ R.styleable.UxRestrictions_ContentRestrictions_maxCumulativeItems,
+ UX_RESTRICTIONS_UNKNOWN));
+ mConfigBuilder.setMaxContentDepth(a.getInt(
+ R.styleable.UxRestrictions_ContentRestrictions_maxDepth,
+ UX_RESTRICTIONS_UNKNOWN));
+ break;
+ default:
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "Unsupported Restriction Parameters in XML: "
+ + parser.getName());
+ }
+ break;
+ }
+ if (a != null) {
+ a.recycle();
+ }
+ }
+ }
+ return true;
+ }
+}
+
diff --git a/service/src/com/android/car/CarUxRestrictionsManagerService.java b/service/src/com/android/car/CarUxRestrictionsManagerService.java
index b90939b..d4d34be 100644
--- a/service/src/com/android/car/CarUxRestrictionsManagerService.java
+++ b/service/src/com/android/car/CarUxRestrictionsManagerService.java
@@ -16,32 +16,54 @@
package com.android.car;
+import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
+
import android.annotation.Nullable;
+import android.car.Car;
import android.car.drivingstate.CarDrivingStateEvent;
import android.car.drivingstate.CarDrivingStateEvent.CarDrivingState;
import android.car.drivingstate.CarUxRestrictions;
+import android.car.drivingstate.CarUxRestrictionsConfiguration;
import android.car.drivingstate.ICarDrivingStateChangeListener;
import android.car.drivingstate.ICarUxRestrictionsChangeListener;
import android.car.drivingstate.ICarUxRestrictionsManager;
import android.car.hardware.CarPropertyValue;
import android.car.hardware.property.CarPropertyEvent;
import android.car.hardware.property.ICarPropertyEventListener;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.BroadcastReceiver;
import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.hardware.automotive.vehicle.V2_0.VehicleProperty;
+import android.os.AsyncTask;
import android.os.Binder;
import android.os.Build;
import android.os.IBinder;
import android.os.Process;
import android.os.RemoteException;
+import android.os.SystemClock;
+import android.os.UserHandle;
+import android.util.AtomicFile;
+import android.util.JsonReader;
+import android.util.JsonWriter;
import android.util.Log;
import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
import org.xmlpull.v1.XmlPullParserException;
+import java.io.File;
+import java.io.FileOutputStream;
import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
import java.io.PrintWriter;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
@@ -49,6 +71,13 @@
/**
* A service that listens to current driving state of the vehicle and maps it to the
* appropriate UX restrictions for that driving state.
+ * <p>
+ * <h1>UX Restrictions Configuration</h1>
+ * When this service starts, it will first try reading the configuration set through
+ * {@link #saveUxRestrictionsConfigurationForNextBoot(CarUxRestrictionsConfiguration)}.
+ * If one is not available, it will try reading the configuration saved in
+ * {@code R.xml.car_ux_restrictions_map}. If XML is somehow unavailable, it will
+ * fall back to a hard-coded configuration.
*/
public class CarUxRestrictionsManagerService extends ICarUxRestrictionsManager.Stub implements
CarServiceBase {
@@ -57,55 +86,186 @@
private static final int MAX_TRANSITION_LOG_SIZE = 20;
private static final int PROPERTY_UPDATE_RATE = 5; // Update rate in Hz
private static final float SPEED_NOT_AVAILABLE = -1.0F;
+
+ @VisibleForTesting
+ /* package */ static final String CONFIG_FILENAME_PRODUCTION = "prod_config.json";
+ @VisibleForTesting
+ /* package */ static final String CONFIG_FILENAME_STAGED = "staged_config.json";
+
private final Context mContext;
private final CarDrivingStateService mDrivingStateService;
private final CarPropertyService mCarPropertyService;
- private final CarUxRestrictionsServiceHelper mHelper;
+ private final CarUserManagerHelper mCarUserManagerHelper;
// List of clients listening to UX restriction events.
private final List<UxRestrictionsClient> mUxRClients = new ArrayList<>();
+ private CarUxRestrictionsConfiguration mCarUxRestrictionsConfiguration;
private CarUxRestrictions mCurrentUxRestrictions;
private float mCurrentMovingSpeed;
- private boolean mFallbackToDefaults;
// Flag to disable broadcasting UXR changes - for development purposes
@GuardedBy("this")
private boolean mUxRChangeBroadcastEnabled = true;
// For dumpsys logging
private final LinkedList<Utils.TransitionLog> mTransitionLogs = new LinkedList<>();
+ // When UXR service boots up the context does not have access to storage yet, so it
+ // will likely read configuration from XML resource. Register to receive broadcast to
+ // attempt to read saved configuration when it becomes available.
+ private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if (Intent.ACTION_LOCKED_BOOT_COMPLETED.equals(action)) {
+ // If the system user is not headless, then we can read config as soon as the
+ // system has completed booting.
+ if (!mCarUserManagerHelper.isHeadlessSystemUser()) {
+ logd("not headless on boot complete");
+ PendingResult pendingResult = goAsync();
+ LoadRestrictionsTask task = new LoadRestrictionsTask(pendingResult);
+ task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
+ }
+ } else if (Intent.ACTION_USER_SWITCHED.equals(action)) {
+ int userHandle = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1);
+ logd("USER_SWITCHED: " + userHandle);
+ if (mCarUserManagerHelper.isHeadlessSystemUser()
+ && userHandle > UserHandle.USER_SYSTEM) {
+ PendingResult pendingResult = goAsync();
+ LoadRestrictionsTask task = new LoadRestrictionsTask(pendingResult);
+ task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
+ }
+ }
+ }
+ };
+
+ private class LoadRestrictionsTask extends AsyncTask<Void, Void, Void> {
+ private final BroadcastReceiver.PendingResult mPendingResult;
+
+ private LoadRestrictionsTask(BroadcastReceiver.PendingResult pendingResult) {
+ mPendingResult = pendingResult;
+ }
+
+ @Override
+ protected Void doInBackground(Void... params) {
+ mCarUxRestrictionsConfiguration = loadConfig();
+ handleDispatchUxRestrictions(mDrivingStateService.getCurrentDrivingState().eventValue,
+ getCurrentSpeed());
+ return null;
+ }
+
+ @Override
+ protected void onPostExecute(Void result) {
+ super.onPostExecute(result);
+ mPendingResult.finish();
+ }
+ }
public CarUxRestrictionsManagerService(Context context, CarDrivingStateService drvService,
- CarPropertyService propertyService) {
+ CarPropertyService propertyService, CarUserManagerHelper carUserManagerHelper) {
mContext = context;
mDrivingStateService = drvService;
mCarPropertyService = propertyService;
- mHelper = new CarUxRestrictionsServiceHelper(mContext, R.xml.car_ux_restrictions_map);
+ mCarUserManagerHelper = carUserManagerHelper;
+ // NOTE: during boot phase context cannot access file system so we most likely will
+ // use XML config. If prod config is set, it will be loaded in broadcast receiver.
+ mCarUxRestrictionsConfiguration = loadConfig();
// Unrestricted until driving state information is received. During boot up, we don't want
// everything to be blocked until data is available from CarPropertyManager. If we start
// driving and we don't get speed or gear information, we have bigger problems.
- mCurrentUxRestrictions = mHelper.createUxRestrictionsEvent(false,
- CarUxRestrictions.UX_RESTRICTIONS_BASELINE);
+ mCurrentUxRestrictions = new CarUxRestrictions.Builder(/* reqOpt= */ false,
+ CarUxRestrictions.UX_RESTRICTIONS_BASELINE, SystemClock.elapsedRealtimeNanos())
+ .build();
}
@Override
public synchronized void init() {
- try {
- if (!mHelper.loadUxRestrictionsFromXml()) {
- Log.e(TAG, "Error reading Ux Restrictions Mapping. Falling back to defaults");
- mFallbackToDefaults = true;
- }
- } catch (IOException | XmlPullParserException e) {
- Log.e(TAG, "Exception reading UX restrictions XML mapping", e);
- mFallbackToDefaults = true;
- }
// subscribe to driving State
mDrivingStateService.registerDrivingStateChangeListener(
mICarDrivingStateChangeEventListener);
// subscribe to property service for speed
mCarPropertyService.registerListener(VehicleProperty.PERF_VEHICLE_SPEED,
PROPERTY_UPDATE_RATE, mICarPropertyEventListener);
+ registerReceiverToLoadConfig();
initializeUxRestrictions();
}
+ private void registerReceiverToLoadConfig() {
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(Intent.ACTION_USER_SWITCHED);
+ filter.addAction(Intent.ACTION_LOCKED_BOOT_COMPLETED);
+ mContext.registerReceiver(mBroadcastReceiver, filter);
+ }
+
+ @Override
+ public CarUxRestrictionsConfiguration getConfig() {
+ return mCarUxRestrictionsConfiguration;
+ }
+
+ /**
+ * Loads a UX restrictions configuration and returns it.
+ * <p>Reads config from the following sources in order:
+ * <ol>
+ * <li>saved config set by
+ * {@link #saveUxRestrictionsConfigurationForNextBoot(CarUxRestrictionsConfiguration)};
+ * <li>XML resource config from {@code R.xml.car_ux_restrictions_map};
+ * <li>hardcoded default config.
+ * </ol>
+ */
+ @VisibleForTesting
+ /* package */ synchronized CarUxRestrictionsConfiguration loadConfig() {
+ promoteStagedConfig();
+
+ CarUxRestrictionsConfiguration config = null;
+ // Production config, if available, is the first choice.
+ File prodConfig = mContext.getFileStreamPath(CONFIG_FILENAME_PRODUCTION);
+ if (prodConfig.exists()) {
+ logd("Attempting to read production config");
+ config = readPersistedConfig(prodConfig);
+ if (config != null) {
+ return config;
+ }
+ }
+
+ // XML config is the second choice.
+ logd("Attempting to read config from XML resource");
+ config = readXmlConfig();
+ if (config != null) {
+ return config;
+ }
+
+ // This should rarely happen.
+ Log.w(TAG, "Creating default config");
+ return createDefaultConfig();
+ }
+
+ @Nullable
+ private CarUxRestrictionsConfiguration readXmlConfig() {
+ try {
+ return CarUxRestrictionsConfigurationXmlParser.parse(mContext,
+ R.xml.car_ux_restrictions_map);
+ } catch (IOException | XmlPullParserException e) {
+ Log.e(TAG, "Could not read config from XML resource", e);
+ }
+ return null;
+ }
+
+ private void promoteStagedConfig() {
+ Path stagedConfig = mContext.getFileStreamPath(CONFIG_FILENAME_STAGED).toPath();
+
+ CarDrivingStateEvent currentDrivingStateEvent =
+ mDrivingStateService.getCurrentDrivingState();
+ // Only promote staged config when car is parked.
+ if (currentDrivingStateEvent != null
+ && currentDrivingStateEvent.eventValue == CarDrivingStateEvent.DRIVING_STATE_PARKED
+ && Files.exists(stagedConfig)) {
+ Path prod = mContext.getFileStreamPath(CONFIG_FILENAME_PRODUCTION).toPath();
+ try {
+ logd("Attempting to promote stage config");
+ Files.move(stagedConfig, prod, REPLACE_EXISTING);
+ } catch (IOException e) {
+ Log.e(TAG, "Could not promote state config", e);
+ }
+ }
+ }
+
// Update current restrictions by getting the current driving state and speed.
private void initializeUxRestrictions() {
CarDrivingStateEvent currentDrivingStateEvent =
@@ -159,9 +319,7 @@
public synchronized void registerUxRestrictionsChangeListener(
ICarUxRestrictionsChangeListener listener) {
if (listener == null) {
- if (DBG) {
- Log.e(TAG, "registerUxRestrictionsChangeListener(): listener null");
- }
+ Log.e(TAG, "registerUxRestrictionsChangeListener(): listener null");
throw new IllegalArgumentException("Listener is null");
}
// If a new client is registering, create a new DrivingStateClient and add it to the list
@@ -232,6 +390,68 @@
return mCurrentUxRestrictions;
}
+ @Override
+ public synchronized boolean saveUxRestrictionsConfigurationForNextBoot(
+ CarUxRestrictionsConfiguration config) {
+ ICarImpl.assertPermission(mContext, Car.PERMISSION_CAR_UX_RESTRICTIONS_CONFIGURATION);
+ return persistConfig(config, CONFIG_FILENAME_STAGED);
+ }
+
+ @Override
+ @Nullable
+ public CarUxRestrictionsConfiguration getStagedConfig() {
+ File stagedConfig = mContext.getFileStreamPath(CONFIG_FILENAME_STAGED);
+ if (stagedConfig.exists()) {
+ logd("Attempting to read staged config");
+ return readPersistedConfig(stagedConfig);
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Writes configuration into the specified file.
+ *
+ * IO access on file is not thread safe. Caller should ensure threading protection.
+ */
+ private boolean persistConfig(CarUxRestrictionsConfiguration config, String filename) {
+ AtomicFile stagedFile = new AtomicFile(mContext.getFileStreamPath(filename));
+ FileOutputStream fos;
+ try {
+ fos = stagedFile.startWrite();
+ } catch (IOException e) {
+ Log.e(TAG, "Could not open file to persist config", e);
+ return false;
+ }
+ try (JsonWriter jsonWriter = new JsonWriter(
+ new OutputStreamWriter(fos, StandardCharsets.UTF_8))) {
+ config.writeJson(jsonWriter);
+ } catch (IOException e) {
+ Log.e(TAG, "Could not persist config", e);
+ stagedFile.failWrite(fos);
+ return false;
+ }
+ stagedFile.finishWrite(fos);
+ return true;
+ }
+
+ @Nullable
+ private CarUxRestrictionsConfiguration readPersistedConfig(File file) {
+ if (!file.exists()) {
+ Log.e(TAG, "Could not find config file: " + file.getName());
+ return null;
+ }
+
+ AtomicFile config = new AtomicFile(file);
+ try (JsonReader reader = new JsonReader(
+ new InputStreamReader(config.openRead(), StandardCharsets.UTF_8))) {
+ return CarUxRestrictionsConfiguration.readJson(reader);
+ } catch (IOException e) {
+ Log.e(TAG, "Could not read persisted config file " + file.getName(), e);
+ }
+ return null;
+ }
+
/**
* Enable/disable UX restrictions change broadcast blocking.
* Setting this to true will stop broadcasts of UX restriction change to listeners.
@@ -284,9 +504,7 @@
@Override
public void binderDied() {
- if (DBG) {
- Log.d(TAG, "Binder died " + listenerBinder);
- }
+ logd("Binder died " + listenerBinder);
listenerBinder.unlinkToDeath(this, 0);
synchronized (CarUxRestrictionsManagerService.this) {
mUxRClients.remove(this);
@@ -315,9 +533,7 @@
try {
listener.onUxRestrictionsChanged(event);
} catch (RemoteException e) {
- if (DBG) {
- Log.d(TAG, "Dispatch to listener failed");
- }
+ Log.e(TAG, "Dispatch to listener failed", e);
}
}
}
@@ -330,7 +546,7 @@
if (isDebugBuild()) {
writer.println("mUxRChangeBroadcastEnabled? " + mUxRChangeBroadcastEnabled);
}
- mHelper.dump(writer);
+ mCarUxRestrictionsConfiguration.dump(writer);
writer.println("UX Restriction change log:");
for (Utils.TransitionLog tlog : mTransitionLogs) {
writer.println(tlog);
@@ -345,9 +561,7 @@
new ICarDrivingStateChangeListener.Stub() {
@Override
public void onDrivingStateChanged(CarDrivingStateEvent event) {
- if (DBG) {
- Log.d(TAG, "Driving State Changed:" + event.eventValue);
- }
+ logd("Driving State Changed:" + event.eventValue);
handleDrivingStateEvent(event);
}
};
@@ -370,9 +584,7 @@
|| drivingState == CarDrivingStateEvent.DRIVING_STATE_UNKNOWN) {
// If speed is unavailable, but the driving state is parked or unknown, it can still be
// handled.
- if (DBG) {
- Log.d(TAG, "Speed null when driving state is: " + drivingState);
- }
+ logd("Speed null when driving state is: " + drivingState);
mCurrentMovingSpeed = 0;
} else {
// If we get here with driving state != parked or unknown && speed == null,
@@ -430,14 +642,8 @@
return;
}
- CarUxRestrictions uxRestrictions;
- // Get UX restrictions from the parsed configuration XML or fall back to defaults if not
- // available.
- if (mFallbackToDefaults) {
- uxRestrictions = getDefaultRestrictions(currentDrivingState);
- } else {
- uxRestrictions = mHelper.getUxRestrictions(currentDrivingState, speed);
- }
+ CarUxRestrictions uxRestrictions =
+ mCarUxRestrictionsConfiguration.getUxRestrictions(currentDrivingState, speed);
if (DBG) {
Log.d(TAG, String.format("DO old->new: %b -> %b",
@@ -464,31 +670,23 @@
extraInfo.toString());
mCurrentUxRestrictions = uxRestrictions;
- if (DBG) {
- Log.d(TAG, "dispatching to " + mUxRClients.size() + " clients");
- }
+ logd("dispatching to " + mUxRClients.size() + " clients");
for (UxRestrictionsClient client : mUxRClients) {
client.dispatchEventToClients(uxRestrictions);
}
}
- private CarUxRestrictions getDefaultRestrictions(@CarDrivingState int drivingState) {
- int restrictions;
- boolean requiresOpt = false;
- switch (drivingState) {
- case CarDrivingStateEvent.DRIVING_STATE_PARKED:
- restrictions = CarUxRestrictions.UX_RESTRICTIONS_BASELINE;
- break;
- case CarDrivingStateEvent.DRIVING_STATE_IDLING:
- restrictions = CarUxRestrictions.UX_RESTRICTIONS_BASELINE;
- requiresOpt = false;
- break;
- case CarDrivingStateEvent.DRIVING_STATE_MOVING:
- default:
- restrictions = CarUxRestrictions.UX_RESTRICTIONS_FULLY_RESTRICTED;
- requiresOpt = true;
- }
- return mHelper.createUxRestrictionsEvent(requiresOpt, restrictions);
+ CarUxRestrictionsConfiguration createDefaultConfig() {
+ return new CarUxRestrictionsConfiguration.Builder()
+ .setUxRestrictions(CarDrivingStateEvent.DRIVING_STATE_PARKED,
+ false, CarUxRestrictions.UX_RESTRICTIONS_BASELINE)
+ .setUxRestrictions(CarDrivingStateEvent.DRIVING_STATE_IDLING,
+ false, CarUxRestrictions.UX_RESTRICTIONS_BASELINE)
+ .setUxRestrictions(CarDrivingStateEvent.DRIVING_STATE_MOVING,
+ true, CarUxRestrictions.UX_RESTRICTIONS_FULLY_RESTRICTED)
+ .setUxRestrictions(CarDrivingStateEvent.DRIVING_STATE_UNKNOWN,
+ true, CarUxRestrictions.UX_RESTRICTIONS_FULLY_RESTRICTED)
+ .build();
}
private void addTransitionLog(String name, int from, int to, long timestamp, String extra) {
@@ -500,4 +698,9 @@
mTransitionLogs.add(tLog);
}
+ private static void logd(String msg) {
+ if (DBG) {
+ Log.d(TAG, msg);
+ }
+ }
}
diff --git a/service/src/com/android/car/CarVolumeGroup.java b/service/src/com/android/car/CarVolumeGroup.java
deleted file mode 100644
index 448979b..0000000
--- a/service/src/com/android/car/CarVolumeGroup.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.car.media.CarAudioManager;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.hardware.automotive.audiocontrol.V1_0.ContextNumber;
-import android.media.AudioDevicePort;
-import android.provider.Settings;
-import android.util.SparseArray;
-import android.util.SparseIntArray;
-
-import com.android.internal.util.Preconditions;
-
-import java.io.PrintWriter;
-import java.util.Arrays;
-
-/**
- * A class encapsulates a volume group in car.
- *
- * Volume in a car is controlled by group. A group holds one or more car audio contexts.
- * Call {@link CarAudioManager#getVolumeGroupCount()} to get the count of {@link CarVolumeGroup}
- * supported in a car.
- */
-/* package */ final class CarVolumeGroup {
-
- private final ContentResolver mContentResolver;
- private final int mId;
- private final int[] mContexts;
- private final SparseIntArray mContextToBus = new SparseIntArray();
- private final SparseArray<CarAudioDeviceInfo> mBusToCarAudioDeviceInfos = new SparseArray<>();
-
- private int mDefaultGain = Integer.MIN_VALUE;
- private int mMaxGain = Integer.MIN_VALUE;
- private int mMinGain = Integer.MAX_VALUE;
- private int mStepSize = 0;
- private int mStoredGainIndex;
- private int mCurrentGainIndex = -1;
-
- CarVolumeGroup(Context context, int id, @NonNull int[] contexts) {
- mContentResolver = context.getContentResolver();
- mId = id;
- mContexts = contexts;
-
- mStoredGainIndex = Settings.Global.getInt(mContentResolver,
- CarAudioManager.getVolumeSettingsKeyForGroup(mId), -1);;
- }
-
- int getId() {
- return mId;
- }
-
- int[] getContexts() {
- return mContexts;
- }
-
- int[] getBusNumbers() {
- final int[] busNumbers = new int[mBusToCarAudioDeviceInfos.size()];
- for (int i = 0; i < busNumbers.length; i++) {
- busNumbers[i] = mBusToCarAudioDeviceInfos.keyAt(i);
- }
- return busNumbers;
- }
-
- /**
- * Binds the context number to physical bus number and audio device port information.
- * Because this may change the groups min/max values, thus invalidating an index computed from
- * a gain before this call, all calls to this function must happen at startup before any
- * set/getGainIndex calls.
- *
- * @param contextNumber Context number as defined in audio control HAL
- * @param busNumber Physical bus number for the audio device port
- * @param info {@link CarAudioDeviceInfo} instance relates to the physical bus
- */
- void bind(int contextNumber, int busNumber, CarAudioDeviceInfo info) {
- if (mBusToCarAudioDeviceInfos.size() == 0) {
- mStepSize = info.getAudioGain().stepValue();
- } else {
- Preconditions.checkArgument(
- info.getAudioGain().stepValue() == mStepSize,
- "Gain controls within one group must have same step value");
- }
-
- mContextToBus.put(contextNumber, busNumber);
- mBusToCarAudioDeviceInfos.put(busNumber, info);
-
- if (info.getDefaultGain() > mDefaultGain) {
- // We're arbitrarily selecting the highest bus default gain as the group's default.
- mDefaultGain = info.getDefaultGain();
- }
- if (info.getMaxGain() > mMaxGain) {
- mMaxGain = info.getMaxGain();
- }
- if (info.getMinGain() < mMinGain) {
- mMinGain = info.getMinGain();
- }
- if (mStoredGainIndex < getMinGainIndex() || mStoredGainIndex > getMaxGainIndex()) {
- // We expected to load a value from last boot, but if we didn't (perhaps this is the
- // first boot ever?), then use the highest "default" we've seen to initialize
- // ourselves.
- mCurrentGainIndex = getIndexForGain(mDefaultGain);
- } else {
- // Just use the gain index we stored last time the gain was set (presumably during our
- // last boot cycle).
- mCurrentGainIndex = mStoredGainIndex;
- }
- }
-
- int getDefaultGainIndex() {
- return getIndexForGain(mDefaultGain);
- }
-
- int getMaxGainIndex() {
- return getIndexForGain(mMaxGain);
- }
-
- int getMinGainIndex() {
- return getIndexForGain(mMinGain);
- }
-
- int getCurrentGainIndex() {
- return mCurrentGainIndex;
- }
-
- void setCurrentGainIndex(int gainIndex) {
- int gainInMillibels = getGainForIndex(gainIndex);
-
- Preconditions.checkArgument(
- gainInMillibels >= mMinGain && gainInMillibels <= mMaxGain,
- "Gain out of range (" +
- mMinGain + ":" +
- mMaxGain +") " +
- gainInMillibels + "index " +
- gainIndex);
-
- for (int i = 0; i < mBusToCarAudioDeviceInfos.size(); i++) {
- CarAudioDeviceInfo info = mBusToCarAudioDeviceInfos.valueAt(i);
- info.setCurrentGain(gainInMillibels);
- }
-
- mCurrentGainIndex = gainIndex;
- Settings.Global.putInt(mContentResolver,
- CarAudioManager.getVolumeSettingsKeyForGroup(mId), gainIndex);
- }
-
- // Given a group level gain index, return the computed gain in millibells
- // TODO (randolphs) If we ever want to add index to gain curves other than lock-stepped
- // linear, this would be the place to do it.
- private int getGainForIndex(int gainIndex) {
- return mMinGain + gainIndex * mStepSize;
- }
-
- // TODO (randolphs) if we ever went to a non-linear index to gain curve mapping, we'd need to
- // revisit this as it assumes (at the least) that getGainForIndex is reversible. Luckily,
- // this is an internal implementation details we could factor out if/when necessary.
- private int getIndexForGain(int gainInMillibel) {
- return (gainInMillibel - mMinGain) / mStepSize;
- }
-
- @Nullable
- AudioDevicePort getAudioDevicePortForContext(int contextNumber) {
- final int busNumber = mContextToBus.get(contextNumber, -1);
- if (busNumber < 0 || mBusToCarAudioDeviceInfos.get(busNumber) == null) {
- return null;
- }
- return mBusToCarAudioDeviceInfos.get(busNumber).getAudioDevicePort();
- }
-
- @Override
- public String toString() {
- return "CarVolumeGroup id: " + mId
- + " currentGainIndex: " + mCurrentGainIndex
- + " contexts: " + Arrays.toString(mContexts)
- + " buses: " + Arrays.toString(getBusNumbers());
- }
-
- void dump(PrintWriter writer) {
- writer.println("CarVolumeGroup " + mId);
- writer.printf("\tGain in millibel (min / max / default/ current): %d %d %d %d\n",
- mMinGain, mMaxGain, mDefaultGain, getGainForIndex(mCurrentGainIndex));
- writer.printf("\tGain in index (min / max / default / current): %d %d %d %d\n",
- getMinGainIndex(), getMaxGainIndex(), getDefaultGainIndex(), mCurrentGainIndex);
- for (int i = 0; i < mContextToBus.size(); i++) {
- writer.printf("\tContext: %s -> Bus: %d\n",
- ContextNumber.toString(mContextToBus.keyAt(i)), mContextToBus.valueAt(i));
- }
- for (int i = 0; i < mBusToCarAudioDeviceInfos.size(); i++) {
- mBusToCarAudioDeviceInfos.valueAt(i).dump(writer);
- }
- // Empty line for comfortable reading
- writer.println();
- }
-}
diff --git a/service/src/com/android/car/CarVolumeGroupsHelper.java b/service/src/com/android/car/CarVolumeGroupsHelper.java
deleted file mode 100644
index af2c6dd..0000000
--- a/service/src/com/android/car/CarVolumeGroupsHelper.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.car;
-
-import android.annotation.XmlRes;
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.content.res.XmlResourceParser;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.util.Xml;
-
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-/* package */ class CarVolumeGroupsHelper {
-
- private static final String TAG_VOLUME_GROUPS = "volumeGroups";
- private static final String TAG_GROUP = "group";
- private static final String TAG_CONTEXT = "context";
-
- private final Context mContext;
- private final @XmlRes int mXmlConfiguration;
-
- CarVolumeGroupsHelper(Context context, @XmlRes int xmlConfiguration) {
- mContext = context;
- mXmlConfiguration = xmlConfiguration;
- }
-
- CarVolumeGroup[] loadVolumeGroups() {
- List<CarVolumeGroup> carVolumeGroups = new ArrayList<>();
- try (XmlResourceParser parser = mContext.getResources().getXml(mXmlConfiguration)) {
- AttributeSet attrs = Xml.asAttributeSet(parser);
- int type;
- // Traverse to the first start tag
- while ((type=parser.next()) != XmlResourceParser.END_DOCUMENT
- && type != XmlResourceParser.START_TAG) {
- }
-
- if (!TAG_VOLUME_GROUPS.equals(parser.getName())) {
- throw new RuntimeException("Meta-data does not start with volumeGroups tag");
- }
- int outerDepth = parser.getDepth();
- int id = 0;
- while ((type=parser.next()) != XmlResourceParser.END_DOCUMENT
- && (type != XmlResourceParser.END_TAG || parser.getDepth() > outerDepth)) {
- if (type == XmlResourceParser.END_TAG) {
- continue;
- }
- if (TAG_GROUP.equals(parser.getName())) {
- carVolumeGroups.add(parseVolumeGroup(id, attrs, parser));
- id++;
- }
- }
- } catch (Exception e) {
- Log.e(CarLog.TAG_AUDIO, "Error parsing volume groups configuration", e);
- }
- return carVolumeGroups.toArray(new CarVolumeGroup[carVolumeGroups.size()]);
- }
-
- private CarVolumeGroup parseVolumeGroup(int id, AttributeSet attrs, XmlResourceParser parser)
- throws XmlPullParserException, IOException {
- int type;
-
- List<Integer> contexts = new ArrayList<>();
- int innerDepth = parser.getDepth();
- while ((type=parser.next()) != XmlResourceParser.END_DOCUMENT
- && (type != XmlResourceParser.END_TAG || parser.getDepth() > innerDepth)) {
- if (type == XmlResourceParser.END_TAG) {
- continue;
- }
- if (TAG_CONTEXT.equals(parser.getName())) {
- TypedArray c = mContext.getResources().obtainAttributes(
- attrs, R.styleable.volumeGroups_context);
- contexts.add(c.getInt(R.styleable.volumeGroups_context_context, -1));
- c.recycle();
- }
- }
-
- return new CarVolumeGroup(mContext, id,
- contexts.stream().mapToInt(i -> i).filter(i -> i >= 0).toArray());
- }
-}
diff --git a/service/src/com/android/car/DeviceIdleControllerWrapper.java b/service/src/com/android/car/DeviceIdleControllerWrapper.java
deleted file mode 100644
index 0ed1b78..0000000
--- a/service/src/com/android/car/DeviceIdleControllerWrapper.java
+++ /dev/null
@@ -1,95 +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.car;
-
-import android.os.Handler;
-import android.os.Message;
-import android.util.Log;
-
-import com.android.internal.annotations.GuardedBy;
-import com.android.internal.annotations.VisibleForTesting;
-
-import java.lang.ref.WeakReference;
-
-/**
-* An wrapper class that can be backed by a real DeviceIdleController or a mocked one.
-*/
-public abstract class DeviceIdleControllerWrapper {
- private static final String TAG = "Garage_DeviceIdleWrapper";
-
- private static final int MSG_REPORT_ACTIVE = 1;
-
- @VisibleForTesting
- protected WeakReference<DeviceMaintenanceActivityListener> mListener;
-
- public interface DeviceMaintenanceActivityListener {
- public void onMaintenanceActivityChanged(boolean active);
- }
- private final Object mLock = new Object();
- @GuardedBy("mLock")
- private boolean mActive;
-
- private Handler mHandler = new IdleControllerHandler();
-
- private class IdleControllerHandler extends Handler {
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case MSG_REPORT_ACTIVE:
- boolean active = msg.arg1 == 1;
- if (mListener.get() != null) {
- mListener.get().onMaintenanceActivityChanged(active);
- }
- break;
- }
- }
- }
-
- public boolean startTracking(DeviceMaintenanceActivityListener listener) {
- synchronized (mLock) {
- mListener = new WeakReference<DeviceMaintenanceActivityListener>(listener);
- mActive = startLocked();
- return mActive;
- }
- }
-
- protected abstract boolean startLocked();
-
- public abstract void stopTracking();
-
- @VisibleForTesting
- protected void reportActiveLocked(final boolean active) {
- // post to a handler instead of calling the callback directly to avoid potential deadlock.
- mHandler.sendMessage(mHandler.obtainMessage(MSG_REPORT_ACTIVE, active ? 1 : 0, 0));
- }
-
- @VisibleForTesting
- protected void setMaintenanceActivity(final boolean active) {
- synchronized (mLock) {
- if (mActive == active) {
- return;
- }
- mActive = active;
-
- if (mListener.get() == null) {
- // do cleanup if the listener has gone and did not call release.
- stopTracking();
- return;
- }
- reportActiveLocked(active);
- }
- }
-}
diff --git a/service/src/com/android/car/ICarImpl.java b/service/src/com/android/car/ICarImpl.java
index 67c50a7..adcedf3 100644
--- a/service/src/com/android/car/ICarImpl.java
+++ b/service/src/com/android/car/ICarImpl.java
@@ -21,7 +21,7 @@
import android.car.Car;
import android.car.ICar;
import android.car.cluster.renderer.IInstrumentClusterNavigation;
-import android.car.user.CarUserManagerHelper;
+import android.car.userlib.CarUserManagerHelper;
import android.content.Context;
import android.content.pm.PackageManager;
import android.hardware.automotive.vehicle.V2_0.IVehicle;
@@ -35,12 +35,14 @@
import android.util.Slog;
import android.util.TimingsTraceLog;
+import com.android.car.audio.CarAudioService;
import com.android.car.cluster.InstrumentClusterService;
import com.android.car.garagemode.GarageModeService;
import com.android.car.hal.VehicleHal;
import com.android.car.internal.FeatureConfiguration;
import com.android.car.pm.CarPackageManagerService;
import com.android.car.systeminterface.SystemInterface;
+import com.android.car.trust.CarTrustAgentEnrollmentService;
import com.android.car.user.CarUserService;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.car.ICarServiceHelper;
@@ -82,6 +84,7 @@
private final CarDiagnosticService mCarDiagnosticService;
private final CarStorageMonitoringService mCarStorageMonitoringService;
private final CarConfigurationService mCarConfigurationService;
+ private final CarTrustAgentEnrollmentService mCarTrustAgentEnrollmentService;
private final CarUserManagerHelper mUserManagerHelper;
private CarUserService mCarUserService;
@@ -92,8 +95,8 @@
private static final String TAG = "ICarImpl";
private static final String VHAL_TIMING_TAG = "VehicleHalTiming";
- private static final TimingsTraceLog mBootTiming = new TimingsTraceLog(VHAL_TIMING_TAG,
- Trace.TRACE_TAG_HAL);
+
+ private TimingsTraceLog mBootTiming;
/** Test only service. Populate it only when necessary. */
@GuardedBy("this")
@@ -110,26 +113,27 @@
mSystemInterface = systemInterface;
mHal = new VehicleHal(vehicle);
mVehicleInterfaceName = vehicleInterfaceName;
+ mUserManagerHelper = new CarUserManagerHelper(serviceContext);
mSystemActivityMonitoringService = new SystemActivityMonitoringService(serviceContext);
mCarPowerManagementService = new CarPowerManagementService(mContext, mHal.getPowerHal(),
systemInterface);
mCarPropertyService = new CarPropertyService(serviceContext, mHal.getPropertyHal());
mCarDrivingStateService = new CarDrivingStateService(serviceContext, mCarPropertyService);
mCarUXRestrictionsService = new CarUxRestrictionsManagerService(serviceContext,
- mCarDrivingStateService, mCarPropertyService);
+ mCarDrivingStateService, mCarPropertyService, mUserManagerHelper);
mCarPackageManagerService = new CarPackageManagerService(serviceContext,
mCarUXRestrictionsService,
mSystemActivityMonitoringService);
mCarInputService = new CarInputService(serviceContext, mHal.getInputHal());
mCarProjectionService = new CarProjectionService(serviceContext, mCarInputService);
- mGarageModeService = new GarageModeService(mContext, mCarPowerManagementService);
+ mGarageModeService = new GarageModeService(mContext);
mAppFocusService = new AppFocusService(serviceContext, mSystemActivityMonitoringService);
mCarAudioService = new CarAudioService(serviceContext);
mCarNightService = new CarNightService(serviceContext, mCarPropertyService);
mInstrumentClusterService = new InstrumentClusterService(serviceContext,
mAppFocusService, mCarInputService);
- mSystemStateControllerService = new SystemStateControllerService(serviceContext,
- mCarPowerManagementService, mCarAudioService, this);
+ mSystemStateControllerService = new SystemStateControllerService(
+ serviceContext, mCarAudioService, this);
mPerUserCarServiceHelper = new PerUserCarServiceHelper(serviceContext);
mCarBluetoothService = new CarBluetoothService(serviceContext, mCarPropertyService,
mPerUserCarServiceHelper, mCarUXRestrictionsService);
@@ -140,9 +144,9 @@
systemInterface);
mCarConfigurationService =
new CarConfigurationService(serviceContext, new JsonReaderImpl());
- mUserManagerHelper = new CarUserManagerHelper(serviceContext);
- mCarLocationService = new CarLocationService(mContext, mCarPowerManagementService,
- mCarPropertyService, mUserManagerHelper);
+ mCarLocationService = new CarLocationService(
+ mContext, mCarPropertyService, mUserManagerHelper);
+ mCarTrustAgentEnrollmentService = new CarTrustAgentEnrollmentService(serviceContext);
// Be careful with order. Service depending on other service should be inited later.
List<CarServiceBase> allServices = new ArrayList<>();
@@ -167,18 +171,17 @@
allServices.add(mCarConfigurationService);
allServices.add(mVmsSubscriberService);
allServices.add(mVmsPublisherService);
-
+ allServices.add(mCarTrustAgentEnrollmentService);
if (mUserManagerHelper.isHeadlessSystemUser()) {
- mCarUserService = new CarUserService(serviceContext, mUserManagerHelper);
- allServices.add(mCarUserService);
+ allServices.add(new CarUserService(serviceContext, mUserManagerHelper));
}
-
allServices.add(mCarLocationService);
mAllServices = allServices.toArray(new CarServiceBase[allServices.size()]);
}
@MainThread
void init() {
+ mBootTiming = new TimingsTraceLog(VHAL_TIMING_TAG, Trace.TRACE_TAG_HAL);
traceBegin("VehicleHal.init");
mHal.init();
traceEnd();
@@ -273,6 +276,9 @@
return mCarUXRestrictionsService;
case Car.CAR_CONFIGURATION_SERVICE:
return mCarConfigurationService;
+ case Car.CAR_TRUST_AGENT_ENROLLMENT_SERVICE:
+ assertTrustAgentEnrollmentPermission(mContext);
+ return mCarTrustAgentEnrollmentService;
default:
Log.w(CarLog.TAG_SERVICE, "getCarService for unknown service:" + serviceName);
return null;
@@ -335,6 +341,14 @@
assertPermission(context, Car.PERMISSION_VMS_SUBSCRIBER);
}
+ /**
+ * Ensures the caller has the permission to enroll a Trust Agent.
+ * @param context
+ */
+ public static void assertTrustAgentEnrollmentPermission(Context context) {
+ assertPermission(context, Car.PERMISSION_CAR_ENROLL_TRUST);
+ }
+
public static void assertPermission(Context context, String permission) {
if (context.checkCallingOrSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
throw new SecurityException("requires " + permission);
@@ -413,13 +427,13 @@
}
@MainThread
- private static void traceBegin(String name) {
+ private void traceBegin(String name) {
Slog.i(TAG, name);
mBootTiming.traceBegin(name);
}
@MainThread
- private static void traceEnd() {
+ private void traceEnd() {
mBootTiming.traceEnd();
}
@@ -563,10 +577,10 @@
private void forceGarageMode(String arg, PrintWriter writer) {
switch (arg) {
case PARAM_ON_MODE:
- mGarageModeService.onPrepareShutdown(false);
+ mGarageModeService.forceStartGarageMode();
break;
case PARAM_OFF_MODE:
- mGarageModeService.onSleepEntry();
+ mGarageModeService.stopAndResetGarageMode();
break;
case PARAM_QUERY_MODE:
// Nothing to do. Always query at the end anyway.
@@ -576,7 +590,7 @@
+ PARAM_OFF_MODE + "|" + PARAM_QUERY_MODE);
return;
}
- writer.println("Garage mode: " + mGarageModeService.isInGarageMode());
+ writer.println("Garage mode: " + mGarageModeService.isGarageModeActive());
}
/**
diff --git a/service/src/com/android/car/SetMultimap.java b/service/src/com/android/car/SetMultimap.java
new file mode 100644
index 0000000..48e8739
--- /dev/null
+++ b/service/src/com/android/car/SetMultimap.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * A simple implementation of a multimap that maps keys to sets of values.
+ *
+ * This class is (and should remain) drop-in replaceable with Guava's SetMultimap.
+ *
+ * @param <K> The type of the keys in the map.
+ * @param <V> The type of the values in the map.
+ */
+public class SetMultimap<K, V> {
+ private Map<K, Set<V>> mMap;
+
+ /** Creates a new {@link #SetMultimap}. */
+ public SetMultimap() {
+ mMap = new HashMap<>();
+ }
+
+ /** Gets the set of values associated with a given key. */
+ public Set<V> get(K key) {
+ return Collections.unmodifiableSet(mMap.getOrDefault(key, Collections.emptySet()));
+ }
+
+ /** Adds a value to the set associated with a key. */
+ public boolean put(K key, V value) {
+ return mMap.computeIfAbsent(key, k -> new HashSet<>()).add(value);
+ }
+
+ /** Checks if the multimap contains the given key and value. */
+ public boolean containsEntry(K key, V value) {
+ Set<V> set = mMap.get(key);
+ return set != null && set.contains(value);
+ }
+
+ /** Removes the given value from the set of the given key. */
+ public boolean remove(K key, V value) {
+ Set<V> set = mMap.get(key);
+ if (set == null) {
+ return false;
+ }
+
+ boolean removed = set.remove(value);
+ if (set.isEmpty()) {
+ mMap.remove(key);
+ }
+ return removed;
+ }
+
+ /** Clears all entries in the map. */
+ public void clear() {
+ mMap.clear();
+ }
+
+ /** Gets the set of keys stored in the map. */
+ public Set<K> keySet() {
+ return Collections.unmodifiableSet(mMap.keySet());
+ }
+}
diff --git a/service/src/com/android/car/SystemActivityMonitoringService.java b/service/src/com/android/car/SystemActivityMonitoringService.java
index 2df9b00..468dde4 100644
--- a/service/src/com/android/car/SystemActivityMonitoringService.java
+++ b/service/src/com/android/car/SystemActivityMonitoringService.java
@@ -85,6 +85,7 @@
void onActivityLaunch(TopTaskInfoContainer topTask);
}
+ private static final int INVALID_STACK_ID = -1;
private final Context mContext;
private final IActivityManager mAm;
private final ProcessObserver mProcessObserver;
@@ -97,7 +98,7 @@
private final SparseArray<TopTaskInfoContainer> mTopTasks = new SparseArray<>();
/** K: uid, V : list of pid */
private final Map<Integer, Set<Integer>> mForegroundUidPids = new ArrayMap<>();
- private int mFocusedStackId = -1;
+ private int mFocusedStackId = INVALID_STACK_ID;
/**
* Temporary container to dispatch tasks for onActivityLaunch. Only used in handler thread.
@@ -253,7 +254,7 @@
Log.e(CarLog.TAG_AM, "cannot getTasks", e);
return;
}
- int focusedStackId = -1;
+ int focusedStackId = INVALID_STACK_ID;
try {
// TODO(b/66955160): Someone on the Auto-team should probably re-work the code in the
// synchronized block below based on this new API.
@@ -269,10 +270,13 @@
ActivityLaunchListener listener;
synchronized (this) {
listener = mActivityLaunchListener;
+ Set<Integer> allStackIds = new ArraySet<>(infos.size());
+ Set<Integer> stackIdsToRemove = new ArraySet<>(infos.size());
for (StackInfo info : infos) {
int stackId = info.stackId;
+ allStackIds.add(info.stackId);
if (info.taskNames.length == 0 || !info.visible) { // empty stack or not shown
- mTopTasks.remove(stackId);
+ stackIdsToRemove.add(stackId);
continue;
}
TopTaskInfoContainer newTopTaskInfo = new TopTaskInfoContainer(
@@ -290,6 +294,19 @@
}
}
}
+ for (int i = 0; i < mTopTasks.size(); i++) {
+ TopTaskInfoContainer topTask = mTopTasks.valueAt(i);
+ if (topTask == null) {
+ Log.wtf(CarLog.TAG_AM, "unexpected null value in sparse array");
+ continue;
+ }
+ if (!allStackIds.contains(mTopTasks.keyAt(i))) {
+ stackIdsToRemove.add(mTopTasks.keyAt(i));
+ }
+ }
+ for (int stackIdToRemove : stackIdsToRemove) {
+ mTopTasks.remove(stackIdToRemove);
+ }
mFocusedStackId = focusedStackId;
}
if (listener != null) {
diff --git a/service/src/com/android/car/SystemStateControllerService.java b/service/src/com/android/car/SystemStateControllerService.java
index 53d74a3..c15ab6d 100644
--- a/service/src/com/android/car/SystemStateControllerService.java
+++ b/service/src/com/android/car/SystemStateControllerService.java
@@ -18,23 +18,17 @@
import android.content.Context;
import android.content.res.Resources;
-import com.android.car.CarPowerManagementService.PowerEventProcessingHandler;
-import com.android.car.CarPowerManagementService.PowerServiceEventListener;
+import com.android.car.audio.CarAudioService;
import java.io.PrintWriter;
-public class SystemStateControllerService implements CarServiceBase,
- PowerServiceEventListener, PowerEventProcessingHandler {
-
- private final CarPowerManagementService mCarPowerManagementService;
+public class SystemStateControllerService implements CarServiceBase {
private final CarAudioService mCarAudioService;
private final ICarImpl mICarImpl;
private final boolean mLockWhenMuting;
- public SystemStateControllerService(Context context,
- CarPowerManagementService carPowerManagementService,
- CarAudioService carAudioService, ICarImpl carImpl) {
- mCarPowerManagementService = carPowerManagementService;
+ public SystemStateControllerService(
+ Context context, CarAudioService carAudioService, ICarImpl carImpl) {
mCarAudioService = carAudioService;
mICarImpl = carImpl;
Resources res = context.getResources();
@@ -42,40 +36,7 @@
}
@Override
- public long onPrepareShutdown(boolean shuttingDown) {
- //TODO add state saving here for things to restore on power on. bug: 32096079
- return 0;
- }
-
- @Override
- public void onPowerOn(boolean displayOn) {
- // TODO may consider mute / unmute the system based on displayOn
- }
-
- @Override
- public int getWakeupTime() {
- return 0;
- }
-
- @Override
- public void onShutdown() {
- // TODO bug: 32096079
- }
-
- @Override
- public void onSleepEntry() {
- // TODO bug: 32096079
- }
-
- @Override
- public void onSleepExit() {
- // TODO bug: 32096079
- }
-
- @Override
public void init() {
- mCarPowerManagementService.registerPowerEventListener(this);
- mCarPowerManagementService.registerPowerEventProcessingHandler(this);
}
@Override
diff --git a/service/src/com/android/car/Utils.java b/service/src/com/android/car/Utils.java
index 78f5a8e..284e610 100644
--- a/service/src/com/android/car/Utils.java
+++ b/service/src/com/android/car/Utils.java
@@ -10,6 +10,9 @@
static final Boolean DBG = false;
static String getDeviceDebugInfo(BluetoothDevice device) {
+ if (device == null) {
+ return "(null)";
+ }
return "(name = " + device.getName() + ", addr = " + device.getAddress() + ")";
}
diff --git a/service/src/com/android/car/VmsPublisherService.java b/service/src/com/android/car/VmsPublisherService.java
index a240e17..9ffecf0 100644
--- a/service/src/com/android/car/VmsPublisherService.java
+++ b/service/src/com/android/car/VmsPublisherService.java
@@ -28,8 +28,6 @@
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
@@ -38,14 +36,12 @@
import android.os.UserHandle;
import android.text.TextUtils;
import android.util.ArrayMap;
-import android.util.ArraySet;
import android.util.Log;
import com.android.car.hal.VmsHalService;
import com.android.car.hal.VmsHalService.VmsHalPublisherListener;
import java.io.PrintWriter;
-import java.util.Arrays;
import java.util.Map;
import java.util.Set;
@@ -64,7 +60,6 @@
private final VmsHalService mHal;
private final Map<String, PublisherConnection> mPublisherConnectionMap = new ArrayMap<>();
private final Map<String, IVmsPublisherClient> mPublisherMap = new ArrayMap<>();
- private final Set<String> mSafePermissions;
private final Handler mHandler = new EventHandler();
private final VmsHalPublisherListener mHalPublisherListener;
@@ -76,10 +71,6 @@
mHalPublisherListener = subscriptionState -> mHandler.sendMessage(
mHandler.obtainMessage(MSG_HAL_SUBSCRIPTION_CHANGED, subscriptionState));
-
- // Load permissions that can be granted to publishers.
- mSafePermissions = new ArraySet<>(
- Arrays.asList(mContext.getResources().getStringArray(R.array.vmsSafePermissions)));
}
// Implements CarServiceBase interface.
@@ -105,6 +96,8 @@
mContext.registerReceiver(mBootCompleteReceiver,
new IntentFilter(Intent.ACTION_LOCKED_BOOT_COMPLETED));
}
+ // Signal to publishers that the PublisherService is ready.
+ mHal.signalPublisherServiceIsReady();
}
private void bindToAllPublishers() {
@@ -150,7 +143,6 @@
@Override
public void dump(PrintWriter writer) {
writer.println("*" + getClass().getSimpleName() + "*");
- writer.println("mSafePermissions: " + mSafePermissions);
writer.println("mPublisherMap:" + mPublisherMap);
writer.println("mPublisherConnectionMap:" + mPublisherConnectionMap);
}
@@ -219,11 +211,13 @@
*/
private void handleHalSubscriptionChanged(VmsSubscriptionState subscriptionState) {
// Send the message to application listeners.
- for (IVmsPublisherClient client : mPublisherMap.values()) {
- try {
- client.onVmsSubscriptionChange(subscriptionState);
- } catch (RemoteException ex) {
- Log.e(TAG, "unable to send notification to: " + client, ex);
+ synchronized (mPublisherMap) {
+ for (IVmsPublisherClient client : mPublisherMap.values()) {
+ try {
+ client.onVmsSubscriptionChange(subscriptionState);
+ } catch (RemoteException ex) {
+ Log.e(TAG, "unable to send notification to: " + client, ex);
+ }
}
}
}
@@ -243,7 +237,6 @@
// Already registered, nothing to do.
return;
}
- grantPermissions(name);
Intent intent = new Intent();
intent.setComponent(name);
PublisherConnection connection = new PublisherConnection(name);
@@ -276,41 +269,9 @@
}
}
- private void grantPermissions(ComponentName component) {
- final PackageManager packageManager = mContext.getPackageManager();
- final String packageName = component.getPackageName();
- PackageInfo packageInfo;
- try {
- packageInfo = packageManager.getPackageInfo(packageName,
- PackageManager.GET_PERMISSIONS);
- } catch (PackageManager.NameNotFoundException e) {
- Log.e(TAG, "Error getting package info for " + packageName, e);
- return;
- }
- if (packageInfo.requestedPermissions == null) return;
- for (String permission : packageInfo.requestedPermissions) {
- if (!mSafePermissions.contains(permission)) {
- continue;
- }
- if (packageManager.checkPermission(permission, packageName)
- == PackageManager.PERMISSION_GRANTED) {
- continue;
- }
- try {
- packageManager.grantRuntimePermission(packageName, permission,
- UserHandle.SYSTEM);
- Log.d(TAG, "Permission " + permission + " granted to " + packageName);
- } catch (SecurityException | IllegalArgumentException e) {
- Log.e(TAG, "Error while trying to grant " + permission + " to " + packageName,
- e);
- }
- }
- }
-
private boolean isTestEnvironment() {
- // If the context is derived from other package it means we're running under
- // environment.
- return !TextUtils.equals(mContext.getBasePackageName(), mContext.getPackageName());
+ // If the context has "test" in it.
+ return mContext.getBasePackageName().contains("test");
}
class PublisherConnection implements ServiceConnection {
diff --git a/service/src/com/android/car/VmsRouting.java b/service/src/com/android/car/VmsRouting.java
index fa29a27..92549cc 100644
--- a/service/src/com/android/car/VmsRouting.java
+++ b/service/src/com/android/car/VmsRouting.java
@@ -24,10 +24,8 @@
import com.android.internal.annotations.GuardedBy;
-import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
-import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
@@ -410,4 +408,4 @@
return new VmsSubscriptionState(mSequenceNumber, layers, layersFromPublishers);
}
}
-}
\ No newline at end of file
+}
diff --git a/service/src/com/android/car/VmsSubscriberService.java b/service/src/com/android/car/VmsSubscriberService.java
index c4c507e..213757c 100644
--- a/service/src/com/android/car/VmsSubscriberService.java
+++ b/service/src/com/android/car/VmsSubscriberService.java
@@ -124,18 +124,20 @@
public void add(IVmsSubscriberClient subscriber) {
ICarImpl.assertVmsSubscriberPermission(mContext);
if (subscriber == null) {
- Log.e(TAG, "register: subscriber is null.");
+ Log.e(TAG, "Trying to add a null subscriber.");
throw new IllegalArgumentException("subscriber cannot be null.");
}
- if (DBG) {
- Log.d(TAG, "register: " + subscriber);
- }
IBinder subscriberBinder = subscriber.asBinder();
synchronized (mListenerManagerLock) {
if (mSubscriberMap.containsKey(subscriberBinder)) {
- // Already registered, nothing to do.
+ if (DBG) {
+ Log.d(TAG, "Subscriber already registered: " + subscriber);
+ }
return;
}
+ if (DBG) {
+ Log.d(TAG, "Registering subscriber: " + subscriber);
+ }
ListenerDeathRecipient deathRecipient =
new ListenerDeathRecipient(subscriberBinder);
try {
@@ -203,6 +205,9 @@
@Override
public void init() {
mHal.addSubscriberListener(this);
+
+ // Signal to subscribers that the SubscriberService is ready.
+ mHal.signalSubscriberServiceIsReady();
}
@Override
diff --git a/service/src/com/android/car/audio/CarAudioDeviceInfo.java b/service/src/com/android/car/audio/CarAudioDeviceInfo.java
new file mode 100644
index 0000000..f45f48e
--- /dev/null
+++ b/service/src/com/android/car/audio/CarAudioDeviceInfo.java
@@ -0,0 +1,258 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.audio;
+
+import android.media.AudioDeviceInfo;
+import android.media.AudioDevicePort;
+import android.media.AudioFormat;
+import android.media.AudioGain;
+import android.media.AudioGainConfig;
+import android.media.AudioManager;
+import android.media.AudioPort;
+import android.util.Log;
+
+import com.android.car.CarLog;
+import com.android.internal.util.Preconditions;
+
+import java.io.PrintWriter;
+
+/**
+ * A helper class wraps {@link AudioDeviceInfo}, and helps get/set the gain on a specific port
+ * in terms of millibels.
+ * Note to the reader. For whatever reason, it seems that AudioGain contains only configuration
+ * information (min/max/step, etc) while the AudioGainConfig class contains the
+ * actual currently active gain value(s).
+ */
+/* package */ class CarAudioDeviceInfo {
+
+ /**
+ * Parse device address. Expected format is BUS%d_%s, address, usage hint
+ * @return valid address (from 0 to positive) or -1 for invalid address.
+ */
+ static int parseDeviceAddress(String address) {
+ String[] words = address.split("_");
+ int addressParsed = -1;
+ if (words[0].toLowerCase().startsWith("bus")) {
+ try {
+ addressParsed = Integer.parseInt(words[0].substring(3));
+ } catch (NumberFormatException e) {
+ //ignore
+ }
+ }
+ if (addressParsed < 0) {
+ return -1;
+ }
+ return addressParsed;
+ }
+
+ private final AudioDeviceInfo mAudioDeviceInfo;
+ private final int mBusNumber;
+ private final int mSampleRate;
+ private final int mEncodingFormat;
+ private final int mChannelCount;
+ private final int mDefaultGain;
+ private final int mMaxGain;
+ private final int mMinGain;
+
+ /**
+ * We need to store the current gain because it is not accessible from the current
+ * audio engine implementation. It would be nice if AudioPort#activeConfig() would return it,
+ * but in the current implementation, that function actually works only for mixer ports.
+ */
+ private int mCurrentGain;
+
+ CarAudioDeviceInfo(AudioDeviceInfo audioDeviceInfo) {
+ mAudioDeviceInfo = audioDeviceInfo;
+ mBusNumber = parseDeviceAddress(audioDeviceInfo.getAddress());
+ mSampleRate = getMaxSampleRate(audioDeviceInfo);
+ mEncodingFormat = getEncodingFormat(audioDeviceInfo);
+ mChannelCount = getMaxChannels(audioDeviceInfo);
+ final AudioGain audioGain = Preconditions.checkNotNull(
+ getAudioGain(), "No audio gain on device port " + audioDeviceInfo);
+ mDefaultGain = audioGain.defaultValue();
+ mMaxGain = audioGain.maxValue();
+ mMinGain = audioGain.minValue();
+
+ mCurrentGain = -1; // Not initialized till explicitly set
+ }
+
+ AudioDeviceInfo getAudioDeviceInfo() {
+ return mAudioDeviceInfo;
+ }
+
+ AudioDevicePort getAudioDevicePort() {
+ return mAudioDeviceInfo.getPort();
+ }
+
+ int getBusNumber() {
+ return mBusNumber;
+ }
+
+ int getDefaultGain() {
+ return mDefaultGain;
+ }
+
+ int getMaxGain() {
+ return mMaxGain;
+ }
+
+ int getMinGain() {
+ return mMinGain;
+ }
+
+ int getSampleRate() {
+ return mSampleRate;
+ }
+
+ int getEncodingFormat() {
+ return mEncodingFormat;
+ }
+
+ int getChannelCount() {
+ return mChannelCount;
+ }
+
+ // Input is in millibels
+ void setCurrentGain(int gainInMillibels) {
+ // Clamp the incoming value to our valid range. Out of range values ARE legal input
+ if (gainInMillibels < mMinGain) {
+ gainInMillibels = mMinGain;
+ } else if (gainInMillibels > mMaxGain) {
+ gainInMillibels = mMaxGain;
+ }
+
+ // Push the new gain value down to our underlying port which will cause it to show up
+ // at the HAL.
+ AudioGain audioGain = getAudioGain();
+ if (audioGain == null) {
+ Log.e(CarLog.TAG_AUDIO, "getAudioGain() returned null.");
+ return;
+ }
+
+ // size of gain values is 1 in MODE_JOINT
+ AudioGainConfig audioGainConfig = audioGain.buildConfig(
+ AudioGain.MODE_JOINT,
+ audioGain.channelMask(),
+ new int[] { gainInMillibels },
+ 0);
+ if (audioGainConfig == null) {
+ Log.e(CarLog.TAG_AUDIO, "Failed to construct AudioGainConfig");
+ return;
+ }
+
+ int r = AudioManager.setAudioPortGain(getAudioDevicePort(), audioGainConfig);
+ if (r == AudioManager.SUCCESS) {
+ // Since we can't query for the gain on a device port later,
+ // we have to remember what we asked for
+ mCurrentGain = gainInMillibels;
+ } else {
+ Log.e(CarLog.TAG_AUDIO, "Failed to setAudioPortGain: " + r);
+ }
+ }
+
+ private int getMaxSampleRate(AudioDeviceInfo info) {
+ int[] sampleRates = info.getSampleRates();
+ if (sampleRates == null || sampleRates.length == 0) {
+ return 48000;
+ }
+ int sampleRate = sampleRates[0];
+ for (int i = 1; i < sampleRates.length; i++) {
+ if (sampleRates[i] > sampleRate) {
+ sampleRate = sampleRates[i];
+ }
+ }
+ return sampleRate;
+ }
+
+ /** Always returns {@link AudioFormat#ENCODING_PCM_16BIT} as for now */
+ private int getEncodingFormat(AudioDeviceInfo info) {
+ return AudioFormat.ENCODING_PCM_16BIT;
+ }
+
+ /**
+ * Gets the maximum channel count for a given {@link AudioDeviceInfo}
+ *
+ * @param info {@link AudioDeviceInfo} instance to get maximum channel count for
+ * @return Maximum channel count for a given {@link AudioDeviceInfo},
+ * 1 (mono) if there is no channel masks configured
+ */
+ private int getMaxChannels(AudioDeviceInfo info) {
+ int numChannels = 1;
+ int[] channelMasks = info.getChannelMasks();
+ if (channelMasks == null) {
+ return numChannels;
+ }
+ for (int channelMask : channelMasks) {
+ int currentNumChannels = Integer.bitCount(channelMask);
+ if (currentNumChannels > numChannels) {
+ numChannels = currentNumChannels;
+ }
+ }
+ return numChannels;
+ }
+
+ /**
+ * @return {@link AudioGain} with {@link AudioGain#MODE_JOINT} on a given {@link AudioPort}.
+ * This is useful for inspecting the configuration data associated with this gain controller
+ * (min/max/step/default).
+ */
+ AudioGain getAudioGain() {
+ final AudioDevicePort audioPort = getAudioDevicePort();
+ if (audioPort != null && audioPort.gains().length > 0) {
+ for (AudioGain audioGain : audioPort.gains()) {
+ if ((audioGain.mode() & AudioGain.MODE_JOINT) != 0) {
+ return checkAudioGainConfiguration(audioGain);
+ }
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Constraints applied to gain configuration, see also audio_policy_configuration.xml
+ */
+ private AudioGain checkAudioGainConfiguration(AudioGain audioGain) {
+ Preconditions.checkArgument(audioGain.maxValue() >= audioGain.minValue());
+ Preconditions.checkArgument((audioGain.defaultValue() >= audioGain.minValue())
+ && (audioGain.defaultValue() <= audioGain.maxValue()));
+ Preconditions.checkArgument(
+ ((audioGain.maxValue() - audioGain.minValue()) % audioGain.stepValue()) == 0);
+ Preconditions.checkArgument(
+ ((audioGain.defaultValue() - audioGain.minValue()) % audioGain.stepValue()) == 0);
+ return audioGain;
+ }
+
+ @Override
+ public String toString() {
+ return "bus number: " + mBusNumber
+ + " address: " + mAudioDeviceInfo.getAddress()
+ + " sampleRate: " + getSampleRate()
+ + " encodingFormat: " + getEncodingFormat()
+ + " channelCount: " + getChannelCount()
+ + " currentGain: " + mCurrentGain
+ + " maxGain: " + mMaxGain
+ + " minGain: " + mMinGain;
+ }
+
+ void dump(String indent, PrintWriter writer) {
+ writer.printf("%sCarAudioDeviceInfo Bus(%d: %s)\n ",
+ indent, mBusNumber, mAudioDeviceInfo.getAddress());
+ writer.printf("%s\tsample rate / encoding format / channel count: %d %d %d\n",
+ indent, getSampleRate(), getEncodingFormat(), getChannelCount());
+ writer.printf("%s\tGain values (min / max / default/ current): %d %d %d %d\n",
+ indent, mMinGain, mMaxGain, mDefaultGain, mCurrentGain);
+ }
+}
diff --git a/service/src/com/android/car/audio/CarAudioDynamicRouting.java b/service/src/com/android/car/audio/CarAudioDynamicRouting.java
new file mode 100644
index 0000000..73b810c
--- /dev/null
+++ b/service/src/com/android/car/audio/CarAudioDynamicRouting.java
@@ -0,0 +1,162 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.audio;
+
+import android.hardware.automotive.audiocontrol.V1_0.ContextNumber;
+import android.media.AudioAttributes;
+import android.media.AudioFormat;
+import android.media.AudioManager;
+import android.media.audiopolicy.AudioMix;
+import android.media.audiopolicy.AudioMixingRule;
+import android.media.audiopolicy.AudioPolicy;
+import android.util.Log;
+import android.util.SparseIntArray;
+
+import com.android.car.CarLog;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Builds dynamic audio routing in a car from audio zone configuration.
+ */
+/* package */ class CarAudioDynamicRouting {
+
+ static final int[] CONTEXT_NUMBERS = new int[] {
+ ContextNumber.MUSIC,
+ ContextNumber.NAVIGATION,
+ ContextNumber.VOICE_COMMAND,
+ ContextNumber.CALL_RING,
+ ContextNumber.CALL,
+ ContextNumber.ALARM,
+ ContextNumber.NOTIFICATION,
+ ContextNumber.SYSTEM_SOUND
+ };
+
+ static final SparseIntArray USAGE_TO_CONTEXT = new SparseIntArray();
+
+ static final int DEFAULT_AUDIO_USAGE = AudioAttributes.USAGE_MEDIA;
+
+ // For legacy stream type based volume control.
+ // Values in STREAM_TYPES and STREAM_TYPE_USAGES should be aligned.
+ static final int[] STREAM_TYPES = new int[] {
+ AudioManager.STREAM_MUSIC,
+ AudioManager.STREAM_ALARM,
+ AudioManager.STREAM_RING
+ };
+ static final int[] STREAM_TYPE_USAGES = new int[] {
+ AudioAttributes.USAGE_MEDIA,
+ AudioAttributes.USAGE_ALARM,
+ AudioAttributes.USAGE_NOTIFICATION_RINGTONE
+ };
+
+ static {
+ USAGE_TO_CONTEXT.put(AudioAttributes.USAGE_UNKNOWN, ContextNumber.MUSIC);
+ USAGE_TO_CONTEXT.put(AudioAttributes.USAGE_MEDIA, ContextNumber.MUSIC);
+ USAGE_TO_CONTEXT.put(AudioAttributes.USAGE_VOICE_COMMUNICATION, ContextNumber.CALL);
+ USAGE_TO_CONTEXT.put(AudioAttributes.USAGE_VOICE_COMMUNICATION_SIGNALLING,
+ ContextNumber.CALL);
+ USAGE_TO_CONTEXT.put(AudioAttributes.USAGE_ALARM, ContextNumber.ALARM);
+ USAGE_TO_CONTEXT.put(AudioAttributes.USAGE_NOTIFICATION, ContextNumber.NOTIFICATION);
+ USAGE_TO_CONTEXT.put(AudioAttributes.USAGE_NOTIFICATION_RINGTONE, ContextNumber.CALL_RING);
+ USAGE_TO_CONTEXT.put(AudioAttributes.USAGE_NOTIFICATION_COMMUNICATION_REQUEST,
+ ContextNumber.NOTIFICATION);
+ USAGE_TO_CONTEXT.put(AudioAttributes.USAGE_NOTIFICATION_COMMUNICATION_INSTANT,
+ ContextNumber.NOTIFICATION);
+ USAGE_TO_CONTEXT.put(AudioAttributes.USAGE_NOTIFICATION_COMMUNICATION_DELAYED,
+ ContextNumber.NOTIFICATION);
+ USAGE_TO_CONTEXT.put(AudioAttributes.USAGE_NOTIFICATION_EVENT, ContextNumber.NOTIFICATION);
+ USAGE_TO_CONTEXT.put(AudioAttributes.USAGE_ASSISTANCE_ACCESSIBILITY,
+ ContextNumber.VOICE_COMMAND);
+ USAGE_TO_CONTEXT.put(AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE,
+ ContextNumber.NAVIGATION);
+ USAGE_TO_CONTEXT.put(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION,
+ ContextNumber.SYSTEM_SOUND);
+ USAGE_TO_CONTEXT.put(AudioAttributes.USAGE_GAME, ContextNumber.MUSIC);
+ USAGE_TO_CONTEXT.put(AudioAttributes.USAGE_VIRTUAL_SOURCE, ContextNumber.INVALID);
+ USAGE_TO_CONTEXT.put(AudioAttributes.USAGE_ASSISTANT, ContextNumber.VOICE_COMMAND);
+ }
+
+ private final CarAudioZone[] mCarAudioZones;
+
+ CarAudioDynamicRouting(CarAudioZone[] carAudioZones) {
+ mCarAudioZones = carAudioZones;
+ }
+
+ void setupAudioDynamicRouting(AudioPolicy.Builder builder) {
+ for (CarAudioZone zone : mCarAudioZones) {
+ for (CarVolumeGroup group : zone.getVolumeGroups()) {
+ setupAudioDynamicRoutingForGroup(group, builder);
+ }
+ }
+ }
+
+ /**
+ * Enumerates all physical buses in a given volume group and attach the mixing rules.
+ * @param group {@link CarVolumeGroup} instance to enumerate the buses with
+ * @param builder {@link AudioPolicy.Builder} to attach the mixing rules
+ */
+ private void setupAudioDynamicRoutingForGroup(CarVolumeGroup group,
+ AudioPolicy.Builder builder) {
+ // Note that one can not register audio mix for same bus more than once.
+ for (int busNumber : group.getBusNumbers()) {
+ boolean hasContext = false;
+ CarAudioDeviceInfo info = group.getCarAudioDeviceInfoForBus(busNumber);
+ AudioFormat mixFormat = new AudioFormat.Builder()
+ .setSampleRate(info.getSampleRate())
+ .setEncoding(info.getEncodingFormat())
+ .setChannelMask(info.getChannelCount())
+ .build();
+ AudioMixingRule.Builder mixingRuleBuilder = new AudioMixingRule.Builder();
+ for (int contextNumber : group.getContextsForBus(busNumber)) {
+ hasContext = true;
+ int[] usages = getUsagesForContext(contextNumber);
+ for (int usage : usages) {
+ mixingRuleBuilder.addRule(
+ new AudioAttributes.Builder().setUsage(usage).build(),
+ AudioMixingRule.RULE_MATCH_ATTRIBUTE_USAGE);
+ }
+ Log.d(CarLog.TAG_AUDIO, "Bus number: " + busNumber
+ + " contextNumber: " + contextNumber
+ + " sampleRate: " + info.getSampleRate()
+ + " channels: " + info.getChannelCount()
+ + " usages: " + Arrays.toString(usages));
+ }
+ if (hasContext) {
+ // It's a valid case that an audio output bus is defined in
+ // audio_policy_configuration and no context is assigned to it.
+ // In such case, do not build a policy mix with zero rules.
+ AudioMix audioMix = new AudioMix.Builder(mixingRuleBuilder.build())
+ .setFormat(mixFormat)
+ .setDevice(info.getAudioDeviceInfo())
+ .setRouteFlags(AudioMix.ROUTE_FLAG_RENDER)
+ .build();
+ builder.addMix(audioMix);
+ }
+ }
+ }
+
+ private int[] getUsagesForContext(int contextNumber) {
+ final List<Integer> usages = new ArrayList<>();
+ for (int i = 0; i < CarAudioDynamicRouting.USAGE_TO_CONTEXT.size(); i++) {
+ if (CarAudioDynamicRouting.USAGE_TO_CONTEXT.valueAt(i) == contextNumber) {
+ usages.add(CarAudioDynamicRouting.USAGE_TO_CONTEXT.keyAt(i));
+ }
+ }
+ return usages.stream().mapToInt(i -> i).toArray();
+ }
+}
diff --git a/service/src/com/android/car/audio/CarAudioFocus.java b/service/src/com/android/car/audio/CarAudioFocus.java
new file mode 100644
index 0000000..97f284b
--- /dev/null
+++ b/service/src/com/android/car/audio/CarAudioFocus.java
@@ -0,0 +1,416 @@
+/*
+ * 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 com.android.car.audio;
+
+import android.hardware.automotive.audiocontrol.V1_0.ContextNumber;
+import android.media.AudioAttributes;
+import android.media.AudioFocusInfo;
+import android.media.AudioManager;
+import android.media.audiopolicy.AudioPolicy;
+import android.util.Log;
+
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+
+
+public class CarAudioFocus extends AudioPolicy.AudioPolicyFocusListener {
+
+ private static final String TAG = "CarAudioFocus";
+
+ private final AudioManager mAudioManager;
+ private CarAudioService mCarAudioService; // Dynamically assigned just after construction
+ private AudioPolicy mAudioPolicy; // Dynamically assigned just after construction
+
+
+ // Values for the internal interaction matrix we use to make focus decisions
+ private static final int INTERACTION_REJECT = 0; // Focus not granted
+ private static final int INTERACTION_EXCLUSIVE = 1; // Focus granted, others loose focus
+ private static final int INTERACTION_CONCURRENT = 2; // Focus granted, others keep focus
+
+ // TODO: Make this an overlayable resource...
+ // MUSIC = 1, // Music playback
+ // NAVIGATION = 2, // Navigation directions
+ // VOICE_COMMAND = 3, // Voice command session
+ // CALL_RING = 4, // Voice call ringing
+ // CALL = 5, // Voice call
+ // ALARM = 6, // Alarm sound from Android
+ // NOTIFICATION = 7, // Notifications
+ // SYSTEM_SOUND = 8, // User interaction sounds (button clicks, etc)
+ private static int sInteractionMatrix[][] = {
+ // Row selected by playing sound (labels along the right)
+ // Column selected by incoming request (labels along the top)
+ // Cell value is one of INTERACTION_REJECT, INTERACTION_EXCLUSIVE, INTERACTION_CONCURRENT
+ // Invalid, Music, Nav, Voice, Ring, Call, Alarm, Notification, System
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Invalid
+ { 0, 1, 2, 1, 1, 1, 1, 2, 2 }, // Music
+ { 0, 2, 2, 1, 2, 1, 2, 2, 2 }, // Nav
+ { 0, 2, 0, 2, 1, 1, 0, 0, 0 }, // Voice
+ { 0, 0, 2, 2, 2, 2, 0, 0, 2 }, // Ring
+ { 0, 0, 2, 0, 2, 2, 2, 2, 0 }, // Context
+ { 0, 2, 2, 1, 1, 1, 2, 2, 2 }, // Alarm
+ { 0, 2, 2, 1, 1, 1, 2, 2, 2 }, // Notification
+ { 0, 2, 2, 1, 1, 1, 2, 2, 2 }, // System
+ };
+
+
+ private class FocusEntry {
+ // Requester info
+ final AudioFocusInfo mAfi; // never null
+
+ final int mAudioContext; // Which HAL level context does this affect
+ final ArrayList<FocusEntry> mBlockers; // List of requests that block ours
+
+ FocusEntry(AudioFocusInfo afi,
+ int context) {
+ mAfi = afi;
+ mAudioContext = context;
+ mBlockers = new ArrayList<FocusEntry>();
+ }
+
+ public String getClientId() {
+ return mAfi.getClientId();
+ }
+
+ public boolean wantsPauseInsteadOfDucking() {
+ return (mAfi.getFlags() & AudioManager.AUDIOFOCUS_FLAG_PAUSES_ON_DUCKABLE_LOSS) != 0;
+ }
+ }
+
+
+ // We keep track of all the focus requesters in this map, with their clientId as the key.
+ // This is used both for focus dispatch and death handling
+ // Note that the clientId reflects the AudioManager instance and listener object (if any)
+ // so that one app can have more than one unique clientId by setting up distinct listeners.
+ // Because the listener gets only LOSS/GAIN messages, this is important for an app to do if
+ // it expects to request focus concurrently for different USAGEs so it knows which USAGE
+ // gained or lost focus at any given moment. If the SAME listener is used for requests of
+ // different USAGE while the earlier request is still in the focus stack (whether holding
+ // focus or pending), the new request will be REJECTED so as to avoid any confusion about
+ // the meaning of subsequent GAIN/LOSS events (which would continue to apply to the focus
+ // request that was already active or pending).
+ private HashMap<String, FocusEntry> mFocusHolders = new HashMap<String, FocusEntry>();
+ private HashMap<String, FocusEntry> mFocusLosers = new HashMap<String, FocusEntry>();
+
+
+ CarAudioFocus(AudioManager audioManager) {
+ mAudioManager = audioManager;
+ }
+
+
+ // This has to happen after the construction to avoid a chicken and egg problem when setting up
+ // the AudioPolicy which must depend on this object.
+ public void setOwningPolicy(CarAudioService audioService, AudioPolicy parentPolicy) {
+ mCarAudioService = audioService;
+ mAudioPolicy = parentPolicy;
+ }
+
+
+ // This sends a focus loss message to the targeted requester.
+ private void sendFocusLoss(FocusEntry loser, boolean permanent) {
+ int lossType = (permanent ? AudioManager.AUDIOFOCUS_LOSS :
+ AudioManager.AUDIOFOCUS_LOSS_TRANSIENT);
+ Log.i(TAG, "sendFocusLoss to " + loser.getClientId());
+ int result = mAudioManager.dispatchAudioFocusChange(loser.mAfi, lossType, mAudioPolicy);
+ if (result != AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
+ // TODO: Is this actually an error, or is it okay for an entry in the focus stack
+ // to NOT have a listener? If that's the case, should we even keep it in the focus
+ // stack?
+ Log.e(TAG, "Failure to signal loss of audio focus with error: " + result);
+ }
+ }
+
+
+ /** @see AudioManager#requestAudioFocus(AudioManager.OnAudioFocusChangeListener, int, int, int) */
+ // Note that we replicate most, but not all of the behaviors of the default MediaFocusControl
+ // engine as of Android P.
+ // Besides the interaction matrix which allows concurrent focus for multiple requestors, which
+ // is the reason for this module, we also treat repeated requests from the same clientId
+ // slightly differently.
+ // If a focus request for the same listener (clientId) is received while that listener is
+ // already in the focus stack, we REJECT it outright unless it is for the same USAGE.
+ // The default audio framework's behavior is to remove the previous entry in the stack (no-op
+ // if the requester is already holding focus).
+ int evaluateFocusRequest(AudioFocusInfo afi) {
+ Log.i(TAG, "Evaluating focus request for client " + afi.getClientId());
+
+ // Is this a request for premanant focus?
+ // AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE -- Means Notifications should be denied
+ // AUDIOFOCUS_GAIN_TRANSIENT -- Means current focus holders should get transient loss
+ // AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK -- Means other can duck (no loss message from us)
+ // NOTE: We expect that in practice it will be permanent for all media requests and
+ // transient for everything else, but that isn't currently an enforced requirement.
+ final boolean permanent =
+ (afi.getGainRequest() == AudioManager.AUDIOFOCUS_GAIN);
+ final boolean allowDucking =
+ (afi.getGainRequest() == AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK);
+
+
+ // Convert from audio attributes "usage" to HAL level "context"
+ final int requestedContext = mCarAudioService.getContextForUsage(
+ afi.getAttributes().getUsage());
+
+ // If we happen find an entry that this new request should replace, we'll store it here.
+ FocusEntry deprecatedBlockedEntry = null;
+
+ // Scan all active and pending focus requests. If any should cause rejection of
+ // this new request, then we're done. Keep a list of those against whom we're exclusive
+ // so we can update the relationships if/when we are sure we won't get rejected.
+ Log.i(TAG, "Scanning focus holders...");
+ final ArrayList<FocusEntry> losers = new ArrayList<FocusEntry>();
+ for (FocusEntry entry : mFocusHolders.values()) {
+ Log.i(TAG, entry.mAfi.getClientId());
+
+ // If this request is for Notifications and a current focus holder has specified
+ // AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE, then reject the request.
+ // This matches the hardwired behavior in the default audio policy engine which apps
+ // might expect (The interaction matrix doesn't have any provision for dealing with
+ // override flags like this).
+ if ((requestedContext == ContextNumber.NOTIFICATION) &&
+ (entry.mAfi.getGainRequest() ==
+ AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE)) {
+ return AudioManager.AUDIOFOCUS_REQUEST_FAILED;
+ }
+
+ // We don't allow sharing listeners (client IDs) between two concurrent requests
+ // (because the app would have no way to know to which request a later event applied)
+ if (afi.getClientId().equals(entry.mAfi.getClientId())) {
+ if (entry.mAudioContext == requestedContext) {
+ // Trivially accept if this request is a duplicate
+ Log.i(TAG, "Duplicate request from focus holder is accepted");
+ return AudioManager.AUDIOFOCUS_REQUEST_GRANTED;
+ } else {
+ // Trivially reject a request for a different USAGE
+ Log.i(TAG, "Different request from focus holder is rejected");
+ return AudioManager.AUDIOFOCUS_REQUEST_FAILED;
+ }
+ }
+
+ // Check the interaction matrix for the relationship between this entry and the request
+ switch (sInteractionMatrix[entry.mAudioContext][requestedContext]) {
+ case INTERACTION_REJECT:
+ // This request is rejected, so nothing further to do
+ return AudioManager.AUDIOFOCUS_REQUEST_FAILED;
+ case INTERACTION_EXCLUSIVE:
+ // The new request will cause this existing entry to lose focus
+ losers.add(entry);
+ break;
+ default:
+ // If ducking isn't allowed by the focus requestor, then everybody else
+ // must get a LOSS.
+ // If a focus holder has set the AUDIOFOCUS_FLAG_PAUSES_ON_DUCKABLE_LOSS flag,
+ // they must get a LOSS message even if ducking would otherwise be allowed.
+ if ((!allowDucking) ||
+ (entry.mAfi.getFlags() &
+ AudioManager.AUDIOFOCUS_FLAG_PAUSES_ON_DUCKABLE_LOSS) != 0) {
+ // The new request will cause audio book to lose focus and pause
+ losers.add(entry);
+ }
+ }
+ }
+ Log.i(TAG, "Scanning those who've already lost focus...");
+ final ArrayList<FocusEntry> blocked = new ArrayList<FocusEntry>();
+ for (FocusEntry entry : mFocusLosers.values()) {
+ Log.i(TAG, entry.mAfi.getClientId());
+
+ // If this request is for Notifications and a pending focus holder has specified
+ // AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE, then reject the request
+ if ((requestedContext == ContextNumber.NOTIFICATION) &&
+ (entry.mAfi.getGainRequest() ==
+ AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE)) {
+ return AudioManager.AUDIOFOCUS_REQUEST_FAILED;
+ }
+
+ // We don't allow sharing listeners (client IDs) between two concurrent requests
+ // (because the app would have no way to know to which request a later event applied)
+ if (afi.getClientId().equals(entry.mAfi.getClientId())) {
+ if (entry.mAudioContext == requestedContext) {
+ // This is a repeat of a request that is currently blocked.
+ // Evaluate it as if it were a new request, but note that we should remove
+ // the old pending request, and move it.
+ // We do not want to evaluate the new request against itself.
+ Log.i(TAG, "Duplicate request while waiting is being evaluated");
+ deprecatedBlockedEntry = entry;
+ continue;
+ } else {
+ // Trivially reject a request for a different USAGE
+ Log.i(TAG, "Different request while waiting is rejected");
+ return AudioManager.AUDIOFOCUS_REQUEST_FAILED;
+ }
+ }
+
+ // Check the interaction matrix for the relationship between this entry and the request
+ switch (sInteractionMatrix[entry.mAudioContext][requestedContext]) {
+ case INTERACTION_REJECT:
+ // Even though this entry has currently lost focus, the fact that it is
+ // waiting to play means we'll reject this new conflicting request.
+ return AudioManager.AUDIOFOCUS_REQUEST_FAILED;
+ case INTERACTION_EXCLUSIVE:
+ // The new request is yet another reason this entry cannot regain focus (yet)
+ blocked.add(entry);
+ break;
+ default:
+ // If ducking is not allowed by the requester, or the pending focus holder had
+ // set the AUDIOFOCUS_FLAG_PAUSES_ON_DUCKABLE_LOSS flag,
+ // then the pending holder must stay "lost" until this requester goes away.
+ if ((!allowDucking) || entry.wantsPauseInsteadOfDucking()) {
+ // The new request is yet another reason this entry cannot regain focus yet
+ blocked.add(entry);
+ }
+ }
+ }
+
+
+ // Now that we've decided we'll grant focus, construct our new FocusEntry
+ FocusEntry newEntry = new FocusEntry(afi, requestedContext);
+
+
+ // Now that we're sure we'll accept this request, update any requests which we would
+ // block but are already out of focus but waiting to come back
+ for (FocusEntry entry : blocked) {
+ // If we're out of focus it must be because somebody is blocking us
+ assert !entry.mBlockers.isEmpty();
+
+ if (permanent) {
+ // This entry has now lost focus forever
+ sendFocusLoss(entry, permanent);
+ final FocusEntry deadEntry = mFocusLosers.remove(entry.mAfi.getClientId());
+ assert deadEntry != null;
+ } else {
+ // Note that this new request is yet one more reason we can't (yet) have focus
+ entry.mBlockers.add(newEntry);
+ }
+ }
+
+ // Notify and update any requests which are now losing focus as a result of the new request
+ for (FocusEntry entry : losers) {
+ // If we have focus (but are about to loose it), nobody should be blocking us yet
+ assert entry.mBlockers.isEmpty();
+
+ sendFocusLoss(entry, permanent);
+
+ // The entry no longer holds focus, so take it out of the holders list
+ mFocusHolders.remove(entry.mAfi.getClientId());
+
+ if (!permanent) {
+ // Add ourselves to the list of requests waiting to get focus back and
+ // note why we lost focus so we can tell when it's time to get it back
+ mFocusLosers.put(entry.mAfi.getClientId(), entry);
+ entry.mBlockers.add(newEntry);
+ }
+ }
+
+ // If we encountered a duplicate of this request that was pending, but now we're going to
+ // grant focus, we need to remove the old pending request (without sending a LOSS message).
+ if (deprecatedBlockedEntry != null) {
+ mFocusLosers.remove(deprecatedBlockedEntry.mAfi.getClientId());
+ }
+
+ // Finally, add the request we're granting to the focus holders' list
+ mFocusHolders.put(afi.getClientId(), newEntry);
+
+ Log.i(TAG, "AUDIOFOCUS_REQUEST_GRANTED");
+ return AudioManager.AUDIOFOCUS_REQUEST_GRANTED;
+ }
+
+
+ @Override
+ public synchronized void onAudioFocusRequest(AudioFocusInfo afi, int requestResult) {
+ Log.i(TAG, "onAudioFocusRequest " + afi);
+
+ int response = evaluateFocusRequest(afi);
+
+ // Post our reply for delivery to the original focus requester
+ mAudioManager.setFocusRequestResult(afi, response, mAudioPolicy);
+ }
+
+
+ /**
+ * @see AudioManager#abandonAudioFocus(AudioManager.OnAudioFocusChangeListener, AudioAttributes)
+ * Note that we'll get this call for a focus holder that dies while in the focus stack, so
+ * we don't need to watch for death notifications directly.
+ * */
+ @Override
+ public synchronized void onAudioFocusAbandon(AudioFocusInfo afi) {
+ Log.i(TAG, "onAudioFocusAbandon " + afi);
+
+ // Remove this entry from our active or pending list
+ FocusEntry deadEntry = mFocusHolders.remove(afi.getClientId());
+ if (deadEntry == null) {
+ deadEntry = mFocusLosers.remove(afi.getClientId());
+ if (deadEntry == null) {
+ // Caller is providing an unrecognzied clientId!?
+ Log.w(TAG, "Audio focus abandoned by unrecognized client id: " + afi.getClientId());
+ // This probably means an app double released focused for some reason. One
+ // harmless possibility is a race between an app being told it lost focus and the
+ // app voluntarily abandoning focus. More likely the app is just sloppy. :)
+ // The more nefarious possibility is that the clientId is actually corrupted
+ // somehow, in which case we might have a real focus entry that we're going to fail
+ // to remove. If that were to happen, I'd expect either the app to swallow it
+ // silently, or else take unexpected action (eg: resume playing spontaneously), or
+ // else to see "Failure to signal ..." gain/loss error messages in the log from
+ // this module when a focus change tries to take action on a truly zombie entry.
+ return;
+ }
+ }
+
+ // Remove this entry from the blocking list of any pending requests
+ Iterator<FocusEntry> it = mFocusLosers.values().iterator();
+ while (it.hasNext()) {
+ FocusEntry entry = it.next();
+
+ // Remove the retiring entry from all blocker lists
+ entry.mBlockers.remove(deadEntry);
+
+ // Any entry whose blocking list becomes empty should regain focus
+ if (entry.mBlockers.isEmpty()) {
+ // Pull this entry out of the focus losers list
+ it.remove();
+
+ // Add it back into the focus holders list
+ mFocusHolders.put(entry.getClientId(), entry);
+
+ // Send the focus (re)gain notification
+ int result = mAudioManager.dispatchAudioFocusChange(
+ entry.mAfi,
+ entry.mAfi.getGainRequest(),
+ mAudioPolicy);
+ if (result != AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
+ // TODO: Is this actually an error, or is it okay for an entry in the focus
+ // stack to NOT have a listener? If that's the case, should we even keep
+ // it in the focus stack?
+ Log.e(TAG, "Failure to signal gain of audio focus with error: " + result);
+ }
+ }
+ }
+ }
+
+
+ public synchronized void dump(PrintWriter writer) {
+ writer.println("*CarAudioFocus*");
+
+ writer.println(" Current Focus Holders:");
+ for (String clientId : mFocusHolders.keySet()) {
+ System.out.println(clientId);
+ }
+
+ writer.println(" Transient Focus Losers:");
+ for (String clientId : mFocusLosers.keySet()) {
+ System.out.println(clientId);
+ }
+ }
+}
diff --git a/service/src/com/android/car/audio/CarAudioService.java b/service/src/com/android/car/audio/CarAudioService.java
new file mode 100644
index 0000000..b19fda5
--- /dev/null
+++ b/service/src/com/android/car/audio/CarAudioService.java
@@ -0,0 +1,825 @@
+/*
+ * 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 com.android.car.audio;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.car.Car;
+import android.car.media.CarAudioManager;
+import android.car.media.CarAudioPatchHandle;
+import android.car.media.ICarAudio;
+import android.car.media.ICarVolumeCallback;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.PackageManager;
+import android.hardware.automotive.audiocontrol.V1_0.IAudioControl;
+import android.media.AudioAttributes;
+import android.media.AudioDeviceInfo;
+import android.media.AudioDevicePort;
+import android.media.AudioFormat;
+import android.media.AudioGain;
+import android.media.AudioGainConfig;
+import android.media.AudioManager;
+import android.media.AudioPatch;
+import android.media.AudioPlaybackConfiguration;
+import android.media.AudioPortConfig;
+import android.media.AudioSystem;
+import android.media.audiopolicy.AudioPolicy;
+import android.os.IBinder;
+import android.os.Looper;
+import android.os.RemoteException;
+import android.provider.Settings;
+import android.telephony.TelephonyManager;
+import android.text.TextUtils;
+import android.util.Log;
+import android.util.SparseArray;
+import android.view.KeyEvent;
+
+import com.android.car.BinderInterfaceContainer;
+import com.android.car.CarLog;
+import com.android.car.CarServiceBase;
+import com.android.car.R;
+import com.android.internal.util.Preconditions;
+
+import java.io.File;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * Service responsible for interaction with car's audio system.
+ */
+public class CarAudioService extends ICarAudio.Stub implements CarServiceBase {
+
+ // Turning this off will result in falling back to the default focus policy of Android
+ // (which boils down to "grant if not in a phone call, else deny").
+ // Aside from the obvious effect of ignoring the logic in CarAudioFocus, this will also
+ // result in the framework taking over responsibility for ducking in TRANSIENT_LOSS cases.
+ // Search for "DUCK_VSHAPE" in PLaybackActivityMonitor.java to see where this happens.
+ private static boolean sUseCarAudioFocus = true;
+
+ // Key to persist master mute state in system settings
+ private static final String VOLUME_SETTINGS_KEY_MASTER_MUTE = "android.car.MASTER_MUTE";
+
+ // The trailing slash forms a directory-liked hierarchy and
+ // allows listening for both GROUP/MEDIA and GROUP/NAVIGATION.
+ private static final String VOLUME_SETTINGS_KEY_FOR_GROUP_PREFIX = "android.car.VOLUME_GROUP/";
+
+ // CarAudioService reads configuration from the following paths respectively.
+ // If the first one is found, all others are ignored.
+ // If no one is found, it fallbacks to car_volume_groups.xml resource file.
+ private static final String[] AUDIO_CONFIGURATION_PATHS = new String[] {
+ "/vendor/etc/car_audio_configuration.xml",
+ "/system/etc/car_audio_configuration.xml"
+ };
+
+ /**
+ * Gets the key to persist volume for a volume group in settings
+ *
+ * @param zoneId The audio zone id
+ * @param groupId The volume group id
+ * @return Key to persist volume index for volume group in system settings
+ */
+ static String getVolumeSettingsKeyForGroup(int zoneId, int groupId) {
+ final int maskedGroupId = (zoneId << 8) + groupId;
+ return VOLUME_SETTINGS_KEY_FOR_GROUP_PREFIX + maskedGroupId;
+ }
+
+ private final Object mImplLock = new Object();
+
+ private final Context mContext;
+ private final TelephonyManager mTelephonyManager;
+ private final AudioManager mAudioManager;
+ private final boolean mUseDynamicRouting;
+ private final boolean mPersistMasterMuteState;
+
+ private final AudioPolicy.AudioPolicyVolumeCallback mAudioPolicyVolumeCallback =
+ new AudioPolicy.AudioPolicyVolumeCallback() {
+ @Override
+ public void onVolumeAdjustment(int adjustment) {
+ final int usage = getSuggestedAudioUsage();
+ Log.v(CarLog.TAG_AUDIO,
+ "onVolumeAdjustment: " + AudioManager.adjustToString(adjustment)
+ + " suggested usage: " + AudioAttributes.usageToString(usage));
+ // TODO: Pass zone id into this callback.
+ final int zoneId = CarAudioManager.PRIMARY_AUDIO_ZONE;
+ final int groupId = getVolumeGroupIdForUsage(zoneId, usage);
+ final int currentVolume = getGroupVolume(zoneId, groupId);
+ final int flags = AudioManager.FLAG_FROM_KEY | AudioManager.FLAG_SHOW_UI;
+ switch (adjustment) {
+ case AudioManager.ADJUST_LOWER:
+ int minValue = Math.max(currentVolume - 1, getGroupMinVolume(zoneId, groupId));
+ setGroupVolume(zoneId, groupId, minValue , flags);
+ break;
+ case AudioManager.ADJUST_RAISE:
+ int maxValue = Math.min(currentVolume + 1, getGroupMaxVolume(zoneId, groupId));
+ setGroupVolume(zoneId, groupId, maxValue, flags);
+ break;
+ case AudioManager.ADJUST_MUTE:
+ setMasterMute(true, flags);
+ callbackMasterMuteChange(zoneId, flags);
+ break;
+ case AudioManager.ADJUST_UNMUTE:
+ setMasterMute(false, flags);
+ callbackMasterMuteChange(zoneId, flags);
+ break;
+ case AudioManager.ADJUST_TOGGLE_MUTE:
+ setMasterMute(!mAudioManager.isMasterMute(), flags);
+ callbackMasterMuteChange(zoneId, flags);
+ break;
+ case AudioManager.ADJUST_SAME:
+ default:
+ break;
+ }
+ }
+ };
+
+ private final BinderInterfaceContainer<ICarVolumeCallback> mVolumeCallbackContainer =
+ new BinderInterfaceContainer<>();
+
+ /**
+ * Simulates {@link ICarVolumeCallback} when it's running in legacy mode.
+ * This receiver assumes the intent is sent to {@link CarAudioManager#PRIMARY_AUDIO_ZONE}.
+ */
+ private final BroadcastReceiver mLegacyVolumeChangedReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ final int zoneId = CarAudioManager.PRIMARY_AUDIO_ZONE;
+ switch (intent.getAction()) {
+ case AudioManager.VOLUME_CHANGED_ACTION:
+ int streamType = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, -1);
+ int groupId = getVolumeGroupIdForStreamType(streamType);
+ if (groupId == -1) {
+ Log.w(CarLog.TAG_AUDIO, "Unknown stream type: " + streamType);
+ } else {
+ callbackGroupVolumeChange(zoneId, groupId, 0);
+ }
+ break;
+ case AudioManager.MASTER_MUTE_CHANGED_ACTION:
+ callbackMasterMuteChange(zoneId, 0);
+ break;
+ }
+ }
+ };
+
+ private AudioPolicy mAudioPolicy;
+ private CarAudioFocus mFocusHandler;
+ private String mCarAudioConfigurationPath;
+ private CarAudioZone[] mCarAudioZones;
+
+ public CarAudioService(Context context) {
+ mContext = context;
+ mTelephonyManager = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
+ mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
+ mUseDynamicRouting = mContext.getResources().getBoolean(R.bool.audioUseDynamicRouting);
+ mPersistMasterMuteState = mContext.getResources().getBoolean(
+ R.bool.audioPersistMasterMuteState);
+ }
+
+ /**
+ * Dynamic routing and volume groups are set only if
+ * {@link #mUseDynamicRouting} is {@code true}. Otherwise, this service runs in legacy mode.
+ */
+ @Override
+ public void init() {
+ synchronized (mImplLock) {
+ if (mUseDynamicRouting) {
+ // Enumerate all output bus device ports
+ AudioDeviceInfo[] deviceInfos = mAudioManager.getDevices(
+ AudioManager.GET_DEVICES_OUTPUTS);
+ if (deviceInfos.length == 0) {
+ Log.e(CarLog.TAG_AUDIO, "No output device available, ignore");
+ return;
+ }
+ SparseArray<CarAudioDeviceInfo> busToCarAudioDeviceInfo = new SparseArray<>();
+ for (AudioDeviceInfo info : deviceInfos) {
+ Log.v(CarLog.TAG_AUDIO, String.format("output id=%d address=%s type=%s",
+ info.getId(), info.getAddress(), info.getType()));
+ if (info.getType() == AudioDeviceInfo.TYPE_BUS) {
+ final CarAudioDeviceInfo carInfo = new CarAudioDeviceInfo(info);
+ // See also the audio_policy_configuration.xml,
+ // the bus number should be no less than zero.
+ if (carInfo.getBusNumber() >= 0) {
+ busToCarAudioDeviceInfo.put(carInfo.getBusNumber(), carInfo);
+ Log.i(CarLog.TAG_AUDIO, "Valid bus found " + carInfo);
+ }
+ }
+ }
+ setupDynamicRouting(busToCarAudioDeviceInfo);
+ } else {
+ Log.i(CarLog.TAG_AUDIO, "Audio dynamic routing not enabled, run in legacy mode");
+ setupLegacyVolumeChangedListener();
+ }
+
+ // Restore master mute state if applicable
+ if (mPersistMasterMuteState) {
+ boolean storedMasterMute = Settings.Global.getInt(mContext.getContentResolver(),
+ VOLUME_SETTINGS_KEY_MASTER_MUTE, 0) != 0;
+ setMasterMute(storedMasterMute, 0);
+ }
+ }
+ }
+
+ @Override
+ public void release() {
+ synchronized (mImplLock) {
+ if (mUseDynamicRouting) {
+ if (mAudioPolicy != null) {
+ mAudioManager.unregisterAudioPolicyAsync(mAudioPolicy);
+ mAudioPolicy = null;
+ mFocusHandler.setOwningPolicy(null, null);
+ mFocusHandler = null;
+ }
+ } else {
+ mContext.unregisterReceiver(mLegacyVolumeChangedReceiver);
+ }
+
+ mVolumeCallbackContainer.clear();
+ }
+ }
+
+ @Override
+ public void dump(PrintWriter writer) {
+ writer.println("*CarAudioService*");
+ writer.println("\tRun in legacy mode? " + (!mUseDynamicRouting));
+ writer.println("\tPersist master mute state? " + mPersistMasterMuteState);
+ writer.println("\tMaster muted? " + mAudioManager.isMasterMute());
+ if (mCarAudioConfigurationPath != null) {
+ writer.println("\tCar audio configuration path: " + mCarAudioConfigurationPath);
+ }
+ // Empty line for comfortable reading
+ writer.println();
+ if (mUseDynamicRouting) {
+ for (CarAudioZone zone : mCarAudioZones) {
+ zone.dump("\t", writer);
+ }
+ }
+ }
+
+ @Override
+ public boolean isDynamicRoutingEnabled() {
+ return mUseDynamicRouting;
+ }
+
+ /**
+ * @see {@link android.car.media.CarAudioManager#setGroupVolume(int, int, int, int)}
+ */
+ @Override
+ public void setGroupVolume(int zoneId, int groupId, int index, int flags) {
+ synchronized (mImplLock) {
+ enforcePermission(Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME);
+
+ callbackGroupVolumeChange(zoneId, groupId, flags);
+ // For legacy stream type based volume control
+ if (!mUseDynamicRouting) {
+ mAudioManager.setStreamVolume(
+ CarAudioDynamicRouting.STREAM_TYPES[groupId], index, flags);
+ return;
+ }
+
+ CarVolumeGroup group = getCarVolumeGroup(zoneId, groupId);
+ group.setCurrentGainIndex(index);
+ }
+ }
+
+ private void callbackGroupVolumeChange(int zoneId, int groupId, int flags) {
+ for (BinderInterfaceContainer.BinderInterface<ICarVolumeCallback> callback :
+ mVolumeCallbackContainer.getInterfaces()) {
+ try {
+ callback.binderInterface.onGroupVolumeChanged(zoneId, groupId, flags);
+ } catch (RemoteException e) {
+ Log.e(CarLog.TAG_AUDIO, "Failed to callback onGroupVolumeChanged", e);
+ }
+ }
+ }
+
+ private void setMasterMute(boolean mute, int flags) {
+ mAudioManager.setMasterMute(mute, flags);
+
+ // When the master mute is turned ON, we want the playing app to get a "pause" command.
+ // When the volume is unmuted, we want to resume playback.
+ int keycode = mute ? KeyEvent.KEYCODE_MEDIA_PAUSE : KeyEvent.KEYCODE_MEDIA_PLAY;
+ mAudioManager.dispatchMediaKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, keycode));
+ mAudioManager.dispatchMediaKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, keycode));
+ }
+
+ private void callbackMasterMuteChange(int zoneId, int flags) {
+ for (BinderInterfaceContainer.BinderInterface<ICarVolumeCallback> callback :
+ mVolumeCallbackContainer.getInterfaces()) {
+ try {
+ callback.binderInterface.onMasterMuteChanged(zoneId, flags);
+ } catch (RemoteException e) {
+ Log.e(CarLog.TAG_AUDIO, "Failed to callback onMasterMuteChanged", e);
+ }
+ }
+
+ // Persists master mute state if applicable
+ if (mPersistMasterMuteState) {
+ Settings.Global.putInt(mContext.getContentResolver(),
+ VOLUME_SETTINGS_KEY_MASTER_MUTE,
+ mAudioManager.isMasterMute() ? 1 : 0);
+ }
+ }
+
+ /**
+ * @see {@link android.car.media.CarAudioManager#getGroupMaxVolume(int, int)}
+ */
+ @Override
+ public int getGroupMaxVolume(int zoneId, int groupId) {
+ synchronized (mImplLock) {
+ enforcePermission(Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME);
+
+ // For legacy stream type based volume control
+ if (!mUseDynamicRouting) {
+ return mAudioManager.getStreamMaxVolume(
+ CarAudioDynamicRouting.STREAM_TYPES[groupId]);
+ }
+
+ CarVolumeGroup group = getCarVolumeGroup(zoneId, groupId);
+ return group.getMaxGainIndex();
+ }
+ }
+
+ /**
+ * @see {@link android.car.media.CarAudioManager#getGroupMinVolume(int, int)}
+ */
+ @Override
+ public int getGroupMinVolume(int zoneId, int groupId) {
+ synchronized (mImplLock) {
+ enforcePermission(Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME);
+
+ // For legacy stream type based volume control
+ if (!mUseDynamicRouting) {
+ return mAudioManager.getStreamMinVolume(
+ CarAudioDynamicRouting.STREAM_TYPES[groupId]);
+ }
+
+ CarVolumeGroup group = getCarVolumeGroup(zoneId, groupId);
+ return group.getMinGainIndex();
+ }
+ }
+
+ /**
+ * @see {@link android.car.media.CarAudioManager#getGroupVolume(int, int)}
+ */
+ @Override
+ public int getGroupVolume(int zoneId, int groupId) {
+ synchronized (mImplLock) {
+ enforcePermission(Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME);
+
+ // For legacy stream type based volume control
+ if (!mUseDynamicRouting) {
+ return mAudioManager.getStreamVolume(
+ CarAudioDynamicRouting.STREAM_TYPES[groupId]);
+ }
+
+ CarVolumeGroup group = getCarVolumeGroup(zoneId, groupId);
+ return group.getCurrentGainIndex();
+ }
+ }
+
+ private CarVolumeGroup getCarVolumeGroup(int zoneId, int groupId) {
+ Preconditions.checkNotNull(mCarAudioZones);
+ Preconditions.checkArgumentInRange(zoneId, 0, mCarAudioZones.length - 1,
+ "zoneId out of range: " + zoneId);
+ return mCarAudioZones[zoneId].getVolumeGroup(groupId);
+ }
+
+ private void setupLegacyVolumeChangedListener() {
+ IntentFilter intentFilter = new IntentFilter();
+ intentFilter.addAction(AudioManager.VOLUME_CHANGED_ACTION);
+ intentFilter.addAction(AudioManager.MASTER_MUTE_CHANGED_ACTION);
+ mContext.registerReceiver(mLegacyVolumeChangedReceiver, intentFilter);
+ }
+
+ private void setupDynamicRouting(SparseArray<CarAudioDeviceInfo> busToCarAudioDeviceInfo) {
+ final AudioPolicy.Builder builder = new AudioPolicy.Builder(mContext);
+ builder.setLooper(Looper.getMainLooper());
+
+ final CarAudioZonesLoader zonesLoader;
+ mCarAudioConfigurationPath = getAudioConfigurationPath();
+ if (mCarAudioConfigurationPath != null) {
+ zonesLoader = new CarAudioZonesHelper(mContext, mCarAudioConfigurationPath,
+ busToCarAudioDeviceInfo);
+ } else {
+ // In legacy mode, context -> bus mapping is done by querying IAudioControl HAL.
+ final IAudioControl audioControl = getAudioControl();
+ if (audioControl == null) {
+ throw new RuntimeException(
+ "Dynamic routing requested but audioControl HAL not available");
+ }
+ zonesLoader = new CarAudioZonesHelperLegacy(mContext, R.xml.car_volume_groups,
+ busToCarAudioDeviceInfo, audioControl);
+ }
+ mCarAudioZones = zonesLoader.loadAudioZones();
+ for (CarAudioZone zone : mCarAudioZones) {
+ if (!zone.validateVolumeGroups()) {
+ throw new RuntimeException("Invalid volume groups configuration");
+ }
+ // Ensure HAL gets our initial value
+ zone.synchronizeCurrentGainIndex();
+ Log.v(CarLog.TAG_AUDIO, "Processed audio zone: " + zone);
+ }
+
+ // Setup dynamic routing rules by usage
+ final CarAudioDynamicRouting dynamicRouting = new CarAudioDynamicRouting(mCarAudioZones);
+ dynamicRouting.setupAudioDynamicRouting(builder);
+
+ // Attach the {@link AudioPolicyVolumeCallback}
+ builder.setAudioPolicyVolumeCallback(mAudioPolicyVolumeCallback);
+
+ if (sUseCarAudioFocus) {
+ // Configure our AudioPolicy to handle focus events.
+ // This gives us the ability to decide which audio focus requests to accept and bypasses
+ // the framework ducking logic.
+ mFocusHandler = new CarAudioFocus(mAudioManager);
+ builder.setAudioPolicyFocusListener(mFocusHandler);
+ builder.setIsAudioFocusPolicy(true);
+ }
+
+ mAudioPolicy = builder.build();
+ if (sUseCarAudioFocus) {
+ // Connect the AudioPolicy and the focus listener
+ mFocusHandler.setOwningPolicy(this, mAudioPolicy);
+ }
+
+ int r = mAudioManager.registerAudioPolicy(mAudioPolicy);
+ if (r != AudioManager.SUCCESS) {
+ throw new RuntimeException("registerAudioPolicy failed " + r);
+ }
+ }
+
+ /**
+ * Read from {@link #AUDIO_CONFIGURATION_PATHS} respectively.
+ * @return File path of the first hit in {@link #AUDIO_CONFIGURATION_PATHS}
+ */
+ @Nullable
+ private String getAudioConfigurationPath() {
+ for (String path : AUDIO_CONFIGURATION_PATHS) {
+ File configuration = new File(path);
+ if (configuration.exists()) {
+ return path;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * @return Context number for a given audio usage, 0 if the given usage is unrecognized.
+ */
+ int getContextForUsage(int audioUsage) {
+ return CarAudioDynamicRouting.USAGE_TO_CONTEXT.get(audioUsage);
+ }
+
+ @Override
+ public void setFadeTowardFront(float value) {
+ synchronized (mImplLock) {
+ enforcePermission(Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME);
+ final IAudioControl audioControlHal = getAudioControl();
+ if (audioControlHal != null) {
+ try {
+ audioControlHal.setFadeTowardFront(value);
+ } catch (RemoteException e) {
+ Log.e(CarLog.TAG_AUDIO, "setFadeTowardFront failed", e);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void setBalanceTowardRight(float value) {
+ synchronized (mImplLock) {
+ enforcePermission(Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME);
+ final IAudioControl audioControlHal = getAudioControl();
+ if (audioControlHal != null) {
+ try {
+ audioControlHal.setBalanceTowardRight(value);
+ } catch (RemoteException e) {
+ Log.e(CarLog.TAG_AUDIO, "setBalanceTowardRight failed", e);
+ }
+ }
+ }
+ }
+
+ /**
+ * @return Array of accumulated device addresses, empty array if we found nothing
+ */
+ @Override
+ public @NonNull String[] getExternalSources() {
+ synchronized (mImplLock) {
+ enforcePermission(Car.PERMISSION_CAR_CONTROL_AUDIO_SETTINGS);
+ List<String> sourceAddresses = new ArrayList<>();
+
+ AudioDeviceInfo[] devices = mAudioManager.getDevices(AudioManager.GET_DEVICES_INPUTS);
+ if (devices.length == 0) {
+ Log.w(CarLog.TAG_AUDIO, "getExternalSources, no input devices found.");
+ }
+
+ // Collect the list of non-microphone input ports
+ for (AudioDeviceInfo info : devices) {
+ switch (info.getType()) {
+ // TODO: Can we trim this set down? Especially duplicates like FM vs FM_TUNER?
+ case AudioDeviceInfo.TYPE_FM:
+ case AudioDeviceInfo.TYPE_FM_TUNER:
+ case AudioDeviceInfo.TYPE_TV_TUNER:
+ case AudioDeviceInfo.TYPE_HDMI:
+ case AudioDeviceInfo.TYPE_AUX_LINE:
+ case AudioDeviceInfo.TYPE_LINE_ANALOG:
+ case AudioDeviceInfo.TYPE_LINE_DIGITAL:
+ case AudioDeviceInfo.TYPE_USB_ACCESSORY:
+ case AudioDeviceInfo.TYPE_USB_DEVICE:
+ case AudioDeviceInfo.TYPE_USB_HEADSET:
+ case AudioDeviceInfo.TYPE_IP:
+ case AudioDeviceInfo.TYPE_BUS:
+ String address = info.getAddress();
+ if (TextUtils.isEmpty(address)) {
+ Log.w(CarLog.TAG_AUDIO,
+ "Discarded device with empty address, type=" + info.getType());
+ } else {
+ sourceAddresses.add(address);
+ }
+ }
+ }
+
+ return sourceAddresses.toArray(new String[0]);
+ }
+ }
+
+ @Override
+ public CarAudioPatchHandle createAudioPatch(String sourceAddress,
+ @AudioAttributes.AttributeUsage int usage, int gainInMillibels) {
+ synchronized (mImplLock) {
+ enforcePermission(Car.PERMISSION_CAR_CONTROL_AUDIO_SETTINGS);
+ return createAudioPatchLocked(sourceAddress, usage, gainInMillibels);
+ }
+ }
+
+ @Override
+ public void releaseAudioPatch(CarAudioPatchHandle carPatch) {
+ synchronized (mImplLock) {
+ enforcePermission(Car.PERMISSION_CAR_CONTROL_AUDIO_SETTINGS);
+ releaseAudioPatchLocked(carPatch);
+ }
+ }
+
+ private CarAudioPatchHandle createAudioPatchLocked(String sourceAddress,
+ @AudioAttributes.AttributeUsage int usage, int gainInMillibels) {
+ // Find the named source port
+ AudioDeviceInfo sourcePortInfo = null;
+ AudioDeviceInfo[] deviceInfos = mAudioManager.getDevices(AudioManager.GET_DEVICES_INPUTS);
+ for (AudioDeviceInfo info : deviceInfos) {
+ if (sourceAddress.equals(info.getAddress())) {
+ // This is the one for which we're looking
+ sourcePortInfo = info;
+ break;
+ }
+ }
+ Preconditions.checkNotNull(sourcePortInfo,
+ "Specified source is not available: " + sourceAddress);
+
+ // Find the output port associated with the given carUsage
+ AudioDevicePort sinkPort = Preconditions.checkNotNull(getAudioPort(usage),
+ "Sink not available for usage: " + AudioAttributes.usageToString(usage));
+
+ // {@link android.media.AudioPort#activeConfig()} is valid for mixer port only,
+ // since audio framework has no clue what's active on the device ports.
+ // Therefore we construct an empty / default configuration here, which the audio HAL
+ // implementation should ignore.
+ AudioPortConfig sinkConfig = sinkPort.buildConfig(0,
+ AudioFormat.CHANNEL_OUT_DEFAULT, AudioFormat.ENCODING_DEFAULT, null);
+ Log.d(CarLog.TAG_AUDIO, "createAudioPatch sinkConfig: " + sinkConfig);
+
+ // Configure the source port to match the output port except for a gain adjustment
+ final CarAudioDeviceInfo helper = new CarAudioDeviceInfo(sourcePortInfo);
+ AudioGain audioGain = Preconditions.checkNotNull(helper.getAudioGain(),
+ "Gain controller not available for source port");
+
+ // size of gain values is 1 in MODE_JOINT
+ AudioGainConfig audioGainConfig = audioGain.buildConfig(AudioGain.MODE_JOINT,
+ audioGain.channelMask(), new int[] { gainInMillibels }, 0);
+ // Construct an empty / default configuration excepts gain config here and it's up to the
+ // audio HAL how to interpret this configuration, which the audio HAL
+ // implementation should ignore.
+ AudioPortConfig sourceConfig = sourcePortInfo.getPort().buildConfig(0,
+ AudioFormat.CHANNEL_IN_DEFAULT, AudioFormat.ENCODING_DEFAULT, audioGainConfig);
+
+ // Create an audioPatch to connect the two ports
+ AudioPatch[] patch = new AudioPatch[] { null };
+ int result = AudioManager.createAudioPatch(patch,
+ new AudioPortConfig[] { sourceConfig },
+ new AudioPortConfig[] { sinkConfig });
+ if (result != AudioManager.SUCCESS) {
+ throw new RuntimeException("createAudioPatch failed with code " + result);
+ }
+
+ Preconditions.checkNotNull(patch[0],
+ "createAudioPatch didn't provide expected single handle");
+ Log.d(CarLog.TAG_AUDIO, "Audio patch created: " + patch[0]);
+
+ // Ensure the initial volume on output device port
+ int groupId = getVolumeGroupIdForUsage(CarAudioManager.PRIMARY_AUDIO_ZONE, usage);
+ setGroupVolume(CarAudioManager.PRIMARY_AUDIO_ZONE, groupId,
+ getGroupVolume(CarAudioManager.PRIMARY_AUDIO_ZONE, groupId), 0);
+
+ return new CarAudioPatchHandle(patch[0]);
+ }
+
+ private void releaseAudioPatchLocked(CarAudioPatchHandle carPatch) {
+ // NOTE: AudioPolicyService::removeNotificationClient will take care of this automatically
+ // if the client that created a patch quits.
+
+ // FIXME {@link AudioManager#listAudioPatches(ArrayList)} returns old generation of
+ // audio patches after creation
+ ArrayList<AudioPatch> patches = new ArrayList<>();
+ int result = AudioSystem.listAudioPatches(patches, new int[1]);
+ if (result != AudioManager.SUCCESS) {
+ throw new RuntimeException("listAudioPatches failed with code " + result);
+ }
+
+ // Look for a patch that matches the provided user side handle
+ for (AudioPatch patch : patches) {
+ if (carPatch.represents(patch)) {
+ // Found it!
+ result = AudioManager.releaseAudioPatch(patch);
+ if (result != AudioManager.SUCCESS) {
+ throw new RuntimeException("releaseAudioPatch failed with code " + result);
+ }
+ return;
+ }
+ }
+
+ // If we didn't find a match, then something went awry, but it's probably not fatal...
+ Log.e(CarLog.TAG_AUDIO, "releaseAudioPatch found no match for " + carPatch);
+ }
+
+ @Override
+ public int getVolumeGroupCount(int zoneId) {
+ synchronized (mImplLock) {
+ enforcePermission(Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME);
+ // For legacy stream type based volume control
+ if (!mUseDynamicRouting) return CarAudioDynamicRouting.STREAM_TYPES.length;
+
+ Preconditions.checkArgumentInRange(zoneId, 0, mCarAudioZones.length - 1,
+ "zoneId out of range: " + zoneId);
+ return mCarAudioZones[zoneId].getVolumeGroupCount();
+ }
+ }
+
+ @Override
+ public int getVolumeGroupIdForUsage(int zoneId, @AudioAttributes.AttributeUsage int usage) {
+ synchronized (mImplLock) {
+ enforcePermission(Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME);
+ Preconditions.checkArgumentInRange(zoneId, 0, mCarAudioZones.length - 1,
+ "zoneId out of range: " + zoneId);
+
+ CarVolumeGroup[] groups = mCarAudioZones[zoneId].getVolumeGroups();
+ for (int i = 0; i < groups.length; i++) {
+ int[] contexts = groups[i].getContexts();
+ for (int context : contexts) {
+ if (getContextForUsage(usage) == context) {
+ return i;
+ }
+ }
+ }
+ return -1;
+ }
+ }
+
+ @Override
+ public @NonNull int[] getUsagesForVolumeGroupId(int zoneId, int groupId) {
+ synchronized (mImplLock) {
+ enforcePermission(Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME);
+
+ // For legacy stream type based volume control
+ if (!mUseDynamicRouting) {
+ return new int[] { CarAudioDynamicRouting.STREAM_TYPE_USAGES[groupId] };
+ }
+
+ CarVolumeGroup group = getCarVolumeGroup(zoneId, groupId);
+ Set<Integer> contexts =
+ Arrays.stream(group.getContexts()).boxed().collect(Collectors.toSet());
+ final List<Integer> usages = new ArrayList<>();
+ for (int i = 0; i < CarAudioDynamicRouting.USAGE_TO_CONTEXT.size(); i++) {
+ if (contexts.contains(CarAudioDynamicRouting.USAGE_TO_CONTEXT.valueAt(i))) {
+ usages.add(CarAudioDynamicRouting.USAGE_TO_CONTEXT.keyAt(i));
+ }
+ }
+ return usages.stream().mapToInt(i -> i).toArray();
+ }
+ }
+
+ @Override
+ public void registerVolumeCallback(@NonNull IBinder binder) {
+ synchronized (mImplLock) {
+ enforcePermission(Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME);
+
+ mVolumeCallbackContainer.addBinder(ICarVolumeCallback.Stub.asInterface(binder));
+ }
+ }
+
+ @Override
+ public void unregisterVolumeCallback(@NonNull IBinder binder) {
+ synchronized (mImplLock) {
+ enforcePermission(Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME);
+
+ mVolumeCallbackContainer.removeBinder(ICarVolumeCallback.Stub.asInterface(binder));
+ }
+ }
+
+ private void enforcePermission(String permissionName) {
+ if (mContext.checkCallingOrSelfPermission(permissionName)
+ != PackageManager.PERMISSION_GRANTED) {
+ throw new SecurityException("requires permission " + permissionName);
+ }
+ }
+
+ /**
+ * @return {@link AudioDevicePort} that handles the given car audio usage.
+ * Multiple usages may share one {@link AudioDevicePort}
+ */
+ private @Nullable AudioDevicePort getAudioPort(@AudioAttributes.AttributeUsage int usage) {
+ int zoneId = CarAudioManager.PRIMARY_AUDIO_ZONE;
+ final int groupId = getVolumeGroupIdForUsage(zoneId, usage);
+ final CarVolumeGroup group = Preconditions.checkNotNull(
+ mCarAudioZones[zoneId].getVolumeGroup(groupId),
+ "Can not find CarVolumeGroup by usage: "
+ + AudioAttributes.usageToString(usage));
+ return group.getAudioDevicePortForContext(getContextForUsage(usage));
+ }
+
+ /**
+ * @return The suggested {@link AudioAttributes} usage to which the volume key events apply
+ */
+ private @AudioAttributes.AttributeUsage int getSuggestedAudioUsage() {
+ int callState = mTelephonyManager.getCallState();
+ if (callState == TelephonyManager.CALL_STATE_RINGING) {
+ return AudioAttributes.USAGE_NOTIFICATION_RINGTONE;
+ } else if (callState == TelephonyManager.CALL_STATE_OFFHOOK) {
+ return AudioAttributes.USAGE_VOICE_COMMUNICATION;
+ } else {
+ List<AudioPlaybackConfiguration> playbacks = mAudioManager
+ .getActivePlaybackConfigurations()
+ .stream()
+ .filter(AudioPlaybackConfiguration::isActive)
+ .collect(Collectors.toList());
+ if (!playbacks.isEmpty()) {
+ // Get audio usage from active playbacks if there is any, last one if multiple
+ return playbacks.get(playbacks.size() - 1).getAudioAttributes().getUsage();
+ } else {
+ // TODO(b/72695246): Otherwise, get audio usage from foreground activity/window
+ return CarAudioDynamicRouting.DEFAULT_AUDIO_USAGE;
+ }
+ }
+ }
+
+ /**
+ * Gets volume group by a given legacy stream type
+ * @param streamType Legacy stream type such as {@link AudioManager#STREAM_MUSIC}
+ * @return volume group id mapped from stream type
+ */
+ private int getVolumeGroupIdForStreamType(int streamType) {
+ int groupId = -1;
+ for (int i = 0; i < CarAudioDynamicRouting.STREAM_TYPES.length; i++) {
+ if (streamType == CarAudioDynamicRouting.STREAM_TYPES[i]) {
+ groupId = i;
+ break;
+ }
+ }
+ return groupId;
+ }
+
+ @Nullable
+ private static IAudioControl getAudioControl() {
+ try {
+ return IAudioControl.getService();
+ } catch (RemoteException e) {
+ Log.e(CarLog.TAG_AUDIO, "Failed to get IAudioControl service", e);
+ } catch (NoSuchElementException e) {
+ Log.e(CarLog.TAG_AUDIO, "IAudioControl service not registered yet");
+ }
+ return null;
+ }
+
+ interface CarAudioZonesLoader {
+ CarAudioZone[] loadAudioZones();
+ }
+}
diff --git a/service/src/com/android/car/audio/CarAudioZone.java b/service/src/com/android/car/audio/CarAudioZone.java
new file mode 100644
index 0000000..b827906
--- /dev/null
+++ b/service/src/com/android/car/audio/CarAudioZone.java
@@ -0,0 +1,146 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.audio;
+
+import android.car.media.CarAudioManager;
+import android.util.Log;
+
+import com.android.car.CarLog;
+import com.android.internal.util.Preconditions;
+
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * A class encapsulates an audio zone in car.
+ *
+ * An audio zone can contain multiple {@link CarVolumeGroup}s, and each zone has its own
+ * {@link CarAudioFocus} instance. Additionally, there may be dedicated hardware volume keys
+ * attached to each zone.
+ *
+ * See also the unified car_audio_configuration.xml
+ */
+/* package */ class CarAudioZone {
+
+ private final int mId;
+ private final String mName;
+ private final List<CarVolumeGroup> mVolumeGroups;
+
+ CarAudioZone(int id, String name) {
+ mId = id;
+ mName = name;
+ mVolumeGroups = new ArrayList<>();
+ }
+
+ int getId() {
+ return mId;
+ }
+
+ String getName() {
+ return mName;
+ }
+
+ boolean isPrimaryZone() {
+ return mId == CarAudioManager.PRIMARY_AUDIO_ZONE;
+ }
+
+ void addVolumeGroup(CarVolumeGroup volumeGroup) {
+ mVolumeGroups.add(volumeGroup);
+ }
+
+ CarVolumeGroup getVolumeGroup(int groupId) {
+ Preconditions.checkArgumentInRange(groupId, 0, mVolumeGroups.size() - 1,
+ "groupId(" + groupId + ") is out of range");
+ return mVolumeGroups.get(groupId);
+ }
+
+ int getVolumeGroupCount() {
+ return mVolumeGroups.size();
+ }
+
+ /**
+ * @return Snapshot of available {@link CarVolumeGroup}s in array.
+ */
+ CarVolumeGroup[] getVolumeGroups() {
+ return mVolumeGroups.toArray(new CarVolumeGroup[0]);
+ }
+
+ /**
+ * Constraints applied here:
+ *
+ * - One context should not appear in two groups
+ * - All contexts are assigned
+ * - One bus should not appear in two groups
+ * - All gain controllers in the same group have same step value
+ *
+ * Note that it is fine that there are buses not appear in any group, those buses may be
+ * reserved for other usages.
+ * Step value validation is done in {@link CarVolumeGroup#bind(int, int, CarAudioDeviceInfo)}
+ */
+ boolean validateVolumeGroups() {
+ Set<Integer> contextSet = new HashSet<>();
+ Set<Integer> busNumberSet = new HashSet<>();
+ for (CarVolumeGroup group : mVolumeGroups) {
+ // One context should not appear in two groups
+ for (int context : group.getContexts()) {
+ if (contextSet.contains(context)) {
+ Log.e(CarLog.TAG_AUDIO, "Context appears in two groups: " + context);
+ return false;
+ }
+ contextSet.add(context);
+ }
+
+ // One bus should not appear in two groups
+ for (int busNumber : group.getBusNumbers()) {
+ if (busNumberSet.contains(busNumber)) {
+ Log.e(CarLog.TAG_AUDIO, "Bus appears in two groups: " + busNumber);
+ return false;
+ }
+ busNumberSet.add(busNumber);
+ }
+ }
+
+ // All contexts are assigned
+ if (contextSet.size() != CarAudioDynamicRouting.CONTEXT_NUMBERS.length) {
+ Log.e(CarLog.TAG_AUDIO, "Some contexts are not assigned to group");
+ Log.e(CarLog.TAG_AUDIO, "Assigned contexts "
+ + Arrays.toString(contextSet.toArray(new Integer[0])));
+ Log.e(CarLog.TAG_AUDIO,
+ "All contexts " + Arrays.toString(CarAudioDynamicRouting.CONTEXT_NUMBERS));
+ return false;
+ }
+
+ return true;
+ }
+
+ void synchronizeCurrentGainIndex() {
+ for (CarVolumeGroup group : mVolumeGroups) {
+ group.setCurrentGainIndex(group.getCurrentGainIndex());
+ }
+ }
+
+ void dump(String indent, PrintWriter writer) {
+ writer.printf("%sCarAudioZone(%s:%d) isPrimary? %b\n", indent, mName, mId, isPrimaryZone());
+ for (CarVolumeGroup group : mVolumeGroups) {
+ group.dump(indent + "\t", writer);
+ }
+ writer.println();
+ }
+}
diff --git a/service/src/com/android/car/audio/CarAudioZonesHelper.java b/service/src/com/android/car/audio/CarAudioZonesHelper.java
new file mode 100644
index 0000000..0acae73
--- /dev/null
+++ b/service/src/com/android/car/audio/CarAudioZonesHelper.java
@@ -0,0 +1,227 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.audio;
+
+import android.annotation.NonNull;
+import android.car.media.CarAudioManager;
+import android.content.Context;
+import android.hardware.automotive.audiocontrol.V1_0.ContextNumber;
+import android.util.Log;
+import android.util.SparseArray;
+import android.util.Xml;
+
+import com.android.car.CarLog;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * A helper class loads all audio zones from the configuration XML file.
+ */
+/* package */ class CarAudioZonesHelper implements CarAudioService.CarAudioZonesLoader {
+
+ private static final String NAMESPACE = null;
+ private static final String TAG_ROOT = "carAudioConfiguration";
+ private static final String TAG_AUDIO_ZONES = "zones";
+ private static final String TAG_AUDIO_ZONE = "zone";
+ private static final String TAG_VOLUME_GROUPS = "volumeGroups";
+ private static final String TAG_VOLUME_GROUP = "group";
+ private static final String TAG_AUDIO_DEVICE = "device";
+ private static final String TAG_CONTEXT = "context";
+ private static final String ATTR_VERSION = "version";
+ private static final String ATTR_IS_PRIMARY = "isPrimary";
+ private static final String ATTR_ZONE_NAME = "name";
+ private static final String ATTR_DEVICE_ADDRESS = "address";
+ private static final String ATTR_CONTEXT_NAME = "context";
+ private static final int SUPPORTED_VERSION = 1;
+
+ private static final Map<String, Integer> CONTEXT_NAME_MAP;
+
+ static {
+ CONTEXT_NAME_MAP = new HashMap<>();
+ CONTEXT_NAME_MAP.put("music", ContextNumber.MUSIC);
+ CONTEXT_NAME_MAP.put("navigation", ContextNumber.NAVIGATION);
+ CONTEXT_NAME_MAP.put("voice_command", ContextNumber.VOICE_COMMAND);
+ CONTEXT_NAME_MAP.put("call_ring", ContextNumber.CALL_RING);
+ CONTEXT_NAME_MAP.put("call", ContextNumber.CALL);
+ CONTEXT_NAME_MAP.put("alarm", ContextNumber.ALARM);
+ CONTEXT_NAME_MAP.put("notification", ContextNumber.NOTIFICATION);
+ CONTEXT_NAME_MAP.put("system_sound", ContextNumber.SYSTEM_SOUND);
+ }
+
+ private final Context mContext;
+ private final String mXmlConfigurationPath;
+ private final SparseArray<CarAudioDeviceInfo> mBusToCarAudioDeviceInfo;
+
+ private int mNextSecondaryZoneId;
+
+ CarAudioZonesHelper(Context context, @NonNull String xmlConfigurationPath,
+ @NonNull SparseArray<CarAudioDeviceInfo> busToCarAudioDeviceInfo) {
+ mContext = context;
+ mXmlConfigurationPath = xmlConfigurationPath;
+ mBusToCarAudioDeviceInfo = busToCarAudioDeviceInfo;
+
+ mNextSecondaryZoneId = CarAudioManager.PRIMARY_AUDIO_ZONE + 1;
+ }
+
+ @Override
+ public CarAudioZone[] loadAudioZones() {
+ List<CarAudioZone> carAudioZones = new ArrayList<>();
+ try (InputStream stream = new FileInputStream(mXmlConfigurationPath)) {
+ final XmlPullParser parser = Xml.newPullParser();
+ parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, NAMESPACE != null);
+ parser.setInput(stream, null);
+
+ // Ensure <carAudioConfiguration> is the root
+ parser.nextTag();
+ parser.require(XmlPullParser.START_TAG, NAMESPACE, TAG_ROOT);
+
+ // Version check
+ final int versionNumber = Integer.parseInt(
+ parser.getAttributeValue(NAMESPACE, ATTR_VERSION));
+ if (versionNumber != SUPPORTED_VERSION) {
+ throw new RuntimeException("Support version:"
+ + SUPPORTED_VERSION + " only, got version:" + versionNumber);
+ }
+
+ // Get all zones configured under <zones> tag
+ while (parser.next() != XmlPullParser.END_TAG) {
+ if (parser.getEventType() != XmlPullParser.START_TAG) continue;
+ if (TAG_AUDIO_ZONES.equals(parser.getName())) {
+ parseAudioZones(parser, carAudioZones);
+ } else {
+ skip(parser);
+ }
+ }
+ } catch (Exception e) {
+ Log.e(CarLog.TAG_AUDIO, "Error parsing unified car audio configuration", e);
+ }
+ return carAudioZones.toArray(new CarAudioZone[0]);
+ }
+
+ private void parseAudioZones(XmlPullParser parser, List<CarAudioZone> carAudioZones)
+ throws XmlPullParserException, IOException {
+ while (parser.next() != XmlPullParser.END_TAG) {
+ if (parser.getEventType() != XmlPullParser.START_TAG) continue;
+ if (TAG_AUDIO_ZONE.equals(parser.getName())) {
+ carAudioZones.add(parseAudioZone(parser));
+ } else {
+ skip(parser);
+ }
+ }
+ }
+
+ private CarAudioZone parseAudioZone(XmlPullParser parser)
+ throws XmlPullParserException, IOException {
+ final boolean isPrimary = Boolean.parseBoolean(
+ parser.getAttributeValue(NAMESPACE, ATTR_IS_PRIMARY));
+ final String zoneName = parser.getAttributeValue(NAMESPACE, ATTR_ZONE_NAME);
+
+ CarAudioZone zone = new CarAudioZone(
+ isPrimary ? CarAudioManager.PRIMARY_AUDIO_ZONE : getNextSecondaryZoneId(),
+ zoneName);
+ while (parser.next() != XmlPullParser.END_TAG) {
+ if (parser.getEventType() != XmlPullParser.START_TAG) continue;
+ // Expect one <volumeGroups> in one audio zone
+ if (TAG_VOLUME_GROUPS.equals(parser.getName())) {
+ parseVolumeGroups(parser, zone);
+ } else {
+ skip(parser);
+ }
+ }
+ return zone;
+ }
+
+ private void parseVolumeGroups(XmlPullParser parser, CarAudioZone zone)
+ throws XmlPullParserException, IOException {
+ int groupId = 0;
+ while (parser.next() != XmlPullParser.END_TAG) {
+ if (parser.getEventType() != XmlPullParser.START_TAG) continue;
+ if (TAG_VOLUME_GROUP.equals(parser.getName())) {
+ zone.addVolumeGroup(parseVolumeGroup(parser, zone.getId(), groupId));
+ groupId++;
+ } else {
+ skip(parser);
+ }
+ }
+ }
+
+ private CarVolumeGroup parseVolumeGroup(XmlPullParser parser, int zoneId, int groupId)
+ throws XmlPullParserException, IOException {
+ final CarVolumeGroup group = new CarVolumeGroup(mContext, zoneId, groupId);
+ while (parser.next() != XmlPullParser.END_TAG) {
+ if (parser.getEventType() != XmlPullParser.START_TAG) continue;
+ if (TAG_AUDIO_DEVICE.equals(parser.getName())) {
+ String address = parser.getAttributeValue(NAMESPACE, ATTR_DEVICE_ADDRESS);
+ parseVolumeGroupContexts(parser, group,
+ CarAudioDeviceInfo.parseDeviceAddress(address));
+ } else {
+ skip(parser);
+ }
+ }
+ return group;
+ }
+
+ private void parseVolumeGroupContexts(
+ XmlPullParser parser, CarVolumeGroup group, int busNumber)
+ throws XmlPullParserException, IOException {
+ while (parser.next() != XmlPullParser.END_TAG) {
+ if (parser.getEventType() != XmlPullParser.START_TAG) continue;
+ if (TAG_CONTEXT.equals(parser.getName())) {
+ group.bind(
+ parseContextNumber(parser.getAttributeValue(NAMESPACE, ATTR_CONTEXT_NAME)),
+ busNumber, mBusToCarAudioDeviceInfo.get(busNumber));
+ }
+ // Always skip to upper level since we're at the lowest.
+ skip(parser);
+ }
+ }
+
+ private void skip(XmlPullParser parser) throws XmlPullParserException, IOException {
+ if (parser.getEventType() != XmlPullParser.START_TAG) {
+ throw new IllegalStateException();
+ }
+ int depth = 1;
+ while (depth != 0) {
+ switch (parser.next()) {
+ case XmlPullParser.END_TAG:
+ depth--;
+ break;
+ case XmlPullParser.START_TAG:
+ depth++;
+ break;
+ }
+ }
+ }
+
+ private int parseContextNumber(String context) {
+ return CONTEXT_NAME_MAP.getOrDefault(context.toLowerCase(), ContextNumber.INVALID);
+ }
+
+ private int getNextSecondaryZoneId() {
+ int zoneId = mNextSecondaryZoneId;
+ mNextSecondaryZoneId += 1;
+ return zoneId;
+ }
+}
diff --git a/service/src/com/android/car/audio/CarAudioZonesHelperLegacy.java b/service/src/com/android/car/audio/CarAudioZonesHelperLegacy.java
new file mode 100644
index 0000000..fb5481d
--- /dev/null
+++ b/service/src/com/android/car/audio/CarAudioZonesHelperLegacy.java
@@ -0,0 +1,148 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.audio;
+
+import android.annotation.NonNull;
+import android.annotation.XmlRes;
+import android.car.media.CarAudioManager;
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.content.res.XmlResourceParser;
+import android.hardware.automotive.audiocontrol.V1_0.IAudioControl;
+import android.os.RemoteException;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.util.SparseArray;
+import android.util.SparseIntArray;
+import android.util.Xml;
+
+import com.android.car.CarLog;
+import com.android.car.R;
+
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * A helper class loads volume groups from car_volume_groups.xml configuration into one zone.
+ *
+ * @deprecated This is replaced by {@link CarAudioZonesHelper}.
+ */
+@Deprecated
+/* package */ class CarAudioZonesHelperLegacy implements CarAudioService.CarAudioZonesLoader {
+
+ private static final String TAG_VOLUME_GROUPS = "volumeGroups";
+ private static final String TAG_GROUP = "group";
+ private static final String TAG_CONTEXT = "context";
+
+ private final Context mContext;
+ private final @XmlRes int mXmlConfiguration;
+ private final SparseIntArray mContextToBus;
+ private final SparseArray<CarAudioDeviceInfo> mBusToCarAudioDeviceInfo;
+
+ CarAudioZonesHelperLegacy(Context context, @XmlRes int xmlConfiguration,
+ @NonNull SparseArray<CarAudioDeviceInfo> busToCarAudioDeviceInfo,
+ @NonNull IAudioControl audioControl) {
+ mContext = context;
+ mXmlConfiguration = xmlConfiguration;
+ mBusToCarAudioDeviceInfo = busToCarAudioDeviceInfo;
+
+ // Initialize context => bus mapping once.
+ mContextToBus = new SparseIntArray();
+ try {
+ for (int contextNumber : CarAudioDynamicRouting.CONTEXT_NUMBERS) {
+ mContextToBus.put(contextNumber, audioControl.getBusForContext(contextNumber));
+ }
+ } catch (RemoteException e) {
+ Log.e(CarLog.TAG_AUDIO, "Failed to query IAudioControl HAL", e);
+ e.rethrowAsRuntimeException();
+ }
+ }
+
+ @Override
+ public CarAudioZone[] loadAudioZones() {
+ final CarAudioZone zone = new CarAudioZone(CarAudioManager.PRIMARY_AUDIO_ZONE,
+ "Primary zone");
+ for (CarVolumeGroup group : loadVolumeGroups()) {
+ zone.addVolumeGroup(group);
+ // Binding audio device to volume group.
+ for (int contextNumber : group.getContexts()) {
+ int busNumber = mContextToBus.get(contextNumber);
+ group.bind(contextNumber, busNumber, mBusToCarAudioDeviceInfo.get(busNumber));
+ }
+ }
+ return new CarAudioZone[] { zone };
+ }
+
+ /**
+ * @return all {@link CarVolumeGroup} read from configuration.
+ */
+ private List<CarVolumeGroup> loadVolumeGroups() {
+ List<CarVolumeGroup> carVolumeGroups = new ArrayList<>();
+ try (XmlResourceParser parser = mContext.getResources().getXml(mXmlConfiguration)) {
+ AttributeSet attrs = Xml.asAttributeSet(parser);
+ int type;
+ // Traverse to the first start tag
+ while ((type = parser.next()) != XmlResourceParser.END_DOCUMENT
+ && type != XmlResourceParser.START_TAG) {
+ // ignored
+ }
+
+ if (!TAG_VOLUME_GROUPS.equals(parser.getName())) {
+ throw new RuntimeException("Meta-data does not start with volumeGroups tag");
+ }
+ int outerDepth = parser.getDepth();
+ int id = 0;
+ while ((type = parser.next()) != XmlResourceParser.END_DOCUMENT
+ && (type != XmlResourceParser.END_TAG || parser.getDepth() > outerDepth)) {
+ if (type == XmlResourceParser.END_TAG) {
+ continue;
+ }
+ if (TAG_GROUP.equals(parser.getName())) {
+ carVolumeGroups.add(parseVolumeGroup(id, attrs, parser));
+ id++;
+ }
+ }
+ } catch (Exception e) {
+ Log.e(CarLog.TAG_AUDIO, "Error parsing volume groups configuration", e);
+ }
+ return carVolumeGroups;
+ }
+
+ private CarVolumeGroup parseVolumeGroup(int id, AttributeSet attrs, XmlResourceParser parser)
+ throws XmlPullParserException, IOException {
+ List<Integer> contexts = new ArrayList<>();
+ int type;
+ int innerDepth = parser.getDepth();
+ while ((type = parser.next()) != XmlResourceParser.END_DOCUMENT
+ && (type != XmlResourceParser.END_TAG || parser.getDepth() > innerDepth)) {
+ if (type == XmlResourceParser.END_TAG) {
+ continue;
+ }
+ if (TAG_CONTEXT.equals(parser.getName())) {
+ TypedArray c = mContext.getResources().obtainAttributes(
+ attrs, R.styleable.volumeGroups_context);
+ contexts.add(c.getInt(R.styleable.volumeGroups_context_context, -1));
+ c.recycle();
+ }
+ }
+
+ return new CarVolumeGroup(mContext, CarAudioManager.PRIMARY_AUDIO_ZONE, id,
+ contexts.stream().mapToInt(i -> i).filter(i -> i >= 0).toArray());
+ }
+}
diff --git a/service/src/com/android/car/audio/CarVolumeGroup.java b/service/src/com/android/car/audio/CarVolumeGroup.java
new file mode 100644
index 0000000..eb3cc4f
--- /dev/null
+++ b/service/src/com/android/car/audio/CarVolumeGroup.java
@@ -0,0 +1,272 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.audio;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.car.media.CarAudioManager;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.hardware.automotive.audiocontrol.V1_0.ContextNumber;
+import android.media.AudioDevicePort;
+import android.provider.Settings;
+import android.util.SparseArray;
+import android.util.SparseIntArray;
+
+import com.android.internal.util.Preconditions;
+
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * A class encapsulates a volume group in car.
+ *
+ * Volume in a car is controlled by group. A group holds one or more car audio contexts.
+ * Call {@link CarAudioManager#getVolumeGroupCount()} to get the count of {@link CarVolumeGroup}
+ * supported in a car.
+ */
+/* package */ final class CarVolumeGroup {
+
+ private final ContentResolver mContentResolver;
+ private final int mZoneId;
+ private final int mId;
+ private final SparseIntArray mContextToBus = new SparseIntArray();
+ private final SparseArray<CarAudioDeviceInfo> mBusToCarAudioDeviceInfo = new SparseArray<>();
+
+ private int mDefaultGain = Integer.MIN_VALUE;
+ private int mMaxGain = Integer.MIN_VALUE;
+ private int mMinGain = Integer.MAX_VALUE;
+ private int mStepSize = 0;
+ private int mStoredGainIndex;
+ private int mCurrentGainIndex = -1;
+
+ /**
+ * Constructs a {@link CarVolumeGroup} instance
+ * @param context {@link Context} instance
+ * @param zoneId Audio zone this volume group belongs to
+ * @param id ID of this volume group
+ */
+ CarVolumeGroup(Context context, int zoneId, int id) {
+ mContentResolver = context.getContentResolver();
+ mZoneId = zoneId;
+ mId = id;
+ mStoredGainIndex = Settings.Global.getInt(mContentResolver,
+ CarAudioService.getVolumeSettingsKeyForGroup(mZoneId, mId), -1);
+ }
+
+ /**
+ * Constructs a {@link CarVolumeGroup} instance
+ * @param context {@link Context} instance
+ * @param zoneId Audio zone this volume group belongs to
+ * @param id ID of this volume group
+ * @param contexts Pre-populated array of car contexts, for legacy car_volume_groups.xml only
+ * @deprecated In favor of {@link #CarVolumeGroup(Context, int, int)}
+ */
+ @Deprecated
+ CarVolumeGroup(Context context, int zoneId, int id, @NonNull int[] contexts) {
+ this(context, zoneId, id);
+ // Deal with the pre-populated car audio contexts
+ for (int audioContext : contexts) {
+ mContextToBus.put(audioContext, -1);
+ }
+ }
+
+ /**
+ * @param busNumber Physical bus number for the audio device port
+ * @return {@link CarAudioDeviceInfo} associated with a given bus number
+ */
+ CarAudioDeviceInfo getCarAudioDeviceInfoForBus(int busNumber) {
+ return mBusToCarAudioDeviceInfo.get(busNumber);
+ }
+
+ /**
+ * @return Array of context numbers in this {@link CarVolumeGroup}
+ */
+ int[] getContexts() {
+ final int[] contextNumbers = new int[mContextToBus.size()];
+ for (int i = 0; i < contextNumbers.length; i++) {
+ contextNumbers[i] = mContextToBus.keyAt(i);
+ }
+ return contextNumbers;
+ }
+
+ /**
+ * @param busNumber Physical bus number for the audio device port
+ * @return Array of context numbers assigned to a given bus number
+ */
+ int[] getContextsForBus(int busNumber) {
+ List<Integer> contextNumbers = new ArrayList<>();
+ for (int i = 0; i < mContextToBus.size(); i++) {
+ int value = mContextToBus.valueAt(i);
+ if (value == busNumber) {
+ contextNumbers.add(mContextToBus.keyAt(i));
+ }
+ }
+ return contextNumbers.stream().mapToInt(i -> i).toArray();
+ }
+
+ /**
+ * @return Array of bus numbers in this {@link CarVolumeGroup}
+ */
+ int[] getBusNumbers() {
+ final int[] busNumbers = new int[mBusToCarAudioDeviceInfo.size()];
+ for (int i = 0; i < busNumbers.length; i++) {
+ busNumbers[i] = mBusToCarAudioDeviceInfo.keyAt(i);
+ }
+ return busNumbers;
+ }
+
+ /**
+ * Binds the context number to physical bus number and audio device port information.
+ * Because this may change the groups min/max values, thus invalidating an index computed from
+ * a gain before this call, all calls to this function must happen at startup before any
+ * set/getGainIndex calls.
+ *
+ * @param contextNumber Context number as defined in audio control HAL
+ * @param busNumber Physical bus number for the audio device port
+ * @param info {@link CarAudioDeviceInfo} instance relates to the physical bus
+ */
+ void bind(int contextNumber, int busNumber, CarAudioDeviceInfo info) {
+ if (mBusToCarAudioDeviceInfo.size() == 0) {
+ mStepSize = info.getAudioGain().stepValue();
+ } else {
+ Preconditions.checkArgument(
+ info.getAudioGain().stepValue() == mStepSize,
+ "Gain controls within one group must have same step value");
+ }
+
+ mContextToBus.put(contextNumber, busNumber);
+ mBusToCarAudioDeviceInfo.put(busNumber, info);
+
+ if (info.getDefaultGain() > mDefaultGain) {
+ // We're arbitrarily selecting the highest bus default gain as the group's default.
+ mDefaultGain = info.getDefaultGain();
+ }
+ if (info.getMaxGain() > mMaxGain) {
+ mMaxGain = info.getMaxGain();
+ }
+ if (info.getMinGain() < mMinGain) {
+ mMinGain = info.getMinGain();
+ }
+ if (mStoredGainIndex < getMinGainIndex() || mStoredGainIndex > getMaxGainIndex()) {
+ // We expected to load a value from last boot, but if we didn't (perhaps this is the
+ // first boot ever?), then use the highest "default" we've seen to initialize
+ // ourselves.
+ mCurrentGainIndex = getIndexForGain(mDefaultGain);
+ } else {
+ // Just use the gain index we stored last time the gain was set (presumably during our
+ // last boot cycle).
+ mCurrentGainIndex = mStoredGainIndex;
+ }
+ }
+
+ private int getDefaultGainIndex() {
+ return getIndexForGain(mDefaultGain);
+ }
+
+ int getMaxGainIndex() {
+ return getIndexForGain(mMaxGain);
+ }
+
+ int getMinGainIndex() {
+ return getIndexForGain(mMinGain);
+ }
+
+ int getCurrentGainIndex() {
+ return mCurrentGainIndex;
+ }
+
+ /**
+ * Sets the gain on this group, gain will be set on all buses within same bus.
+ * @param gainIndex The gain index
+ */
+ void setCurrentGainIndex(int gainIndex) {
+ int gainInMillibels = getGainForIndex(gainIndex);
+
+ Preconditions.checkArgument(
+ gainInMillibels >= mMinGain && gainInMillibels <= mMaxGain,
+ "Gain out of range ("
+ + mMinGain + ":"
+ + mMaxGain + ") "
+ + gainInMillibels + "index "
+ + gainIndex);
+
+ for (int i = 0; i < mBusToCarAudioDeviceInfo.size(); i++) {
+ CarAudioDeviceInfo info = mBusToCarAudioDeviceInfo.valueAt(i);
+ info.setCurrentGain(gainInMillibels);
+ }
+
+ mCurrentGainIndex = gainIndex;
+ Settings.Global.putInt(mContentResolver,
+ CarAudioService.getVolumeSettingsKeyForGroup(mZoneId, mId), gainIndex);
+ }
+
+ // Given a group level gain index, return the computed gain in millibells
+ // TODO (randolphs) If we ever want to add index to gain curves other than lock-stepped
+ // linear, this would be the place to do it.
+ private int getGainForIndex(int gainIndex) {
+ return mMinGain + gainIndex * mStepSize;
+ }
+
+ // TODO (randolphs) if we ever went to a non-linear index to gain curve mapping, we'd need to
+ // revisit this as it assumes (at the least) that getGainForIndex is reversible. Luckily,
+ // this is an internal implementation details we could factor out if/when necessary.
+ private int getIndexForGain(int gainInMillibel) {
+ return (gainInMillibel - mMinGain) / mStepSize;
+ }
+
+ /**
+ * Gets {@link AudioDevicePort} from a context number
+ */
+ @Nullable
+ AudioDevicePort getAudioDevicePortForContext(int contextNumber) {
+ final int busNumber = mContextToBus.get(contextNumber, -1);
+ if (busNumber < 0 || mBusToCarAudioDeviceInfo.get(busNumber) == null) {
+ return null;
+ }
+ return mBusToCarAudioDeviceInfo.get(busNumber).getAudioDevicePort();
+ }
+
+ @Override
+ public String toString() {
+ return "CarVolumeGroup id: " + mId
+ + " currentGainIndex: " + mCurrentGainIndex
+ + " contexts: " + Arrays.toString(getContexts())
+ + " buses: " + Arrays.toString(getBusNumbers());
+ }
+
+ /** Writes to dumpsys output */
+ void dump(String indent, PrintWriter writer) {
+ writer.printf("%sCarVolumeGroup(%d)\n", indent, mId);
+ writer.printf("%sGain values (min / max / default/ current): %d %d %d %d\n",
+ indent, mMinGain, mMaxGain,
+ mDefaultGain, getGainForIndex(mCurrentGainIndex));
+ writer.printf("%sGain indexes (min / max / default / current): %d %d %d %d\n",
+ indent, getMinGainIndex(), getMaxGainIndex(),
+ getDefaultGainIndex(), mCurrentGainIndex);
+ for (int i = 0; i < mContextToBus.size(); i++) {
+ writer.printf("%sContext: %s -> Bus: %d\n", indent,
+ ContextNumber.toString(mContextToBus.keyAt(i)), mContextToBus.valueAt(i));
+ }
+ for (int i = 0; i < mBusToCarAudioDeviceInfo.size(); i++) {
+ mBusToCarAudioDeviceInfo.valueAt(i).dump(indent, writer);
+ }
+ // Empty line for comfortable reading
+ writer.println();
+ }
+}
diff --git a/service/src/com/android/car/cluster/InstrumentClusterService.java b/service/src/com/android/car/cluster/InstrumentClusterService.java
index ab3ea62..b491350 100644
--- a/service/src/com/android/car/cluster/InstrumentClusterService.java
+++ b/service/src/com/android/car/cluster/InstrumentClusterService.java
@@ -15,36 +15,24 @@
*/
package com.android.car.cluster;
-import static android.content.pm.PackageManager.PERMISSION_GRANTED;
-
import android.annotation.Nullable;
import android.annotation.SystemApi;
-import android.car.Car;
import android.car.CarAppFocusManager;
-import android.car.cluster.CarInstrumentClusterManager;
import android.car.cluster.IInstrumentClusterManagerCallback;
import android.car.cluster.IInstrumentClusterManagerService;
import android.car.cluster.renderer.IInstrumentCluster;
-import android.car.cluster.renderer.IInstrumentClusterCallback;
import android.car.cluster.renderer.IInstrumentClusterNavigation;
-import android.car.cluster.renderer.InstrumentClusterRenderingService;
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.Binder;
-import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
-import android.os.IBinder.DeathRecipient;
import android.os.Message;
-import android.os.Process;
import android.os.RemoteException;
+import android.os.UserHandle;
import android.text.TextUtils;
import android.util.Log;
-import android.util.Pair;
import android.view.KeyEvent;
import com.android.car.AppFocusService;
@@ -57,11 +45,7 @@
import com.android.internal.annotations.GuardedBy;
import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.Objects;
/**
* Service responsible for interaction with car's instrument cluster.
@@ -69,41 +53,39 @@
* @hide
*/
@SystemApi
-public class InstrumentClusterService implements CarServiceBase,
- FocusOwnershipCallback, KeyEventListener {
-
+public class InstrumentClusterService implements CarServiceBase, FocusOwnershipCallback,
+ KeyEventListener {
private static final String TAG = CarLog.TAG_CLUSTER;
- private static final Boolean DBG = false;
+ private static final ContextOwner NO_OWNER = new ContextOwner(0, 0);
private final Context mContext;
-
private final AppFocusService mAppFocusService;
private final CarInputService mCarInputService;
- private final PackageManager mPackageManager;
- private final Object mSync = new Object();
-
- private final ClusterServiceCallback mClusterCallback = new ClusterServiceCallback();
+ /**
+ * TODO: (b/121277787) Remove this on master.
+ * @deprecated CarInstrumentClusterManager is being deprecated.
+ */
+ @Deprecated
private final ClusterManagerService mClusterManagerService = new ClusterManagerService();
-
+ private final Object mSync = new Object();
@GuardedBy("mSync")
- private ContextOwner mNavContextOwner;
+ private ContextOwner mNavContextOwner = NO_OWNER;
@GuardedBy("mSync")
private IInstrumentCluster mRendererService;
- @GuardedBy("mSync")
- private final HashMap<String, ClusterActivityInfo> mActivityInfoByCategory = new HashMap<>();
- @GuardedBy("mSync")
- private final HashMap<IBinder, ManagerCallbackInfo> mManagerCallbacks = new HashMap<>();
-
// If renderer service crashed / stopped and this class fails to rebind with it immediately,
// we should wait some time before next attempt. This may happen during APK update for example.
private DeferredRebinder mDeferredRebinder;
-
+ // Whether {@link android.car.cluster.renderer.InstrumentClusterRendererService} is bound
+ // (although not necessarily connected)
private boolean mRendererBound = false;
+ /**
+ * Connection to {@link android.car.cluster.renderer.InstrumentClusterRendererService}
+ */
private final ServiceConnection mRendererServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder binder) {
- if (DBG) {
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
Log.d(TAG, "onServiceConnected, name: " + name + ", binder: " + binder);
}
IInstrumentCluster service = IInstrumentCluster.Stub.asInterface(binder);
@@ -112,14 +94,17 @@
mRendererService = service;
navContextOwner = mNavContextOwner;
}
- if (navContextOwner != null && service != null) {
- notifyNavContextOwnerChanged(service, navContextOwner.uid, navContextOwner.pid);
+ if (navContextOwner != null && service != null) {
+ notifyNavContextOwnerChanged(service, navContextOwner);
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
- Log.d(TAG, "onServiceDisconnected, name: " + name);
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "onServiceDisconnected, name: " + name);
+ }
+ mContext.unbindService(this);
mRendererBound = false;
synchronized (mSync) {
@@ -138,12 +123,11 @@
mContext = context;
mAppFocusService = appFocusService;
mCarInputService = carInputService;
- mPackageManager = mContext.getPackageManager();
}
@Override
public void init() {
- if (DBG) {
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
Log.d(TAG, "init");
}
@@ -154,7 +138,7 @@
@Override
public void release() {
- if (DBG) {
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
Log.d(TAG, "release");
}
@@ -170,51 +154,51 @@
writer.println("**" + getClass().getSimpleName() + "**");
writer.println("bound with renderer: " + mRendererBound);
writer.println("renderer service: " + mRendererService);
+ writer.println("context owner: " + mNavContextOwner);
}
@Override
public void onFocusAcquired(int appType, int uid, int pid) {
- if (appType != CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION) {
- return;
- }
-
- IInstrumentCluster service;
- synchronized (mSync) {
- mNavContextOwner = new ContextOwner(uid, pid);
- service = mRendererService;
- }
-
- if (service != null) {
- notifyNavContextOwnerChanged(service, uid, pid);
- }
+ changeNavContextOwner(appType, uid, pid, true);
}
@Override
public void onFocusAbandoned(int appType, int uid, int pid) {
+ changeNavContextOwner(appType, uid, pid, false);
+ }
+
+ private void changeNavContextOwner(int appType, int uid, int pid, boolean acquire) {
if (appType != CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION) {
return;
}
IInstrumentCluster service;
+ ContextOwner requester = new ContextOwner(uid, pid);
+ ContextOwner newOwner = acquire ? requester : NO_OWNER;
synchronized (mSync) {
- if (mNavContextOwner == null
- || mNavContextOwner.uid != uid
- || mNavContextOwner.pid != pid) {
- return; // Nothing to do here, no active focus or not owned by this client.
+ if ((acquire && Objects.equals(mNavContextOwner, requester))
+ || (!acquire && !Objects.equals(mNavContextOwner, requester))) {
+ // Nothing to do here. Either the same owner is acquiring twice, or someone is
+ // abandoning a focus they didn't have.
+ Log.w(TAG, "Invalid nav context owner change (acquiring: " + acquire
+ + "), current owner: [" + mNavContextOwner
+ + "], requester: [" + requester + "]");
+ return;
}
- mNavContextOwner = null;
+ mNavContextOwner = newOwner;
service = mRendererService;
}
if (service != null) {
- notifyNavContextOwnerChanged(service, 0, 0);
+ notifyNavContextOwnerChanged(service, newOwner);
}
}
- private static void notifyNavContextOwnerChanged(IInstrumentCluster service, int uid, int pid) {
+ private static void notifyNavContextOwnerChanged(IInstrumentCluster service,
+ ContextOwner owner) {
try {
- service.setNavigationContextOwner(uid, pid);
+ service.setNavigationContextOwner(owner.uid, owner.pid);
} catch (RemoteException e) {
Log.e(TAG, "Failed to call setNavigationContextOwner", e);
}
@@ -231,23 +215,14 @@
Intent intent = new Intent();
intent.setComponent(ComponentName.unflattenFromString(rendererService));
- Bundle extras = new Bundle();
- extras.putBinder(
- InstrumentClusterRenderingService.EXTRA_KEY_CALLBACK_SERVICE,
- mClusterCallback);
- intent.putExtras(extras);
- return mContext.bindService(intent, mRendererServiceConnection,
- Context.BIND_AUTO_CREATE | Context.BIND_IMPORTANT);
+ return mContext.bindServiceAsUser(intent, mRendererServiceConnection,
+ Context.BIND_AUTO_CREATE | Context.BIND_IMPORTANT, UserHandle.SYSTEM);
}
@Nullable
public IInstrumentClusterNavigation getNavigationService() {
- IInstrumentCluster service;
- synchronized (mSync) {
- service = mRendererService;
- }
-
try {
+ IInstrumentCluster service = getInstrumentClusterRendererService();
return service == null ? null : service.getNavigationService();
} catch (RemoteException e) {
Log.e(TAG, "getNavigationServiceBinder" , e);
@@ -255,21 +230,21 @@
}
}
+ /**
+ * @deprecated {@link android.car.cluster.CarInstrumentClusterManager} is now deprecated.
+ */
+ @Deprecated
public IInstrumentClusterManagerService.Stub getManagerService() {
return mClusterManagerService;
}
@Override
- public boolean onKeyEvent(KeyEvent event) {
- if (DBG) {
+ public void onKeyEvent(KeyEvent event) {
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
Log.d(TAG, "InstrumentClusterService#onKeyEvent: " + event);
}
- IInstrumentCluster service;
- synchronized (mSync) {
- service = mRendererService;
- }
-
+ IInstrumentCluster service = getInstrumentClusterRendererService();
if (service != null) {
try {
service.onKeyEvent(event);
@@ -277,7 +252,14 @@
Log.e(TAG, "onKeyEvent", e);
}
}
- return true;
+ }
+
+ private IInstrumentCluster getInstrumentClusterRendererService() {
+ IInstrumentCluster service;
+ synchronized (mSync) {
+ service = mRendererService;
+ }
+ return service;
}
private static class ContextOwner {
@@ -288,249 +270,47 @@
this.uid = uid;
this.pid = pid;
}
- }
- private static class ClusterActivityInfo {
- Bundle launchOptions; // ActivityOptions
- Bundle state; // ClusterActivityState
- }
-
- private void enforcePermission(String permission) {
- int callingUid = Binder.getCallingUid();
- int callingPid = Binder.getCallingPid();
- if (Binder.getCallingUid() == Process.myUid()) {
- if (mContext.checkCallingOrSelfPermission(permission) != PERMISSION_GRANTED) {
- throw new SecurityException("Permission " + permission + " is not granted to "
- + "client {uid: " + callingUid + ", pid: " + callingPid + "}");
- }
- }
- }
-
- private void enforceClusterControlPermission() {
- enforcePermission(Car.PERMISSION_CAR_INSTRUMENT_CLUSTER_CONTROL);
- }
-
- private void doStartClusterActivity(Intent intent) {
- enforceClusterControlPermission();
-
- // Category from given intent should match category from cluster vendor implementation.
- List<ResolveInfo> resolveList = mPackageManager.queryIntentActivities(intent,
- PackageManager.GET_RESOLVED_FILTER);
- if (resolveList == null || resolveList.isEmpty()) {
- Log.w(TAG, "Failed to resolve an intent: " + intent);
- return;
- }
-
- resolveList = checkPermission(resolveList, Car.PERMISSION_CAR_DISPLAY_IN_CLUSTER);
- if (resolveList.isEmpty()) {
- return;
- }
-
- // TODO(b/63861009): we may have multiple navigation apps that eligible to be launched in
- // the cluster. We need to resolve intent that may have multiple activity candidates, right
- // now we pickup the first one that matches registered category (resolveList is sorted
- // priority).
- Pair<ResolveInfo, ClusterActivityInfo> attributedResolveInfo =
- findClusterActivityOptions(resolveList);
- if (attributedResolveInfo == null) {
- Log.w(TAG, "Unable to start an activity with intent: " + intent + " in the cluster: "
- + "category intent didn't match with any categories from vendor "
- + "implementation");
- return;
- }
- ClusterActivityInfo opts = attributedResolveInfo.second;
-
- // Intent was already checked for permission and resolved, make it explicit.
- intent.setComponent(attributedResolveInfo.first.getComponentInfo().getComponentName());
-
- intent.putExtra(CarInstrumentClusterManager.KEY_EXTRA_ACTIVITY_STATE, opts.state);
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- // Virtual display could be private and not available to calling process.
- final long token = Binder.clearCallingIdentity();
- try {
- mContext.startActivity(intent, opts.launchOptions);
- } finally {
- Binder.restoreCallingIdentity(token);
- }
- }
-
- private List<ResolveInfo> checkPermission(List<ResolveInfo> resolveList,
- String permission) {
- List<ResolveInfo> permittedResolveList = new ArrayList<>(resolveList.size());
- for (ResolveInfo info : resolveList) {
- String pkgName = info.getComponentInfo().packageName;
- if (mPackageManager.checkPermission(permission, pkgName) == PERMISSION_GRANTED) {
- permittedResolveList.add(info);
- } else {
- Log.w(TAG, "Permission " + permission + " not granted for "
- + info.getComponentInfo());
- }
-
- }
- return permittedResolveList;
- }
-
- private void doRegisterManagerCallback(IInstrumentClusterManagerCallback callback)
- throws RemoteException {
- enforceClusterControlPermission();
- IBinder binder = callback.asBinder();
-
- List<Pair<String, Bundle>> knownActivityStates = null;
- ManagerCallbackDeathRecipient deathRecipient = new ManagerCallbackDeathRecipient(binder);
- synchronized (mSync) {
- if (mManagerCallbacks.containsKey(binder)) {
- Log.w(TAG, "Manager callback already registered for binder: " + binder);
- return;
- }
- mManagerCallbacks.put(binder, new ManagerCallbackInfo(callback, deathRecipient));
- if (!mActivityInfoByCategory.isEmpty()) {
- knownActivityStates = new ArrayList<>(mActivityInfoByCategory.size());
- for (Map.Entry<String, ClusterActivityInfo> it : mActivityInfoByCategory.entrySet()) {
- knownActivityStates.add(new Pair<>(it.getKey(), it.getValue().state));
- }
- }
- }
- binder.linkToDeath(deathRecipient, 0);
-
- // Notify manager immediately with known states.
- if (knownActivityStates != null) {
- for (Pair<String, Bundle> it : knownActivityStates) {
- callback.setClusterActivityState(it.first, it.second);
- }
- }
- }
-
- private void doUnregisterManagerCallback(IBinder binder) throws RemoteException {
- enforceClusterControlPermission();
- ManagerCallbackInfo info;
- synchronized (mSync) {
- info = mManagerCallbacks.get(binder);
- if (info == null) {
- Log.w(TAG, "Unable to unregister manager callback binder: " + binder + " because "
- + "it wasn't previously registered.");
- return;
- }
- mManagerCallbacks.remove(binder);
- }
- binder.unlinkToDeath(info.deathRecipient, 0);
- }
-
- @Nullable
- private Pair<ResolveInfo, ClusterActivityInfo> findClusterActivityOptions(
- List<ResolveInfo> resolveList) {
- synchronized (mSync) {
- Set<String> registeredCategories = mActivityInfoByCategory.keySet();
-
- for (ResolveInfo resolveInfo : resolveList) {
- for (String category : registeredCategories) {
- if (resolveInfo.filter != null && resolveInfo.filter.hasCategory(category)) {
- ClusterActivityInfo categoryInfo = mActivityInfoByCategory.get(category);
- return new Pair<>(resolveInfo, categoryInfo);
- }
- }
- }
- }
- return null;
- }
-
- private class ManagerCallbackDeathRecipient implements DeathRecipient {
- private final IBinder mBinder;
-
- ManagerCallbackDeathRecipient(IBinder binder) {
- mBinder = binder;
+ @Override
+ public String toString() {
+ return "uid: " + uid + ", pid: " + pid;
}
@Override
- public void binderDied() {
- try {
- doUnregisterManagerCallback(mBinder);
- } catch (RemoteException e) {
- // Ignore, shutdown route.
- }
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ ContextOwner that = (ContextOwner) o;
+ return uid == that.uid && pid == that.pid;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(uid, pid);
}
}
+ /**
+ * TODO: (b/121277787) Remove on master
+ * @deprecated CarClusterManager is being deprecated.
+ */
+ @Deprecated
private class ClusterManagerService extends IInstrumentClusterManagerService.Stub {
-
@Override
public void startClusterActivity(Intent intent) throws RemoteException {
- doStartClusterActivity(intent);
+ // No op.
}
@Override
public void registerCallback(IInstrumentClusterManagerCallback callback)
throws RemoteException {
- doRegisterManagerCallback(callback);
+ // No op.
}
@Override
public void unregisterCallback(IInstrumentClusterManagerCallback callback)
throws RemoteException {
- doUnregisterManagerCallback(callback.asBinder());
- }
- }
-
- @GuardedBy("mSync")
- private ClusterActivityInfo getOrCreateActivityInfoLocked(String category) {
- return mActivityInfoByCategory.computeIfAbsent(category, k -> new ClusterActivityInfo());
- }
-
- /** This is communication channel from vendor cluster implementation to Car Service. */
- private class ClusterServiceCallback extends IInstrumentClusterCallback.Stub {
-
- @Override
- public void setClusterActivityLaunchOptions(String category, Bundle activityOptions)
- throws RemoteException {
- doSetActivityLaunchOptions(category, activityOptions);
- }
-
- @Override
- public void setClusterActivityState(String category, Bundle clusterActivityState)
- throws RemoteException {
- doSetClusterActivityState(category, clusterActivityState);
- }
- }
-
- /** Called from cluster vendor implementation */
- private void doSetActivityLaunchOptions(String category, Bundle activityOptions) {
- if (DBG) {
- Log.d(TAG, "doSetActivityLaunchOptions, category: " + category
- + ", options: " + activityOptions);
- }
- synchronized (mSync) {
- ClusterActivityInfo info = getOrCreateActivityInfoLocked(category);
- info.launchOptions = activityOptions;
- }
- }
-
- /** Called from cluster vendor implementation */
- private void doSetClusterActivityState(String category, Bundle clusterActivityState)
- throws RemoteException {
- if (DBG) {
- Log.d(TAG, "doSetClusterActivityState, category: " + category
- + ", state: " + clusterActivityState);
- }
-
- List<ManagerCallbackInfo> managerCallbacks;
- synchronized (mSync) {
- ClusterActivityInfo info = getOrCreateActivityInfoLocked(category);
- info.state = clusterActivityState;
- managerCallbacks = new ArrayList<>(mManagerCallbacks.values());
- }
-
- for (ManagerCallbackInfo cbInfo : managerCallbacks) {
- cbInfo.callback.setClusterActivityState(category, clusterActivityState);
- }
- }
-
- private static class ManagerCallbackInfo {
- final IInstrumentClusterManagerCallback callback;
- final ManagerCallbackDeathRecipient deathRecipient;
-
- ManagerCallbackInfo(IInstrumentClusterManagerCallback callback,
- ManagerCallbackDeathRecipient deathRecipient) {
- this.callback = callback;
- this.deathRecipient = deathRecipient;
+ // No op.
}
}
diff --git a/service/src/com/android/car/garagemode/Controller.java b/service/src/com/android/car/garagemode/Controller.java
new file mode 100644
index 0000000..33c10bc
--- /dev/null
+++ b/service/src/com/android/car/garagemode/Controller.java
@@ -0,0 +1,218 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.garagemode;
+
+import android.app.job.JobScheduler;
+import android.car.Car;
+import android.car.CarNotConnectedException;
+import android.car.hardware.power.CarPowerManager;
+import android.car.hardware.power.CarPowerManager.CarPowerStateListener;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Looper;
+
+import com.android.internal.annotations.VisibleForTesting;
+
+import java.util.concurrent.CompletableFuture;
+
+/**
+ * Main controller for GarageMode. It controls all the flows of GarageMode and defines the logic.
+ */
+public class Controller implements CarPowerStateListener {
+ private static final Logger LOG = new Logger("Controller");
+
+ @VisibleForTesting final WakeupPolicy mWakeupPolicy;
+ private final GarageMode mGarageMode;
+ private final Handler mHandler;
+ private final Context mContext;
+ private final Car mCar;
+ private final ServiceConnection mCarServiceConnection = new ServiceConnection() {
+ @Override
+ public void onServiceConnected(ComponentName name, IBinder service) {
+ LOG.i("Car is now connected, getting CarPowerManager service");
+ try {
+ mCarPowerManager = (CarPowerManager) mCar.getCarManager(Car.POWER_SERVICE);
+ mCarPowerManager.setListener(Controller.this);
+ } catch (CarNotConnectedException e) {
+ LOG.e("Failed to get CarPowerManager instance", e);
+ }
+ }
+
+ @Override
+ public void onServiceDisconnected(ComponentName name) {
+ LOG.i("Car is now disconnected!");
+ if (mCarPowerManager != null) {
+ mCarPowerManager.clearListener();
+ }
+ }
+ };
+
+ private CarPowerManager mCarPowerManager;
+
+ public Controller(Context context, Looper looper) {
+ this(context, looper, null, null, null, null);
+ }
+
+ public Controller(
+ Context context,
+ Looper looper,
+ WakeupPolicy wakeupPolicy,
+ Handler handler,
+ GarageMode garageMode,
+ Car car) {
+ mContext = context;
+ mHandler = (handler == null ? new Handler(looper) : handler);
+ mWakeupPolicy =
+ (wakeupPolicy == null ? WakeupPolicy.initFromResources(context) : wakeupPolicy);
+ mGarageMode = (garageMode == null ? new GarageMode(this) : garageMode);
+ if (car == null) {
+ LOG.i("Creating a connection to car service to get CarPowerManager");
+ mCar = Car.createCar(context, mCarServiceConnection);
+ mCar.connect();
+ } else {
+ mCar = car;
+ }
+ }
+
+ @Override
+ public void onStateChanged(int state) {
+ throw new UnsupportedOperationException(
+ "Should not be here. This API obsolete and is not used.");
+ }
+
+ @Override
+ public void onStateChanged(int state, CompletableFuture<Void> future) {
+ switch (state) {
+ case CarPowerStateListener.SHUTDOWN_CANCELLED:
+ LOG.d("CPM state changed to SHUTDOWN_CANCELLED");
+ handleShutdownCancelled();
+ break;
+ case CarPowerStateListener.SHUTDOWN_ENTER:
+ LOG.d("CPM state changed to SHUTDOWN_ENTER");
+ handleShutdownEnter();
+ break;
+ case CarPowerStateListener.SHUTDOWN_PREPARE:
+ LOG.d("CPM state changed to SHUTDOWN_PREPARE");
+ handleShutdownPrepare(future);
+ break;
+ case CarPowerStateListener.SUSPEND_ENTER:
+ LOG.d("CPM state changed to SUSPEND_ENTER");
+ handleSuspendEnter();
+ break;
+ case CarPowerStateListener.SUSPEND_EXIT:
+ LOG.d("CPM state changed to SUSPEND_EXIT");
+ handleSuspendExit();
+ break;
+ default:
+ }
+ }
+
+ /**
+ * @return boolean whether any jobs are currently in running that GarageMode cares about
+ */
+ boolean isGarageModeActive() {
+ return mGarageMode.isGarageModeActive();
+ }
+
+ /**
+ * Wrapper method to send a broadcast
+ *
+ * @param i intent that contains broadcast data
+ */
+ void sendBroadcast(Intent i) {
+ LOG.d("Sending broadcast with action: " + i.getAction());
+ mContext.sendBroadcast(i);
+ }
+
+ /**
+ * @return JobSchedulerService instance
+ */
+ JobScheduler getJobSchedulerService() {
+ return (JobScheduler) mContext.getSystemService(Context.JOB_SCHEDULER_SERVICE);
+ }
+
+ /**
+ * @return Handler instance used by controller
+ */
+ Handler getHandler() {
+ return mHandler;
+ }
+
+ /**
+ * Initiates GarageMode flow which will set the system idleness to true and will start
+ * monitoring jobs which has idleness constraint enabled.
+ */
+ void initiateGarageMode(CompletableFuture<Void> future) {
+ mWakeupPolicy.incrementCounter();
+ mGarageMode.enterGarageMode(future);
+ }
+
+ /**
+ * Resets GarageMode.
+ */
+ void resetGarageMode() {
+ mGarageMode.cancel();
+ mWakeupPolicy.resetCounter();
+ }
+
+ @VisibleForTesting
+ void finishGarageMode() {
+ mGarageMode.finish();
+ }
+
+ @VisibleForTesting
+ void setCarPowerManager(CarPowerManager cpm) {
+ mCarPowerManager = cpm;
+ }
+
+ void scheduleNextWakeup() {
+ if (mWakeupPolicy.getNextWakeUpInterval() <= 0) {
+ // Either there is no policy or nothing left to schedule
+ return;
+ }
+ int seconds = mWakeupPolicy.getNextWakeUpInterval();
+ try {
+ mCarPowerManager.scheduleNextWakeupTime(seconds);
+ } catch (CarNotConnectedException e) {
+ LOG.e("Car is not connected.", e);
+ }
+ }
+
+ private void handleSuspendExit() {
+ resetGarageMode();
+ }
+
+ private void handleSuspendEnter() {
+ resetGarageMode();
+ }
+
+ private void handleShutdownEnter() {
+ resetGarageMode();
+ }
+
+ private void handleShutdownPrepare(CompletableFuture<Void> future) {
+ initiateGarageMode(future);
+ }
+
+ private void handleShutdownCancelled() {
+ resetGarageMode();
+ }
+}
\ No newline at end of file
diff --git a/service/src/com/android/car/garagemode/GarageMode.java b/service/src/com/android/car/garagemode/GarageMode.java
new file mode 100644
index 0000000..914190d
--- /dev/null
+++ b/service/src/com/android/car/garagemode/GarageMode.java
@@ -0,0 +1,164 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.garagemode;
+
+import android.app.job.JobInfo;
+import android.app.job.JobScheduler;
+import android.app.job.JobSnapshot;
+import android.content.Intent;
+import android.os.Handler;
+
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+
+/**
+ * Class that interacts with JobScheduler, controls system idleness and monitor jobs which are
+ * in GarageMode interest
+ */
+
+class GarageMode {
+ private static final Logger LOG = new Logger("GarageMode");
+
+ /**
+ * When changing this field value, please update
+ * {@link com.android.server.job.controllers.idle.CarIdlenessTracker} as well.
+ */
+ public static final String ACTION_GARAGE_MODE_ON =
+ "com.android.server.jobscheduler.GARAGE_MODE_ON";
+
+ /**
+ * When changing this field value, please update
+ * {@link com.android.server.job.controllers.idle.CarIdlenessTracker} as well.
+ */
+ public static final String ACTION_GARAGE_MODE_OFF =
+ "com.android.server.jobscheduler.GARAGE_MODE_OFF";
+
+ static final long JOB_SNAPSHOT_INITIAL_UPDATE_MS = 10000; // 10 seconds
+ static final long JOB_SNAPSHOT_UPDATE_FREQUENCY_MS = 1000; // 1 second
+
+ private final Controller mController;
+
+ private boolean mGarageModeActive;
+ private JobScheduler mJobScheduler;
+ private Handler mHandler;
+ private Runnable mRunnable;
+ private CompletableFuture<Void> mFuture;
+
+ GarageMode(Controller controller) {
+ mGarageModeActive = false;
+ mController = controller;
+ mJobScheduler = controller.getJobSchedulerService();
+ mHandler = controller.getHandler();
+
+ mRunnable = () -> {
+ if (areAnyIdleJobsRunning()) {
+ LOG.d("Some jobs are still running. Need to wait more ...");
+ mHandler.postDelayed(mRunnable, JOB_SNAPSHOT_UPDATE_FREQUENCY_MS);
+ } else {
+ LOG.d("No jobs are currently running.");
+ finish();
+ }
+ };
+ }
+
+ boolean isGarageModeActive() {
+ return mGarageModeActive;
+ }
+
+ void enterGarageMode(CompletableFuture<Void> future) {
+ LOG.d("Entering GarageMode");
+ synchronized (this) {
+ mGarageModeActive = true;
+ }
+ updateFuture(future);
+ broadcastSignalToJobSchedulerTo(true);
+ startMonitoringThread();
+ }
+
+ synchronized void cancel() {
+ if (mFuture != null && !mFuture.isDone()) {
+ mFuture.cancel(true);
+ }
+ mFuture = null;
+ }
+
+ synchronized void finish() {
+ mController.scheduleNextWakeup();
+ synchronized (this) {
+ if (mFuture != null && !mFuture.isDone()) {
+ mFuture.complete(null);
+ }
+ mFuture = null;
+ }
+ }
+
+ private void cleanupGarageMode() {
+ LOG.d("Cleaning up GarageMode");
+ synchronized (this) {
+ mGarageModeActive = false;
+ }
+ broadcastSignalToJobSchedulerTo(false);
+ stopMonitoringThread();
+ }
+
+ private void updateFuture(CompletableFuture<Void> future) {
+ synchronized (this) {
+ mFuture = future;
+ }
+ if (mFuture != null) {
+ mFuture.whenComplete((result, exception) -> {
+ if (exception != null) {
+ LOG.e("Seems like GarageMode got canceled, cleaning up", exception);
+ } else {
+ LOG.d("Seems like GarageMode is completed, cleaning up");
+ }
+ cleanupGarageMode();
+ });
+ }
+ }
+
+ private void broadcastSignalToJobSchedulerTo(boolean enableGarageMode) {
+ Intent i = new Intent();
+ if (enableGarageMode) {
+ i.setAction(ACTION_GARAGE_MODE_ON);
+ } else {
+ i.setAction(ACTION_GARAGE_MODE_OFF);
+ }
+ i.setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_NO_ABORT);
+ mController.sendBroadcast(i);
+ }
+
+ private synchronized void startMonitoringThread() {
+ mHandler.postDelayed(mRunnable, JOB_SNAPSHOT_INITIAL_UPDATE_MS);
+ }
+
+ private synchronized void stopMonitoringThread() {
+ mHandler.removeCallbacks(mRunnable);
+ }
+
+ private boolean areAnyIdleJobsRunning() {
+ List<JobInfo> startedJobs = mJobScheduler.getStartedJobs();
+ for (JobSnapshot snap : mJobScheduler.getAllJobSnapshots()) {
+ if (startedJobs.contains(snap.getJobInfo())) {
+ if (snap.getJobInfo().isRequireDeviceIdle()) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+}
diff --git a/service/src/com/android/car/garagemode/GarageModePolicy.java b/service/src/com/android/car/garagemode/GarageModePolicy.java
deleted file mode 100644
index be7b713..0000000
--- a/service/src/com/android/car/garagemode/GarageModePolicy.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.garagemode;
-
-import android.content.Context;
-import android.util.Log;
-
-import com.android.car.R;
-
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Default garage mode policy.
- *
- * The first wake up time is set to be 1am the next day. And it keeps waking up every day for a
- * week. After that, wake up every 7 days for a month, and wake up every 30 days thereafter.
- */
-public class GarageModePolicy {
- private static final String TAG = "GarageModePolicy";
- private static final Map<Character, Integer> TIME_UNITS_LOOKUP;
- static {
- TIME_UNITS_LOOKUP = new HashMap<>();
- TIME_UNITS_LOOKUP.put('m', 60);
- TIME_UNITS_LOOKUP.put('h', 3600);
- TIME_UNITS_LOOKUP.put('d', 86400);
- }
-
- private LinkedList<WakeupInterval> mWakeupIntervals;
-
- public GarageModePolicy(String[] policy) {
- mWakeupIntervals = parsePolicy(policy);
- }
-
- /**
- * Initializes GarageModePolicy from config_garageModeCadence resource array.
- * @param context to access resources
- * @return GarageModePolicy instance, created from values in resources
- */
- public static GarageModePolicy initFromResources(Context context) {
- return new GarageModePolicy(
- context.getResources().getStringArray(R.array.config_garageModeCadence));
- }
-
- /**
- * Returns the interval in milliseconds, which defines next wake up time.
- * @param index amount of times system woken up
- * @return the interval in milliseconds
- */
- public int getNextWakeUpInterval(int index) {
- if (mWakeupIntervals.size() == 0) {
- Log.e(TAG, "No wake up policy configuration was loaded.");
- return 0;
- }
-
- for (WakeupInterval wakeupTime : mWakeupIntervals) {
- if (index < wakeupTime.getNumAttempts()) {
- return wakeupTime.getWakeupInterval();
- }
- index -= wakeupTime.getNumAttempts();
- }
- Log.w(TAG, "No more garage mode wake ups scheduled; been sleeping too long.");
- return 0;
- }
-
- /**
- * Get list of {@link com.android.car.garagemode.WakeupInterval}s in this policy
- * @return list as List\<WakeupInterval\>
- */
- public List<WakeupInterval> getWakeupIntervals() {
- return mWakeupIntervals;
- }
-
- private LinkedList<WakeupInterval> parsePolicy(String[] policy) {
- LinkedList<WakeupInterval> intervals = new LinkedList<>();
- if (policy == null || policy.length == 0) {
- Log.e(TAG, "Trying to parse empty policies!");
- return intervals;
- }
-
- for (String rule : policy) {
- WakeupInterval interval = parseRule(rule);
- if (interval == null) {
- Log.e(TAG, "Invalid Policy! This rule has bad format: " + rule);
- return new LinkedList<>();
- }
- intervals.add(interval);
- }
- return intervals;
- }
-
- private WakeupInterval parseRule(String rule) {
- String[] str = rule.split(",");
-
- if (str.length != 2) {
- Log.e(TAG, "Policy has bad format: " + rule);
- return null;
- }
-
- String intervalStr = str[0];
- String timesStr = str[1];
-
- if (intervalStr.isEmpty() || timesStr.isEmpty()) {
- Log.e(TAG, "One of the values is empty. Please check format: " + rule);
- return null;
- }
-
- char unit = intervalStr.charAt(intervalStr.length() - 1);
-
- // Removing last letter extension from string
- intervalStr = intervalStr.substring(0, intervalStr.length() - 1);
-
- int interval, times;
- try {
- interval = Integer.parseInt(intervalStr);
- times = Integer.parseInt(timesStr);
- } catch (NumberFormatException ex) {
- Log.d(TAG, "Invalid input Rule for interval " + rule);
- return null;
- }
-
- if (!TIME_UNITS_LOOKUP.containsKey(unit)) {
- Log.e(TAG, "Time units map does not contain extension " + unit);
- return null;
- }
-
- if (interval <= 0) {
- Log.e(TAG, "Wake up policy time must be > 0!" + interval);
- return null;
- }
-
- if (times <= 0) {
- Log.e(TAG, "Wake up attempts in policy must be > 0!" + times);
- return null;
- }
-
- interval *= TIME_UNITS_LOOKUP.get(unit);
-
- return new WakeupInterval(interval, times);
- }
-}
diff --git a/service/src/com/android/car/garagemode/GarageModeService.java b/service/src/com/android/car/garagemode/GarageModeService.java
index c9c34dd..4899938 100644
--- a/service/src/com/android/car/garagemode/GarageModeService.java
+++ b/service/src/com/android/car/garagemode/GarageModeService.java
@@ -16,335 +16,76 @@
package com.android.car.garagemode;
-import static android.car.settings.GarageModeSettingsObserver.GARAGE_MODE_ENABLED_URI;
-import static android.car.settings.GarageModeSettingsObserver.GARAGE_MODE_MAINTENANCE_WINDOW_URI;
-import static android.car.settings.GarageModeSettingsObserver.GARAGE_MODE_WAKE_UP_TIME_URI;
-
-import android.car.settings.CarSettings;
-import android.car.settings.GarageModeSettingsObserver;
import android.content.Context;
-import android.content.SharedPreferences;
-import android.net.Uri;
-import android.os.Handler;
-import android.os.IDeviceIdleController;
-import android.os.IMaintenanceActivityListener;
import android.os.Looper;
-import android.os.Message;
-import android.os.RemoteException;
-import android.os.ServiceManager;
-import android.preference.PreferenceManager;
-import android.provider.Settings;
-import android.util.Log;
-import com.android.car.CarPowerManagementService;
import com.android.car.CarServiceBase;
-import com.android.car.DeviceIdleControllerWrapper;
-import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import java.io.PrintWriter;
/**
- * Controls car garage mode.
- *
- * Car garage mode is a time window for the car to do maintenance work when the car is not in use.
- * The {@link com.android.car.garagemode.GarageModeService} interacts with
- * {@link com.android.car.CarPowerManagementService} to start and end garage mode.
- * A {@link com.android.car.garagemode.GarageModePolicy} defines when the garage mode should
- * start and how long it should last.
+ * Main service container for car Garage Mode.
+ * Garage Mode enables idle time in cars.
*/
-public class GarageModeService implements CarServiceBase,
- CarPowerManagementService.PowerEventProcessingHandler,
- CarPowerManagementService.PowerServiceEventListener,
- DeviceIdleControllerWrapper.DeviceMaintenanceActivityListener {
- private static final String TAG = "GarageModeService";
+public class GarageModeService implements CarServiceBase {
+ private static final Logger LOG = new Logger("Service");
- private static final int MSG_EXIT_GARAGE_MODE_EARLY = 0;
- private static final int MSG_WRITE_TO_PREF = 1;
+ private final Context mContext;
+ private final Controller mController;
- private static final String KEY_GARAGE_MODE_INDEX = "garage_mode_index";
-
- // wait for 10 seconds to allow maintenance activities to start (e.g., connecting to wifi).
- protected static final int MAINTENANCE_ACTIVITY_START_GRACE_PERIOD = 10 * 1000;
-
- private final CarPowerManagementService mPowerManagementService;
- protected final Context mContext;
-
- @VisibleForTesting
- @GuardedBy("this")
- protected boolean mInGarageMode;
- @VisibleForTesting
- @GuardedBy("this")
- protected boolean mMaintenanceActive;
- @VisibleForTesting
- @GuardedBy("this")
- protected int mGarageModeIndex;
-
- @GuardedBy("this")
- @VisibleForTesting
- protected int mMaintenanceWindow;
- @GuardedBy("this")
- private GarageModePolicy mPolicy;
- @GuardedBy("this")
- private boolean mGarageModeEnabled;
-
-
- private SharedPreferences mSharedPreferences;
- private final GarageModeSettingsObserver mContentObserver;
-
- private DeviceIdleControllerWrapper mDeviceIdleController;
- private final GarageModeHandler mHandler;
-
- private class GarageModeHandler extends Handler {
- GarageModeHandler(Looper looper) {
- super(looper);
- }
-
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case MSG_EXIT_GARAGE_MODE_EARLY:
- mPowerManagementService.notifyPowerEventProcessingCompletion(
- GarageModeService.this);
- break;
- case MSG_WRITE_TO_PREF:
- writeToPref(msg.arg1);
- break;
- }
- }
- }
-
- public GarageModeService(Context context, CarPowerManagementService powerManagementService) {
- this(context, powerManagementService, null, Looper.myLooper());
+ public GarageModeService(Context context) {
+ this(context, null);
}
@VisibleForTesting
- protected GarageModeService(Context context, CarPowerManagementService powerManagementService,
- DeviceIdleControllerWrapper deviceIdleController, Looper looper) {
+ protected GarageModeService(Context context, Controller controller) {
mContext = context;
- mPowerManagementService = powerManagementService;
- mHandler = new GarageModeHandler(looper);
- if (deviceIdleController == null) {
- mDeviceIdleController = new DefaultDeviceIdleController();
- } else {
- mDeviceIdleController = deviceIdleController;
- }
- mContentObserver = new GarageModeSettingsObserver(mContext, mHandler) {
- @Override
- public void onChange(boolean selfChange, Uri uri) {
- onSettingsChangedInternal(uri);
- }
- };
+ mController = (controller != null ? controller
+ : new Controller(context, Looper.myLooper()));
}
+ /**
+ * Initializes GarageMode
+ */
@Override
public void init() {
- init(
- GarageModePolicy.initFromResources(mContext),
- PreferenceManager.getDefaultSharedPreferences(
- mContext.createDeviceProtectedStorageContext()));
}
- @VisibleForTesting
- void init(GarageModePolicy policy, SharedPreferences prefs) {
- Log.d(TAG, "initializing GarageMode");
- mSharedPreferences = prefs;
- mPolicy = policy;
- final int index = mSharedPreferences.getInt(KEY_GARAGE_MODE_INDEX, 0);
- synchronized (this) {
- mMaintenanceActive = mDeviceIdleController.startTracking(this);
- mGarageModeIndex = index;
- readFromSettingsLocked(
- CarSettings.Global.KEY_GARAGE_MODE_MAINTENANCE_WINDOW,
- CarSettings.Global.KEY_GARAGE_MODE_ENABLED,
- CarSettings.Global.KEY_GARAGE_MODE_WAKE_UP_TIME);
- }
- mContentObserver.register();
- mPowerManagementService.registerPowerEventProcessingHandler(this);
- }
-
- public boolean isInGarageMode() {
- return mInGarageMode;
- }
-
+ /**
+ * Cleans up GarageMode processes
+ */
@Override
public void release() {
- Log.d(TAG, "releasing GarageModeService");
- mDeviceIdleController.stopTracking();
- mContentObserver.unregister();
}
+ /**
+ * Dumps useful information about GarageMode
+ * @param writer
+ */
@Override
public void dump(PrintWriter writer) {
- writer.println("mGarageModeIndex: " + mGarageModeIndex);
- writer.println("inGarageMode? " + mInGarageMode);
- writer.println("GarageModeEnabled " + mGarageModeEnabled);
- writer.println("GarageModeTimeWindow " + mMaintenanceWindow + " ms");
+ writer.println("GarageModeInProgress " + mController.isGarageModeActive());
}
- @Override
- public long onPrepareShutdown(boolean shuttingDown) {
- // this is the beginning of each garage mode.
- synchronized (this) {
- Log.d(TAG, "onPrepareShutdown is triggered. System is shutting down=" + shuttingDown);
- mInGarageMode = true;
- mGarageModeIndex++;
- mHandler.removeMessages(MSG_EXIT_GARAGE_MODE_EARLY);
- if (!mMaintenanceActive) {
- mHandler.sendMessageDelayed(
- mHandler.obtainMessage(MSG_EXIT_GARAGE_MODE_EARLY),
- MAINTENANCE_ACTIVITY_START_GRACE_PERIOD);
- }
- // We always reserve the maintenance window first. If later, we found no
- // maintenance work active, we will exit garage mode early after
- // MAINTENANCE_ACTIVITY_START_GRACE_PERIOD
- return mMaintenanceWindow;
- }
+ /**
+ * @return whether GarageMode is in progress. Used by {@link com.android.car.ICarImpl}.
+ */
+ public boolean isGarageModeActive() {
+ return mController.isGarageModeActive();
}
- @Override
- public void onPowerOn(boolean displayOn) {
- synchronized (this) {
- Log.d(TAG, "onPowerOn: " + displayOn);
- if (displayOn) {
- // the car is use now. reset the garage mode counter.
- mGarageModeIndex = 0;
- }
- }
+ /**
+ * Forces GarageMode to start. Used by {@link com.android.car.ICarImpl}.
+ */
+ public void forceStartGarageMode() {
+ mController.initiateGarageMode(null);
}
- @Override
- public int getWakeupTime() {
- synchronized (this) {
- if (!mGarageModeEnabled) {
- return 0;
- }
- return mPolicy.getNextWakeUpInterval(mGarageModeIndex);
- }
- }
-
- @Override
- public void onSleepExit() {
- // ignored
- }
-
- @Override
- public void onSleepEntry() {
- synchronized (this) {
- mInGarageMode = false;
- }
- }
-
- @Override
- public void onShutdown() {
- synchronized (this) {
- mHandler.sendMessage(
- mHandler.obtainMessage(MSG_WRITE_TO_PREF, mGarageModeIndex, 0));
- }
- }
-
- private void writeToPref(int index) {
- SharedPreferences.Editor editor = mSharedPreferences.edit();
- editor.putInt(KEY_GARAGE_MODE_INDEX, index);
- editor.commit();
- }
-
- @Override
- public void onMaintenanceActivityChanged(boolean active) {
- boolean shouldReportCompletion = false;
- synchronized (this) {
- Log.d(TAG, "onMaintenanceActivityChanged: " + active);
- mMaintenanceActive = active;
- if (!mInGarageMode) {
- return;
- }
-
- if (!active) {
- shouldReportCompletion = true;
- mInGarageMode = false;
- } else {
- // we are in garage mode, and maintenance work has just begun.
- mHandler.removeMessages(MSG_EXIT_GARAGE_MODE_EARLY);
- }
- }
- if (shouldReportCompletion) {
- // we are in garage mode, and maintenance work has finished.
- mPowerManagementService.notifyPowerEventProcessingCompletion(this);
- }
- }
-
-
- private static class DefaultDeviceIdleController extends DeviceIdleControllerWrapper {
- private IDeviceIdleController mDeviceIdleController;
- private MaintenanceActivityListener mMaintenanceActivityListener =
- new MaintenanceActivityListener();
-
- @Override
- public boolean startLocked() {
- mDeviceIdleController = IDeviceIdleController.Stub.asInterface(
- ServiceManager.getService(Context.DEVICE_IDLE_CONTROLLER));
- boolean active = false;
- try {
- active = mDeviceIdleController
- .registerMaintenanceActivityListener(mMaintenanceActivityListener);
- } catch (RemoteException e) {
- Log.e(TAG, "Unable to register listener with DeviceIdleController", e);
- }
- return active;
- }
-
- @Override
- public void stopTracking() {
- try {
- if (mDeviceIdleController != null) {
- mDeviceIdleController.unregisterMaintenanceActivityListener(
- mMaintenanceActivityListener);
- }
- } catch (RemoteException e) {
- Log.e(TAG, "Fail to unregister listener.", e);
- }
- }
-
- private final class MaintenanceActivityListener extends IMaintenanceActivityListener.Stub {
- @Override
- public void onMaintenanceActivityChanged(final boolean active) {
- DefaultDeviceIdleController.this.setMaintenanceActivity(active);
- }
- }
- }
-
- @GuardedBy("this")
- private void readFromSettingsLocked(String... keys) {
- for (String key : keys) {
- switch (key) {
- case CarSettings.Global.KEY_GARAGE_MODE_ENABLED:
- mGarageModeEnabled =
- Settings.Global.getInt(mContext.getContentResolver(), key, 1) == 1;
- break;
- case CarSettings.Global.KEY_GARAGE_MODE_MAINTENANCE_WINDOW:
- mMaintenanceWindow = Settings.Global.getInt(
- mContext.getContentResolver(), key,
- CarSettings.DEFAULT_GARAGE_MODE_MAINTENANCE_WINDOW);
- break;
- default:
- Log.e(TAG, "Unknown setting key " + key);
- }
- }
- }
-
- private void onSettingsChangedInternal(Uri uri) {
- synchronized (this) {
- Log.d(TAG, "Content Observer onChange: " + uri);
- if (uri.equals(GARAGE_MODE_ENABLED_URI)) {
- readFromSettingsLocked(CarSettings.Global.KEY_GARAGE_MODE_ENABLED);
- } else if (uri.equals(GARAGE_MODE_WAKE_UP_TIME_URI)) {
- readFromSettingsLocked(CarSettings.Global.KEY_GARAGE_MODE_WAKE_UP_TIME);
- } else if (uri.equals(GARAGE_MODE_MAINTENANCE_WINDOW_URI)) {
- readFromSettingsLocked(CarSettings.Global.KEY_GARAGE_MODE_MAINTENANCE_WINDOW);
- }
- Log.d(TAG, String.format(
- "onSettingsChanged %s. enabled: %s, windowSize: %d",
- uri, mGarageModeEnabled, mMaintenanceWindow));
- }
+ /**
+ * Stops and resets the GarageMode. Used by {@link com.android.car.ICarImpl}.
+ */
+ public void stopAndResetGarageMode() {
+ mController.resetGarageMode();
}
}
diff --git a/service/src/com/android/car/garagemode/Logger.java b/service/src/com/android/car/garagemode/Logger.java
new file mode 100644
index 0000000..220ee74
--- /dev/null
+++ b/service/src/com/android/car/garagemode/Logger.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.garagemode;
+
+import android.util.Log;
+
+class Logger {
+ private final String mTag;
+ private final String mPrefix;
+
+ Logger(String prefix) {
+ mTag = "GarageMode";
+ mPrefix = prefix;
+ }
+
+ /** Passing message further to Log.v() */
+ public void v(String msg) {
+ Log.v(mTag, buildMessage(msg));
+ }
+
+ /** Passing message further to Log.v() */
+ public void v(String msg, Exception ex) {
+ Log.v(mTag, buildMessage(msg), ex);
+ }
+
+ /** Passing message further to Log.i() */
+ public void i(String msg) {
+ Log.i(mTag, buildMessage(msg));
+ }
+
+ /** Passing message further to Log.i() */
+ public void i(String msg, Exception ex) {
+ Log.i(mTag, buildMessage(msg), ex);
+ }
+
+ /** Passing message further to Log.d() */
+ public void d(String msg) {
+ Log.d(mTag, buildMessage(msg));
+ }
+
+ /** Passing message further to Log.d() */
+ public void d(String msg, Exception ex) {
+ Log.d(mTag, buildMessage(msg), ex);
+ }
+
+ /** Passing message further to Log.w() */
+ public void w(String msg, Exception ex) {
+ Log.w(mTag, buildMessage(msg), ex);
+ }
+
+ /** Passing message further to Log.w() */
+ public void w(String msg) {
+ Log.w(mTag, buildMessage(msg));
+ }
+
+ /** Passing message further to Log.e() */
+ public void e(String msg) {
+ Log.e(mTag, buildMessage(msg));
+ }
+
+ /** Passing message further to Log.e() */
+ public void e(String msg, Exception ex) {
+ Log.e(mTag, buildMessage(msg), ex);
+ }
+
+ /** Passing message further to Log.e() */
+ public void e(String msg, Throwable ex) {
+ Log.e(mTag, buildMessage(msg), ex);
+ }
+
+ private String buildMessage(String msg) {
+ return String.format("[%s]: %s", mPrefix, msg);
+ }
+}
diff --git a/service/src/com/android/car/garagemode/WakeupInterval.java b/service/src/com/android/car/garagemode/WakeupInterval.java
deleted file mode 100644
index 659af9e..0000000
--- a/service/src/com/android/car/garagemode/WakeupInterval.java
+++ /dev/null
@@ -1,48 +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 com.android.car.garagemode;
-
-/**
- * Defines wake up interval which then will be used by
- * {@link com.android.car.garagemode.GarageModeService} to determine when to schedule next wake up
- * from {@link com.android.car.CarPowerManagementService}
- */
-class WakeupInterval {
- private int mWakeupInterval;
- private int mNumAttempts;
-
- WakeupInterval(int wakeupTime, int numAttempts) {
- mWakeupInterval = wakeupTime;
- mNumAttempts = numAttempts;
- }
-
- /**
- * Returns interval between now and next weke up.
- * @return interval in seconds
- */
- public int getWakeupInterval() {
- return mWakeupInterval;
- }
-
- /**
- * Returns amount of attempts to wake up with mWakeupInterval
- * @return amount of attempts
- */
- public int getNumAttempts() {
- return mNumAttempts;
- }
-}
diff --git a/service/src/com/android/car/garagemode/WakeupPolicy.java b/service/src/com/android/car/garagemode/WakeupPolicy.java
new file mode 100644
index 0000000..b049554
--- /dev/null
+++ b/service/src/com/android/car/garagemode/WakeupPolicy.java
@@ -0,0 +1,194 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.garagemode;
+
+import android.content.Context;
+
+import com.android.car.R;
+import com.android.internal.annotations.VisibleForTesting;
+
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.Map;
+
+/**
+ * Default garage mode policy.
+ *
+ * The first wake up time is set to be 1am the next day. And it keeps waking up every day for a
+ * week. After that, wake up every 7 days for a month, and wake up every 30 days thereafter.
+ */
+class WakeupPolicy {
+ private static final Logger LOG = new Logger("WakeupPolicy");
+ private static final Map<Character, Integer> TIME_UNITS_LOOKUP_SEC;
+ static {
+ TIME_UNITS_LOOKUP_SEC = new HashMap<>();
+ TIME_UNITS_LOOKUP_SEC.put('m', 60);
+ TIME_UNITS_LOOKUP_SEC.put('h', 3600);
+ TIME_UNITS_LOOKUP_SEC.put('d', 86400);
+ }
+ private LinkedList<WakeupInterval> mWakeupIntervals;
+ @VisibleForTesting protected int mIndex;
+
+ WakeupPolicy(String[] policy) {
+ mWakeupIntervals = parsePolicy(policy);
+ mIndex = 0;
+ }
+
+ /**
+ * Initializes Policy from config_garageModeCadence resource array.
+ * @param context to access resources
+ * @return Policy instance, created from values in resources
+ */
+ public static WakeupPolicy initFromResources(Context context) {
+ LOG.d("Initiating WakupPolicy from resources ...");
+ return new WakeupPolicy(
+ context.getResources().getStringArray(R.array.config_garageModeCadence));
+ }
+
+ /**
+ * Returns the interval in seconds, which defines next wake up time.
+ * @return the interval in seconds
+ */
+ public int getNextWakeUpInterval() {
+ if (mWakeupIntervals.size() == 0) {
+ LOG.e("No wake up policy configuration was loaded.");
+ return 0;
+ }
+
+ int index = mIndex;
+ for (WakeupInterval wakeupTime : mWakeupIntervals) {
+ if (index <= wakeupTime.getNumAttempts()) {
+ return wakeupTime.getWakeupInterval();
+ }
+ index -= wakeupTime.getNumAttempts();
+ }
+ LOG.w("No more garage mode wake ups scheduled; been sleeping too long.");
+ return 0;
+ }
+
+ protected int getWakupIntervalsAmount() {
+ return mWakeupIntervals.size();
+ }
+
+ private LinkedList<WakeupInterval> parsePolicy(String[] policy) {
+ LinkedList<WakeupInterval> intervals = new LinkedList<>();
+ if (policy == null || policy.length == 0) {
+ LOG.e("Trying to parse empty policies!");
+ return intervals;
+ }
+
+ for (String rule : policy) {
+ WakeupInterval interval = parseRule(rule);
+ if (interval == null) {
+ LOG.e("Invalid Policy! This rule has bad format: " + rule);
+ return new LinkedList<>();
+ }
+ intervals.add(interval);
+ }
+ return intervals;
+ }
+
+ private WakeupInterval parseRule(String rule) {
+ String[] str = rule.split(",");
+
+ if (str.length != 2) {
+ LOG.e("Policy has bad format: " + rule);
+ return null;
+ }
+
+ String intervalStr = str[0];
+ String timesStr = str[1];
+
+ if (intervalStr.isEmpty() || timesStr.isEmpty()) {
+ LOG.e("One of the values is empty. Please check format: " + rule);
+ return null;
+ }
+
+ char unit = intervalStr.charAt(intervalStr.length() - 1);
+
+ // Removing last letter extension from string
+ intervalStr = intervalStr.substring(0, intervalStr.length() - 1);
+
+ int interval, times;
+ try {
+ interval = Integer.parseInt(intervalStr);
+ times = Integer.parseInt(timesStr);
+ } catch (NumberFormatException ex) {
+ LOG.d("Invalid input Rule for interval " + rule);
+ return null;
+ }
+
+ if (!TIME_UNITS_LOOKUP_SEC.containsKey(unit)) {
+ LOG.e("Time units map does not contain extension " + unit);
+ return null;
+ }
+
+ if (interval <= 0) {
+ LOG.e("Wake up policy time must be > 0!" + interval);
+ return null;
+ }
+
+ if (times <= 0) {
+ LOG.e("Wake up attempts in policy must be > 0!" + times);
+ return null;
+ }
+
+ interval *= TIME_UNITS_LOOKUP_SEC.get(unit);
+
+ return new WakeupInterval(interval, times);
+ }
+
+ public void incrementCounter() {
+ mIndex++;
+ }
+
+ public void resetCounter() {
+ mIndex = 0;
+ }
+
+ /**
+ * Defines wake up interval which then will be used by
+ * {@link com.android.car.garagemode.GarageModeService} to schedule next wake up time in
+ * {@link android.car.hardware.power.CarPowerManager}
+ */
+ private class WakeupInterval {
+ private int mWakeupInterval;
+ private int mNumAttempts;
+
+ WakeupInterval(int wakeupTime, int numAttempts) {
+ mWakeupInterval = wakeupTime;
+ mNumAttempts = numAttempts;
+ }
+
+ /**
+ * Returns interval between now and next wakeup.
+ * @return interval in seconds
+ */
+ public int getWakeupInterval() {
+ return mWakeupInterval;
+ }
+
+ /**
+ * Returns amount of attempts to wake up with mWakeupInterval
+ * @return amount of attempts
+ */
+ public int getNumAttempts() {
+ return mNumAttempts;
+ }
+ }
+
+}
diff --git a/service/src/com/android/car/hal/InputHalService.java b/service/src/com/android/car/hal/InputHalService.java
index c5174dc..f0993eb 100644
--- a/service/src/com/android/car/hal/InputHalService.java
+++ b/service/src/com/android/car/hal/InputHalService.java
@@ -23,35 +23,59 @@
import android.hardware.automotive.vehicle.V2_0.VehiclePropValue;
import android.os.SystemClock;
import android.util.Log;
-import android.util.SparseLongArray;
+import android.util.SparseArray;
import android.view.InputDevice;
import android.view.KeyEvent;
import com.android.car.CarLog;
+import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
import java.io.PrintWriter;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
+import java.util.function.LongSupplier;
public class InputHalService extends HalServiceBase {
public static final int DISPLAY_MAIN = VehicleDisplay.MAIN;
public static final int DISPLAY_INSTRUMENT_CLUSTER = VehicleDisplay.INSTRUMENT_CLUSTER;
private final VehicleHal mHal;
+ /** A function to retrieve the current system uptime - replaceable for testing. */
+ private final LongSupplier mUptimeSupplier;
public interface InputListener {
void onKeyEvent(KeyEvent event, int targetDisplay);
}
+ /** The current press state of a key. */
+ private static class KeyState {
+ /** The timestamp (uptimeMillis) of the last ACTION_DOWN event for this key. */
+ public long mLastKeyDownTimestamp = -1;
+ /** The number of ACTION_DOWN events that have been sent for this keypress. */
+ public int mRepeatCount = 0;
+ }
+
private static final boolean DBG = false;
+ @GuardedBy("this")
private boolean mKeyInputSupported = false;
+
+ @GuardedBy("this")
private InputListener mListener;
- private final SparseLongArray mKeyDownTimes = new SparseLongArray();
+
+ @GuardedBy("mKeyStates")
+ private final SparseArray<KeyState> mKeyStates = new SparseArray<>();
public InputHalService(VehicleHal hal) {
+ this(hal, SystemClock::uptimeMillis);
+ }
+
+ @VisibleForTesting
+ InputHalService(VehicleHal hal, LongSupplier uptimeSupplier) {
mHal = hal;
+ mUptimeSupplier = uptimeSupplier;
}
public void setInputListener(InputListener listener) {
@@ -126,23 +150,43 @@
}
private void dispatchKeyEvent(InputListener listener, int action, int code, int display) {
- long eventTime = SystemClock.uptimeMillis();
+ long eventTime = mUptimeSupplier.getAsLong();
- if (action == KeyEvent.ACTION_DOWN) {
- mKeyDownTimes.put(code, eventTime);
+ long downTime;
+ int repeat;
+
+ synchronized (mKeyStates) {
+ KeyState state = mKeyStates.get(code);
+ if (state == null) {
+ state = new KeyState();
+ mKeyStates.put(code, state);
+ }
+
+ if (action == KeyEvent.ACTION_DOWN) {
+ downTime = eventTime;
+ repeat = state.mRepeatCount++;
+ state.mLastKeyDownTimestamp = eventTime;
+ } else {
+ // Handle key up events without any matching down event by setting the down time to
+ // the event time. This shouldn't happen in practice - keys should be pressed
+ // before they can be released! - but this protects us against HAL weirdness.
+ downTime =
+ (state.mLastKeyDownTimestamp == -1)
+ ? eventTime
+ : state.mLastKeyDownTimestamp;
+ repeat = 0;
+ state.mRepeatCount = 0;
+ }
}
- long downTime = action == KeyEvent.ACTION_UP
- ? mKeyDownTimes.get(code, eventTime) : eventTime;
-
KeyEvent event = KeyEvent.obtain(
downTime,
eventTime,
action,
code,
- 0 /* repeat */,
+ repeat,
0 /* meta state */,
- 0 /* deviceId*/,
+ 0 /* deviceId */,
0 /* scancode */,
0 /* flags */,
InputDevice.SOURCE_CLASS_BUTTON,
diff --git a/service/src/com/android/car/hal/PowerHalService.java b/service/src/com/android/car/hal/PowerHalService.java
index 504fbf2..3972984 100644
--- a/service/src/com/android/car/hal/PowerHalService.java
+++ b/service/src/com/android/car/hal/PowerHalService.java
@@ -16,13 +16,11 @@
package com.android.car.hal;
-import static android.hardware.automotive.vehicle.V2_0.VehicleProperty.AP_POWER_BOOTUP_REASON;
import static android.hardware.automotive.vehicle.V2_0.VehicleProperty.AP_POWER_STATE_REPORT;
import static android.hardware.automotive.vehicle.V2_0.VehicleProperty.AP_POWER_STATE_REQ;
import static android.hardware.automotive.vehicle.V2_0.VehicleProperty.DISPLAY_BRIGHTNESS;
import android.annotation.Nullable;
-import android.hardware.automotive.vehicle.V2_0.VehicleApPowerBootupReason;
import android.hardware.automotive.vehicle.V2_0.VehicleApPowerStateConfigFlag;
import android.hardware.automotive.vehicle.V2_0.VehicleApPowerStateReport;
import android.hardware.automotive.vehicle.V2_0.VehicleApPowerStateReq;
@@ -43,23 +41,11 @@
import java.util.List;
public class PowerHalService extends HalServiceBase {
- // AP Power State constants set by HAL implementation
- public static final int STATE_OFF = VehicleApPowerStateReq.OFF;
- public static final int STATE_DEEP_SLEEP = VehicleApPowerStateReq.DEEP_SLEEP;
- public static final int STATE_ON_DISP_OFF = VehicleApPowerStateReq.ON_DISP_OFF;
- public static final int STATE_ON_FULL = VehicleApPowerStateReq.ON_FULL;
- public static final int STATE_SHUTDOWN_PREPARE = VehicleApPowerStateReq.SHUTDOWN_PREPARE;
-
- // Boot reason set by VMCU
- public static final int BOOT_REASON_USER_POWER_ON = VehicleApPowerBootupReason.USER_POWER_ON;
- public static final int BOOT_REASON_USER_UNLOCK = VehicleApPowerBootupReason.USER_UNLOCK;
- public static final int BOOT_REASON_TIMER = VehicleApPowerBootupReason.TIMER;
-
// Set display brightness from 0-100%
public static final int MAX_BRIGHTNESS = 100;
@VisibleForTesting
- public static final int SET_BOOT_COMPLETE = VehicleApPowerStateReport.BOOT_COMPLETE;
+ public static final int SET_WAIT_FOR_VHAL = VehicleApPowerStateReport.WAIT_FOR_VHAL;
@VisibleForTesting
public static final int SET_DEEP_SLEEP_ENTRY = VehicleApPowerStateReport.DEEP_SLEEP_ENTRY;
@VisibleForTesting
@@ -69,9 +55,11 @@
@VisibleForTesting
public static final int SET_SHUTDOWN_START = VehicleApPowerStateReport.SHUTDOWN_START;
@VisibleForTesting
- public static final int SET_DISPLAY_ON = VehicleApPowerStateReport.DISPLAY_ON;
+ public static final int SET_ON = VehicleApPowerStateReport.ON;
@VisibleForTesting
- public static final int SET_DISPLAY_OFF = VehicleApPowerStateReport.DISPLAY_OFF;
+ public static final int SET_SHUTDOWN_PREPARE = VehicleApPowerStateReport.SHUTDOWN_PREPARE;
+ @VisibleForTesting
+ public static final int SET_SHUTDOWN_CANCELLED = VehicleApPowerStateReport.SHUTDOWN_CANCELLED;
@VisibleForTesting
public static final int SHUTDOWN_CAN_SLEEP = VehicleApPowerStateShutdownParam.CAN_SLEEP;
@@ -92,11 +80,6 @@
* @param brightness in percentile. 100% full.
*/
void onDisplayBrightnessChange(int brightness);
- /**
- * Received boot reason.
- * @param boot reason.
- */
- void onBootReasonReceived(int bootReason);
}
public static final class PowerState {
@@ -118,7 +101,7 @@
* @throws IllegalStateException
*/
public boolean canEnterDeepSleep() {
- if (mState != STATE_SHUTDOWN_PREPARE) {
+ if (mState != VehicleApPowerStateReq.SHUTDOWN_PREPARE) {
throw new IllegalStateException("wrong state");
}
return (mParam == VehicleApPowerStateShutdownParam.CAN_SLEEP);
@@ -131,7 +114,7 @@
* @throws IllegalStateException
*/
public boolean canPostponeShutdown() {
- if (mState != STATE_SHUTDOWN_PREPARE) {
+ if (mState != VehicleApPowerStateReq.SHUTDOWN_PREPARE) {
throw new IllegalStateException("wrong state");
}
return (mParam != VehicleApPowerStateShutdownParam.SHUTDOWN_IMMEDIATELY);
@@ -180,32 +163,73 @@
}
}
- public void sendBootComplete() {
- Log.i(CarLog.TAG_POWER, "send boot complete");
- setPowerState(VehicleApPowerStateReport.BOOT_COMPLETE, 0);
+ /**
+ * Send WaitForVhal message to VHAL
+ */
+ public void sendWaitForVhal() {
+ Log.i(CarLog.TAG_POWER, "send wait for vhal");
+ setPowerState(VehicleApPowerStateReport.WAIT_FOR_VHAL, 0);
}
- public void sendSleepEntry() {
+ /**
+ * Send SleepEntry message to VHAL
+ * @param wakeupTimeSec Notify VHAL when system wants to be woken from sleep.
+ */
+ public void sendSleepEntry(int wakeupTimeSec) {
Log.i(CarLog.TAG_POWER, "send sleep entry");
- setPowerState(VehicleApPowerStateReport.DEEP_SLEEP_ENTRY, 0);
+ setPowerState(VehicleApPowerStateReport.DEEP_SLEEP_ENTRY, wakeupTimeSec);
}
+ /**
+ * Send SleepExit message to VHAL
+ * Notifies VHAL when SOC has woken.
+ */
public void sendSleepExit() {
Log.i(CarLog.TAG_POWER, "send sleep exit");
setPowerState(VehicleApPowerStateReport.DEEP_SLEEP_EXIT, 0);
}
+ /**
+ * Send Shutdown Postpone message to VHAL
+ */
public void sendShutdownPostpone(int postponeTimeMs) {
Log.i(CarLog.TAG_POWER, "send shutdown postpone, time:" + postponeTimeMs);
setPowerState(VehicleApPowerStateReport.SHUTDOWN_POSTPONE, postponeTimeMs);
}
+ /**
+ * Send Shutdown Start message to VHAL
+ */
public void sendShutdownStart(int wakeupTimeSec) {
Log.i(CarLog.TAG_POWER, "send shutdown start");
setPowerState(VehicleApPowerStateReport.SHUTDOWN_START, wakeupTimeSec);
}
/**
+ * Send On message to VHAL
+ */
+ public void sendOn() {
+ Log.i(CarLog.TAG_POWER, "send on");
+ setPowerState(VehicleApPowerStateReport.ON, 0);
+ }
+
+ /**
+ * Send Shutdown Prepare message to VHAL
+ */
+ public void sendShutdownPrepare() {
+ Log.i(CarLog.TAG_POWER, "send shutdown prepare");
+ setPowerState(VehicleApPowerStateReport.SHUTDOWN_PREPARE, 0);
+ }
+
+ /**
+ * Send Shutdown Cancel message to VHAL
+ */
+ public void sendShutdownCancel() {
+ Log.i(CarLog.TAG_POWER, "send shutdown cancel");
+ setPowerState(VehicleApPowerStateReport.SHUTDOWN_CANCELLED, 0);
+ }
+
+ /**
* Sets the display brightness for the vehicle.
* @param brightness value from 0 to 100.
*/
@@ -223,23 +247,15 @@
}
}
- public void sendDisplayOn() {
- Log.i(CarLog.TAG_POWER, "send display on");
- setPowerState(VehicleApPowerStateReport.DISPLAY_ON, 0);
- }
-
- public void sendDisplayOff() {
- Log.i(CarLog.TAG_POWER, "send display off");
- setPowerState(VehicleApPowerStateReport.DISPLAY_OFF, 0);
- }
-
private void setPowerState(int state, int additionalParam) {
- int[] values = { state, additionalParam };
- try {
- mHal.set(VehicleProperty.AP_POWER_STATE_REPORT, 0).to(values);
- Log.i(CarLog.TAG_POWER, "setPowerState=" + state + " param=" + additionalParam);
- } catch (PropertyTimeoutException e) {
- Log.e(CarLog.TAG_POWER, "cannot set to AP_POWER_STATE_REPORT", e);
+ if (isPowerStateSupported()) {
+ int[] values = { state, additionalParam };
+ try {
+ mHal.set(VehicleProperty.AP_POWER_STATE_REPORT, 0).to(values);
+ Log.i(CarLog.TAG_POWER, "setPowerState=" + state + " param=" + additionalParam);
+ } catch (PropertyTimeoutException e) {
+ Log.e(CarLog.TAG_POWER, "cannot set to AP_POWER_STATE_REPORT", e);
+ }
}
}
@@ -257,8 +273,8 @@
}
public synchronized boolean isPowerStateSupported() {
- VehiclePropConfig config = mProperties.get(VehicleProperty.AP_POWER_STATE_REQ);
- return config != null;
+ return (mProperties.get(VehicleProperty.AP_POWER_STATE_REQ) != null)
+ && (mProperties.get(VehicleProperty.AP_POWER_STATE_REPORT) != null);
}
private synchronized boolean isConfigFlagSet(int flag) {
@@ -308,7 +324,6 @@
Collection<VehiclePropConfig> allProperties) {
for (VehiclePropConfig config : allProperties) {
switch (config.prop) {
- case AP_POWER_BOOTUP_REASON:
case AP_POWER_STATE_REQ:
case AP_POWER_STATE_REPORT:
case DISPLAY_BRIGHTNESS:
@@ -338,10 +353,8 @@
private void dispatchEvents(List<VehiclePropValue> values, PowerEventListener listener) {
for (VehiclePropValue v : values) {
switch (v.prop) {
- case AP_POWER_BOOTUP_REASON:
- int reason = v.value.int32Values.get(0);
- Log.i(CarLog.TAG_POWER, "Received AP_POWER_BOOTUP_REASON=" + reason);
- listener.onBootReasonReceived(reason);
+ case AP_POWER_STATE_REPORT:
+ // Should never see this; write-only property
break;
case AP_POWER_STATE_REQ:
int state = v.value.int32Values.get(VehicleApPowerStateReqIndex.STATE);
diff --git a/service/src/com/android/car/hal/PropertyHalServiceIds.java b/service/src/com/android/car/hal/PropertyHalServiceIds.java
index 6c5533d..e8d00ee 100644
--- a/service/src/com/android/car/hal/PropertyHalServiceIds.java
+++ b/service/src/com/android/car/hal/PropertyHalServiceIds.java
@@ -258,6 +258,9 @@
mProps.put(VehicleProperty.PERF_VEHICLE_SPEED, new Pair<>(
Car.PERMISSION_SPEED,
Car.PERMISSION_SPEED));
+ mProps.put(VehicleProperty.PERF_VEHICLE_SPEED_DISPLAY, new Pair<>(
+ Car.PERMISSION_SPEED,
+ Car.PERMISSION_SPEED));
mProps.put(VehicleProperty.ENGINE_COOLANT_TEMP, new Pair<>(
Car.PERMISSION_CAR_ENGINE_DETAILED,
Car.PERMISSION_CAR_ENGINE_DETAILED));
@@ -319,8 +322,8 @@
Car.PERMISSION_EXTERIOR_LIGHTS,
Car.PERMISSION_EXTERIOR_LIGHTS));
mProps.put(VehicleProperty.IGNITION_STATE, new Pair<>(
- Car.PERMISSION_CAR_POWER,
- Car.PERMISSION_CAR_POWER));
+ Car.PERMISSION_POWERTRAIN,
+ Car.PERMISSION_POWERTRAIN));
mProps.put(VehicleProperty.ABS_ACTIVE, new Pair<>(
Car.PERMISSION_CAR_DYNAMICS_STATE,
Car.PERMISSION_CAR_DYNAMICS_STATE));
diff --git a/service/src/com/android/car/hal/VmsHalService.java b/service/src/com/android/car/hal/VmsHalService.java
index fd84e2b..71e1efc 100644
--- a/service/src/com/android/car/hal/VmsHalService.java
+++ b/service/src/com/android/car/hal/VmsHalService.java
@@ -88,7 +88,7 @@
private final Object mLock = new Object();
private final VmsRouting mRouting = new VmsRouting();
@GuardedBy("mLock")
- private final Map<IBinder, VmsLayersOffering> mOfferings = new HashMap<>();
+ private final Map<IBinder, Map<Integer, VmsLayersOffering>> mOfferings = new HashMap<>();
@GuardedBy("mLock")
private final VmsLayersAvailability mAvailableLayers = new VmsLayersAvailability();
private final VmsPublishersInfo mPublishersInfo = new VmsPublishersInfo();
@@ -117,10 +117,26 @@
protected VmsHalService(VehicleHal vehicleHal) {
mVehicleHal = vehicleHal;
if (DBG) {
- Log.d(TAG, "started VmsHalService!");
+ Log.d(TAG, "Started VmsHalService!");
}
}
+ /**
+ * VMS subscribers should wait for a layers availability message which indicates
+ * the subscriber service is ready to handle subscription requests.
+ */
+ public void signalSubscriberServiceIsReady() {
+ notifyOfAvailabilityChange();
+ }
+
+ /**
+ * VMS publishers should wait for a subscription state message which indicates
+ * the publisher service is ready to handle offerings and publishing.
+ */
+ public void signalPublisherServiceIsReady() {
+ notifyOfSubscriptionChange();
+ }
+
public void addPublisherListener(VmsHalPublisherListener listener) {
mPublisherListeners.add(listener);
}
@@ -151,7 +167,7 @@
}
if (firstSubscriptionForLayer) {
notifyHalPublishers(layer, true);
- notifyClientPublishers();
+ notifyOfSubscriptionChange();
}
}
@@ -173,7 +189,7 @@
}
if (!layerHasSubscribers) {
notifyHalPublishers(layer, false);
- notifyClientPublishers();
+ notifyOfSubscriptionChange();
}
}
@@ -201,7 +217,7 @@
}
if (firstSubscriptionForLayer) {
notifyHalPublishers(layer, true);
- notifyClientPublishers();
+ notifyOfSubscriptionChange();
}
}
@@ -223,7 +239,7 @@
}
if (!layerHasSubscribers) {
notifyHalPublishers(layer, false);
- notifyClientPublishers();
+ notifyOfSubscriptionChange();
}
}
@@ -293,7 +309,7 @@
}
if (firstSubscriptionForLayer) {
notifyHalPublishers(layer, true);
- notifyClientPublishers();
+ notifyOfSubscriptionChange();
}
}
@@ -309,7 +325,7 @@
}
if (firstSubscriptionForLayer) {
notifyHalPublishers(layer, publisherId, true);
- notifyClientPublishers();
+ notifyOfSubscriptionChange();
}
}
@@ -329,7 +345,7 @@
}
if (!layerHasSubscribers) {
notifyHalPublishers(layer, false);
- notifyClientPublishers();
+ notifyOfSubscriptionChange();
}
}
@@ -350,7 +366,7 @@
}
if (!layerHasSubscribers) {
notifyHalPublishers(layer, publisherId, false);
- notifyClientPublishers();
+ notifyOfSubscriptionChange();
}
}
@@ -390,7 +406,11 @@
setSubscriptionToPublisherRequest(layer, publisherId, hasSubscribers);
}
- private void notifyClientPublishers() {
+ private void notifyOfSubscriptionChange() {
+ if (DBG) {
+ Log.d(TAG, "Notifying publishers on subscriptions");
+ }
+
// Notify the App publishers
for (VmsHalPublisherListener listener : mPublisherListeners) {
// Besides the list of layers, also a timestamp is provided to the clients.
@@ -405,7 +425,16 @@
*
* @param availableLayers the layers which publishers claim they made publish.
*/
- private void notifyOfAvailabilityChange(VmsAvailableLayers availableLayers) {
+ private void notifyOfAvailabilityChange() {
+ if (DBG) {
+ Log.d(TAG, "Notifying subscribers on layers availability");
+ }
+
+ VmsAvailableLayers availableLayers;
+ synchronized (mLock) {
+ availableLayers = mAvailableLayers.getAvailableLayers();
+ }
+
// notify the HAL
notifyAvailabilityChangeToHal(availableLayers);
@@ -417,18 +446,22 @@
@Override
public void init() {
- if (DBG) {
- Log.d(TAG, "init()");
- }
if (mIsSupported) {
mVehicleHal.subscribeProperty(this, HAL_PROPERTY_ID);
+ if (DBG) {
+ Log.d(TAG, "Initializing VmsHalService VHAL property");
+ }
+ } else {
+ if (DBG) {
+ Log.d(TAG, "VmsHalService VHAL property not supported");
+ }
}
}
@Override
public void release() {
if (DBG) {
- Log.d(TAG, "release()");
+ Log.d(TAG, "Releasing VmsHalService");
}
if (mIsSupported) {
mVehicleHal.unsubscribeProperty(this, HAL_PROPERTY_ID);
@@ -727,16 +760,25 @@
}
private void updateOffering(IBinder publisherToken, VmsLayersOffering offering) {
- VmsAvailableLayers availableLayers;
synchronized (mLock) {
- mOfferings.put(publisherToken, offering);
+ Map<Integer, VmsLayersOffering> publisherOfferings = mOfferings.get(publisherToken);
+ if (publisherOfferings == null) {
+ publisherOfferings = new HashMap<>();
+ mOfferings.put(publisherToken, publisherOfferings);
+ }
+ publisherOfferings.put(offering.getPublisherId(), offering);
// Update layers availability.
- mAvailableLayers.setPublishersOffering(mOfferings.values());
-
- availableLayers = mAvailableLayers.getAvailableLayers();
+ Set<VmsLayersOffering> allPublisherOfferings = new HashSet<>();
+ for (Map<Integer, VmsLayersOffering> offerings : mOfferings.values()) {
+ allPublisherOfferings.addAll(offerings.values());
+ }
+ if (DBG) {
+ Log.d(TAG, "New layer availability: " + allPublisherOfferings);
+ }
+ mAvailableLayers.setPublishersOffering(allPublisherOfferings);
}
- notifyOfAvailabilityChange(availableLayers);
+ notifyOfAvailabilityChange();
}
@Override
@@ -789,12 +831,15 @@
return setPropertyValue(vehiclePropertyValue);
}
- public boolean setPropertyValue(VehiclePropValue vehiclePropertyValue) {
- try {
- mVehicleHal.set(vehiclePropertyValue);
- return true;
- } catch (PropertyTimeoutException e) {
- Log.e(CarLog.TAG_PROPERTY, "set, property not ready 0x" + toHexString(HAL_PROPERTY_ID));
+ private boolean setPropertyValue(VehiclePropValue vehiclePropertyValue) {
+ if (mIsSupported) {
+ try {
+ mVehicleHal.set(vehiclePropertyValue);
+ return true;
+ } catch (PropertyTimeoutException e) {
+ Log.e(CarLog.TAG_PROPERTY,
+ "set, property not ready 0x" + toHexString(HAL_PROPERTY_ID));
+ }
}
return false;
}
diff --git a/service/src/com/android/car/pm/ActivityBlockingActivity.java b/service/src/com/android/car/pm/ActivityBlockingActivity.java
index 3e55405..15126a7 100644
--- a/service/src/com/android/car/pm/ActivityBlockingActivity.java
+++ b/service/src/com/android/car/pm/ActivityBlockingActivity.java
@@ -15,6 +15,11 @@
*/
package com.android.car.pm;
+import static com.android.car.pm.CarPackageManagerService.BLOCKING_INTENT_EXTRA_BLOCKED_ACTIVITY_NAME;
+import static com.android.car.pm.CarPackageManagerService.BLOCKING_INTENT_EXTRA_BLOCKED_TASK_ID;
+import static com.android.car.pm.CarPackageManagerService.BLOCKING_INTENT_EXTRA_IS_ROOT_ACTIVITY_DO;
+import static com.android.car.pm.CarPackageManagerService.BLOCKING_INTENT_EXTRA_ROOT_ACTIVITY_NAME;
+
import android.app.Activity;
import android.car.Car;
import android.car.CarNotConnectedException;
@@ -26,33 +31,38 @@
import android.content.ServiceConnection;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
+import android.graphics.drawable.Drawable;
+import android.os.Build;
import android.os.Bundle;
import android.os.IBinder;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
+import android.widget.ImageView;
import android.widget.TextView;
+import androidx.annotation.Nullable;
+
import com.android.car.CarLog;
import com.android.car.R;
/**
* Default activity that will be launched when the current foreground activity is not allowed.
- * Additional information on blocked Activity will be passed as extra in Intent
- * via {@link #INTENT_KEY_BLOCKED_ACTIVITY} key.
+ * Additional information on blocked Activity should be passed as intent extras.
*/
public class ActivityBlockingActivity extends Activity {
- public static final String INTENT_KEY_BLOCKED_ACTIVITY = "blocked_activity";
- public static final String EXTRA_BLOCKED_TASK = "blocked_task";
-
private static final int INVALID_TASK_ID = -1;
private Car mCar;
private CarUxRestrictionsManager mUxRManager;
- private TextView mBlockedTitle;
+ private TextView mBlockedAppName;
+ private ImageView mBlockedAppIcon;
+ private TextView mBlockingText;
+ private TextView mExitButtonMessage;
private Button mExitButton;
+
// Exiting depends on Car connection, which might not be available at the time exit was
// requested (e.g. user presses Exit Button). In that case, we record exiting was requested, and
// Car connection will perform exiting once it is established.
@@ -64,9 +74,13 @@
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_blocking);
- mBlockedTitle = findViewById(R.id.activity_blocked_title);
- mExitButton = findViewById(R.id.exit);
- mExitButton.setOnClickListener(v -> handleFinish());
+ mBlockingText = findViewById(R.id.blocking_text);
+ mBlockedAppName = findViewById(R.id.blocked_app_name);
+ mBlockedAppIcon = findViewById(R.id.blocked_app_icon);
+ mExitButton = findViewById(R.id.exit_button);
+ mExitButtonMessage = findViewById(R.id.exit_button_message);
+
+ mBlockingText.setText(getString(R.string.activity_blocked_text));
// Listen to the CarUxRestrictions so this blocking activity can be dismissed when the
// restrictions are lifted.
@@ -75,7 +89,7 @@
public void onServiceConnected(ComponentName name, IBinder service) {
try {
if (mExitRequested) {
- handleFinish();
+ handleRestartingTask();
}
mUxRManager = (CarUxRestrictionsManager) mCar.getCarManager(
Car.CAR_UX_RESTRICTION_SERVICE);
@@ -102,26 +116,85 @@
protected void onResume() {
super.onResume();
- // Display message about the current blocked activity, and optionally show an exit button
+ // Display info about the current blocked activity, and optionally show an exit button
// to restart the blocked task (stack of activities) if its root activity is DO.
+ mBlockedTaskId = getIntent().getIntExtra(BLOCKING_INTENT_EXTRA_BLOCKED_TASK_ID,
+ INVALID_TASK_ID);
// blockedActivity is expected to be always passed in as the topmost activity of task.
- String blockedActivity = getIntent().getStringExtra(INTENT_KEY_BLOCKED_ACTIVITY);
- mBlockedTitle.setText(getString(R.string.activity_blocked_string,
- findHumanReadableLabel(blockedActivity)));
- if (Log.isLoggable(CarLog.TAG_AM, Log.DEBUG)) {
- Log.d(CarLog.TAG_AM, "Blocking activity " + blockedActivity);
+ String blockedActivity = getIntent().getStringExtra(
+ BLOCKING_INTENT_EXTRA_BLOCKED_ACTIVITY_NAME);
+ if (!TextUtils.isEmpty(blockedActivity)) {
+ if (Log.isLoggable(CarLog.TAG_AM, Log.DEBUG)) {
+ Log.d(CarLog.TAG_AM, "Blocking activity " + blockedActivity);
+ }
+ // Show application icon and name of blocked activity.
+ Drawable appIcon = findApplicationIcon(blockedActivity);
+ if (appIcon != null) {
+ mBlockedAppIcon.setImageDrawable(appIcon);
+ } else {
+ mBlockedAppIcon.setVisibility(View.GONE);
+ }
+ mBlockedAppName.setText(findHumanReadableLabel(blockedActivity));
}
- // taskId is available as extra if the task can be restarted.
- mBlockedTaskId = getIntent().getIntExtra(EXTRA_BLOCKED_TASK, INVALID_TASK_ID);
+ boolean isRootDO = getIntent().getBooleanExtra(
+ BLOCKING_INTENT_EXTRA_IS_ROOT_ACTIVITY_DO, false);
- mExitButton.setVisibility(mBlockedTaskId == INVALID_TASK_ID ? View.GONE : View.VISIBLE);
- if (Log.isLoggable(CarLog.TAG_AM, Log.DEBUG) && mBlockedTaskId == INVALID_TASK_ID) {
- Log.d(CarLog.TAG_AM, "Blocked task ID is not available. Hiding exit button.");
+ // Display a button to restart task if root task is DO.
+ boolean showButton = mBlockedTaskId != INVALID_TASK_ID && isRootDO;
+ mExitButton.setVisibility(showButton ? View.VISIBLE : View.GONE);
+ mExitButton.setOnClickListener(v -> handleRestartingTask());
+ mExitButtonMessage.setVisibility(showButton ? View.VISIBLE : View.GONE);
+ mExitButtonMessage.setText(
+ getString(R.string.exit_button_message, getString(R.string.exit_button)));
+
+ // Show more debug info for non-user build.
+ if (Build.IS_ENG || Build.IS_USERDEBUG) {
+ displayDebugInfo();
}
}
+ private void displayDebugInfo() {
+ String blockedActivity = getIntent().getStringExtra(
+ BLOCKING_INTENT_EXTRA_BLOCKED_ACTIVITY_NAME);
+ String rootActivity = getIntent().getStringExtra(BLOCKING_INTENT_EXTRA_ROOT_ACTIVITY_NAME);
+
+ TextView debugInfo = findViewById(R.id.debug_info);
+ debugInfo.setText(getDebugInfo(blockedActivity, rootActivity));
+
+ // We still want to ensure driving safety for non-user build;
+ // toggle visibility of debug info with this button.
+ Button toggleDebug = findViewById(R.id.toggle_debug_info);
+ toggleDebug.setVisibility(View.VISIBLE);
+ toggleDebug.setOnClickListener(v -> {
+ boolean isDebugVisible = debugInfo.getVisibility() == View.VISIBLE;
+ debugInfo.setVisibility(isDebugVisible ? View.GONE : View.VISIBLE);
+ });
+ }
+
+ private String getDebugInfo(String blockedActivity, String rootActivity) {
+ StringBuilder debug = new StringBuilder();
+
+ ComponentName blocked = ComponentName.unflattenFromString(blockedActivity);
+ debug.append("Blocked activity is ")
+ .append(blocked.getShortClassName())
+ .append("\nBlocked activity package is ")
+ .append(blocked.getPackageName());
+
+ if (rootActivity != null) {
+ ComponentName root = ComponentName.unflattenFromString(rootActivity);
+ // Optionally show root activity info if it differs from the blocked activity.
+ if (!root.equals(blocked)) {
+ debug.append("\n\nRoot activity is ").append(root.getShortClassName());
+ }
+ if (!root.getPackageName().equals(blocked.getPackageName())) {
+ debug.append("\nRoot activity package is ").append(root.getPackageName());
+ }
+ }
+ return debug.toString();
+ }
+
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
@@ -129,6 +202,14 @@
}
@Override
+ protected void onStop() {
+ super.onStop();
+ // Finish when blocking activity goes invisible to avoid it accidentally re-surfaces with
+ // stale string regarding blocked activity.
+ finish();
+ }
+
+ @Override
protected void onDestroy() {
super.onDestroy();
if (mCar.isConnected() && mUxRManager != null) {
@@ -153,6 +234,21 @@
}
}
+ // Finds the icon of the application (package) the component belongs to.
+ @Nullable
+ private Drawable findApplicationIcon(String flattenComponentName) {
+ ComponentName componentName = ComponentName.unflattenFromString(flattenComponentName);
+ try {
+ return getPackageManager().getApplicationIcon(componentName.getPackageName());
+ } catch (PackageManager.NameNotFoundException e) {
+ if (Log.isLoggable(CarLog.TAG_AM, Log.INFO)) {
+ Log.i(CarLog.TAG_AM, "Could not find package for component name "
+ + componentName.toString());
+ }
+ }
+ return null;
+ }
+
/**
* Returns a human-readable string for {@code flattenComponentName}.
*
@@ -182,7 +278,7 @@
return label;
}
- private void handleFinish() {
+ private void handleRestartingTask() {
if (!mCar.isConnected()) {
mExitRequested = true;
return;
@@ -191,9 +287,12 @@
return;
}
- // Lock on self (assuming single instance) to avoid restarting the same task twice.
+ // Lock on self to avoid restarting the same task twice.
synchronized (this) {
try {
+ if (Log.isLoggable(CarLog.TAG_AM, Log.INFO)) {
+ Log.i(CarLog.TAG_AM, "Restarting task " + mBlockedTaskId);
+ }
CarPackageManager carPm = (CarPackageManager)
mCar.getCarManager(Car.PACKAGE_SERVICE);
carPm.restartTask(mBlockedTaskId);
diff --git a/service/src/com/android/car/pm/AppBlockingPolicyProxy.java b/service/src/com/android/car/pm/AppBlockingPolicyProxy.java
index 9404ac6..38b5a5a 100644
--- a/service/src/com/android/car/pm/AppBlockingPolicyProxy.java
+++ b/service/src/com/android/car/pm/AppBlockingPolicyProxy.java
@@ -80,7 +80,7 @@
Intent intent = new Intent();
intent.setComponent(mServiceInfo.getComponentName());
mContext.bindServiceAsUser(intent, this, Context.BIND_AUTO_CREATE | Context.BIND_IMPORTANT,
- UserHandle.SYSTEM);
+ UserHandle.CURRENT_OR_SELF);
synchronized (this) {
mBound = true;
}
diff --git a/service/src/com/android/car/pm/CarPackageManagerService.java b/service/src/com/android/car/pm/CarPackageManagerService.java
index ed51a78..90212cc 100644
--- a/service/src/com/android/car/pm/CarPackageManagerService.java
+++ b/service/src/com/android/car/pm/CarPackageManagerService.java
@@ -141,6 +141,32 @@
// To track if we received the boot complete intent.
private boolean mBootLockedIntentRx;
+ /**
+ * Name of blocked activity.
+ *
+ * @hide
+ */
+ public static final String BLOCKING_INTENT_EXTRA_BLOCKED_ACTIVITY_NAME = "blocked_activity";
+ /**
+ * int task id of the blocked task.
+ *
+ * @hide
+ */
+ public static final String BLOCKING_INTENT_EXTRA_BLOCKED_TASK_ID = "blocked_task_id";
+ /**
+ * Name of root activity of blocked task.
+ *
+ * @hide
+ */
+ public static final String BLOCKING_INTENT_EXTRA_ROOT_ACTIVITY_NAME = "root_activity_name";
+ /**
+ * Boolean indicating whether the root activity is distraction-optimized (DO).
+ * Blocking screen should show a button to restart the task if {@code true}.
+ *
+ * @hide
+ */
+ public static final String BLOCKING_INTENT_EXTRA_IS_ROOT_ACTIVITY_DO = "is_root_activity_do";
+
public CarPackageManagerService(Context context,
CarUxRestrictionsManagerService uxRestrictionsService,
SystemActivityMonitoringService systemActivityMonitoringService) {
@@ -525,14 +551,8 @@
private void generateActivityWhitelistMap() {
HashMap<String, AppBlockingPackageInfoWrapper> activityWhitelist = new HashMap<>();
mConfiguredWhitelist = mContext.getString(R.string.activityWhitelist);
- if (mConfiguredWhitelist == null) {
- if (DBG_POLICY_CHECK) {
- Log.d(CarLog.TAG_PACKAGE, "Null whitelist in config");
- }
- return;
- }
// Get the apps/activities that are whitelisted in the configuration XML resource
- HashMap<String, Set<String>> configWhitelist = parseConfiglist(mConfiguredWhitelist);
+ HashMap<String, Set<String>> configWhitelist = parseConfigList(mConfiguredWhitelist);
if (configWhitelist == null) {
if (DBG_POLICY_CHECK) {
Log.w(CarLog.TAG_PACKAGE, "White list null. No apps whitelisted");
@@ -558,7 +578,7 @@
}
int flags = 0;
- String[] activities = null;
+ Set<String> activities = new ArraySet<>();
if (info.applicationInfo.isSystemApp()
|| info.applicationInfo.isUpdatedSystemApp()) {
@@ -576,9 +596,13 @@
// Whole Pkg has been whitelisted
flags |= AppBlockingPackageInfo.FLAG_WHOLE_ACTIVITY;
// Add all activities to the whitelist
- activities = getActivitiesInPackage(info);
- if (activities == null && DBG_POLICY_CHECK) {
- Log.d(CarLog.TAG_PACKAGE, info.packageName + ": Activities null");
+ List<String> activitiesForPackage = getActivitiesInPackage(info);
+ if (activitiesForPackage != null) {
+ activities.addAll(activitiesForPackage);
+ } else {
+ if (DBG_POLICY_CHECK) {
+ Log.d(CarLog.TAG_PACKAGE, info.packageName + ": Activities null");
+ }
}
} else {
if (DBG_POLICY_CHECK) {
@@ -587,64 +611,64 @@
Log.d(CarLog.TAG_PACKAGE, a);
}
}
- activities = configActivitiesForPackage.toArray(
- new String[configActivitiesForPackage.size()]);
+ activities.addAll(configActivitiesForPackage);
}
- } else {
- /* 2. If app is not listed in the config.xml check their Manifest meta-data to
- see if they have any Distraction Optimized(DO) activities.
- For non system apps, we check if the app install source was a permittable
- source. This prevents side-loaded apps to fake DO. Bypass the check
- for debug builds for development convenience. */
- if (!isDebugBuild()
- && !info.applicationInfo.isSystemApp()
- && !info.applicationInfo.isUpdatedSystemApp()) {
- try {
- if (mAllowedAppInstallSources != null) {
- String installerName = mPackageManager.getInstallerPackageName(
- info.packageName);
- if (installerName == null || (installerName != null
- && !mAllowedAppInstallSources.contains(installerName))) {
- Log.w(CarLog.TAG_PACKAGE,
- info.packageName + " not installed from permitted sources "
- + installerName == null ? "NULL" : installerName);
- continue;
- }
- }
- } catch (IllegalArgumentException e) {
- Log.w(CarLog.TAG_PACKAGE, info.packageName + " not installed!");
- continue;
- }
- }
-
+ }
+ /* 2. If app is not listed in the config.xml check their Manifest meta-data to
+ see if they have any Distraction Optimized(DO) activities.
+ For non system apps, we check if the app install source was a permittable
+ source. This prevents side-loaded apps to fake DO. Bypass the check
+ for debug builds for development convenience. */
+ if (!isDebugBuild()
+ && !info.applicationInfo.isSystemApp()
+ && !info.applicationInfo.isUpdatedSystemApp()) {
try {
- activities = CarAppMetadataReader.findDistractionOptimizedActivities(
- mContext,
- info.packageName);
- } catch (NameNotFoundException e) {
- Log.w(CarLog.TAG_PACKAGE, "Error reading metadata: " + info.packageName);
+ if (mAllowedAppInstallSources != null) {
+ String installerName = mPackageManager.getInstallerPackageName(
+ info.packageName);
+ if (installerName == null || (installerName != null
+ && !mAllowedAppInstallSources.contains(installerName))) {
+ Log.w(CarLog.TAG_PACKAGE,
+ info.packageName + " not installed from permitted sources "
+ + installerName == null ? "NULL" : installerName);
+ continue;
+ }
+ }
+ } catch (IllegalArgumentException e) {
+ Log.w(CarLog.TAG_PACKAGE, info.packageName + " not installed!");
continue;
}
- if (activities != null) {
+ }
+
+ try {
+ String[] doActivities = CarAppMetadataReader.findDistractionOptimizedActivities(
+ mContext, info.packageName);
+ if (doActivities != null) {
// Some of the activities in this app are Distraction Optimized.
if (DBG_POLICY_CHECK) {
- for (String activity : activities) {
+ for (String activity : doActivities) {
Log.d(CarLog.TAG_PACKAGE,
"adding " + activity + " from " + info.packageName
+ " to whitelist");
}
}
+ activities.addAll(Arrays.asList(doActivities));
}
+ } catch (NameNotFoundException e) {
+ Log.w(CarLog.TAG_PACKAGE, "Error reading metadata: " + info.packageName);
+ continue;
}
+
// Nothing to add to whitelist
- if (activities == null) {
+ if (activities.isEmpty()) {
continue;
}
Signature[] signatures;
signatures = info.signatures;
AppBlockingPackageInfo appBlockingInfo = new AppBlockingPackageInfo(
- info.packageName, 0, 0, flags, signatures, activities);
+ info.packageName, 0, 0, flags, signatures,
+ activities.toArray(new String[activities.size()]));
AppBlockingPackageInfoWrapper wrapper = new AppBlockingPackageInfoWrapper(
appBlockingInfo, true);
activityWhitelist.put(info.packageName, wrapper);
@@ -672,7 +696,7 @@
}
return;
}
- Map<String, Set<String>> configBlacklist = parseConfiglist(mConfiguredBlacklist);
+ Map<String, Set<String>> configBlacklist = parseConfigList(mConfiguredBlacklist);
if (configBlacklist == null) {
if (DBG_POLICY_CHECK) {
Log.w(CarLog.TAG_PACKAGE, "Black list null. No apps blacklisted");
@@ -688,7 +712,7 @@
}
int flags = 0;
PackageInfo pkgInfo;
- String[] activities;
+ Set<String> activities = new ArraySet<>();
try {
pkgInfo = mPackageManager.getPackageInfo(
pkg, PackageManager.GET_ACTIVITIES
@@ -708,16 +732,19 @@
if (configActivities.size() == 0) {
// whole package
flags |= AppBlockingPackageInfo.FLAG_WHOLE_ACTIVITY;
- activities = getActivitiesInPackage(pkgInfo);
+ List<String> activitiesInPackage = getActivitiesInPackage(pkgInfo);
+ if (activitiesInPackage != null && !activitiesInPackage.isEmpty()) {
+ activities.addAll(activitiesInPackage);
+ }
} else {
- activities = configActivities.toArray(new String[configActivities.size()]);
+ activities.addAll(configActivities);
}
- if (activities == null) {
+ if (activities.isEmpty()) {
continue;
}
AppBlockingPackageInfo appBlockingInfo = new AppBlockingPackageInfo(pkg, 0, 0, flags,
- pkgInfo.signatures, activities);
+ pkgInfo.signatures, activities.toArray(new String[activities.size()]));
AppBlockingPackageInfoWrapper wrapper = new AppBlockingPackageInfoWrapper(
appBlockingInfo, true);
activityBlacklist.put(pkg, wrapper);
@@ -734,7 +761,7 @@
* included.
*/
@Nullable
- private HashMap<String, Set<String>> parseConfiglist(String configList) {
+ private HashMap<String, Set<String>> parseConfigList(String configList) {
if (configList == null) {
return null;
}
@@ -762,7 +789,7 @@
}
@Nullable
- private String[] getActivitiesInPackage(PackageInfo info) {
+ private List<String> getActivitiesInPackage(PackageInfo info) {
if (info == null || info.activities == null) {
return null;
}
@@ -770,7 +797,7 @@
for (ActivityInfo aInfo : info.activities) {
activityList.add(aInfo.name);
}
- return activityList.toArray(new String[activityList.size()]);
+ return activityList;
}
/**
@@ -935,45 +962,64 @@
" not allowed, will block, number of tasks in stack:" +
topTask.stackInfo.taskIds.length);
}
- StringBuilder blockedActivityLog = new StringBuilder();
- Intent newActivityIntent = new Intent();
- newActivityIntent.setComponent(mActivityBlockingActivity);
- newActivityIntent.putExtra(
- ActivityBlockingActivity.INTENT_KEY_BLOCKED_ACTIVITY,
- topTask.topActivity.flattenToString());
- blockedActivityLog.append("Blocked activity ")
- .append(topTask.topActivity.flattenToShortString())
- .append(". Task id ").append(topTask.taskId);
- // If root activity of blocked task is DO, also pass its task id into blocking activity,
- // which uses the id to display a button for restarting the blocked task.
+ // Figure out the root activity of blocked task.
+ String taskRootActivity = null;
for (int i = 0; i < topTask.stackInfo.taskIds.length; i++) {
// topTask.taskId is the task that should be blocked.
if (topTask.stackInfo.taskIds[i] == topTask.taskId) {
// stackInfo represents an ActivityStack. Its fields taskIds and taskNames
// are 1:1 mapped, where taskNames is the name of root activity in this task.
- String taskRootActivity = topTask.stackInfo.taskNames[i];
-
- ComponentName rootActivityName = ComponentName.unflattenFromString(
- taskRootActivity);
- if (isActivityDistractionOptimized(
- rootActivityName.getPackageName(), rootActivityName.getClassName())) {
- newActivityIntent.putExtra(
- ActivityBlockingActivity.EXTRA_BLOCKED_TASK, topTask.taskId);
- if (Log.isLoggable(CarLog.TAG_PACKAGE, Log.INFO)) {
- Log.i(CarLog.TAG_PACKAGE, "Blocked task " + topTask.taskId
- + " has DO root activity " + taskRootActivity);
- }
- blockedActivityLog.append(". Root DO activity ")
- .append(rootActivityName.flattenToShortString());
- }
+ taskRootActivity = topTask.stackInfo.taskNames[i];
break;
}
}
- addLog(blockedActivityLog.toString());
+
+ boolean isRootDO = false;
+ if (taskRootActivity != null) {
+ ComponentName componentName = ComponentName.unflattenFromString(taskRootActivity);
+ isRootDO = isActivityDistractionOptimized(
+ componentName.getPackageName(), componentName.getClassName());
+ }
+
+ Intent newActivityIntent = createBlockingActivityIntent(
+ mActivityBlockingActivity, topTask.topActivity.flattenToShortString(),
+ topTask.taskId, taskRootActivity, isRootDO);
+
+ // Intent contains all info to debug what is blocked - log into both logcat and dumpsys.
+ String log = "Starting blocking activity with intent: " + newActivityIntent.toUri(0);
+ if (Log.isLoggable(CarLog.TAG_PACKAGE, Log.INFO)) {
+ Log.i(CarLog.TAG_PACKAGE, log);
+ }
+ addLog(log);
mSystemActivityMonitoringService.blockActivity(topTask, newActivityIntent);
}
+ /**
+ * Creates an intent to start blocking activity.
+ *
+ * @param blockingActivity the activity to launch
+ * @param blockedActivity the activity being blocked
+ * @param blockedTaskId the blocked task id, which contains the blocked activity
+ * @param taskRootActivity root activity of the blocked task
+ *
+ * @return an intent to launch the blocking activity.
+ */
+ private static Intent createBlockingActivityIntent(ComponentName blockingActivity,
+ String blockedActivity, int blockedTaskId, String taskRootActivity, boolean isRootDo) {
+ Intent newActivityIntent = new Intent();
+ newActivityIntent.setComponent(blockingActivity);
+ newActivityIntent.putExtra(
+ BLOCKING_INTENT_EXTRA_BLOCKED_ACTIVITY_NAME, blockedActivity);
+ newActivityIntent.putExtra(
+ BLOCKING_INTENT_EXTRA_BLOCKED_TASK_ID, blockedTaskId);
+ newActivityIntent.putExtra(
+ BLOCKING_INTENT_EXTRA_ROOT_ACTIVITY_NAME, taskRootActivity);
+ newActivityIntent.putExtra(
+ BLOCKING_INTENT_EXTRA_IS_ROOT_ACTIVITY_DO, isRootDo);
+ return newActivityIntent;
+ }
+
private void blockTopActivitiesIfNecessary() {
boolean restricted = mUxRestrictionsListener.isRestricted();
if (!restricted) {
diff --git a/service/src/com/android/car/systeminterface/DisplayInterface.java b/service/src/com/android/car/systeminterface/DisplayInterface.java
index 8dc7bd4..885657b 100644
--- a/service/src/com/android/car/systeminterface/DisplayInterface.java
+++ b/service/src/com/android/car/systeminterface/DisplayInterface.java
@@ -20,6 +20,9 @@
import static com.android.settingslib.display.BrightnessUtils.convertGammaToLinear;
import static com.android.settingslib.display.BrightnessUtils.convertLinearToGamma;
+import android.app.ActivityManager;
+import android.car.userlib.CarUserManagerHelper;
+import android.car.userlib.CarUserManagerHelper.OnUsersUpdateListener;
import android.content.ContentResolver;
import android.content.Context;
import android.database.ContentObserver;
@@ -29,6 +32,7 @@
import android.os.Looper;
import android.os.PowerManager;
import android.os.SystemClock;
+import android.os.UserHandle;
import android.provider.Settings.SettingNotFoundException;
import android.provider.Settings.System;
import android.util.Log;
@@ -49,7 +53,16 @@
void startDisplayStateMonitoring(CarPowerManagementService service);
void stopDisplayStateMonitoring();
- class DefaultImpl implements DisplayInterface {
+ /**
+ * Refreshing display brightness. Used when user is switching and car turned on.
+ */
+ void refreshDisplayBrightness();
+
+ /**
+ * Default implementation of display operations
+ */
+ class DefaultImpl implements DisplayInterface, OnUsersUpdateListener {
+ private final ActivityManager mActivityManager;
private final ContentResolver mContentResolver;
private final Context mContext;
private final DisplayManager mDisplayManager;
@@ -59,23 +72,14 @@
private final WakeLockInterface mWakeLockInterface;
private CarPowerManagementService mService;
private boolean mDisplayStateSet;
+ private CarUserManagerHelper mCarUserManagerHelper;
+ private int mLastBrightnessLevel = -1;
private ContentObserver mBrightnessObserver =
new ContentObserver(new Handler(Looper.getMainLooper())) {
@Override
public void onChange(boolean selfChange) {
- int linear = GAMMA_SPACE_MAX;
-
- try {
- linear = System.getInt(mContentResolver, System.SCREEN_BRIGHTNESS);
- } catch (SettingNotFoundException e) {
- Log.e(CarLog.TAG_POWER, "Could not get SCREEN_BRIGHTNESS: " + e);
- }
- int gamma = convertLinearToGamma(linear, mMinimumBacklight,
- mMaximumBacklight);
- int percentBright = (gamma * 100 + ((GAMMA_SPACE_MAX + 1) / 2))
- / GAMMA_SPACE_MAX;
- mService.sendDisplayBrightness(percentBright);
+ refreshDisplayBrightness();
}
};
@@ -99,6 +103,7 @@
};
DefaultImpl(Context context, WakeLockInterface wakeLockInterface) {
+ mActivityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
mContext = context;
mContentResolver = mContext.getContentResolver();
mDisplayManager = (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE);
@@ -106,6 +111,24 @@
mMaximumBacklight = mPowerManager.getMaximumScreenBrightnessSetting();
mMinimumBacklight = mPowerManager.getMinimumScreenBrightnessSetting();
mWakeLockInterface = wakeLockInterface;
+ mCarUserManagerHelper = new CarUserManagerHelper(context);
+ mCarUserManagerHelper.registerOnUsersUpdateListener(this);
+ }
+
+ @Override
+ public synchronized void refreshDisplayBrightness() {
+ int gamma = GAMMA_SPACE_MAX;
+ try {
+ int linear = System.getIntForUser(
+ mContentResolver,
+ System.SCREEN_BRIGHTNESS,
+ mActivityManager.getCurrentUser());
+ gamma = convertLinearToGamma(linear, mMinimumBacklight, mMaximumBacklight);
+ } catch (SettingNotFoundException e) {
+ Log.e(CarLog.TAG_POWER, "Could not get SCREEN_BRIGHTNESS: " + e);
+ }
+ int percentBright = (gamma * 100 + ((GAMMA_SPACE_MAX + 1) / 2)) / GAMMA_SPACE_MAX;
+ mService.sendDisplayBrightness(percentBright);
}
private void handleMainDisplayChanged() {
@@ -127,9 +150,18 @@
@Override
public void setDisplayBrightness(int percentBright) {
+ if (percentBright == mLastBrightnessLevel) {
+ // We have already set the value last time. Skipping
+ return;
+ }
+ mLastBrightnessLevel = percentBright;
int gamma = (percentBright * GAMMA_SPACE_MAX + 50) / 100;
int linear = convertGammaToLinear(gamma, mMinimumBacklight, mMaximumBacklight);
- System.putInt(mContentResolver, System.SCREEN_BRIGHTNESS, linear);
+ System.putIntForUser(
+ mContentResolver,
+ System.SCREEN_BRIGHTNESS,
+ linear,
+ mActivityManager.getCurrentUser());
}
@Override
@@ -138,9 +170,13 @@
mService = service;
mDisplayStateSet = isMainDisplayOn();
}
- mContentResolver.registerContentObserver(System.getUriFor(System.SCREEN_BRIGHTNESS),
- false, mBrightnessObserver);
+ mContentResolver.registerContentObserver(
+ System.getUriFor(System.SCREEN_BRIGHTNESS),
+ false,
+ mBrightnessObserver,
+ UserHandle.USER_ALL);
mDisplayManager.registerDisplayListener(mDisplayListener, service.getHandler());
+ refreshDisplayBrightness();
}
@Override
@@ -164,5 +200,16 @@
mPowerManager.goToSleep(SystemClock.uptimeMillis());
}
}
+
+ @Override
+ public void onUsersUpdate() {
+ if (mService == null) {
+ // CarPowerManagementService is not connected yet
+ return;
+ }
+ // We need to reset last value
+ mLastBrightnessLevel = -1;
+ refreshDisplayBrightness();
+ }
}
}
diff --git a/service/src/com/android/car/systeminterface/SystemInterface.java b/service/src/com/android/car/systeminterface/SystemInterface.java
index b508988..5064e41 100644
--- a/service/src/com/android/car/systeminterface/SystemInterface.java
+++ b/service/src/com/android/car/systeminterface/SystemInterface.java
@@ -153,8 +153,8 @@
}
@Override
- public boolean enterDeepSleep(int wakeupTimeSec) {
- return mSystemStateInterface.enterDeepSleep(wakeupTimeSec);
+ public boolean enterDeepSleep() {
+ return mSystemStateInterface.enterDeepSleep();
}
@Override
@@ -172,6 +172,11 @@
return mSystemStateInterface.isSystemSupportingDeepSleep();
}
+ @Override
+ public void refreshDisplayBrightness() {
+ mDisplayInterface.refreshDisplayBrightness();
+ }
+
public final static class Builder {
private DisplayInterface mDisplayInterface;
private IOInterface mIOInterface;
diff --git a/service/src/com/android/car/systeminterface/SystemStateInterface.java b/service/src/com/android/car/systeminterface/SystemStateInterface.java
index 5fb7185..c963ac0 100644
--- a/service/src/com/android/car/systeminterface/SystemStateInterface.java
+++ b/service/src/com/android/car/systeminterface/SystemStateInterface.java
@@ -16,34 +16,36 @@
package com.android.car.systeminterface;
-import java.time.Duration;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-
-import com.android.car.procfsinspector.ProcessInfo;
-import com.android.car.procfsinspector.ProcfsInspector;
-import com.android.internal.car.ICarServiceHelper;
-
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.PowerManager;
-import android.os.SystemClock;
import android.util.Log;
import android.util.Pair;
+import com.android.car.procfsinspector.ProcessInfo;
+import com.android.car.procfsinspector.ProcfsInspector;
+import com.android.internal.car.ICarServiceHelper;
+
+import java.time.Duration;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
/**
* Interface that abstracts system status (booted, sleeping, ...) operations
*/
public interface SystemStateInterface {
static final String TAG = SystemStateInterface.class.getSimpleName();
void shutdown();
- boolean enterDeepSleep(int sleepDurationSec);
+ /**
+ * Put the device into Suspend to RAM mode
+ * @return boolean true if suspend succeeded
+ */
+ boolean enterDeepSleep();
void scheduleActionForBootCompleted(Runnable action, Duration delay);
default boolean isWakeupCausedByTimer() {
@@ -56,7 +58,7 @@
default boolean isSystemSupportingDeepSleep() {
//TODO should return by checking some kernel suspend control sysfs, bug: 32061842
- return false;
+ return true;
}
default List<ProcessInfo> getRunningProcesses() {
@@ -99,7 +101,7 @@
}
@Override
- public boolean enterDeepSleep(int sleepDurationSec) {
+ public boolean enterDeepSleep() {
boolean deviceEnteredSleep;
//TODO set wake up time via VHAL, bug: 32061842
try {
diff --git a/service/src/com/android/car/trust/BleService.java b/service/src/com/android/car/trust/BleService.java
new file mode 100644
index 0000000..3ec1dca
--- /dev/null
+++ b/service/src/com/android/car/trust/BleService.java
@@ -0,0 +1,226 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.trust;
+
+import static android.bluetooth.BluetoothProfile.GATT_SERVER;
+
+import android.app.Service;
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothGatt;
+import android.bluetooth.BluetoothGattCharacteristic;
+import android.bluetooth.BluetoothGattServer;
+import android.bluetooth.BluetoothGattServerCallback;
+import android.bluetooth.BluetoothGattService;
+import android.bluetooth.BluetoothManager;
+import android.bluetooth.BluetoothProfile;
+import android.bluetooth.le.AdvertiseCallback;
+import android.bluetooth.le.AdvertiseData;
+import android.bluetooth.le.AdvertiseSettings;
+import android.bluetooth.le.BluetoothLeAdvertiser;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.os.Handler;
+import android.os.ParcelUuid;
+import android.util.Log;
+
+/**
+ * A generic service to start a BLE
+ * TODO(b/123248433) This could move to a separate comms library.
+ */
+public abstract class BleService extends Service {
+ private static final String TAG = BleService.class.getSimpleName();
+
+ private static final int BLE_RETRY_LIMIT = 5;
+ private static final int BLE_RETRY_INTERVAL_MS = 1000;
+
+ private final Handler mHandler = new Handler();
+
+ private BluetoothManager mBluetoothManager;
+ private BluetoothLeAdvertiser mAdvertiser;
+ private BluetoothGattServer mGattServer;
+ private int mAdvertiserStartCount;
+
+ /**
+ * Starts the GATT server with the given {@link BluetoothGattService} and begins
+ * advertising.
+ *
+ * <p>It is possible that BLE service is still in TURNING_ON state when this method is invoked.
+ * Therefore, several retries will be made to ensure advertising is started.
+ *
+ * @param service {@link BluetoothGattService} that will be discovered by clients
+ */
+ protected void startAdvertising(BluetoothGattService service,
+ AdvertiseCallback advertiseCallback) {
+ if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
+ Log.e(TAG, "System does not support BLE");
+ return;
+ }
+
+ // Only open one Gatt server.
+ if (mGattServer == null) {
+ mBluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
+ mGattServer = mBluetoothManager.openGattServer(this, mGattServerCallback);
+
+ if (mGattServer == null) {
+ Log.e(TAG, "Gatt Server not created");
+ return;
+ }
+ }
+
+ mGattServer.clearServices();
+ mGattServer.addService(service);
+
+ AdvertiseSettings settings = new AdvertiseSettings.Builder()
+ .setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY)
+ .setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH)
+ .setConnectable(true)
+ .build();
+
+ AdvertiseData data = new AdvertiseData.Builder()
+ .setIncludeDeviceName(true)
+ .addServiceUuid(new ParcelUuid(service.getUuid()))
+ .build();
+
+ mAdvertiserStartCount = 0;
+ startAdvertisingInternally(settings, data, advertiseCallback);
+ }
+
+ private void startAdvertisingInternally(AdvertiseSettings settings, AdvertiseData data,
+ AdvertiseCallback advertiseCallback) {
+ mAdvertiserStartCount += 1;
+ mAdvertiser = BluetoothAdapter.getDefaultAdapter().getBluetoothLeAdvertiser();
+ if (mAdvertiser == null && mAdvertiserStartCount < BLE_RETRY_LIMIT) {
+ mHandler.postDelayed(
+ () -> startAdvertisingInternally(settings, data, advertiseCallback),
+ BLE_RETRY_INTERVAL_MS);
+ } else {
+ mHandler.removeCallbacks(null);
+ mAdvertiser.startAdvertising(settings, data, advertiseCallback);
+ mAdvertiserStartCount = 0;
+ }
+ }
+
+ protected void stopAdvertising(AdvertiseCallback advertiseCallback) {
+ if (mAdvertiser != null) {
+ mAdvertiser.stopAdvertising(advertiseCallback);
+ }
+ }
+
+ /**
+ * Notifies the characteristic change via {@link BluetoothGattServer}
+ */
+ protected void notifyCharacteristicChanged(BluetoothDevice device,
+ BluetoothGattCharacteristic characteristic, boolean confirm) {
+ if (mGattServer != null) {
+ mGattServer.notifyCharacteristicChanged(device, characteristic, confirm);
+ }
+ }
+
+ @Override
+ public void onDestroy() {
+ // Stops the advertiser and GATT server. This needs to be done to avoid leaks
+ if (mAdvertiser != null) {
+ mAdvertiser.cleanup();
+ }
+
+ if (mGattServer != null) {
+ mGattServer.clearServices();
+ try {
+ for (BluetoothDevice d : mBluetoothManager.getConnectedDevices(GATT_SERVER)) {
+ mGattServer.cancelConnection(d);
+ }
+ } catch (UnsupportedOperationException e) {
+ Log.e(TAG, "Error getting connected devices", e);
+ } finally {
+ mGattServer.close();
+ }
+ }
+ super.onDestroy();
+ }
+
+ // Delegate to subclass
+ protected void onAdvertiseStartSuccess() { }
+ protected void onAdvertiseStartFailure(int errorCode) { }
+ protected void onAdvertiseDeviceConnected(BluetoothDevice device) { }
+ protected void onAdvertiseDeviceDisconnected(BluetoothDevice device) { }
+
+ /**
+ * Triggered when this BleService receives a write request from a remote
+ * device. Sub-classes should implement how to handle requests.
+ */
+ protected abstract void onCharacteristicWrite(BluetoothDevice device, int requestId,
+ BluetoothGattCharacteristic characteristic, boolean preparedWrite, boolean
+ responseNeeded, int offset, byte[] value);
+
+ /**
+ * Triggered when this BleService receives a read request from a remote device.
+ */
+ protected abstract void onCharacteristicRead(BluetoothDevice device,
+ int requestId, int offset, BluetoothGattCharacteristic characteristic);
+
+ private final BluetoothGattServerCallback mGattServerCallback =
+ new BluetoothGattServerCallback() {
+ @Override
+ public void onConnectionStateChange(BluetoothDevice device,
+ final int status, final int newState) {
+ switch (newState) {
+ case BluetoothProfile.STATE_CONNECTED:
+ onAdvertiseDeviceConnected(device);
+ break;
+ case BluetoothProfile.STATE_DISCONNECTED:
+ onAdvertiseDeviceDisconnected(device);
+ break;
+ default:
+ Log.w(TAG, "Connection state not connecting or disconnecting; ignoring: "
+ + newState);
+ }
+ }
+
+ @Override
+ public void onServiceAdded(final int status, BluetoothGattService service) {
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "Service added status: " + status + " uuid: " + service.getUuid());
+ }
+ }
+
+ @Override
+ public void onCharacteristicReadRequest(BluetoothDevice device,
+ int requestId, int offset, final BluetoothGattCharacteristic characteristic) {
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "Read request for characteristic: " + characteristic.getUuid());
+ }
+
+ mGattServer.sendResponse(device, requestId,
+ BluetoothGatt.GATT_SUCCESS, offset, characteristic.getValue());
+ onCharacteristicRead(device, requestId, offset, characteristic);
+ }
+
+ @Override
+ public void onCharacteristicWriteRequest(final BluetoothDevice device, int requestId,
+ BluetoothGattCharacteristic characteristic, boolean preparedWrite, boolean
+ responseNeeded, int offset, byte[] value) {
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "Write request for characteristic: " + characteristic.getUuid());
+ }
+
+ mGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS,
+ offset, value);
+ onCharacteristicWrite(device, requestId, characteristic,
+ preparedWrite, responseNeeded, offset, value);
+ }
+ };
+}
diff --git a/service/src/com/android/car/trust/CarTrustAgentEnrollmentService.java b/service/src/com/android/car/trust/CarTrustAgentEnrollmentService.java
new file mode 100644
index 0000000..e6aeeac
--- /dev/null
+++ b/service/src/com/android/car/trust/CarTrustAgentEnrollmentService.java
@@ -0,0 +1,309 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.trust;
+
+import android.annotation.Nullable;
+import android.bluetooth.BluetoothDevice;
+import android.car.trust.ICarTrustAgentBleCallback;
+import android.car.trust.ICarTrustAgentEnrollment;
+import android.car.trust.ICarTrustAgentEnrollmentCallback;
+import android.content.Context;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.util.Log;
+
+import com.android.car.CarServiceBase;
+
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * A service that enables enrolling a phone as a trusted device for authenticating a user on the
+ * IHU. This implements the APIs that an enrollment app can call to conduct an enrollment.
+ */
+public class CarTrustAgentEnrollmentService extends ICarTrustAgentEnrollment.Stub implements
+ CarServiceBase {
+ private static final String TAG = "CarTrustAgentEnroll";
+ private final Context mContext;
+ // List of clients listening to Enrollment state change events.
+ private final List<EnrollmentStateClient> mEnrollmentStateClients = new ArrayList<>();
+ // List of clients listening to BLE state change events.
+ private final List<BleStateChangeClient> mBleStateChangeClients = new ArrayList<>();
+
+ public CarTrustAgentEnrollmentService(Context context) {
+ mContext = context;
+ }
+
+ @Override
+ public synchronized void init() {
+ }
+
+ @Override
+ public synchronized void release() {
+ for (EnrollmentStateClient client : mEnrollmentStateClients) {
+ client.mListenerBinder.unlinkToDeath(client, 0);
+ }
+ mEnrollmentStateClients.clear();
+ }
+
+
+ // Binder methods
+ // TODO(b/120911995) The methods don't do anything yet. The implementation will be checked in
+ // a follow up CL.
+ @Override
+ public void startEnrollmentAdvertising() {
+ }
+
+ @Override
+ public void stopEnrollmentAdvertising() {
+ }
+
+ @Override
+ public void initiateEnrollmentHandshake(BluetoothDevice device) {
+ }
+
+ @Override
+ public void enrollmentHandshakeAccepted() {
+ }
+
+ @Override
+ public void terminateEnrollmentHandshake() {
+ }
+
+ @Override
+ public void activateToken(long handle) {
+ }
+
+ @Override
+ public void revokeTrust(long handle) {
+ }
+
+ @Override
+ public int[] getEnrollmentHandlesForUser(int uid) {
+ int[] handles = {};
+ return handles;
+ }
+
+ /**
+ * Registers a {@link ICarTrustAgentEnrollmentCallback} to be notified for changes to the
+ * enrollment state.
+ *
+ * @param listener {@link ICarTrustAgentEnrollmentCallback}
+ */
+ @Override
+ public synchronized void registerEnrollmentCallback(ICarTrustAgentEnrollmentCallback listener) {
+ if (listener == null) {
+ throw new IllegalArgumentException("Listener is null");
+ }
+ // If a new client is registering, create a new EnrollmentStateClient and add it to the list
+ // of listening clients.
+ EnrollmentStateClient client = findEnrollmentStateClientLocked(listener);
+ if (client == null) {
+ client = new EnrollmentStateClient(listener);
+ try {
+ listener.asBinder().linkToDeath(client, 0);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Cannot link death recipient to binder ", e);
+ return;
+ }
+ mEnrollmentStateClients.add(client);
+ }
+ }
+
+ /**
+ * Iterates through the list of registered Enrollment State Change clients -
+ * {@link EnrollmentStateClient} and finds if the given client is already registered.
+ *
+ * @param listener Listener to look for.
+ * @return the {@link EnrollmentStateClient} if found, null if not
+ */
+ @Nullable
+ private EnrollmentStateClient findEnrollmentStateClientLocked(
+ ICarTrustAgentEnrollmentCallback listener) {
+ IBinder binder = listener.asBinder();
+ // Find the listener by comparing the binder object they host.
+ for (EnrollmentStateClient client : mEnrollmentStateClients) {
+ if (client.isHoldingBinder(binder)) {
+ return client;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Unregister the given Enrollment State Change listener
+ *
+ * @param listener client to unregister
+ */
+ @Override
+ public synchronized void unregisterEnrollmentCallback(
+ ICarTrustAgentEnrollmentCallback listener) {
+ if (listener == null) {
+ throw new IllegalArgumentException("Listener is null");
+ }
+
+ EnrollmentStateClient client = findEnrollmentStateClientLocked(listener);
+ if (client == null) {
+ Log.e(TAG, "unregisterEnrollmentCallback(): listener was not previously "
+ + "registered");
+ return;
+ }
+ listener.asBinder().unlinkToDeath(client, 0);
+ mEnrollmentStateClients.remove(client);
+ }
+
+ /**
+ * Registers a {@link ICarTrustAgentBleCallback} to be notified for changes to the BLE state
+ * changes.
+ *
+ * @param listener {@link ICarTrustAgentBleCallback}
+ */
+ @Override
+ public synchronized void registerBleCallback(ICarTrustAgentBleCallback listener) {
+ if (listener == null) {
+ throw new IllegalArgumentException("Listener is null");
+ }
+ // If a new client is registering, create a new EnrollmentStateClient and add it to the list
+ // of listening clients.
+ BleStateChangeClient client = findBleStateClientLocked(listener);
+ if (client == null) {
+ client = new BleStateChangeClient(listener);
+ try {
+ listener.asBinder().linkToDeath(client, 0);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Cannot link death recipient to binder " + e);
+ return;
+ }
+ mBleStateChangeClients.add(client);
+ }
+ }
+
+ /**
+ * Iterates through the list of registered BLE State Change clients -
+ * {@link BleStateChangeClient} and finds if the given client is already registered.
+ *
+ * @param listener Listener to look for.
+ * @return the {@link BleStateChangeClient} if found, null if not
+ */
+ @Nullable
+ private BleStateChangeClient findBleStateClientLocked(
+ ICarTrustAgentBleCallback listener) {
+ IBinder binder = listener.asBinder();
+ // Find the listener by comparing the binder object they host.
+ for (BleStateChangeClient client : mBleStateChangeClients) {
+ if (client.isHoldingBinder(binder)) {
+ return client;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Unregister the given BLE State Change listener
+ *
+ * @param listener client to unregister
+ */
+ @Override
+ public synchronized void unregisterBleCallback(ICarTrustAgentBleCallback listener) {
+ if (listener == null) {
+ throw new IllegalArgumentException("Listener is null");
+ }
+
+ BleStateChangeClient client = findBleStateClientLocked(listener);
+ if (client == null) {
+ Log.e(TAG, "unregisterBleCallback(): listener was not previously "
+ + "registered");
+ return;
+ }
+ listener.asBinder().unlinkToDeath(client, 0);
+ mBleStateChangeClients.remove(client);
+ }
+
+ /**
+ * Class that holds onto client related information - listener interface, process that hosts the
+ * binder object etc.
+ * <p>
+ * It also registers for death notifications of the host.
+ */
+ private class EnrollmentStateClient implements IBinder.DeathRecipient {
+ private final IBinder mListenerBinder;
+ private final ICarTrustAgentEnrollmentCallback mListener;
+
+ EnrollmentStateClient(ICarTrustAgentEnrollmentCallback listener) {
+ mListener = listener;
+ mListenerBinder = listener.asBinder();
+ }
+
+ @Override
+ public void binderDied() {
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "Binder died " + mListenerBinder);
+ }
+ mListenerBinder.unlinkToDeath(this, 0);
+ synchronized (CarTrustAgentEnrollmentService.this) {
+ mEnrollmentStateClients.remove(this);
+ }
+ }
+
+ /**
+ * Returns if the given binder object matches to what this client info holds.
+ * Used to check if the listener asking to be registered is already registered.
+ *
+ * @return true if matches, false if not
+ */
+ public boolean isHoldingBinder(IBinder binder) {
+ return mListenerBinder == binder;
+ }
+ }
+
+ private class BleStateChangeClient implements IBinder.DeathRecipient {
+ private final IBinder mListenerBinder;
+ private final ICarTrustAgentBleCallback mListener;
+
+ BleStateChangeClient(ICarTrustAgentBleCallback listener) {
+ mListener = listener;
+ mListenerBinder = listener.asBinder();
+ }
+
+ @Override
+ public void binderDied() {
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "Binder died " + mListenerBinder);
+ }
+ mListenerBinder.unlinkToDeath(this, 0);
+ synchronized (CarTrustAgentEnrollmentService.this) {
+ mBleStateChangeClients.remove(this);
+ }
+ }
+
+ /**
+ * Returns if the given binder object matches to what this client info holds.
+ * Used to check if the listener asking to be registered is already registered.
+ *
+ * @return true if matches, false if not
+ */
+ public boolean isHoldingBinder(IBinder binder) {
+ return mListenerBinder == binder;
+ }
+
+ }
+
+ @Override
+ public void dump(PrintWriter writer) {
+ }
+}
diff --git a/service/src/com/android/car/user/CarUserService.java b/service/src/com/android/car/user/CarUserService.java
index 82e981f..72e313f 100644
--- a/service/src/com/android/car/user/CarUserService.java
+++ b/service/src/com/android/car/user/CarUserService.java
@@ -17,19 +17,19 @@
package com.android.car.user;
import android.annotation.Nullable;
-import android.car.user.CarUserManagerHelper;
+import android.car.settings.CarSettings;
+import android.car.userlib.CarUserManagerHelper;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
-import android.content.pm.UserInfo;
import android.location.LocationManager;
import android.os.UserHandle;
import android.os.UserManager;
+import android.provider.Settings;
import android.util.Log;
import com.android.car.CarServiceBase;
-import com.android.internal.annotations.VisibleForTesting;
import java.io.PrintWriter;
@@ -42,9 +42,6 @@
* <ol/>
*/
public class CarUserService extends BroadcastReceiver implements CarServiceBase {
- // Place holder for user name of the first user created.
- @VisibleForTesting
- static final String OWNER_NAME = "Driver";
private static final String TAG = "CarUserService";
private final Context mContext;
private final CarUserManagerHelper mCarUserManagerHelper;
@@ -91,24 +88,22 @@
}
if (Intent.ACTION_LOCKED_BOOT_COMPLETED.equals(intent.getAction())) {
- if (mCarUserManagerHelper.getAllUsers().size() == 0) {
+ // We want to set restrictions on system and guest users only once. These are persisted
+ // onto disk, so it's sufficient to do it once + we minimize the number of disk writes.
+ if (Settings.Global.getInt(mContext.getContentResolver(),
+ CarSettings.Global.DEFAULT_USER_RESTRICTIONS_SET, /* default= */ 0) == 0) {
setSystemUserRestrictions();
mCarUserManagerHelper.initDefaultGuestRestrictions();
- // On very first boot, create an admin user and switch to that user.
- UserInfo admin = mCarUserManagerHelper.createNewAdminUser(OWNER_NAME);
- mCarUserManagerHelper.switchToUser(admin);
- mCarUserManagerHelper.setLastActiveUser(
- admin.id, /* skipGlobalSettings= */ false);
- } else {
- mCarUserManagerHelper.switchToUserId(mCarUserManagerHelper.getInitialUser());
+ Settings.Global.putInt(mContext.getContentResolver(),
+ CarSettings.Global.DEFAULT_USER_RESTRICTIONS_SET, 1);
}
+
} else if (Intent.ACTION_USER_SWITCHED.equals(intent.getAction())) {
// Update last active user if the switched-to user is a persistent, non-system user.
int currentUser = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1);
if (currentUser > UserHandle.USER_SYSTEM
&& mCarUserManagerHelper.isPersistentUser(currentUser)) {
- mCarUserManagerHelper.setLastActiveUser(
- currentUser, /* skipGlobalSetting= */ false);
+ mCarUserManagerHelper.setLastActiveUser(currentUser);
}
}
}
diff --git a/tests/CarDiagnosticVerifier/Android.mk b/tests/CarDiagnosticVerifier/Android.mk
deleted file mode 100644
index e66c7a1..0000000
--- a/tests/CarDiagnosticVerifier/Android.mk
+++ /dev/null
@@ -1,51 +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_MODULE_TAGS := optional
-
-# Only compile source java files in this apk.
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-
-LOCAL_PACKAGE_NAME := CarDiagnosticVerifier
-LOCAL_PRIVATE_PLATFORM_APIS := true
-
-LOCAL_JAVA_VERSION := 1.8
-
-LOCAL_PROGUARD_ENABLED := disabled
-
-LOCAL_DEX_PREOPT := false
-
-LOCAL_USE_AAPT2 := true
-
-LOCAL_PRIVILEGED_MODULE := true
-
-LOCAL_STATIC_JAVA_LIBRARIES += vehicle-hal-support-lib
-
-LOCAL_STATIC_ANDROID_LIBRARIES := \
- androidx.legacy_legacy-support-v4 \
- androidx.recyclerview_recyclerview
-
-LOCAL_JAVA_LIBRARIES += android.car
-
-include $(BUILD_PACKAGE)
-
-# Use the following include to make our test apk.
-include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tests/CarDiagnosticVerifier/AndroidManifest.xml b/tests/CarDiagnosticVerifier/AndroidManifest.xml
deleted file mode 100644
index 6fa5d3c..0000000
--- a/tests/CarDiagnosticVerifier/AndroidManifest.xml
+++ /dev/null
@@ -1,32 +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="com.google.android.car.diagnosticverifier">
-
- <uses-permission android:name="android.car.permission.CAR_DIAGNOSTICS" />
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
-
- <application android:label="Car Diagnostic Verification">
- <uses-library android:name="android.test.runner" />
-
- <activity android:name=".MainActivity">
- <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/CarDiagnosticVerifier/res/layout/result_message_item.xml b/tests/CarDiagnosticVerifier/res/layout/result_message_item.xml
deleted file mode 100644
index 5c742b6..0000000
--- a/tests/CarDiagnosticVerifier/res/layout/result_message_item.xml
+++ /dev/null
@@ -1,27 +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.
--->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="wrap_content">
-
- <TextView
- android:id="@+id/result_message"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:padding="16dp"/>
-
-</LinearLayout>
\ No newline at end of file
diff --git a/tests/CarDiagnosticVerifier/res/layout/verifier_activity.xml b/tests/CarDiagnosticVerifier/res/layout/verifier_activity.xml
deleted file mode 100644
index 5aa2a6b..0000000
--- a/tests/CarDiagnosticVerifier/res/layout/verifier_activity.xml
+++ /dev/null
@@ -1,34 +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.
--->
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:paddingLeft="16dp"
- android:paddingRight="16dp" >
-
- <TextView
- android:id="@+id/status_bar"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content" />
-
- <androidx.recyclerview.widget.RecyclerView
- android:id="@+id/verification_results"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_below="@id/status_bar"
- android:layout_marginTop="16dp" />
-
-</RelativeLayout>
diff --git a/tests/CarDiagnosticVerifier/res/values/strings.xml b/tests/CarDiagnosticVerifier/res/values/strings.xml
deleted file mode 100644
index ca6b33a..0000000
--- a/tests/CarDiagnosticVerifier/res/values/strings.xml
+++ /dev/null
@@ -1,20 +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.
--->
-<resources>
- <string name="status_receiving">Receiving car diagnostic events...</string>
- <string name="status_verifying">Verifying car diagnostic events...</string>
- <string name="status_done">Done with verification</string>
-</resources>
diff --git a/tests/CarDiagnosticVerifier/src/com/google/android/car/diagnosticverifier/DiagnosticJsonConverter.java b/tests/CarDiagnosticVerifier/src/com/google/android/car/diagnosticverifier/DiagnosticJsonConverter.java
deleted file mode 100644
index 85d4fc8..0000000
--- a/tests/CarDiagnosticVerifier/src/com/google/android/car/diagnosticverifier/DiagnosticJsonConverter.java
+++ /dev/null
@@ -1,85 +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.google.android.car.diagnosticverifier;
-
-import android.car.diagnostic.CarDiagnosticEvent;
-import android.util.JsonReader;
-
-import com.android.car.vehiclehal.DiagnosticJson;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * This class provides method to convert JSON into car diagnostic event object.
- */
-public class DiagnosticJsonConverter {
-
- public static List<CarDiagnosticEvent> readFromJson(InputStream in) throws IOException {
- JsonReader reader = new JsonReader(new InputStreamReader(in, "UTF-8"));
-
- try {
- return readEventsArray(reader);
- } finally {
- reader.close();
- }
- }
-
- private static List<CarDiagnosticEvent> readEventsArray(JsonReader reader) throws IOException {
- List<CarDiagnosticEvent> events = new ArrayList<>();
-
- reader.beginArray();
- while (reader.hasNext()) {
- events.add(readEventAndCanonicalize(reader));
- }
- reader.endArray();
- return events;
- }
-
- public static CarDiagnosticEvent readEventAndCanonicalize(InputStream in) throws IOException {
- JsonReader reader = new JsonReader(new InputStreamReader(in, "UTF-8"));
- return readEventAndCanonicalize(reader);
- }
-
- /**
- * This method convert JSON to a car diagnostic event object.
- * Note: it will always set timestamp to 0 and set dtc to null if it is empty string.
- */
- private static CarDiagnosticEvent readEventAndCanonicalize(JsonReader reader)
- throws IOException {
- DiagnosticJson diagnosticJson = DiagnosticJson.build(reader);
- //Build event
- CarDiagnosticEvent.Builder builder = "freeze".equals(diagnosticJson.type) ?
- CarDiagnosticEvent.Builder.newFreezeFrameBuilder() :
- CarDiagnosticEvent.Builder.newLiveFrameBuilder();
- //Always skip timestamp because it is not useful for test
- builder.atTimestamp(0);
- for (int i = 0; i < diagnosticJson.intValues.size(); i++) {
- builder.withIntValue(diagnosticJson.intValues.keyAt(i),
- diagnosticJson.intValues.valueAt(i));
- }
- for (int i = 0; i < diagnosticJson.floatValues.size(); i++) {
- builder.withFloatValue(diagnosticJson.floatValues.keyAt(i),
- diagnosticJson.floatValues.valueAt(i));
- }
- //Always set dtc to null if it is empty string
- builder.withDtc("".equals(diagnosticJson.dtc) ? null : diagnosticJson.dtc);
-
- return builder.build();
- }
-}
diff --git a/tests/CarDiagnosticVerifier/src/com/google/android/car/diagnosticverifier/DiagnosticVerifier.java b/tests/CarDiagnosticVerifier/src/com/google/android/car/diagnosticverifier/DiagnosticVerifier.java
deleted file mode 100644
index 1b6e447..0000000
--- a/tests/CarDiagnosticVerifier/src/com/google/android/car/diagnosticverifier/DiagnosticVerifier.java
+++ /dev/null
@@ -1,244 +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.google.android.car.diagnosticverifier;
-
-import android.car.diagnostic.CarDiagnosticEvent;
-import android.util.JsonWriter;
-import android.util.Log;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * DiagVerifier implements verification logic for car diagnostic events.
- *
- * The main idea for the verification is similar to a "diff" command on two files, whereas here
- * is a diff on two event lists. The available diff operations are: "add", "delete", "modify"
- *
- * For example, think about doing a diff on two sequences:
- *
- * Truth: A B C D E
- * Received: A C D E F
- *
- * The goal is to find the minimal number of diff operations applied on Truth list in order to
- * become Received list. It is the same problem to find edit distance between two sequences and keep
- * track of the corresponding edit operations. This verifier applies dynamic programming algorithm
- * to find the minimal set of diff operations. And the result would be:
- *
- * Truth: A - C D E +
- * Received: A C D E F
- *
- * It means in order to become Received list, "B" will be missing and an extra "F" will be added
- * at the end of list.
- */
-public class DiagnosticVerifier {
-
- private static final String TAG = "DiagnosticVerifier";
- /**
- * Below are 4 diff operations when comparing two event lists
- */
- private static final int DELETE = 0;
- private static final int ADD = 1;
- private static final int MODIFY = 2;
- private static final int KEEP = 3;
-
- /**
- * A list of truth diagnostic events for comparison.
- */
- private final List<CarDiagnosticEvent> mTruthEventList = new ArrayList<>();
- /**
- * A list of received diagnostic events from car service.
- */
- private final List<CarDiagnosticEvent> mReceivedEventList = new ArrayList<>();
-
- /**
- * Definition of the verification result
- */
- static class VerificationResult {
- public final String testCase;
- public final boolean success;
- public final String errorMessage;
-
- private VerificationResult(String testCase, boolean success, String errorMessage) {
- this.testCase = testCase;
- this.success = success;
- this.errorMessage = errorMessage;
- }
-
- public static VerificationResult fromMessage(String testCase, String message) {
- return new VerificationResult(testCase, message.length() == 0, message);
- }
-
- public void writeToJson(JsonWriter jsonWriter) throws IOException {
- jsonWriter.beginObject();
-
- jsonWriter.name("testCase");
- jsonWriter.value(this.testCase);
-
- jsonWriter.name("success");
- jsonWriter.value(this.success);
-
- jsonWriter.name("errorMessage");
- jsonWriter.value(this.errorMessage);
-
- jsonWriter.endObject();
- }
- }
-
- public DiagnosticVerifier(List<CarDiagnosticEvent> truthEvents) {
- if (truthEvents != null) {
- for (CarDiagnosticEvent event : truthEvents) {
- CarDiagnosticEvent canonicalEvent = canonicalize(event);
- mTruthEventList.add(canonicalEvent);
- }
- }
- }
-
- public void receiveEvent(CarDiagnosticEvent event) {
- CarDiagnosticEvent newEvent = canonicalize(event);
- mReceivedEventList.add(newEvent);
- }
-
- public List<VerificationResult> verify() {
- List<Integer> diff = calculateDiffOperations();
- StringBuilder missingEventMsgBuilder = new StringBuilder();
- StringBuilder extraEventMsgBuilder = new StringBuilder();
- StringBuilder mismatchEventMsgBuilder = new StringBuilder();
- for (int i = 0, j = 0, k = diff.size() - 1; k >= 0; k--) {
- if (diff.get(k) == DELETE) {
- missingEventMsgBuilder.append(String.format(
- "Missing event at position %d: %s\n", i, mTruthEventList.get(i)));
- i++;
- } else if (diff.get(k) == ADD) {
- extraEventMsgBuilder.append(String.format(
- "Extra event at position %d: %s\n", i, mReceivedEventList.get(j)));
- j++;
- } else if (diff.get(k) == MODIFY) {
- mismatchEventMsgBuilder.append(String.format(
- "Mismatched event pair at position %d:\n" +
- "True event -- %s\nWrong event -- %s\n",
- i, mTruthEventList.get(i), mReceivedEventList.get(j)));
- i++;
- j++;
- } else {
- i++;
- j++;
- }
- }
- List<VerificationResult> results = new ArrayList<>();
- results.add(VerificationResult.fromMessage(
- "test_mismatched_event", mismatchEventMsgBuilder.toString()));
- results.add(VerificationResult.fromMessage(
- "test_missing_event", missingEventMsgBuilder.toString()));
- results.add(VerificationResult.fromMessage(
- "test_extra_event", extraEventMsgBuilder.toString()));
- return results;
- }
-
- /**
- * The function applies a dynamic programming algorithm to find the minimal set of diff
- * operations that applied on truth event list in order to become received event list
- */
- private List<Integer> calculateDiffOperations() {
- final int n = mTruthEventList.size();
- final int m = mReceivedEventList.size();
-
- int[][] diffTable = new int[n + 1][m + 1];
- int[][] costTable = new int[n + 1][m + 1];
-
- for (int i = 1; i <= n; i++) {
- costTable[i][0] = i;
- diffTable[i][0] = DELETE;
- }
-
- for (int i = 1; i <= m; i++) {
- costTable[0][i] = i;
- diffTable[0][i] = ADD;
- }
-
- for (int i = 1; i <= n; i++) {
- for (int j = 1; j <= m; j++) {
- int deleteCost = costTable[i - 1][j] + 1;
- int addCost = costTable[i][j - 1] + 1;
- int modifyCost = costTable[i - 1][j - 1];
-
- CarDiagnosticEvent trueEvent = mTruthEventList.get(i - 1);
- CarDiagnosticEvent receivedEvent = mReceivedEventList.get(j - 1);
-
- //TODO: Use a more meaningful comparison. Instead of strict object level equality,
- //can check logical equality and allow an acceptable difference.
- boolean isEqual = trueEvent.equals(receivedEvent);
- modifyCost += isEqual ? 0 : 1;
-
- int minCost = modifyCost;
- int move = isEqual ? KEEP : MODIFY;
- if (minCost > addCost) {
- minCost = addCost;
- move = ADD;
- }
- if (minCost > deleteCost) {
- minCost = deleteCost;
- move = DELETE;
- }
-
- costTable[i][j] = minCost;
- diffTable[i][j] = move;
- }
- }
- List<Integer> diff = new ArrayList<>();
-
- for (int i = n, j = m; i > 0 || j > 0; ) {
- diff.add(diffTable[i][j]);
- if (diffTable[i][j] == DELETE) {
- i--;
- } else if (diffTable[i][j] == ADD) {
- j--;
- } else {
- i--;
- j--;
- }
- }
- return diff;
- }
-
- /**
- * The function will canonicalize a given event by using JSON converter which will reset event
- * timestamp to 0 and set DTC field with empty string to null. Doing JSON conversion is because
- * CarDiagnosticEvent does not provide direct accessor for intValues and floatValues.
- */
- private CarDiagnosticEvent canonicalize(CarDiagnosticEvent event) {
- ByteArrayOutputStream out = new ByteArrayOutputStream();
- JsonWriter writer = new JsonWriter(new OutputStreamWriter(out));
- CarDiagnosticEvent newEvent = event;
- try {
- event.writeToJson(writer);
- writer.flush();
- writer.close();
- byte[] rawJson = out.toByteArray();
- ByteArrayInputStream in = new ByteArrayInputStream(rawJson);
- newEvent = DiagnosticJsonConverter.readEventAndCanonicalize(in);
- in.close();
- out.close();
- } catch (IOException e) {
- Log.w(TAG, "Failed to clear timestamp ");
- }
- return newEvent;
- }
-}
diff --git a/tests/CarDiagnosticVerifier/src/com/google/android/car/diagnosticverifier/MainActivity.java b/tests/CarDiagnosticVerifier/src/com/google/android/car/diagnosticverifier/MainActivity.java
deleted file mode 100644
index 6814ad0..0000000
--- a/tests/CarDiagnosticVerifier/src/com/google/android/car/diagnosticverifier/MainActivity.java
+++ /dev/null
@@ -1,267 +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.google.android.car.diagnosticverifier;
-
-import android.app.Activity;
-import android.car.Car;
-import android.car.CarNotConnectedException;
-import android.car.diagnostic.CarDiagnosticEvent;
-import android.car.diagnostic.CarDiagnosticManager;
-import android.car.hardware.CarSensorManager;
-import android.content.BroadcastReceiver;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.ServiceConnection;
-import android.os.Bundle;
-import android.os.Environment;
-import android.os.IBinder;
-import android.util.JsonWriter;
-import android.util.Log;
-import android.widget.TextView;
-
-import androidx.recyclerview.widget.LinearLayoutManager;
-import androidx.recyclerview.widget.RecyclerView;
-
-import com.google.android.car.diagnosticverifier.DiagnosticVerifier.VerificationResult;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * The test app that does the verification of car diagnostic event data. It first reads the
- * truth (golden) event data from a JSON file upon starting. Then a broadcast intent such as:
- *
- * am broadcast -a com.google.android.car.diagnosticverifier.action.START_LISTEN
- *
- * will activate the car diagnostics listener. The test app will receive events from diagnostic API.
- * Once it receives all the events, a broadcast intent with "stop" action such as:
- *
- * am broadcast -a com.google.android.car.diagnosticverifier.action.STOP_LISTEN
- *
- * will deactivate the listener and start the verification process (see {@link DiagnosticVerifier}).
- *
- * Verification result will be output to a JSON file on device.
- */
-public class MainActivity extends Activity {
- public static final String TAG = "DiagnosticVerifier";
-
- public static final String ACTION_START_LISTEN =
- "com.google.android.car.diagnosticverifier.action.START_LISTEN";
- public static final String ACTION_STOP_LISTEN =
- "com.google.android.car.diagnosticverifier.action.STOP_LISTEN";
-
- private static final String DEFAULT_JSON_PATH = "/data/local/tmp/diag.json";
-
- private static final String JSON_PATH_KEY = "jsonPath";
- private static final String JSON_RESULT = "verification_result.json";
-
- private Car mCar;
- private CarDiagnosticManager mCarDiagnosticManager;
- private DiagnosticListener mDiagnosticListener;
- private BroadcastReceiver mBroadcastReceiver;
- private DiagnosticVerifier mVerifier;
- private TextView mStatusBar;
- private RecyclerView mRecyclerView;
- private VerificationResultAdapter mResultAdapter;
- private boolean mListening = false;
-
- private final ServiceConnection mCarConnectionListener =
- new ServiceConnection() {
- @Override
- public void onServiceConnected(ComponentName name, IBinder iBinder) {
- Log.d(TAG, "Connected to " + name.flattenToString());
- try {
- mCarDiagnosticManager =
- (CarDiagnosticManager) mCar.getCarManager(Car.DIAGNOSTIC_SERVICE);
- } catch (CarNotConnectedException e) {
- Log.e(TAG, "Failed to get a connection", e);
- }
- }
-
- @Override
- public void onServiceDisconnected(ComponentName name) {
- Log.d(TAG, "Disconnected from " + name.flattenToString());
-
- mCar = null;
- mCarDiagnosticManager = null;
- }
- };
-
- class DiagnosticListener implements CarDiagnosticManager.OnDiagnosticEventListener {
-
- @Override
- public void onDiagnosticEvent(CarDiagnosticEvent carDiagnosticEvent) {
- Log.v(TAG, "Received Car Diagnostic Event: " + carDiagnosticEvent.toString());
- mVerifier.receiveEvent(carDiagnosticEvent);
- }
- }
-
- class VerifierMsgReceiver extends BroadcastReceiver {
-
- @Override
- public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
- Log.d(TAG, "Received intent with action: " + action);
- if (ACTION_START_LISTEN.equals(action)) {
- try {
- startListen();
- } catch (CarNotConnectedException e) {
- Log.e(TAG, "Failed to listen for car diagnostic event", e);
- }
- } else if (ACTION_STOP_LISTEN.equals(action)) {
- stopListen();
- verify();
- }
- }
- }
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.verifier_activity);
-
- mStatusBar = (TextView) findViewById(R.id.status_bar);
-
- //Setting up RecyclerView to show verification result messages
- mRecyclerView = (RecyclerView) findViewById(R.id.verification_results);
- LinearLayoutManager layoutManager =
- new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
- mRecyclerView.setLayoutManager(layoutManager);
- mResultAdapter = new VerificationResultAdapter();
- mRecyclerView.setAdapter(mResultAdapter);
-
- //Connect to car service
- mCar = Car.createCar(this, mCarConnectionListener);
- mCar.connect();
-
- //Initialize broadcast intent receiver
- mBroadcastReceiver = new VerifierMsgReceiver();
- IntentFilter filter = new IntentFilter(ACTION_START_LISTEN);
- filter.addAction(ACTION_STOP_LISTEN);
- this.registerReceiver(mBroadcastReceiver, filter);
-
- //Read golden diagnostics JSON file
- String jsonPath = this.getIntent().getStringExtra(JSON_PATH_KEY);
- if (jsonPath == null || jsonPath.isEmpty()) {
- jsonPath = DEFAULT_JSON_PATH;
- }
- List<CarDiagnosticEvent> events;
- try {
- events = DiagnosticJsonConverter.readFromJson(new FileInputStream(jsonPath));
- } catch (IOException e) {
- throw new RuntimeException("Failed to read diagnostic JSON file", e);
- }
- Log.d(TAG, String.format("Read %d events from JSON file %s.", events.size(), jsonPath));
-
- mVerifier = new DiagnosticVerifier(events);
- }
-
- @Override
- protected void onDestroy() {
- if (mCar != null) {
- mCar.disconnect();
- }
- mVerifier = null;
- this.unregisterReceiver(mBroadcastReceiver);
- }
-
- private void startListen() throws CarNotConnectedException {
- if (mListening) {
- return;
- }
- if (mDiagnosticListener == null) {
- mDiagnosticListener = new DiagnosticListener();
- }
- Log.i(TAG, "Start listening for car diagnostics events");
- mCarDiagnosticManager.registerListener(
- mDiagnosticListener,
- CarDiagnosticManager.FRAME_TYPE_LIVE,
- CarSensorManager.SENSOR_RATE_NORMAL);
- mCarDiagnosticManager.registerListener(
- mDiagnosticListener,
- CarDiagnosticManager.FRAME_TYPE_FREEZE,
- CarSensorManager.SENSOR_RATE_NORMAL);
-
- mListening = true;
- mStatusBar.setText(R.string.status_receiving);
- }
-
- private void stopListen() {
- Log.i(TAG, "Stop listening for car diagnostics events");
- mCarDiagnosticManager.unregisterListener(mDiagnosticListener);
- mListening = false;
- }
-
- private boolean isExternalStorageWritable() {
- String state = Environment.getExternalStorageState();
- return Environment.MEDIA_MOUNTED.equals(state);
- }
-
- private File getResultJsonFile() throws IOException {
- if (!isExternalStorageWritable()) {
- throw new IOException("External storage is not writable. Cannot save content");
- }
-
- File resultJson = new File(Environment.getExternalStoragePublicDirectory(
- Environment.DIRECTORY_DOCUMENTS), JSON_RESULT);
- if (!resultJson.getParentFile().mkdirs()) {
- Log.w(TAG, "Parent directory may already exist");
- }
- return resultJson;
- }
-
- private void verify() {
- Log.d(TAG, "Start verifying car diagnostics events");
- mStatusBar.setText(R.string.status_verifying);
- List<VerificationResult> results = mVerifier.verify();
- mStatusBar.setText(R.string.status_done);
-
- if (results.isEmpty()) {
- Log.d(TAG, "Verification result is empty.");
- return;
- }
-
- List<String> resultMessages = new ArrayList<>();
- try {
- File resultJson = getResultJsonFile();
- JsonWriter writer = new JsonWriter(
- new OutputStreamWriter(new FileOutputStream(resultJson)));
-
- writer.beginArray();
- for (VerificationResult result : results) {
- resultMessages.add("Test case: " + result.testCase);
- resultMessages.add("Result: " + result.success);
- resultMessages.add(result.errorMessage);
- result.writeToJson(writer);
- }
- writer.endArray();
- writer.flush();
- writer.close();
- Log.i(TAG, "Verification result: " + resultJson.getAbsolutePath());
- } catch (IOException e) {
- Log.e(TAG, "Failed to save verification result.", e);
- }
- mResultAdapter.setResultMessages(resultMessages);
- }
-}
-
diff --git a/tests/CarDiagnosticVerifier/src/com/google/android/car/diagnosticverifier/VerificationResultAdapter.java b/tests/CarDiagnosticVerifier/src/com/google/android/car/diagnosticverifier/VerificationResultAdapter.java
deleted file mode 100644
index 36e584d..0000000
--- a/tests/CarDiagnosticVerifier/src/com/google/android/car/diagnosticverifier/VerificationResultAdapter.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.google.android.car.diagnosticverifier;
-
-import android.content.Context;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.TextView;
-
-import androidx.recyclerview.widget.RecyclerView;
-
-import java.util.List;
-
-/**
- * A recycler view adapter for verification result messages
- */
-public class VerificationResultAdapter extends
- RecyclerView.Adapter<VerificationResultAdapter.VerificationResultViewHolder> {
-
- private List<String> mResultMessages;
-
- @Override
- public VerificationResultViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
- Context context = viewGroup.getContext();
- int messageItemLayoutId = R.layout.result_message_item;
- LayoutInflater inflater = LayoutInflater.from(context);
- boolean shouldAttachToParentImmediately = false;
-
- View view = inflater.inflate(
- messageItemLayoutId, viewGroup, shouldAttachToParentImmediately);
- return new VerificationResultViewHolder(view);
- }
-
- @Override
- public void onBindViewHolder(VerificationResultViewHolder verificationResultViewHolder, int i) {
- String resultMessage = mResultMessages.get(i);
- verificationResultViewHolder.mResultMessageTextView.setText(resultMessage);
- }
-
- @Override
- public int getItemCount() {
- if (mResultMessages == null) {
- return 0;
- }
- return mResultMessages.size();
- }
-
- public void setResultMessages(List<String> resultMessages) {
- mResultMessages = resultMessages;
- notifyDataSetChanged();
- }
-
- public class VerificationResultViewHolder extends RecyclerView.ViewHolder {
- public final TextView mResultMessageTextView;
-
- public VerificationResultViewHolder(View view) {
- super(view);
- mResultMessageTextView = (TextView) view.findViewById(R.id.result_message);
- }
- }
-}
diff --git a/tests/CarTrustAgentClientApp/Android.mk b/tests/CarTrustAgentClientApp/Android.mk
index 7945ee5..3504ff7 100644
--- a/tests/CarTrustAgentClientApp/Android.mk
+++ b/tests/CarTrustAgentClientApp/Android.mk
@@ -4,12 +4,22 @@
LOCAL_PACKAGE_NAME := CarTrustAgentClient
LOCAL_USE_AAPT2 := true
+LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
+
LOCAL_SRC_FILES := $(call all-java-files-under, src)
-LOCAL_STATIC_ANDROID_LIBRARIES := androidx.legacy_legacy-support-v4
+
+LOCAL_STATIC_ANDROID_LIBRARIES := \
+ androidx.appcompat_appcompat \
+ androidx-constraintlayout_constraintlayout \
+ androidx.legacy_legacy-support-v4
LOCAL_CERTIFICATE := platform
LOCAL_MODULE_TAGS := optional
LOCAL_MIN_SDK_VERSION := 23
LOCAL_SDK_VERSION := current
+LOCAL_PROGUARD_ENABLED := disabled
+
+LOCAL_DEX_PREOPT := false
+
include $(BUILD_PACKAGE)
diff --git a/tests/CarTrustAgentClientApp/AndroidManifest.xml b/tests/CarTrustAgentClientApp/AndroidManifest.xml
index 35a9a6d..e76485f 100644
--- a/tests/CarTrustAgentClientApp/AndroidManifest.xml
+++ b/tests/CarTrustAgentClientApp/AndroidManifest.xml
@@ -1,4 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.car.trust.client">
@@ -19,11 +34,15 @@
<uses-permission android:name="android.permission.PROVIDE_TRUST_AGENT" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
- <application android:label="@string/app_name">
+ <application
+ android:label="@string/app_name"
+ android:theme="@style/Theme.AppCompat">
+
<activity
android:name=".PhoneEnrolmentActivity"
android:label="@string/app_name"
android:exported="true"
+ android:screenOrientation="portrait"
android:launchMode="singleInstance">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
diff --git a/tests/CarTrustAgentClientApp/res/layout/phone_enrolment_activity.xml b/tests/CarTrustAgentClientApp/res/layout/phone_enrolment_activity.xml
index 620e04e..7237dfa 100644
--- a/tests/CarTrustAgentClientApp/res/layout/phone_enrolment_activity.xml
+++ b/tests/CarTrustAgentClientApp/res/layout/phone_enrolment_activity.xml
@@ -1,5 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
diff --git a/tests/CarTrustAgentClientApp/res/values/strings.xml b/tests/CarTrustAgentClientApp/res/values/strings.xml
index 5c9b4db..6e33a81 100644
--- a/tests/CarTrustAgentClientApp/res/values/strings.xml
+++ b/tests/CarTrustAgentClientApp/res/values/strings.xml
@@ -1,22 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
<resources>
- <string name="app_name">CarTrustAgentClient</string>
+ <string name="app_name" translatable="false">CarTrustAgentClient</string>
<!-- service/characteristics uuid for unlocking a device -->
- <string name="unlock_service_uuid">5e2a68a1-27be-43f9-8d1e-4546976fabd7</string>
- <string name="unlock_escrow_token_uiid">5e2a68a2-27be-43f9-8d1e-4546976fabd7</string>
- <string name="unlock_handle_uiid">5e2a68a3-27be-43f9-8d1e-4546976fabd7</string>
+ <string name="unlock_service_uuid" translatable="false">5e2a68a1-27be-43f9-8d1e-4546976fabd7</string>
+ <string name="unlock_escrow_token_uiid" translatable="false">5e2a68a2-27be-43f9-8d1e-4546976fabd7</string>
+ <string name="unlock_handle_uiid" translatable="false">5e2a68a3-27be-43f9-8d1e-4546976fabd7</string>
<!-- service/characteristics uuid for adding new escrow token -->
- <string name="enrollment_service_uuid">5e2a68a4-27be-43f9-8d1e-4546976fabd7</string>
- <string name="enrollment_handle_uuid">5e2a68a5-27be-43f9-8d1e-4546976fabd7</string>
- <string name="enrollment_token_uuid">5e2a68a6-27be-43f9-8d1e-4546976fabd7</string>
+ <string name="enrollment_service_uuid" translatable="false">5e2a68a4-27be-43f9-8d1e-4546976fabd7</string>
+ <string name="enrollment_handle_uuid" translatable="false">5e2a68a5-27be-43f9-8d1e-4546976fabd7</string>
+ <string name="enrollment_token_uuid" translatable="false">5e2a68a6-27be-43f9-8d1e-4546976fabd7</string>
- <string name="pref_key_token_handle">token-handle-key</string>
- <string name="pref_key_escrow_token">escrow-token-key</string>
+ <string name="pref_key_token_handle" translatable="false">token-handle-key</string>
+ <string name="pref_key_escrow_token" translatable="false">escrow-token-key</string>
- <string name="enroll_button">Enroll new token</string>
- <string name="enroll_scan">Scan to enroll</string>
- <string name="unlock_button">Unlock</string>
- <string name="unlock_scan">Scan to unlock</string>
+ <string name="enroll_button" translatable="false">Enroll new token</string>
+ <string name="enroll_scan" translatable="false">Scan to enroll</string>
+ <string name="unlock_button" translatable="false">Unlock</string>
+ <string name="unlock_scan" translatable="false">Scan to unlock</string>
</resources>
diff --git a/tests/CarTrustAgentClientApp/src/com/android/car/trust/client/BluetoothUtils.java b/tests/CarTrustAgentClientApp/src/com/android/car/trust/client/BluetoothUtils.java
new file mode 100644
index 0000000..77ed7bb
--- /dev/null
+++ b/tests/CarTrustAgentClientApp/src/com/android/car/trust/client/BluetoothUtils.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.trust.client;
+
+import android.bluetooth.BluetoothGattCharacteristic;
+import android.bluetooth.BluetoothGattService;
+import android.content.Context;
+
+import androidx.annotation.Nullable;
+import androidx.annotation.StringRes;
+
+import java.util.UUID;
+
+/**
+ * A utility class holding methods related to Bluetooth.
+ */
+public class BluetoothUtils {
+ private BluetoothUtils() {}
+
+ /**
+ * Returns a characteristic off the given {@link BluetoothGattService} mapped to the jUUID
+ * specified. If the given service has multiple characteristics of the same UUID, then the
+ * first instance is returned.
+ *
+ * @param uuidRes The unique identifier for the characteristic.
+ * @param service The {@link BluetoothGattService} that contains the characteristic.
+ * @param context The current {@link Context}.
+ * @return A {@link BluetoothGattCharacteristic} with a UUID matching {@code uuidRes} or
+ * {@code null} if none exists.
+ *
+ * @see BluetoothGattService#getCharacteristic(UUID)
+ */
+ @Nullable
+ public static BluetoothGattCharacteristic getCharacteristic(@StringRes int uuidRes,
+ BluetoothGattService service, Context context) {
+ return service.getCharacteristic(UUID.fromString(context.getString(uuidRes)));
+ }
+}
diff --git a/tests/CarTrustAgentClientApp/src/com/android/car/trust/client/PhoneEnrolmentActivity.java b/tests/CarTrustAgentClientApp/src/com/android/car/trust/client/PhoneEnrolmentActivity.java
index c1d30c1..fd29624 100644
--- a/tests/CarTrustAgentClientApp/src/com/android/car/trust/client/PhoneEnrolmentActivity.java
+++ b/tests/CarTrustAgentClientApp/src/com/android/car/trust/client/PhoneEnrolmentActivity.java
@@ -16,10 +16,11 @@
package com.android.car.trust.client;
import android.Manifest;
-import android.app.Activity;
import android.content.pm.PackageManager;
import android.os.Bundle;
+import androidx.fragment.app.FragmentActivity;
+
/**
* Activity to allow the user to add an escrow token to a remote device. <p/>
*
@@ -29,7 +30,7 @@
* The config must set config_allowEscrowTokenForTrustAgent to true. For the desired car
* experience, the config should also set config_strongAuthRequiredOnBoot to false.
*/
-public class PhoneEnrolmentActivity extends Activity {
+public class PhoneEnrolmentActivity extends FragmentActivity {
private static final int FINE_LOCATION_REQUEST_CODE = 42;
diff --git a/tests/CarTrustAgentClientApp/src/com/android/car/trust/client/PhoneEnrolmentController.java b/tests/CarTrustAgentClientApp/src/com/android/car/trust/client/PhoneEnrolmentController.java
index 030e3d2..1d3f672 100644
--- a/tests/CarTrustAgentClientApp/src/com/android/car/trust/client/PhoneEnrolmentController.java
+++ b/tests/CarTrustAgentClientApp/src/com/android/car/trust/client/PhoneEnrolmentController.java
@@ -38,74 +38,22 @@
* It also binds the UI components to control the enrollment process.
*/
public class PhoneEnrolmentController {
+ private static final String TAG = "PhoneEnrollmentCltr";
- private final SimpleBleClient.ClientCallback mCallback = new SimpleBleClient.ClientCallback() {
- @Override
- public void onDeviceConnected(BluetoothDevice device) {
- appendOutputText("Device connected: " + device.getName()
- + " addr: " + device.getAddress());
- }
+ private final String mTokenHandleKey;
+ private final String mEscrowTokenKey;
- @Override
- public void onDeviceDisconnected() {
- appendOutputText("Device disconnected");
- }
+ private final ParcelUuid mEnrolmentServiceUuid;
- @Override
- public void onCharacteristicChanged(BluetoothGatt gatt,
- BluetoothGattCharacteristic characteristic) {
-
- Log.d(Utils.LOG_TAG, "onCharacteristicChanged: "
- + Utils.getLong(characteristic.getValue()));
- if (characteristic.getUuid().equals(mEnrolmentTokenHandle.getUuid())) {
- // Store the new token handle that the BLE server is sending us. This required
- // to unlock the device.
- long handle = Utils.getLong(characteristic.getValue());
- storeHandle(handle);
- appendOutputText("Token handle received: " + handle);
- }
- }
-
- @Override
- public void onServiceDiscovered(BluetoothGattService service) {
- if (!service.getUuid().equals(mEnrolmentServiceUuid.getUuid())) {
- Log.d(Utils.LOG_TAG, "Service UUID: " + service.getUuid()
- + " does not match Enrolment UUID " + mEnrolmentServiceUuid.getUuid());
- return;
- }
-
- Log.d(Utils.LOG_TAG, "Enrolment Service # characteristics: "
- + service.getCharacteristics().size());
- mEnrolmentEscrowToken = Utils.getCharacteristic(
- R.string.enrollment_token_uuid, service, mContext);
- mEnrolmentTokenHandle = Utils.getCharacteristic(
- R.string.enrollment_handle_uuid, service, mContext);
- mClient.setCharacteristicNotification(mEnrolmentTokenHandle, true /* enable */);
- appendOutputText("Enrolment BLE client successfully connected");
-
- mHandler.post(() -> {
- // Services are now set up, allow users to enrol new escrow tokens.
- mEnrolButton.setEnabled(true);
- mEnrolButton.setAlpha(1.0f);
- });
- }
- };
-
- private String mTokenHandleKey;
- private String mEscrowTokenKey;
+ private final SimpleBleClient mClient;
+ private final Context mContext;
+ private final Handler mHandler;
// BLE characteristics associated with the enrollment/add escrow token service.
private BluetoothGattCharacteristic mEnrolmentTokenHandle;
private BluetoothGattCharacteristic mEnrolmentEscrowToken;
- private ParcelUuid mEnrolmentServiceUuid;
-
- private SimpleBleClient mClient;
- private Context mContext;
-
private TextView mTextView;
- private Handler mHandler;
-
private Button mEnrolButton;
public PhoneEnrolmentController(Context context) {
@@ -133,11 +81,11 @@
mTextView = textView;
mEnrolButton = enrolButton;
- scanButton.setOnClickListener((view) -> mClient.start(mEnrolmentServiceUuid));
+ scanButton.setOnClickListener(v -> mClient.start(mEnrolmentServiceUuid));
mEnrolButton.setEnabled(false);
mEnrolButton.setAlpha(0.3f);
- mEnrolButton.setOnClickListener((view) -> {
+ mEnrolButton.setOnClickListener(v -> {
appendOutputText("Sending new escrow token to remote device");
byte[] token = generateEscrowToken();
@@ -180,4 +128,70 @@
private void appendOutputText(final String text) {
mHandler.post(() -> mTextView.append("\n" + text));
}
+
+ private final SimpleBleClient.ClientCallback mCallback = new SimpleBleClient.ClientCallback() {
+ @Override
+ public void onDeviceConnected(BluetoothDevice device) {
+ appendOutputText("Device connected: " + device.getName()
+ + " addr: " + device.getAddress());
+ }
+
+ @Override
+ public void onDeviceDisconnected() {
+ appendOutputText("Device disconnected");
+ }
+
+ @Override
+ public void onCharacteristicChanged(BluetoothGatt gatt,
+ BluetoothGattCharacteristic characteristic) {
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "onCharacteristicChanged: "
+ + convertToLong(characteristic.getValue()));
+ }
+
+ if (characteristic.getUuid().equals(mEnrolmentTokenHandle.getUuid())) {
+ // Store the new token handle that the BLE server is sending us. This required
+ // to unlock the device.
+ long handle = convertToLong(characteristic.getValue());
+ storeHandle(handle);
+ appendOutputText("Token handle received: " + handle);
+ }
+ }
+
+ @Override
+ public void onServiceDiscovered(BluetoothGattService service) {
+ if (!service.getUuid().equals(mEnrolmentServiceUuid.getUuid())) {
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "Service UUID: " + service.getUuid()
+ + " does not match Enrolment UUID " + mEnrolmentServiceUuid.getUuid());
+ }
+ return;
+ }
+
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "Enrolment Service # characteristics: "
+ + service.getCharacteristics().size());
+ }
+
+ mEnrolmentEscrowToken = BluetoothUtils.getCharacteristic(
+ R.string.enrollment_token_uuid, service, mContext);
+ mEnrolmentTokenHandle = BluetoothUtils.getCharacteristic(
+ R.string.enrollment_handle_uuid, service, mContext);
+ mClient.setCharacteristicNotification(mEnrolmentTokenHandle, true /* enable */);
+ appendOutputText("Enrolment BLE client successfully connected");
+
+ mHandler.post(() -> {
+ // Services are now set up, allow users to enrol new escrow tokens.
+ mEnrolButton.setEnabled(true);
+ mEnrolButton.setAlpha(1.0f);
+ });
+ }
+
+ private long convertToLong(byte[] bytes) {
+ ByteBuffer buffer = ByteBuffer.allocate(Long.SIZE / Byte.SIZE);
+ buffer.put(bytes);
+ buffer.flip();
+ return buffer.getLong();
+ }
+ };
}
diff --git a/tests/CarTrustAgentClientApp/src/com/android/car/trust/client/PhoneUnlockController.java b/tests/CarTrustAgentClientApp/src/com/android/car/trust/client/PhoneUnlockController.java
index 78e50b4..1296529 100644
--- a/tests/CarTrustAgentClientApp/src/com/android/car/trust/client/PhoneUnlockController.java
+++ b/tests/CarTrustAgentClientApp/src/com/android/car/trust/client/PhoneUnlockController.java
@@ -29,70 +29,29 @@
import android.widget.Button;
import android.widget.TextView;
+import java.nio.ByteBuffer;
import java.util.UUID;
/**
* A controller that sets up a {@link SimpleBleClient} to connect to the BLE unlock service.
*/
public class PhoneUnlockController {
+ private static final String TAG = "PhoneUnlockController";
- private final SimpleBleClient.ClientCallback mCallback = new SimpleBleClient.ClientCallback() {
- @Override
- public void onDeviceConnected(BluetoothDevice device) {
- appendOutputText("Device connected: " + device.getName()
- + " addr: " + device.getAddress());
- }
-
- @Override
- public void onDeviceDisconnected() {
- appendOutputText("Device disconnected");
- }
-
- @Override
- public void onCharacteristicChanged(BluetoothGatt gatt,
- BluetoothGattCharacteristic characteristic) {
- // Not expecting any characteristics changes for the unlocking client.
- }
-
- @Override
- public void onServiceDiscovered(BluetoothGattService service) {
- if (!service.getUuid().equals(mUnlockServiceUuid.getUuid())) {
- Log.d(Utils.LOG_TAG, "Service UUID: " + service.getUuid()
- + " does not match Enrolment UUID " + mUnlockServiceUuid.getUuid());
- return;
- }
-
- Log.d(Utils.LOG_TAG, "Unlock Service # characteristics: "
- + service.getCharacteristics().size());
- mUnlockEscrowToken = Utils.getCharacteristic(
- R.string.unlock_escrow_token_uiid, service, mContext);
- mUnlockTokenHandle = Utils.getCharacteristic(
- R.string.unlock_handle_uiid, service, mContext);
- appendOutputText("Unlock BLE client successfully connected");
-
- mHandler.post(() -> {
- // Services are now set up, allow users to enrol new escrow tokens.
- mUnlockButton.setEnabled(true);
- mUnlockButton.setAlpha(1.0f);
- });
- }
- };
-
- private String mTokenHandleKey;
- private String mEscrowTokenKey;
+ private final String mTokenHandleKey;
+ private final String mEscrowTokenKey;
// BLE characteristics associated with the enrolment/add escrow token service.
private BluetoothGattCharacteristic mUnlockTokenHandle;
private BluetoothGattCharacteristic mUnlockEscrowToken;
- private ParcelUuid mUnlockServiceUuid;
+ private final ParcelUuid mUnlockServiceUuid;
- private SimpleBleClient mClient;
- private Context mContext;
+ private final SimpleBleClient mClient;
+ private final Context mContext;
+ private final Handler mHandler;
private TextView mTextView;
- private Handler mHandler;
-
private Button mUnlockButton;
public PhoneUnlockController(Context context) {
@@ -120,11 +79,11 @@
mTextView = textView;
mUnlockButton = enrolButton;
- scanButton.setOnClickListener((view) -> mClient.start(mUnlockServiceUuid));
+ scanButton.setOnClickListener(v -> mClient.start(mUnlockServiceUuid));
mUnlockButton.setEnabled(false);
mUnlockButton.setAlpha(0.3f);
- mUnlockButton.setOnClickListener((view) -> {
+ mUnlockButton.setOnClickListener(v -> {
appendOutputText("Sending unlock token and handle to remote device");
sendUnlockRequest();
});
@@ -137,13 +96,66 @@
byte[] token = Base64.decode(prefs.getString(mEscrowTokenKey, null), Base64.DEFAULT);
mUnlockEscrowToken.setValue(token);
- mUnlockTokenHandle.setValue(Utils.getBytes(handle));
+ mUnlockTokenHandle.setValue(convertToBytes(handle));
mClient.writeCharacteristic(mUnlockEscrowToken);
mClient.writeCharacteristic(mUnlockTokenHandle);
}
- private void appendOutputText(final String text) {
+ private void appendOutputText(String text) {
mHandler.post(() -> mTextView.append("\n" + text));
}
+
+ private static byte[] convertToBytes(long l) {
+ ByteBuffer buffer = ByteBuffer.allocate(Long.SIZE / Byte.SIZE);
+ buffer.putLong(0, l);
+ return buffer.array();
+ }
+
+ private final SimpleBleClient.ClientCallback mCallback = new SimpleBleClient.ClientCallback() {
+ @Override
+ public void onDeviceConnected(BluetoothDevice device) {
+ appendOutputText("Device connected: " + device.getName()
+ + " addr: " + device.getAddress());
+ }
+
+ @Override
+ public void onDeviceDisconnected() {
+ appendOutputText("Device disconnected");
+ }
+
+ @Override
+ public void onCharacteristicChanged(BluetoothGatt gatt,
+ BluetoothGattCharacteristic characteristic) {
+ // Not expecting any characteristics changes for the unlocking client.
+ }
+
+ @Override
+ public void onServiceDiscovered(BluetoothGattService service) {
+ if (!service.getUuid().equals(mUnlockServiceUuid.getUuid())) {
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "Service UUID: " + service.getUuid()
+ + " does not match Enrolment UUID " + mUnlockServiceUuid.getUuid());
+ }
+ return;
+ }
+
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "Unlock Service # characteristics: "
+ + service.getCharacteristics().size());
+ }
+
+ mUnlockEscrowToken = BluetoothUtils.getCharacteristic(
+ R.string.unlock_escrow_token_uiid, service, mContext);
+ mUnlockTokenHandle = BluetoothUtils.getCharacteristic(
+ R.string.unlock_handle_uiid, service, mContext);
+ appendOutputText("Unlock BLE client successfully connected");
+
+ mHandler.post(() -> {
+ // Services are now set up, allow users to enrol new escrow tokens.
+ mUnlockButton.setEnabled(true);
+ mUnlockButton.setAlpha(1.0f);
+ });
+ }
+ };
}
diff --git a/tests/CarTrustAgentClientApp/src/com/android/car/trust/client/SimpleBleClient.java b/tests/CarTrustAgentClientApp/src/com/android/car/trust/client/SimpleBleClient.java
index c0fecb3..3cce775 100644
--- a/tests/CarTrustAgentClientApp/src/com/android/car/trust/client/SimpleBleClient.java
+++ b/tests/CarTrustAgentClientApp/src/com/android/car/trust/client/SimpleBleClient.java
@@ -32,64 +32,22 @@
import android.os.ParcelUuid;
import android.util.Log;
-import androidx.annotation.NonNull;
+import androidx.annotation.IntDef;
+import androidx.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.TimeUnit;
/**
* A simple client that supports the scanning and connecting to available BLE devices. Should be
* used along with {@link SimpleBleServer}.
*/
public class SimpleBleClient {
- public interface ClientCallback {
- /**
- * Called when a device that has a matching service UUID is found.
- **/
- void onDeviceConnected(BluetoothDevice device);
-
- void onDeviceDisconnected();
-
- void onCharacteristicChanged(BluetoothGatt gatt,
- BluetoothGattCharacteristic characteristic);
-
- /**
- * Called for each {@link BluetoothGattService} that is discovered on the
- * {@link BluetoothDevice} after a matching scan result and connection.
- *
- * @param service {@link BluetoothGattService} that has been discovered.
- */
- void onServiceDiscovered(BluetoothGattService service);
- }
-
- /**
- * Wrapper class to allow queuing of BLE actions. The BLE stack allows only one action to be
- * executed at a time.
- */
- public static class BleAction {
- public static final int ACTION_WRITE = 0;
- public static final int ACTION_READ = 1;
-
- private int mAction;
- private BluetoothGattCharacteristic mCharacteristic;
-
- public BleAction(BluetoothGattCharacteristic characteristic, int action) {
- mAction = action;
- mCharacteristic = characteristic;
- }
-
- public int getAction() {
- return mAction;
- }
-
- public BluetoothGattCharacteristic getCharacteristic() {
- return mCharacteristic;
- }
- }
-
- private static final long SCAN_TIME_MS = 10000;
+ private static final String TAG = "SimpleBleClient";
+ private static final long SCAN_TIME_MS = TimeUnit.SECONDS.toMillis(10);
private final Queue<BleAction> mBleActionQueue = new ConcurrentLinkedQueue<BleAction>();
private final List<ClientCallback> mCallbacks = new ArrayList<>();
@@ -99,7 +57,7 @@
private BluetoothGatt mBtGatt;
private ParcelUuid mServiceUuid;
- public SimpleBleClient(@NonNull Context context) {
+ public SimpleBleClient(Context context) {
mContext = context;
BluetoothManager btManager = (BluetoothManager) mContext.getSystemService(
Context.BLUETOOTH_SERVICE);
@@ -126,15 +84,20 @@
ScanSettings.Builder settings = new ScanSettings.Builder();
settings.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY);
- Log.d(Utils.LOG_TAG, "Start scanning for uuid: " + mServiceUuid.getUuid());
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "Start scanning for uuid: " + mServiceUuid.getUuid());
+ }
+
mScanner.startScan(filters, settings.build(), mScanCallback);
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "Stopping Scanner");
+ }
mScanner.stopScan(mScanCallback);
- Log.d(Utils.LOG_TAG, "Stopping Scanner");
}
}, SCAN_TIME_MS);
}
@@ -207,14 +170,16 @@
executeAction(mBleActionQueue.peek());
}
- private void executeAction(BleAction action) {
+ private void executeAction(@Nullable BleAction action) {
if (action == null) {
return;
}
- Log.d(Utils.LOG_TAG, "Executing BLE Action type: " + action.getAction());
- int actionType = action.getAction();
- switch (actionType) {
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "Executing BLE Action type: " + action.getAction());
+ }
+
+ switch (action.getAction()) {
case BleAction.ACTION_WRITE:
mBtGatt.writeCharacteristic(action.getCharacteristic());
break;
@@ -222,6 +187,7 @@
mBtGatt.readCharacteristic(action.getCharacteristic());
break;
default:
+ Log.e(TAG, "Encountered unknown BlueAction: " + action.getAction());
}
}
@@ -254,19 +220,25 @@
@Override
public void onScanResult(int callbackType, ScanResult result) {
BluetoothDevice device = result.getDevice();
- Log.d(Utils.LOG_TAG, "Scan result found: " + result.getScanRecord().getServiceUuids());
+
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "Scan result found: " + result.getScanRecord().getServiceUuids());
+ }
if (!hasServiceUuid(result)) {
return;
}
for (ParcelUuid uuid : result.getScanRecord().getServiceUuids()) {
- Log.d(Utils.LOG_TAG, "Scan result UUID: " + uuid);
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "Scan result UUID: " + uuid);
+ }
+
if (uuid.equals(mServiceUuid)) {
// This client only supports connecting to one service.
// Once we find one, stop scanning and open a GATT connection to the device.
mScanner.stopScan(mScanCallback);
- mBtGatt = device.connectGatt(mContext, false /* autoConnect */, mGattCallback);
+ mBtGatt = device.connectGatt(mContext, /* autoConnect= */ false, mGattCallback);
return;
}
}
@@ -274,15 +246,17 @@
@Override
public void onBatchScanResults(List<ScanResult> results) {
- for (ScanResult r : results) {
- Log.d(Utils.LOG_TAG, "Batch scanResult: " + r.getDevice().getName()
- + " " + r.getDevice().getAddress());
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ for (ScanResult r : results) {
+ Log.d(TAG, "Batch scanResult: " + r.getDevice().getName()
+ + " " + r.getDevice().getAddress());
+ }
}
}
@Override
public void onScanFailed(int errorCode) {
- Log.e(Utils.LOG_TAG, "Scan failed: " + errorCode);
+ Log.e(TAG, "Scan failed: " + errorCode);
}
};
@@ -291,29 +265,37 @@
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
super.onConnectionStateChange(gatt, status, newState);
- String state = "";
-
- if (newState == BluetoothProfile.STATE_CONNECTED) {
- state = "Connected";
- mBtGatt.discoverServices();
- for (ClientCallback callback : mCallbacks) {
- callback.onDeviceConnected(gatt.getDevice());
- }
-
- } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
- state = "Disconnected";
- for (ClientCallback callback : mCallbacks) {
- callback.onDeviceDisconnected();
- }
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "Gatt connection status: " + getStatus(status)
+ + " newState: " + newState);
}
- Log.d(Utils.LOG_TAG, "Gatt connection status: " + getStatus(status)
- + " newState: " + state);
+
+ switch (newState) {
+ case BluetoothProfile.STATE_CONNECTED:
+ mBtGatt.discoverServices();
+ for (ClientCallback callback : mCallbacks) {
+ callback.onDeviceConnected(gatt.getDevice());
+ }
+ break;
+
+ case BluetoothProfile.STATE_DISCONNECTED:
+ for (ClientCallback callback : mCallbacks) {
+ callback.onDeviceDisconnected();
+ }
+ break;
+
+ default:
+ // Do nothing.
+ }
}
@Override
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
super.onServicesDiscovered(gatt, status);
- Log.d(Utils.LOG_TAG, "onServicesDiscovered: " + status);
+
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "onServicesDiscovered: " + status);
+ }
List<BluetoothGattService> services = gatt.getServices();
if (services == null || services.size() <= 0) {
@@ -322,7 +304,10 @@
// Notify clients of newly discovered services.
for (BluetoothGattService service : mBtGatt.getServices()) {
- Log.d(Utils.LOG_TAG, "Found service: " + service.getUuid() + " notifying clients");
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "Found service: " + service.getUuid() + " notifying clients");
+ }
+
for (ClientCallback callback : mCallbacks) {
callback.onServiceDiscovered(service);
}
@@ -332,14 +317,20 @@
@Override
public void onCharacteristicWrite(BluetoothGatt gatt,
BluetoothGattCharacteristic characteristic, int status) {
- Log.d(Utils.LOG_TAG, "onCharacteristicWrite: " + status);
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "onCharacteristicWrite: " + status);
+ }
+
processNextAction();
}
@Override
public void onCharacteristicRead(BluetoothGatt gatt,
BluetoothGattCharacteristic characteristic, int status) {
- Log.d(Utils.LOG_TAG, "onCharacteristicRead:" + new String(characteristic.getValue()));
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "onCharacteristicRead:" + new String(characteristic.getValue()));
+ }
+
processNextAction();
}
@@ -352,4 +343,63 @@
processNextAction();
}
};
+
+ /**
+ * Wrapper class to allow queuing of BLE actions. The BLE stack allows only one action to be
+ * executed at a time.
+ */
+ private static class BleAction {
+ public static final int ACTION_WRITE = 0;
+ public static final int ACTION_READ = 1;
+
+ @IntDef({ ACTION_WRITE, ACTION_READ })
+ public @interface ActionType {}
+
+ private final int mAction;
+ private final BluetoothGattCharacteristic mCharacteristic;
+
+ BleAction(BluetoothGattCharacteristic characteristic, @ActionType int action) {
+ mAction = action;
+ mCharacteristic = characteristic;
+ }
+
+ @ActionType
+ public int getAction() {
+ return mAction;
+ }
+
+ public BluetoothGattCharacteristic getCharacteristic() {
+ return mCharacteristic;
+ }
+ }
+
+ /**
+ * Callback for classes that wish to be notified of BLE updates.
+ */
+ public interface ClientCallback {
+ /**
+ * Called when a device that has a matching service UUID is found.
+ **/
+ void onDeviceConnected(BluetoothDevice device);
+
+ /** Called when the currently connected device has been disconnected. */
+ void onDeviceDisconnected();
+
+ /**
+ * Called when a characteristic has been changed.
+ *
+ * @param gatt The GATT client the characteristic is associated with.
+ * @param characteristic The characteristic that has been changed.
+ */
+ void onCharacteristicChanged(BluetoothGatt gatt,
+ BluetoothGattCharacteristic characteristic);
+
+ /**
+ * Called for each {@link BluetoothGattService} that is discovered on the
+ * {@link BluetoothDevice} after a matching scan result and connection.
+ *
+ * @param service {@link BluetoothGattService} that has been discovered.
+ */
+ void onServiceDiscovered(BluetoothGattService service);
+ }
}
diff --git a/tests/CarTrustAgentClientApp/src/com/android/car/trust/client/Utils.java b/tests/CarTrustAgentClientApp/src/com/android/car/trust/client/Utils.java
deleted file mode 100644
index 003a86c..0000000
--- a/tests/CarTrustAgentClientApp/src/com/android/car/trust/client/Utils.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.car.trust.client;
-
-import android.bluetooth.BluetoothGattCharacteristic;
-import android.bluetooth.BluetoothGattService;
-import android.content.Context;
-
-import java.nio.ByteBuffer;
-import java.util.UUID;
-
-public class Utils {
-
- public static final String LOG_TAG = "CarTrustAgentClient";
-
- public static byte[] getBytes(long l) {
- ByteBuffer buffer = ByteBuffer.allocate(Long.SIZE / Byte.SIZE);
- buffer.putLong(0, l);
- return buffer.array();
- }
-
- public static long getLong(byte[] bytes) {
- ByteBuffer buffer = ByteBuffer.allocate(Long.SIZE / Byte.SIZE);
- buffer.put(bytes);
- buffer.flip();
- return buffer.getLong();
- }
-
- public static BluetoothGattCharacteristic getCharacteristic(int uuidRes,
- BluetoothGattService service, Context context) {
- return service.getCharacteristic(UUID.fromString(context.getString(uuidRes)));
- }
-}
diff --git a/tests/DefaultStorageMonitoringCompanionApp/res/values/strings.xml b/tests/DefaultStorageMonitoringCompanionApp/res/values/strings.xml
index 8c0a9bb..d8048cd 100644
--- a/tests/DefaultStorageMonitoringCompanionApp/res/values/strings.xml
+++ b/tests/DefaultStorageMonitoringCompanionApp/res/values/strings.xml
@@ -1,3 +1,3 @@
<resources>
- <string name="app_name">Flash Storage Wear Notification</string>
+ <string name="app_name" translatable="false">Flash Storage Wear Notification</string>
</resources>
diff --git a/tests/DirectRenderingClusterSample/Android.mk b/tests/DirectRenderingClusterSample/Android.mk
index f3469fb..4408158 100644
--- a/tests/DirectRenderingClusterSample/Android.mk
+++ b/tests/DirectRenderingClusterSample/Android.mk
@@ -35,6 +35,10 @@
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
LOCAL_JAVA_LIBRARIES += android.car
-LOCAL_STATIC_ANDROID_LIBRARIES += androidx.legacy_legacy-support-v4
+LOCAL_STATIC_ANDROID_LIBRARIES += \
+ androidx.legacy_legacy-support-v4 \
+ androidx-constraintlayout_constraintlayout \
+ androidx.car_car-cluster \
+ car-arch-common
include $(BUILD_PACKAGE)
diff --git a/tests/DirectRenderingClusterSample/AndroidManifest.xml b/tests/DirectRenderingClusterSample/AndroidManifest.xml
index 17880d0..12c6bba 100644
--- a/tests/DirectRenderingClusterSample/AndroidManifest.xml
+++ b/tests/DirectRenderingClusterSample/AndroidManifest.xml
@@ -16,8 +16,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="android.car.cluster.sample"
- android:versionCode="1"
- android:versionName="1.0">
+ android:sharedUserId="android.uid.system">
<uses-sdk android:targetSdkVersion="25" android:minSdkVersion="25"/>
@@ -31,22 +30,39 @@
<uses-permission android:name="android.permission.INJECT_EVENTS"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.INTERNAL_SYSTEM_WINDOW"/>
+ <!-- Required by 'singleUser' service attribute -->
+ <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS"/>
+ <!-- Required by 'startActivityAsUser' -->
+ <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL"/>
+ <!-- Required to detect the current user in the device -->
+ <uses-permission android:name="android.permission.MANAGE_USERS" />
+ <!-- Required to launch navigation apps -->
+ <uses-permission android:name="android.car.permission.CAR_INSTRUMENT_CLUSTER_CONTROL"/>
+ <!-- Required to watch activities running on the cluster -->
+ <uses-permission android:name="android.permission.SET_ACTIVITY_WATCHER"/>
+ <!-- Required to show car sensor data -->
+ <uses-permission android:name="android.car.permission.CAR_ENERGY"/>
+ <uses-permission android:name="android.car.permission.CAR_POWERTRAIN"/>
+ <uses-permission android:name="android.car.permission.CAR_INFO"/>
+ <uses-permission android:name="android.car.permission.CAR_SPEED"/>
+ <uses-permission android:name="android.car.permission.CAR_ENGINE_DETAILED"/>
<application android:label="@string/app_name"
android:icon="@mipmap/ic_launcher"
android:directBootAware="true">
- <service android:name=".SampleClusterServiceImpl"
+ <service android:name=".ClusterRenderingServiceImpl"
android:exported="false"
+ android:singleUser="true"
android:permission="android.car.permission.BIND_INSTRUMENT_CLUSTER_RENDERER_SERVICE"/>
<activity android:name=".MainClusterActivity"
android:exported="false"
- android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen">
+ android:showForAllUsers="true"
+ android:theme="@style/Theme.ClusterTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
-
</application>
</manifest>
diff --git a/tests/DirectRenderingClusterSample/res/color/icon_color.xml b/tests/DirectRenderingClusterSample/res/color/icon_color.xml
new file mode 100644
index 0000000..1ce35ee
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/color/icon_color.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android" >
+ <item
+ android:color="@color/icon_selected"
+ android:state_selected="true"/>
+ <item
+ android:color="@color/icon_selected"
+ android:state_focused="true"/>
+ <item
+ android:color="@color/icon_unselected"/>
+</selector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/btn_car_info.xml b/tests/DirectRenderingClusterSample/res/drawable/btn_car_info.xml
deleted file mode 100644
index 437ad41..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/btn_car_info.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_focused="true" >
- <layer-list>
- <item android:drawable="@drawable/ic_car_info"/>
- <item android:drawable="@drawable/focused_button_shape"/>
- </layer-list>
- </item>
- <item android:drawable="@drawable/ic_car_info"/>
-</selector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/btn_music.xml b/tests/DirectRenderingClusterSample/res/drawable/btn_music.xml
deleted file mode 100644
index 65e01b6..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/btn_music.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_focused="true" >
- <layer-list>
- <item android:drawable="@drawable/ic_music"/>
- <item android:drawable="@drawable/focused_button_shape"/>
- </layer-list>
- </item>
- <item android:drawable="@drawable/ic_music"/>
-</selector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/btn_nav.xml b/tests/DirectRenderingClusterSample/res/drawable/btn_nav.xml
deleted file mode 100644
index 9f9c6bc..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/btn_nav.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_focused="true" >
- <layer-list>
- <item android:drawable="@drawable/ic_nav"/>
- <item android:drawable="@drawable/focused_button_shape"/>
- </layer-list>
- </item>
- <item android:drawable="@drawable/ic_nav"/>
-</selector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/btn_phone.xml b/tests/DirectRenderingClusterSample/res/drawable/btn_phone.xml
deleted file mode 100644
index 2a6e249..0000000
--- a/tests/DirectRenderingClusterSample/res/drawable/btn_phone.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_focused="true" >
- <layer-list>
- <item android:drawable="@drawable/ic_phone"/>
- <item android:drawable="@drawable/focused_button_shape"/>
- </layer-list>
- </item>
- <item android:drawable="@drawable/ic_phone"/>
-</selector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_arrive.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_arrive.xml
new file mode 100644
index 0000000..c83d9f0
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/direction_arrive.xml
@@ -0,0 +1,5 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
+ android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
+ <path android:fillColor="#FF000000"
+ android:pathData="M10,5a2,2,0,1,1,2-2a2,2,0,0,1-2,2Zm4.91284,8.35114l-4.90368-6.342839999999999l-4.903689999999999,6.342839999999999a.38659.38659,0,0,0,.40942.62354l2.95184-1.34375a.35542.35542,0,0,1,.5409600000000001.3690700000000007h-.007690000000000197v5.50006a.49992.49992,0,0,0,.4999400000000005.4999399999999987h1.00012a.49992.49992,0,0,0,.4999399999999987-.4999399999999987v-5.491760000000001h.00916a.35757.35757,0,0,1,.54242-.37738l2.95184,1.34375a.3866.3866,0,0,0,.4094200000000008-.6235300000000006Z"/>
+</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_arrive_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_arrive_left.xml
new file mode 100644
index 0000000..3eba85d
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/direction_arrive_left.xml
@@ -0,0 +1,5 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
+ android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
+ <path android:fillColor="#FF000000"
+ android:pathData="M3,12a2,2,0,1,1,2-2a2,2,0,0,1-2,2Zm10.00293-.96332a4.05782,4.05782,0,0,1,3.98877,4.07324h.008300000000001972v1.37775a.51232.51232,0,0,0,.5123299999999986.5123299999999986h.97534a.51232.51232,0,0,0,.5123300000000022-.5123299999999986v-1.4876700000000014h-.013850000000001472a6.05607,6.05607,0,0,0-5.9834-5.96332l-.011-.00183l.00012.02008h-.9918700000000005v-.009090000000000487a.35757.35757,0,0,1-.37738-.54242l1.34375-2.95184a.38659.38659,0,0,0-.62354-.40942l-6.342829999999999,4.90368l6.34283,4.90369a.3866.3866,0,0,0,.62354-.40942l-1.34375-2.95184a.35757.35757,0,0,1,.3773800000000005-.5424299999999977v.00909h1"/>
+</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_arrive_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_arrive_right.xml
new file mode 100644
index 0000000..0401e8c
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/direction_arrive_right.xml
@@ -0,0 +1,5 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
+ android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
+ <path android:fillColor="#FF000000"
+ android:pathData="M15,10a2,2,0,1,1,2,2a2,2,0,0,1-2-2Zm-8,1.0549300000000006h1v-.009090000000000487a.35757.35757,0,0,1,.37738.54242l-1.3437500000000009,2.9518400000000007a.3866.3866,0,0,0,.62354.40942l6.34283-4.903680000000001l-6.34283-4.90369a.38659.38659,0,0,0-.62354.40942l1.3437500000000009,2.9518500000000003a.35757.35757,0,0,1-.3773800000000005.5424199999999999v.009090000000000487h-.9918199999999997l.00011999999999989797-.020080000000000098l-.011.00183a6.05607,6.05607,0,0,0-5.98345,5.9633199999999995h-.013849999999999696v1.48767a.51232.51232,0,0,0,.51233.5123299999999986h.9753400000000001a.51232.51232,0,0,0,.51233-.5123299999999986v-1.3777500000000007h.008300000000000196a4.05782,4.05782,0,0,1,3.98877-4.07324"/>
+</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_arrive_straight.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_arrive_straight.xml
new file mode 100644
index 0000000..c83d9f0
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/direction_arrive_straight.xml
@@ -0,0 +1,5 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
+ android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
+ <path android:fillColor="#FF000000"
+ android:pathData="M10,5a2,2,0,1,1,2-2a2,2,0,0,1-2,2Zm4.91284,8.35114l-4.90368-6.342839999999999l-4.903689999999999,6.342839999999999a.38659.38659,0,0,0,.40942.62354l2.95184-1.34375a.35542.35542,0,0,1,.5409600000000001.3690700000000007h-.007690000000000197v5.50006a.49992.49992,0,0,0,.4999400000000005.4999399999999987h1.00012a.49992.49992,0,0,0,.4999399999999987-.4999399999999987v-5.491760000000001h.00916a.35757.35757,0,0,1,.54242-.37738l2.95184,1.34375a.3866.3866,0,0,0,.4094200000000008-.6235300000000006Z"/>
+</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_close.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_close.xml
new file mode 100644
index 0000000..c531094
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/direction_close.xml
@@ -0,0 +1,5 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
+ android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
+ <path android:fillColor="#FF000000"
+ android:pathData="M17.35551,4.05855l-5.589929999999999,5.589929999999999a.49713.49713,0,0,0,0,.703l5.58993,5.58993a.49713.49713,0,0,1,0,.703l-.711.711a.49713.49713,0,0,1-.703,0l-5.58993-5.58993a.49713.49713,0,0,0-.703,0l-5.590030000000002,5.590030000000002a.49713.49713,0,0,1-.703,0l-.711-.711a.49713.49713,0,0,1,0-.703l5.58993-5.58993a.49713.49713,0,0,0,0-.703l-5.589990000000002-5.590030000000002a.49713.49713,0,0,1,0-.703l.711-.711a.49713.49713,0,0,1,.703,0l5.58999,5.5898699999999995a.49713.49713,0,0,0,.703,0l5.58993-5.58993a.49713.49713,0,0,1,.703,0l.711.711a.49713.49713,0,0,1,.00010000000000331966.7030600000000002Z"/>
+</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_continue.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_continue.xml
new file mode 100644
index 0000000..231dac0
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/direction_continue.xml
@@ -0,0 +1,5 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
+ android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
+ <path android:fillColor="#FF000000"
+ android:pathData="M14.50342,8.96637l-2.9518500000000003-1.3437499999999991a.35755.35755,0,0,0-.5424100000000003.3773799999999996v9.49652a.50346.50346,0,0,1-.5034799999999997.5034799999999997h-.993a.50346.50346,0,0,1-.50348-.50348v-9.49652a.35756.35756,0,0,0-.54242-.37738l-2.9518899999999997,1.3437499999999991a.38659.38659,0,0,1-.40942-.62354l4.903689999999999-6.342829999999999l4.90369,6.34283a.3866.3866,0,0,1-.40942999999999863.6235400000000002Z"/>
+</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_continue_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_continue_left.xml
new file mode 100644
index 0000000..faa7027
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/direction_continue_left.xml
@@ -0,0 +1,5 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
+ android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
+ <path android:fillColor="#FF000000"
+ android:pathData="M10,5.97986l.011.00183a6.06019,6.06019,0,0,1,5.989000000000001,6.07324v3.9450699999999994h-.003109999999999502l.002,1.50317a.49614.49614,0,0,1-.49620000000000175.4968299999999992h-1.0064700000000002a.49622.49622,0,0,1-.4962199999999992-.496220000000001v-5.448849999999998a4.05782,4.05782,0,0,0-3.98877-4.07324h-1.99878a.3576.3576,0,0,0-.37738.54248l1.3437500000000009,2.951830000000001a.38659.38659,0,0,1-.62354.40942l-6.34698-4.885420000000002l6.347-4.922a.38659.38659,0,0,1,.62354.40942l-1.3437700000000001,2.9518499999999994a.35757.35757,0,0,0,.37738.54242h1.9875500000000006"/>
+</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_continue_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_continue_right.xml
new file mode 100644
index 0000000..6ef4749
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/direction_continue_right.xml
@@ -0,0 +1,5 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
+ android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
+ <path android:fillColor="#FF000000"
+ android:pathData="M9.98877,7.98169a4.05782,4.05782,0,0,0-3.9887700000000006,4.07324v5.44885a.49622.49622,0,0,1-.4962200000000001.496220000000001h-1.0064700000000002a.49614.49614,0,0,1-.49615-.49683l.0019500000000007844-1.5031700000000008h-.0031100000000003902v-3.9450699999999994a6.06019,6.06019,0,0,1,5.989000000000001-6.07324l.010999999999999233-.0018299999999999983v.0018299999999999983h1.98755a.35757.35757,0,0,0,.37738-.54242l-1.3437500000000018-2.9518400000000007a.38659.38659,0,0,1,.6235300000000006-.40942999999999996l6.346990000000002,4.922000000000001l-6.347,4.88544a.38659.38659,0,0,1-.62354-.40942l1.34375-2.95184a.3576.3576,0,0,0-.37738-.54248h-1.998759999999999Z"/>
+</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_depart.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_depart.xml
new file mode 100644
index 0000000..46c2408
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/direction_depart.xml
@@ -0,0 +1,5 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
+ android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
+ <path android:fillColor="#FF000000"
+ android:pathData="M9.98172,19a2,2,0,1,1,2-2a2,2,0,0,1-2,2Zm4.912840000000001-11.65717l-4.903690000000001-6.342829999999999l-4.90368,6.34283a.38659.38659,0,0,0,.40942.62354l2.95184-1.34375a.35542.35542,0,0,1,.541.36908h-.007730000000000459v5.50006a.49992.49992,0,0,0,.49994.49994h1.00012a.49992.49992,0,0,0,.49994-.49994v-5.491760000000001h.00916a.35757.35757,0,0,1,.54242-.37738l2.95184,1.34375a.3866.3866,0,0,0,.409419999999999-.6235400000000002Z"/>
+</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_fork_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_fork_left.xml
new file mode 100644
index 0000000..8ca9ced
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/direction_fork_left.xml
@@ -0,0 +1,5 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
+ android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
+ <path android:fillColor="#FF000000"
+ android:pathData="M17.73611,6.57682a.30465.30465,0,0,1,.23032.10507l.649.74859a.30457.30457,0,0,1-.03369.43226l-2.06044,1.7384500000000012a5.4089,5.4089,0,0,0-1.73306,4.29459l.0047,3.60769a.29612.29612,0,0,1-.2961399999999994.2965300000000006h-1.0064700000000002a.29657.29657,0,0,1-.29623-.29622l-.00058-3.47624a6.99129,6.99129,0,0,1,2.269479999999998-5.626159999999999l2.077-1.75275a.30475.30475,0,0,1,.1962-.07182m0-.2a.50269.50269,0,0,0-.32516.119l-2.07704,1.7527300000000006a7.25157,7.25157,0,0,0-2.3398900000000005,5.794459999999999v3.46082a.49622.49622,0,0,0,.496220000000001.4961800000000025h1.0064700000000002a.49614.49614,0,0,0,.49615-.49681l-.0047-3.60767a5.2182,5.2182,0,0,1,1.665-4.14405l2.057410000000001-1.7358700000000002a.50455.50455,0,0,0,.05585-.71613l-.649-.74859a.50345.50345,0,0,0-.38147-.17406h0Zm-8.73542-.39511999999999947h-1.9875500000000006a.35757.35757,0,0,1-.37738-.54242l1.3437499999999991-2.9518400000000007a.38659.38659,0,0,0-.6235399999999993-.40942999999999996l-6.34698,4.922000000000001l6.347,4.88544a.38659.38659,0,0,0,.6235199999999992-.40943999999999825l-1.34375-2.951830000000001a.3576.3576,0,0,1,.37738-.54248h1.9987700000000013a4.05782,4.05782,0,0,1,3.98877,4.07324v5.44885a.49622.49622,0,0,0,.49622999999999884.496220000000001h1.00647a.49614.49614,0,0,0,.49615-.49683l-.001960000000000406-1.5031700000000008h.00311v-3.9450699999999994a6.06019,6.06019,0,0,0-5.989-6.07324l-.011-.00183"/>
+</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_fork_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_fork_right.xml
new file mode 100644
index 0000000..9953608
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/direction_fork_right.xml
@@ -0,0 +1,5 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
+ android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
+ <path android:fillColor="#FF000000"
+ android:pathData="M2.27386,6.57682a.30457.30457,0,0,1,.1961400000000002.07182000000000066l2.0739999999999994,1.7501800000000003a7.00218,7.00218,0,0,1,2.27186,5.644179999999999v3.46088a.29651.29651,0,0,1-.29617999999999967.29612000000000194h-1.0065a.29613.29613,0,0,1-.29618000000000055-.2965699999999991l.003790000000000404-3.5888300000000015a5.42,5.42,0,0,0-1.73517-4.316l-2.0573699999999997-1.7358600000000015a.30461.30461,0,0,1-.03372-.43226l.649-.74859a.30466.30466,0,0,1,.23035-.10507m0-.2a.50345.50345,0,0,0-.38147.17406l-.649.74859a.50458.50458,0,0,0,.05588.71613l2.0573699999999997,1.7358600000000006a5.2182,5.2182,0,0,1,1.665,4.14405l-.0046600000000003305,3.607660000000001a.49617.49617,0,0,0,.49617999999999984.4968299999999992h1.0065a.49616.49616,0,0,0,.49615-.49615v-3.4608500000000006a7.25157,7.25157,0,0,0-2.33983-5.794459999999999l-2.077-1.7527499999999998a.50264.50264,0,0,0-.32516-.119h0Zm8.73442,1.604870000000001h1.98755a.3576.3576,0,0,1,.37738.54248l-1.3437500000000018,2.951830000000001a.38659.38659,0,0,0,.62354.40942l6.34698-4.885420000000002l-6.3469999999999995-4.922000000000001a.38659.38659,0,0,0-.62354.40942l1.34375,2.95184a.35757.35757,0,0,1-.37738.54242h-1.9875299999999996v-.0018199999999986005l-.011.00183a6.06019,6.06019,0,0,0-5.989,6.07324v3.9450699999999994h.003109999999998614l-.002,1.50317a.49614.49614,0,0,0,.4962100000000005.4968299999999992h1.0064599999999997a.49622.49622,0,0,0,.49622-.49622v-5.448849999999998a4.05782,4.05782,0,0,1,3.98877-4.07324h.011229999999999407Z"/>
+</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_merge_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_merge_left.xml
new file mode 100644
index 0000000..b8954b8
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/direction_merge_left.xml
@@ -0,0 +1,5 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
+ android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
+ <path android:fillColor="#FF000000"
+ android:pathData="M7.8,7.2v10.302520000000001a.2978.2978,0,0,1-.2974699999999997.2974800000000002h-1.0050600000000003a.2978.2978,0,0,1-.2974699999999997-.2974800000000002v-10.302520000000001h1.5999999999999996m.20000000000000018-.1999999999999993h-2v10.50252a.49747.49747,0,0,0,.49746999999999986.4974799999999995h1.0050600000000003a.49747.49747,0,0,0,.49746999999999986-.4974799999999995v-10.50252h0Zm-.018309999999999604,3v-1.9875500000000006a.3576.3576,0,0,1,.54248-.37738l2.951830000000001,1.3437500000000009a.38659.38659,0,0,0,.40942-.62354l-4.885420000000002-6.34698l-4.922,6.347a.38659.38659,0,0,0,.40942.62354l2.9518499999999994-1.3437700000000001a.35757.35757,0,0,1,.54242.37738v1.9875500000000006h-.0018299999999991101l.00183.011a6.06019,6.06019,0,0,0,6.07324,5.989000000000001h3.9450699999999994v-.003109999999999502l1.50317.002a.49614.49614,0,0,0,.4968299999999992-.49620000000000175v-1.0064700000000002a.49622.49622,0,0,0-.496220000000001-.4962199999999992h-5.448849999999998a4.05782,4.05782,0,0,1-4.07324-3.98877v-.011229999999999407Z"/>
+</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_merge_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_merge_right.xml
new file mode 100644
index 0000000..ab89d03
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/direction_merge_right.xml
@@ -0,0 +1,5 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
+ android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
+ <path android:fillColor="#FF000000"
+ android:pathData="M13.8,7.2v10.299210000000002a.30112.30112,0,0,1-.30078.3008h-.9984300000000008a.30112.30112,0,0,1-.300790000000001-.30079999999999885v-10.299210000000002h1.6m.20000000000000107-.1999999999999993h-2v10.499210000000001a.50079.50079,0,0,0,.5007900000000003.5007899999999985h.99841a.50079.50079,0,0,0,.5007999999999999-.5007899999999985v-10.499210000000001h0Zm.01831,3v-1.9875500000000006a.35757.35757,0,0,1,.54242-.37738l2.95184,1.34375a.38659.38659,0,0,0,.4094300000000004-.6235299999999988l-4.922000000000001-6.34699l-4.88544,6.347a.38659.38659,0,0,0,.40942.62354l2.95184-1.34375a.3576.3576,0,0,1,.54248.37738v1.99878a4.05782,4.05782,0,0,1-4.0732300000000015,3.9887499999999996h-5.44885a.49622.49622,0,0,0-.4962200000000001.4962199999999992v1.00647a.49614.49614,0,0,0,.49683.49615l1.50317-.001949999999999008v.003109999999999502h3.9450700000000003a6.06019,6.06019,0,0,0,6.07324-5.989l.0018299999999999983-.010999999999999233"/>
+</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_new_name_straight.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_new_name_straight.xml
new file mode 100644
index 0000000..231dac0
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/direction_new_name_straight.xml
@@ -0,0 +1,5 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
+ android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
+ <path android:fillColor="#FF000000"
+ android:pathData="M14.50342,8.96637l-2.9518500000000003-1.3437499999999991a.35755.35755,0,0,0-.5424100000000003.3773799999999996v9.49652a.50346.50346,0,0,1-.5034799999999997.5034799999999997h-.993a.50346.50346,0,0,1-.50348-.50348v-9.49652a.35756.35756,0,0,0-.54242-.37738l-2.9518899999999997,1.3437499999999991a.38659.38659,0,0,1-.40942-.62354l4.903689999999999-6.342829999999999l4.90369,6.34283a.3866.3866,0,0,1-.40942999999999863.6235400000000002Z"/>
+</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_off_ramp_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_off_ramp_left.xml
new file mode 100644
index 0000000..536fd22
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/direction_off_ramp_left.xml
@@ -0,0 +1,5 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
+ android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
+ <path android:fillColor="#FF000000"
+ android:pathData="M14.5029,2.2a.29744.29744,0,0,1,.29710000000000036.2971199999999996v15.005760000000002a.29744.29744,0,0,1-.29710000000000036.2971199999999996h-1.0058000000000007a.29744.29744,0,0,1-.29710000000000036-.2971199999999996v-15.005760000000002a.29744.29744,0,0,1,.29710000000000036-.2971199999999987h1.0058m0-.2h-1.0058000000000007a.49711.49711,0,0,0-.49709999999999965.4971199999999998v15.005760000000002a.49711.49711,0,0,0,.49709999999999965.4971199999999989h1.0058a.49711.49711,0,0,0,.49709999999999965-.4971199999999989v-15.005760000000002a.49711.49711,0,0,0-.49709999999999965-.4971199999999989h0Zm-5.50212,3.9816900000000004h-1.9875500000000006a.35757.35757,0,0,1-.37738-.54242l1.3437499999999991-2.9518400000000007a.38659.38659,0,0,0-.6235399999999993-.40942999999999996l-6.34698,4.922000000000001l6.347,4.88544a.38659.38659,0,0,0,.6235199999999992-.40943999999999825l-1.34375-2.951830000000001a.3576.3576,0,0,1,.37738-.54248h1.9987700000000013a4.05782,4.05782,0,0,1,3.98877,4.07324v5.44885a.49622.49622,0,0,0,.49622999999999884.496220000000001h1.00647a.49614.49614,0,0,0,.49615-.49683l-.001960000000000406-1.5031700000000008h.00311v-3.9450699999999994a6.06019,6.06019,0,0,0-5.989-6.07324l-.011-.00183"/>
+</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_off_ramp_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_off_ramp_right.xml
new file mode 100644
index 0000000..3048587
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/direction_off_ramp_right.xml
@@ -0,0 +1,5 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
+ android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
+ <path android:fillColor="#FF000000"
+ android:pathData="M6.5029,2.2a.29744.29744,0,0,1,.2970999999999995.2971199999999996v15.005760000000002a.29744.29744,0,0,1-.2970999999999995.2971199999999996h-1.0058000000000007a.29744.29744,0,0,1-.2970999999999995-.2971199999999996v-15.005760000000002a.29744.29744,0,0,1,.2970999999999995-.2971199999999987h1.0058000000000007m0-.2h-1.0058000000000007a.49711.49711,0,0,0-.49709999999999965.4971199999999998v15.005760000000002a.49711.49711,0,0,0,.49709999999999965.4971199999999989h1.0058000000000007a.49711.49711,0,0,0,.49709999999999965-.4971199999999989v-15.005760000000002a.49711.49711,0,0,0-.49709999999999965-.4971199999999989h0Zm4.5054,5.98169h1.98755a.3576.3576,0,0,1,.37738.54248l-1.3437500000000018,2.951830000000001a.38659.38659,0,0,0,.62354.40942l6.34698-4.885420000000002l-6.3469999999999995-4.922000000000001a.38659.38659,0,0,0-.62354.40942l1.34375,2.95184a.35757.35757,0,0,1-.37738.54242h-1.9875299999999996v-.0018199999999986005l-.011.00183a6.06019,6.06019,0,0,0-5.989,6.07324v3.9450699999999994h.003109999999998614l-.002,1.50317a.49614.49614,0,0,0,.4962100000000005.4968299999999992h1.0064599999999997a.49622.49622,0,0,0,.49622-.49622v-5.448849999999998a4.05782,4.05782,0,0,1,3.98877-4.07324h.011229999999999407Z"/>
+</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_off_ramp_slight_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_off_ramp_slight_left.xml
new file mode 100644
index 0000000..91ffc9c
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/direction_off_ramp_slight_left.xml
@@ -0,0 +1,5 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
+ android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
+ <path android:fillColor="#FF000000"
+ android:pathData="M14.5029,2.2a.29744.29744,0,0,1,.29710000000000036.2971199999999996v15.005760000000002a.29744.29744,0,0,1-.29710000000000036.2971199999999996h-1.0058000000000007a.29744.29744,0,0,1-.29710000000000036-.2971199999999996v-15.005760000000002a.29744.29744,0,0,1,.29710000000000036-.2971199999999987h1.0058m0-.2h-1.0058000000000007a.49711.49711,0,0,0-.49709999999999965.4971199999999998v15.005760000000002a.49711.49711,0,0,0,.49709999999999965.4971199999999989h1.0058a.49711.49711,0,0,0,.49709999999999965-.4971199999999989v-15.005760000000002a.49711.49711,0,0,0-.49709999999999965-.4971199999999989h0Zm-1.85684,6.24854l-2.457460000000001-2.07386a.3576.3576,0,0,1,.07019-.6571l2.9489100000000015-1.3501600000000007a.38658.38658,0,0,0-.20294-.71777l-8.004760000000001-.4496500000000001l1.58044,7.86a.38663.38663,0,0,0,.73938.09912l.9181799999999996-3.1106099999999985a.35758.35758,0,0,1,.6405-.16266l2.44818,2.06561a5.21819,5.21819,0,0,1,1.665,4.144l-.0047,3.60767a.49614.49614,0,0,0,.49624000000000024.49687000000000126h1.00653a.49621.49621,0,0,0,.49615-.49622v-3.4607799999999997a7.25157,7.25157,0,0,0-2.339839999999999-5.794459999999999Z"/>
+</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_off_ramp_slight_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_off_ramp_slight_right.xml
new file mode 100644
index 0000000..b549937
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/direction_off_ramp_slight_right.xml
@@ -0,0 +1,5 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
+ android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
+ <path android:fillColor="#FF000000"
+ android:pathData="M8.5029,2.2a.29744.29744,0,0,1,.29710000000000036.2971199999999996v15.005760000000002a.29744.29744,0,0,1-.29710000000000036.2971199999999996h-1.0058000000000007a.29744.29744,0,0,1-.2970999999999995-.2971199999999996v-15.005760000000002a.29744.29744,0,0,1,.2970999999999995-.2971199999999987h1.0058000000000007m0-.2h-1.0058000000000007a.49711.49711,0,0,0-.49709999999999965.4971199999999998v15.005760000000002a.49711.49711,0,0,0,.49709999999999965.4971199999999989h1.0058000000000007a.49711.49711,0,0,0,.49709999999999965-.4971199999999989v-15.005760000000002a.49711.49711,0,0,0-.49709999999999965-.4971199999999989h0Zm-1.4888000000000003,12.043v3.46082a.49621.49621,0,0,0,.4961500000000001.4961800000000025h1.0065300000000006a.49614.49614,0,0,0,.49615-.49683l-.0047-3.60767a5.21819,5.21819,0,0,1,1.665-4.144l2.44818-2.06561a.35758.35758,0,0,1,.6405.16266l.91821,3.1106a.38663.38663,0,0,0,.7394400000000001-.09915000000000163l1.5804399999999994-7.859999999999999l-8.00476.44965a.38658.38658,0,0,0-.20294.71777l2.94891,1.35016a.3576.3576,0,0,1,.07019.6571l-2.457460000000001,2.0738600000000007a7.25157,7.25157,0,0,0-2.3398399999999997,5.794459999999999Z"/>
+</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_left.xml
new file mode 100644
index 0000000..65e66e2
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_left.xml
@@ -0,0 +1,5 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
+ android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
+ <path android:fillColor="#FF000000"
+ android:pathData="M9.00078,5.97986l.011.00183a6.06019,6.06019,0,0,1,5.989,6.07324v3.9450699999999994h-.0031199999999991235l.002,1.50317a.49614.49614,0,0,1-.4962.4968299999999992h-1.0064600000000006a.49622.49622,0,0,1-.49622-.49622v-5.448849999999998a4.05782,4.05782,0,0,0-3.98878-4.07324h-1.9987700000000004a.3576.3576,0,0,0-.37738.54248l1.3437499999999991,2.951830000000001a.38659.38659,0,0,1-.62354.40942l-6.346979999999999-4.885420000000002l6.347-4.922a.38659.38659,0,0,1,.62354.40942l-1.343770000000001,2.9518499999999994a.35757.35757,0,0,0,.37738.54242h1.9875500000000015"/>
+</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_right.xml
new file mode 100644
index 0000000..1647927
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_right.xml
@@ -0,0 +1,5 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
+ android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
+ <path android:fillColor="#FF000000"
+ android:pathData="M10.99707,7.98169a4.05782,4.05782,0,0,0-3.9887700000000006,4.07324v5.44885a.49622.49622,0,0,1-.4962200000000001.496220000000001h-1.0064599999999997a.49614.49614,0,0,1-.49615-.49683l.0019399999999993867-1.5031700000000008h-.003109999999999502v-3.9450699999999994a6.06019,6.06019,0,0,1,5.989-6.07324l.011-.00183v.0018299999999999983h1.98755a.35757.35757,0,0,0,.37738-.54242l-1.34375-2.9518400000000007a.38659.38659,0,0,1,.623520000000001-.40942999999999996l6.3469999999999995,4.922000000000001l-6.347,4.88544a.38659.38659,0,0,1-.62354-.40942l1.34375-2.95184a.3576.3576,0,0,0-.37738-.54248h-1.9987599999999972Z"/>
+</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_sharp_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_sharp_left.xml
new file mode 100644
index 0000000..83b821a
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_sharp_left.xml
@@ -0,0 +1,5 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
+ android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
+ <path android:fillColor="#FF000000"
+ android:pathData="M15.49771,18a.49779.49779,0,0,1-.49779-.49779v-12.4983l-.27979-.00635a2.56758,2.56758,0,0,0-2.0957.79l-5.39526,4.61285a.34918.34918,0,0,0,.08252.63177l2.92877,1.39331a.38658.38658,0,0,1-.21344.71472l-8.0105.33209l1.69568-7.836a.38661.38661,0,0,1,.74072-.0882l.8725,3.12372a.35757.35757,0,0,0,.638.17206l.0037800000000007827.00446999999999953l5.392099999999999-4.60909a4.46634,4.46634,0,0,1,3.38476-1.2412599999999996l.2641600000000004.0019999999999997797a1.92935,1.92935,0,0,1,1.43408.56885a2.10247,2.10247,0,0,1,.55713,1.46045l.00046999999999997044,12.47289a.49779.49779,0,0,1-.49779000000000195.4978100000000012h-1.0044Z"/>
+</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_sharp_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_sharp_right.xml
new file mode 100644
index 0000000..3394364
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_sharp_right.xml
@@ -0,0 +1,5 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
+ android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
+ <path android:fillColor="#FF000000"
+ android:pathData="M3.49789,17.99542a.49779.49779,0,0,1-.49779-.49781l.00047000000000041453-12.472889999999998a2.10247,2.10247,0,0,1,.5571299999999999-1.4604500000000002a1.92935,1.92935,0,0,1,1.43408-.56885l.26416-.002a4.46634,4.46634,0,0,1,3.38476,1.2412599999999996l5.392099999999999,4.609089999999999l.00378-.00446a.35757.35757,0,0,0,.638-.17206l.8725-3.12372a.38661.38661,0,0,1,.74072.0882l1.69568,7.836l-8.01048-.3320899999999991a.38658.38658,0,0,1-.21344-.71472l2.92877-1.39331a.34918.34918,0,0,0,.08252-.63177l-5.395280000000001-4.612840000000001a2.56758,2.56758,0,0,0-2.0957-.79l-.27979.00635v12.4983a.49779.49779,0,0,1-.49779.49779h-1.0043999999999995Z"/>
+</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_slight_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_slight_left.xml
new file mode 100644
index 0000000..385a519
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_slight_left.xml
@@ -0,0 +1,5 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
+ android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
+ <path android:fillColor="#FF000000"
+ android:pathData="M12.9859,14.043v3.46082a.49621.49621,0,0,1-.4961500000000001.4961800000000025h-1.0065300000000015a.49614.49614,0,0,1-.49615-.49683l.0047-3.60767a5.21819,5.21819,0,0,0-1.665-4.144l-2.4482299999999997-2.0656499999999998a.35758.35758,0,0,0-.6405.16266l-.91821,3.1106a.38663.38663,0,0,1-.7393899999999993-.09910999999999959l-1.5804400000000003-7.859999999999999l8.00476.44965a.38658.38658,0,0,1,.20294.71777l-2.9489099999999997,1.3501599999999998a.3576.3576,0,0,0-.07019.6571l2.45746,2.07385a7.25157,7.25157,0,0,1,2.3398400000000024,5.7944700000000005Z"/>
+</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_slight_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_slight_right.xml
new file mode 100644
index 0000000..2ee993c
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/direction_on_ramp_slight_right.xml
@@ -0,0 +1,5 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
+ android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
+ <path android:fillColor="#FF000000"
+ android:pathData="M9.35394,8.24854l2.457460000000001-2.07386a.3576.3576,0,0,0-.07019-.6571l-2.9489100000000015-1.3501600000000007a.38658.38658,0,0,1,.20294-.71777l8.004760000000001-.4496500000000001l-1.58044,7.86a.38663.38663,0,0,1-.73938.09912l-.9181799999999996-3.1106099999999985a.35758.35758,0,0,0-.6405-.16266l-2.448220000000001,2.0656099999999995a5.21819,5.21819,0,0,0-1.665,4.144l.0047,3.60767a.49614.49614,0,0,1-.4961999999999982.49687000000000126h-1.0065300000000006a.49621.49621,0,0,1-.49615-.49622v-3.4607799999999997a7.25157,7.25157,0,0,1,2.3398399999999997-5.794459999999999Z"/>
+</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout.xml
new file mode 100644
index 0000000..5504491
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout.xml
@@ -0,0 +1,5 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
+ android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
+ <path android:fillColor="#FF000000"
+ android:pathData="M5.5,10.002a.17879.17879,0,0,0,.27124.18866l1.47589-.67188a.1933.1933,0,0,1,.20471.31177l-2.45184,3.17145l-2.45184-3.1714900000000004a.1933.1933,0,0,1,.20471-.31177l1.476.67188a.17876.17876,0,0,0,.2711299999999994-.18862000000000023v-.002000000000000668a5.51888,5.51888,0,0,1,2.75293-4.76563l.5.86523a4.51856,4.51856,0,0,0-2.25293,3.9003999999999994v.002Zm6.75146-3.89941a4.51948,4.51948,0,0,1,2.24854,3.897409999999999h1a5.5223,5.5223,0,0,0-2.74756-4.7627l-.001440000000000552-.00006000000000039307a.17878.17878,0,0,1-.027789999999999537-.32923999999999953l1.3197899999999994-.9422400000000004a.19332.19332,0,0,0-.16766-.33319l-3.97247.53766l1.52063,3.70911a.19331.19331,0,0,0,.37238-.02142l.1561199999999996-1.6141500000000004a.17945.17945,0,0,1,.29945999999999984-.1412299999999993Zm.4954200000000011,8.663409999999999a.17879.17879,0,0,1,.299.14053l.1561,1.61412a.1933.1933,0,0,0,.37235.02141l1.520669999999999-3.709059999999999l-3.97245-.53766a.1933.1933,0,0,0-.16764.33317l1.31982.94225a.17879.17879,0,0,1-.02781.32923l.00361-.00254a4.57684,4.57684,0,0,1-4.502,0l-.501.86523a5.50442,5.50442,0,0,0,5.50391,0Z"/>
+</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_left.xml
new file mode 100644
index 0000000..e3337c5
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_left.xml
@@ -0,0 +1,5 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
+ android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
+ <path android:fillColor="#FF000000"
+ android:pathData="M13,6.2a3.8,3.8,0,1,1-3.8000000000000007,3.8a3.80428,3.80428,0,0,1,3.8000000000000007-3.8m0,7a3.2,3.2,0,1,0-3.1999999999999993-3.1999999999999993a3.20363,3.20363,0,0,0,3.1999999999999993,3.1999999999999993m0-7.199999999999999a4,4,0,1,0,4,4a4.00458,4.00458,0,0,0-4-4h0Zm0,7a3,3,0,1,1,3-3a3.00328,3.00328,0,0,1-3,3h0Zm2.82861-5.82813a4.0315,4.0315,0,0,0-.542-.45459a4.078,4.078,0,0,0-5.11475.4541a3.96842,3.96842,0,0,0-1.141099999999998,2.328619999999999h-4.030760000000001a.17879.17879,0,0,1-.18866-.27124l.6718799999999998-1.4758899999999997a.1933.1933,0,0,0-.31177-.20471l-3.17145,2.4518400000000007l3.17145,2.45184a.1933.1933,0,0,0,.31177-.20471l-.6718799999999998-1.4758899999999997a.17879.17879,0,0,1,.1886599999999996-.2712400000000006h5v-.5a2.98063,2.98063,0,0,1,.87891-2.12158a3.06088,3.06088,0,0,1,3.83545-.34082a3.02248,3.02248,0,0,1,.40723.34131a2.99976,2.99976,0,0,1-2.1215899999999994,5.12109h-.5v4h1v-3.030760000000001a4.00038,4.00038,0,0,0,2.3286099999999994-6.797369999999999Z"/>
+</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_right.xml
new file mode 100644
index 0000000..c4e3de7
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_right.xml
@@ -0,0 +1,5 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
+ android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
+ <path android:fillColor="#FF000000"
+ android:pathData="M7,6.2a3.8,3.8,0,1,1-3.8,3.8a3.80428,3.80428,0,0,1,3.8-3.8m0,7a3.2,3.2,0,1,0-3.2-3.1999999999999993a3.20363,3.20363,0,0,0,3.2,3.1999999999999993m0-7.199999999999999a4,4,0,1,0,4,4a4.00458,4.00458,0,0,0-4-4h0Zm0,7a3,3,0,1,1,3-3a3.00328,3.00328,0,0,1-3,3h0Zm7.83777-5.45184a.1933.1933,0,0,0-.31177.20471l.67188,1.47589a.17881.17881,0,0,1-.18872.2712399999999988h-5.00916v.5a2.99994,2.99994,0,0,1-3,3h-.5v4h1v-3.030760000000001a4.0032,4.0032,0,0,0,3.469239999999999-3.469239999999999h4.03992a.17881.17881,0,0,1,.18872.27124l-.6718799999999998,1.4758899999999997a.1933.1933,0,0,0,.31177.20471l3.1713900000000024-2.4518400000000007Z"/>
+</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_sharp_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_sharp_left.xml
new file mode 100644
index 0000000..f6b3999
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_sharp_left.xml
@@ -0,0 +1,5 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
+ android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
+ <path android:fillColor="#FF000000"
+ android:pathData="M10.994,5.2a3.8,3.8,0,1,1-3.8,3.8a3.80428,3.80428,0,0,1,3.8-3.8m0,7a3.2,3.2,0,1,0-3.2-3.1999999999999993a3.20363,3.20363,0,0,0,3.2,3.2m0-7.2a4,4,0,1,0,4,4a4.00458,4.00458,0,0,0-4-4h0Zm0,7a3,3,0,1,1,3-3a3.00328,3.00328,0,0,1-3,3h0Zm2.8291-5.82813a4.03583,4.03583,0,0,0-.54248-.45459a4.07906,4.07906,0,0,0-5.11475.4541a4.00058,4.00058,0,0,0-.33252,5.28076l-3.0657700000000023,3.06578a.17873.17873,0,0,1-.325-.05847l-.5685799999999994-1.518740000000001a.19332.19332,0,0,0-.36523.07568l-.5087700000000002,3.9762600000000017l3.97626-.50879a.19332.19332,0,0,0,.07568-.36523l-1.5187400000000002-.5685500000000001a.17879.17879,0,0,1-.05835-.3252l-.00037-.00037l3.40378-3.40567l.33838-.353l-.34521-.34619a2.9995,2.9995,0,0,1,.0014699999999994162-4.241229999999998a3.06063,3.06063,0,0,1,3.83545-.34082a3.02673,3.02673,0,0,1,.40771.34131a3,3,0,0,1-2.1220599999999994,5.12109h-.5v4h1v-3.030760000000001a4.00076,4.00076,0,0,0,2.3290900000000008-6.797369999999999Z"/>
+</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_sharp_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_sharp_right.xml
new file mode 100644
index 0000000..820ddf3
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_sharp_right.xml
@@ -0,0 +1,5 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
+ android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
+ <path android:fillColor="#FF000000"
+ android:pathData="M8.97217,5.2a3.8,3.8,0,1,1-3.8,3.8a3.8043,3.8043,0,0,1,3.8-3.8m0,7a3.2,3.2,0,1,0-3.2-3.2a3.20362,3.20362,0,0,0,3.2,3.2m0-7.2a4,4,0,1,0,4,4a4.00458,4.00458,0,0,0-4-4h0Zm0,7a3,3,0,1,1,3-3a3.00328,3.00328,0,0,1-3,3h0Zm7.491,1.02374a.19328.19328,0,0,0-.36517-.07568l-.5685199999999995,1.5187399999999993a.17883.17883,0,0,1-.32526.05835l-.00018.00018l-3.75726-3.75726l-.35352.35352a2.98022,2.98022,0,0,1-2.121089999999999.8784100000000006h-.5v4h1v-3.030760000000001a3.95621,3.95621,0,0,0,1.95264-.80859l3.07312,3.07275a.17841.17841,0,0,1-.05914.324l-1.5186900000000012.5686000000000018a.1933.1933,0,0,0,.07568.36523l3.9762200000000014.5087699999999984Z"/>
+</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_slight_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_slight_left.xml
new file mode 100644
index 0000000..7891bd7
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_slight_left.xml
@@ -0,0 +1,5 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
+ android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
+ <path android:fillColor="#FF000000"
+ android:pathData="M10.97473,7.2a3.8,3.8,0,1,1-3.8,3.8a3.80428,3.80428,0,0,1,3.8-3.8m0,7a3.2,3.2,0,1,0-3.2-3.2a3.20363,3.20363,0,0,0,3.2,3.2m0-7.2a4,4,0,1,0,4,4a4.00458,4.00458,0,0,0-4-4h0Zm0,7a3,3,0,1,1,3-3a3.00328,3.00328,0,0,1-3,3h0Zm-5.499-9.20184a.17879.17879,0,0,1,.05835000000000079-.32515999999999945l1.51872-.5685899999999999a.1933.1933,0,0,0-.0757-.36521l-3.97624-.50881l.50881,3.97625a.1933.1933,0,0,0,.36521.0757l.56854-1.51872a.17879.17879,0,0,1,.32521-.05835m6.7061,9.464a4.00038,4.00038,0,0,0,2.32861-6.79736a4.0315,4.0315,0,0,0-.542-.45459a4.07671,4.07671,0,0,0-4.73975.12256l-3.75294-3.749l-.707.708l4.439,4.43311l.353-.35352a3.05971,3.05971,0,0,1,3.83545-.34082a3.02248,3.02248,0,0,1,.40723.34131a2.99976,2.99976,0,0,1-2.1216100000000004,5.121040000000001h-.5v4h1v-3.030760000000001Z"/>
+</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_slight_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_slight_right.xml
new file mode 100644
index 0000000..028dc9f
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_slight_right.xml
@@ -0,0 +1,5 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
+ android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
+ <path android:fillColor="#FF000000"
+ android:pathData="M8.97128,7.2a3.8,3.8,0,1,1-3.8,3.8a3.80428,3.80428,0,0,1,3.8-3.8m0,7a3.2,3.2,0,1,0-3.2-3.2a3.20363,3.20363,0,0,0,3.2,3.2m0-7.2a4,4,0,1,0,4,4a4.00458,4.00458,0,0,0-4-4h0Zm0,7a3,3,0,1,1,3-3a3.00328,3.00328,0,0,1-3,3h0Zm4.081189999999999-10.548729999999999a.19328.19328,0,0,0-.07568.36517l1.51874.5686a.17878.17878,0,0,1,.05835.3252l.00006.00006l-3.8150899999999996,3.8150899999999988l.35352.35352a2.99976,2.99976,0,0,1-2.1210999999999984,5.121090000000001h-.5v3.97917h1v-3.0099300000000007a4.00123,4.00123,0,0,0,2.66016-6.42236l3.1295699999999993-3.1295399999999978a.17878.17878,0,0,1,.3252.05835l.5684999999999985,1.5187400000000002a.19332.19332,0,0,0,.36523-.07574l.50879-3.9762Z"/>
+</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_straight.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_straight.xml
new file mode 100644
index 0000000..301ce6c
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/direction_roundabout_straight.xml
@@ -0,0 +1,5 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
+ android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
+ <path android:fillColor="#FF000000"
+ android:pathData="M10,8.2a3.8,3.8,0,1,1-3.8,3.8000000000000007a3.80427,3.80427,0,0,1,3.8-3.8000000000000007m0,7a3.2,3.2,0,1,0-3.2-3.1999999999999993a3.20363,3.20363,0,0,0,3.2,3.1999999999999993m0-7.199999999999999a4,4,0,1,0,4,4a4.00458,4.00458,0,0,0-4-4h0Zm0,7a3,3,0,1,1,3-3a3.00328,3.00328,0,0,1-3,3h0Zm2.83057-5.82666a3.97135,3.97135,0,0,0-2.33057-1.1425799999999988v-3.0266100000000007a.17881.17881,0,0,1,.27124-.18872l1.4758899999999997.6718700000000002a.19329.19329,0,0,0,.20471-.31177l-2.4518400000000007-3.17138l-2.45184,3.1713899999999997a.1933.1933,0,0,0,.20471.31177l1.476-.67187a.17879.17879,0,0,1,.2711299999999994.18871000000000038v3.99585h.5a3,3,0,1,1,0,6h-.5v3h1v-2.030760000000001a4.00076,4.00076,0,0,0,2.33057-6.7959Z"/>
+</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_turn_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_turn_left.xml
new file mode 100644
index 0000000..faa7027
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/direction_turn_left.xml
@@ -0,0 +1,5 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
+ android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
+ <path android:fillColor="#FF000000"
+ android:pathData="M10,5.97986l.011.00183a6.06019,6.06019,0,0,1,5.989000000000001,6.07324v3.9450699999999994h-.003109999999999502l.002,1.50317a.49614.49614,0,0,1-.49620000000000175.4968299999999992h-1.0064700000000002a.49622.49622,0,0,1-.4962199999999992-.496220000000001v-5.448849999999998a4.05782,4.05782,0,0,0-3.98877-4.07324h-1.99878a.3576.3576,0,0,0-.37738.54248l1.3437500000000009,2.951830000000001a.38659.38659,0,0,1-.62354.40942l-6.34698-4.885420000000002l6.347-4.922a.38659.38659,0,0,1,.62354.40942l-1.3437700000000001,2.9518499999999994a.35757.35757,0,0,0,.37738.54242h1.9875500000000006"/>
+</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_turn_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_turn_right.xml
new file mode 100644
index 0000000..6ef4749
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/direction_turn_right.xml
@@ -0,0 +1,5 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
+ android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
+ <path android:fillColor="#FF000000"
+ android:pathData="M9.98877,7.98169a4.05782,4.05782,0,0,0-3.9887700000000006,4.07324v5.44885a.49622.49622,0,0,1-.4962200000000001.496220000000001h-1.0064700000000002a.49614.49614,0,0,1-.49615-.49683l.0019500000000007844-1.5031700000000008h-.0031100000000003902v-3.9450699999999994a6.06019,6.06019,0,0,1,5.989000000000001-6.07324l.010999999999999233-.0018299999999999983v.0018299999999999983h1.98755a.35757.35757,0,0,0,.37738-.54242l-1.3437500000000018-2.9518400000000007a.38659.38659,0,0,1,.6235300000000006-.40942999999999996l6.346990000000002,4.922000000000001l-6.347,4.88544a.38659.38659,0,0,1-.62354-.40942l1.34375-2.95184a.3576.3576,0,0,0-.37738-.54248h-1.998759999999999Z"/>
+</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_turn_sharp_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_turn_sharp_left.xml
new file mode 100644
index 0000000..9024be2
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/direction_turn_sharp_left.xml
@@ -0,0 +1,5 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
+ android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
+ <path android:fillColor="#FF000000"
+ android:pathData="M15.49771,17.99542a.49779.49779,0,0,1-.49779-.49779v-12.4983l-.2797799999999988-.006330000000000169a2.56758,2.56758,0,0,0-2.0957.79l-5.39527,4.61283a.34918.34918,0,0,0,.08252.63177l2.92877,1.39331a.38658.38658,0,0,1-.21344.71472l-8.0105.33209l1.69568-7.836a.38661.38661,0,0,1,.74072-.0882l.8725,3.12372a.35757.35757,0,0,0,.638.17206l.0037800000000007827.00446999999999953l5.392099999999999-4.609089999999999a4.46634,4.46634,0,0,1,3.38477-1.24121l.26416.002a1.92935,1.92935,0,0,1,1.43408.56885a2.10247,2.10247,0,0,1,.55713,1.46045l.000460000000000349,12.472840000000001a.49779.49779,0,0,1-.49779.49781h-1.0044Z"/>
+</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_turn_sharp_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_turn_sharp_right.xml
new file mode 100644
index 0000000..3394364
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/direction_turn_sharp_right.xml
@@ -0,0 +1,5 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
+ android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
+ <path android:fillColor="#FF000000"
+ android:pathData="M3.49789,17.99542a.49779.49779,0,0,1-.49779-.49781l.00047000000000041453-12.472889999999998a2.10247,2.10247,0,0,1,.5571299999999999-1.4604500000000002a1.92935,1.92935,0,0,1,1.43408-.56885l.26416-.002a4.46634,4.46634,0,0,1,3.38476,1.2412599999999996l5.392099999999999,4.609089999999999l.00378-.00446a.35757.35757,0,0,0,.638-.17206l.8725-3.12372a.38661.38661,0,0,1,.74072.0882l1.69568,7.836l-8.01048-.3320899999999991a.38658.38658,0,0,1-.21344-.71472l2.92877-1.39331a.34918.34918,0,0,0,.08252-.63177l-5.395280000000001-4.612840000000001a2.56758,2.56758,0,0,0-2.0957-.79l-.27979.00635v12.4983a.49779.49779,0,0,1-.49779.49779h-1.0043999999999995Z"/>
+</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_turn_slight_left.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_turn_slight_left.xml
new file mode 100644
index 0000000..431736f
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/direction_turn_slight_left.xml
@@ -0,0 +1,5 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
+ android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
+ <path android:fillColor="#FF000000"
+ android:pathData="M14.9859,14.043v3.46082a.49621.49621,0,0,1-.4961600000000015.4961800000000025h-1.0065299999999997a.49614.49614,0,0,1-.49615-.49683l.0047-3.60767a5.21819,5.21819,0,0,0-1.665-4.144l-2.448220000000001-2.0656499999999998a.35758.35758,0,0,0-.6405.16266l-.91821,3.1106a.38663.38663,0,0,1-.7393899999999993-.09910999999999959l-1.5804400000000003-7.859999999999999l8.00476.44965a.38658.38658,0,0,1,.20294.71777l-2.9489199999999993,1.3501599999999998a.3576.3576,0,0,0-.07019.6571l2.45746,2.07385a7.25158,7.25158,0,0,1,2.339850000000002,5.7944700000000005Z"/>
+</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_turn_slight_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_turn_slight_right.xml
new file mode 100644
index 0000000..0ab8aef
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/direction_turn_slight_right.xml
@@ -0,0 +1,5 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
+ android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
+ <path android:fillColor="#FF000000"
+ android:pathData="M7.35395,8.24854l2.45746-2.07386a.3576.3576,0,0,0-.07019-.6571l-2.94892-1.3501600000000007a.38658.38658,0,0,1,.20294-.71777l8.004760000000001-.4496500000000001l-1.58044,7.86a.38663.38663,0,0,1-.73938.09912l-.9181799999999996-3.1106099999999985a.35758.35758,0,0,0-.6405-.16266l-2.448220000000001,2.0656099999999995a5.21819,5.21819,0,0,0-1.665,4.144l.0047,3.60767a.49614.49614,0,0,1-.49618999999999946.49687000000000126h-1.0065300000000006a.49621.49621,0,0,1-.49615-.49622v-3.4607799999999997a7.25157,7.25157,0,0,1,2.3398400000000006-5.794459999999999Z"/>
+</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_uturn.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_uturn.xml
new file mode 100644
index 0000000..bfb9e0c
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/direction_uturn.xml
@@ -0,0 +1,5 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
+ android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
+ <path android:fillColor="#FF000000"
+ android:pathData="M17,8v9.49652a.50346.50346,0,0,1-.5034799999999997.5034799999999997h-.993a.50346.50346,0,0,1-.50352-.5034799999999997v-9.49652a3.5,3.5,0,0,0-7,0v4h-.009089999999999598a.35757.35757,0,0,0,.54242.37738l2.95184-1.34375a.3866.3866,0,0,1,.40942.62354l-4.9036800000000005,6.342829999999999l-4.9037500000000005-6.342829999999999a.3866.3866,0,0,1,.40942-.62354l2.95184,1.34375a.3576.3576,0,0,0,.5424900000000008-.3773800000000005h.009089999999999598v-4a5.5,5.5,0,0,1,11,0Z"/>
+</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/direction_uturn_right.xml b/tests/DirectRenderingClusterSample/res/drawable/direction_uturn_right.xml
new file mode 100644
index 0000000..8fc9223
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/direction_uturn_right.xml
@@ -0,0 +1,8 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp"
+ android:height="20dp" android:viewportWidth="20" android:viewportHeight="20"
+ android:pivotX="10" android:scaleX="-1">
+ <group android:pivotX="10" android:scaleX="-1">
+ <path android:fillColor="#FF000000"
+ android:pathData="M17,8v9.49652a.50346.50346,0,0,1-.5034799999999997.5034799999999997h-.993a.50346.50346,0,0,1-.50352-.5034799999999997v-9.49652a3.5,3.5,0,0,0-7,0v4h-.009089999999999598a.35757.35757,0,0,0,.54242.37738l2.95184-1.34375a.3866.3866,0,0,1,.40942.62354l-4.9036800000000005,6.342829999999999l-4.9037500000000005-6.342829999999999a.3866.3866,0,0,1,.40942-.62354l2.95184,1.34375a.3576.3576,0,0,0,.5424900000000008-.3773800000000005h.009089999999999598v-4a5.5,5.5,0,0,1,11,0Z"/>
+ </group>
+</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/focused_button_shape.xml b/tests/DirectRenderingClusterSample/res/drawable/focused_button_shape.xml
index b84ef30..9ded30c 100644
--- a/tests/DirectRenderingClusterSample/res/drawable/focused_button_shape.xml
+++ b/tests/DirectRenderingClusterSample/res/drawable/focused_button_shape.xml
@@ -2,12 +2,12 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<stroke
android:width="2dp"
- android:color="#333333" />
+ android:color="#333333"/>
<corners
- android:radius="7dp" />
+ android:radius="7dp"/>
<padding
android:left="5dp"
android:top="5dp"
android:right="5dp"
- android:bottom="5dp" />
+ android:bottom="5dp"/>
</shape>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/gradient_bottom.xml b/tests/DirectRenderingClusterSample/res/drawable/gradient_bottom.xml
new file mode 100644
index 0000000..8006864
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/gradient_bottom.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+ <gradient
+ android:startColor="#00000000"
+ android:endColor="#FF000000"
+ android:angle="270"
+ android:dither="true"
+ />
+</shape>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/gradient_top.xml b/tests/DirectRenderingClusterSample/res/drawable/gradient_top.xml
new file mode 100644
index 0000000..74932ad
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/gradient_top.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+ <gradient
+ android:startColor="#00000000"
+ android:endColor="#FF000000"
+ android:angle="90"
+ android:dither="true"
+ />
+</shape>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/drawable/speedometer.xml b/tests/DirectRenderingClusterSample/res/drawable/speedometer.xml
new file mode 100644
index 0000000..d97c54e
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/drawable/speedometer.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:aapt="http://schemas.android.com/aapt"
+ android:width="200dp"
+ android:height="200dp"
+ android:viewportHeight="64"
+ android:viewportWidth="64">
+
+ <path
+ android:pathData="M0,32
+ A32,32 0 1,1 64,32
+ A32,32 0 1,1 0,32 Z">
+ <aapt:attr name="android:fillColor">
+ <gradient
+ android:centerX="32"
+ android:centerY="32"
+ android:gradientRadius="32"
+ android:type="radial">
+ <item
+ android:color="#FF000000"
+ android:offset="0.0"/>
+ <item
+ android:color="#FF000000"
+ android:offset="0.94"/>
+ <item
+ android:color="#00000000"
+ android:offset="1.0"/>
+ </gradient>
+ </aapt:attr>
+ </path>
+
+ <path
+ android:fillColor="#000"
+ android:strokeWidth="0.25"
+ android:pathData="M2,32
+ A30,30 0 1,1 62,32
+ A30,30 0 1,1 2,32 Z">
+ <aapt:attr name="android:strokeColor">
+ <gradient
+ android:startX="0"
+ android:startY="10"
+ android:startColor="#000"
+ android:endX="0"
+ android:endY="150"
+ android:endColor="#000"
+ android:centerColor="#DDD"
+ android:type="linear"/>
+ </aapt:attr>
+ </path>
+
+</vector>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/layout/activity_main.xml b/tests/DirectRenderingClusterSample/res/layout/activity_main.xml
index f711ba6..fa8db14 100644
--- a/tests/DirectRenderingClusterSample/res/layout/activity_main.xml
+++ b/tests/DirectRenderingClusterSample/res/layout/activity_main.xml
@@ -1,69 +1,237 @@
<?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<androidx.constraintlayout.widget.ConstraintLayout
+ 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"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/background_dark"
- tools:context=".MainClusterActivity"
- android:windowIsFloating="true">
+ android:windowIsFloating="true"
+ tools:context=".MainClusterActivity">
+
+ <androidx.constraintlayout.widget.Guideline
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:id="@+id/left_unobscured"
+ android:orientation="vertical"
+ app:layout_constraintGuide_begin="@dimen/speedometer_overlap_width"/>
+
+ <androidx.constraintlayout.widget.Guideline
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:id="@+id/right_unobscured"
+ android:orientation="vertical"
+ app:layout_constraintGuide_end="@dimen/speedometer_overlap_width"/>
+
+ <androidx.constraintlayout.widget.Guideline
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:id="@+id/gauges_top"
+ android:orientation="horizontal"
+ app:layout_constraintGuide_begin="@dimen/speedometer_top"/>
+
+ <androidx.viewpager.widget.ViewPager
+ android:id="@+id/pager"
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintBottom_toTopOf="@+id/info"/>
<LinearLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
-
- <androidx.viewpager.widget.ViewPager
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/pager"
- android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="1"
- />
+ android:id="@+id/info"
+ android:layout_width="0dp"
+ android:layout_height="@dimen/info_height"
+ app:layout_constraintLeft_toRightOf="@+id/left_unobscured"
+ app:layout_constraintRight_toLeftOf="@+id/right_unobscured"
+ app:layout_constraintBottom_toBottomOf="parent"
+ android:gravity="center">
<LinearLayout
- android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:orientation="horizontal">
+ android:orientation="vertical"
+ android:gravity="start">
- <Button
- android:id="@+id/btn_nav"
- android:layout_width="48dp"
- android:layout_height="48dp"
- android:background="@drawable/btn_nav"
- android:layout_margin="10dp"
- android:focusableInTouchMode="true" />
- <Button
- android:id="@+id/btn_phone"
- android:layout_width="48dp"
- android:layout_height="48dp"
- android:layout_margin="10dp"
- android:background="@drawable/btn_phone"
- android:focusableInTouchMode="true" />
- <Button
- android:id="@+id/btn_music"
- android:layout_width="48dp"
- android:layout_height="48dp"
- android:layout_margin="10dp"
- android:background="@drawable/btn_music"
- android:focusableInTouchMode="true" />
- <Button
- android:id="@+id/btn_car_info"
- android:layout_width="48dp"
- android:layout_height="48dp"
- android:layout_margin="10dp"
- android:background="@drawable/btn_car_info"
- android:focusableInTouchMode="true" />
+ <TextView
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:includeFontPadding="false"
+ android:text="@string/info_fuel_label"
+ android:textSize="@dimen/info_label_text_size"/>
+
+ <TextView
+ android:id="@+id/info_fuel"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:includeFontPadding="false"
+ android:text="@string/info_value_empty"
+ android:textSize="@dimen/info_value_text_size"/>
+
+ <TextView
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:includeFontPadding="false"
+ android:text="@string/info_range_label"
+ android:textSize="@dimen/info_label_text_size"/>
+
+ <TextView
+ android:id="@+id/info_range"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:includeFontPadding="false"
+ android:text="@string/info_value_empty"
+ android:textSize="@dimen/info_value_text_size"/>
+ </LinearLayout>
+
+ <include
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:id="@+id/navigation_state"
+ layout="@layout/include_navigation_state"/>
+
+ <LinearLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:gravity="end">
+
+ <TextView
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:includeFontPadding="false"
+ android:text="@string/info_speed_label"
+ android:textSize="@dimen/info_label_text_size"/>
+
+ <TextView
+ android:id="@+id/info_speed"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:includeFontPadding="false"
+ android:text="@string/info_value_empty"
+ android:textSize="@dimen/info_value_text_size"/>
+
+ <TextView
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:includeFontPadding="false"
+ android:text="@string/info_rpm_label"
+ android:textSize="@dimen/info_label_text_size"/>
+
+ <TextView
+ android:id="@+id/info_rpm"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:includeFontPadding="false"
+ android:text="@string/info_value_empty"
+ android:textSize="@dimen/info_value_text_size"/>
</LinearLayout>
</LinearLayout>
- <TextView
- android:id="@+id/text_overlay"
- android:layout_width="wrap_content"
+ <ImageView
+ android:id="@+id/left_gauge"
+ android:layout_width="@dimen/speedometer_width"
+ android:layout_height="@dimen/speedometer_height"
+ android:src="@drawable/speedometer"
+ android:elevation="2dp"
+ app:layout_constraintTop_toBottomOf="@+id/gauges_top"
+ app:layout_constraintRight_toLeftOf="@+id/left_unobscured"/>
+
+ <ImageView
+ android:id="@+id/right_gauge"
+ android:layout_width="@dimen/speedometer_width"
+ android:layout_height="@dimen/speedometer_height"
+ android:src="@drawable/speedometer"
+ android:elevation="2dp"
+ app:layout_constraintTop_toBottomOf="@+id/gauges_top"
+ app:layout_constraintLeft_toRightOf="@+id/right_unobscured"/>
+
+ <LinearLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:translationZ="4dp"
+ app:layout_constraintLeft_toLeftOf="parent"
+ app:layout_constraintBottom_toBottomOf="parent">
+
+ <Button
+ android:id="@+id/btn_nav"
+ android:layout_width="@dimen/facet_icon_size"
+ android:layout_height="@dimen/facet_icon_size"
+ android:layout_margin="@dimen/facet_icon_margin"
+ android:background="@drawable/ic_nav"
+ android:backgroundTint="@color/icon_color"
+ android:focusableInTouchMode="true" />
+ <Button
+ android:id="@+id/btn_phone"
+ android:layout_width="@dimen/facet_icon_size"
+ android:layout_height="@dimen/facet_icon_size"
+ android:layout_margin="@dimen/facet_icon_margin"
+ android:background="@drawable/ic_phone"
+ android:backgroundTint="@color/icon_color"
+ android:focusableInTouchMode="true" />
+ <Button
+ android:id="@+id/btn_music"
+ android:layout_width="@dimen/facet_icon_size"
+ android:layout_height="@dimen/facet_icon_size"
+ android:layout_margin="@dimen/facet_icon_margin"
+ android:background="@drawable/ic_music"
+ android:backgroundTint="@color/icon_color"
+ android:focusableInTouchMode="true" />
+ <Button
+ android:id="@+id/btn_car_info"
+ android:layout_width="@dimen/facet_icon_size"
+ android:layout_height="@dimen/facet_icon_size"
+ android:layout_margin="@dimen/facet_icon_margin"
+ android:background="@drawable/ic_car_info"
+ android:backgroundTint="@color/icon_color"
+ android:focusableInTouchMode="true" />
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:translationZ="4dp"
+ app:layout_constraintRight_toRightOf="parent"
+ app:layout_constraintBottom_toBottomOf="parent">
+
+ <TextView
+ android:id="@+id/gear_parked"
android:layout_height="wrap_content"
- android:layout_centerInParent="true"
- android:background="@android:color/background_light"
- android:textSize="30sp"
- />
-</RelativeLayout>
+ android:layout_width="wrap_content"
+ android:layout_marginHorizontal="@dimen/gear_icon_margin"
+ android:text="@string/gear_parked"
+ android:textColor="@color/icon_color"
+ android:textSize="@dimen/gear_text_size"/>
+
+ <TextView
+ android:id="@+id/gear_reverse"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:layout_marginHorizontal="@dimen/gear_icon_margin"
+ android:text="@string/gear_reverse"
+ android:textColor="@color/icon_color"
+ android:textSize="@dimen/gear_text_size"/>
+
+ <TextView
+ android:id="@+id/gear_neutral"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:layout_marginHorizontal="@dimen/gear_icon_margin"
+ android:text="@string/gear_neutral"
+ android:textColor="@color/icon_color"
+ android:textSize="@dimen/gear_text_size"/>
+
+ <TextView
+ android:id="@+id/gear_drive"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:layout_marginHorizontal="@dimen/gear_icon_margin"
+ android:text="@string/gear_drive"
+ android:textColor="@color/icon_color"
+ android:textSize="@dimen/gear_text_size"/>
+
+ </LinearLayout>
+</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/tests/DirectRenderingClusterSample/res/layout/fragment_navigation.xml b/tests/DirectRenderingClusterSample/res/layout/fragment_navigation.xml
index c0fb4b3..54894c2 100644
--- a/tests/DirectRenderingClusterSample/res/layout/fragment_navigation.xml
+++ b/tests/DirectRenderingClusterSample/res/layout/fragment_navigation.xml
@@ -1,22 +1,47 @@
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout
+ 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"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:background="@color/darkBlue"
tools:context=".NavigationFragment">
- <FrameLayout
- android:id="@+id/nav_frame_layout"
+ <SurfaceView
+ android:id="@+id/nav_surface"
android:layout_width="match_parent"
- android:layout_height="match_parent">
+ android:layout_height="match_parent"/>
- <SurfaceView
- android:id="@+id/nav_surface"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_margin="20dp"/>
+ <ProgressBar
+ android:id="@+id/progress_bar"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ app:layout_constraintVertical_chainStyle="packed"
+ app:layout_constraintLeft_toLeftOf="parent"
+ app:layout_constraintRight_toRightOf="parent"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintBottom_toTopOf="@+id/message"/>
- </FrameLayout>
+ <TextView
+ android:id="@+id/message"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/select_nav_app"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintLeft_toLeftOf="parent"
+ app:layout_constraintRight_toRightOf="parent"
+ app:layout_constraintTop_toBottomOf="@+id/progress_bar"/>
+ <ImageView
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/navigation_gradient_height"
+ android:src="@drawable/gradient_top"
+ app:layout_constraintTop_toTopOf="parent"/>
-</FrameLayout>
+ <ImageView
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/navigation_gradient_height"
+ android:src="@drawable/gradient_bottom"
+ app:layout_constraintBottom_toBottomOf="parent"/>
+
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/layout/include_navigation_state.xml b/tests/DirectRenderingClusterSample/res/layout/include_navigation_state.xml
new file mode 100644
index 0000000..3e64812
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/layout/include_navigation_state.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:orientation="horizontal">
+
+ <ImageView
+ android:id="@+id/maneuver"
+ android:layout_width="@dimen/maneuver_width"
+ android:layout_height="@dimen/maneuver_height"
+ android:layout_margin="@dimen/maneuver_margin"
+ android:tint="@android:color/white"/>
+
+ <LinearLayout
+ android:layout_width="@dimen/nav_state_width"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <TextView
+ android:id="@+id/distance"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:textSize="@dimen/distance_text_size"/>
+ <TextView
+ android:id="@+id/segment"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:textSize="@dimen/segment_text_size"/>
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="@dimen/nav_state_width"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <android.car.cluster.sample.CueView
+ android:id="@+id/cue"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:lineHeight="@dimen/cue_line_height"/>
+ <android.car.cluster.sample.LaneView
+ android:id="@+id/lane"
+ android:layout_width="wrap_content"
+ android:layout_height="@dimen/laneview_height"/>
+ </LinearLayout>
+</LinearLayout>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/res/values/colors.xml b/tests/DirectRenderingClusterSample/res/values/colors.xml
index a71c0d5..6ede0e7 100644
--- a/tests/DirectRenderingClusterSample/res/values/colors.xml
+++ b/tests/DirectRenderingClusterSample/res/values/colors.xml
@@ -4,4 +4,12 @@
<color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#FF4081</color>
<color name="darkBlue">#2b2b77</color>
+
+ <!-- Gear and facet icon colors -->
+ <color name="icon_selected">#6EDDFF</color>
+ <color name="icon_unselected">#1B378A</color>
+
+ <!-- LaneView highlight colors -->
+ <color name="laneDirection">#888888</color>
+ <color name="laneDirectionHighlighted">#FFFFFF</color>
</resources>
diff --git a/tests/DirectRenderingClusterSample/res/values/dimens.xml b/tests/DirectRenderingClusterSample/res/values/dimens.xml
index 47c8224..8c21523 100644
--- a/tests/DirectRenderingClusterSample/res/values/dimens.xml
+++ b/tests/DirectRenderingClusterSample/res/values/dimens.xml
@@ -2,4 +2,40 @@
<!-- Default screen margins, per the Android Design guidelines. -->
<dimen name="activity_horizontal_margin">16dp</dimen>
<dimen name="activity_vertical_margin">16dp</dimen>
+ <!-- Size and position of speedometers -->
+ <dimen name="speedometer_height">600dp</dimen>
+ <dimen name="speedometer_width">600dp</dimen>
+ <dimen name="speedometer_overlap_width">90dp</dimen>
+ <dimen name="speedometer_top">20dp</dimen>
+ <!-- Navigation fragment gradients -->
+ <dimen name="navigation_gradient_height">15dp</dimen>
+ <!-- Facet buttons -->
+ <dimen name="facet_icon_size">30dp</dimen>
+ <dimen name="facet_icon_margin">5dp</dimen>
+ <!-- Gears -->
+ <dimen name="gear_text_size">28sp</dimen>
+ <dimen name="gear_icon_margin">5dp</dimen>
+ <!-- Information space -->
+ <dimen name="info_height">80dp</dimen>
+ <dimen name="info_label_text_size">10sp</dimen>
+ <dimen name="info_value_text_size">20sp</dimen>
+
+ <!-- -->
+ <!-- Navigation state componenets -->
+ <!-- -->
+ <dimen name="nav_state_width">170dp</dimen>
+ <!-- Maneuver -->
+ <dimen name="maneuver_width">60dp</dimen>
+ <dimen name="maneuver_height">60dp</dimen>
+ <dimen name="maneuver_margin">10dp</dimen>
+ <!-- Distance -->
+ <dimen name="distance_text_size">20sp</dimen>
+ <!-- Segment -->
+ <dimen name="segment_text_size">15sp</dimen>
+ <!-- Cue -->
+ <dimen name="cue_line_height">15sp</dimen>
+ <!-- Lane -->
+ <dimen name="laneview_height">25dp</dimen>
+ <dimen name="lane_width">50dp</dimen>
+ <dimen name="lane_height">50dp</dimen>
</resources>
diff --git a/tests/DirectRenderingClusterSample/res/values/strings.xml b/tests/DirectRenderingClusterSample/res/values/strings.xml
index 778ecf6..803811b 100644
--- a/tests/DirectRenderingClusterSample/res/values/strings.xml
+++ b/tests/DirectRenderingClusterSample/res/values/strings.xml
@@ -1,6 +1,23 @@
<resources>
- <string name="app_name">Fake Cluster Implementation</string>
+ <string name="app_name" translatable="false">Fake Cluster Implementation</string>
<!-- TODO: Remove or change this placeholder text -->
- <string name="hello_blank_fragment">Hello blank fragment</string>
+ <string name="hello_blank_fragment" translatable="false">Hello blank fragment</string>
+
+ <!-- Message to show when a navigation app hasn't been selected yet. [CHAR LIMIT=100] -->
+ <string name="select_nav_app" translatable="false">Select a navigation app on the main unit.</string>
+
+ <!-- Gears texts [CHAR LIMIT=1] -->
+ <string name="gear_parked" translatable="false">P</string>
+ <string name="gear_reverse" translatable="false">R</string>
+ <string name="gear_neutral" translatable="false">N</string>
+ <string name="gear_drive" translatable="false">D</string>
+
+ <!-- Information labels (shown next to driving directions) [CHAR LIMIT=30] -->
+ <string name="info_fuel_label" translatable="false">Fuel</string>
+ <string name="info_speed_label" translatable="false">Speed</string>
+ <string name="info_range_label" translatable="false">Range</string>
+ <string name="info_rpm_label" translatable="false">RPM</string>
+ <string name="info_value_empty" translatable="false">-</string>
+
</resources>
diff --git a/tests/DirectRenderingClusterSample/res/values/styles.xml b/tests/DirectRenderingClusterSample/res/values/styles.xml
index f11f745..cd5f552 100644
--- a/tests/DirectRenderingClusterSample/res/values/styles.xml
+++ b/tests/DirectRenderingClusterSample/res/values/styles.xml
@@ -1,3 +1,5 @@
<resources>
-
+ <style name="noAnimTheme" parent="android:Theme">
+ <item name="android:windowAnimationStyle">@null</item>
+ </style>
</resources>
diff --git a/tests/DirectRenderingClusterSample/res/values/themes.xml b/tests/DirectRenderingClusterSample/res/values/themes.xml
new file mode 100644
index 0000000..972a036
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/res/values/themes.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources>
+ <style name="Theme.ClusterTheme" parent="@android:style/Theme.Black.NoTitleBar.Fullscreen">
+ <item name="android:windowAnimationStyle">@null</item>
+ </style>
+</resources>
\ No newline at end of file
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/ActivityMonitor.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/ActivityMonitor.java
new file mode 100644
index 0000000..d102a49
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/ActivityMonitor.java
@@ -0,0 +1,146 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.car.cluster.sample;
+
+import android.annotation.Nullable;
+import android.app.ActivityManager;
+import android.app.ActivityManager.StackInfo;
+import android.app.IActivityManager;
+import android.app.IProcessObserver;
+import android.app.TaskStackListener;
+import android.content.ComponentName;
+import android.os.Handler;
+import android.os.RemoteException;
+import android.util.Log;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Top activity monitor, allows listeners to be notified when a new activity comes to the foreground
+ * on a particular device.
+ */
+public class ActivityMonitor {
+ private static final String TAG = "Cluster.ActivityMonitor";
+
+ /**
+ * Listener of activity changes
+ */
+ public interface ActivityListener {
+ /**
+ * Invoked when a new activity becomes the top activity on a particular display.
+ */
+ void onTopActivityChanged(int displayId, @Nullable ComponentName activity);
+ }
+
+ private IActivityManager mActivityManager;
+ // Listeners of top activity changes, indexed by the displayId they are interested on.
+ private final Map<Integer, Set<ActivityListener>> mListeners = new HashMap<>();
+ private final Handler mHandler = new Handler();
+ private final IProcessObserver.Stub mProcessObserver = new IProcessObserver.Stub() {
+ @Override
+ public void onForegroundActivitiesChanged(int pid, int uid, boolean foregroundActivities) {
+ notifyTopActivities();
+ }
+
+ @Override
+ public void onProcessDied(int pid, int uid) {
+ notifyTopActivities();
+ }
+ };
+ private final TaskStackListener mTaskStackListener = new TaskStackListener() {
+ @Override
+ public void onTaskStackChanged() {
+ Log.i(TAG, "onTaskStackChanged");
+ notifyTopActivities();
+ }
+ };
+
+ /**
+ * Registers a new listener to receive activity updates on a particular display
+ *
+ * @param displayId identifier of the display to monitor
+ * @param listener listener to be notified
+ */
+ public void addListener(int displayId, ActivityListener listener) {
+ mListeners.computeIfAbsent(displayId, k -> new HashSet<>()).add(listener);
+ }
+
+ /**
+ * Unregisters a listener previously registered with {@link #addListener(int, ActivityListener)}
+ */
+ public void removeListener(int displayId, ActivityListener listener) {
+ mListeners.computeIfAbsent(displayId, k -> new HashSet<>()).remove(listener);
+ }
+
+ /**
+ * Starts monitoring activity changes. {@link #stop()} should be invoked to release resources.
+ */
+ public void start() {
+ mActivityManager = ActivityManager.getService();
+ // Monitoring both listeners are necessary as there are cases where one listener cannot
+ // monitor activity change.
+ try {
+ mActivityManager.registerProcessObserver(mProcessObserver);
+ mActivityManager.registerTaskStackListener(mTaskStackListener);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Cannot register activity monitoring", e);
+ throw new RuntimeException(e);
+ }
+ notifyTopActivities();
+ }
+
+ /**
+ * Stops monitoring activity changes. Should be invoked when this monitor is not longer used.
+ */
+ public void stop() {
+ if (mActivityManager == null) {
+ return;
+ }
+ try {
+ mActivityManager.unregisterProcessObserver(mProcessObserver);
+ mActivityManager.unregisterTaskStackListener(mTaskStackListener);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Cannot unregister activity monitoring. Ignoring", e);
+ }
+ mActivityManager = null;
+ }
+
+ /**
+ * Notifies listeners on changes of top activities. {@link ActivityManager} might trigger
+ * updates on threads different than UI.
+ */
+ private void notifyTopActivities() {
+ mHandler.post(() -> {
+ try {
+ List<StackInfo> infos = mActivityManager.getAllStackInfos();
+ for (StackInfo info : infos) {
+ Set<ActivityListener> listeners = mListeners.get(info.displayId);
+ if (listeners != null && !listeners.isEmpty()) {
+ for (ActivityListener listener : listeners) {
+ listener.onTopActivityChanged(info.displayId, info.topActivity);
+ }
+ }
+ }
+ } catch (RemoteException e) {
+ Log.e(TAG, "Cannot getTasks", e);
+ }
+ });
+ }
+}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/ClusterDisplayProvider.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/ClusterDisplayProvider.java
index 623fc0a..3948bc1 100644
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/ClusterDisplayProvider.java
+++ b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/ClusterDisplayProvider.java
@@ -34,7 +34,7 @@
* @see {@link NetworkedVirtualDisplay}
*/
public class ClusterDisplayProvider {
- private static final String TAG = ClusterDisplayProvider.class.getSimpleName();
+ private static final String TAG = "Cluster.DisplayProvider";
private static final int NETWORKED_DISPLAY_WIDTH = 1280;
private static final int NETWORKED_DISPLAY_HEIGHT = 720;
@@ -52,6 +52,9 @@
Display clusterDisplay = getInstrumentClusterDisplay(mDisplayManager);
if (clusterDisplay != null) {
+ Log.i(TAG, String.format("Found display: %s (id: %d, owner: %s)",
+ clusterDisplay.getName(), clusterDisplay.getDisplayId(),
+ clusterDisplay.getOwnerPackageName()));
mClusterDisplayId = clusterDisplay.getDisplayId();
clusterDisplayListener.onDisplayAdded(clusterDisplay.getDisplayId());
trackClusterDisplay(null /* no need to track display by name */);
@@ -112,10 +115,14 @@
Display[] displays = displayManager.getDisplays();
Log.d(TAG, "There are currently " + displays.length + " displays connected.");
- if (displays.length > 1) {
- // TODO: assuming that secondary display is instrument cluster. Put this into settings?
- // We could use name and ownerPackageName to verify this is the right display.
- return displays[1];
+ // TODO: assuming that secondary display is instrument cluster. Put this into
+ // settings?
+ // We could use name and ownerPackageName to verify this is the right display.
+ // For now we consider the second system display to be the one to be used.
+ for (int i = 1; i < displays.length; i++) {
+ if (displays[i].getOwnerPackageName() == null) {
+ return displays[i];
+ }
}
return null;
}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/ClusterRenderingServiceImpl.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/ClusterRenderingServiceImpl.java
new file mode 100644
index 0000000..31aad7d
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/ClusterRenderingServiceImpl.java
@@ -0,0 +1,330 @@
+/*
+ * 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.car.cluster.sample;
+
+import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
+
+import static java.lang.Integer.parseInt;
+
+import android.app.ActivityOptions;
+import android.car.CarNotConnectedException;
+import android.car.cluster.ClusterActivityState;
+import android.car.cluster.renderer.InstrumentClusterRenderingService;
+import android.car.cluster.renderer.NavigationRenderer;
+import android.car.navigation.CarNavigationInstrumentCluster;
+import android.content.Intent;
+import android.graphics.Rect;
+import android.hardware.display.DisplayManager.DisplayListener;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Message;
+import android.os.Messenger;
+import android.os.RemoteException;
+import android.os.SystemClock;
+import android.os.UserHandle;
+import android.provider.Settings;
+import android.provider.Settings.Global;
+import android.util.Log;
+import android.view.Display;
+import android.view.InputDevice;
+import android.view.KeyEvent;
+
+import androidx.car.cluster.navigation.NavigationState;
+import androidx.versionedparcelable.ParcelUtils;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Implementation of {@link InstrumentClusterRenderingService} which renders an activity on a
+ * virtual display that is transmitted to an external screen.
+ */
+public class ClusterRenderingServiceImpl extends InstrumentClusterRenderingService {
+ private static final String TAG = "Cluster.SampleService";
+
+ private static final int NO_DISPLAY = -1;
+
+ static final String LOCAL_BINDING_ACTION = "local";
+ static final String NAV_STATE_BUNDLE_KEY = "navstate";
+ static final int NAV_STATE_EVENT_ID = 1;
+ static final int MSG_SET_ACTIVITY_LAUNCH_OPTIONS = 1;
+ static final int MSG_ON_NAVIGATION_STATE_CHANGED = 2;
+ static final int MSG_ON_KEY_EVENT = 3;
+ static final int MSG_REGISTER_CLIENT = 4;
+ static final int MSG_UNREGISTER_CLIENT = 5;
+ static final String MSG_KEY_CATEGORY = "category";
+ static final String MSG_KEY_ACTIVITY_DISPLAY_ID = "activity_display_id";
+ static final String MSG_KEY_ACTIVITY_STATE = "activity_state";
+ static final String MSG_KEY_KEY_EVENT = "key_event";
+
+ private List<Messenger> mClients = new ArrayList<>();
+ private ClusterDisplayProvider mDisplayProvider;
+ private int mDisplayId = NO_DISPLAY;
+ private final IBinder mLocalBinder = new Messenger(new MessageHandler(this)).getBinder();
+
+ private final DisplayListener mDisplayListener = new DisplayListener() {
+ @Override
+ public void onDisplayAdded(int displayId) {
+ Log.i(TAG, "Cluster display found, displayId: " + displayId);
+ mDisplayId = displayId;
+ launchMainActivity();
+ }
+
+ @Override
+ public void onDisplayRemoved(int displayId) {
+ Log.w(TAG, "Cluster display has been removed");
+ }
+
+ @Override
+ public void onDisplayChanged(int displayId) {
+
+ }
+ };
+
+ private static class MessageHandler extends Handler {
+ private final WeakReference<ClusterRenderingServiceImpl> mService;
+
+ MessageHandler(ClusterRenderingServiceImpl service) {
+ mService = new WeakReference<>(service);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ Log.d(TAG, "handleMessage: " + msg.what);
+ try {
+ switch (msg.what) {
+ case MSG_SET_ACTIVITY_LAUNCH_OPTIONS: {
+ int displayId = msg.getData().getInt(MSG_KEY_ACTIVITY_DISPLAY_ID);
+ Bundle state = msg.getData().getBundle(MSG_KEY_ACTIVITY_STATE);
+ String category = msg.getData().getString(MSG_KEY_CATEGORY);
+ ActivityOptions options = displayId != Display.INVALID_DISPLAY
+ ? ActivityOptions.makeBasic().setLaunchDisplayId(displayId)
+ : null;
+ mService.get().setClusterActivityLaunchOptions(category, options);
+ Log.d(TAG, String.format("activity options set: %s = %s (displayeId: %d)",
+ category, options, options.getLaunchDisplayId()));
+ mService.get().setClusterActivityState(category, state);
+ Log.d(TAG, String.format("activity state set: %s = %s", category, state));
+ break;
+ }
+ case MSG_REGISTER_CLIENT:
+ mService.get().mClients.add(msg.replyTo);
+ break;
+ case MSG_UNREGISTER_CLIENT:
+ mService.get().mClients.remove(msg.replyTo);
+ break;
+ default:
+ super.handleMessage(msg);
+ }
+ } catch (CarNotConnectedException ex) {
+ Log.e(TAG, "Unable to execute message " + msg.what, ex);
+ }
+ }
+ }
+
+ @Override
+ public IBinder onBind(Intent intent) {
+ Log.d(TAG, "onBind, intent: " + intent);
+ return LOCAL_BINDING_ACTION.equals(intent.getAction())
+ ? mLocalBinder
+ : super.onBind(intent);
+ }
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ Log.d(TAG, "onCreate");
+ mDisplayProvider = new ClusterDisplayProvider(this, mDisplayListener);
+ }
+
+ private void launchMainActivity() {
+ ActivityOptions options = ActivityOptions.makeBasic();
+ options.setLaunchDisplayId(mDisplayId);
+ Intent intent = new Intent(this, MainClusterActivity.class);
+ intent.setFlags(FLAG_ACTIVITY_NEW_TASK);
+ startActivityAsUser(intent, options.toBundle(), UserHandle.SYSTEM);
+ Log.i(TAG, String.format("launching main activity: %s (display: %d)", intent, mDisplayId));
+ }
+
+ @Override
+ public void onKeyEvent(KeyEvent keyEvent) {
+ Log.d(TAG, "onKeyEvent, keyEvent: " + keyEvent);
+ Bundle data = new Bundle();
+ data.putParcelable(MSG_KEY_KEY_EVENT, keyEvent);
+ broadcastClientMessage(MSG_ON_KEY_EVENT, data);
+ }
+
+ /**
+ * Broadcasts a message to all the registered service clients
+ *
+ * @param what event identifier
+ * @param data event data
+ */
+ private void broadcastClientMessage(int what, Bundle data) {
+ Log.d(TAG, "broadcast message " + what + " to " + mClients.size() + " clients");
+ for (int i = mClients.size() - 1; i >= 0; i--) {
+ Messenger client = mClients.get(i);
+ try {
+ Message msg = Message.obtain(null, what);
+ msg.setData(data);
+ client.send(msg);
+ } catch (RemoteException ex) {
+ Log.e(TAG, "Client " + i + " is dead", ex);
+ mClients.remove(i);
+ }
+ }
+ }
+
+ @Override
+ public NavigationRenderer getNavigationRenderer() {
+ NavigationRenderer navigationRenderer = new NavigationRenderer() {
+ @Override
+ public CarNavigationInstrumentCluster getNavigationProperties() {
+ CarNavigationInstrumentCluster config =
+ CarNavigationInstrumentCluster.createCluster(1000);
+ Log.d(TAG, "getNavigationProperties, returns: " + config);
+ return config;
+ }
+
+ @Override
+ public void onEvent(int eventType, Bundle bundle) {
+ try {
+ StringBuilder bundleSummary = new StringBuilder();
+ if (eventType == NAV_STATE_EVENT_ID) {
+ bundle.setClassLoader(ParcelUtils.class.getClassLoader());
+ NavigationState navState = NavigationState
+ .fromParcelable(bundle.getParcelable(NAV_STATE_BUNDLE_KEY));
+ bundleSummary.append(navState.toString());
+
+ // Update clients
+ broadcastClientMessage(MSG_ON_NAVIGATION_STATE_CHANGED, bundle);
+ } else {
+ for (String key : bundle.keySet()) {
+ bundleSummary.append(key);
+ bundleSummary.append("=");
+ bundleSummary.append(bundle.get(key));
+ bundleSummary.append(" ");
+ }
+ }
+ Log.d(TAG, "onEvent(" + eventType + ", " + bundleSummary + ")");
+ } catch (Exception e) {
+ Log.e(TAG, "Error parsing event data (" + eventType + ", " + bundle + ")", e);
+ bundle.putParcelable(NAV_STATE_BUNDLE_KEY, new NavigationState.Builder().build()
+ .toParcelable());
+ broadcastClientMessage(MSG_ON_NAVIGATION_STATE_CHANGED, bundle);
+ }
+ }
+ };
+
+ Log.i(TAG, "createNavigationRenderer, returns: " + navigationRenderer);
+ return navigationRenderer;
+ }
+
+ @Override
+ protected void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
+ if (args != null && args.length > 0) {
+ execShellCommand(args);
+ } else {
+ super.dump(fd, writer, args);
+ writer.println("DisplayProvider: " + mDisplayProvider);
+ }
+ }
+
+ private void emulateKeyEvent(int keyCode) {
+ Log.i(TAG, "emulateKeyEvent, keyCode: " + keyCode);
+ long downTime = SystemClock.uptimeMillis();
+ long eventTime = SystemClock.uptimeMillis();
+ KeyEvent event = obtainKeyEvent(keyCode, downTime, eventTime, KeyEvent.ACTION_DOWN);
+ onKeyEvent(event);
+
+ eventTime = SystemClock.uptimeMillis();
+ event = obtainKeyEvent(keyCode, downTime, eventTime, KeyEvent.ACTION_UP);
+ onKeyEvent(event);
+ }
+
+ private KeyEvent obtainKeyEvent(int keyCode, long downTime, long eventTime, int action) {
+ int scanCode = 0;
+ if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {
+ scanCode = 108;
+ } else if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {
+ scanCode = 106;
+ }
+ return KeyEvent.obtain(
+ downTime,
+ eventTime,
+ action,
+ keyCode,
+ 0 /* repeat */,
+ 0 /* meta state */,
+ 0 /* deviceId*/,
+ scanCode /* scancode */,
+ KeyEvent.FLAG_FROM_SYSTEM /* flags */,
+ InputDevice.SOURCE_KEYBOARD,
+ null /* characters */);
+ }
+
+ private void execShellCommand(String[] args) {
+ Log.i(TAG, "execShellCommand, args: " + Arrays.toString(args));
+
+ String command = args[0];
+
+ switch (command) {
+ case "injectKey": {
+ if (args.length > 1) {
+ emulateKeyEvent(parseInt(args[1]));
+ } else {
+ Log.i(TAG, "Not enough arguments");
+ }
+ break;
+ }
+ case "destroyOverlayDisplay": {
+ Settings.Global.putString(getContentResolver(),
+ Global.OVERLAY_DISPLAY_DEVICES, "");
+ break;
+ }
+
+ case "createOverlayDisplay": {
+ if (args.length > 1) {
+ Settings.Global.putString(getContentResolver(),
+ Global.OVERLAY_DISPLAY_DEVICES, args[1]);
+ } else {
+ Log.i(TAG, "Not enough arguments, expected 2");
+ }
+ break;
+ }
+
+ case "setUnobscuredArea": {
+ if (args.length > 5) {
+ Rect unobscuredArea = new Rect(parseInt(args[2]), parseInt(args[3]),
+ parseInt(args[4]), parseInt(args[5]));
+ try {
+ setClusterActivityState(args[1],
+ ClusterActivityState.create(true, unobscuredArea).toBundle());
+ } catch (CarNotConnectedException e) {
+ Log.i(TAG, "Failed to set activity state.", e);
+ }
+ } else {
+ Log.i(TAG, "wrong format, expected: category left top right bottom");
+ }
+ }
+ }
+ }
+}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/ClusterViewModel.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/ClusterViewModel.java
new file mode 100644
index 0000000..2efe765
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/ClusterViewModel.java
@@ -0,0 +1,304 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.car.cluster.sample;
+
+import android.annotation.Nullable;
+import android.app.Application;
+import android.car.Car;
+import android.car.CarAppFocusManager;
+import android.car.CarNotConnectedException;
+import android.car.VehicleAreaType;
+import android.car.cluster.sample.sensors.Sensor;
+import android.car.cluster.sample.sensors.Sensors;
+import android.car.hardware.CarPropertyValue;
+import android.car.hardware.property.CarPropertyManager;
+import android.content.ComponentName;
+import android.content.ServiceConnection;
+import android.os.IBinder;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+import androidx.core.util.Preconditions;
+import androidx.lifecycle.AndroidViewModel;
+import androidx.lifecycle.LiveData;
+import androidx.lifecycle.MutableLiveData;
+import androidx.lifecycle.Transformations;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * {@link AndroidViewModel} for cluster information.
+ */
+public class ClusterViewModel extends AndroidViewModel {
+ private static final String TAG = "Cluster.ViewModel";
+
+ private static final int PROPERTIES_REFRESH_RATE_UI = 5;
+
+ public enum NavigationActivityState {
+ /** No activity has been selected to be displayed on the navigation fragment yet */
+ NOT_SELECTED,
+ /** An activity has been selected, but it is not yet visible to the user */
+ LOADING,
+ /** Navigation activity is visible to the user */
+ VISIBLE,
+ }
+
+ private ComponentName mFreeNavigationActivity;
+ private ComponentName mCurrentNavigationActivity;
+ private final MutableLiveData<NavigationActivityState> mNavigationActivityStateLiveData =
+ new MutableLiveData<>();
+ private final MutableLiveData<Boolean> mNavigationFocus = new MutableLiveData<>(false);
+ private Car mCar;
+ private CarAppFocusManager mCarAppFocusManager;
+ private CarPropertyManager mCarPropertyManager;
+ private Map<Sensor<?>, MutableLiveData<?>> mSensorLiveDatas = new HashMap<>();
+
+ private ServiceConnection mCarServiceConnection = new ServiceConnection() {
+ @Override
+ public void onServiceConnected(ComponentName name, IBinder service) {
+ try {
+ Log.i(TAG, "onServiceConnected, name: " + name + ", service: " + service);
+
+ registerAppFocusListener();
+ registerCarPropertiesListener();
+ } catch (CarNotConnectedException e) {
+ Log.e(TAG, "onServiceConnected: error obtaining manager", e);
+ }
+ }
+
+ @Override
+ public void onServiceDisconnected(ComponentName name) {
+ Log.i(TAG, "onServiceDisconnected, name: " + name);
+ mCarAppFocusManager = null;
+ mCarPropertyManager = null;
+ }
+ };
+
+ private void registerAppFocusListener() throws CarNotConnectedException {
+ mCarAppFocusManager = (CarAppFocusManager) mCar.getCarManager(
+ Car.APP_FOCUS_SERVICE);
+ if (mCarAppFocusManager != null) {
+ mCarAppFocusManager.addFocusListener(
+ (appType, active) -> setNavigationFocus(active),
+ CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION);
+ } else {
+ Log.e(TAG, "onServiceConnected: unable to obtain CarAppFocusManager");
+ }
+ }
+
+ private void registerCarPropertiesListener() throws CarNotConnectedException {
+ Sensors sensors = Sensors.getInstance();
+ mCarPropertyManager = (CarPropertyManager) mCar.getCarManager(Car.PROPERTY_SERVICE);
+ for (Integer propertyId : sensors.getPropertyIds()) {
+ try {
+ mCarPropertyManager.registerListener(mCarPropertyEventListener,
+ propertyId, PROPERTIES_REFRESH_RATE_UI);
+ } catch (SecurityException ex) {
+ Log.e(TAG, "onServiceConnected: Unable to listen to car property: " + propertyId
+ + " sensors: " + sensors.getSensorsForPropertyId(propertyId), ex);
+ }
+ }
+ }
+
+
+ private CarPropertyManager.CarPropertyEventListener mCarPropertyEventListener =
+ new CarPropertyManager.CarPropertyEventListener() {
+ @Override
+ public void onChangeEvent(CarPropertyValue value) {
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "CarProperty change: property " + value.getPropertyId() + ", area"
+ + value.getAreaId() + ", value: " + value.getValue());
+ }
+ for (Sensor<?> sensorId : Sensors.getInstance()
+ .getSensorsForPropertyId(value.getPropertyId())) {
+ if (sensorId.mAreaId == Sensors.GLOBAL_AREA_ID
+ || (sensorId.mAreaId & value.getAreaId()) != 0) {
+ setSensorValue(sensorId, value);
+ }
+ }
+ }
+
+ @Override
+ public void onErrorEvent(int propId, int zone) {
+ for (Sensor<?> sensorId : Sensors.getInstance().getSensorsForPropertyId(propId)) {
+ if (sensorId.mAreaId == VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL
+ || (sensorId.mAreaId & zone) != 0) {
+ setSensorValue(sensorId, null);
+ }
+ }
+ }
+
+ private <T> void setSensorValue(Sensor<T> id, CarPropertyValue<?> value) {
+ T newValue = value != null ? id.mAdapter.apply(value) : null;
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "Sensor " + id.mName + " = " + newValue);
+ }
+ getSensorMutableLiveData(id).setValue(newValue);
+ }
+ };
+
+ /**
+ * New {@link ClusterViewModel} instance
+ */
+ public ClusterViewModel(@NonNull Application application) {
+ super(application);
+ mCar = Car.createCar(application, mCarServiceConnection);
+ mCar.connect();
+ }
+
+ @Override
+ protected void onCleared() {
+ super.onCleared();
+ mCar.disconnect();
+ mCar = null;
+ mCarAppFocusManager = null;
+ mCarPropertyManager = null;
+ }
+
+ /**
+ * Returns a {@link LiveData} providing the current state of the activity displayed on the
+ * navigation fragment.
+ */
+ public LiveData<NavigationActivityState> getNavigationActivityState() {
+ return mNavigationActivityStateLiveData;
+ }
+
+ /**
+ * Returns a {@link LiveData} indicating whether navigation focus is currently being granted
+ * or not. This indicates whether a navigation application is currently providing driving
+ * directions.
+ */
+ public LiveData<Boolean> getNavigationFocus() {
+ return mNavigationFocus;
+ }
+
+ /**
+ * Returns a {@link LiveData} that tracks the value of a given car sensor. Each sensor has its
+ * own data type. The list of all supported sensors can be found at {@link Sensors}
+ *
+ * @param sensor sensor to observe
+ * @param <T> data type of such sensor
+ */
+ @SuppressWarnings("unchecked")
+ @NonNull
+ public <T> LiveData<T> getSensor(@NonNull Sensor<T> sensor) {
+ return getSensorMutableLiveData(Preconditions.checkNotNull(sensor));
+ }
+
+ /**
+ * Returns the current value of the sensor, directly from the VHAL.
+ *
+ * @param sensor sensor to read
+ * @param <V> VHAL data type
+ * @param <T> data type of such sensor
+ */
+ @Nullable
+ public <T> T getSensorValue(@NonNull Sensor<T> sensor) {
+ try {
+ CarPropertyValue<?> value = mCarPropertyManager
+ .getProperty(sensor.mPropertyId, sensor.mAreaId);
+ return sensor.mAdapter.apply(value);
+ } catch (CarNotConnectedException ex) {
+ Log.e(TAG, "We got disconnected from Car Service", ex);
+ return null;
+ }
+ }
+
+ /**
+ * Returns a {@link LiveData} that tracks the fuel level in a range from 0.0 to 1.0.
+ */
+ public LiveData<Float> getFuelLevel() {
+ return Transformations.map(getSensor(Sensors.SENSOR_FUEL), (fuelValue) -> {
+ Float fuelCapacityValue = getSensorValue(Sensors.SENSOR_FUEL_CAPACITY);
+ if (fuelValue == null || fuelCapacityValue == null || fuelCapacityValue == 0) {
+ return null;
+ }
+ if (fuelValue < 0.0f) {
+ return 0.0f;
+ }
+ if (fuelValue > fuelCapacityValue) {
+ return 1.0f;
+ }
+ return fuelValue / fuelCapacityValue;
+ });
+ }
+
+ /**
+ * Sets the activity selected to be displayed on the cluster when no driving directions are
+ * being provided.
+ */
+ public void setFreeNavigationActivity(ComponentName activity) {
+ if (!Objects.equals(activity, mFreeNavigationActivity)) {
+ mFreeNavigationActivity = activity;
+ updateNavigationActivityLiveData();
+ }
+ }
+
+ /**
+ * Sets the activity currently being displayed on the cluster.
+ */
+ public void setCurrentNavigationActivity(ComponentName activity) {
+ if (!Objects.equals(activity, mCurrentNavigationActivity)) {
+ mCurrentNavigationActivity = activity;
+ updateNavigationActivityLiveData();
+ }
+ }
+
+ /**
+ * Sets whether navigation focus is currently being granted or not.
+ */
+ public void setNavigationFocus(boolean navigationFocus) {
+ if (mNavigationFocus.getValue() == null || mNavigationFocus.getValue() != navigationFocus) {
+ mNavigationFocus.setValue(navigationFocus);
+ updateNavigationActivityLiveData();
+ }
+ }
+
+ private void updateNavigationActivityLiveData() {
+ NavigationActivityState newState = calculateNavigationActivityState();
+ if (newState != mNavigationActivityStateLiveData.getValue()) {
+ mNavigationActivityStateLiveData.setValue(newState);
+ }
+ }
+
+ private NavigationActivityState calculateNavigationActivityState() {
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, String.format("Current state: current activity = '%s', free nav activity = "
+ + "'%s', focus = %s", mCurrentNavigationActivity,
+ mFreeNavigationActivity,
+ mNavigationFocus.getValue()));
+ }
+ if (mNavigationFocus.getValue() != null && mNavigationFocus.getValue()) {
+ // Car service controls which activity is displayed while driving, so we assume this
+ // has already been taken care of.
+ return NavigationActivityState.VISIBLE;
+ } else if (mFreeNavigationActivity == null) {
+ return NavigationActivityState.NOT_SELECTED;
+ } else if (Objects.equals(mFreeNavigationActivity, mCurrentNavigationActivity)) {
+ return NavigationActivityState.VISIBLE;
+ } else {
+ return NavigationActivityState.LOADING;
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ private <T> MutableLiveData<T> getSensorMutableLiveData(Sensor<T> sensor) {
+ return (MutableLiveData<T>) mSensorLiveDatas
+ .computeIfAbsent(sensor, x -> new MutableLiveData<>());
+ }
+}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/CueView.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/CueView.java
new file mode 100644
index 0000000..4dc8116
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/CueView.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.car.cluster.sample;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.text.SpannableStringBuilder;
+import android.text.style.ImageSpan;
+import android.util.AttributeSet;
+import android.widget.TextView;
+
+import androidx.car.cluster.navigation.RichText;
+import androidx.car.cluster.navigation.RichTextElement;
+
+/**
+ * View component that displays the Cue information on the instrument cluster display
+ */
+public class CueView extends TextView {
+ public CueView(Context context) {
+ super(context);
+ }
+
+ public CueView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public CueView(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ }
+
+ public void setRichText(RichText richText) {
+ if (richText == null) {
+ setText(null);
+ return;
+ }
+
+ SpannableStringBuilder builder = new SpannableStringBuilder();
+ for (RichTextElement textElement : richText.getElements()) {
+ if (!textElement.getText().equals("")) {
+ builder.append(textElement.getText());
+ } else if (textElement.getImage() != null) {
+ builder.append(" ");
+
+ Bitmap bitmap = ImageResolver.getInstance().getBitmap(mContext,
+ textElement.getImage());
+
+ if (bitmap != null) {
+ bitmap = Bitmap.createScaledBitmap(bitmap,
+ (int) (((float) getLineHeight() / bitmap.getHeight())
+ * bitmap.getWidth()),
+ getLineHeight(),
+ true);
+
+ int index = builder.length() - 1;
+ builder.setSpan(new ImageSpan(mContext, bitmap), index, index + 1, 0);
+ }
+ }
+ }
+
+ setText(builder);
+ }
+}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/ImageResolver.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/ImageResolver.java
new file mode 100644
index 0000000..b7fd0c1
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/ImageResolver.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.car.cluster.sample;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.net.Uri;
+import android.os.ParcelFileDescriptor;
+import android.util.Log;
+
+import androidx.annotation.Nullable;
+import androidx.car.cluster.navigation.ImageReference;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+
+
+/**
+ * Class for retrieving bitmap images from a ContentProvider
+ */
+public class ImageResolver {
+ private static final String TAG = "ImageResolver";
+
+ private static ImageResolver sImageResolver = new ImageResolver();
+
+ private ImageResolver() {}
+
+ public static ImageResolver getInstance() {
+ return sImageResolver;
+ }
+
+ /**
+ * Returns a bitmap from an URI string from a content provider
+ *
+ * @param context View context
+ */
+ @Nullable
+ protected static Bitmap getBitmap(Context context, String uriString) {
+ Uri uri = Uri.parse(uriString);
+ try {
+ ContentResolver contentResolver = context.getContentResolver();
+ ParcelFileDescriptor fileDesc = contentResolver.openFileDescriptor(uri, "r");
+ if (fileDesc != null) {
+ Bitmap bitmap = BitmapFactory.decodeFileDescriptor(fileDesc.getFileDescriptor());
+ fileDesc.close();
+ return bitmap;
+ } else {
+ Log.e(TAG, "Null pointer: Failed to create pipe for uri string: " + uriString);
+ }
+ } catch (FileNotFoundException e) {
+ Log.e(TAG, "File not found for uri string: " + uriString, e);
+ } catch (IOException e) {
+ Log.e(TAG, "File descriptor could not close: ", e);
+ }
+
+ return null;
+ }
+
+ /**
+ * Returns a bitmap from a Car Instrument Cluster {@link ImageReference}
+ *
+ * @param context View context
+ */
+ @Nullable
+ protected static Bitmap getBitmap(Context context, ImageReference img) {
+ String uriString = img.getRawContentUri();
+ return getBitmap(context, uriString);
+ }
+}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/LaneView.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/LaneView.java
new file mode 100644
index 0000000..6e86b92
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/LaneView.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.car.cluster.sample;
+
+import android.annotation.Nullable;
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.PorterDuff;
+import android.graphics.PorterDuffColorFilter;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.VectorDrawable;
+import android.util.AttributeSet;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+
+import androidx.car.cluster.navigation.Lane;
+import androidx.car.cluster.navigation.LaneDirection;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * View component that displays the Lane preview information on the instrument cluster display
+ */
+public class LaneView extends LinearLayout {
+ private ArrayList<Lane> mLanes;
+
+ private final int mWidth = (int) getResources().getDimension(R.dimen.lane_width);
+ private final int mHeight = (int) getResources().getDimension(R.dimen.lane_height);
+
+ public LaneView(Context context) {
+ super(context);
+ }
+
+ public LaneView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public LaneView(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ }
+
+ public void setLanes(List<Lane> lanes) {
+ mLanes = new ArrayList<>(lanes);
+ removeAllViews();
+
+ for (Lane lane : mLanes) {
+ Bitmap bitmap = combineBitmapFromLane(lane);
+ ImageView imgView = new ImageView(getContext());
+ imgView.setImageBitmap(bitmap);
+ imgView.setAdjustViewBounds(true);
+ addView(imgView);
+ }
+ }
+
+ private Bitmap combineBitmapFromLane(Lane lane) {
+ if (lane.getDirections().isEmpty()) {
+ return null;
+ }
+
+ Bitmap bitmap = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888);
+ Canvas canvas = new Canvas(bitmap);
+
+ for (LaneDirection laneDir : lane.getDirections()) {
+ if (!laneDir.isHighlighted()) {
+ drawToCanvas(laneDir, canvas, false);
+ }
+ }
+
+ for (LaneDirection laneDir : lane.getDirections()) {
+ if (laneDir.isHighlighted()) {
+ drawToCanvas(laneDir, canvas, true);
+ }
+ }
+
+ return bitmap;
+ }
+
+
+ private void drawToCanvas(LaneDirection laneDir, Canvas canvas, boolean isHighlighted) {
+ VectorDrawable icon = (VectorDrawable) getLaneIcon(laneDir);
+ icon.setBounds(0, 0, mWidth, mHeight);
+ icon.setColorFilter(new PorterDuffColorFilter(isHighlighted
+ ? getContext().getColor(R.color.laneDirectionHighlighted)
+ : getContext().getColor(R.color.laneDirection),
+ PorterDuff.Mode.SRC_ATOP));
+ icon.draw(canvas);
+ }
+
+ private Drawable getLaneIcon(@Nullable LaneDirection laneDir) {
+ if (laneDir == null) {
+ return null;
+ }
+ switch (laneDir.getShape()) {
+ case UNKNOWN:
+ return null;
+ case STRAIGHT:
+ return mContext.getDrawable(R.drawable.direction_continue);
+ case SLIGHT_LEFT:
+ return mContext.getDrawable(R.drawable.direction_turn_slight_left);
+ case SLIGHT_RIGHT:
+ return mContext.getDrawable(R.drawable.direction_turn_slight_right);
+ case NORMAL_LEFT:
+ return mContext.getDrawable(R.drawable.direction_turn_left);
+ case NORMAL_RIGHT:
+ return mContext.getDrawable(R.drawable.direction_turn_right);
+ case SHARP_LEFT:
+ return mContext.getDrawable(R.drawable.direction_turn_sharp_left);
+ case SHARP_RIGHT:
+ return mContext.getDrawable(R.drawable.direction_turn_sharp_right);
+ case U_TURN_LEFT:
+ return mContext.getDrawable(R.drawable.direction_uturn);
+ case U_TURN_RIGHT:
+ return mContext.getDrawable(R.drawable.direction_uturn_right);
+ }
+ return null;
+ }
+}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/MainClusterActivity.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/MainClusterActivity.java
index ae1d7a0..f8e8cbc 100644
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/MainClusterActivity.java
+++ b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/MainClusterActivity.java
@@ -15,101 +15,298 @@
*/
package android.car.cluster.sample;
-import static android.car.cluster.sample.SampleClusterServiceImpl.LOCAL_BINDING_ACTION;
+import static android.car.cluster.sample.ClusterRenderingServiceImpl.LOCAL_BINDING_ACTION;
+import static android.car.cluster.sample.ClusterRenderingServiceImpl.MSG_KEY_ACTIVITY_DISPLAY_ID;
+import static android.car.cluster.sample.ClusterRenderingServiceImpl.MSG_KEY_ACTIVITY_STATE;
+import static android.car.cluster.sample.ClusterRenderingServiceImpl.MSG_KEY_CATEGORY;
+import static android.car.cluster.sample.ClusterRenderingServiceImpl.MSG_KEY_KEY_EVENT;
+import static android.car.cluster.sample.ClusterRenderingServiceImpl.MSG_ON_KEY_EVENT;
+import static android.car.cluster.sample.ClusterRenderingServiceImpl
+ .MSG_ON_NAVIGATION_STATE_CHANGED;
+import static android.car.cluster.sample.ClusterRenderingServiceImpl.MSG_REGISTER_CLIENT;
+import static android.car.cluster.sample.ClusterRenderingServiceImpl
+ .MSG_SET_ACTIVITY_LAUNCH_OPTIONS;
+import static android.car.cluster.sample.ClusterRenderingServiceImpl.MSG_UNREGISTER_CLIENT;
+import static android.content.Intent.ACTION_USER_SWITCHED;
+import static android.content.Intent.ACTION_USER_UNLOCKED;
-import android.car.cluster.sample.SampleClusterServiceImpl.Listener;
+import android.app.ActivityManager;
+import android.app.ActivityOptions;
+import android.car.Car;
+import android.car.cluster.ClusterActivityState;
+import android.car.cluster.sample.sensors.Sensors;
+import android.content.ActivityNotFoundException;
+import android.content.BroadcastReceiver;
import android.content.ComponentName;
+import android.content.Context;
import android.content.Intent;
+import android.content.IntentFilter;
import android.content.ServiceConnection;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.graphics.Rect;
import android.os.Bundle;
+import android.os.Handler;
import android.os.IBinder;
+import android.os.Message;
+import android.os.Messenger;
+import android.os.RemoteException;
+import android.os.UserHandle;
import android.util.Log;
import android.util.SparseArray;
+import android.view.Display;
import android.view.InputDevice;
import android.view.KeyEvent;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
+import android.widget.TextView;
+import androidx.car.cluster.navigation.NavigationState;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;
+import androidx.lifecycle.LiveData;
+import androidx.lifecycle.ViewModelProviders;
+import androidx.versionedparcelable.ParcelUtils;
import androidx.viewpager.widget.ViewPager;
+import java.lang.ref.WeakReference;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
-public class MainClusterActivity extends FragmentActivity
- implements Listener {
- private static final String TAG = MainClusterActivity.class.getSimpleName();
+/**
+ * Main activity displayed on the instrument cluster. This activity contains fragments for each of
+ * the cluster "facets" (e.g.: navigation, communication, media and car state). Users can navigate
+ * to each facet by using the steering wheel buttons.
+ * <p>
+ * This activity runs on "system user" (see {@link UserHandle#USER_SYSTEM}) but it is visible on
+ * all users (the same activity remains active even during user switch).
+ * <p>
+ * This activity also launches a default navigation app inside a virtual display (which is located
+ * inside {@link NavigationFragment}). This navigation app is launched when:
+ * <ul>
+ * <li>Virtual display for navigation apps is ready.
+ * <li>After every user switch.
+ * </ul>
+ * This is necessary because the navigation app runs under a normal user, and different users will
+ * see different instances of the same application, with their own personalized data.
+ */
+public class MainClusterActivity extends FragmentActivity {
+ private static final String TAG = "Cluster.MainActivity";
+
+ private static final NavigationState NULL_NAV_STATE = new NavigationState.Builder().build();
+ private static final int NO_DISPLAY = -1;
private ViewPager mPager;
+ private NavStateController mNavStateController;
+ private ClusterViewModel mClusterViewModel;
- private SampleClusterServiceImpl mService;
-
- private HashMap<Button, Facet<?>> mButtonToFacet = new HashMap<>();
+ private Map<View, Facet<?>> mButtonToFacet = new HashMap<>();
private SparseArray<Facet<?>> mOrderToFacet = new SparseArray<>();
+ private Map<Sensors.Gear, View> mGearsToIcon = new HashMap<>();
private InputMethodManager mInputMethodManager;
+ private Messenger mService;
+ private Messenger mServiceCallbacks = new Messenger(new MessageHandler(this));
+ private VirtualDisplay mPendingVirtualDisplay = null;
+
+ private static final int NAVIGATION_ACTIVITY_RETRY_INTERVAL_MS = 1000;
+
+ private UserReceiver mUserReceiver;
+ private ActivityMonitor mActivityMonitor = new ActivityMonitor();
+ private final Handler mHandler = new Handler();
+ private final Runnable mRetryLaunchNavigationActivity = this::tryLaunchNavigationActivity;
+ private int mNavigationDisplayId = NO_DISPLAY;
+
+ /**
+ * Description of a virtual display
+ */
+ public static class VirtualDisplay {
+ /** Identifier of the display */
+ public final int mDisplayId;
+ /** Rectangular area inside this display that can be viewed without obstructions */
+ public final Rect mUnobscuredBounds;
+
+ public VirtualDisplay(int displayId, Rect unobscuredBounds) {
+ mDisplayId = displayId;
+ mUnobscuredBounds = unobscuredBounds;
+ }
+ }
private final View.OnFocusChangeListener mFacetButtonFocusListener =
new View.OnFocusChangeListener() {
+ @Override
+ public void onFocusChange(View v, boolean hasFocus) {
+ if (hasFocus) {
+ mPager.setCurrentItem(mButtonToFacet.get(v).order);
+ }
+ }
+ };
+
+ private ServiceConnection mClusterRenderingServiceConnection = new ServiceConnection() {
@Override
- public void onFocusChange(View v, boolean hasFocus) {
- if (hasFocus) {
- mPager.setCurrentItem(mButtonToFacet.get(v).order);
+ public void onServiceConnected(ComponentName name, IBinder service) {
+ Log.i(TAG, "onServiceConnected, name: " + name + ", service: " + service);
+ mService = new Messenger(service);
+ sendServiceMessage(MSG_REGISTER_CLIENT, null, mServiceCallbacks);
+ if (mPendingVirtualDisplay != null) {
+ // If haven't reported the virtual display yet, do so on service connect.
+ reportNavDisplay(mPendingVirtualDisplay);
+ mPendingVirtualDisplay = null;
}
}
+
+ @Override
+ public void onServiceDisconnected(ComponentName name) {
+ Log.i(TAG, "onServiceDisconnected, name: " + name);
+ mService = null;
+ onNavigationStateChange(NULL_NAV_STATE);
+ }
};
+ private static class MessageHandler extends Handler {
+ private final WeakReference<MainClusterActivity> mActivity;
+
+ MessageHandler(MainClusterActivity activity) {
+ mActivity = new WeakReference<>(activity);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ Bundle data = msg.getData();
+ switch (msg.what) {
+ case MSG_ON_KEY_EVENT:
+ KeyEvent event = data.getParcelable(MSG_KEY_KEY_EVENT);
+ if (event != null) {
+ mActivity.get().onKeyEvent(event);
+ }
+ break;
+ case MSG_ON_NAVIGATION_STATE_CHANGED:
+ if (data == null) {
+ mActivity.get().onNavigationStateChange(null);
+ } else {
+ data.setClassLoader(ParcelUtils.class.getClassLoader());
+ NavigationState navState = NavigationState
+ .fromParcelable(data.getParcelable(
+ ClusterRenderingServiceImpl.NAV_STATE_BUNDLE_KEY));
+ mActivity.get().onNavigationStateChange(navState);
+ }
+ break;
+ default:
+ super.handleMessage(msg);
+ }
+ }
+ }
+
+ private ActivityMonitor.ActivityListener mNavigationActivityMonitor = (displayId, activity) -> {
+ if (displayId != mNavigationDisplayId) {
+ return;
+ }
+ mClusterViewModel.setCurrentNavigationActivity(activity);
+ };
+
+ private static class UserReceiver extends BroadcastReceiver {
+ private WeakReference<MainClusterActivity> mActivity;
+
+ UserReceiver(MainClusterActivity activity) {
+ mActivity = new WeakReference<>(activity);
+ }
+
+ public void register(Context context) {
+ IntentFilter intentFilter = new IntentFilter(ACTION_USER_UNLOCKED);
+ intentFilter.addAction(ACTION_USER_SWITCHED);
+ context.registerReceiver(this, intentFilter);
+ }
+
+ public void unregister(Context context) {
+ context.unregisterReceiver(this);
+ }
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ MainClusterActivity activity = mActivity.get();
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "Broadcast received: " + intent);
+ }
+ activity.tryLaunchNavigationActivity();
+ }
+ }
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ Log.d(TAG, "onCreate");
setContentView(R.layout.activity_main);
mInputMethodManager = getSystemService(InputMethodManager.class);
- Intent intent = new Intent(this, SampleClusterServiceImpl.class);
+ Intent intent = new Intent(this, ClusterRenderingServiceImpl.class);
intent.setAction(LOCAL_BINDING_ACTION);
- bindService(intent,
- new ServiceConnection() {
- @Override
- public void onServiceConnected(ComponentName name, IBinder service) {
- Log.i(TAG, "onServiceConnected, name: " + name + ", service: " + service);
- mService = ((SampleClusterServiceImpl.LocalBinder) service)
- .getService();
- mService.registerListener(MainClusterActivity.this);
- }
+ bindServiceAsUser(intent, mClusterRenderingServiceConnection, 0, UserHandle.SYSTEM);
- @Override
- public void onServiceDisconnected(ComponentName name) {
- Log.i(TAG, "onServiceDisconnected, name: " + name);
- mService = null;
- }
- }, BIND_AUTO_CREATE);
-
- registerFacets(
- new Facet<>(findViewById(R.id.btn_nav), 0, NavigationFragment.class),
- new Facet<>(findViewById(R.id.btn_phone), 1, PhoneFragment.class),
- new Facet<>(findViewById(R.id.btn_music), 2, MusicFragment.class),
- new Facet<>(findViewById(R.id.btn_car_info), 3, CarInfoFragment.class));
+ registerFacet(new Facet<>(findViewById(R.id.btn_nav), 0, NavigationFragment.class));
+ registerFacet(new Facet<>(findViewById(R.id.btn_phone), 1, PhoneFragment.class));
+ registerFacet(new Facet<>(findViewById(R.id.btn_music), 2, MusicFragment.class));
+ registerFacet(new Facet<>(findViewById(R.id.btn_car_info), 3, CarInfoFragment.class));
+ registerGear(findViewById(R.id.gear_parked), Sensors.Gear.PARK);
+ registerGear(findViewById(R.id.gear_reverse), Sensors.Gear.REVERSE);
+ registerGear(findViewById(R.id.gear_neutral), Sensors.Gear.NEUTRAL);
+ registerGear(findViewById(R.id.gear_drive), Sensors.Gear.DRIVE);
mPager = findViewById(R.id.pager);
mPager.setAdapter(new ClusterPageAdapter(getSupportFragmentManager()));
mOrderToFacet.get(0).button.requestFocus();
+ mNavStateController = new NavStateController(findViewById(R.id.navigation_state));
+
+ mClusterViewModel = ViewModelProviders.of(this).get(ClusterViewModel.class);
+ mClusterViewModel.getNavigationFocus().observe(this, focus -> {
+ mNavStateController.setActive(focus);
+ // If focus is lost, we launch the default navigation activity again.
+ if (!focus) {
+ tryLaunchNavigationActivity();
+ }
+ });
+
+ mClusterViewModel.getSensor(Sensors.SENSOR_GEAR).observe(this, this::updateSelectedGear);
+
+ registerSensor(findViewById(R.id.info_fuel), mClusterViewModel.getFuelLevel());
+ registerSensor(findViewById(R.id.info_speed),
+ mClusterViewModel.getSensor(Sensors.SENSOR_SPEED));
+ registerSensor(findViewById(R.id.info_range),
+ mClusterViewModel.getSensor(Sensors.SENSOR_FUEL_RANGE));
+ registerSensor(findViewById(R.id.info_rpm),
+ mClusterViewModel.getSensor(Sensors.SENSOR_RPM));
+
+ mActivityMonitor.start();
+
+ mUserReceiver = new UserReceiver(this);
+ mUserReceiver.register(this);
+ }
+
+ private <V> void registerSensor(TextView textView, LiveData<V> source) {
+ String emptyValue = getString(R.string.info_value_empty);
+ source.observe(this, value -> textView.setText(value != null
+ ? value.toString() : emptyValue));
}
@Override
protected void onDestroy() {
super.onDestroy();
+ Log.d(TAG, "onDestroy");
+ mUserReceiver.unregister(this);
+ mActivityMonitor.stop();
if (mService != null) {
- mService.unregisterListener();
+ sendServiceMessage(MSG_UNREGISTER_CLIENT, null, mServiceCallbacks);
+ mService = null;
}
+ unbindService(mClusterRenderingServiceConnection);
}
- @Override
- public void onKeyEvent(KeyEvent event) {
+ private void onKeyEvent(KeyEvent event) {
Log.i(TAG, "onKeyEvent, event: " + event);
// This is a hack. We use SOURCE_CLASS_POINTER here because this type of input is associated
@@ -119,6 +316,55 @@
mInputMethodManager.dispatchKeyEventFromInputMethod(getCurrentFocus(), event);
}
+ private void onNavigationStateChange(NavigationState state) {
+ Log.d(TAG, "onNavigationStateChange: " + state);
+ if (mNavStateController != null) {
+ mNavStateController.update(state);
+ }
+ }
+
+ public void updateNavDisplay(VirtualDisplay virtualDisplay) {
+ // Starting the default navigation activity. This activity will be shown when navigation
+ // focus is not taken.
+ startNavigationActivity(virtualDisplay.mDisplayId);
+ // Notify the service (so it updates display properties on car service)
+ if (mService == null) {
+ // Service is not bound yet. Hold the information and notify when the service is bound.
+ mPendingVirtualDisplay = virtualDisplay;
+ return;
+ } else {
+ reportNavDisplay(virtualDisplay);
+ }
+ }
+
+ private void reportNavDisplay(VirtualDisplay virtualDisplay) {
+ Bundle data = new Bundle();
+ data.putString(MSG_KEY_CATEGORY, Car.CAR_CATEGORY_NAVIGATION);
+ data.putInt(MSG_KEY_ACTIVITY_DISPLAY_ID, virtualDisplay.mDisplayId);
+ data.putBundle(MSG_KEY_ACTIVITY_STATE, ClusterActivityState
+ .create(virtualDisplay.mDisplayId != Display.INVALID_DISPLAY,
+ virtualDisplay.mUnobscuredBounds)
+ .toBundle());
+ sendServiceMessage(MSG_SET_ACTIVITY_LAUNCH_OPTIONS, data, null);
+ }
+
+ /**
+ * Sends a message to the {@link ClusterRenderingServiceImpl}, which runs on a different
+ * process.
+ * @param what action to perform
+ * @param data action data
+ * @param replyTo {@link Messenger} where to reply back
+ */
+ private void sendServiceMessage(int what, Bundle data, Messenger replyTo) {
+ try {
+ Message message = Message.obtain(null, what);
+ message.setData(data);
+ message.replyTo = replyTo;
+ mService.send(message);
+ } catch (RemoteException ex) {
+ Log.e(TAG, "Unable to deliver message " + what + ". Service died");
+ }
+ }
public class ClusterPageAdapter extends FragmentPagerAdapter {
public ClusterPageAdapter(FragmentManager fm) {
@@ -136,12 +382,6 @@
}
}
- private void registerFacets(Facet<?>... facets) {
- for (Facet<?> f : facets) {
- registerFacet(f);
- }
- }
-
private <T> void registerFacet(Facet<T> facet) {
mOrderToFacet.append(facet.order, facet);
mButtonToFacet.put(facet.button, facet);
@@ -174,7 +414,105 @@
}
}
- SampleClusterServiceImpl getService() {
- return mService;
+ private void startNavigationActivity(int displayId) {
+ mActivityMonitor.removeListener(mNavigationDisplayId, mNavigationActivityMonitor);
+ mActivityMonitor.addListener(displayId, mNavigationActivityMonitor);
+ mNavigationDisplayId = displayId;
+ tryLaunchNavigationActivity();
+ }
+
+ /**
+ * Tries to start a default navigation activity in the cluster. During system initialization
+ * launching user activities might fail due the system not being ready or {@link PackageManager}
+ * not being able to resolve the implicit intent. It is also possible that the system doesn't
+ * have a default navigation activity selected yet.
+ */
+ private void tryLaunchNavigationActivity() {
+ if (mNavigationDisplayId == NO_DISPLAY) {
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, String.format("Launch activity ignored (no display yet)"));
+ }
+ // Not ready to launch yet.
+ return;
+ }
+ mHandler.removeCallbacks(mRetryLaunchNavigationActivity);
+
+ ComponentName navigationActivity = getNavigationActivity();
+ mClusterViewModel.setFreeNavigationActivity(navigationActivity);
+
+ try {
+ if (navigationActivity == null) {
+ throw new ActivityNotFoundException();
+ }
+ Intent intent = new Intent(Intent.ACTION_MAIN).addCategory(Car.CAR_CATEGORY_NAVIGATION)
+ .setPackage(navigationActivity.getPackageName())
+ .setComponent(navigationActivity)
+ .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ Log.d(TAG, "Launching: " + intent + " on display: " + mNavigationDisplayId);
+ Bundle activityOptions = ActivityOptions.makeBasic()
+ .setLaunchDisplayId(mNavigationDisplayId)
+ .toBundle();
+
+ startActivityAsUser(intent, activityOptions, UserHandle.CURRENT);
+ } catch (ActivityNotFoundException ex) {
+ // Some activities might not be available right on startup. We will retry.
+ mHandler.postDelayed(mRetryLaunchNavigationActivity,
+ NAVIGATION_ACTIVITY_RETRY_INTERVAL_MS);
+ } catch (Exception ex) {
+ Log.e(TAG, "Unable to start navigation activity: " + navigationActivity, ex);
+ }
+ }
+
+ /**
+ * Returns a default navigation activity to show in the cluster.
+ * In the current implementation we search for an activity with the
+ * {@link Car#CAR_CATEGORY_NAVIGATION} category from the same navigation app
+ * selected from CarLauncher (see CarLauncher#getMapsIntent()).
+ * Alternatively, other implementations could:
+ * <ul>
+ * <li>Read this package from a resource (having a OEM default activity to show)
+ * <li>Let the user select one from settings.
+ * </ul>
+ */
+ private ComponentName getNavigationActivity() {
+ PackageManager pm = getPackageManager();
+ int userId = ActivityManager.getCurrentUser();
+
+ // Get currently selected navigation app.
+ Intent intent = Intent.makeMainSelectorActivity(Intent.ACTION_MAIN,
+ Intent.CATEGORY_APP_MAPS);
+ ResolveInfo navigationApp = pm.resolveActivityAsUser(intent,
+ PackageManager.MATCH_DEFAULT_ONLY, userId);
+
+ // Get all possible cluster activities
+ intent = new Intent(Intent.ACTION_MAIN).addCategory(Car.CAR_CATEGORY_NAVIGATION);
+ List<ResolveInfo> candidates = pm.queryIntentActivitiesAsUser(intent, 0, userId);
+
+ // If there is a select navigation app, try finding a matching auxiliary navigation activity
+ if (navigationApp != null) {
+ for (ResolveInfo candidate : candidates) {
+ if (candidate.activityInfo.packageName.equals(navigationApp.activityInfo
+ .packageName)) {
+ Log.d(TAG, "Found activity: " + candidate);
+ return new ComponentName(candidate.activityInfo.packageName,
+ candidate.activityInfo.name);
+ }
+ }
+ }
+
+ // During initialization implicit intents might not provided a result. We will just
+ // retry until we find one, or we exhaust the retries.
+ Log.d(TAG, "No default activity found (it might not be available yet).");
+ return null;
+ }
+
+ private void registerGear(View view, Sensors.Gear gear) {
+ mGearsToIcon.put(gear, view);
+ }
+
+ private void updateSelectedGear(Sensors.Gear gear) {
+ for (Map.Entry<Sensors.Gear, View> entry : mGearsToIcon.entrySet()) {
+ entry.getValue().setSelected(entry.getKey() == gear);
+ }
}
}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/NavStateController.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/NavStateController.java
new file mode 100644
index 0000000..a301935
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/NavStateController.java
@@ -0,0 +1,237 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.car.cluster.sample;
+
+import android.annotation.Nullable;
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.util.Log;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.car.cluster.navigation.Distance;
+import androidx.car.cluster.navigation.Maneuver;
+import androidx.car.cluster.navigation.NavigationState;
+import androidx.car.cluster.navigation.Segment;
+import androidx.car.cluster.navigation.Step;
+
+/**
+ * View controller for navigation state rendering.
+ */
+public class NavStateController {
+ private static final String TAG = "Cluster.NavController";
+
+ private ImageView mManeuver;
+ private LaneView mLane;
+ private TextView mDistance;
+ private TextView mSegment;
+ private CueView mCue;
+ private Context mContext;
+ private View mNavigationState;
+
+ /**
+ * Creates a controller to coordinate updates to the views displaying navigation state
+ * data.
+ *
+ * @param container {@link View} containing the navigation state views
+ */
+ public NavStateController(View container) {
+ mNavigationState = container;
+ mManeuver = container.findViewById(R.id.maneuver);
+ mLane = container.findViewById(R.id.lane);
+ mDistance = container.findViewById(R.id.distance);
+ mSegment = container.findViewById(R.id.segment);
+ mCue = container.findViewById(R.id.cue);
+
+ mContext = container.getContext();
+ }
+
+ /**
+ * Updates views to reflect the provided navigation state
+ */
+ public void update(@Nullable NavigationState state) {
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "Updating nav state: " + state);
+ }
+ Step step = getImmediateStep(state);
+ mManeuver.setImageDrawable(getManeuverIcon(step != null ? step.getManeuver() : null));
+ mDistance.setText(formatDistance(step != null ? step.getDistance() : null));
+ mSegment.setText(getSegmentString(state.getCurrentSegment()));
+ mCue.setRichText(step != null ? step.getCue() : null);
+
+ if (step.getLanes().size() > 0) {
+ mLane.setLanes(step.getLanes());
+ mLane.setVisibility(View.VISIBLE);
+ } else {
+ mLane.setVisibility(View.GONE);
+ }
+ }
+
+ /**
+ * Updates whether turn-by-turn display is active or not. Turn-by-turn would be active whenever
+ * a navigation application has focus.
+ */
+ public void setActive(boolean active) {
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "Navigation status active: " + active);
+ }
+ if (!active) {
+ mManeuver.setImageDrawable(null);
+ mDistance.setText(null);
+ mLane.setVisibility(View.GONE);
+ mCue.setText(null);
+ mSegment.setText(null);
+ }
+ }
+
+ private String getSegmentString(Segment segment) {
+ if (segment != null) {
+ return segment.getName();
+ }
+
+ return null;
+ }
+
+ private Drawable getManeuverIcon(@Nullable Maneuver maneuver) {
+ if (maneuver == null) {
+ return null;
+ }
+ switch (maneuver.getType()) {
+ case UNKNOWN:
+ return null;
+ case DEPART:
+ return mContext.getDrawable(R.drawable.direction_depart);
+ case NAME_CHANGE:
+ return mContext.getDrawable(R.drawable.direction_new_name_straight);
+ case KEEP_LEFT:
+ return mContext.getDrawable(R.drawable.direction_continue_left);
+ case KEEP_RIGHT:
+ return mContext.getDrawable(R.drawable.direction_continue_right);
+ case TURN_SLIGHT_LEFT:
+ return mContext.getDrawable(R.drawable.direction_turn_slight_left);
+ case TURN_SLIGHT_RIGHT:
+ return mContext.getDrawable(R.drawable.direction_turn_slight_right);
+ case TURN_NORMAL_LEFT:
+ return mContext.getDrawable(R.drawable.direction_turn_left);
+ case TURN_NORMAL_RIGHT:
+ return mContext.getDrawable(R.drawable.direction_turn_right);
+ case TURN_SHARP_LEFT:
+ return mContext.getDrawable(R.drawable.direction_turn_sharp_left);
+ case TURN_SHARP_RIGHT:
+ return mContext.getDrawable(R.drawable.direction_turn_sharp_right);
+ case U_TURN_LEFT:
+ return mContext.getDrawable(R.drawable.direction_uturn);
+ case U_TURN_RIGHT:
+ return mContext.getDrawable(R.drawable.direction_uturn_right);
+ case ON_RAMP_SLIGHT_LEFT:
+ return mContext.getDrawable(R.drawable.direction_on_ramp_slight_left);
+ case ON_RAMP_SLIGHT_RIGHT:
+ return mContext.getDrawable(R.drawable.direction_on_ramp_slight_right);
+ case ON_RAMP_NORMAL_LEFT:
+ return mContext.getDrawable(R.drawable.direction_on_ramp_left);
+ case ON_RAMP_NORMAL_RIGHT:
+ return mContext.getDrawable(R.drawable.direction_on_ramp_right);
+ case ON_RAMP_SHARP_LEFT:
+ return mContext.getDrawable(R.drawable.direction_on_ramp_sharp_left);
+ case ON_RAMP_SHARP_RIGHT:
+ return mContext.getDrawable(R.drawable.direction_on_ramp_sharp_right);
+ case ON_RAMP_U_TURN_LEFT:
+ return mContext.getDrawable(R.drawable.direction_uturn);
+ case ON_RAMP_U_TURN_RIGHT:
+ return mContext.getDrawable(R.drawable.direction_uturn_right);
+ case OFF_RAMP_SLIGHT_LEFT:
+ return mContext.getDrawable(R.drawable.direction_off_ramp_slight_left);
+ case OFF_RAMP_SLIGHT_RIGHT:
+ return mContext.getDrawable(R.drawable.direction_off_ramp_slight_right);
+ case OFF_RAMP_NORMAL_LEFT:
+ return mContext.getDrawable(R.drawable.direction_off_ramp_left);
+ case OFF_RAMP_NORMAL_RIGHT:
+ return mContext.getDrawable(R.drawable.direction_off_ramp_right);
+ case FORK_LEFT:
+ return mContext.getDrawable(R.drawable.direction_fork_left);
+ case FORK_RIGHT:
+ return mContext.getDrawable(R.drawable.direction_fork_right);
+ case MERGE_LEFT:
+ return mContext.getDrawable(R.drawable.direction_merge_left);
+ case MERGE_RIGHT:
+ return mContext.getDrawable(R.drawable.direction_merge_right);
+ case ROUNDABOUT_ENTER:
+ return mContext.getDrawable(R.drawable.direction_roundabout);
+ case ROUNDABOUT_EXIT:
+ return mContext.getDrawable(R.drawable.direction_roundabout);
+ case ROUNDABOUT_ENTER_AND_EXIT_CW_SHARP_RIGHT:
+ return mContext.getDrawable(R.drawable.direction_roundabout_sharp_right);
+ case ROUNDABOUT_ENTER_AND_EXIT_CW_NORMAL_RIGHT:
+ return mContext.getDrawable(R.drawable.direction_roundabout_right);
+ case ROUNDABOUT_ENTER_AND_EXIT_CW_SLIGHT_RIGHT:
+ return mContext.getDrawable(R.drawable.direction_roundabout_slight_right);
+ case ROUNDABOUT_ENTER_AND_EXIT_CW_STRAIGHT:
+ return mContext.getDrawable(R.drawable.direction_roundabout_straight);
+ case ROUNDABOUT_ENTER_AND_EXIT_CW_SHARP_LEFT:
+ return mContext.getDrawable(R.drawable.direction_roundabout_sharp_left);
+ case ROUNDABOUT_ENTER_AND_EXIT_CW_NORMAL_LEFT:
+ return mContext.getDrawable(R.drawable.direction_roundabout_left);
+ case ROUNDABOUT_ENTER_AND_EXIT_CW_SLIGHT_LEFT:
+ return mContext.getDrawable(R.drawable.direction_roundabout_slight_left);
+ case ROUNDABOUT_ENTER_AND_EXIT_CW_U_TURN:
+ return mContext.getDrawable(R.drawable.direction_uturn_right);
+ case ROUNDABOUT_ENTER_AND_EXIT_CCW_SHARP_RIGHT:
+ return mContext.getDrawable(R.drawable.direction_roundabout_sharp_right);
+ case ROUNDABOUT_ENTER_AND_EXIT_CCW_NORMAL_RIGHT:
+ return mContext.getDrawable(R.drawable.direction_roundabout_right);
+ case ROUNDABOUT_ENTER_AND_EXIT_CCW_SLIGHT_RIGHT:
+ return mContext.getDrawable(R.drawable.direction_roundabout_slight_right);
+ case ROUNDABOUT_ENTER_AND_EXIT_CCW_STRAIGHT:
+ return mContext.getDrawable(R.drawable.direction_roundabout_straight);
+ case ROUNDABOUT_ENTER_AND_EXIT_CCW_SHARP_LEFT:
+ return mContext.getDrawable(R.drawable.direction_roundabout_sharp_left);
+ case ROUNDABOUT_ENTER_AND_EXIT_CCW_NORMAL_LEFT:
+ return mContext.getDrawable(R.drawable.direction_roundabout_left);
+ case ROUNDABOUT_ENTER_AND_EXIT_CCW_SLIGHT_LEFT:
+ return mContext.getDrawable(R.drawable.direction_roundabout_slight_left);
+ case ROUNDABOUT_ENTER_AND_EXIT_CCW_U_TURN:
+ return mContext.getDrawable(R.drawable.direction_uturn);
+ case STRAIGHT:
+ return mContext.getDrawable(R.drawable.direction_continue);
+ case FERRY_BOAT:
+ return mContext.getDrawable(R.drawable.direction_close);
+ case FERRY_TRAIN:
+ return mContext.getDrawable(R.drawable.direction_close);
+ case DESTINATION:
+ return mContext.getDrawable(R.drawable.direction_arrive);
+ case DESTINATION_STRAIGHT:
+ return mContext.getDrawable(R.drawable.direction_arrive_straight);
+ case DESTINATION_LEFT:
+ return mContext.getDrawable(R.drawable.direction_arrive_left);
+ case DESTINATION_RIGHT:
+ return mContext.getDrawable(R.drawable.direction_arrive_right);
+ }
+ return null;
+ }
+
+ private Step getImmediateStep(@Nullable NavigationState state) {
+ return state != null && state.getSteps().size() > 0 ? state.getSteps().get(0) : null;
+ }
+
+ private String formatDistance(@Nullable Distance distance) {
+ if (distance == null || distance.getDisplayUnit() == Distance.Unit.UNKNOWN) {
+ return null;
+ }
+ return String.format("In %s %s", distance.getDisplayValue(),
+ distance.getDisplayUnit().toString().toLowerCase());
+ }
+}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/NavigationFragment.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/NavigationFragment.java
index 3ca74e2..d35ba02 100644
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/NavigationFragment.java
+++ b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/NavigationFragment.java
@@ -15,11 +15,7 @@
*/
package android.car.cluster.sample;
-import static android.car.cluster.CarInstrumentClusterManager.CATEGORY_NAVIGATION;
-
-import android.app.ActivityOptions;
-import android.car.CarNotConnectedException;
-import android.car.cluster.ClusterActivityState;
+import android.content.Context;
import android.graphics.Rect;
import android.hardware.display.DisplayManager;
import android.hardware.display.DisplayManager.DisplayListener;
@@ -35,25 +31,36 @@
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;
+import android.widget.ProgressBar;
+import android.widget.TextView;
import androidx.fragment.app.Fragment;
+import androidx.lifecycle.ViewModelProvider;
+import androidx.lifecycle.ViewModelProviders;
public class NavigationFragment extends Fragment {
- private final static String TAG = "Cluster.NavigationFragment";
+ private static final String TAG = "Cluster.NavFragment";
private SurfaceView mSurfaceView;
private DisplayManager mDisplayManager;
private Rect mUnobscuredBounds;
+ private MainClusterActivity mMainClusterActivity;
+ private ClusterViewModel mViewModel;
+ private ProgressBar mProgressBar;
+ private TextView mMessage;
+
// Static because we want to keep alive this virtual display when navigating through
// ViewPager (this fragment gets dynamically destroyed and created)
private static VirtualDisplay mVirtualDisplay;
private static int mRegisteredNavDisplayId = Display.INVALID_DISPLAY;
+ private boolean mNavigationDisplayUpdatePending = false;
public NavigationFragment() {
// Required empty public constructor
}
+
private final DisplayListener mDisplayListener = new DisplayListener() {
@Override
public void onDisplayAdded(int displayId) {
@@ -62,33 +69,16 @@
+ ", navigation display id: " + navDisplayId);
if (navDisplayId == displayId) {
- try {
- getService().setClusterActivityLaunchOptions(
- CATEGORY_NAVIGATION,
- ActivityOptions.makeBasic()
- .setLaunchDisplayId(displayId));
- mRegisteredNavDisplayId = displayId;
-
- getService().setClusterActivityState(
- CATEGORY_NAVIGATION,
- ClusterActivityState.create(true, mUnobscuredBounds).toBundle());
- } catch (CarNotConnectedException e) {
- throw new IllegalStateException(
- "Failed to report nav activity cluster launch options", e);
- }
+ mRegisteredNavDisplayId = displayId;
+ updateNavigationDisplay();
}
}
@Override
public void onDisplayRemoved(int displayId) {
if (mRegisteredNavDisplayId == displayId) {
- try {
- mRegisteredNavDisplayId = Display.INVALID_DISPLAY;
- getService().setClusterActivityLaunchOptions(
- CATEGORY_NAVIGATION, null);
- } catch (CarNotConnectedException e) {
- // This can happen only during shutdown, ignore.
- }
+ mRegisteredNavDisplayId = Display.INVALID_DISPLAY;
+ updateNavigationDisplay();
}
}
@@ -96,10 +86,40 @@
public void onDisplayChanged(int displayId) {}
};
+ private void updateNavigationDisplay() {
+ if (mMainClusterActivity == null) {
+ // Not attached to the activity yet. Let's wait.
+ mNavigationDisplayUpdatePending = true;
+ return;
+ }
+
+ mNavigationDisplayUpdatePending = false;
+ mMainClusterActivity.updateNavDisplay(new MainClusterActivity.VirtualDisplay(
+ mRegisteredNavDisplayId, mUnobscuredBounds));
+ }
+
+ @Override
+ public void onAttach(Context context) {
+ super.onAttach(context);
+ mMainClusterActivity = (MainClusterActivity) context;
+ if (mNavigationDisplayUpdatePending) {
+ updateNavigationDisplay();
+ }
+ }
+
+ @Override
+ public void onDetach() {
+ mMainClusterActivity = null;
+ super.onDetach();
+ }
+
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Log.i(TAG, "onCreateView");
+ ViewModelProvider provider = ViewModelProviders.of(requireActivity());
+ mViewModel = provider.get(ClusterViewModel.class);
+
mDisplayManager = getActivity().getSystemService(DisplayManager.class);
mDisplayManager.registerDisplayListener(mDisplayListener, new Handler());
@@ -118,8 +138,17 @@
Log.i(TAG, "surfaceChanged, holder: " + holder + ", size:" + width + "x" + height
+ ", format:" + format);
- //Create dummy unobscured area to report to navigation activity.
- mUnobscuredBounds = new Rect(40, 0, width - 80, height - 40);
+ // Create dummy unobscured area to report to navigation activity.
+ int obscuredWidth = (int) getResources()
+ .getDimension(R.dimen.speedometer_overlap_width);
+ int obscuredHeight = (int) getResources()
+ .getDimension(R.dimen.navigation_gradient_height);
+ mUnobscuredBounds = new Rect(
+ obscuredWidth, /* left: size of gauge */
+ obscuredHeight, /* top: gradient */
+ width - obscuredWidth, /* right: size of the display - size of gauge */
+ height - obscuredHeight /* bottom: size of display - gradient */
+ );
if (mVirtualDisplay == null) {
mVirtualDisplay = createVirtualDisplay(holder.getSurface(), width, height);
@@ -136,6 +165,18 @@
mVirtualDisplay.setSurface(null);
}
});
+ mProgressBar = root.findViewById(R.id.progress_bar);
+ mMessage = root.findViewById(R.id.message);
+
+ mViewModel.getNavigationActivityState().observe(this, state -> {
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "State: " + state);
+ }
+ mProgressBar.setVisibility(state == ClusterViewModel.NavigationActivityState.LOADING
+ ? View.VISIBLE : View.INVISIBLE);
+ mMessage.setVisibility(state == ClusterViewModel.NavigationActivityState.NOT_SELECTED
+ ? View.VISIBLE : View.INVISIBLE);
+ });
return root;
}
@@ -153,10 +194,6 @@
Log.i(TAG, "onDestroy");
}
- private SampleClusterServiceImpl getService() {
- return ((MainClusterActivity) getActivity()).getService();
- }
-
private int getVirtualDisplayId() {
return (mVirtualDisplay != null && mVirtualDisplay.getDisplay() != null)
? mVirtualDisplay.getDisplay().getDisplayId() : Display.INVALID_DISPLAY;
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/NetworkedVirtualDisplay.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/NetworkedVirtualDisplay.java
index 5066162..871d93f 100644
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/NetworkedVirtualDisplay.java
+++ b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/NetworkedVirtualDisplay.java
@@ -38,6 +38,7 @@
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
+import java.io.RandomAccessFile;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.ByteBuffer;
@@ -46,10 +47,10 @@
/**
* This class encapsulates all work related to managing networked virtual display.
* <p>
- * It opens server socket and listens on port {@code PORT} for incoming connections. Once connection
- * is established it creates virtual display and media encoder and starts streaming video to that
- * socket. If the receiving part is disconnected, it will keep port open and virtual display won't
- * be destroyed.
+ * It opens a socket and listens on port {@code PORT} for connections, or the emulator pipe. Once
+ * connection is established it creates virtual display and media encoder and starts streaming video
+ * to that socket. If the receiving part is disconnected, it will keep port open and virtual
+ * display won't be destroyed.
*/
public class NetworkedVirtualDisplay {
private static final String TAG = "Cluster." + NetworkedVirtualDisplay.class.getSimpleName();
@@ -61,21 +62,29 @@
private final int mHeight;
private final int mDpi;
- private static final int PORT = 5151;
private static final int FPS = 25;
private static final int BITRATE = 6144000;
private static final String MEDIA_FORMAT_MIMETYPE = MediaFormat.MIMETYPE_VIDEO_AVC;
- private static final int MSG_START = 0;
- private static final int MSG_STOP = 1;
- private static final int MSG_RESUBMIT_FRAME = 2;
+ public static final int MSG_START = 0;
+ public static final int MSG_STOP = 1;
+ public static final int MSG_SEND_FRAME = 2;
+
+ private static final String PIPE_NAME = "pipe:qemud:carCluster";
+ private static final String PIPE_DEVICE = "/dev/qemu_pipe";
+
+ // Constants shared with emulator in car-cluster-widget.cpp
+ public static final int PIPE_START = 1;
+ public static final int PIPE_STOP = 2;
+
+ private static final int PORT = 5151;
+
+ private SenderThread mActiveThread;
+ private HandlerThread mBroadcastThread = new HandlerThread("BroadcastThread");
private VirtualDisplay mVirtualDisplay;
private MediaCodec mVideoEncoder;
- private HandlerThread mThread = new HandlerThread("NetworkThread");
private Handler mHandler;
- private ServerSocket mServerSocket;
- private OutputStream mOutputStream;
private byte[] mBuffer = null;
private int mLastFrameLength = 0;
@@ -120,31 +129,31 @@
* @throws IllegalStateException thrown if networked display already started
*/
public String start() {
- if (mThread.isAlive()) {
+ if (mBroadcastThread.isAlive()) {
throw new IllegalStateException("Already started");
}
- mThread.start();
- mHandler = new NetworkThreadHandler(mThread.getLooper());
- mHandler.sendMessage(Message.obtain(mHandler, MSG_START));
+ mBroadcastThread.start();
+ mHandler = new BroadcastThreadHandler(mBroadcastThread.getLooper());
+ mHandler.sendMessage(Message.obtain(mHandler, MSG_START));
return getDisplayName();
}
public void release() {
- stopCasting();
+ mHandler.sendMessage(Message.obtain(mHandler, MSG_STOP));
+ mBroadcastThread.quitSafely();
if (mVirtualDisplay != null) {
+ mVirtualDisplay.setSurface(null);
mVirtualDisplay.release();
mVirtualDisplay = null;
}
- mThread.quit();
}
private String getDisplayName() {
return "Cluster-" + mUniqueId;
}
-
private VirtualDisplay createVirtualDisplay() {
Log.i(TAG, "createVirtualDisplay " + mWidth + "x" + mHeight +"@" + mDpi);
return mDisplayManager.createVirtualDisplay(getDisplayName(), mWidth, mHeight, mDpi,
@@ -157,14 +166,18 @@
private void startCasting(Handler handler) {
Log.i(TAG, "Start casting...");
+ if (mVideoEncoder != null) {
+ Log.i(TAG, "Already started casting");
+ return;
+ }
mVideoEncoder = createVideoStream(handler);
if (mVirtualDisplay == null) {
mVirtualDisplay = createVirtualDisplay();
}
+
mVirtualDisplay.setSurface(mVideoEncoder.createInputSurface());
mVideoEncoder.start();
-
Log.i(TAG, "Video encoder started");
}
@@ -180,13 +193,12 @@
encoder.setCallback(new MediaCodec.Callback() {
@Override
public void onInputBufferAvailable(@NonNull MediaCodec codec, int index) {
- Log.i(TAG, "onInputBufferAvailable, index: " + index);
+ // Nothing to do
}
@Override
public void onOutputBufferAvailable(@NonNull MediaCodec codec, int index,
@NonNull BufferInfo info) {
- Log.i(TAG, "onOutputBufferAvailable, index: " + index);
mCounter.outputBuffers++;
doOutputBufferAvailable(index, info);
}
@@ -195,6 +207,8 @@
public void onError(@NonNull MediaCodec codec, @NonNull CodecException e) {
Log.e(TAG, "onError, codec: " + codec, e);
mCounter.bufferErrors++;
+ stopCasting();
+ startCasting(handler);
}
@Override
@@ -210,7 +224,7 @@
}
private void doOutputBufferAvailable(int index, @NonNull BufferInfo info) {
- mHandler.removeMessages(MSG_RESUBMIT_FRAME);
+ mHandler.removeMessages(MSG_SEND_FRAME);
ByteBuffer encodedData = mVideoEncoder.getOutputBuffer(index);
if (encodedData == null) {
@@ -228,60 +242,43 @@
encodedData.get(mBuffer, 0, mLastFrameLength);
mVideoEncoder.releaseOutputBuffer(index, false);
- sendFrame(mBuffer, mLastFrameLength);
-
- // If nothing happens in Virtual Display we won't receive new frames. If we won't keep
- // sending frames it could be a problem for the receiver because it needs certain
- // number of frames in order to start decoding.
- scheduleResendingLastFrame(1000 / FPS);
+ // Send this frame asynchronously (avoiding blocking on the socket). We might miss
+ // frames if the consumer is not fast enough, but this is acceptable.
+ sendFrameAsync(0);
} else {
Log.e(TAG, "Skipping empty buffer");
mVideoEncoder.releaseOutputBuffer(index, false);
}
}
- private void scheduleResendingLastFrame(long delayMs) {
- Message msg = mHandler.obtainMessage(MSG_RESUBMIT_FRAME);
+ private void sendFrameAsync(long delayMs) {
+ Message msg = mHandler.obtainMessage(MSG_SEND_FRAME);
mHandler.sendMessageDelayed(msg, delayMs);
}
private void sendFrame(byte[] buf, int len) {
- try {
- mOutputStream.write(buf, 0, len);
- Log.i(TAG, "Bytes written: " + len);
- } catch (IOException e) {
- mCounter.clientsDisconnected++;
- mOutputStream = null;
- Log.e(TAG, "Failed to write data to socket, restart casting", e);
- restart();
+ if (mActiveThread != null) {
+ mActiveThread.send(buf, len);
}
}
private void stopCasting() {
Log.i(TAG, "Stopping casting...");
- if (mServerSocket != null) {
- try {
- mServerSocket.close();
- } catch (IOException e) {
- Log.w(TAG, "Failed to close server socket, ignoring", e);
- }
- mServerSocket = null;
- }
if (mVirtualDisplay != null) {
- // We do not want to destroy virtual display (as it will also destroy all the
- // activities on that display, instead we will turn off the display by setting
- // a null surface.
Surface surface = mVirtualDisplay.getSurface();
if (surface != null) surface.release();
- mVirtualDisplay.setSurface(null);
}
if (mVideoEncoder != null) {
// Releasing encoder as stop/start didn't work well (couldn't create or reuse input
// surface).
- mVideoEncoder.stop();
- mVideoEncoder.release();
+ try {
+ mVideoEncoder.stop();
+ mVideoEncoder.release();
+ } catch (IllegalStateException e) {
+ // do nothing, already released
+ }
mVideoEncoder = null;
}
Log.i(TAG, "Casting stopped");
@@ -290,14 +287,17 @@
private synchronized void restart() {
// This method could be called from different threads when receiver has disconnected.
if (mHandler.hasMessages(MSG_START)) return;
-
mHandler.sendMessage(Message.obtain(mHandler, MSG_STOP));
mHandler.sendMessage(Message.obtain(mHandler, MSG_START));
}
- private class NetworkThreadHandler extends Handler {
+ private class BroadcastThreadHandler extends Handler {
+ private static final int MAX_FAIL_COUNT = 10;
+ private int mFailConnectCounter;
+ private SocketThread mSocketThread;
+ private PipeThread mPipeThread;
- NetworkThreadHandler(Looper looper) {
+ BroadcastThreadHandler(Looper looper) {
super(looper);
}
@@ -305,35 +305,102 @@
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_START:
- if (mServerSocket == null) {
- mServerSocket = openServerSocket();
+ Log.i(TAG, "Received start message");
+ // Failure to connect to either pipe or network returns null
+ if (mActiveThread == null) {
+ mActiveThread = tryPipeConnect();
}
- Log.i(TAG, "Server socket opened");
-
- mOutputStream = waitForReceiver(mServerSocket);
- if (mOutputStream == null) {
- sendMessage(Message.obtain(this, MSG_START));
+ if (mActiveThread == null) {
+ mActiveThread = tryNetworkConnect();
+ }
+ if (mActiveThread == null) {
+ // When failed attempt limit is reached, clean up and quit this thread.
+ mFailConnectCounter++;
+ if (mFailConnectCounter >= MAX_FAIL_COUNT) {
+ Log.e(TAG, "Too many failed connection attempts; aborting");
+ release();
+ throw new RuntimeException("Abort after failed connection attempts");
+ }
+ mHandler.sendMessage(Message.obtain(mHandler, MSG_START));
break;
}
+ mFailConnectCounter = 0;
mCounter.clientsConnected++;
-
+ mActiveThread.start();
startCasting(this);
break;
case MSG_STOP:
+ Log.i(TAG, "Received stop message");
stopCasting();
+ mCounter.clientsDisconnected++;
+ if (mActiveThread != null) {
+ mActiveThread.close();
+ try {
+ mActiveThread.join();
+ } catch (InterruptedException e) {
+ Log.e(TAG, "Waiting for active thread to close failed", e);
+ }
+ mActiveThread = null;
+ }
break;
- case MSG_RESUBMIT_FRAME:
- if (mServerSocket != null && mOutputStream != null) {
- Log.i(TAG, "Resending the last frame again. Buffer: " + mLastFrameLength);
- sendFrame(mBuffer, mLastFrameLength);
+ case MSG_SEND_FRAME:
+ if (mActiveThread == null) {
+ // Stop the chaining signal if there's no client to send to
+ break;
}
+ sendFrame(mBuffer, mLastFrameLength);
// We will keep sending last frame every second as a heartbeat.
- scheduleResendingLastFrame(1000L);
+ sendFrameAsync(1000L);
break;
}
}
+
+ // Returns null if can't establish pipe connection
+ // Otherwise returns the corresponding client thread
+ private PipeThread tryPipeConnect() {
+ try {
+ RandomAccessFile pipe = new RandomAccessFile(PIPE_DEVICE, "rw");
+ byte[] temp = new byte[PIPE_NAME.length() + 1];
+ temp[PIPE_NAME.length()] = 0;
+ System.arraycopy(PIPE_NAME.getBytes(), 0, temp, 0, PIPE_NAME.length());
+ pipe.write(temp);
+
+ // At this point, the pipe exists, so we will just wait for a start signal
+ // This is in case pipe still sends leftover stops from last instantiation
+ int signal = pipe.read();
+ while (signal != PIPE_START) {
+ Log.i(TAG, "Received non-start signal: " + signal);
+ signal = pipe.read();
+ }
+ return new PipeThread(mHandler, pipe);
+ } catch (IOException e) {
+ Log.e(TAG, "Failed to establish pipe connection", e);
+ return null;
+ }
+ }
+
+ // Returns null if can't establish network connection
+ // Otherwise returns the corresponding client thread
+ private SocketThread tryNetworkConnect() {
+ try {
+ ServerSocket serverSocket = new ServerSocket(PORT);
+ Log.i(TAG, "Server socket opened");
+ Socket socket = serverSocket.accept();
+ socket.setTcpNoDelay(true);
+ socket.setKeepAlive(true);
+ socket.setSoLinger(true, 0);
+
+ InputStream inputStream = socket.getInputStream();
+ OutputStream outputStream = socket.getOutputStream();
+
+ return new SocketThread(mHandler, serverSocket, inputStream, outputStream);
+ } catch (IOException e) {
+ Log.e(TAG, "Failed to establish network connection", e);
+ return null;
+ }
+ }
}
private static void configureVideoEncoder(MediaCodec codec, int width, int height) {
@@ -353,48 +420,12 @@
codec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
}
- private OutputStream waitForReceiver(ServerSocket serverSocket) {
- try {
- Log.i(TAG, "Listening for incoming connections on port: " + PORT);
- Socket socket = serverSocket.accept();
-
- Log.i(TAG, "Receiver connected: " + socket);
- listenReceiverDisconnected(socket.getInputStream());
-
- return socket.getOutputStream();
- } catch (IOException e) {
- Log.e(TAG, "Failed to accept connection");
- return null;
- }
- }
-
- private void listenReceiverDisconnected(InputStream inputStream) {
- new Thread(() -> {
- try {
- if (inputStream.read() == -1) throw new IOException();
- } catch (IOException e) {
- Log.w(TAG, "Receiver has disconnected", e);
- }
- restart();
- }).start();
- }
-
- private static ServerSocket openServerSocket() {
- try {
- return new ServerSocket(PORT);
- } catch (IOException e) {
- Log.e(TAG, "Failed to create server socket", e);
- throw new RuntimeException(e);
- }
- }
-
@Override
public String toString() {
return getClass() + "{"
- + mServerSocket
- +", receiver connected: " + (mOutputStream != null)
- +", encoder: " + mVideoEncoder
- +", virtualDisplay" + mVirtualDisplay
+ + ", receiver connected: " + (mActiveThread != null)
+ + ", encoder: " + mVideoEncoder
+ + ", virtualDisplay" + mVirtualDisplay
+ "}";
}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/PipeThread.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/PipeThread.java
new file mode 100644
index 0000000..c96f482
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/PipeThread.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.car.cluster.sample;
+import android.os.Handler;
+import android.util.Log;
+
+import java.io.IOException;
+import java.io.RandomAccessFile;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+/**
+ * Thread that can send data to the emulator using a qemud service.
+ */
+public class PipeThread extends SenderThread {
+ private static final String TAG = "Cluster." + PipeThread.class.getSimpleName();
+
+ private RandomAccessFile mPipe;
+
+ /**
+ * Creates instance of pipe thread that can write to given pipe file.
+ *
+ * @param handler {@link Handler} used to message broadcaster.
+ * @param pipe {@link RandomAccessFile} file already connected to pipe.
+ */
+ PipeThread(Handler handler, RandomAccessFile pipe) {
+ super(handler);
+ mPipe = pipe;
+ }
+
+ public void run() {
+ try {
+ int signal = mPipe.read();
+ while (signal != NetworkedVirtualDisplay.PIPE_STOP) {
+ Log.i(TAG, "Received non-stop signal: " + signal);
+ signal = mPipe.read();
+ }
+ restart();
+ } catch (IOException e) {
+ Log.e(TAG, "Failed to read from pipe");
+ restart();
+ }
+ }
+
+ @Override
+ public void send(byte[] buf, int len) {
+ try {
+ // First sends the size prior to sending the data, since receiving side only sees
+ // the size of the buffer, which could be significant larger than the actual data.
+ mPipe.write(ByteBuffer.allocate(4)
+ .order(ByteOrder.LITTLE_ENDIAN).putInt(len).array());
+ mPipe.write(buf);
+ } catch (IOException e) {
+ Log.e(TAG, "Write to pipe failed");
+ restart();
+ }
+ }
+
+ @Override
+ public void close() {
+ try {
+ mPipe.close();
+ } catch (IOException e) {
+ Log.e(TAG, "Failed to close pipe", e);
+ }
+ }
+}
+
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/SampleClusterServiceImpl.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/SampleClusterServiceImpl.java
deleted file mode 100644
index 1fa028e..0000000
--- a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/SampleClusterServiceImpl.java
+++ /dev/null
@@ -1,253 +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.car.cluster.sample;
-
-import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
-
-import static java.lang.Integer.parseInt;
-
-import android.app.ActivityOptions;
-import android.car.CarNotConnectedException;
-import android.car.cluster.ClusterActivityState;
-import android.car.cluster.renderer.InstrumentClusterRenderingService;
-import android.car.cluster.renderer.NavigationRenderer;
-import android.car.navigation.CarNavigationInstrumentCluster;
-import android.content.Intent;
-import android.graphics.Rect;
-import android.hardware.display.DisplayManager.DisplayListener;
-import android.os.Binder;
-import android.os.Bundle;
-import android.os.IBinder;
-import android.os.SystemClock;
-import android.provider.Settings;
-import android.provider.Settings.Global;
-import android.util.Log;
-import android.view.InputDevice;
-import android.view.KeyEvent;
-
-import java.io.FileDescriptor;
-import java.io.PrintWriter;
-import java.util.Arrays;
-
-/**
- * Dummy implementation of {@link SampleClusterServiceImpl} to log all interaction.
- */
-public class SampleClusterServiceImpl extends InstrumentClusterRenderingService {
-
- private static final String TAG = SampleClusterServiceImpl.class.getSimpleName();
-
- private Listener mListener;
- private final Binder mLocalBinder = new LocalBinder();
- static final String LOCAL_BINDING_ACTION = "local";
-
- private ClusterDisplayProvider mDisplayProvider;
-
- @Override
- public IBinder onBind(Intent intent) {
- Log.i(TAG, "onBind, intent: " + intent);
- return (LOCAL_BINDING_ACTION.equals(intent.getAction()))
- ? mLocalBinder : super.onBind(intent);
- }
-
- @Override
- public void onCreate() {
- super.onCreate();
- Log.i(TAG, "onCreate");
-
- mDisplayProvider = new ClusterDisplayProvider(this,
- new DisplayListener() {
- @Override
- public void onDisplayAdded(int displayId) {
- Log.i(TAG, "Cluster display found, displayId: " + displayId);
- doClusterDisplayConnected(displayId);
- }
-
- @Override
- public void onDisplayRemoved(int displayId) {
- Log.w(TAG, "Cluster display has been removed");
- }
-
- @Override
- public void onDisplayChanged(int displayId) {
-
- }
- });
- }
-
- private void doClusterDisplayConnected(int displayId) {
- ActivityOptions options = ActivityOptions.makeBasic();
- options.setLaunchDisplayId(displayId);
- Intent intent = new Intent(this, MainClusterActivity.class);
- intent.setFlags(FLAG_ACTIVITY_NEW_TASK);
- startActivity(intent, options.toBundle());
- }
-
- @Override
- protected void onKeyEvent(KeyEvent keyEvent) {
- Log.i(TAG, "onKeyEvent, keyEvent: " + keyEvent + ", listener: " + mListener);
- if (mListener != null) {
- mListener.onKeyEvent(keyEvent);
- }
- }
-
- @Override
- public void onDestroy() {
- super.onDestroy();
- Log.w(TAG, "onDestroy");
- }
-
- void registerListener(Listener listener) {
- mListener = listener;
- }
-
- void unregisterListener() {
- mListener = null;
- }
-
- @Override
- protected NavigationRenderer getNavigationRenderer() {
- NavigationRenderer navigationRenderer = new NavigationRenderer() {
- @Override
- public CarNavigationInstrumentCluster getNavigationProperties() {
- Log.i(TAG, "getNavigationProperties");
- CarNavigationInstrumentCluster config =
- CarNavigationInstrumentCluster.createCluster(1000);
- Log.i(TAG, "getNavigationProperties, returns: " + config);
- return config;
- }
-
- @Override
- public void onEvent(int eventType, Bundle bundle) {
- StringBuilder bundleSummary = new StringBuilder();
- for (String key : bundle.keySet()) {
- bundleSummary.append(key);
- bundleSummary.append("=");
- bundleSummary.append(bundle.get(key));
- bundleSummary.append(" ");
- }
- Log.i(TAG, "onEvent(" + eventType + ", " + bundleSummary + ")");
- }
- };
-
- Log.i(TAG, "createNavigationRenderer, returns: " + navigationRenderer);
- return navigationRenderer;
- }
-
- class LocalBinder extends Binder {
- SampleClusterServiceImpl getService() {
- // Return this instance of LocalService so clients can call public methods
- return SampleClusterServiceImpl.this;
- }
- }
-
- interface Listener {
- void onKeyEvent(KeyEvent event);
- }
-
- @Override
- protected void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
- if (args != null && args.length > 0) {
- execShellCommand(args);
- } else {
-
- if (args == null || args.length == 0) {
- writer.println("* dump " + getClass().getCanonicalName() + " *");
- writer.println("DisplayProvider: " + mDisplayProvider);
- }
- }
- }
-
- private void emulateKeyEvent(int keyCode) {
- Log.i(TAG, "emulateKeyEvent, keyCode: " + keyCode);
- long downTime = SystemClock.uptimeMillis();
- long eventTime = SystemClock.uptimeMillis();
- KeyEvent event = obtainKeyEvent(keyCode, downTime, eventTime, KeyEvent.ACTION_DOWN);
- onKeyEvent(event);
-
- eventTime = SystemClock.uptimeMillis();
- event = obtainKeyEvent(keyCode, downTime, eventTime, KeyEvent.ACTION_UP);
- onKeyEvent(event);
- }
-
- private KeyEvent obtainKeyEvent(int keyCode, long downTime, long eventTime, int action) {
- int scanCode = 0;
- if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {
- scanCode = 108;
- } else if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {
- scanCode = 106;
- }
- return KeyEvent.obtain(
- downTime,
- eventTime,
- action,
- keyCode,
- 0 /* repeat */,
- 0 /* meta state */,
- 0 /* deviceId*/,
- scanCode /* scancode */,
- KeyEvent.FLAG_FROM_SYSTEM /* flags */,
- InputDevice.SOURCE_KEYBOARD,
- null /* characters */);
- }
-
- private void execShellCommand(String[] args) {
- Log.i(TAG, "execShellCommand, args: " + Arrays.toString(args));
-
- String command = args[0];
-
- switch (command) {
- case "injectKey": {
- if (args.length > 1) {
- emulateKeyEvent(parseInt(args[1]));
- } else {
- Log.i(TAG, "Not enough arguments");
- }
- break;
- }
- case "destroyOverlayDisplay": {
- Settings.Global.putString(getContentResolver(),
- Global.OVERLAY_DISPLAY_DEVICES, "");
- break;
- }
-
- case "createOverlayDisplay": {
- if (args.length > 1) {
- Settings.Global.putString(getContentResolver(),
- Global.OVERLAY_DISPLAY_DEVICES, args[1]);
- } else {
- Log.i(TAG, "Not enough arguments, expected 2");
- }
- break;
- }
-
- case "setUnobscuredArea": {
- if (args.length > 5) {
- Rect unobscuredArea = new Rect(parseInt(args[2]), parseInt(args[3]),
- parseInt(args[4]), parseInt(args[5]));
- try {
- setClusterActivityState(args[1],
- ClusterActivityState.create(true, unobscuredArea).toBundle());
- } catch (CarNotConnectedException e) {
- Log.i(TAG, "Failed to set activity state.", e);
- }
- } else {
- Log.i(TAG, "wrong format, expected: category left top right bottom");
- }
- }
- }
- }
-
-}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/SenderThread.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/SenderThread.java
new file mode 100644
index 0000000..2c7f0d6
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/SenderThread.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.car.cluster.sample;
+import android.os.Handler;
+import android.os.Message;
+
+/**
+ * This class serves as a template for sending to specific clients of the broadcaster.
+ */
+public abstract class SenderThread extends Thread {
+ private Handler mHandler;
+
+ SenderThread(Handler handler) {
+ mHandler = handler;
+ }
+
+ abstract void send(byte[] buf, int len);
+ abstract void close();
+
+ /**
+ * Tells the broadcasting thread to stop and close everything in progress, and start over again.
+ * It will kill the current instance of this thread, and produce a new one.
+ */
+ void restart() {
+ if (mHandler.hasMessages(NetworkedVirtualDisplay.MSG_START)) return;
+ mHandler.sendMessage(Message.obtain(mHandler, NetworkedVirtualDisplay.MSG_STOP));
+ mHandler.sendMessage(Message.obtain(mHandler, NetworkedVirtualDisplay.MSG_START));
+ }
+}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/SocketThread.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/SocketThread.java
new file mode 100644
index 0000000..a5215b0
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/SocketThread.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.car.cluster.sample;
+import android.os.Handler;
+import android.util.Log;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.ServerSocket;
+
+/**
+ * The thread that will send data on an opened socket.
+ */
+public class SocketThread extends SenderThread {
+ private static final String TAG = "Cluster." + SocketThread.class.getSimpleName();
+ private ServerSocket mServerSocket;
+ private OutputStream mOutputStream;
+ private InputStream mInputStream;
+
+ /**
+ * Create instance of thread that can write to given open socket.
+ *
+ * @param handler {@link Handler} used to message the broadcaster.
+ * @param serverSocket {@link ServerSocket} should be already opened.
+ * @param inputStream {@link InputStream} corresponding to opened socket.
+ * @param outputStream {@link OutputStream} corresponding to opened socket.
+ */
+ SocketThread(Handler handler, ServerSocket serverSocket, InputStream inputStream,
+ OutputStream outputStream) {
+ super(handler);
+ mServerSocket = serverSocket;
+ mInputStream = inputStream;
+ mOutputStream = outputStream;
+ }
+
+ public void run() {
+ try {
+ // This read should block until something disconnects (or something
+ // similar) which should cause an exception, in which case we should
+ // try to setup again and reconnect
+ mInputStream.read();
+ } catch (IOException e) {
+ Log.e(TAG, "Socket thread disconnected.");
+ }
+ restart();
+ }
+
+ @Override
+ public void send(byte[] buf, int len) {
+ try {
+ mOutputStream.write(buf, 0, len);
+ } catch (IOException e) {
+ Log.e(TAG, "Failed to write data to socket, retrying connection");
+ restart();
+ }
+ }
+
+ @Override
+ public void close() {
+ if (mServerSocket != null) {
+ try {
+ mServerSocket.close();
+ } catch (IOException e) {
+ Log.w(TAG, "Failed to close server socket, ignoring");
+ }
+ mServerSocket = null;
+ }
+ mInputStream = null;
+ mOutputStream = null;
+ }
+}
+
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/sensors/Sensor.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/sensors/Sensor.java
new file mode 100644
index 0000000..8f01cd7
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/sensors/Sensor.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.car.cluster.sample.sensors;
+
+import android.car.VehiclePropertyType;
+import android.car.hardware.CarPropertyValue;
+
+import java.util.function.Function;
+
+/**
+ * Description of a car sensor. It can be used as identifier at
+ * {@link android.car.cluster.sample.ClusterViewModel#getSensor(Sensor)} to obtain a
+ * {@link androidx.lifecycle.LiveData} to track values of this sensor. The sensor description is
+ * used to process and decode the information reported by the car.
+ * <p>
+ * All instances of this class must be obtained from {@link Sensors}.
+ *
+ * @param <T> data type used by this sensor.
+ */
+public class Sensor<T> {
+ /** Name of the sensor (for debugging) */
+ public final String mName;
+ /** VHAL identifier of this sensor */
+ public final int mPropertyId;
+ /** VHAL area associated with this sensor (each area is reported as an independent sensor) */
+ public final int mAreaId;
+ /**
+ * Data type expected to be reported by the VHAL. If the values received don't match with the
+ * expected ones, we warn about it and ignore the value.
+ */
+ @VehiclePropertyType.Enum
+ public final int mExpectedPropertyType;
+ /** VHAL Area associated with this sensor. */
+ public final Function<CarPropertyValue<?>, T> mAdapter;
+
+ /**
+ * Creates a new sensor. Only {@link Sensors} should use this constructor.
+ */
+ Sensor(String name, int propertyId, int areaId, int expectedPropertyType,
+ Function<CarPropertyValue<?>, T> adapter) {
+ mName = name;
+ mPropertyId = propertyId;
+ mAreaId = areaId;
+ mExpectedPropertyType = expectedPropertyType;
+ mAdapter = adapter;
+ }
+
+ @Override
+ public String toString() {
+ return mName;
+ }
+}
diff --git a/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/sensors/Sensors.java b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/sensors/Sensors.java
new file mode 100644
index 0000000..dd7566e
--- /dev/null
+++ b/tests/DirectRenderingClusterSample/src/android/car/cluster/sample/sensors/Sensors.java
@@ -0,0 +1,144 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.car.cluster.sample.sensors;
+
+import android.car.VehiclePropertyIds;
+import android.car.VehiclePropertyType;
+import android.car.hardware.CarPropertyValue;
+import android.car.hardware.CarSensorEvent;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.Function;
+
+/**
+ * The collection of all sensors supported by this application.
+ */
+public class Sensors {
+ /** Area identifier used for sensors corresponding to global VHAL properties */
+ public static final int GLOBAL_AREA_ID = -1;
+
+ private static Sensors sInstance;
+ private static List<Sensor<?>> sSensors = new ArrayList<>();
+ private Map<Integer, List<Sensor<?>>> mSensorsByPropertyId = new HashMap<>();
+
+ /** Possible values of the {@link #SENSOR_GEAR} sensor */
+ public enum Gear {
+ NEUTRAL,
+ REVERSE,
+ DRIVE,
+ PARK,
+ }
+
+ /** Fuel of the car, measured in millimeters */
+ public static final Sensor<Float> SENSOR_FUEL = registerSensor(
+ "Fuel", VehiclePropertyIds.FUEL_LEVEL, GLOBAL_AREA_ID, VehiclePropertyType.FLOAT,
+ value -> (Float) value.getValue());
+ /** Fuel capacity of the car, measured in millimeters */
+ public static final Sensor<Float> SENSOR_FUEL_CAPACITY = registerSensor(
+ "Fuel Capacity", VehiclePropertyIds.INFO_FUEL_CAPACITY, GLOBAL_AREA_ID,
+ VehiclePropertyType.FLOAT,
+ value -> (Float) value.getValue());
+ /** RPMs */
+ public static final Sensor<Float> SENSOR_RPM = registerSensor(
+ "RPM", VehiclePropertyIds.ENGINE_RPM, GLOBAL_AREA_ID,
+ VehiclePropertyType.FLOAT,
+ value -> (Float) value.getValue());
+ /** Fuel range in kilometers */
+ public static final Sensor<Float> SENSOR_FUEL_RANGE = registerSensor(
+ "Fuel Range", VehiclePropertyIds.RANGE_REMAINING, GLOBAL_AREA_ID,
+ VehiclePropertyType.FLOAT,
+ value -> (Float) value.getValue());
+ /** Speed in kph */
+ public static final Sensor<Float> SENSOR_SPEED = registerSensor(
+ "Speed", VehiclePropertyIds.PERF_VEHICLE_SPEED, GLOBAL_AREA_ID,
+ VehiclePropertyType.FLOAT,
+ value -> (Float) value.getValue());
+ /** Current gear of the car */
+ public static final Sensor<Gear> SENSOR_GEAR = registerSensor(
+ "Gear", VehiclePropertyIds.CURRENT_GEAR, GLOBAL_AREA_ID, VehiclePropertyType.INT32,
+ value -> {
+ if (value == null) {
+ return null;
+ }
+ Integer gear = (Integer) value.getValue();
+ if ((gear & CarSensorEvent.GEAR_REVERSE) != 0) {
+ return Gear.REVERSE;
+ } else if ((gear & CarSensorEvent.GEAR_NEUTRAL) != 0) {
+ return Gear.NEUTRAL;
+ } else if ((gear & CarSensorEvent.GEAR_DRIVE) != 0) {
+ return Gear.DRIVE;
+ } else if ((gear & CarSensorEvent.GEAR_PARK) != 0) {
+ return Gear.PARK;
+ } else {
+ return null;
+ }
+ });
+
+ private static <T> Sensor<T> registerSensor(String propertyName, int propertyId, int areaId,
+ int expectedPropertyType, Function<CarPropertyValue<?>, T> adapter) {
+ Sensor<T> sensor = new Sensor<>(propertyName, propertyId, areaId, expectedPropertyType,
+ adapter);
+ sSensors.add(sensor);
+ return sensor;
+ }
+
+ /**
+ * Obtains the singleton instance of this class
+ */
+ public static Sensors getInstance() {
+ if (sInstance == null) {
+ sInstance = new Sensors();
+ }
+ return sInstance;
+ }
+
+ private Sensors() {
+ initializeSensorsMap();
+ }
+
+ private void initializeSensorsMap() {
+ for (Sensor<?> sensorId : getSensors()) {
+ mSensorsByPropertyId
+ .computeIfAbsent(sensorId.mPropertyId, (id) -> new ArrayList<>())
+ .add(sensorId);
+ }
+ }
+
+ /**
+ * Returns all sensors.
+ */
+ public List<Sensor<?>> getSensors() {
+ return sSensors;
+ }
+
+ /**
+ * Returns all sensors associated to the given VHAL property id.
+ */
+ public List<Sensor<?>> getSensorsForPropertyId(int propertyId) {
+ return mSensorsByPropertyId.get(propertyId);
+ }
+
+ /**
+ * Returns all property ids we care about.
+ */
+ public Set<Integer> getPropertyIds() {
+ return mSensorsByPropertyId.keySet();
+ }
+}
diff --git a/tests/EmbeddedKitchenSinkApp/Android.mk b/tests/EmbeddedKitchenSinkApp/Android.mk
index 71adf6b..db59ddf 100644
--- a/tests/EmbeddedKitchenSinkApp/Android.mk
+++ b/tests/EmbeddedKitchenSinkApp/Android.mk
@@ -41,17 +41,28 @@
LOCAL_DEX_PREOPT := false
LOCAL_STATIC_ANDROID_LIBRARIES += \
- androidx.car_car \
- car-service-lib-for-test
+ car-service-lib-for-test \
+ car-apps-common \
+ androidx.car_car-cluster
LOCAL_STATIC_JAVA_LIBRARIES += \
android.hidl.base-V1.0-java \
android.hardware.automotive.vehicle-V2.0-java \
vehicle-hal-support-lib \
- com.android.car.keventreader-client
+ com.android.car.keventreader-client \
+ kitchensink-gson
-include packages/services/Car/car-support-lib/car-support.mk
+LOCAL_JAVA_LIBRARIES += android.car
include $(BUILD_PACKAGE)
+include $(CLEAR_VARS)
+
+LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := \
+ kitchensink-gson:libs/gson-2.1.jar
+
+include $(BUILD_MULTI_PREBUILT)
+
+include $(CLEAR_VARS)
+
endif #TARGET_BUILD_PDK
diff --git a/tests/EmbeddedKitchenSinkApp/AndroidManifest.xml b/tests/EmbeddedKitchenSinkApp/AndroidManifest.xml
index 6e8e80f..2c4713c 100644
--- a/tests/EmbeddedKitchenSinkApp/AndroidManifest.xml
+++ b/tests/EmbeddedKitchenSinkApp/AndroidManifest.xml
@@ -33,6 +33,7 @@
<uses-permission android:name="android.car.permission.CAR_CONTROL_AUDIO_VOLUME"/>
<uses-permission android:name="android.car.permission.VEHICLE_DYNAMICS_STATE"/>
<uses-permission android:name="android.car.permission.CAR_DISPLAY_IN_CLUSTER"/>
+ <uses-permission android:name="android.car.permission.CAR_INSTRUMENT_CLUSTER_CONTROL"/>
<uses-permission android:name="android.car.permission.STORAGE_MONITORING" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.MANAGE_USB" />
@@ -65,10 +66,6 @@
android:name="android.car.application"
android:resource="@xml/automotive_app_desc" />
- <service android:name=".job.DishService"
- android:permission="android.permission.BIND_JOB_SERVICE">
- </service>
-
<activity android:name=".setting.CarServiceSettingsActivity"
android:label="@string/car_settings">
<intent-filter>
@@ -96,15 +93,14 @@
android:theme="@android:style/Theme.Material.Light.Dialog"
android:launchMode="singleTop">
</activity>
+
<activity android:name=".cluster.FakeClusterNavigationActivity"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:launchMode="singleInstance"
android:resizeableActivity="true"
- android:allowEmbedded="true"
- android:permission="android.car.permission.CAR_INSTRUMENT_CLUSTER_CONTROL">
- <intent-filter android:priority="-1">
+ android:allowEmbedded="true">
+ <intent-filter>
<action android:name="android.intent.action.MAIN"/>
- <category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.car.cluster.NAVIGATION"/>
</intent-filter>
</activity>
@@ -112,10 +108,17 @@
<activity android:name=".activityview.ActivityViewTestFragment"/>
<!-- temporary solution until b/68882625 is fixed. -->
- <receiver android:name=".touchsound.DisableTouchSoundOnBoot" android:exported="true">
+ <receiver android:name=".touchsound.DisableTouchSoundOnBoot" android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
+
+ <!-- Content provider for images -->
+ <provider android:name=".cluster.ClusterContentProvider"
+ android:authorities="com.google.android.car.kitchensink.cluster.clustercontentprovider"
+ android:grantUriPermissions="true"
+ android:exported="true" />
+
</application>
</manifest>
diff --git a/tests/EmbeddedKitchenSinkApp/libs/gson-2.1-sources.jar b/tests/EmbeddedKitchenSinkApp/libs/gson-2.1-sources.jar
new file mode 100644
index 0000000..09396a0
--- /dev/null
+++ b/tests/EmbeddedKitchenSinkApp/libs/gson-2.1-sources.jar
Binary files differ
diff --git a/tests/EmbeddedKitchenSinkApp/libs/gson-2.1.jar b/tests/EmbeddedKitchenSinkApp/libs/gson-2.1.jar
new file mode 100644
index 0000000..83c5c99
--- /dev/null
+++ b/tests/EmbeddedKitchenSinkApp/libs/gson-2.1.jar
Binary files differ
diff --git a/tests/EmbeddedKitchenSinkApp/res/drawable/avatar1.png b/tests/EmbeddedKitchenSinkApp/res/drawable/avatar1.png
new file mode 100644
index 0000000..94e4cf1
--- /dev/null
+++ b/tests/EmbeddedKitchenSinkApp/res/drawable/avatar1.png
Binary files differ
diff --git a/tests/EmbeddedKitchenSinkApp/res/drawable/avatar2.png b/tests/EmbeddedKitchenSinkApp/res/drawable/avatar2.png
new file mode 100644
index 0000000..10021f2
--- /dev/null
+++ b/tests/EmbeddedKitchenSinkApp/res/drawable/avatar2.png
Binary files differ
diff --git a/tests/EmbeddedKitchenSinkApp/res/drawable/ic_check_box_checked.xml b/tests/EmbeddedKitchenSinkApp/res/drawable/ic_check_box_checked.xml
index d64d4fc..0ef8e43 100644
--- a/tests/EmbeddedKitchenSinkApp/res/drawable/ic_check_box_checked.xml
+++ b/tests/EmbeddedKitchenSinkApp/res/drawable/ic_check_box_checked.xml
@@ -22,5 +22,5 @@
android:viewportHeight="24.0">
<path
android:pathData="M19,3L5,3c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.11,0 2,-0.9 2,-2L21,5c0,-1.1 -0.89,-2 -2,-2zM10,17l-5,-5 1.41,-1.41L10,14.17l7.59,-7.59L19,8l-9,9z"
- android:fillColor="#000000"/>
+ android:fillColor="#FFFFFF"/>
</vector>
diff --git a/tests/EmbeddedKitchenSinkApp/res/drawable/ic_check_box_unchecked.xml b/tests/EmbeddedKitchenSinkApp/res/drawable/ic_check_box_unchecked.xml
index 96246a3..b05cb48 100644
--- a/tests/EmbeddedKitchenSinkApp/res/drawable/ic_check_box_unchecked.xml
+++ b/tests/EmbeddedKitchenSinkApp/res/drawable/ic_check_box_unchecked.xml
@@ -22,5 +22,5 @@
android:viewportHeight="24.0">
<path
android:pathData="M19,5v14H5V5h14m0,-2H5c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V5c0,-1.1 -0.9,-2 -2,-2z"
- android:fillColor="#000000"/>
+ android:fillColor="#FFFFFF"/>
</vector>
diff --git a/tests/EmbeddedKitchenSinkApp/res/drawable/ic_voice_assistant_mic.xml b/tests/EmbeddedKitchenSinkApp/res/drawable/ic_voice_assistant_mic.xml
index 0468870..2171286 100644
--- a/tests/EmbeddedKitchenSinkApp/res/drawable/ic_voice_assistant_mic.xml
+++ b/tests/EmbeddedKitchenSinkApp/res/drawable/ic_voice_assistant_mic.xml
@@ -21,7 +21,7 @@
android:viewportWidth="24"
android:viewportHeight="24">
<path
- android:fillColor="#000000"
+ android:fillColor="#FFFFFF"
android:pathData="M12 14c1.66 0 2.99-1.34 2.99-3L15 5c0-1.66-1.34-3-3-3S9 3.34 9 5v6c0 1.66 1.34 3
3 3zm5.3-3c0 3-2.54 5.1-5.3 5.1S6.7 14 6.7 11H5c0 3.41 2.72 6.23 6
6.72V21h2v-3.28c3.28-.48 6-3.3 6-6.72h-1.7z" />
diff --git a/tests/EmbeddedKitchenSinkApp/res/layout/connectivity_fragment.xml b/tests/EmbeddedKitchenSinkApp/res/layout/connectivity_fragment.xml
index 15422b1..cdf437e 100644
--- a/tests/EmbeddedKitchenSinkApp/res/layout/connectivity_fragment.xml
+++ b/tests/EmbeddedKitchenSinkApp/res/layout/connectivity_fragment.xml
@@ -19,37 +19,68 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
+ <!-- List(s) of networks (right now only have view all, may do a search UI)
+ -->
<LinearLayout
- android:orientation="horizontal"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <!-- Header for table -->
+ <LinearLayout
+ android:orientation="horizontal"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingLeft="4dp"
+ android:background="#3C3F41"
+ android:weightSum="12">
+
+ <TextView
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:textSize="32sp"
+ android:textColor="#d4d4d4"
+ android:textStyle="bold"
+ android:text="Net ID">
+ </TextView>
+
+ <TextView
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="9"
+ android:textSize="32sp"
+ android:textColor="#d4d4d4"
+ android:textStyle="bold"
+ android:text="Details">
+ </TextView>
+
+ <TextView
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="2"
+ android:textSize="32sp"
+ android:textColor="#d4d4d4"
+ android:textStyle="bold"
+ android:text="Functions">
+ </TextView>
+
+ </LinearLayout>
+
+ <!-- Wrapped list view to implement swipe to refresh -->
+ <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
+ android:id="@+id/refreshNetworksList"
android:layout_width="match_parent"
android:layout_height="wrap_content">
- <ListView
- android:id="@+id/networks"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content">
- </ListView>
- </LinearLayout>
- <LinearLayout
- android:orientation="horizontal"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_margin="4dp">
- <Button android:id="@+id/networksRefresh"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="Refresh"/>
- <Button android:id="@+id/networkRequestOemPaid"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="Request OEM-paid"/>
- <Button android:id="@+id/networkRequestEth1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="Request eth1"/>
- <Button android:id="@+id/networkReleaseNetwork"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="Release Request"/>
- </LinearLayout>
-</LinearLayout>
\ No newline at end of file
+ <!-- Filled in code with network_item.xml -->
+ <ListView
+ android:id="@+id/networks"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+ </ListView>
+
+ </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
+
+ </LinearLayout>
+</LinearLayout>
diff --git a/tests/EmbeddedKitchenSinkApp/res/layout/input_test.xml b/tests/EmbeddedKitchenSinkApp/res/layout/input_test.xml
index 03a90e0..5818216 100644
--- a/tests/EmbeddedKitchenSinkApp/res/layout/input_test.xml
+++ b/tests/EmbeddedKitchenSinkApp/res/layout/input_test.xml
@@ -17,28 +17,30 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
- <LinearLayout
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:id="@+id/input_buttons">
- <!-- Filled at runtime. -->
- </LinearLayout>
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
- android:layout_marginLeft="15dp"
- android:layout_marginRight="15dp"
- android:layout_marginTop="20dp"
android:fillViewport="true">
- <TextView
- android:layout_width="match_parent"
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+ <LinearLayout
+ android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:gravity="bottom"
- android:scrollbars="vertical"
- android:textSize="24px"
- android:typeface="monospace"
- android:id="@+id/events_list"/>
+ android:orientation="vertical"
+ android:id="@+id/input_buttons">
+ <!-- Filled at runtime. -->
+ </LinearLayout>
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="bottom"
+ android:scrollbars="vertical"
+ android:textSize="24px"
+ android:typeface="monospace"
+ android:id="@+id/events_list"/>
+ </LinearLayout>
</ScrollView>
</LinearLayout>
diff --git a/tests/EmbeddedKitchenSinkApp/res/layout/input_type_test.xml b/tests/EmbeddedKitchenSinkApp/res/layout/input_type_test.xml
new file mode 100644
index 0000000..58dae07
--- /dev/null
+++ b/tests/EmbeddedKitchenSinkApp/res/layout/input_type_test.xml
@@ -0,0 +1,550 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Values of android:inputType:
+ https://developer.android.com/reference/android/widget/TextView#attr_android:inputType
+ We are missing the cases of input type combination. Adding those upon request.
+-->
+<ScrollView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_height="match_parent"
+ android:layout_width="match_parent">
+ <LinearLayout
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+ <TextView
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:textSize="@dimen/inputTypeTextSize"
+ android:text="Date:"/>
+
+ <EditText
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:inputType="date"
+ android:singleLine="true"/>
+
+ <TextView
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:layout_marginLeft="@dimen/inputTypeMarginLeft"
+ android:textSize="@dimen/inputTypeTextSize"
+ android:text="Date Time:"/>
+
+ <EditText
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:inputType="datetime"
+ android:singleLine="true"/>
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+ <TextView
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:textSize="@dimen/inputTypeTextSize"
+ android:text="Number:"/>
+
+ <EditText
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:inputType="number"
+ android:singleLine="true"/>
+
+ <TextView
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:layout_marginLeft="@dimen/inputTypeMarginLeft"
+ android:textSize="@dimen/inputTypeTextSize"
+ android:text="Number Decimal:"/>
+
+ <EditText
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:inputType="numberDecimal"
+ android:singleLine="true"/>
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+ <TextView
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:textSize="@dimen/inputTypeTextSize"
+ android:text="Number Password:"/>
+
+ <EditText
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:inputType="numberPassword"
+ android:singleLine="true"/>
+
+ <TextView
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:layout_marginLeft="@dimen/inputTypeMarginLeft"
+ android:textSize="@dimen/inputTypeTextSize"
+ android:text="Number Signed:"/>
+
+ <EditText
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:inputType="numberSigned"
+ android:singleLine="true"/>
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+ <TextView
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:textSize="@dimen/inputTypeTextSize"
+ android:text="Phone:"/>
+
+ <EditText
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:inputType="phone"
+ android:singleLine="true"/>
+
+ <TextView
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:layout_marginLeft="@dimen/inputTypeMarginLeft"
+ android:textSize="@dimen/inputTypeTextSize"
+ android:text="Plain Text:"/>
+
+ <EditText
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:inputType="text"
+ android:singleLine="true"/>
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+ <TextView
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:textSize="@dimen/inputTypeTextSize"
+ android:text="Auto Complete:"/>
+
+ <EditText
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:inputType="textAutoComplete"
+ android:singleLine="true"/>
+
+ <TextView
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:layout_marginLeft="@dimen/inputTypeMarginLeft"
+ android:textSize="@dimen/inputTypeTextSize"
+ android:text="Auto Correct:"/>
+
+ <EditText
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:inputType="textAutoCorrect"
+ android:singleLine="true"/>
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+ <TextView
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:textSize="@dimen/inputTypeTextSize"
+ android:text="Cap Characters:"/>
+
+ <EditText
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:inputType="textCapCharacters"
+ android:singleLine="true"/>
+
+ <TextView
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:layout_marginLeft="@dimen/inputTypeMarginLeft"
+ android:textSize="@dimen/inputTypeTextSize"
+ android:text="Cap Sentences:"/>
+
+ <EditText
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:inputType="textCapSentences"
+ android:singleLine="true"/>
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+ <TextView
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:textSize="@dimen/inputTypeTextSize"
+ android:text="Cap Words:"/>
+
+ <EditText
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:inputType="textCapWords"
+ android:singleLine="true"/>
+
+ <TextView
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:layout_marginLeft="@dimen/inputTypeMarginLeft"
+ android:textSize="@dimen/inputTypeTextSize"
+ android:text="Email Address:"/>
+
+ <EditText
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:inputType="textEmailAddress"
+ android:singleLine="true"/>
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+ <TextView
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:textSize="@dimen/inputTypeTextSize"
+ android:text="Email Subject:"/>
+
+ <EditText
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:inputType="textEmailSubject"
+ android:singleLine="true"/>
+
+ <TextView
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:layout_marginLeft="@dimen/inputTypeMarginLeft"
+ android:textSize="@dimen/inputTypeTextSize"
+ android:text="Filter:"/>
+
+ <EditText
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:inputType="textFilter"
+ android:singleLine="true"/>
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+ <TextView
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:textSize="@dimen/inputTypeTextSize"
+ android:text="IME Multiline:"/>
+
+ <EditText
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:inputType="textImeMultiLine"
+ android:singleLine="false"/>
+
+ <TextView
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:layout_marginLeft="@dimen/inputTypeMarginLeft"
+ android:textSize="@dimen/inputTypeTextSize"
+ android:text="Long Message:"/>
+
+ <EditText
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:inputType="textLongMessage"
+ android:singleLine="true"/>
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+ <TextView
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:textSize="@dimen/inputTypeTextSize"
+ android:text="MultiLine:"/>
+
+ <EditText
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:inputType="textMultiLine"
+ android:singleLine="false"/>
+
+ <TextView
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:layout_marginLeft="@dimen/inputTypeMarginLeft"
+ android:textSize="@dimen/inputTypeTextSize"
+ android:text="No Suggestions:"/>
+
+ <EditText
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:inputType="textNoSuggestions"
+ android:singleLine="true"/>
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+ <TextView
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:textSize="@dimen/inputTypeTextSize"
+ android:text="Password:"/>
+
+ <EditText
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:inputType="textPassword"
+ android:singleLine="true"/>
+
+ <TextView
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:layout_marginLeft="@dimen/inputTypeMarginLeft"
+ android:textSize="@dimen/inputTypeTextSize"
+ android:text="Person Name:"/>
+
+ <EditText
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:inputType="textPersonName"
+ android:singleLine="true"/>
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+ <TextView
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:textSize="@dimen/inputTypeTextSize"
+ android:text="Phonetic:"/>
+
+ <EditText
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:inputType="textPhonetic"
+ android:singleLine="true"/>
+
+ <TextView
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:layout_marginLeft="@dimen/inputTypeMarginLeft"
+ android:textSize="@dimen/inputTypeTextSize"
+ android:text="Postal Address:"/>
+
+ <EditText
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:inputType="textPostalAddress"
+ android:singleLine="true"/>
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+ <TextView
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:textSize="@dimen/inputTypeTextSize"
+ android:text="Short Message:"/>
+
+ <EditText
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:inputType="textShortMessage"
+ android:singleLine="true"/>
+
+ <TextView
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:layout_marginLeft="@dimen/inputTypeMarginLeft"
+ android:textSize="@dimen/inputTypeTextSize"
+ android:text="URI:"/>
+
+ <EditText
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:inputType="textUri"
+ android:singleLine="true"/>
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+ <TextView
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:textSize="@dimen/inputTypeTextSize"
+ android:text="Visible Password:"/>
+
+ <EditText
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:inputType="textVisiblePassword"
+ android:singleLine="true"/>
+
+ <TextView
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:layout_marginLeft="@dimen/inputTypeMarginLeft"
+ android:textSize="@dimen/inputTypeTextSize"
+ android:text="Web Edit Text:"/>
+
+ <EditText
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:inputType="textWebEditText"
+ android:singleLine="true"/>
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+ <TextView
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:textSize="@dimen/inputTypeTextSize"
+ android:text="Web Email Address:"/>
+
+ <EditText
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:inputType="textWebEmailAddress"
+ android:singleLine="true"/>
+
+ <TextView
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:layout_marginLeft="@dimen/inputTypeMarginLeft"
+ android:textSize="@dimen/inputTypeTextSize"
+ android:text="Web Password:"/>
+
+ <EditText
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:inputType="textWebPassword"
+ android:singleLine="true"/>
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+ <TextView
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:textSize="@dimen/inputTypeTextSize"
+ android:text="Time:"/>
+
+ <EditText
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="6"
+ android:inputType="time"
+ android:singleLine="true"/>
+ </LinearLayout>
+ </LinearLayout>
+
+</ScrollView>
+
+
+
+
+
diff --git a/tests/EmbeddedKitchenSinkApp/res/layout/instrument_cluster.xml b/tests/EmbeddedKitchenSinkApp/res/layout/instrument_cluster.xml
index f58af8f..a29296c 100644
--- a/tests/EmbeddedKitchenSinkApp/res/layout/instrument_cluster.xml
+++ b/tests/EmbeddedKitchenSinkApp/res/layout/instrument_cluster.xml
@@ -13,40 +13,40 @@
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:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_marginTop="40dp"
- android:layout_marginStart="40dp">
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:gravity="center"
+ android:layout_marginTop="40dp"
+ android:layout_marginStart="40dp"
+ android:layout_marginEnd="40dp">
<LinearLayout
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
+ android:orientation="vertical"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content">
<Button
- android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="1"
- android:text="@string/cluster_start"
- android:id="@+id/cluster_start_button"/>
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_margin="10dp"
+ android:padding="20dp"
+ android:text="@string/cluster_start"
+ android:id="@+id/cluster_start_button"/>
<Button
- android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="1"
- android:text="@string/cluster_turn_left"
- android:id="@+id/cluster_turn_left_button"/>
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_margin="10dp"
+ android:padding="20dp"
+ android:text="@string/cluster_start_guidance"
+ android:id="@+id/cluster_turn_left_button"/>
<Button
- android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="1"
- android:text="@string/cluster_stop"
- android:id="@+id/cluster_stop_button"/>
- <Button
- android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="1"
- android:text="@string/cluster_start_activity"
- android:id="@+id/cluster_start_activity"/>
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_margin="10dp"
+ android:padding="20dp"
+ android:text="@string/cluster_stop"
+ android:id="@+id/cluster_stop_button"/>
</LinearLayout>
</LinearLayout>
diff --git a/tests/EmbeddedKitchenSinkApp/res/layout/job_scheduler.xml b/tests/EmbeddedKitchenSinkApp/res/layout/job_scheduler.xml
deleted file mode 100644
index 3456263..0000000
--- a/tests/EmbeddedKitchenSinkApp/res/layout/job_scheduler.xml
+++ /dev/null
@@ -1,119 +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:orientation="horizontal"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <LinearLayout
- android:layout_width="0dp"
- android:layout_height="match_parent"
- android:layout_weight="1"
- android:orientation="vertical">
- <LinearLayout
- android:layout_width="wrap_content"
- android:layout_height="wrap_content">
- <Button
- android:id="@+id/refresh_button"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/refresh_button" />
- <Button
- android:id="@+id/cancel_button"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/cancel_button" />
- </LinearLayout>
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/job_info"
- android:textColor="@android:color/holo_red_dark" />
- <TextView
- android:id="@+id/current_jobs"
- android:layout_width="100dp"
- android:layout_height="wrap_content" />
- </LinearLayout>
-
- <LinearLayout
- android:layout_width="0dp"
- android:layout_height="match_parent"
- android:layout_weight="1"
- android:orientation="vertical">
- <Button
- android:id="@+id/schedule_button"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/schedule_button"/>
- <CheckBox
- android:id="@+id/require_idle"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/require_idle"/>
- <CheckBox
- android:id="@+id/require_charging"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/require_charging"/>
- <CheckBox
- android:id="@+id/require_persisted"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/require_persisted"/>
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/require_network"/>
- <RadioGroup
- android:id="@+id/network_group"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content">
-
- <RadioButton android:id="@+id/network_any"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/network_any"/>
-
- <RadioButton android:id="@+id/network_none"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/network_none"/>
-
- <RadioButton android:id="@+id/network_unmetered"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/network_unmetered"/>
- </RadioGroup>
-
- <LinearLayout
- android:layout_width="wrap_content"
- android:layout_height="wrap_content">
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/dish_num"/>
-
- <android.support.car.input.CarRestrictedEditText
- android:id="@+id/dish_num"
- android:layout_width="100dp"
- android:layout_height="40dp"
- android:inputType="number"
- android:text="@string/default_dish_num" />
- </LinearLayout>
-
- </LinearLayout>
-
-</LinearLayout>
\ No newline at end of file
diff --git a/tests/EmbeddedKitchenSinkApp/res/layout/kitchen_content.xml b/tests/EmbeddedKitchenSinkApp/res/layout/kitchen_content.xml
index 45b38dc..2ebc1c6 100644
--- a/tests/EmbeddedKitchenSinkApp/res/layout/kitchen_content.xml
+++ b/tests/EmbeddedKitchenSinkApp/res/layout/kitchen_content.xml
@@ -17,7 +17,6 @@
<!-- We use this container to place kitchen app fragments. It insets the fragment contents -->
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/kitchen_content"
- android:background="#A8A9AA"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingStart="56dp"
diff --git a/tests/EmbeddedKitchenSinkApp/res/layout/network_item.xml b/tests/EmbeddedKitchenSinkApp/res/layout/network_item.xml
new file mode 100644
index 0000000..84d9d34
--- /dev/null
+++ b/tests/EmbeddedKitchenSinkApp/res/layout/network_item.xml
@@ -0,0 +1,203 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<!-- Used for the list of networks in the KS Connectivity Tab -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="fill_vertical"
+ android:orientation="horizontal"
+ android:weightSum="12">
+
+ <!-- Requested Active indicator -->
+ <View
+ android:id="@+id/network_active"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight=".1"
+ android:background="#ff3d3d">
+ </View>
+
+ <!-- Item NetId indicator -->
+ <TextView
+ android:id="@+id/network_id"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight=".9"
+ android:textSize="20sp"
+ android:textColor="#d4d4d4">
+ </TextView>
+
+ <!-- Set of network values we want to view -->
+ <LinearLayout
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:layout_weight="9">
+
+ <TextView
+ android:id="@+id/network_type"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textSize="20sp"
+ android:textColor="#d4d4d4">
+ </TextView>
+
+ <TextView
+ android:id="@+id/network_state"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textSize="20sp"
+ android:textColor="#d4d4d4">
+ </TextView>
+
+ <TextView
+ android:id="@+id/network_connected"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textSize="20sp"
+ android:textColor="#d4d4d4">
+ </TextView>
+
+ <TextView
+ android:id="@+id/network_available"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textSize="20sp"
+ android:textColor="#d4d4d4">
+ </TextView>
+
+ <TextView
+ android:id="@+id/network_roaming"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textSize="20sp"
+ android:textColor="#d4d4d4">
+ </TextView>
+
+ <TextView
+ android:id="@+id/network_iface"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textSize="20sp"
+ android:textColor="#d4d4d4">
+ </TextView>
+
+ <TextView
+ android:id="@+id/hw_address"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textSize="20sp"
+ android:textColor="#d4d4d4">
+ </TextView>
+
+ <TextView
+ android:id="@+id/network_ip_addresses"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textSize="20sp"
+ android:textColor="#d4d4d4">
+ </TextView>
+
+ <TextView
+ android:id="@+id/network_dns"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textSize="20sp"
+ android:textColor="#d4d4d4">
+ </TextView>
+
+ <TextView
+ android:id="@+id/network_domains"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textSize="20sp"
+ android:textColor="#d4d4d4">
+ </TextView>
+
+ <TextView
+ android:id="@+id/network_routes"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textSize="20sp"
+ android:textColor="#d4d4d4">
+ </TextView>
+
+ <TextView
+ android:id="@+id/network_transports"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textSize="20sp"
+ android:textColor="#d4d4d4">
+ </TextView>
+
+ <TextView
+ android:id="@+id/network_capabilities"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textSize="20sp"
+ android:textColor="#d4d4d4">
+ </TextView>
+
+ <TextView
+ android:id="@+id/network_bandwidth"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textSize="20sp"
+ android:textColor="#d4d4d4">
+ </TextView>
+
+ </LinearLayout>
+
+ <!-- Buttons to trigger a request or something else -->
+ <LinearLayout
+ android:orientation="vertical"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="2"
+ android:weightSum="3">
+
+ <Button android:id="@+id/network_request"
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1"
+ android:layout_marginBottom="2dp"
+ android:background="#505050"
+ android:text="Request"
+ android:textColor="#d4d4d4"/>
+
+ <Button android:id="@+id/network_default"
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1"
+ android:layout_marginBottom="2dp"
+ android:background="#505050"
+ android:text="Set Default"
+ android:textColor="#d4d4d4"/>
+
+ <Button android:id="@+id/network_report"
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1"
+ android:layout_marginBottom="2dp"
+ android:background="#505050"
+ android:text="Report"
+ android:textColor="#d4d4d4"/>
+
+ </LinearLayout>
+</LinearLayout>
diff --git a/tests/EmbeddedKitchenSinkApp/res/layout/notification_fragment.xml b/tests/EmbeddedKitchenSinkApp/res/layout/notification_fragment.xml
index b9b8e8b..4e8e1b3 100644
--- a/tests/EmbeddedKitchenSinkApp/res/layout/notification_fragment.xml
+++ b/tests/EmbeddedKitchenSinkApp/res/layout/notification_fragment.xml
@@ -13,56 +13,138 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical" >
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Ongoing notifications can only be dismissed by the CANCEL ALL button."/>
+
<Button
android:id="@+id/cancel_all_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:layout_margin="10dp"
android:text="Cancel All"
- android:textSize="35sp"/>
- <Button
- android:id="@+id/importance_high_button"
- android:layout_width="wrap_content"
+ android:textSize="30sp"/>
+
+ <LinearLayout
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:text="Importance: HIGH (Shows heads-up)"
- android:textSize="35sp"/>
- <Button
- android:id="@+id/importance_high_button_2"
- android:layout_width="wrap_content"
+ android:background="#334666"
+ android:orientation="horizontal">
+
+ <Button
+ android:id="@+id/category_message_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_margin="10dp"
+ android:text="Message"
+ android:textSize="30sp"/>
+
+ <Button
+ android:id="@+id/navigation_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_margin="10dp"
+ android:text="Navigation"
+ android:textSize="30sp"/>
+
+ <Button
+ android:id="@+id/ongoing_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_margin="10dp"
+ android:text="Persistent (No heads-up)"
+ android:textSize="30sp"/>
+
+ <Button
+ android:id="@+id/progress_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_margin="10dp"
+ android:text="Progress (No heads-up)"
+ android:textSize="30sp"/>
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:text="Importance: HIGH (Shows heads-up) 2"
- android:textSize="35sp"/>
- <Button
- android:id="@+id/importance_default_button"
- android:layout_width="wrap_content"
+ android:background="#5a6633"
+ android:orientation="horizontal">
+
+ <Button
+ android:id="@+id/importance_high_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_margin="10dp"
+ android:text="Importance: HIGH"
+ android:textSize="30sp"/>
+
+ <Button
+ android:id="@+id/importance_default_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_margin="10dp"
+ android:text="Importance: DEFAULT (No heads-up)"
+ android:textSize="30sp"/>
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:text="Importance: DEFAULT"
- android:textSize="35sp"/>
- <Button
- android:id="@+id/importance_low_button"
- android:layout_width="wrap_content"
+ android:background="#5a6633"
+ android:orientation="horizontal">
+
+ <Button
+ android:id="@+id/importance_low_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_margin="10dp"
+ android:text="Importance: LOW (No heads-up)"
+ android:textSize="30sp"/>
+
+ <Button
+ android:id="@+id/importance_min_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_margin="10dp"
+ android:text="Importance: MIN (No heads-up)"
+ android:textSize="30sp"/>
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:text="Importance: LOW"
- android:textSize="35sp"/>
- <Button
- android:id="@+id/importance_min_button"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="Importance: MIN"
- android:textSize="35sp"/>
- <Button
- android:id="@+id/ongoing_button"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="Ongoing"
- android:textSize="35sp"/>
- <Button
- android:id="@+id/category_message_button"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="Category: CATEGORY_MESSAGE"
- android:textSize="35sp"/>
+ android:background="#33664d"
+ android:orientation="horizontal">
+
+ <Button
+ android:id="@+id/category_car_emergency_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_margin="10dp"
+ android:text="Car Emergency"
+ android:textSize="30sp"/>
+
+ <Button
+ android:id="@+id/category_car_warning_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_margin="10dp"
+ android:text="Car Warning"
+ android:textSize="30sp"/>
+
+ <Button
+ android:id="@+id/category_car_info_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_margin="10dp"
+ android:text="Car Information (No heads-up)"
+ android:textSize="30sp"/>
+ </LinearLayout>
</LinearLayout>
diff --git a/tests/EmbeddedKitchenSinkApp/res/layout/power_test.xml b/tests/EmbeddedKitchenSinkApp/res/layout/power_test.xml
index 62f80d0..f023972 100644
--- a/tests/EmbeddedKitchenSinkApp/res/layout/power_test.xml
+++ b/tests/EmbeddedKitchenSinkApp/res/layout/power_test.xml
@@ -52,20 +52,5 @@
android:layout_width ="@dimen/powerBtnWidth"
android:text="@string/power_request_shutdown"
android:textSize="@dimen/powerTextSize"/>
-
- <Button
- android:clickable="true"
- android:id="@+id/btnPwrGetBootReason"
- android:layout_height="@dimen/powerBtnHeight"
- android:layout_width ="@dimen/powerBtnWidth"
- android:text="@string/power_get_boot_reason"
- android:textSize="@dimen/powerTextSize"/>
-
- <TextView
- android:id="@+id/tvPowerBootReason"
- android:layout_height="@dimen/powerBtnHeight"
- android:layout_width ="@dimen/powerBtnWidth"
- android:layout_weight="1"
- android:textSize="@dimen/powerTextSize"/>
</LinearLayout>
</LinearLayout>
diff --git a/tests/EmbeddedKitchenSinkApp/res/layout/property.xml b/tests/EmbeddedKitchenSinkApp/res/layout/property.xml
index f8f6f79..f5cc074 100644
--- a/tests/EmbeddedKitchenSinkApp/res/layout/property.xml
+++ b/tests/EmbeddedKitchenSinkApp/res/layout/property.xml
@@ -51,7 +51,7 @@
android:id="@+id/tvGetPropertyValue"
android:gravity="center"
android:layout_height="wrap_content"
- android:layout_weight="2"
+ android:layout_weight="3"
android:layout_width="0dp"
android:textSize="@dimen/propertyValueTextSize"/>
</LinearLayout>
@@ -71,7 +71,7 @@
android:layout_height="wrap_content"
android:layout_weight="2"
android:layout_width="0dp"
- android:inputType="phone" />
+ android:inputType="text" />
<Button
android:id="@+id/bSetProperty"
android:layout_height="wrap_content"
diff --git a/tests/EmbeddedKitchenSinkApp/res/layout/sensors.xml b/tests/EmbeddedKitchenSinkApp/res/layout/sensors.xml
index 6ee854a..aa4a2eb 100644
--- a/tests/EmbeddedKitchenSinkApp/res/layout/sensors.xml
+++ b/tests/EmbeddedKitchenSinkApp/res/layout/sensors.xml
@@ -17,20 +17,46 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
- <!-- dummy one for top area -->
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="50dp"
- android:orientation="vertical"
- android:layout_weight="1" />
+ <!-- Top area -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:orientation="horizontal"
- android:layout_weight="1" >
+ android:orientation="vertical">
<TextView
- android:id="@+id/sensor_info"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
+ android:id="@+id/location_title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/location_title" />
+ <TextView
+ android:id="@+id/location_info"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+ <TextView
+ android:id="@+id/accel_info"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+ <TextView
+ android:id="@+id/gyro_info"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+ <TextView
+ android:id="@+id/mag_info"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+ </LinearLayout>
+ <!-- Bottom area -->
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+ <TextView
+ android:id="@+id/sensor_title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/sensor_title" />
+ <TextView
+ android:id="@+id/sensor_info"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>
diff --git a/tests/EmbeddedKitchenSinkApp/res/layout/sms_received.xml b/tests/EmbeddedKitchenSinkApp/res/layout/sms_received.xml
index 4e3c3da..0a329af 100644
--- a/tests/EmbeddedKitchenSinkApp/res/layout/sms_received.xml
+++ b/tests/EmbeddedKitchenSinkApp/res/layout/sms_received.xml
@@ -39,6 +39,23 @@
<TextView android:id="@+id/bluetoothDevice" android:layout_height="wrap_content"
android:layout_width="wrap_content"/>
+ <LinearLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content">
+ <Button
+ android:id="@+id/uploading_supported_feature"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ android:text="@string/uploading_supported_feature"/>
+ <EditText
+ android:id="@+id/uploading_supported_feature_value"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="0"
+ android:inputType="none" />
+ </LinearLayout>
+
<Button
android:id="@+id/reply"
android:layout_width="wrap_content"
diff --git a/tests/EmbeddedKitchenSinkApp/res/layout/storagewear.xml b/tests/EmbeddedKitchenSinkApp/res/layout/storagewear.xml
index cf98695..52a7763 100644
--- a/tests/EmbeddedKitchenSinkApp/res/layout/storagewear.xml
+++ b/tests/EmbeddedKitchenSinkApp/res/layout/storagewear.xml
@@ -23,7 +23,6 @@
android:layout_height="wrap_content"
android:text="Storage Wear Information"
android:textSize="24dp"
- android:textColor="#ff0000"
android:minLines="5"/>
<ListView
android:id="@+id/storage_events_list"
@@ -58,7 +57,6 @@
android:layout_height="wrap_content"
android:text="Free Disk Space: 1 byte"
android:textSize="24dp"
- android:textColor="#ff0000"
android:minLines="4"/>
<ScrollView
android:id="@+id/scroll_view"
@@ -72,7 +70,6 @@
android:layout_height="fill_parent"
android:text="No I/O activity on record"
android:textSize="20dp"
- android:textColor="#ff0000"
android:minLines="10"/>
</ScrollView>
</LinearLayout>
diff --git a/tests/EmbeddedKitchenSinkApp/res/layout/usb_host.xml b/tests/EmbeddedKitchenSinkApp/res/layout/usb_host.xml
index fbcc608..7a13c4f 100644
--- a/tests/EmbeddedKitchenSinkApp/res/layout/usb_host.xml
+++ b/tests/EmbeddedKitchenSinkApp/res/layout/usb_host.xml
@@ -28,7 +28,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
- android:text="@+string/usb_resolving_handlers"
+ android:text="@string/usb_resolving_handlers"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" />
diff --git a/tests/EmbeddedKitchenSinkApp/res/layout/users.xml b/tests/EmbeddedKitchenSinkApp/res/layout/users.xml
new file mode 100644
index 0000000..e144acd
--- /dev/null
+++ b/tests/EmbeddedKitchenSinkApp/res/layout/users.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical" >
+ <ListView
+ android:id="@+id/user_restrictions_list"
+ android:layout_height="0dp"
+ android:layout_width="match_parent"
+ android:layout_weight="1"
+ android:scrollbars="vertical"/>
+
+ <Button
+ android:id="@+id/apply_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:padding="@dimen/users_button_padding"
+ android:textSize="@dimen/users_button_text_size"
+ android:layout_weight="0"
+ android:text="@string/users_apply_button" />
+</LinearLayout>
diff --git a/tests/EmbeddedKitchenSinkApp/res/layout/vhal_listitem.xml b/tests/EmbeddedKitchenSinkApp/res/layout/vhal_listitem.xml
new file mode 100644
index 0000000..7057660
--- /dev/null
+++ b/tests/EmbeddedKitchenSinkApp/res/layout/vhal_listitem.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="horizontal">
+ <TextView
+ android:id="@+id/textString"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="7"/>
+ <Button
+ android:id="@+id/infoButton"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="2"
+ android:text="config"/>
+ <Button
+ android:id="@+id/valueButton"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="3"
+ android:text="value"/>
+</LinearLayout>
diff --git a/tests/EmbeddedKitchenSinkApp/res/layout/weblinks_fragment.xml b/tests/EmbeddedKitchenSinkApp/res/layout/weblinks_fragment.xml
new file mode 100644
index 0000000..6200ddc
--- /dev/null
+++ b/tests/EmbeddedKitchenSinkApp/res/layout/weblinks_fragment.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_marginStart="40dp"
+ android:layout_marginEnd="40dp"
+ android:id="@+id/buttons">
+ <Button
+ android:layout_width="match_parent"
+ android:layout_height="50dp"
+ android:layout_marginTop="40dp"
+ android:text="@string/weblink_google"
+ android:tag="@string/weblink_google" />
+ <Button
+ android:layout_width="match_parent"
+ android:layout_height="50dp"
+ android:layout_marginTop="40dp"
+ android:text="@string/weblink_nytimes"
+ android:tag="@string/weblink_nytimes" />
+ <Button
+ android:layout_width="match_parent"
+ android:layout_height="50dp"
+ android:layout_marginTop="40dp"
+ android:text="@string/weblink_support_name"
+ android:tag="@string/weblink_support" />
+</LinearLayout>
diff --git a/tests/EmbeddedKitchenSinkApp/res/raw/US_101.png b/tests/EmbeddedKitchenSinkApp/res/raw/US_101.png
new file mode 100644
index 0000000..3626ce0
--- /dev/null
+++ b/tests/EmbeddedKitchenSinkApp/res/raw/US_101.png
Binary files differ
diff --git a/tests/EmbeddedKitchenSinkApp/res/raw/nav_state_data.json b/tests/EmbeddedKitchenSinkApp/res/raw/nav_state_data.json
new file mode 100644
index 0000000..02d7c50
--- /dev/null
+++ b/tests/EmbeddedKitchenSinkApp/res/raw/nav_state_data.json
@@ -0,0 +1,95 @@
+[
+ {
+ "mSteps": [
+ {
+ "mDistance": {
+ "mMeters": 200,
+ "mDisplayValue": "0.2",
+ "mDisplayUnit": { "mValues": [ "KILOMETERS" ] }
+ },
+ "mManeuver": {
+ "mType": { "mValues": [ "DEPART" ] }
+ },
+ "mCue":{
+ "mElements": [
+ {
+ "mText": "Stay on"
+ },
+ {
+ "mImage": {
+ "mContentUri": "content://com.google.android.car.kitchensink.cluster.clustercontentprovider/img/US_101.png"
+ }
+ },
+ {
+ "mText": "East"
+ }
+ ]
+ },
+ "mLanes": [
+ {
+ "mDirections": [
+ {
+ "mShape": { "mValues": [ "SLIGHT_LEFT" ] },
+ "mHighlighted": false
+ }
+ ]
+ },
+ {
+ "mDirections": [
+ {
+ "mShape": { "mValues": [ "STRAIGHT" ] },
+ "mHighlighted": false
+ },
+ {
+ "mShape": { "mValues": [ "SLIGHT_RIGHT" ] },
+ "mHighlighted": true
+ }
+ ]
+ }
+ ]
+ }
+ ],
+ "mCurrentSegment": {
+ "mName": "On McCowan St"
+ },
+ "mDestinations": [
+ {
+ "mTitle": "Home",
+ "mAddress": "123 Main st",
+ "mDistance": {
+ "mMeters": 2000,
+ "mDisplayValue": "2",
+ "mDisplayUnit": { "mValues": [ "KILOMETERS" ] }
+ }
+ }
+ ]
+ },
+ {
+ "mSteps": [
+ {
+ "mDistance": {
+ "mMeters": 91,
+ "mDisplayValue": "300",
+ "mDisplayUnit": { "mValues": [ "FEET" ] }
+ },
+ "mManeuver": {
+ "mType": { "mValues": [ "TURN_NORMAL_LEFT" ] }
+ }
+ }
+ ]
+ },
+ {
+ "mSteps": [
+ {
+ "mDistance": {
+ "mMeters": 3218,
+ "mDisplayValue": "2",
+ "mDisplayUnit": { "mValues": [ "MILES" ] }
+ },
+ "mManeuver": {
+ "mType": { "mValues": [ "TURN_NORMAL_RIGHT" ] }
+ }
+ }
+ ]
+ }
+]
\ No newline at end of file
diff --git a/tests/EmbeddedKitchenSinkApp/res/values/colors.xml b/tests/EmbeddedKitchenSinkApp/res/values/colors.xml
deleted file mode 100644
index 9a1ed89..0000000
--- a/tests/EmbeddedKitchenSinkApp/res/values/colors.xml
+++ /dev/null
@@ -1,20 +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.
-*/
--->
-<resources>
- <color name="car_button_tint">#fffafafa</color>
-</resources>
\ No newline at end of file
diff --git a/tests/EmbeddedKitchenSinkApp/res/values/dimens.xml b/tests/EmbeddedKitchenSinkApp/res/values/dimens.xml
index c8806bc..437d69d 100644
--- a/tests/EmbeddedKitchenSinkApp/res/values/dimens.xml
+++ b/tests/EmbeddedKitchenSinkApp/res/values/dimens.xml
@@ -17,6 +17,8 @@
<dimen name="hvacBtnHeight">60dp</dimen>
<dimen name="hvacBtnMargin">10dp</dimen>
<dimen name="hvacTextSize">24sp</dimen>
+ <dimen name="inputTypeMarginLeft">50dp</dimen>
+ <dimen name="inputTypeTextSize">24sp</dimen>
<dimen name="powerBtnHeight">80dp</dimen>
<dimen name="powerBtnWidth">300dp</dimen>
<dimen name="powerTextSize">24sp</dimen>
@@ -61,4 +63,10 @@
<dimen name="car_keyline_2">108dp</dimen>
<dimen name="car_keyline_3">152dp</dimen>
<dimen name="car_keyline_4">182dp</dimen>
+
+ <!-- Users -->
+ <dimen name="users_button_padding">10dp</dimen>
+ <dimen name="users_button_text_size">24sp</dimen>
+ <dimen name="users_checkbox_padding">5dp</dimen>
+ <dimen name="users_checkbox_text_size">32sp</dimen>
</resources>
diff --git a/tests/EmbeddedKitchenSinkApp/res/values/strings.xml b/tests/EmbeddedKitchenSinkApp/res/values/strings.xml
index 452fec8..f1a645e 100644
--- a/tests/EmbeddedKitchenSinkApp/res/values/strings.xml
+++ b/tests/EmbeddedKitchenSinkApp/res/values/strings.xml
@@ -14,234 +14,217 @@
limitations under the License.
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_title">Kitchen Sink</string>
+ <string name="app_title" translatable="false">Kitchen Sink</string>
<!-- alert dialog -->
<!-- Notification ticker text (shown in the status bar) when a Bluetooth device wants to pair with us -->
- <string name="bluetooth_notif_ticker">Bluetooth pairing request</string>
+ <string name="bluetooth_notif_ticker" translatable="false">Bluetooth pairing request</string>
<!-- Bluetooth settings. Context menu item for a device. Action will first pair, and then connect to all profiles on the device. -->
- <string name="bluetooth_device_context_pair_connect">Pair & connect</string>
+ <string name="bluetooth_device_context_pair_connect" translatable="false">Pair & connect</string>
<!-- Used as setting title (for checkbox) on second screen after selecting Bluetooth settings -->
- <string name="bluetooth">Bluetooth</string>
+ <string name="bluetooth" translatable="false">Bluetooth</string>
<!-- Message when bluetooth is informing the user of the pairing key. [CHAR LIMIT=NONE] -->
- <string name="bluetooth_pairing_key_msg">Bluetooth pairing code</string>
+ <string name="bluetooth_pairing_key_msg" translatable="false">Bluetooth pairing code</string>
<!-- Checkbox label for alphanumeric PIN entry (default is numeric PIN). [CHAR LIMIT=50] -->
- <string name="bluetooth_enable_alphanumeric_pin">PIN contains letters or symbols</string>
+ <string name="bluetooth_enable_alphanumeric_pin" translatable="false">PIN contains letters or symbols</string>
<!-- Message when bluetooth dialog for passkey entry is showing. [CHAR LIMIT=NONE] -->
- <string name="bluetooth_enter_passkey_msg">Type the pairing code then press Return or Enter</string>
+ <string name="bluetooth_enter_passkey_msg" translatable="false">Type the pairing code then press Return or Enter</string>
<!-- Title for the dialog to enter PIN. [CHAR LIMIT=40] -->
- <string name="bluetooth_pairing_request">Pair with <xliff:g id="device_name">%1$s</xliff:g>?</string>
+ <string name="bluetooth_pairing_request" translatable="false">Pair with <xliff:g id="device_name">%1$s</xliff:g>?</string>
<!-- Checkbox message in pairing dialogs. [CHAR LIMIT=NONE] -->
- <string name="bluetooth_pairing_shares_phonebook">Allow <xliff:g id="device_name">%1$s</xliff:g> to access your contacts and call history</string>
+ <string name="bluetooth_pairing_shares_phonebook" translatable="false">Allow <xliff:g id="device_name">%1$s</xliff:g> to access your contacts and call history</string>
<!-- Pairing dialog text to remind user to enter the PIN on the other device. [CHAR LIMIT=NONE] -->
- <string name="bluetooth_enter_pin_other_device">You may also need to type this PIN on the other device.</string>
+ <string name="bluetooth_enter_pin_other_device" translatable="false">You may also need to type this PIN on the other device.</string>
<!-- Pairing dialog text to remind user to enter the passkey on the other device. [CHAR LIMIT=NONE] -->
- <string name="bluetooth_enter_passkey_other_device">You may also need to type this passkey on the other device.</string>
+ <string name="bluetooth_enter_passkey_other_device" translatable="false">You may also need to type this passkey on the other device.</string>
<!-- Bluetooth PIN hint text (below the text entry box). [CHAR LIMIT=30] -->
- <string name="bluetooth_pin_values_hint_16_digits">Must be 16 digits</string>
+ <string name="bluetooth_pin_values_hint_16_digits" translatable="false">Must be 16 digits</string>
<!-- Bluetooth PIN hint text (below the text entry box). [CHAR LIMIT=30] -->
- <string name="bluetooth_pin_values_hint">Usually 0000 or 1234</string>
+ <string name="bluetooth_pin_values_hint" translatable="false">Usually 0000 or 1234</string>
<!-- Notification title when a Bluetooth device wants to pair with us -->
- <string name="bluetooth_notif_title">Pairing request</string>
+ <string name="bluetooth_notif_title" translatable="false">Pairing request</string>
<!-- Notification message when a Bluetooth device wants to pair with us -->
- <string name="bluetooth_notif_message">Tap to pair with <xliff:g id="device_name">%1$s</xliff:g>.</string>
+ <string name="bluetooth_notif_message" translatable="false">Tap to pair with <xliff:g id="device_name">%1$s</xliff:g>.</string>
<!-- Title for BT error dialogs. -->
- <string name="bluetooth_error_title"></string>
+ <string name="bluetooth_error_title" translatable="false"></string>
<!-- hvac -->
- <string name="hvac_acOff">AC OFF</string>
- <string name="hvac_acOn">AC ON</string>
- <string name="hvac_autoOff">Auto OFF</string>
- <string name="hvac_autoOn">Auto ON</string>
- <string name="hvac_defrostFrontOff">Front Defrost OFF</string>
- <string name="hvac_defrostFrontOn">Front Defrost ON</string>
- <string name="hvac_defrostRearOff">Rear Defrost OFF</string>
- <string name="hvac_defrostRearOn">Rear Defrost ON</string>
- <string name="hvac_dualOff">Dual OFF</string>
- <string name="hvac_dualOn">Dual ON</string>
- <string name="hvac_maxAcOff">Max AC OFF</string>
- <string name="hvac_maxAcOn">Max AC ON</string>
- <string name="hvac_maxDefrostOff">Max DEF OFF</string>
- <string name="hvac_maxDefrostOn">Max DEF ON</string>
- <string name="hvac_outsideTempLabel">Outside Temp:</string>
- <string name="hvac_positionFace">Face</string>
- <string name="hvac_positionFloor">Floor</string>
- <string name="hvac_positionFaceAndFloor">Face+Floor</string>
- <string name="hvac_positionDefrost">Defrost</string>
- <string name="hvac_positionDefrostAndFloor">Def+Floor</string>
- <string name="hvac_fanSpeedDn">Fan Speed Down</string>
- <string name="hvac_fanSpeedUp">Fan Speed Up</string>
- <string name="hvac_recircOff">Recirc OFF</string>
- <string name="hvac_recircOn">Recirc ON</string>
- <string name="hvac_tempDn">Temp Down</string>
- <string name="hvac_tempUp">Temp Up</string>
+ <string name="hvac_acOff" translatable="false">AC OFF</string>
+ <string name="hvac_acOn" translatable="false">AC ON</string>
+ <string name="hvac_autoOff" translatable="false">Auto OFF</string>
+ <string name="hvac_autoOn" translatable="false">Auto ON</string>
+ <string name="hvac_defrostFrontOff" translatable="false">Front Defrost OFF</string>
+ <string name="hvac_defrostFrontOn" translatable="false">Front Defrost ON</string>
+ <string name="hvac_defrostRearOff" translatable="false">Rear Defrost OFF</string>
+ <string name="hvac_defrostRearOn" translatable="false">Rear Defrost ON</string>
+ <string name="hvac_dualOff" translatable="false">Dual OFF</string>
+ <string name="hvac_dualOn" translatable="false">Dual ON</string>
+ <string name="hvac_maxAcOff" translatable="false">Max AC OFF</string>
+ <string name="hvac_maxAcOn" translatable="false">Max AC ON</string>
+ <string name="hvac_maxDefrostOff" translatable="false">Max DEF OFF</string>
+ <string name="hvac_maxDefrostOn" translatable="false">Max DEF ON</string>
+ <string name="hvac_outsideTempLabel" translatable="false">Outside Temp:</string>
+ <string name="hvac_positionFace" translatable="false">Face</string>
+ <string name="hvac_positionFloor" translatable="false">Floor</string>
+ <string name="hvac_positionFaceAndFloor" translatable="false">Face+Floor</string>
+ <string name="hvac_positionDefrost" translatable="false">Defrost</string>
+ <string name="hvac_positionDefrostAndFloor" translatable="false">Def+Floor</string>
+ <string name="hvac_fanSpeedDn" translatable="false">Fan Speed Down</string>
+ <string name="hvac_fanSpeedUp" translatable="false">Fan Speed Up</string>
+ <string name="hvac_recircOff" translatable="false">Recirc OFF</string>
+ <string name="hvac_recircOn" translatable="false">Recirc ON</string>
+ <string name="hvac_tempDn" translatable="false">Temp Down</string>
+ <string name="hvac_tempUp" translatable="false">Temp Up</string>
<!-- camera -->
- <string name="rvc_getCapabilities">Get Capabilities</string>
- <string name="rvc_getRvcCrop">Get RVC Crop</string>
- <string name="rvc_setRvcCrop">Set RVC Crop</string>
- <string name="rvc_getRvcPos">Get RVC Pos</string>
- <string name="rvc_setRvcPos">Set RVC Pos</string>
- <string name="rvc_getCameraState">Get State</string>
- <string name="rvc_setCameraState">Set State</string>
- <string name="rvc_state">RVC State</string>
+ <string name="rvc_getCapabilities" translatable="false">Get Capabilities</string>
+ <string name="rvc_getRvcCrop" translatable="false">Get RVC Crop</string>
+ <string name="rvc_setRvcCrop" translatable="false">Set RVC Crop</string>
+ <string name="rvc_getRvcPos" translatable="false">Get RVC Pos</string>
+ <string name="rvc_setRvcPos" translatable="false">Set RVC Pos</string>
+ <string name="rvc_getCameraState" translatable="false">Get State</string>
+ <string name="rvc_setCameraState" translatable="false">Set State</string>
+ <string name="rvc_state" translatable="false">RVC State</string>
<!-- audio -->
- <string name="empty"></string>
- <string name="play">Play</string>
- <string name="play_pcm_once">Play Once</string>
- <string name="stop">Stop</string>
- <string name="play_wav">Play WAV</string>
- <string name="stop_wav">Stop WAV</string>
- <string name="audio_focus">Audio Focus</string>
- <string name="focus_gain">Gain</string>
- <string name="focus_gain_transient_duck">Gain,Transient,Duck</string>
- <string name="focus_release">Release</string>
- <string name="request">request</string>
- <string name="release">release</string>
- <string name="media_play">Media Play</string>
- <string name="nav_play">Nav Play</string>
- <string name="vr_play">VR Play</string>
- <string name="system_play">System Play</string>
- <string name="config_index">Config Index</string>
- <string name="choose_config">Choose config</string>
- <string name="audio_stress_title">Audio Stress Test</string>
- <string name="nav_start">Nav Start</string>
- <string name="nav_end">Nav End</string>
- <string name="vr_start">VR Start</string>
- <string name="vr_end">VR End</string>
- <string name="radio_start">Radio Start</string>
- <string name="radio_end">Radio End</string>
- <string name="speaker_phone_on">Speaker Phone On</string>
- <string name="speaker_phone_off">Speaker Phone Off</string>
- <string name="microphone_on">Mic On</string>
- <string name="microphone_off">Mic Off</string>
- <string name="mock_audio_on">Audio Mocking On</string>
- <string name="mock_audio_off">Audio Mocking Off</string>
-
- <!-- job scheduler -->
- <string name="schedule_button">Schedule a New Job</string>
- <string name="refresh_button">Refresh pending jobs</string>
- <string name="cancel_button">Cancel All Jobs</string>
- <string name="job_info">Current Pending Jobs</string>
- <string name="require_charging">Require Charging</string>
- <string name="require_persisted">Persisted</string>
- <string name="require_periodic">Periodic</string>
- <string name="require_network">Network Type</string>
- <string name="require_idle">Device Idle</string>
- <string name="dish_num">Number of Plates</string>
- <string name="default_dish_num">50</string>
- <string name="network_any">ANY</string>
- <string name="network_none">NONE</string>
- <string name="network_unmetered">UNMETERED</string>
+ <string name="empty" translatable="false"></string>
+ <string name="play" translatable="false">Play</string>
+ <string name="play_pcm_once" translatable="false">Play Once</string>
+ <string name="stop" translatable="false">Stop</string>
+ <string name="play_wav" translatable="false">Play WAV</string>
+ <string name="stop_wav" translatable="false">Stop WAV</string>
+ <string name="audio_focus" translatable="false">Audio Focus</string>
+ <string name="focus_gain" translatable="false">Gain</string>
+ <string name="focus_gain_transient_duck" translatable="false">Gain,Transient,Duck</string>
+ <string name="focus_release" translatable="false">Release</string>
+ <string name="request" translatable="false">request</string>
+ <string name="release" translatable="false">release</string>
+ <string name="media_play" translatable="false">Media Play</string>
+ <string name="nav_play" translatable="false">Nav Play</string>
+ <string name="vr_play" translatable="false">VR Play</string>
+ <string name="system_play" translatable="false">System Play</string>
+ <string name="config_index" translatable="false">Config Index</string>
+ <string name="choose_config" translatable="false">Choose config</string>
+ <string name="audio_stress_title" translatable="false">Audio Stress Test</string>
+ <string name="nav_start" translatable="false">Nav Start</string>
+ <string name="nav_end" translatable="false">Nav End</string>
+ <string name="vr_start" translatable="false">VR Start</string>
+ <string name="vr_end" translatable="false">VR End</string>
+ <string name="radio_start" translatable="false">Radio Start</string>
+ <string name="radio_end" translatable="false">Radio End</string>
+ <string name="speaker_phone_on" translatable="false">Speaker Phone On</string>
+ <string name="speaker_phone_off" translatable="false">Speaker Phone Off</string>
+ <string name="microphone_on" translatable="false">Mic On</string>
+ <string name="microphone_off" translatable="false">Mic Off</string>
+ <string name="mock_audio_on" translatable="false">Audio Mocking On</string>
+ <string name="mock_audio_off" translatable="false">Audio Mocking Off</string>
<!-- keyboard test fragment -->
- <string name="keyboard_test_title">Keyboard Test</string>
- <string name="on_search">OnSearch:</string>
- <string name="on_edit">onEdit:</string>
- <string name="open_ime_button">Open IME</string>
- <string name="close_ime_button">Close IME</string>
- <string name="open_kb_button">Hide/Show Input</string>
+ <string name="keyboard_test_title" translatable="false">Keyboard Test</string>
+ <string name="on_search" translatable="false">OnSearch:</string>
+ <string name="on_edit" translatable="false">onEdit:</string>
+ <string name="open_ime_button" translatable="false">Open IME</string>
+ <string name="close_ime_button" translatable="false">Close IME</string>
+ <string name="open_kb_button" translatable="false">Hide/Show Input</string>
<!-- instrument cluster -->
- <string name="cluster_start">Start metadata</string>
- <string name="cluster_turn_left">Send turn-by-turn</string>
- <string name="cluster_stop">Stop metadata</string>
- <string name="cluster_nav_app_context_loss">Navigation app context lost!</string>
- <string name="cluster_start_activity">Start Nav Activity</string>
+ <string name="cluster_start" translatable="false">Request focus</string>
+ <string name="cluster_start_guidance" translatable="false">Start turn-by-turn</string>
+ <string name="cluster_stop" translatable="false">Abandon focus</string>
+ <string name="cluster_stop_guidance" translatable="false">Stop turn-by-turn</string>
+ <string name="cluster_nav_app_context_loss" translatable="false">Navigation app context lost!</string>
+ <string name="cluster_start_activity" translatable="false">Start Nav Activity</string>
+ <string name="cluster_start_activity_failed" translatable="false">Failed to start activity in cluster</string>
+ <string name="cluster_not_started" translatable="false">Missing navigation focus</string>
<!-- input test -->
- <string name="volume_up">Volume +</string>
- <string name="volume_down">Volume -</string>
- <string name="volume_mute">Mute</string>
- <string name="voice">Voice</string>
- <string name="mock_vehicle_hal">Mock HAL</string>
- <string name="mock_vehicle_hal_off">Mock HAL OFF</string>
- <string name="mock_vehicle_hal_on">Mock HAL ON</string>
- <string name="music">Music</string>
- <string name="call_send">Call</string>
- <string name="call_end">Call end</string>
- <string name="home">Home</string>
- <string name="next_song">Next song</string>
- <string name="prev_song">Prev song</string>
- <string name="tune_right">Tune +</string>
- <string name="tune_left">Tune -</string>
- <string name="music_play">Play</string>
- <string name="music_stop">Stop</string>
- <string name="steering_wheel">Steering Wheel Buttons:</string>
- <string name="sw_left">Left</string>
- <string name="sw_right">Right</string>
- <string name="sw_up">Up</string>
- <string name="sw_down">Down</string>
- <string name="sw_center">Center</string>
- <string name="sw_back">Back</string>
+ <string name="volume_up" translatable="false">Volume +</string>
+ <string name="volume_down" translatable="false">Volume -</string>
+ <string name="volume_mute" translatable="false">Mute</string>
+ <string name="voice" translatable="false">Voice</string>
+ <string name="mock_vehicle_hal" translatable="false">Mock HAL</string>
+ <string name="mock_vehicle_hal_off" translatable="false">Mock HAL OFF</string>
+ <string name="mock_vehicle_hal_on" translatable="false">Mock HAL ON</string>
+ <string name="music" translatable="false">Music</string>
+ <string name="call_send" translatable="false">Call</string>
+ <string name="call_end" translatable="false">Call end</string>
+ <string name="home" translatable="false">Home</string>
+ <string name="next_song" translatable="false">Next song</string>
+ <string name="prev_song" translatable="false">Prev song</string>
+ <string name="tune_right" translatable="false">Tune +</string>
+ <string name="tune_left" translatable="false">Tune -</string>
+ <string name="music_play" translatable="false">Play</string>
+ <string name="music_stop" translatable="false">Stop</string>
+ <string name="steering_wheel" translatable="false">Steering Wheel Buttons:</string>
+ <string name="sw_left" translatable="false">Left</string>
+ <string name="sw_right" translatable="false">Right</string>
+ <string name="sw_up" translatable="false">Up</string>
+ <string name="sw_down" translatable="false">Down</string>
+ <string name="sw_center" translatable="false">Center</string>
+ <string name="sw_back" translatable="false">Back</string>
<!-- power test -->
- <string name="power_get_boot_reason">Get Boot Reason</string>
- <string name="power_request_shutdown">Request Shutdown</string>
- <string name="power_shutdown">Shutdown</string>
- <string name="power_sleep">Sleep</string>
+ <string name="power_request_shutdown" translatable="false">Request Shutdown</string>
+ <string name="power_shutdown" translatable="false">Shutdown</string>
+ <string name="power_sleep" translatable="false">Sleep</string>
<!-- property test -->
- <string name="property_clear">Clear Log</string>
- <string name="property_get">Get</string>
- <string name="property_register">Register</string>
- <string name="property_set">Set</string>
- <string name="property_unregister">Unregister</string>
+ <string name="property_clear" translatable="false">Clear Log</string>
+ <string name="property_get" translatable="false">Get</string>
+ <string name="property_register" translatable="false">Register</string>
+ <string name="property_set" translatable="false">Set</string>
+ <string name="property_unregister" translatable="false">Unregister</string>
<!-- radio test -->
- <string name="radio_open">Open</string>
- <string name="radio_close">Close</string>
- <string name="radio_muted">Muted</string>
- <string name="radio_unmuted">Unmuted</string>
- <string name="radio_next">Next</string>
- <string name="radio_prev">Previous</string>
- <string name="radio_scan_cancel">Cancel scan</string>
- <string name="radio_tune_to_station">Tune to Station</string>
- <string name="radio_step_up">Step Up</string>
- <string name="radio_step_down">Step Down</string>
- <string name="radio_enter_station_hint">Enter Station Frequency (kHz)</string>
- <string name="radio_get_program_info">getProgramInformation</string>
- <string name="radio_am">AM</string>
- <string name="radio_fm">FM</string>
- <string name="radio_station_info">Station info: %1$s</string>
- <string name="radio_channel_info">Channel info: %1$s kHz</string>
- <string name="radio_song_info">Song info: %1$s</string>
- <string name="radio_artist_info">Artist info: %1$s</string>
- <string name="radio_na">N/A</string>
+ <string name="radio_open" translatable="false">Open</string>
+ <string name="radio_close" translatable="false">Close</string>
+ <string name="radio_muted" translatable="false">Muted</string>
+ <string name="radio_unmuted" translatable="false">Unmuted</string>
+ <string name="radio_next" translatable="false">Next</string>
+ <string name="radio_prev" translatable="false">Previous</string>
+ <string name="radio_scan_cancel" translatable="false">Cancel scan</string>
+ <string name="radio_tune_to_station" translatable="false">Tune to Station</string>
+ <string name="radio_step_up" translatable="false">Step Up</string>
+ <string name="radio_step_down" translatable="false">Step Down</string>
+ <string name="radio_enter_station_hint" translatable="false">Enter Station Frequency (kHz)</string>
+ <string name="radio_get_program_info" translatable="false">getProgramInformation</string>
+ <string name="radio_am" translatable="false">AM</string>
+ <string name="radio_fm" translatable="false">FM</string>
+ <string name="radio_station_info" translatable="false">Station info: %1$s</string>
+ <string name="radio_channel_info" translatable="false">Channel info: %1$s kHz</string>
+ <string name="radio_song_info" translatable="false">Song info: %1$s</string>
+ <string name="radio_artist_info" translatable="false">Artist info: %1$s</string>
+ <string name="radio_na" translatable="false">N/A</string>
<!-- sensors test -->
- <string name="sensor_na">N/A</string>
+ <string name="location_title" translatable="false">Location/Orientation:</string>
+ <string name="sensor_title" translatable="false">Car Sensor Data:</string>
+ <string name="sensor_na" translatable="false">N/A</string>
- <string name="sensor_environment">Environment[%1$s]: temperature=%2$s</string>
- <string name="sensor_night">Night[%1$s]: isNight=%2$s</string>
- <string name="sensor_gear">Gear[%1$s]: gear=%2$s</string>
- <string name="sensor_parking_brake">Parking brake[%1$s]: isEngaged=%2$s</string>
- <string name="sensor_odometer">Odometer[%1$s]: kms=%2$s</string>
- <string name="sensor_rpm">RPM[%1$s]: rpm=%2$s</string>
- <string name="sensor_speed">Speed[%1$s]: speed=%2$s</string>
- <string name="sensor_ignition_status">Ignition status[%1$s]: status=%2$s</string>
- <string name="sensor_compass">Compass[%1$s]: bear=%2$s, pitch=%3$s, roll=%4$s</string>
- <string name="sensor_accelerometer">Accelerometer[%1$s]: x=%2$s, y=%3$s, z=%4$s</string>
- <string name="sensor_gyroscope">Gyroscope[%1$s]: x=%2$s, y=%3$s, z=%4$s</string>
- <string name="sensor_location">Location[%1$s]: lat=%2$s, lon=%3$s, accuracy=%4$s, altitude=%5$s, speed=%6$s, bearing=%7$s</string>
- <string name="sensor_gps">GPS Satellites[%1$s]: inView: %2$s, inUse: %3$s. %4$s</string>
- <string name="sensor_single_gps_satellite">(%1$s): usedInFix: %2$s, prn: %3$s, snr: %4$s, azimuth: %5$s, elevation: %6$s</string>
- <string name="sensor_wheel_ticks">Wheel Distance[%1$s]: reset=%2$s, FL=%3$s, FR=%4$s, RL=%5$s, RR=%6$s</string>
- <string name="sensor_wheel_ticks_cfg">Wheel Distance Config: Wheels=%1$s, FL=%2$s, FR=%3$s, RL=%4$s, RR=%5$s</string>
- <string name="sensor_abs_is_active">ABS[%1$s]: isActive=%2$s</string>
- <string name="sensor_traction_control_is_active">Traction Control[%1$s]: isActive=%2$s</string>
- <string name="sensor_fuel_level">Fuel Level[%1$s]: %2$s</string>
- <string name="sensor_fuel_door_open">Fuel Door Open[%1$s]: %2$s</string>
- <string name="sensor_engine_oil_level">Engine Oil Level[%1$s]: %2$s</string>
- <string name="sensor_engine_is_on">Engine Is On[%1$s]: %2$s</string>
- <string name="sensor_ev_battery_level">EV Battery Level[%1$s]: %2$s</string>
- <string name="sensor_ev_charge_port_is_open">EV Charge Port Is Open[%1$s]: %2$s</string>
- <string name="sensor_ev_charge_port_is_connected">EV Charge Port Is Connected[%1$s]: %2$s</string>
- <string name="sensor_ev_charge_rate">EV Charge Rate[%1$s]: %2$s</string>
+ <string name="sensor_environment" translatable="false">Environment[%1$s]: temperature=%2$s</string>
+ <string name="sensor_night" translatable="false">Night[%1$s]: isNight=%2$s</string>
+ <string name="sensor_gear" translatable="false">Gear[%1$s]: gear=%2$s</string>
+ <string name="sensor_parking_brake" translatable="false">Parking brake[%1$s]: isEngaged=%2$s</string>
+ <string name="sensor_odometer" translatable="false">Odometer[%1$s]: kms=%2$s</string>
+ <string name="sensor_rpm" translatable="false">RPM[%1$s]: rpm=%2$s</string>
+ <string name="sensor_speed" translatable="false">Speed[%1$s]: speed=%2$s</string>
+ <string name="sensor_ignition_status" translatable="false">Ignition status[%1$s]: status=%2$s</string>
+ <string name="sensor_wheel_ticks" translatable="false">Wheel Distance[%1$s]: reset=%2$s, FL=%3$s, FR=%4$s, RL=%5$s, RR=%6$s</string>
+ <string name="sensor_wheel_ticks_cfg" translatable="false">Wheel Distance Config: Wheels=%1$s, FL=%2$s, FR=%3$s, RL=%4$s, RR=%5$s</string>
+ <string name="sensor_abs_is_active" translatable="false">ABS[%1$s]: isActive=%2$s</string>
+ <string name="sensor_traction_control_is_active" translatable="false">Traction Control[%1$s]: isActive=%2$s</string>
+ <string name="sensor_fuel_level" translatable="false">Fuel Level[%1$s]: %2$s</string>
+ <string name="sensor_fuel_door_open" translatable="false">Fuel Door Open[%1$s]: %2$s</string>
+ <string name="sensor_engine_oil_level" translatable="false">Engine Oil Level[%1$s]: %2$s</string>
+ <string name="sensor_engine_is_on" translatable="false">Engine Is On[%1$s]: %2$s</string>
+ <string name="sensor_ev_battery_level" translatable="false">EV Battery Level[%1$s]: %2$s</string>
+ <string name="sensor_ev_charge_port_is_open" translatable="false">EV Charge Port Is Open[%1$s]: %2$s</string>
+ <string name="sensor_ev_charge_port_is_connected" translatable="false">EV Charge Port Is Connected[%1$s]: %2$s</string>
+ <string name="sensor_ev_charge_rate" translatable="false">EV Charge Rate[%1$s]: %2$s</string>
+ <string name="sensor_oil_level" translatable="false">Oil Level[%1$s]: %2$s</string>
- <string name="volume_test">Volume Test</string>
- <string name="volume_up_logical">Vol +</string>
- <string name="volume_down_logical">Vol -</string>
- <string name="refresh_volume">Refresh volumes</string>
+ <string name="volume_test" translatable="false">Volume Test</string>
+ <string name="volume_up_logical" translatable="false">Vol +</string>
+ <string name="volume_down_logical" translatable="false">Vol -</string>
+ <string name="refresh_volume" translatable="false">Refresh volumes</string>
<!-- Bluetooth Tests -->
<string name="sms_recipient_label" translatable="false">Recipient #</string>
@@ -256,30 +239,31 @@
<string name="sms_listing_label_count" translatable="false">Count</string>
<string name="sms_listing_label_offset" translatable="false">Offset</string>
<string name="sms_activity_label" translatable="false">Bt Sms Tester</string>
- <string name="sms_enter_tel_num">Enter Tel Num to send msg to</string>
+ <string name="sms_enter_tel_num" translatable="false">Enter Tel Num to send msg to</string>
<string name="sms_reply_busy" translatable="false">Reply "I'm Busy"</string>
<string name="sms_reply_sent" translatable="false">Reply Sent</string>
<string name="sms_reply_delivered" translatable="false">Reply Delivered</string>
- <string name="bluetooth_profile_connect">Profile connect</string>
- <string name="bluetooth_profile_disconnect">Profile disconnect</string>
- <string name="bluetooth_sco_connect">SCO connect</string>
- <string name="bluetooth_sco_disconnect">SCO disconnect</string>
- <string name="bluetooth_pick_device">Pick Device</string>
- <string name="bluetooth_quiet_mode_enable">Quiet Mode</string>
- <string name="bluetooth_hold_call">Hold call</string>
- <string name="bluetooth_voice_recognition_enable">Start Voice Recognition</string>
- <string name="bluetooth_voice_recognition_disable">Stop Voice Recognition</string>
+ <string name="bluetooth_profile_connect" translatable="false">Profile connect</string>
+ <string name="bluetooth_profile_disconnect" translatable="false">Profile disconnect</string>
+ <string name="bluetooth_sco_connect" translatable="false">SCO connect</string>
+ <string name="bluetooth_sco_disconnect" translatable="false">SCO disconnect</string>
+ <string name="bluetooth_pick_device" translatable="false">Pick Device</string>
+ <string name="bluetooth_quiet_mode_enable" translatable="false">Quiet Mode</string>
+ <string name="bluetooth_hold_call" translatable="false">Hold call</string>
+ <string name="bluetooth_voice_recognition_enable" translatable="false">Start Voice Recognition</string>
+ <string name="bluetooth_voice_recognition_disable" translatable="false">Stop Voice Recognition</string>
+ <string name="uploading_supported_feature" translatable="false">Uploading_Supported bit value</string>
<!--Car Service Settings-->
- <string name="garage_title">Garage Mode</string>
- <string name="garage_description">Customize your system maintenance</string>
- <string name="regular_wake_up">Maintenance time</string>
- <string name="garage_switch">Enable garage maintenance</string>
- <string name="garage_enabled">Garage maintenance on</string>
- <string name="garage_disabled">Garage maintenance off</string>
- <string name="garage_limit">Maximum garage maintenance window</string>
- <string name="car_settings">Car Settings</string>
- <string-array name="garage_limit_keys">
+ <string name="garage_title" translatable="false">Garage Mode</string>
+ <string name="garage_description" translatable="false">Customize your system maintenance</string>
+ <string name="regular_wake_up" translatable="false">Maintenance time</string>
+ <string name="garage_switch" translatable="false">Enable garage maintenance</string>
+ <string name="garage_enabled" translatable="false">Garage maintenance on</string>
+ <string name="garage_disabled" translatable="false">Garage maintenance off</string>
+ <string name="garage_limit" translatable="false">Maximum garage maintenance window</string>
+ <string name="car_settings" translatable="false">Car Settings</string>
+ <string-array name="garage_limit_keys" translatable="false">
<item>5 Minutes</item>
<item>10 Minutes</item>
<item>15 Minutes</item>
@@ -289,27 +273,35 @@
<item>"10"</item>
<item>"15"</item>
</string-array>
- <string name="garage_time_limit_summary">%d minutes</string>
+ <string name="garage_time_limit_summary" translatable="false">%d minutes</string>
- <string name="portrait_activity">Portrait Activity</string>
- <string name="landscpae_activity">Landscape Activity</string>
- <string name="finish">Finish</string>
+ <string name="portrait_activity" translatable="false">Portrait Activity</string>
+ <string name="landscpae_activity" translatable="false">Landscape Activity</string>
+ <string name="finish" translatable="false">Finish</string>
<!-- USB Manager Settings -->
- <string name="usb_title">USB Devices settings</string>
- <string name="usb_description">Customize your USB Devices settings</string>
- <string name="usb_available_devices">Connected devices</string>
- <string name="usb_saved_devices">Saved devices</string>
- <string name="usb_pref_delete_title">Remove handling app for USB device</string>
- <string name="usb_pref_delete_message">Are you sure you wan to delete dafault handling app for %1$s?</string>
- <string name="usb_pref_delete_yes">Yes</string>
- <string name="usb_pref_delete_cancel">Cancel</string>
- <string name="usb_resolving_handlers">Getting supported handlers</string>
+ <string name="usb_title" translatable="false">USB Devices settings</string>
+ <string name="usb_description" translatable="false">Customize your USB Devices settings</string>
+ <string name="usb_available_devices" translatable="false">Connected devices</string>
+ <string name="usb_saved_devices" translatable="false">Saved devices</string>
+ <string name="usb_pref_delete_title" translatable="false">Remove handling app for USB device</string>
+ <string name="usb_pref_delete_message" translatable="false">Are you sure you wan to delete dafault handling app for %1$s?</string>
+ <string name="usb_pref_delete_yes" translatable="false">Yes</string>
+ <string name="usb_pref_delete_cancel" translatable="false">Cancel</string>
+ <string name="usb_resolving_handlers" translatable="false">Getting supported handlers</string>
<!-- Action to start assistant activity -->
<string name="assistant_activity_action" translatable="false">"com.google.android.demandspace.START"</string>
<!-- Virtual Display -->
- <string name="av_start_activity">Start Activity</string>
- <string name="av_resize">Resize</string>
+ <string name="av_start_activity" translatable="false">Start Activity</string>
+ <string name="av_resize" translatable="false">Resize</string>
+
+ <string name="weblink_google" translatable="false">www.google.com</string>
+ <string name="weblink_nytimes" translatable="false">www.nytimes.com</string>
+ <string name="weblink_support_name" translatable="false">support.google.com</string>
+ <string name="weblink_support" translatable="false">https://support.google.com/chrome/answer/95414?hl=en&ref_topic=7438008</string>
+
+ <!-- Users -->
+ <string name="users_apply_button" translatable="false">Apply</string>
</resources>
diff --git a/tests/EmbeddedKitchenSinkApp/res/values/styles.xml b/tests/EmbeddedKitchenSinkApp/res/values/styles.xml
index f16d19d..1dcaa55 100644
--- a/tests/EmbeddedKitchenSinkApp/res/values/styles.xml
+++ b/tests/EmbeddedKitchenSinkApp/res/values/styles.xml
@@ -30,13 +30,10 @@
<item name="android:layout_width">@dimen/overview_icon_size</item>
<item name="android:layout_height">@dimen/overview_icon_size</item>
<item name="android:padding">6dp</item>
- <item name="android:background">?android:attr/selectableItemBackgroundBorderless</item>
- <item name="android:tint">@color/car_button_tint</item>
<item name="android:scaleType">fitCenter</item>
<item name="android:clickable">true</item>
</style>
- <style name="KitchenSinkActivityTheme" parent="Theme.Car.Light.NoActionBar.Drawer">
- <item name="android:colorPrimary">@android:color/transparent</item>
+ <style name="KitchenSinkActivityTheme" parent="Theme.NoActionBar.Drawer">
</style>
</resources>
diff --git a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/CarEmulator.java b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/CarEmulator.java
index ecb734d..ca2d6b3 100644
--- a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/CarEmulator.java
+++ b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/CarEmulator.java
@@ -17,6 +17,8 @@
package com.google.android.car.kitchensink;
+import com.google.android.collect.Lists;
+
import android.car.Car;
import android.content.Context;
import android.hardware.automotive.vehicle.V2_0.VehicleHwKeyInputAction;
@@ -24,6 +26,7 @@
import android.hardware.automotive.vehicle.V2_0.VehicleProperty;
import android.hardware.automotive.vehicle.V2_0.VehiclePropertyAccess;
import android.os.SystemClock;
+import android.util.SparseIntArray;
import com.android.car.ICarImpl;
import com.android.car.systeminterface.SystemInterface;
@@ -32,6 +35,10 @@
import com.android.car.vehiclehal.test.MockedVehicleHal.VehicleHalPropertyHandler;
import com.android.car.vehiclehal.test.VehiclePropConfigBuilder;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
public class CarEmulator {
private final Car mCar;
diff --git a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/KitchenSinkActivity.java b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/KitchenSinkActivity.java
index 9453bf7..3c220ca 100644
--- a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/KitchenSinkActivity.java
+++ b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/KitchenSinkActivity.java
@@ -16,33 +16,36 @@
package com.google.android.car.kitchensink;
-
+import android.car.Car;
+import android.car.CarAppFocusManager;
+import android.car.CarNotConnectedException;
import android.car.hardware.CarSensorManager;
import android.car.hardware.hvac.CarHvacManager;
import android.car.hardware.power.CarPowerManager;
import android.car.hardware.property.CarPropertyManager;
+import android.content.ComponentName;
import android.content.Intent;
+import android.content.ServiceConnection;
import android.content.pm.PackageManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
-import android.support.car.Car;
-import android.support.car.CarAppFocusManager;
-import android.support.car.CarConnectionCallback;
-import android.support.car.CarNotConnectedException;
+import android.os.IBinder;
import android.util.Log;
-import androidx.car.drawer.CarDrawerActivity;
import androidx.car.drawer.CarDrawerAdapter;
import androidx.car.drawer.DrawerItemViewHolder;
import androidx.fragment.app.Fragment;
+import com.android.car.apps.common.DrawerActivity;
+
import com.google.android.car.kitchensink.activityview.ActivityViewTestFragment;
import com.google.android.car.kitchensink.alertdialog.AlertDialogTestFragment;
import com.google.android.car.kitchensink.assistant.CarAssistantFragment;
import com.google.android.car.kitchensink.audio.AudioTestFragment;
import com.google.android.car.kitchensink.bluetooth.BluetoothHeadsetFragment;
import com.google.android.car.kitchensink.bluetooth.MapMceTestFragment;
+import com.google.android.car.kitchensink.carboard.KeyboardTestFragment;
import com.google.android.car.kitchensink.cluster.InstrumentClusterFragment;
import com.google.android.car.kitchensink.connectivity.ConnectivityFragment;
import com.google.android.car.kitchensink.cube.CubesTestFragment;
@@ -50,7 +53,6 @@
import com.google.android.car.kitchensink.displayinfo.DisplayInfoFragment;
import com.google.android.car.kitchensink.hvac.HvacTestFragment;
import com.google.android.car.kitchensink.input.InputTestFragment;
-import com.google.android.car.kitchensink.job.JobSchedulerFragment;
import com.google.android.car.kitchensink.notification.NotificationFragment;
import com.google.android.car.kitchensink.orientation.OrientationTestFragment;
import com.google.android.car.kitchensink.power.PowerTestFragment;
@@ -59,13 +61,16 @@
import com.google.android.car.kitchensink.setting.CarServiceSettingsActivity;
import com.google.android.car.kitchensink.storagelifetime.StorageLifetimeFragment;
import com.google.android.car.kitchensink.touch.TouchTestFragment;
+import com.google.android.car.kitchensink.users.UsersFragment;
import com.google.android.car.kitchensink.vhal.VehicleHalFragment;
import com.google.android.car.kitchensink.volume.VolumeTestFragment;
+import com.google.android.car.kitchensink.weblinks.WebLinksTestFragment;
-import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
-public class KitchenSinkActivity extends CarDrawerActivity {
+
+public class KitchenSinkActivity extends DrawerActivity {
private static final String TAG = "KitchenSinkActivity";
private interface ClickHandler {
@@ -141,46 +146,40 @@
}
}
- private final List<MenuEntry> mMenuEntries = new ArrayList<MenuEntry>() {
- {
- add("alert window", AlertDialogTestFragment.class);
- add("assistant", CarAssistantFragment.class);
- add("audio", AudioTestFragment.class);
- add("bluetooth headset",BluetoothHeadsetFragment.class);
- add("bluetooth messaging test", MapMceTestFragment.class);
- add("cubes test", CubesTestFragment.class);
- add("diagnostic", DiagnosticTestFragment.class);
- add("display info", DisplayInfoFragment.class);
- add("hvac", HvacTestFragment.class);
- add("inst cluster", InstrumentClusterFragment.class);
- add("input test", InputTestFragment.class);
- add("job scheduler", JobSchedulerFragment.class);
- add("notification", NotificationFragment.class);
- add("orientation test", OrientationTestFragment.class);
- add("power test", PowerTestFragment.class);
- add("property test", PropertyTestFragment.class);
- add("sensors", SensorsTestFragment.class);
- add("storage lifetime", StorageLifetimeFragment.class);
- add("touch test", TouchTestFragment.class);
- add("volume test", VolumeTestFragment.class);
- add("vehicle hal", VehicleHalFragment.class);
- add("car service settings", () -> {
+ private final List<MenuEntry> mMenuEntries = Arrays.asList(
+ new FragmentMenuEntry("activity view", ActivityViewTestFragment.class),
+ new FragmentMenuEntry("alert window", AlertDialogTestFragment.class),
+ new FragmentMenuEntry("assistant", CarAssistantFragment.class),
+ new FragmentMenuEntry("audio", AudioTestFragment.class),
+ new FragmentMenuEntry("bluetooth headset", BluetoothHeadsetFragment.class),
+ new FragmentMenuEntry("bluetooth messaging test", MapMceTestFragment.class),
+ new OnClickMenuEntry("car service settings", () -> {
Intent intent = new Intent(KitchenSinkActivity.this,
- CarServiceSettingsActivity.class);
+ CarServiceSettingsActivity.class);
startActivity(intent);
- });
- add("activity view", ActivityViewTestFragment.class);
- add("connectivity", ConnectivityFragment.class);
- add("quit", KitchenSinkActivity.this::finish);
- }
+ }),
+ new FragmentMenuEntry("carboard", KeyboardTestFragment.class),
+ new FragmentMenuEntry("connectivity", ConnectivityFragment.class),
+ new FragmentMenuEntry("cubes test", CubesTestFragment.class),
+ new FragmentMenuEntry("diagnostic", DiagnosticTestFragment.class),
+ new FragmentMenuEntry("display info", DisplayInfoFragment.class),
+ new FragmentMenuEntry("hvac", HvacTestFragment.class),
+ new FragmentMenuEntry("inst cluster", InstrumentClusterFragment.class),
+ new FragmentMenuEntry("input test", InputTestFragment.class),
+ new FragmentMenuEntry("notification", NotificationFragment.class),
+ new FragmentMenuEntry("orientation test", OrientationTestFragment.class),
+ new FragmentMenuEntry("power test", PowerTestFragment.class),
+ new FragmentMenuEntry("property test", PropertyTestFragment.class),
+ new FragmentMenuEntry("sensors", SensorsTestFragment.class),
+ new FragmentMenuEntry("storage lifetime", StorageLifetimeFragment.class),
+ new FragmentMenuEntry("touch test", TouchTestFragment.class),
+ new FragmentMenuEntry("users", UsersFragment.class),
+ new FragmentMenuEntry("volume test", VolumeTestFragment.class),
+ new FragmentMenuEntry("vehicle hal", VehicleHalFragment.class),
+ new FragmentMenuEntry("web links", WebLinksTestFragment.class),
+ new OnClickMenuEntry("quit", KitchenSinkActivity.this::finish)
+ );
- <T extends Fragment> void add(String text, Class<T> clazz) {
- add(new FragmentMenuEntry(text, clazz));
- }
- void add(String text, ClickHandler onClick) {
- add(new OnClickMenuEntry(text, onClick));
- }
- };
private Car mCarApi;
private CarHvacManager mHvacManager;
private CarPowerManager mPowerManager;
@@ -201,11 +200,6 @@
return mPropertyManager;
}
- @Override
- protected CarDrawerAdapter getRootAdapter() {
- return new DrawerAdapter();
- }
-
public CarSensorManager getSensorManager() {
return mSensorManager;
}
@@ -213,13 +207,14 @@
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- setToolbarElevation(0f);
- setMainContent(R.layout.kitchen_content);
+ setContentView(R.layout.kitchen_content);
+
// Connection to Car Service does not work for non-automotive yet.
if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) {
initCarApi();
}
Log.i(TAG, "onCreate");
+ getDrawerController().setRootAdapter(new DrawerAdapter());
}
private void initCarApi() {
@@ -227,7 +222,7 @@
mCarApi.disconnect();
mCarApi = null;
}
- mCarApi = Car.createCar(this, mCarConnectionCallback);
+ mCarApi = Car.createCar(this, mServiceConnection);
mCarApi.connect();
}
@@ -276,10 +271,9 @@
.commit();
}
- private final CarConnectionCallback mCarConnectionCallback =
- new CarConnectionCallback() {
+ private final ServiceConnection mServiceConnection = new ServiceConnection() {
@Override
- public void onConnected(Car car) {
+ public void onServiceConnected(ComponentName name, IBinder service) {
Log.d(TAG, "Connected to Car Service");
synchronized (mPropertyManagerReady) {
try {
@@ -301,7 +295,7 @@
}
@Override
- public void onDisconnected(Car car) {
+ public void onServiceDisconnected(ComponentName name) {
Log.d(TAG, "Disconnect from Car Service");
}
};
@@ -324,11 +318,11 @@
@Override
protected void populateViewHolder(DrawerItemViewHolder holder, int position) {
- holder.getTitle().setText(mMenuEntries.get(position).getText());
+ holder.getTitleView().setText(mMenuEntries.get(position).getText());
+ holder.itemView.setOnClickListener(v -> onItemClick(holder.getAdapterPosition()));
}
- @Override
- public void onItemClick(int position) {
+ private void onItemClick(int position) {
if ((position < 0) || (position >= mMenuEntries.size())) {
Log.wtf(TAG, "Unknown menu item: " + position);
return;
diff --git a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/audio/AudioPlayer.java b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/audio/AudioPlayer.java
index 50a5e9e..c13b0be 100644
--- a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/audio/AudioPlayer.java
+++ b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/audio/AudioPlayer.java
@@ -23,6 +23,8 @@
import android.media.MediaPlayer;
import android.util.Log;
+import com.google.android.car.kitchensink.R;
+
import java.io.IOException;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -48,27 +50,37 @@
@Override
public void onAudioFocusChange(int focusChange) {
- Log.i(TAG, "audio focus change " + focusChange);
if (mPlayer == null) {
+ Log.e(TAG, "mPlayer is null");
return;
}
if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {
+ Log.i(TAG, "Audio focus change AUDIOFOCUS_GAIN for usage " + mAttrib.getUsage());
mPlayer.setVolume(1.0f, 1.0f);
if (mRepeat && isPlaying()) {
- doResume();
+ // Resume
+ Log.i(TAG, "resuming player");
+ mPlayer.start();
}
} else if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK) {
- if (isPlaying()) {
- // Duck to 20% volume (which matches system ducking as of this date)
- mPlayer.setVolume(0.2f, 0.2f);
- }
- } else if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT && mRepeat) {
- if (isPlaying()) {
- doPause();
+ // While we used to setVolume on the player to 20%, we don't do this anymore
+ // because we expect the car's audio hal do handle ducking as it sees fit.
+ Log.i(TAG, "Audio focus change AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK -> do nothing");
+ } else if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT) {
+ Log.i(TAG, "Audio focus change AUDIOFOCUS_LOSS_TRANSIENT for usage "
+ + mAttrib.getUsage());
+ if (mRepeat && isPlaying()) {
+ Log.i(TAG, "pausing repeating player");
+ mPlayer.pause();
+ } else {
+ Log.i(TAG, "stopping one shot player");
+ stop();
}
} else {
+ Log.e(TAG, "Unrecognized audio focus change " + focusChange);
if (isPlaying()) {
- doStop();
+ Log.i(TAG, "stopping player");
+ stop();
}
}
}
@@ -100,13 +112,18 @@
mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
int ret = AudioManager.AUDIOFOCUS_REQUEST_GRANTED;
if (mHandleFocus) {
+ // NOTE: We are CONSCIOUSLY asking for focus again even if already playing in order
+ // exercise the framework's focus logic when faced with a (sloppy) application which
+ // might do this.
+ Log.i(TAG, "Asking for focus for usage " + mAttrib.getUsage());
ret = mAudioManager.requestAudioFocus(mFocusListener, mAttrib,
focusRequest, 0);
}
if (ret == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
+ Log.i(TAG, "MediaPlayer got focus for usage " + mAttrib.getUsage());
doStart();
} else {
- Log.i(TAG, "no focus");
+ Log.i(TAG, "MediaPlayer denied focus for usage " + mAttrib.getUsage());
}
}
@@ -142,10 +159,10 @@
mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
+ Log.i(TAG, "AudioPlayer onCompletion");
mPlaying.set(false);
if (!mRepeat && mHandleFocus) {
mPlayer.stop();
- mPlayer.release();
mPlayer = null;
mAudioManager.abandonAudioFocus(mFocusListener);
if (mListener != null) {
@@ -161,7 +178,7 @@
AssetFileDescriptor afd =
mContext.getResources().openRawResourceFd(mResourceId);
if (afd == null) {
- throw new RuntimeException("no res");
+ throw new RuntimeException("resource not found");
}
mPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(),
afd.getLength());
@@ -174,35 +191,18 @@
}
public void stop() {
- doStop();
- if (mHandleFocus) {
- mAudioManager.abandonAudioFocus(mFocusListener);
- }
- }
-
- public void release() {
- if (isPlaying()) {
- stop();
- }
- }
-
- private void doStop() {
if (!mPlaying.getAndSet(false)) {
Log.i(TAG, "already stopped");
return;
}
- Log.i(TAG, "doStop audio");
+ Log.i(TAG, "stop");
+
mPlayer.stop();
- mPlayer.release();
mPlayer = null;
- }
- private void doPause() {
- mPlayer.pause();
- }
-
- private void doResume() {
- mPlayer.start();
+ if (mHandleFocus) {
+ mAudioManager.abandonAudioFocus(mFocusListener);
+ }
}
public boolean isPlaying() {
diff --git a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/audio/AudioTestFragment.java b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/audio/AudioTestFragment.java
index 6325512..54c77a0 100644
--- a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/audio/AudioTestFragment.java
+++ b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/audio/AudioTestFragment.java
@@ -132,7 +132,7 @@
.setUsage(AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE)
.build();
mVrAudioAttrib = new AudioAttributes.Builder()
- .setUsage(AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE)
+ .setUsage(AudioAttributes.USAGE_ASSISTANT)
.build();
mRadioAudioAttrib = new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
@@ -147,7 +147,6 @@
mMusicAudioAttrib);
mNavGuidancePlayer = new AudioPlayer(mContext, R.raw.turnright,
mNavAudioAttrib);
- // no Usage for voice command yet.
mVrPlayer = new AudioPlayer(mContext, R.raw.one2six,
mVrAudioAttrib);
mSystemPlayer = new AudioPlayer(mContext, R.raw.ring_classic_01,
@@ -197,6 +196,7 @@
view.findViewById(R.id.button_wav_play_stop).setOnClickListener(v -> mWavPlayer.stop());
view.findViewById(R.id.button_nav_play_once).setOnClickListener(v -> {
if (mAppFocusManager == null) {
+ Log.e(TAG, "mAppFocusManager is null");
return;
}
if (DBG) {
@@ -217,6 +217,7 @@
});
view.findViewById(R.id.button_vr_play_once).setOnClickListener(v -> {
if (mAppFocusManager == null) {
+ Log.e(TAG, "mAppFocusManager is null");
return;
}
if (DBG) {
@@ -300,6 +301,7 @@
private void handleNavStart() {
if (mAppFocusManager == null) {
+ Log.e(TAG, "mAppFocusManager is null");
return;
}
if (DBG) {
@@ -317,6 +319,7 @@
private void handleNavEnd() {
if (mAppFocusManager == null) {
+ Log.e(TAG, "mAppFocusManager is null");
return;
}
if (DBG) {
@@ -329,6 +332,7 @@
private void handleVrStart() {
if (mAppFocusManager == null) {
+ Log.e(TAG, "mAppFocusManager is null");
return;
}
if (DBG) {
@@ -346,6 +350,7 @@
private void handleVrEnd() {
if (mAppFocusManager == null) {
+ Log.e(TAG, "mAppFocusManager is null");
return;
}
if (DBG) {
diff --git a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/bluetooth/MapMceTestFragment.java b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/bluetooth/MapMceTestFragment.java
index 2d9df69..e6c0738 100644
--- a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/bluetooth/MapMceTestFragment.java
+++ b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/bluetooth/MapMceTestFragment.java
@@ -75,6 +75,7 @@
private KitchenSinkActivity mActivity;
private Intent mSendIntent;
private Intent mDeliveryIntent;
+ EditText mUploadingSupportedFeatureText;
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
@@ -95,6 +96,18 @@
mMessage = (TextView) v.findViewById(R.id.messageContent);
mDevicePicker = (Button) v.findViewById(R.id.bluetooth_pick_device);
mDeviceDisconnect = (Button) v.findViewById(R.id.bluetooth_disconnect_device);
+ Button uploadingFeatureValue = (Button) v.findViewById(R.id.uploading_supported_feature);
+ mUploadingSupportedFeatureText =
+ (EditText) v.findViewById(R.id.uploading_supported_feature_value);
+
+ uploadingFeatureValue.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ int value = getUploadingFeatureValue();
+ mUploadingSupportedFeatureText.setText(value + "");
+ }
+ });
+
//TODO add manual entry option for phone number
reply.setOnClickListener(new View.OnClickListener() {
@Override
@@ -194,6 +207,25 @@
}
}
+ private int getUploadingFeatureValue() {
+ synchronized (mLock) {
+ BluetoothDevice remoteDevice;
+ try {
+ remoteDevice = mBluetoothAdapter.getRemoteDevice(
+ mBluetoothDevice.getText().toString());
+ } catch (java.lang.IllegalArgumentException e) {
+ Log.e(TAG, e.toString());
+ return -1;
+ }
+
+ if (mMapProfile != null) {
+ Log.d(TAG, "getUploadingFeatureValue");
+ return (mMapProfile.isUploadingSupported(remoteDevice)) ? 1 : 0;
+ }
+ return -1;
+ }
+ }
+
private void sendMessage(Uri[] recipients, String message) {
if (mActivity.checkSelfPermission(Manifest.permission.SEND_SMS)
!= PackageManager.PERMISSION_GRANTED) {
diff --git a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/carboard/KeyboardTestFragment.java b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/carboard/KeyboardTestFragment.java
new file mode 100644
index 0000000..9b1508e
--- /dev/null
+++ b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/carboard/KeyboardTestFragment.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.android.car.kitchensink.carboard;
+
+import android.annotation.Nullable;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.fragment.app.Fragment;
+
+import com.google.android.car.kitchensink.R;
+
+public class KeyboardTestFragment extends Fragment {
+ @Override
+ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
+ @Nullable Bundle savedInstanceState) {
+ return inflater.inflate(R.layout.input_type_test, container, false);
+ }
+}
diff --git a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/cluster/ClusterContentProvider.java b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/cluster/ClusterContentProvider.java
new file mode 100644
index 0000000..4ad9b02
--- /dev/null
+++ b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/cluster/ClusterContentProvider.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.google.android.car.kitchensink.cluster;
+
+import android.content.ContentProvider;
+import android.content.ContentValues;
+import android.content.UriMatcher;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.ParcelFileDescriptor;
+import android.util.Log;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.StandardCopyOption;
+
+/**
+ * Image Content Provider for the car instument cluster
+ */
+public class ClusterContentProvider extends ContentProvider {
+ private static final String TAG = "ClusterContentProvider";
+ private static final String AUTHORITY =
+ "com.google.android.car.kitchensink.cluster.clustercontentprovider";
+
+ private UriMatcher mUriMatcher;
+ private static final int URI_IMAGE_CODE = 1;
+
+ @Override
+ public boolean onCreate() {
+ mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
+ mUriMatcher.addURI(AUTHORITY, "img/*", URI_IMAGE_CODE);
+
+ return true;
+ }
+
+ @Override
+ public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
+ switch (mUriMatcher.match(uri)) {
+ case URI_IMAGE_CODE:
+ // Tries to get the img file from internal cache
+ String filename = new File(uri.getPath()).getName();
+ File imageFile = new File(
+ getContext().getCacheDir() + File.separator + uri.getLastPathSegment());
+
+ // If the file doesn't exist in internal cache,
+ // copy the file from res.raw into internal cache
+ if (!imageFile.exists()) {
+ InputStream inputStream = getContext().getResources().openRawResource(
+ getContext().getResources().getIdentifier(
+ filename.substring(0, filename.lastIndexOf(".")),
+ "raw",
+ getContext().getPackageName()));
+
+ try {
+ Files.copy(inputStream, imageFile.toPath(),
+ StandardCopyOption.REPLACE_EXISTING);
+ } catch (IOException e) {
+ Log.e(TAG, "could not copy file to internal cache: " + uri.getPath(), e);
+ }
+
+ imageFile = new File(
+ getContext().getCacheDir() + File.separator + uri.getLastPathSegment());
+ }
+
+ ParcelFileDescriptor image = ParcelFileDescriptor.open(imageFile,
+ ParcelFileDescriptor.MODE_READ_ONLY);
+
+ return image;
+
+ default:
+ return null;
+ }
+ }
+
+
+ @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/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/cluster/FakeClusterNavigationActivity.java b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/cluster/FakeClusterNavigationActivity.java
index 964d812..1ef5449 100644
--- a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/cluster/FakeClusterNavigationActivity.java
+++ b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/cluster/FakeClusterNavigationActivity.java
@@ -17,13 +17,11 @@
package com.google.android.car.kitchensink.cluster;
import android.app.Activity;
-import android.car.cluster.CarInstrumentClusterManager;
+import android.car.Car;
import android.car.cluster.ClusterActivityState;
+import android.content.Intent;
import android.graphics.Rect;
import android.os.Bundle;
-import android.support.car.Car;
-import android.support.car.CarConnectionCallback;
-import android.support.car.CarNotConnectedException;
import android.util.Log;
import android.widget.ImageView;
import android.widget.RelativeLayout;
@@ -33,14 +31,9 @@
/**
* Fake navigation activity for instrument cluster.
*/
-public class FakeClusterNavigationActivity
- extends Activity
- implements CarInstrumentClusterManager.Callback {
-
+public class FakeClusterNavigationActivity extends Activity {
private final static String TAG = FakeClusterNavigationActivity.class.getSimpleName();
- private Car mCarApi;
- private CarInstrumentClusterManager mClusterManager;
private ImageView mUnobscuredArea;
@Override
@@ -50,27 +43,27 @@
setContentView(R.layout.fake_cluster_navigation_activity);
mUnobscuredArea = findViewById(R.id.unobscuredArea);
- mCarApi = Car.createCar(this /* context */, new CarConnectionCallback() {
-
- @Override
- public void onConnected(Car car) {
- onCarConnected(car);
- }
-
- @Override
- public void onDisconnected(Car car) {
- onCarDisconnected(car);
- }
- });
- Log.i(TAG, "Connecting to car api...");
- mCarApi.connect();
+ handleIntent(getIntent());
}
-
@Override
- public void onClusterActivityStateChanged(String category, Bundle clusterActivityState) {
- ClusterActivityState state = ClusterActivityState.fromBundle(clusterActivityState);
- Log.i(TAG, "onClusterActivityStateChanged, category: " + category + ", state: " + state);
+ protected void onNewIntent(Intent intent) {
+ super.onNewIntent(intent);
+ handleIntent(intent);
+ }
+
+ private void handleIntent(Intent intent) {
+ if (intent == null) {
+ Log.w(TAG, "Received a null intent");
+ return;
+ }
+ Bundle bundle = intent.getBundleExtra(Car.CAR_EXTRA_CLUSTER_ACTIVITY_STATE);
+ if (bundle == null) {
+ Log.w(TAG, "Received an intent without " + Car.CAR_EXTRA_CLUSTER_ACTIVITY_STATE);
+ return;
+ }
+ ClusterActivityState state = ClusterActivityState.fromBundle(bundle);
+ Log.i(TAG, "handling intent with state: " + state);
Rect unobscured = state.getUnobscuredBounds();
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
@@ -78,26 +71,4 @@
lp.setMargins(unobscured.left, unobscured.top, 0, 0);
mUnobscuredArea.setLayoutParams(lp);
}
-
- private void onCarConnected(Car car) {
- Log.i(TAG, "onCarConnected, car: " + car);
- try {
- mClusterManager = (CarInstrumentClusterManager) car.getCarManager(
- android.car.Car.CAR_INSTRUMENT_CLUSTER_SERVICE);
- } catch (CarNotConnectedException e) {
- throw new IllegalStateException(e);
- }
-
- try {
- Log.i(TAG, "registering callback...");
- mClusterManager.registerCallback(CarInstrumentClusterManager.CATEGORY_NAVIGATION, this);
- Log.i(TAG, "callback registered");
- } catch (android.car.CarNotConnectedException e) {
- throw new IllegalStateException(e);
- }
- }
-
- private void onCarDisconnected(Car car) {
-
- }
}
\ No newline at end of file
diff --git a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/cluster/InstrumentClusterFragment.java b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/cluster/InstrumentClusterFragment.java
index 8e4483e..a711cbb 100644
--- a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/cluster/InstrumentClusterFragment.java
+++ b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/cluster/InstrumentClusterFragment.java
@@ -15,68 +15,141 @@
*/
package com.google.android.car.kitchensink.cluster;
-import android.app.AlertDialog;
-import android.car.cluster.CarInstrumentClusterManager;
-import android.content.Intent;
+import android.annotation.Nullable;
+import android.car.Car;
+import android.car.CarAppFocusManager;
+import android.car.CarNotConnectedException;
+import android.car.navigation.CarNavigationStatusManager;
+import android.content.ComponentName;
+import android.content.ServiceConnection;
import android.content.pm.PackageManager;
import android.os.Bundle;
-import android.support.car.Car;
-import android.support.car.CarAppFocusManager;
-import android.support.car.CarConnectionCallback;
-import android.support.car.CarNotConnectedException;
-import android.support.car.navigation.CarNavigationStatusManager;
+import android.os.IBinder;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.widget.Button;
import android.widget.Toast;
-import androidx.annotation.Nullable;
+import androidx.annotation.IdRes;
+import androidx.annotation.NonNull;
+import androidx.car.cluster.navigation.NavigationState;
import androidx.fragment.app.Fragment;
import com.google.android.car.kitchensink.R;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.Timer;
+import java.util.TimerTask;
/**
* Contains functions to test instrument cluster API.
*/
public class InstrumentClusterFragment extends Fragment {
- private static final String TAG = InstrumentClusterFragment.class.getSimpleName();
+ private static final String TAG = "Cluster.KitchenSink";
private static final int DISPLAY_IN_CLUSTER_PERMISSION_REQUEST = 1;
private CarNavigationStatusManager mCarNavigationStatusManager;
private CarAppFocusManager mCarAppFocusManager;
private Car mCarApi;
+ private Timer mTimer;
+ private NavigationState[] mNavStateData;
+ private Button mTurnByTurnButton;
- private final CarConnectionCallback mCarConnectionCallback = new CarConnectionCallback() {
- @Override
- public void onConnected(Car car) {
- Log.d(TAG, "Connected to Car Service");
- try {
- mCarNavigationStatusManager =
- mCarApi.getCarManager(CarNavigationStatusManager.class);
- mCarAppFocusManager = mCarApi.getCarManager(CarAppFocusManager.class);
- } catch (CarNotConnectedException e) {
- Log.e(TAG, "Car is not connected!", e);
- }
+ private ServiceConnection mCarServiceConnection = new ServiceConnection() {
+ @Override
+ public void onServiceConnected(ComponentName name, IBinder service) {
+ Log.d(TAG, "Connected to Car Service");
+ try {
+ mCarNavigationStatusManager = (CarNavigationStatusManager) mCarApi
+ .getCarManager(Car.CAR_NAVIGATION_SERVICE);
+ mCarAppFocusManager = (CarAppFocusManager) mCarApi
+ .getCarManager(Car.APP_FOCUS_SERVICE);
+ } catch (CarNotConnectedException e) {
+ Log.e(TAG, "Car is not connected!", e);
}
+ }
- @Override
- public void onDisconnected(Car car) {
+ @Override
+ public void onServiceDisconnected(ComponentName name) {
Log.d(TAG, "Disconnect from Car Service");
}
};
+ private final CarAppFocusManager.OnAppFocusOwnershipCallback mFocusCallback =
+ new CarAppFocusManager.OnAppFocusOwnershipCallback() {
+ @Override
+ public void onAppFocusOwnershipLost(@CarAppFocusManager.AppFocusType int appType) {
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "onAppFocusOwnershipLost, appType: " + appType);
+ }
+ Toast.makeText(getContext(), getText(R.string.cluster_nav_app_context_loss),
+ Toast.LENGTH_LONG).show();
+ }
+
+ @Override
+ public void onAppFocusOwnershipGranted(@CarAppFocusManager.AppFocusType int appType) {
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "onAppFocusOwnershipGranted, appType: " + appType);
+ }
+ }
+ };
+ private CarAppFocusManager.OnAppFocusChangedListener mOnAppFocusChangedListener =
+ (appType, active) -> {
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "onAppFocusChanged, appType: " + appType + " active: " + active);
+ }
+ };
+
+
private void initCarApi() {
if (mCarApi != null && mCarApi.isConnected()) {
mCarApi.disconnect();
mCarApi = null;
}
- mCarApi = Car.createCar(getContext(), mCarConnectionCallback);
+ mCarApi = Car.createCar(getContext(), mCarServiceConnection);
mCarApi.connect();
}
+ /**
+ * Loads sample navigation data from the "nav_state_data.json" file.
+ */
+ @NonNull
+ private NavigationState[] getNavStateData() {
+ try {
+ Gson gson = new GsonBuilder().create();
+ String navStateData = getRawResourceAsString(R.raw.nav_state_data);
+ NavigationState[] navigationState = gson.fromJson(navStateData,
+ NavigationState[].class);
+ return navigationState;
+ } catch (IOException ex) {
+ Log.e(TAG, "Unable to read navigation state data", ex);
+ return new NavigationState[0];
+ }
+ }
+
+ /**
+ * Loads a raw resource as a single string.
+ */
+ @NonNull
+ private String getRawResourceAsString(@IdRes int resId) throws IOException {
+ InputStream inputStream = getResources().openRawResource(resId);
+ BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
+ StringBuilder builder = new StringBuilder();
+ for (String line; (line = reader.readLine()) != null; ) {
+ builder.append(line).append("\n");
+ }
+ return builder.toString();
+ }
+
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
@@ -84,8 +157,10 @@
View view = inflater.inflate(R.layout.instrument_cluster, container, false);
view.findViewById(R.id.cluster_start_button).setOnClickListener(v -> initCluster());
- view.findViewById(R.id.cluster_turn_left_button).setOnClickListener(v -> sendTurn());
- view.findViewById(R.id.cluster_start_activity).setOnClickListener(v -> startNavActivity());
+ view.findViewById(R.id.cluster_stop_button).setOnClickListener(v -> stopCluster());
+
+ mTurnByTurnButton = view.findViewById(R.id.cluster_turn_left_button);
+ mTurnByTurnButton.setOnClickListener(v -> toggleSendTurn());
return view;
}
@@ -93,97 +168,106 @@
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
initCarApi();
-
super.onCreate(savedInstanceState);
}
- private void startNavActivity() {
- CarInstrumentClusterManager clusterManager;
- try {
- clusterManager = (CarInstrumentClusterManager) mCarApi.getCarManager(
- android.car.Car.CAR_INSTRUMENT_CLUSTER_SERVICE);
- } catch (CarNotConnectedException e) {
- Log.e(TAG, "Failed to get CarInstrumentClusterManager", e);
- Toast.makeText(getContext(), "Failed to get CarInstrumentClusterManager",
- Toast.LENGTH_LONG).show();
- return;
+ /**
+ * Enables/disables sending turn-by-turn data through the {@link CarNavigationStatusManager}
+ */
+ private void toggleSendTurn() {
+ // If we haven't yet load the sample navigation state data, do so.
+ if (mNavStateData == null) {
+ mNavStateData = getNavStateData();
}
- // Implicit intent
- Intent intent = new Intent(Intent.ACTION_MAIN);
- intent.addCategory(CarInstrumentClusterManager.CATEGORY_NAVIGATION);
- try {
- clusterManager.startActivity(intent);
- } catch (android.car.CarNotConnectedException e) {
- Log.e(TAG, "Failed to startActivity in cluster", e);
- Toast.makeText(getContext(), "Failed to start activity in cluster",
- Toast.LENGTH_LONG).show();
- return;
+ // Toggle a timer to send update periodically.
+ if (mTimer == null) {
+ startSendTurn();
+ } else {
+ stopSendTurn();
}
}
- private void sendTurn() {
- // TODO(deanh): Make this actually meaningful.
- Bundle bundle = new Bundle();
- bundle.putString("someName", "someValue time=" + System.currentTimeMillis());
+ private void startSendTurn() {
+ if (mTimer != null) {
+ stopSendTurn();
+ }
+ if (!hasFocus()) {
+ Toast.makeText(getContext(), getText(R.string.cluster_not_started), Toast.LENGTH_LONG)
+ .show();
+ return;
+ }
+ mTimer = new Timer();
+ mTimer.schedule(new TimerTask() {
+ private int mPos;
+
+ @Override
+ public void run() {
+ sendTurn(mNavStateData[mPos]);
+ mPos = (mPos + 1) % mNavStateData.length;
+ }
+ }, 0, 1000);
+ mTurnByTurnButton.setText(R.string.cluster_stop_guidance);
+ }
+
+ private void stopSendTurn() {
+ if (mTimer != null) {
+ mTimer.cancel();
+ mTimer = null;
+ }
+ mTurnByTurnButton.setText(R.string.cluster_start_guidance);
+ }
+
+ /**
+ * Sends one update of the navigation state through the {@link CarNavigationStatusManager}
+ */
+ private void sendTurn(@NonNull NavigationState state) {
try {
+ Bundle bundle = new Bundle();
+ bundle.putParcelable("navstate", state.toParcelable());
mCarNavigationStatusManager.sendEvent(1, bundle);
+ Log.i(TAG, "Sending nav state: " + state);
} catch(CarNotConnectedException e) {
Log.e(TAG, "Failed to send turn information.", e);
}
}
private void initCluster() {
- try {
- mCarAppFocusManager
- .addFocusListener(new CarAppFocusManager.OnAppFocusChangedListener() {
- @Override
- public void onAppFocusChanged(CarAppFocusManager manager, int appType,
- boolean active) {
- Log.d(TAG, "onAppFocusChanged, appType: " + appType + " active: "
- + active);
- }
- }, CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION);
- } catch (CarNotConnectedException e) {
- Log.e(TAG, "Failed to register focus listener", e);
+ if (hasFocus()) {
+ Log.i(TAG, "Already has focus");
+ return;
}
-
- CarAppFocusManager.OnAppFocusOwnershipCallback
- focusCallback = new CarAppFocusManager.OnAppFocusOwnershipCallback() {
- @Override
- public void onAppFocusOwnershipLost(CarAppFocusManager manager, int focus) {
- Log.w(TAG, "onAppFocusOwnershipLost, focus: " + focus);
- new AlertDialog.Builder(getContext())
- .setTitle(getContext().getApplicationInfo().name)
- .setMessage(R.string.cluster_nav_app_context_loss)
- .show();
- }
-
- @Override
- public void onAppFocusOwnershipGranted(CarAppFocusManager manager, int focus) {
- Log.w(TAG, "onAppFocusOwnershipGranted, focus: " + focus);
- }
-
- };
try {
+ mCarAppFocusManager.addFocusListener(mOnAppFocusChangedListener,
+ CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION);
mCarAppFocusManager.requestAppFocus(CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION,
- focusCallback);
+ mFocusCallback);
+ Log.i(TAG, "Focus requested");
} catch (CarNotConnectedException e) {
- Log.e(TAG, "Failed to set active focus", e);
+ Log.e(TAG, "Failed to request focus", e);
}
+ }
+ private boolean hasFocus() {
try {
- boolean ownsFocus = mCarAppFocusManager.isOwningFocus(
- CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION, focusCallback);
- Log.d(TAG, "Owns APP_FOCUS_TYPE_NAVIGATION: " + ownsFocus);
- if (!ownsFocus) {
- throw new RuntimeException("Focus was not acquired.");
+ boolean ownsFocus = mCarAppFocusManager.isOwningFocus(mFocusCallback,
+ CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION);
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "Owns APP_FOCUS_TYPE_NAVIGATION: " + ownsFocus);
}
+ return ownsFocus;
} catch (CarNotConnectedException e) {
Log.e(TAG, "Failed to get owned focus", e);
+ return false;
}
+ }
- // TODO(deanh): re-implement this using sendEvent()
+ private void stopCluster() {
+ stopSendTurn();
+ mCarAppFocusManager.removeFocusListener(mOnAppFocusChangedListener,
+ CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION);
+ mCarAppFocusManager.abandonAppFocus(mFocusCallback,
+ CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION);
}
@Override
diff --git a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/connectivity/ConnectivityFragment.java b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/connectivity/ConnectivityFragment.java
index 3c04bcb..29c1d4c 100644
--- a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/connectivity/ConnectivityFragment.java
+++ b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/connectivity/ConnectivityFragment.java
@@ -18,8 +18,10 @@
import android.annotation.Nullable;
import android.annotation.SuppressLint;
+import android.graphics.Color;
import android.net.ConnectivityManager;
import android.net.ConnectivityManager.NetworkCallback;
+import android.net.LinkProperties;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkInfo;
@@ -27,49 +29,396 @@
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
+import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import android.widget.ArrayAdapter;
import android.widget.ListView;
+import android.widget.TextView;
import android.widget.Toast;
import androidx.fragment.app.Fragment;
+import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import com.google.android.car.kitchensink.R;
-import java.util.ArrayList;
+import java.net.NetworkInterface;
+import java.net.SocketException;
@SuppressLint("SetTextI18n")
public class ConnectivityFragment extends Fragment {
private static final String TAG = ConnectivityFragment.class.getSimpleName();
-
private final Handler mHandler = new Handler();
- private final ArrayList<String> mNetworks = new ArrayList<>();
private ConnectivityManager mConnectivityManager;
- private ArrayAdapter<String> mNetworksAdapter;
- private final NetworkCallback mNetworkCallback = new NetworkCallback() {
- @Override
- public void onAvailable(Network network) {
- showToast("onAvailable, netId: " + network);
- refreshNetworks();
+ // Sort out current Network objects (NetId -> Network)
+ private SparseArray<Network> mNetworks = new SparseArray<Network>();
+
+ /**
+ * Create our own network callback object to use with NetworkRequests. Contains a reference to
+ * a Network so we can be sure to only surface updates on the network we want to see them on.
+ * We have to do this because there isn't a way to say "give me this SPECIFIC network." There's
+ * only "give me A network with these capabilities/transports."
+ */
+ public class NetworkByIdCallback extends NetworkCallback {
+ private final Network mNetwork;
+
+ NetworkByIdCallback(Network n) {
+ mNetwork = n;
}
@Override
- public void onLost(Network network) {
- showToast("onLost, netId: " + network);
- refreshNetworks();
+ public void onAvailable(Network n) {
+ if (mNetwork.equals(n)) {
+ showToast("onAvailable(), netId: " + n);
+ }
}
- };
+
+ @Override
+ public void onLosing(Network n, int maxMsToLive) {
+ if (mNetwork.equals(n)) {
+ showToast("onLosing(), netId: " + n);
+ }
+ }
+
+ @Override
+ public void onLost(Network n) {
+ if (mNetwork.equals(n)) {
+ showToast("onLost(), netId: " + n);
+ }
+ }
+ }
+
+ // Map of NetId -> NetworkByIdCallback Objects -- Used to release requested networks
+ SparseArray<NetworkByIdCallback> mNetworkCallbacks = new SparseArray<NetworkByIdCallback>();
+
+ /**
+ * Implement a swipe-to-refresh list of available networks. NetworkListAdapter takes an array
+ * of NetworkItems that it cascades to the view. SwipeRefreshLayout wraps the adapter.
+ */
+ public static class NetworkItem {
+ public int mNetId;
+ public String mType;
+ public String mState;
+ public String mConnected;
+ public String mAvailable;
+ public String mRoaming;
+ public String mInterfaceName;
+ public String mHwAddress;
+ public String mIpAddresses;
+ public String mDnsAddresses;
+ public String mDomains;
+ public String mRoutes;
+ public String mTransports;
+ public String mCapabilities;
+ public String mBandwidth;
+ public boolean mDefault;
+ public boolean mRequested;
+ }
+
+ private NetworkItem[] mNetworkItems = new NetworkItem[0];
+ private NetworkListAdapter mNetworksAdapter;
+ private SwipeRefreshLayout mNetworkListRefresher;
+
+ /**
+ * Builds a NetworkRequest fit to a given network in the hope that we just get updates on that
+ * one network. This is the best way to get single network updates right now, as the request
+ * system works only on transport and capability requirements. There aaaare "network
+ * specifiers" but those only work based on the transport (i.e "eth0" would ask type ETHERNET
+ * for the correct interface where as "GoogleGuest" might ask type WIFI for the Network on SSID
+ * "GoogleGuest"). Ends up being paired with the custom callback above to only surface events
+ * for the specific network in question as well.
+ */
+ private NetworkRequest getRequestForNetwork(Network n) {
+ NetworkCapabilities nc = mConnectivityManager.getNetworkCapabilities(n);
+
+ NetworkRequest.Builder b = new NetworkRequest.Builder();
+ b.clearCapabilities();
+
+ for (int transportType : nc.getTransportTypes()) {
+ b.addTransportType(transportType);
+ }
+
+ for (int capability : nc.getCapabilities()) {
+ // Not all capabilities are requestable. According to source, all mutable capabilities
+ // except trusted are not requestable. Trying to request them results in an error being
+ // thrown
+ if (isRequestableCapability(capability)) {
+ b.addCapability(capability);
+ }
+ }
+
+ return b.build();
+ }
+
+ private boolean isRequestableCapability(int c) {
+ if (c == NetworkCapabilities.NET_CAPABILITY_VALIDATED
+ || c == NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL
+ || c == NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING
+ || c == NetworkCapabilities.NET_CAPABILITY_FOREGROUND
+ || c == NetworkCapabilities.NET_CAPABILITY_NOT_CONGESTED
+ || c == NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED) {
+ return false;
+ }
+ return true;
+ }
+
+ public void requestNetworkById(int netId) {
+ if (mNetworkCallbacks.get(netId) != null) {
+ return;
+ }
+
+ Network network = mNetworks.get(netId);
+ if (network == null) {
+ return;
+ }
+
+ NetworkRequest request = getRequestForNetwork(network);
+ NetworkByIdCallback cb = new NetworkByIdCallback(network);
+ mNetworkCallbacks.put(netId, cb);
+ mConnectivityManager.requestNetwork(request, cb);
+ showToast("Requesting Network " + netId);
+ }
+
+ public void releaseNetworkById(int netId) {
+ NetworkByIdCallback cb = mNetworkCallbacks.get(netId);
+ if (cb != null) {
+ mConnectivityManager.unregisterNetworkCallback(cb);
+ mNetworkCallbacks.remove(netId);
+ showToast("Released Network " + netId);
+ }
+ }
+
+ public void releaseAllNetworks() {
+ for (NetworkItem n : mNetworkItems) {
+ releaseNetworkById(n.mNetId);
+ }
+ }
+
+ public void bindToNetwork(int netId) {
+ Network network = mNetworks.get(netId);
+ if (network == null) {
+ return;
+ }
+
+ Network def = mConnectivityManager.getBoundNetworkForProcess();
+ if (def != null && def.netId != netId) {
+ clearBoundNetwork();
+ }
+ mConnectivityManager.bindProcessToNetwork(network);
+ showToast("Set process default network " + netId);
+ }
+
+ public void clearBoundNetwork() {
+ mConnectivityManager.bindProcessToNetwork(null);
+ showToast("Clear process default network");
+ }
+
+ public void reportNetworkbyId(int netId) {
+ Network network = mNetworks.get(netId);
+ if (network == null) {
+ return;
+ }
+ mConnectivityManager.reportNetworkConnectivity(network, false);
+ showToast("Reporting Network " + netId);
+ }
+
+ /**
+ * Maps of NET_CAPABILITY_* and TRANSPORT_* to string representations. A network having these
+ * capabilities will have the following strings print on their list entry.
+ */
+ private static final SparseArray<String> sTransportNames = new SparseArray<String>();
+ private static final SparseArray<String> sCapabilityNames = new SparseArray<String>();
+ static {
+ sTransportNames.put(NetworkCapabilities.TRANSPORT_LOWPAN, "[LOWPAN]");
+ sTransportNames.put(NetworkCapabilities.TRANSPORT_WIFI_AWARE, "[WIFI-AWARE]");
+ sTransportNames.put(NetworkCapabilities.TRANSPORT_VPN, "[VPN]");
+ sTransportNames.put(NetworkCapabilities.TRANSPORT_ETHERNET, "[ETHERNET]");
+ sTransportNames.put(NetworkCapabilities.TRANSPORT_BLUETOOTH, "[BLUETOOTH]");
+ sTransportNames.put(NetworkCapabilities.TRANSPORT_WIFI, "[WIFI]");
+ sTransportNames.put(NetworkCapabilities.TRANSPORT_CELLULAR, "[CELLULAR]");
+
+ sCapabilityNames.put(NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL, "[CAPTIVE PORTAL]");
+ sCapabilityNames.put(NetworkCapabilities.NET_CAPABILITY_CBS, "[CBS]");
+ sCapabilityNames.put(NetworkCapabilities.NET_CAPABILITY_DUN, "[DUN]");
+ sCapabilityNames.put(NetworkCapabilities.NET_CAPABILITY_EIMS, "[EIMS]");
+ sCapabilityNames.put(NetworkCapabilities.NET_CAPABILITY_FOREGROUND, "[FOREGROUND]");
+ sCapabilityNames.put(NetworkCapabilities.NET_CAPABILITY_FOTA, "[FOTA]");
+ sCapabilityNames.put(NetworkCapabilities.NET_CAPABILITY_IA, "[IA]");
+ sCapabilityNames.put(NetworkCapabilities.NET_CAPABILITY_IMS, "[IMS]");
+ sCapabilityNames.put(NetworkCapabilities.NET_CAPABILITY_INTERNET, "[INTERNET]");
+ sCapabilityNames.put(NetworkCapabilities.NET_CAPABILITY_MMS, "[MMS]");
+ sCapabilityNames.put(NetworkCapabilities.NET_CAPABILITY_NOT_CONGESTED, "[NOT CONGESTED]");
+ sCapabilityNames.put(NetworkCapabilities.NET_CAPABILITY_NOT_METERED, "[NOT METERED]");
+ sCapabilityNames.put(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED, "[NOT RESTRICTED]");
+ sCapabilityNames.put(NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING, "[NOT ROAMING]");
+ sCapabilityNames.put(NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED, "[NOT SUSPENDED]");
+ sCapabilityNames.put(NetworkCapabilities.NET_CAPABILITY_NOT_VPN, "[NOT VPN]");
+ sCapabilityNames.put(NetworkCapabilities.NET_CAPABILITY_RCS, "[RCS]");
+ sCapabilityNames.put(NetworkCapabilities.NET_CAPABILITY_SUPL, "[SUPL]");
+ sCapabilityNames.put(NetworkCapabilities.NET_CAPABILITY_TRUSTED, "[TRUSTED]");
+ sCapabilityNames.put(NetworkCapabilities.NET_CAPABILITY_VALIDATED, "[VALIDATED]");
+ sCapabilityNames.put(NetworkCapabilities.NET_CAPABILITY_WIFI_P2P, "[WIFI P2P]");
+ sCapabilityNames.put(NetworkCapabilities.NET_CAPABILITY_XCAP, "[XCAP]");
+ }
+
+ /**
+ * Builds a string out of the possible transports that can be applied to a
+ * NetworkCapabilities object.
+ */
+ private String getTransportString(NetworkCapabilities nCaps) {
+ String transports = "";
+ for (int transport : nCaps.getTransportTypes()) {
+ transports += sTransportNames.get(transport, "");
+ }
+ return transports;
+ }
+
+ /**
+ * Builds a string out of the possible capabilities that can be applied to
+ * a NetworkCapabilities object.
+ */
+ private String getCapabilitiesString(NetworkCapabilities nCaps) {
+ String caps = "";
+ for (int capability : nCaps.getCapabilities()) {
+ caps += sCapabilityNames.get(capability, "");
+ }
+ return caps;
+ }
+
+ // Gets the string representation of a MAC address from a given NetworkInterface object
+ private String getMacAddress(NetworkInterface ni) {
+ if (ni == null) {
+ return "??:??:??:??:??:??";
+ }
+
+ byte[] mac = null;
+ try {
+ mac = ni.getHardwareAddress();
+ } catch (SocketException exception) {
+ Log.e(TAG, "SocketException -- Failed to get interface MAC address");
+ return "??:??:??:??:??:??";
+ }
+
+ if (mac == null) {
+ return "??:??:??:??:??:??";
+ }
+
+ StringBuilder sb = new StringBuilder(18);
+ for (byte b : mac) {
+ if (sb.length() > 0) {
+ sb.append(':');
+ }
+ sb.append(String.format("%02x", b));
+ }
+ return sb.toString();
+ }
+
+ /**
+ * Builds a NetworkItem object from a given Network object, aggregating info across Network,
+ * NetworkCapabilities, NetworkInfo, NetworkInterface, and LinkProperties objects and pass it
+ * all as a string for the UI to use
+ */
+ private NetworkItem getNetworkItem(Network n) {
+
+ // Get default network to assign the button text correctly
+ // NOTE: activeNetwork != ProcessDefault when you set one, active is tracking the default
+ // request regardless of your process's default
+ // Network defNetwork = mConnectivityManager.getActiveNetwork();
+ Network defNetwork = mConnectivityManager.getBoundNetworkForProcess();
+
+ // Used to get network state
+ NetworkInfo nInfo = mConnectivityManager.getNetworkInfo(n);
+
+ // Used to get transport type(s), capabilities
+ NetworkCapabilities nCaps = mConnectivityManager.getNetworkCapabilities(n);
+
+ // Properties of the actual physical link
+ LinkProperties nLink = mConnectivityManager.getLinkProperties(n);
+
+ // Object representing the actual interface
+ NetworkInterface nIface = null;
+ try {
+ nIface = NetworkInterface.getByName(nLink.getInterfaceName());
+ } catch (SocketException exception) {
+ Log.e(TAG, "SocketException -- Failed to get interface info");
+ }
+
+ // Pack NetworkItem with all values
+ NetworkItem ni = new NetworkItem();
+
+ // Row key
+ ni.mNetId = n.netId;
+
+ // LinkProperties/NetworkInterface
+ ni.mInterfaceName = "Interface: " + nLink.getInterfaceName()
+ + (nIface != null ? " (" + nIface.getName() + ")" : " ()");
+ ni.mHwAddress = "HwAddress: " + getMacAddress(nIface);
+ ni.mIpAddresses = "IP Addresses: " + nLink.getLinkAddresses().toString();
+ ni.mDnsAddresses = "DNS: " + nLink.getDnsServers().toString();
+ ni.mDomains = "Domains: " + nLink.getDomains();
+ ni.mRoutes = "Routes: " + nLink.getRoutes().toString();
+
+ // NetworkInfo
+ ni.mType = "Type: " + nInfo.getTypeName() + " (" + nInfo.getSubtypeName() + ")";
+ ni.mState = "State: " + nInfo.getState().name() + "/" + nInfo.getDetailedState().name();
+ ni.mConnected = "Connected: " + (nInfo.isConnected() ? "Connected" : "Disconnected");
+ ni.mAvailable = "Available: " + (nInfo.isAvailable() ? "Yes" : "No");
+ ni.mRoaming = "Roaming: " + (nInfo.isRoaming() ? "Yes" : "No");
+
+ // NetworkCapabilities
+ ni.mTransports = "Transports: " + getTransportString(nCaps);
+ ni.mCapabilities = "Capabilities: " + getCapabilitiesString(nCaps);
+ ni.mBandwidth = "Bandwidth (Down/Up): " + nCaps.getLinkDownstreamBandwidthKbps()
+ + " Kbps/" + nCaps.getLinkUpstreamBandwidthKbps() + " Kbps";
+
+ // Other inferred values
+ ni.mDefault = sameNetworkId(n, defNetwork);
+ ni.mRequested = (mNetworkCallbacks.get(n.netId) != null);
+
+ return ni;
+ }
+
+ // Refresh the networks content and prompt the user that we did it
+ private void refreshNetworksAndPrompt() {
+ refreshNetworks();
+ showToast("Refreshed Networks (" + mNetworkItems.length + ")");
+ }
+
+ /**
+ * Gets the current set of networks from the connectivity manager and 1) stores the network
+ * objects 2) builds NetworkItem objects for the view to render and 3) If a network we were
+ * tracking disappears then it kills its callback.
+ */
+ private void refreshNetworks() {
+ Log.i(TAG, "refreshNetworks()");
+ Network[] networks = mConnectivityManager.getAllNetworks();
+ mNetworkItems = new NetworkItem[networks.length];
+ mNetworks.clear();
+
+ // Add each network to the network info set, turning each field to a string
+ for (int i = 0; i < networks.length; i++) {
+ mNetworkItems[i] = getNetworkItem(networks[i]);
+ mNetworks.put(networks[i].netId, networks[i]);
+ }
+
+ // Check for callbacks that belong to networks that don't exist anymore
+ for (int i = 0; i < mNetworkCallbacks.size(); i++) {
+ int key = mNetworkCallbacks.keyAt(i);
+ if (mNetworks.get(key) == null) {
+ mNetworkCallbacks.remove(key);
+ }
+ }
+
+ // Update the view
+ mNetworksAdapter.refreshNetworks(mNetworkItems);
+ }
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
-
mConnectivityManager = getActivity().getSystemService(ConnectivityManager.class);
-
mConnectivityManager.addDefaultNetworkActiveListener(() -> refreshNetworks());
}
@@ -79,77 +428,41 @@
@Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.connectivity_fragment, container, false);
+ // Create the ListView of all networks
ListView networksView = view.findViewById(R.id.networks);
- mNetworksAdapter = new ArrayAdapter<>(getActivity(), R.layout.list_item, mNetworks);
+ mNetworksAdapter = new NetworkListAdapter(getContext(), mNetworkItems, this);
networksView.setAdapter(mNetworksAdapter);
- setClickAction(view, R.id.networksRefresh, this::refreshNetworks);
- setClickAction(view, R.id.networkRequestOemPaid, this::requestOemPaid);
- setClickAction(view, R.id.networkRequestEth1, this::requestEth1);
- setClickAction(view, R.id.networkReleaseNetwork, this::releaseNetworkRequest);
+ // Find all networks ListView refresher and set the refresh callback
+ mNetworkListRefresher = (SwipeRefreshLayout) view.findViewById(R.id.refreshNetworksList);
+ mNetworkListRefresher.setOnRefreshListener(() -> {
+ refreshNetworksAndPrompt();
+ mNetworkListRefresher.setRefreshing(false);
+ });
return view;
}
- private void releaseNetworkRequest() {
- mConnectivityManager.unregisterNetworkCallback(mNetworkCallback);
- showToast("Release request sent");
- }
-
- private void requestEth1() {
- NetworkRequest request = new NetworkRequest.Builder()
- .clearCapabilities()
- .addTransportType(NetworkCapabilities.TRANSPORT_ETHERNET)
- .setNetworkSpecifier("eth1")
- .build();
- mConnectivityManager.requestNetwork(request, mNetworkCallback, mHandler);
- }
-
- private void requestOemPaid() {
- NetworkRequest request = new NetworkRequest.Builder()
- .addCapability(NetworkCapabilities.NET_CAPABILITY_OEM_PAID)
- .build();
-
- mConnectivityManager.requestNetwork(request, mNetworkCallback, mHandler);
- }
-
@Override
public void onResume() {
super.onResume();
refreshNetworks();
}
- private void setClickAction(View view, int id, Runnable action) {
- view.findViewById(id).setOnClickListener(v -> action.run());
+ @Override
+ public void onPause() {
+ super.onPause();
+ releaseAllNetworks();
}
- private void refreshNetworks() {
- mNetworks.clear();
-
- for (Network network : mConnectivityManager.getAllNetworks()) {
- boolean isDefault = sameNetworkId(network, mConnectivityManager.getActiveNetwork());
- NetworkCapabilities nc = mConnectivityManager.getNetworkCapabilities(network);
- boolean isOemPaid = nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_OEM_PAID);
- boolean isInternet = nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
-
- NetworkInfo networkInfo = mConnectivityManager.getNetworkInfo(network);
-
- mNetworks.add("netId: " + network.netId
- + (isInternet ? " [INTERNET]" : "")
- + (isDefault ? " [DEFAULT]" : "")
- + (isOemPaid ? " [OEM-paid]" : "") + nc + " " + networkInfo);
- }
-
- mNetworksAdapter.notifyDataSetChanged();
- }
-
- private void showToast(String text) {
- Log.d(TAG, "showToast: " + text);
- Toast.makeText(getContext(), text, Toast.LENGTH_LONG).show();
+ public void showToast(String text) {
+ Toast toast = Toast.makeText(getContext(), text, Toast.LENGTH_SHORT);
+ TextView v = (TextView) toast.getView().findViewById(android.R.id.message);
+ v.setTextColor(Color.WHITE);
+ toast.show();
}
private static boolean sameNetworkId(Network net1, Network net2) {
return net1 != null && net2 != null && net1.netId == net2.netId;
-
}
}
diff --git a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/connectivity/NetworkListAdapter.java b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/connectivity/NetworkListAdapter.java
new file mode 100644
index 0000000..b726654
--- /dev/null
+++ b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/connectivity/NetworkListAdapter.java
@@ -0,0 +1,208 @@
+/*
+ * 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.google.android.car.kitchensink.connectivity;
+
+import android.content.Context;
+import android.graphics.Color;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
+import android.widget.Button;
+import android.widget.TextView;
+
+import com.google.android.car.kitchensink.R;
+import com.google.android.car.kitchensink.connectivity.ConnectivityFragment.NetworkItem;
+
+public class NetworkListAdapter extends ArrayAdapter<NetworkItem> {
+ private static final String TAG = NetworkListAdapter.class.getSimpleName();
+
+ private Context mContext;
+ private NetworkItem[] mNetworkList; // keep list of objects
+ private ConnectivityFragment mFragment; // for calling things on button press
+
+ public NetworkListAdapter(Context context, NetworkItem[] items,
+ ConnectivityFragment fragment) {
+ super(context, R.layout.network_item, items);
+ mContext = context;
+ mFragment = fragment;
+ mNetworkList = items;
+
+ Log.i(TAG, "Created NetworkListAdaptor");
+ }
+
+ // Returns a list item view for each position
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ ViewHolder vh;
+ if (convertView == null) {
+ vh = new ViewHolder();
+ LayoutInflater inflater = LayoutInflater.from(mContext);
+ convertView = inflater.inflate(R.layout.network_item, parent, false);
+ vh.netActive = convertView.findViewById(R.id.network_active);
+ vh.netId = convertView.findViewById(R.id.network_id);
+ vh.netType = convertView.findViewById(R.id.network_type);
+ vh.netState = convertView.findViewById(R.id.network_state);
+ vh.connected = convertView.findViewById(R.id.network_connected);
+ vh.available = convertView.findViewById(R.id.network_available);
+ vh.roaming = convertView.findViewById(R.id.network_roaming);
+ vh.netIface = convertView.findViewById(R.id.network_iface);
+ vh.hwAddress = convertView.findViewById(R.id.hw_address);
+ vh.ipAddresses = convertView.findViewById(R.id.network_ip_addresses);
+ vh.dns = convertView.findViewById(R.id.network_dns);
+ vh.domains = convertView.findViewById(R.id.network_domains);
+ vh.routes = convertView.findViewById(R.id.network_routes);
+ vh.transports = convertView.findViewById(R.id.network_transports);
+ vh.capabilities = convertView.findViewById(R.id.network_capabilities);
+ vh.bandwidth = convertView.findViewById(R.id.network_bandwidth);
+ vh.requestButton = convertView.findViewById(R.id.network_request);
+ vh.defaultButton = convertView.findViewById(R.id.network_default);
+ vh.reportButton = convertView.findViewById(R.id.network_report);
+
+ convertView.setTag(vh);
+ } else {
+ vh = (ViewHolder) convertView.getTag();
+ }
+
+ // If there's data to fill for the given position in the list
+ if (position < getCount()) {
+ vh.netId.setText("" + mNetworkList[position].mNetId);
+ vh.netType.setText(mNetworkList[position].mType);
+ vh.netState.setText(mNetworkList[position].mState);
+ vh.connected.setText(mNetworkList[position].mConnected);
+ vh.available.setText(mNetworkList[position].mAvailable);
+ vh.roaming.setText(mNetworkList[position].mRoaming);
+ vh.netIface.setText(mNetworkList[position].mInterfaceName);
+ vh.hwAddress.setText(mNetworkList[position].mHwAddress);
+ vh.ipAddresses.setText(mNetworkList[position].mIpAddresses);
+ vh.dns.setText(mNetworkList[position].mDnsAddresses);
+ vh.domains.setText(mNetworkList[position].mDomains);
+ vh.routes.setText(mNetworkList[position].mRoutes);
+ vh.transports.setText(mNetworkList[position].mTransports);
+ vh.capabilities.setText(mNetworkList[position].mCapabilities);
+ vh.bandwidth.setText(mNetworkList[position].mBandwidth);
+
+ // Active request indicator
+ vh.netActive.setBackgroundColor(mNetworkList[position].mRequested
+ ? Color.parseColor("#5fdd6e")
+ : Color.parseColor("#ff3d3d"));
+
+ // Request to track button
+ setToggleButton(position, vh.requestButton, mNetworkList[position].mRequested,
+ "Release", "Request", this::onRequestClicked);
+
+ // Process default button
+ setToggleButton(position, vh.defaultButton, mNetworkList[position].mDefault,
+ "Remove Default", "Set Default", this::onDefaultClicked);
+
+ // Report network button
+ setPositionTaggedCallback(position, vh.reportButton, this::onReportClicked);
+ }
+
+ // Alternate table row background color to make it easier to view
+ convertView.setBackgroundColor(((position % 2) != 0)
+ ? Color.parseColor("#2A2E2D")
+ : Color.parseColor("#1E1E1E"));
+
+ return convertView;
+ }
+
+ // Tags a button with its element position and assigned it's callback. The callback can then
+ // get the tag and use it as a position to know which data is associated with it
+ private void setPositionTaggedCallback(int position, Button button, View.OnClickListener l) {
+ button.setTag(position);
+ button.setOnClickListener(l);
+ }
+
+ private void setToggleButton(int position, Button button, boolean on, String ifOn, String ifOff,
+ View.OnClickListener l) {
+ // Manage button text based on status
+ if (on) {
+ button.setText(ifOn);
+ } else {
+ button.setText(ifOff);
+ }
+ setPositionTaggedCallback(position, button, l);
+ }
+
+ private void onRequestClicked(View view) {
+ int position = (int) view.getTag();
+ if (mNetworkList[position].mRequested) {
+ mFragment.releaseNetworkById(mNetworkList[position].mNetId);
+ mNetworkList[position].mRequested = false;
+ } else {
+ mFragment.requestNetworkById(mNetworkList[position].mNetId);
+ mNetworkList[position].mRequested = true;
+ }
+ notifyDataSetChanged();
+ }
+
+ private void onDefaultClicked(View view) {
+ int position = (int) view.getTag();
+ if (mNetworkList[position].mDefault) {
+ mFragment.clearBoundNetwork();
+ mNetworkList[position].mDefault = false;
+ } else {
+ for (int i = 0; i < mNetworkList.length; i++) {
+ if (i != position) {
+ mNetworkList[i].mDefault = false;
+ }
+ }
+ mFragment.bindToNetwork(mNetworkList[position].mNetId);
+ mNetworkList[position].mDefault = true;
+ }
+ notifyDataSetChanged();
+ }
+
+ private void onReportClicked(View view) {
+ int position = (int) view.getTag();
+ mFragment.reportNetworkbyId(mNetworkList[position].mNetId);
+ }
+
+ public void refreshNetworks(NetworkItem[] networksIn) {
+ mNetworkList = networksIn;
+ notifyDataSetChanged();
+ }
+
+ @Override
+ public int getCount() {
+ return mNetworkList.length;
+ }
+
+ static class ViewHolder {
+ public View netActive;
+ public TextView netId;
+ public TextView netType;
+ public TextView netState;
+ public TextView connected;
+ public TextView available;
+ public TextView roaming;
+ public TextView netIface;
+ public TextView hwAddress;
+ public TextView ipAddresses;
+ public TextView dns;
+ public TextView domains;
+ public TextView routes;
+ public TextView transports;
+ public TextView capabilities;
+ public TextView bandwidth;
+ public Button requestButton;
+ public Button defaultButton;
+ public Button reportButton;
+ }
+}
diff --git a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/diagnostic/DiagnosticTestFragment.java b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/diagnostic/DiagnosticTestFragment.java
index 5569848..7f9b4e1 100644
--- a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/diagnostic/DiagnosticTestFragment.java
+++ b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/diagnostic/DiagnosticTestFragment.java
@@ -18,12 +18,13 @@
import android.annotation.Nullable;
import android.car.Car;
+import android.car.CarNotConnectedException;
import android.car.diagnostic.CarDiagnosticEvent;
import android.car.diagnostic.CarDiagnosticManager;
import android.car.diagnostic.CarDiagnosticManager.OnDiagnosticEventListener;
+import android.car.hardware.CarSensorManager;
import android.graphics.Color;
import android.os.Bundle;
-import android.support.car.hardware.CarSensorManager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
@@ -108,7 +109,7 @@
CarDiagnosticManager.FRAME_TYPE_FREEZE,
CarSensorManager.SENSOR_RATE_NORMAL);
}
- } catch (android.car.CarNotConnectedException|android.support.car.CarNotConnectedException e) {
+ } catch (CarNotConnectedException e) {
Log.e(TAG, "Car not connected or not supported", e);
}
}
diff --git a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/displayinfo/DisplayInfoFragment.java b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/displayinfo/DisplayInfoFragment.java
index ac0bdae..e199821 100644
--- a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/displayinfo/DisplayInfoFragment.java
+++ b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/displayinfo/DisplayInfoFragment.java
@@ -32,7 +32,7 @@
import com.google.android.car.kitchensink.R;
/**
- * Shows alert dialogs
+ * Displays info about the display this is run on.
*/
public class DisplayInfoFragment extends Fragment {
@@ -95,11 +95,18 @@
}
private void addDimenText(String dimenName) {
- addTextView(dimenName + " : " + convertPixelsToDp(
- getResources().getDimensionPixelSize(
- getResources().getIdentifier(
- dimenName, "dimen", getContext().getPackageName())),
- getContext()));
+ String value;
+ try {
+ float dimen = convertPixelsToDp(
+ getResources().getDimensionPixelSize(
+ getResources().getIdentifier(
+ dimenName, "dimen", getContext().getPackageName())),
+ getContext());
+ value = Float.toString(dimen);
+ } catch (Resources.NotFoundException e) {
+ value = "Resource Not Found";
+ }
+ addTextView(dimenName + " : " + value);
}
private void addTextView(String text) {
diff --git a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/job/DishService.java b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/job/DishService.java
deleted file mode 100644
index c2758a8..0000000
--- a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/job/DishService.java
+++ /dev/null
@@ -1,130 +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 com.google.android.car.kitchensink.job;
-
-import android.app.job.JobParameters;
-import android.app.job.JobService;
-import android.os.AsyncTask;
-import android.os.Handler;
-import android.os.Message;
-import android.util.Log;
-import android.util.SparseArray;
-
-import java.lang.ref.WeakReference;
-
-public class DishService extends JobService {
- private static final String TAG = "JobScheduler_DishService";
- private static final int DELAY_MS = 1000; // wash a plate every second!
-
- private static final int MSG_FINISHED = 0;
- private static final int MSG_RUN_JOB = 1;
- private static final int MSG_CANCEL_JOB = 2;
-
- public static final String EXTRA_DISH_COUNT = "dish_count";
-
- private final Handler mHandler = new Handler() {
- private SparseArray<JobParameters> mTaskMap = new SparseArray<JobParameters>();
- @Override
- public void handleMessage(Message msg) {
- JobParameters job = (JobParameters) msg.obj;
- switch (msg.what) {
- case MSG_FINISHED:
- Log.d(TAG, "Job done! " + job.getJobId());
- mTaskMap.remove(job.getJobId());
- jobFinished(job, false);
- break;
- case MSG_RUN_JOB:
- DishWasherTask task = new DishWasherTask(this, job, msg.arg1);
- task.execute();
- mTaskMap.put(job.getJobId(), job);
- break;
- case MSG_CANCEL_JOB:
- JobParameters job1 = mTaskMap.get(job.getJobId());
- if (job1 != null) {
- removeMessages(MSG_RUN_JOB, job1);
- Log.d(TAG, "cancelled job " + job1);
- mTaskMap.remove(job.getJobId());
- }
- break;
- default:
- Log.w(TAG, "Unknown message " + msg.what);
- }
- }
- };
-
- @Override
- public boolean onStopJob(JobParameters jobParameters) {
- Log.d(TAG, "onStopJob " + jobParameters);
- Message msg = mHandler.obtainMessage(MSG_CANCEL_JOB, 0, 0, jobParameters);
- mHandler.sendMessage(msg);
- return false;
- }
-
- @Override
- public boolean onStartJob(final JobParameters jobParameters) {
- Log.d(TAG, "onStartJob " + jobParameters);
- Message msg = mHandler.obtainMessage(MSG_RUN_JOB, 0, 0, jobParameters);
- mHandler.sendMessage(msg);
- return true;
- }
-
- private static final class DishWasherTask extends AsyncTask<Void, Void, Boolean> {
- private final WeakReference<Handler> mHandler;
- private final JobParameters mJobParameter;
- private final int mMyDishNum;
-
-
- public DishWasherTask(Handler handler, JobParameters jobParameters, int dishNum) {
- mHandler = new WeakReference<Handler>(handler);
- mJobParameter = jobParameters;
- mMyDishNum = dishNum;
- }
-
- @Override
- protected Boolean doInBackground(Void... infos) {
- int dishTotal = mJobParameter.getExtras().getInt(EXTRA_DISH_COUNT);
-
- Log.d(TAG, "jobId: " + mJobParameter.getJobId() + " totalDish: " + dishTotal
- + " washing: #" + mMyDishNum);
- wash();
- if (mMyDishNum >= dishTotal - 1) {
- // all done!
- return false;
- }
- return true;
- }
-
- @Override
- protected void onPostExecute(Boolean result) {
- if (mHandler.get() == null) {
- return;
- }
- if (result) {
- Message msg = mHandler.get().obtainMessage(MSG_RUN_JOB,
- mMyDishNum +1, 0, mJobParameter);
- mHandler.get().sendMessageDelayed(msg, DELAY_MS);
- } else {
- Message msg = mHandler.get().obtainMessage(MSG_FINISHED, 0,
- 0, mJobParameter);
- mHandler.get().sendMessage(msg);
- }
- }
-
- private void wash() {
- // TODO: add heavy wash tasks here...
- }
- }
-}
diff --git a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/job/JobSchedulerFragment.java b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/job/JobSchedulerFragment.java
deleted file mode 100644
index b82818f..0000000
--- a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/job/JobSchedulerFragment.java
+++ /dev/null
@@ -1,166 +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 com.google.android.car.kitchensink.job;
-
-import android.app.job.JobInfo;
-import android.app.job.JobScheduler;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.os.Bundle;
-import android.os.PersistableBundle;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.Button;
-import android.widget.CheckBox;
-import android.widget.EditText;
-import android.widget.RadioGroup;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import androidx.annotation.Nullable;
-import androidx.fragment.app.Fragment;
-
-import com.google.android.car.kitchensink.R;
-
-import java.util.List;
-
-public class JobSchedulerFragment extends Fragment {
- private static final String TAG = "JobSchedulerFragment";
- private static final String PREFS_NEXT_JOB_ID = "next_job_id";
-
- private Button mScheduleButton;
- private Button mRefreshButton;
- private Button mCancelButton;
- private CheckBox mRequireCharging;
- private CheckBox mRequireIdle;
- private CheckBox mRequirePersisted;
- private RadioGroup mNetworkGroup;
- private EditText mDishNum;
- private TextView mJobInfo;
- private JobScheduler mJobScheduler;
-
- @Nullable
- @Override
- public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
- @Nullable Bundle savedInstanceState) {
- View v = inflater.inflate(R.layout.job_scheduler, container, false);
- mScheduleButton = (Button) v.findViewById(R.id.schedule_button);
- mScheduleButton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- scheduleJob();
- }
- });
- mRefreshButton = (Button) v.findViewById(R.id.refresh_button);
- mRefreshButton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- refreshCurrentJobs();
- }
- });
-
- mNetworkGroup = (RadioGroup) v.findViewById(R.id.network_group);
- mDishNum = (EditText) v.findViewById(R.id.dish_num);
- mRequireCharging = (CheckBox) v.findViewById(R.id.require_charging);
- mRequireIdle = (CheckBox) v.findViewById(R.id.require_idle);
- mRequirePersisted = (CheckBox) v.findViewById(R.id.require_persisted);
- mJobScheduler = (JobScheduler) getContext()
- .getSystemService(Context.JOB_SCHEDULER_SERVICE);
-
- mJobInfo = (TextView) v.findViewById(R.id.current_jobs);
-
- mCancelButton = (Button) v.findViewById(R.id.cancel_button);
- mCancelButton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- mJobScheduler.cancelAll();
- refreshCurrentJobs();
- }
- });
- return v;
- }
-
- @Override
- public void onResume() {
- super.onResume();
- refreshCurrentJobs();
- }
-
- private void refreshCurrentJobs() {
- StringBuilder sb = new StringBuilder();
- List<JobInfo> jobs = mJobScheduler.getAllPendingJobs();
- for (JobInfo job : jobs) {
- sb.append("JobId: ");
- sb.append(job.getId());
- sb.append("\nDishCount: ");
- sb.append(job.getExtras().getInt(DishService.EXTRA_DISH_COUNT, 0));
- sb.append("\n");
- }
- mJobInfo.setText(sb.toString());
- }
-
- private void scheduleJob() {
- ComponentName jobComponentName = new ComponentName(getContext(), DishService.class);
- SharedPreferences prefs = getContext()
- .getSharedPreferences(PREFS_NEXT_JOB_ID, Context.MODE_PRIVATE);
- int jobId = prefs.getInt(PREFS_NEXT_JOB_ID, 0);
- PersistableBundle bundle = new PersistableBundle();
- int count = 50;
- try {
- count = Integer.valueOf(mDishNum.getText().toString());
- } catch (NumberFormatException e) {
- Log.e(TAG, "NOT A NUMBER!!!");
- }
-
- int selected = mNetworkGroup.getCheckedRadioButtonId();
- int networkType = JobInfo.NETWORK_TYPE_ANY;
- switch (selected) {
- case R.id.network_none:
- networkType = JobInfo.NETWORK_TYPE_NONE;
- break;
- case R.id.network_unmetered:
- networkType = JobInfo.NETWORK_TYPE_UNMETERED;
- break;
- case R.id.network_any:
- networkType = JobInfo.NETWORK_TYPE_ANY;
- break;
- }
- bundle.putInt(DishService.EXTRA_DISH_COUNT, count);
- JobInfo jobInfo = new JobInfo.Builder(jobId, jobComponentName)
- .setRequiresCharging(mRequireCharging.isChecked())
- .setRequiresDeviceIdle(mRequireIdle.isChecked())
- // TODO: figure out why we crash here even we hold
- // the RECEIVE_BOOT_COMPLETE permission
- //.setPersisted(mRequirePersisted.isChecked())
- .setExtras(bundle)
- .setRequiredNetworkType(networkType)
- .build();
-
-
- mJobScheduler.schedule(jobInfo);
- Toast.makeText(getContext(), "Scheduled: " + jobInfo, Toast.LENGTH_LONG ).show();
-
- Log.d(TAG, "Scheduled a job: " + jobInfo);
- SharedPreferences.Editor editor = prefs.edit();
- editor.putInt(PREFS_NEXT_JOB_ID, jobId + 1);
- editor.commit();
-
- refreshCurrentJobs();
- }
-}
diff --git a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/notification/NotificationFragment.java b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/notification/NotificationFragment.java
index 7a26f93..e458df2 100644
--- a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/notification/NotificationFragment.java
+++ b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/notification/NotificationFragment.java
@@ -1,189 +1,400 @@
package com.google.android.car.kitchensink.notification;
-import static android.security.KeyStore.getApplicationContext;
-
import android.annotation.Nullable;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
-import android.app.Person;
-import android.app.RemoteInput;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
+import android.os.Handler;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import android.widget.Button;
+import androidx.core.app.NotificationCompat;
+import androidx.core.app.NotificationCompat.Action;
+import androidx.core.app.NotificationCompat.MessagingStyle;
+import androidx.core.app.Person;
+import androidx.core.app.RemoteInput;
import androidx.fragment.app.Fragment;
import com.google.android.car.kitchensink.KitchenSinkActivity;
import com.google.android.car.kitchensink.R;
+import java.util.HashMap;
+
/**
* Test fragment that can send all sorts of notifications.
*/
public class NotificationFragment extends Fragment {
- private static final String CHANNEL_ID_1 = "kitchensink.channel1";
- private static final String CHANNEL_ID_2 = "kitchensink.channel2";
- private static final String CHANNEL_ID_3 = "kitchensink.channel3";
- private static final String CHANNEL_ID_4 = "kitchensink.channel4";
- private static final String CHANNEL_ID_5 = "kitchensink.channel5";
- private static final String CHANNEL_ID_6 = "kitchensink.channel6";
+ private static final String IMPORTANCE_HIGH_ID = "importance_high";
+ private static final String IMPORTANCE_HIGH_NO_SOUND_ID = "importance_high_no_sound";
+ private static final String IMPORTANCE_DEFAULT_ID = "importance_default";
+ private static final String IMPORTANCE_LOW_ID = "importance_low";
+ private static final String IMPORTANCE_MIN_ID = "importance_min";
+ private static final String IMPORTANCE_NONE_ID = "importance_none";
+ private int mCurrentNotificationId = 0;
+ private NotificationManager mManager;
+ private Context mContext;
+ private Handler mHandler = new Handler();
+ private HashMap<Integer, Runnable> mUpdateRunnables = new HashMap<>();
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ mManager =
+ (NotificationManager) getActivity().getSystemService(Context.NOTIFICATION_SERVICE);
+ mContext = getActivity();
+
+ mManager.createNotificationChannel(new NotificationChannel(
+ IMPORTANCE_HIGH_ID, "Importance High", NotificationManager.IMPORTANCE_HIGH));
+
+ NotificationChannel noSoundChannel = new NotificationChannel(
+ IMPORTANCE_HIGH_NO_SOUND_ID, "No sound", NotificationManager.IMPORTANCE_HIGH);
+ noSoundChannel.setSound(null, null);
+ mManager.createNotificationChannel(noSoundChannel);
+
+ mManager.createNotificationChannel(new NotificationChannel(
+ IMPORTANCE_DEFAULT_ID,
+ "Importance Default",
+ NotificationManager.IMPORTANCE_DEFAULT));
+
+ mManager.createNotificationChannel(new NotificationChannel(
+ IMPORTANCE_LOW_ID, "Importance Low", NotificationManager.IMPORTANCE_LOW));
+
+ mManager.createNotificationChannel(new NotificationChannel(
+ IMPORTANCE_MIN_ID, "Importance Min", NotificationManager.IMPORTANCE_MIN));
+
+ mManager.createNotificationChannel(new NotificationChannel(
+ IMPORTANCE_NONE_ID, "Importance None", NotificationManager.IMPORTANCE_NONE));
+ }
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.notification_fragment, container, false);
- Button cancelAllButton = view.findViewById(R.id.cancel_all_button);
- Button importanceHighButton = view.findViewById(R.id.importance_high_button);
- Button importanceHighButton2 = view.findViewById(R.id.importance_high_button_2);
- Button importanceLowButton = view.findViewById(R.id.importance_low_button);
- Button importanceMinButton = view.findViewById(R.id.importance_min_button);
- Button importanceDefaultButton = view.findViewById(R.id.importance_default_button);
- Button ongoingButton = view.findViewById(R.id.ongoing_button);
- Button messageButton = view.findViewById(R.id.category_message_button);
- NotificationManager manager =
- (NotificationManager) getActivity().getSystemService(Context.NOTIFICATION_SERVICE);
+ initCancelAllButton(view);
- // cancel all button
- cancelAllButton.setOnClickListener(v -> manager.cancelAll());
+ initCarCategoriesButton(view);
- // importance high notifications
- NotificationChannel highImportanceChannel =
- new NotificationChannel(
- CHANNEL_ID_1, "Importance High", NotificationManager.IMPORTANCE_HIGH);
- manager.createNotificationChannel(highImportanceChannel);
+ initImportanceHighBotton(view);
+ initImportanceDefaultButton(view);
+ initImportanceLowButton(view);
+ initImportanceMinButton(view);
- importanceHighButton.setOnClickListener(v -> {
+ initOngoingButton(view);
+ initMessagingStyleButton(view);
+ initProgressButton(view);
+ initNavigationButton(view);
- Notification notification = new Notification.Builder(getActivity(), CHANNEL_ID_1)
- .setContentTitle("Importance High")
- .setContentText("blah")
+ return view;
+ }
+
+ private void initCancelAllButton(View view) {
+ view.findViewById(R.id.cancel_all_button).setOnClickListener(v -> {
+ for (Runnable runnable : mUpdateRunnables.values()) {
+ mHandler.removeCallbacks(runnable);
+ }
+ mUpdateRunnables.clear();
+ mManager.cancelAll();
+ });
+ }
+
+ private void initCarCategoriesButton(View view) {
+ view.findViewById(R.id.category_car_emergency_button).setOnClickListener(v -> {
+ Notification notification = new Notification
+ .Builder(getActivity(), IMPORTANCE_DEFAULT_ID)
+ .setContentTitle("Car Emergency")
+ .setContentText("Shows heads-up; Shows on top of the list; Does not group")
+ .setCategory(Notification.CATEGORY_CAR_EMERGENCY)
.setSmallIcon(R.drawable.car_ic_mode)
.build();
- manager.notify(1, notification);
+ mManager.notify(mCurrentNotificationId++, notification);
});
- importanceHighButton2.setOnClickListener(v -> {
- Notification notification = new Notification.Builder(getActivity(), CHANNEL_ID_1)
- .setContentTitle("Importance High 2")
- .setContentText("blah blah blah")
+ view.findViewById(R.id.category_car_warning_button).setOnClickListener(v -> {
+
+ Notification notification = new Notification
+ .Builder(getActivity(), IMPORTANCE_MIN_ID)
+ .setContentTitle("Car Warning")
+ .setContentText(
+ "Shows heads-up; Shows on top of the list but below Car Emergency; "
+ + "Does not group")
+ .setCategory(Notification.CATEGORY_CAR_WARNING)
+ .setColor(mContext.getColor(android.R.color.holo_orange_dark))
+ .setColorized(true)
.setSmallIcon(R.drawable.car_ic_mode)
.build();
- manager.notify(2, notification);
+ mManager.notify(mCurrentNotificationId++, notification);
});
- // importance default
- importanceDefaultButton.setOnClickListener(v -> {
- NotificationChannel channel =
- new NotificationChannel(
- CHANNEL_ID_3,
- "Importance Default",
- NotificationManager.IMPORTANCE_DEFAULT);
- manager.createNotificationChannel(channel);
-
- Notification notification = new Notification.Builder(getActivity(), CHANNEL_ID_3)
- .setContentTitle("Importance Default")
+ view.findViewById(R.id.category_car_info_button).setOnClickListener(v -> {
+ Notification notification = new Notification
+ .Builder(getActivity(), IMPORTANCE_DEFAULT_ID)
+ .setContentTitle("Car information")
+ .setContentText("Doesn't show heads-up; Importance Default; Groups")
+ .setCategory(Notification.CATEGORY_CAR_INFORMATION)
+ .setColor(mContext.getColor(android.R.color.holo_orange_light))
+ .setColorized(true)
.setSmallIcon(R.drawable.car_ic_mode)
.build();
- manager.notify(4, notification);
+ mManager.notify(mCurrentNotificationId++, notification);
});
- // importance low
- importanceLowButton.setOnClickListener(v -> {
- NotificationChannel channel =
- new NotificationChannel(
- CHANNEL_ID_4, "Importance Low", NotificationManager.IMPORTANCE_LOW);
- manager.createNotificationChannel(channel);
+ }
- Notification notification = new Notification.Builder(getActivity(), CHANNEL_ID_4)
+ private void initImportanceHighBotton(View view) {
+ Intent mIntent = new Intent(getActivity(), KitchenSinkActivity.class);
+ PendingIntent mPendingIntent = PendingIntent.getActivity(getActivity(), 0, mIntent, 0);
+
+ Notification notification1 = new Notification
+ .Builder(getActivity(), IMPORTANCE_HIGH_ID)
+ .setContentTitle("Importance High: Shows as a heads-up")
+ .setContentText(
+ "Each click generates a new notification. And some "
+ + "looooooong text. "
+ + "Loooooooooooooooooooooong. "
+ + "Loooooooooooooooooooooooooooooooooooooooooooooooooong.")
+ .setSmallIcon(R.drawable.car_ic_mode)
+ .addAction(
+ new Notification.Action.Builder(
+ null, "Long Action (no-op)", mPendingIntent).build())
+ .addAction(
+ new Notification.Action.Builder(
+ null, "Action (no-op)", mPendingIntent).build())
+ .addAction(
+ new Notification.Action.Builder(
+ null, "Long Action (no-op)", mPendingIntent).build())
+ .setColor(mContext.getColor(android.R.color.holo_red_light))
+ .build();
+
+ view.findViewById(R.id.importance_high_button).setOnClickListener(
+ v -> mManager.notify(mCurrentNotificationId++, notification1)
+ );
+ }
+
+ private void initImportanceDefaultButton(View view) {
+ view.findViewById(R.id.importance_default_button).setOnClickListener(v -> {
+ Notification notification = new Notification
+ .Builder(getActivity(), IMPORTANCE_DEFAULT_ID)
+ .setContentTitle("No heads-up; Importance Default; Groups")
+ .setSmallIcon(R.drawable.car_ic_mode)
+ .build();
+ mManager.notify(mCurrentNotificationId++, notification);
+ });
+ }
+
+ private void initImportanceLowButton(View view) {
+ view.findViewById(R.id.importance_low_button).setOnClickListener(v -> {
+
+ Notification notification = new Notification.Builder(getActivity(), IMPORTANCE_LOW_ID)
.setContentTitle("Importance Low")
- .setContentText("low low low")
+ .setContentText("No heads-up; Below Importance Default; Groups")
.setSmallIcon(R.drawable.car_ic_mode)
.build();
- manager.notify(5, notification);
+ mManager.notify(mCurrentNotificationId++, notification);
});
+ }
- // importance min
- importanceMinButton.setOnClickListener(v -> {
- NotificationChannel channel =
- new NotificationChannel(
- CHANNEL_ID_5, "Importance Min", NotificationManager.IMPORTANCE_MIN);
- manager.createNotificationChannel(channel);
+ private void initImportanceMinButton(View view) {
+ view.findViewById(R.id.importance_min_button).setOnClickListener(v -> {
- Notification notification = new Notification.Builder(getActivity(), CHANNEL_ID_5)
+ Notification notification = new Notification.Builder(getActivity(), IMPORTANCE_MIN_ID)
.setContentTitle("Importance Min")
- .setContentText("min min min")
+ .setContentText("No heads-up; Below Importance Low; Groups")
.setSmallIcon(R.drawable.car_ic_mode)
.build();
- manager.notify(6, notification);
+ mManager.notify(mCurrentNotificationId++, notification);
});
+ }
- // ongoing
- ongoingButton.setOnClickListener(v -> {
- NotificationChannel channel =
- new NotificationChannel(
- CHANNEL_ID_6, "Ongoing", NotificationManager.IMPORTANCE_DEFAULT);
- manager.createNotificationChannel(channel);
+ private void initOngoingButton(View view) {
+ view.findViewById(R.id.ongoing_button).setOnClickListener(v -> {
- Notification notification = new Notification.Builder(getActivity(), CHANNEL_ID_6)
- .setContentTitle("Playing music or something")
+ Notification notification = new Notification
+ .Builder(getActivity(), IMPORTANCE_DEFAULT_ID)
+ .setContentTitle("Persistent/Ongoing Notification")
+ .setContentText("Cannot be dismissed; No heads-up; Importance default; Groups")
.setSmallIcon(R.drawable.car_ic_mode)
.setOngoing(true)
.build();
- manager.notify(7, notification);
+ mManager.notify(mCurrentNotificationId++, notification);
});
+ }
- // category message
- messageButton.setOnClickListener(v -> {
- NotificationChannel channel =
- new NotificationChannel(
- CHANNEL_ID_2, "Message", NotificationManager.IMPORTANCE_HIGH);
- manager.createNotificationChannel(channel);
+ private void initMessagingStyleButton(View view) {
+ int id = mCurrentNotificationId++;
- Intent intent = new Intent(getActivity(), KitchenSinkActivity.class);
- PendingIntent readIntent = PendingIntent.getActivity(getActivity(), 0, intent, 0);
+ view.findViewById(R.id.category_message_button).setOnClickListener(v -> {
- RemoteInput remoteInput = new RemoteInput.Builder("voice reply").build();
- PendingIntent replyIntent = PendingIntent.getBroadcast(getApplicationContext(),
- 12345,
- intent,
- PendingIntent.FLAG_UPDATE_CURRENT);
+ PendingIntent replyIntent = createServiceIntent(id, "reply");
+ PendingIntent markAsReadIntent = createServiceIntent(id, "read");
- Person personJohn = new Person.Builder().setName("John Doe").build();
- Person personJane = new Person.Builder().setName("Jane Roe").build();
- Notification.MessagingStyle messagingStyle =
- new Notification.MessagingStyle(personJohn)
- .setConversationTitle("Whassup")
- .addHistoricMessage(
- new Notification.MessagingStyle.Message(
- "historic message",
+ Person personJohn = new Person.Builder()
+ .setName("John Doe")
+ .build();
+ Person personJane = new Person.Builder()
+ .setName("Jane Roe")
+ .build();
+ MessagingStyle messagingStyle =
+ new MessagingStyle(personJohn)
+ .setConversationTitle("Heads-up: New Message")
+ .addMessage(
+ new MessagingStyle.Message(
+ "The meaning of life, or the answer to the question"
+ + "What is the meaning of life?, pertains to "
+ + "the significance of living or existence in"
+ + " general. Many other related questions "
+ + "include: Why are we here?, What is "
+ + "life all about?, or What is the "
+ + "purpose of existence?",
System.currentTimeMillis() - 3600,
personJohn))
- .addMessage(new Notification.MessagingStyle.Message(
- "message", System.currentTimeMillis(), personJane));
+ .addMessage(
+ new MessagingStyle.Message(
+ "Importance High; Groups", System.currentTimeMillis(),
+ personJane));
- Notification notification = new Notification.Builder(getActivity(), CHANNEL_ID_2)
+ NotificationCompat.Builder notification = new NotificationCompat
+ .Builder(getActivity(), IMPORTANCE_HIGH_ID)
.setContentTitle("Message from someone")
.setContentText("hi")
+ .setShowWhen(true)
.setCategory(Notification.CATEGORY_MESSAGE)
.setSmallIcon(R.drawable.car_ic_mode)
.setStyle(messagingStyle)
.setAutoCancel(true)
+ .setColor(mContext.getColor(android.R.color.holo_green_light))
.addAction(
- new Notification.Action.Builder(null, "read", readIntent).build())
+ new Action.Builder(R.drawable.ic_check_box, "read", markAsReadIntent)
+ .setSemanticAction(Action.SEMANTIC_ACTION_MARK_AS_READ)
+ .setShowsUserInterface(false)
+ .build())
.addAction(
- new Notification.Action.Builder(null, "reply", replyIntent)
- .addRemoteInput(remoteInput).build())
- .extend(new Notification.CarExtender().setColor(R.color.car_red_500))
- .build();
- manager.notify(3, notification);
- });
+ new Action.Builder(R.drawable.ic_check_box, "reply", replyIntent)
+ .setSemanticAction(Action.SEMANTIC_ACTION_REPLY)
+ .setShowsUserInterface(false)
+ .addRemoteInput(new RemoteInput.Builder("input").build())
+ .build());
- return view;
+ mManager.notify(id, notification.build());
+ });
+ }
+
+ private PendingIntent createServiceIntent(int notificationId, String action) {
+ Intent intent = new Intent(mContext, KitchenSinkActivity.class).setAction(action);
+
+ return PendingIntent.getForegroundService(mContext, notificationId, intent,
+ PendingIntent.FLAG_UPDATE_CURRENT);
+ }
+
+ private void initProgressButton(View view) {
+ view.findViewById(R.id.progress_button).setOnClickListener(v -> {
+ int id = mCurrentNotificationId++;
+
+ Notification notification = new Notification
+ .Builder(getActivity(), IMPORTANCE_DEFAULT_ID)
+ .setContentTitle("Progress")
+ .setContentText("Doesn't show heads-up; Importance Default; Groups")
+ .setProgress(100, 0, false)
+ .setColor(mContext.getColor(android.R.color.holo_purple))
+ .setContentInfo("0%")
+ .setSmallIcon(R.drawable.car_ic_mode)
+ .build();
+ mManager.notify(id, notification);
+
+ Runnable runnable = new Runnable() {
+ int mProgress = 0;
+
+ @Override
+ public void run() {
+ Notification updateNotification = new Notification
+ .Builder(getActivity(), IMPORTANCE_DEFAULT_ID)
+ .setContentTitle("Progress")
+ .setContentText("Doesn't show heads-up; Importance Default; Groups")
+ .setProgress(100, mProgress, false)
+ .setColor(mContext.getColor(android.R.color.holo_purple))
+ .setContentInfo(mProgress + "%")
+ .setSmallIcon(R.drawable.car_ic_mode)
+ .build();
+ mManager.notify(id, updateNotification);
+ mProgress += 5;
+ if (mProgress <= 100) {
+ mHandler.postDelayed(this, 1000);
+ }
+ }
+ };
+ mUpdateRunnables.put(id, runnable);
+ mHandler.post(runnable);
+ });
+ }
+
+ private void initNavigationButton(View view) {
+ view.findViewById(R.id.navigation_button).setOnClickListener(v -> {
+ int id = mCurrentNotificationId++;
+
+ Notification notification = new Notification
+ .Builder(getActivity(), IMPORTANCE_HIGH_ID)
+ .setContentTitle("Navigation")
+ .setContentText("Turn right in 900 ft")
+ .setColor(mContext.getColor(android.R.color.holo_green_dark))
+ .setColorized(true)
+ .setSubText("900 ft")
+ .setSmallIcon(R.drawable.car_ic_mode)
+ .build();
+ mManager.notify(id, notification);
+
+ Runnable rightTurnRunnable = new Runnable() {
+ int mDistance = 800;
+
+ @Override
+ public void run() {
+ Notification updateNotification = new Notification
+ .Builder(getActivity(), IMPORTANCE_HIGH_NO_SOUND_ID)
+ .setContentTitle("Navigation")
+ .setContentText("Turn right in " + mDistance + " ft")
+ .setColor(mContext.getColor(android.R.color.holo_green_dark))
+ .setColorized(true)
+ .setSubText(mDistance + " ft")
+ .setSmallIcon(R.drawable.car_ic_mode)
+ .build();
+ mManager.notify(id, updateNotification);
+ mDistance -= 100;
+ if (mDistance >= 0) {
+ mHandler.postDelayed(this, 1000);
+ }
+ }
+ };
+
+ Runnable exitRunnable = new Runnable() {
+ int mDistance = 9;
+
+ @Override
+ public void run() {
+ Notification updateNotification = new Notification
+ .Builder(getActivity(), IMPORTANCE_HIGH_NO_SOUND_ID)
+ .setContentTitle("Navigation")
+ .setContentText("Exit in " + mDistance + " miles")
+ .setColor(mContext.getColor(android.R.color.holo_green_dark))
+ .setColorized(true)
+ .setSubText(mDistance + " miles")
+ .setSmallIcon(R.drawable.car_ic_mode)
+ .build();
+ mManager.notify(id, updateNotification);
+ mDistance -= 1;
+ if (mDistance >= 0) {
+ mHandler.postDelayed(this, 1000);
+ }
+ }
+ };
+
+ mUpdateRunnables.put(id, rightTurnRunnable);
+ mUpdateRunnables.put(id, exitRunnable);
+ mHandler.postDelayed(rightTurnRunnable, 1000);
+ mHandler.postDelayed(exitRunnable, 10000);
+ });
}
}
diff --git a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/power/PowerTestFragment.java b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/power/PowerTestFragment.java
index d24148d..2dea5d8 100644
--- a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/power/PowerTestFragment.java
+++ b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/power/PowerTestFragment.java
@@ -28,32 +28,32 @@
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
-import android.widget.TextView;
import androidx.fragment.app.Fragment;
import com.google.android.car.kitchensink.KitchenSinkActivity;
import com.google.android.car.kitchensink.R;
-import java.util.concurrent.Executor;
+import java.util.concurrent.CompletableFuture;
public class PowerTestFragment extends Fragment {
private final boolean DBG = false;
private final String TAG = "PowerTestFragment";
private CarPowerManager mCarPowerManager;
- private TextView mTvBootReason;
- private Executor mExecutor;
-
- private class ThreadPerTaskExecutor implements Executor {
- public void execute(Runnable r) {
- new Thread(r).start();
- }
- }
private final CarPowerManager.CarPowerStateListener mPowerListener =
- new CarPowerManager.CarPowerStateListener () {
+ new CarPowerManager.CarPowerStateListener() {
@Override
public void onStateChanged(int state) {
+ throw new UnsupportedOperationException(
+ "Should not be here. This API obsolete and is not used.");
+ }
+
+ @Override
+ public void onStateChanged(int state, CompletableFuture<Void> future) {
+ if (future != null) {
+ future.complete(null);
+ }
Log.i(TAG, "onStateChanged() state = " + state);
}
};
@@ -62,9 +62,8 @@
public void onCreate(Bundle savedInstanceState) {
final Runnable r = () -> {
mCarPowerManager = ((KitchenSinkActivity) getActivity()).getPowerManager();
- mExecutor = new ThreadPerTaskExecutor();
try {
- mCarPowerManager.setListener(mPowerListener, mExecutor);
+ mCarPowerManager.setListener(mPowerListener);
} catch (CarNotConnectedException e) {
Log.e(TAG, "Car is not connected!");
} catch (IllegalStateException e) {
@@ -86,10 +85,7 @@
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstance) {
View v = inflater.inflate(R.layout.power_test, container, false);
- Button b = v.findViewById(R.id.btnPwrGetBootReason);
- b.setOnClickListener(this::getBootReasonBtn);
-
- b = v.findViewById(R.id.btnPwrRequestShutdown);
+ Button b = v.findViewById(R.id.btnPwrRequestShutdown);
b.setOnClickListener(this::requestShutdownBtn);
b = v.findViewById(R.id.btnPwrShutdown);
@@ -98,8 +94,6 @@
b = v.findViewById(R.id.btnPwrSleep);
b.setOnClickListener(this::sleepBtn);
- mTvBootReason = v.findViewById(R.id.tvPowerBootReason);
-
if(DBG) {
Log.d(TAG, "Starting PowerTestFragment");
}
@@ -107,15 +101,6 @@
return v;
}
- private void getBootReasonBtn(View v) {
- try {
- int bootReason = mCarPowerManager.getBootReason();
- mTvBootReason.setText(String.valueOf(bootReason));
- } catch (CarNotConnectedException e) {
- Log.e(TAG, "Failed to getBootReason()", e);
- }
- }
-
private void requestShutdownBtn(View v) {
try {
mCarPowerManager.requestShutdownOnNextSuspend();
diff --git a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/property/PropertyTestFragment.java b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/property/PropertyTestFragment.java
index 83bbfa9..13da4bb 100644
--- a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/property/PropertyTestFragment.java
+++ b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/property/PropertyTestFragment.java
@@ -76,9 +76,6 @@
@Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.property, container, false);
- mActivity = (KitchenSinkActivity) getHost();
- mMgr = mActivity.getPropertyManager();
-
// Get resource IDs
mAreaId = view.findViewById(R.id.sAreaId);
mEventLog = view.findViewById(R.id.tvEventLog);
@@ -123,7 +120,9 @@
} else {
mGetValue.setText("Timestamp=" + value.getTimestamp()
+ "\nstatus=" + value.getStatus()
- + "\nvalue=" + value.getValue());
+ + "\nvalue=" + value.getValue()
+ + "\nread=" + mMgr.getReadPermission(propId)
+ + "\nwrite=" + mMgr.getWritePermission(propId));
}
} catch (Exception e) {
Log.e(TAG, "Failed to get property", e);
diff --git a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/sensor/LocationListeners.java b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/sensor/LocationListeners.java
new file mode 100644
index 0000000..0129085
--- /dev/null
+++ b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/sensor/LocationListeners.java
@@ -0,0 +1,198 @@
+/*
+ * 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.google.android.car.kitchensink.sensor;
+
+import android.content.Context;
+import android.hardware.Sensor;
+import android.hardware.SensorEvent;
+import android.hardware.SensorEventListener;
+import android.hardware.SensorManager;
+import android.location.Location;
+import android.location.LocationListener;
+import android.location.LocationManager;
+import android.os.Bundle;
+import android.util.Log;
+
+
+public class LocationListeners {
+
+ private static final String TAG = "CAR.SENSOR.KS.location";
+
+ SensorsTestFragment.LocationInfoTextUpdateListener mTextUpdateHandler;
+
+ LocationManager mLocationMgr;
+ SensorManager mSensorMgr;
+
+ Sensor mAccelerometerSensor, mMagneticFieldSensor, mGyroscopeSensor;
+
+ public LocationListeners(Context context,
+ SensorsTestFragment.LocationInfoTextUpdateListener listener) {
+ mTextUpdateHandler = listener;
+
+ mLocationMgr = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
+ mSensorMgr = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
+
+ mAccelerometerSensor = mSensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
+ mMagneticFieldSensor = mSensorMgr.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
+ mGyroscopeSensor = mSensorMgr.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
+ }
+
+ public void startListening() {
+ if (mLocationMgr != null) {
+ if (mLocationMgr.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
+ mLocationMgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,
+ mLocationListener);
+ mTextUpdateHandler.setLocationField("waiting to hear from GPS");
+ } else {
+ mTextUpdateHandler.setLocationField("GPS_PROVIDER not available");
+ }
+ } else {
+ mTextUpdateHandler.setLocationField("LocationManager not available");
+ }
+
+ if (mSensorMgr != null) {
+ // Accelerometer.
+ if (mAccelerometerSensor != null) {
+ if (!mSensorMgr.registerListener(mSensorListener, mAccelerometerSensor,
+ SensorManager.SENSOR_DELAY_FASTEST)) {
+ mTextUpdateHandler.setAccelField(
+ "Accelerometer: failed to register listener.");
+ } else {
+ mTextUpdateHandler.setAccelField(
+ "Accelerometer: waiting to hear from SensorManager");
+ }
+ } else {
+ mTextUpdateHandler.setAccelField("Accelerometer: sensor not available.");
+ }
+
+ // Gyroscope.
+ if (mGyroscopeSensor != null) {
+ if (!mSensorMgr.registerListener(mSensorListener, mGyroscopeSensor,
+ SensorManager.SENSOR_DELAY_FASTEST)) {
+ mTextUpdateHandler.setGyroField(
+ "Gyroscope: failed to register listener.");
+ } else {
+ mTextUpdateHandler.setGyroField(
+ "Gyroscope: waiting to hear from SensorManager");
+ }
+ } else {
+ mTextUpdateHandler.setGyroField("Gyroscope: sensor not available.");
+ }
+
+ // Magnetometer.
+ if (mMagneticFieldSensor != null) {
+ if (!mSensorMgr.registerListener(mSensorListener, mMagneticFieldSensor,
+ SensorManager.SENSOR_DELAY_FASTEST)) {
+ mTextUpdateHandler.setMagField(
+ "Magnetometer: failed to register listener.");
+ } else {
+ mTextUpdateHandler.setMagField(
+ "Magnetometer: waiting to hear from SensorManager");
+ }
+ } else {
+ mTextUpdateHandler.setMagField("Magnetometer: sensor not available.");
+ }
+ } else {
+ mTextUpdateHandler.setAccelField("SensorManager not available");
+ mTextUpdateHandler.setGyroField("SensorManager not available");
+ mTextUpdateHandler.setMagField("SensorManager not available");
+ }
+ }
+
+ public void stopListening() {
+ if (mLocationMgr != null) {
+ if (mLocationMgr.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
+ mLocationMgr.removeUpdates(mLocationListener);
+ mTextUpdateHandler.setMagField("GPS stopped");
+ }
+ }
+
+ if (mSensorMgr != null) {
+ mSensorMgr.unregisterListener(mSensorListener);
+ mTextUpdateHandler.setAccelField("SensorManager stopped");
+ mTextUpdateHandler.setGyroField("SensorManager stopped");
+ mTextUpdateHandler.setMagField("SensorManager stopped");
+ }
+ }
+
+
+ private final LocationListener mLocationListener = new LocationListener() {
+ @Override
+ public void onLocationChanged(Location location) {
+ String s = String.format("Location: lat=%10.6f, lon=%10.6f, altitude=%5.0f, "
+ + "speed=%5.1f, bearing=%3.0f, accuracy=%5.1f",
+ location.getLatitude(),
+ location.getLongitude(),
+ location.getAltitude(),
+ location.getSpeed(),
+ location.getBearing(),
+ location.getAccuracy());
+
+ mTextUpdateHandler.setLocationField(s);
+ }
+
+ @Override
+ public void onProviderEnabled(String provider) {
+ }
+
+ @Override
+ public void onProviderDisabled(String provider) {
+ }
+
+ @Override
+ public void onStatusChanged(String provider, int status, Bundle extras) {
+ }
+ };
+
+ private final SensorEventListener mSensorListener = new SensorEventListener() {
+ @Override
+ public void onSensorChanged(SensorEvent event) {
+ int type = event.sensor.getType();
+ switch (type) {
+ case Sensor.TYPE_GYROSCOPE:
+ String gs = String.format("Gyroscope Rad/s: (%6.2f, %6.2f, %6.2f)",
+ event.values[0], event.values[1], event.values[2]);
+ mTextUpdateHandler.setGyroField(gs);
+ break;
+ case Sensor.TYPE_MAGNETIC_FIELD:
+ // NOTE: If we wanted to report yaw/pitch/roll, we would use both
+ // accelerometer and magnetic data to compute R and I:
+ // SensorManager.getRotationMatrix(R, I,
+ // mLastAccelerometerData
+ // mLastMagneticFieldData);
+ // SensorManager.getOrientation(mR, orientation);
+ String ms = String.format("Magnetic uT: (%6.2f, %6.2f, %6.2f)",
+ event.values[0], event.values[1], event.values[2]);
+ mTextUpdateHandler.setMagField(ms);
+ break;
+ case Sensor.TYPE_ACCELEROMETER:
+ String as = String.format("Accelerometer m/s2: (%6.2f, %6.2f, %6.2f)",
+ event.values[0], event.values[1], event.values[2]);
+ mTextUpdateHandler.setAccelField(as);
+ break;
+ default:
+ Log.w(TAG, "Unexpected sensor event type: " + type);
+ // Should never happen.
+ return;
+ }
+ }
+
+ @Override
+ public void onAccuracyChanged(Sensor sensor, int accuracy) {
+ }
+ };
+}
diff --git a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/sensor/SensorsTestFragment.java b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/sensor/SensorsTestFragment.java
index 39392b9..82a8cb2 100644
--- a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/sensor/SensorsTestFragment.java
+++ b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/sensor/SensorsTestFragment.java
@@ -43,7 +43,6 @@
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
-import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
@@ -75,7 +74,7 @@
synchronized (SensorsTestFragment.this) {
mEventMap.put(event.sensorType, event);
}
- refreshUi();
+ refreshSensorInfoText();
}
};
private final Handler mHandler = new Handler();
@@ -83,13 +82,19 @@
private final DateFormat mDateFormat = SimpleDateFormat.getDateTimeInstance();
private KitchenSinkActivity mActivity;
- private TextView mSensorInfo;
private Car mCar;
- private CarSensorManager mSensorManager;
+ private CarSensorManager mCarSensorManager;
+ private LocationListeners mLocationListener;
private String mNaString;
private int[] supportedSensors = new int[0];
private Set<String> mActivePermissions = new HashSet<String>();
+ private TextView mSensorInfo;
+ private TextView mLocationInfo;
+ private TextView mAccelInfo;
+ private TextView mGyroInfo;
+ private TextView mMagInfo;
+
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
@@ -100,7 +105,13 @@
View view = inflater.inflate(R.layout.sensors, container, false);
mActivity = (KitchenSinkActivity) getHost();
+
mSensorInfo = (TextView) view.findViewById(R.id.sensor_info);
+ mLocationInfo = (TextView) view.findViewById(R.id.location_info);
+ mAccelInfo = (TextView) view.findViewById(R.id.accel_info);
+ mGyroInfo = (TextView) view.findViewById(R.id.gyro_info);
+ mMagInfo = (TextView) view.findViewById(R.id.mag_info);
+
mNaString = getContext().getString(R.string.sensor_na);
return view;
}
@@ -118,24 +129,38 @@
@Override
public void onPause() {
super.onPause();
- if (mSensorManager != null) {
- mSensorManager.unregisterListener(mOnSensorChangedListener);
+ if (mCarSensorManager != null) {
+ mCarSensorManager.unregisterListener(mOnSensorChangedListener);
+ }
+ if (mLocationListener != null) {
+ mLocationListener.stopListening();
}
}
private void initSensors() {
try {
- mSensorManager =
- (CarSensorManager) ((KitchenSinkActivity) getActivity()).getSensorManager();
- supportedSensors = mSensorManager.getSupportedSensors();
+ if (mCarSensorManager == null) {
+ mCarSensorManager =
+ (CarSensorManager) ((KitchenSinkActivity) getActivity()).getSensorManager();
+ }
+ supportedSensors = mCarSensorManager.getSupportedSensors();
for (Integer sensor : supportedSensors) {
- mSensorManager.registerListener(mOnSensorChangedListener, sensor,
+ mCarSensorManager.registerListener(mOnSensorChangedListener, sensor,
CarSensorManager.SENSOR_RATE_NORMAL);
}
} catch (CarNotConnectedException e) {
Log.e(TAG, "Car not connected or not supported", e);
} catch (Exception e) {
- Log.e(TAG, "initSensors() exception caught: ", e);
+ Log.e(TAG, "initSensors() exception caught SensorManager: ", e);
+ }
+ try {
+ if (mLocationListener == null) {
+ mLocationListener = new LocationListeners(getContext(),
+ new LocationInfoTextUpdateListener());
+ }
+ mLocationListener.startListening();
+ } catch (Exception e) {
+ Log.e(TAG, "initSensors() exception caught from LocationListeners: ", e);
}
}
@@ -143,6 +168,7 @@
Set<String> missingPermissions = checkExistingPermissions();
if (!missingPermissions.isEmpty()) {
requestPermissions(missingPermissions);
+ // The callback with premission results will take care of calling initSensors for us
} else {
initSensors();
}
@@ -182,7 +208,7 @@
}
}
- private void refreshUi() {
+ private void refreshSensorInfoText() {
String summaryString;
synchronized (this) {
List<String> summary = new ArrayList<>();
@@ -257,7 +283,7 @@
}
// Get the config data
try {
- CarSensorConfig c = mSensorManager.getSensorConfig(
+ CarSensorConfig c = mCarSensorManager.getSensorConfig(
CarSensorManager.SENSOR_TYPE_WHEEL_TICK_DISTANCE);
summary.add(getContext().getString(R.string.sensor_wheel_ticks_cfg,
c.getInt(CarSensorConfig.WHEEL_TICK_DISTANCE_SUPPORTED_WHEELS),
@@ -294,6 +320,9 @@
case CarSensorManager.SENSOR_TYPE_EV_BATTERY_CHARGE_RATE:
summary.add(getEvChargeRate(event));
break;
+ case CarSensorManager.SENSOR_TYPE_ENGINE_OIL_LEVEL:
+ summary.add(getEngineOilLevel(event));
+ break;
default:
// Should never happen.
Log.w(TAG, "Unrecognized event type: " + toHexString(i));
@@ -313,7 +342,11 @@
if (event == null) {
return mNaString;
}
- return mDateFormat.format(new Date(event.timestamp / (1000L * 1000L)));
+ return Double.toString(event.timestamp / (1000L * 1000L * 1000L)) + " seconds";
+ }
+
+ private String getTimestampNow() {
+ return Double.toString(System.nanoTime() / (1000L * 1000L * 1000L)) + " seconds";
}
private String getFuelLevel(CarSensorEvent event) {
@@ -370,4 +403,38 @@
return getContext().getString(R.string.sensor_ev_charge_rate, getTimestamp(event),
evChargeRate);
}
+
+ private String getEngineOilLevel(CarSensorEvent event) {
+ String engineOilLevel = mNaString;
+ if(event != null) {
+ engineOilLevel = String.valueOf(event.getCarEngineOilLevelData(null).engineOilLevel);
+ }
+ return getContext().getString(R.string.sensor_oil_level, getTimestamp(event),
+ engineOilLevel);
+ }
+
+ public class LocationInfoTextUpdateListener {
+ public void setLocationField(String value) {
+ setTimestampedTextField(mLocationInfo, value);
+ }
+
+ public void setAccelField(String value) {
+ setTimestampedTextField(mAccelInfo, value);
+ }
+
+ public void setGyroField(String value) {
+ setTimestampedTextField(mGyroInfo, value);
+ }
+
+ public void setMagField(String value) {
+ setTimestampedTextField(mMagInfo, value);
+ }
+
+ private void setTimestampedTextField(TextView text, String value) {
+ synchronized (SensorsTestFragment.this) {
+ text.setText(getTimestampNow() + ": " + value);
+ Log.d(TAG, "setText: " + value);
+ }
+ }
+ }
}
diff --git a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/setting/CarServiceSettingsActivity.java b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/setting/CarServiceSettingsActivity.java
index 0ad1934..d5f2cf2 100644
--- a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/setting/CarServiceSettingsActivity.java
+++ b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/setting/CarServiceSettingsActivity.java
@@ -18,7 +18,6 @@
import android.os.Bundle;
import android.preference.PreferenceActivity;
-import android.view.View;
import android.widget.Button;
import com.google.android.car.kitchensink.R;
@@ -33,12 +32,7 @@
super.onCreate(savedInstanceState);
Button button = new Button(this);
button.setText("Finish");
- button.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- finish();
- }
- });
+ button.setOnClickListener(view -> finish());
setListFooter(button);
}
@@ -49,8 +43,7 @@
@Override
protected boolean isValidFragment(String fragmentName) {
- if (GarageModeSettingsFragment.class.getName().equals(fragmentName)
- || UsbManagerFragment.class.getName().equals(fragmentName)) {
+ if (UsbManagerFragment.class.getName().equals(fragmentName)) {
return true;
}
return false;
diff --git a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/setting/GarageModeSettingsFragment.java b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/setting/GarageModeSettingsFragment.java
deleted file mode 100644
index 4ace656..0000000
--- a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/setting/GarageModeSettingsFragment.java
+++ /dev/null
@@ -1,177 +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.google.android.car.kitchensink.setting;
-
-import static android.car.settings.CarSettings.Global.KEY_GARAGE_MODE_ENABLED;
-import static android.car.settings.CarSettings.Global.KEY_GARAGE_MODE_MAINTENANCE_WINDOW;
-import static android.car.settings.CarSettings.Global.KEY_GARAGE_MODE_WAKE_UP_TIME;
-import static android.car.settings.GarageModeSettingsObserver.GARAGE_MODE_ENABLED_URI;
-import static android.car.settings.GarageModeSettingsObserver.GARAGE_MODE_MAINTENANCE_WINDOW_URI;
-import static android.car.settings.GarageModeSettingsObserver.GARAGE_MODE_WAKE_UP_TIME_URI;
-
-import android.app.TimePickerDialog;
-import android.car.CarApiUtil;
-import android.car.settings.GarageModeSettingsObserver;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Handler;
-import android.preference.Preference;
-import android.preference.PreferenceFragment;
-import android.preference.PreferenceScreen;
-import android.provider.Settings;
-import android.text.format.DateFormat;
-import android.util.Log;
-import android.widget.TimePicker;
-
-import com.google.android.car.kitchensink.R;
-
-import java.sql.Time;
-
-public class GarageModeSettingsFragment extends PreferenceFragment implements
- TimePickerDialog.OnTimeSetListener, Preference.OnPreferenceChangeListener {
-
- private static final String TAG = "GarageModeSettings";
- private Preference mTimePreference;
- private Preference mGarageSwitchPreference;
- private Preference mGarageLimitPreference;
-
- private int mGarageTimeHour;
- private int mGarageTimeMin;
-
- private GarageModeSettingsObserver mContentObserver;
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- addPreferencesFromResource(R.xml.garage_mode_prefs);
- mTimePreference = findPreference(KEY_GARAGE_MODE_WAKE_UP_TIME);
- mTimePreference.setOnPreferenceChangeListener(this);
- mGarageSwitchPreference = findPreference(KEY_GARAGE_MODE_ENABLED);
- mGarageSwitchPreference.setOnPreferenceChangeListener(this);
- mGarageLimitPreference = findPreference(KEY_GARAGE_MODE_MAINTENANCE_WINDOW);
- mGarageLimitPreference.setOnPreferenceChangeListener(this);
- refreshUI(KEY_GARAGE_MODE_ENABLED, KEY_GARAGE_MODE_WAKE_UP_TIME, KEY_GARAGE_MODE_MAINTENANCE_WINDOW);
- mContentObserver = new GarageModeSettingsObserver(getContext(), new Handler()) {
- @Override
- public void onChange(boolean selfChange, Uri uri) {
- onSettingsChangedInternal(uri);
- }
- };
- }
-
- @Override
- public void onResume() {
- super.onResume();
- mContentObserver.register();
- }
-
- @Override
- public void onPause() {
- super.onPause();
- mContentObserver.unregister();
- }
-
- private void refreshUI(String... keys) {
- for (String key : keys) {
- try {
- switch (key) {
- case KEY_GARAGE_MODE_ENABLED:
- mGarageSwitchPreference.setDefaultValue(
- Settings.Global.getInt(getContext().getContentResolver(), key)
- == 1);
- break;
- case KEY_GARAGE_MODE_WAKE_UP_TIME:
- int time[] = CarApiUtil.decodeGarageTimeSetting(
- Settings.Global.getString(getContext().getContentResolver(),
- KEY_GARAGE_MODE_WAKE_UP_TIME));
- mTimePreference.setSummary(
- DateFormat.getTimeFormat(getContext()).format(
- new Time(time[0], time[1], 0)));
- mGarageTimeHour = time[0];
- mGarageTimeMin = time[1];
- break;
- case KEY_GARAGE_MODE_MAINTENANCE_WINDOW:
- int limitMinutes = Settings.Global.getInt(getContext().getContentResolver(),
- key) / 60 / 1000;
- mGarageLimitPreference.setSummary(
- getString(R.string.garage_time_limit_summary, limitMinutes));
- break;
- }
- } catch (Settings.SettingNotFoundException e) {
- Log.e(TAG, "Settings not found " + key);
- }
- }
- }
-
- @Override
- public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) {
- if (preference == mTimePreference) {
- TimePickerDialogFragment dialog =
- TimePickerDialogFragment.newInstance(mGarageTimeHour, mGarageTimeMin);
- dialog.setTimeSetListener(this);
- dialog.show(getFragmentManager(), "time");
- return true;
- }
- return super.onPreferenceTreeClick(screen, preference);
- }
-
- @Override
- public boolean onPreferenceChange(Preference preference, Object newValue) {
- if (preference == mGarageSwitchPreference) {
- updateGarageSwitch((boolean) newValue);
- refreshUI(KEY_GARAGE_MODE_ENABLED);
- return true;
- } else if (preference == mGarageLimitPreference) {
- updateGarageTimeLimit(Integer.valueOf((String) newValue));
- refreshUI(KEY_GARAGE_MODE_MAINTENANCE_WINDOW);
- return true;
- }
-
- return false;
- }
-
- private void updateGarageSwitch(boolean newValue) {
- Settings.Global.putInt(getContext().getContentResolver(),
- KEY_GARAGE_MODE_ENABLED, newValue ? 1 : 0);
- }
-
- private void updateGarageTimeLimit(int newValue) {
- Settings.Global.putInt(getContext().getContentResolver(),
- KEY_GARAGE_MODE_MAINTENANCE_WINDOW, newValue * 60 * 1000);
- }
-
- private void updateGarageTime(String time) {
- Settings.Global.putString(getContext().getContentResolver(),
- KEY_GARAGE_MODE_WAKE_UP_TIME, time);
- }
-
- @Override
- public void onTimeSet(TimePicker timePicker, int hour, int minute) {
- updateGarageTime(CarApiUtil.encodeGarageTimeSetting(hour, minute));
- refreshUI(KEY_GARAGE_MODE_WAKE_UP_TIME);
- }
-
- private void onSettingsChangedInternal(Uri uri) {
- Log.d(TAG, "Content Observer onChange: " + uri);
- if (uri.equals(GARAGE_MODE_ENABLED_URI)) {
- refreshUI(KEY_GARAGE_MODE_ENABLED);
- } else if (uri.equals(GARAGE_MODE_WAKE_UP_TIME_URI)) {
- refreshUI(KEY_GARAGE_MODE_WAKE_UP_TIME);
- } else if (uri.equals(GARAGE_MODE_MAINTENANCE_WINDOW_URI)) {
- refreshUI(KEY_GARAGE_MODE_MAINTENANCE_WINDOW);
- }
- }
-}
\ No newline at end of file
diff --git a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/storagelifetime/StorageLifetimeFragment.java b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/storagelifetime/StorageLifetimeFragment.java
index b134139..b180e1a 100644
--- a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/storagelifetime/StorageLifetimeFragment.java
+++ b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/storagelifetime/StorageLifetimeFragment.java
@@ -207,8 +207,7 @@
"\nBlock size: " + mStatFs.getBlockSizeLong() + " bytes" +
"\nfor a total free space of: " +
(mStatFs.getBlockSizeLong() * mStatFs.getAvailableBlocksLong() / MEGABYTE) + "MB");
- } catch (android.car.CarNotConnectedException|
- android.support.car.CarNotConnectedException e) {
+ } catch (CarNotConnectedException e) {
Log.e(TAG, "Car not connected or not supported", e);
}
}
diff --git a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/users/UserRestrictionAdapter.java b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/users/UserRestrictionAdapter.java
new file mode 100644
index 0000000..00c7192
--- /dev/null
+++ b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/users/UserRestrictionAdapter.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.google.android.car.kitchensink.users;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.CheckBox;
+
+import com.google.android.car.kitchensink.R;
+
+import java.util.List;
+
+/**
+ * Adapter to display a set of user restrictions
+ */
+public class UserRestrictionAdapter extends BaseAdapter {
+
+ private final Context mContext;
+ private final List<UserRestrictionListItem> mItems;
+
+ public UserRestrictionAdapter(Context context, List<UserRestrictionListItem> items) {
+ mContext = context;
+ mItems = items;
+ }
+
+ @Override
+ public int getCount() {
+ return mItems.size();
+ }
+
+ @Override
+ public Object getItem(int index) {
+ return mItems.get(index);
+ }
+
+ @Override
+ public long getItemId(int index) {
+ return index;
+ }
+
+ @Override
+ public View getView(int index, View convertView, ViewGroup parent) {
+ return convertView == null
+ ? createCheckBox((UserRestrictionListItem) getItem(index))
+ : convertView;
+ }
+
+ private CheckBox createCheckBox(UserRestrictionListItem item) {
+ Resources resources = mContext.getResources();
+ CheckBox checkBox = new CheckBox(mContext);
+ checkBox.setTextSize(resources.getDimensionPixelSize(R.dimen.users_checkbox_text_size));
+ int padding = resources.getDimensionPixelSize(R.dimen.users_checkbox_padding);
+ checkBox.setPadding(padding, padding, padding, padding);
+ checkBox.setText(item.getKey());
+ checkBox.setOnCheckedChangeListener((v, isChecked) -> item.setIsChecked(isChecked));
+ checkBox.setChecked(item.getIsChecked());
+ return checkBox;
+ }
+}
diff --git a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/users/UserRestrictionListItem.java b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/users/UserRestrictionListItem.java
new file mode 100644
index 0000000..0454f75
--- /dev/null
+++ b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/users/UserRestrictionListItem.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.google.android.car.kitchensink.users;
+
+/**
+ * Represents a user restriction in a list. Contains the key for the user restriction and the
+ * "checked" status of the checkbox in the list.
+ */
+public class UserRestrictionListItem {
+ private final String mKey;
+ private boolean mIsChecked;
+
+ public UserRestrictionListItem(String key, boolean isChecked) {
+ mKey = key;
+ mIsChecked = isChecked;
+ }
+
+ public String getKey() {
+ return mKey;
+ }
+
+ public void setIsChecked(boolean value) {
+ mIsChecked = value;
+ }
+
+ public boolean getIsChecked() {
+ return mIsChecked;
+ }
+}
diff --git a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/users/UsersFragment.java b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/users/UsersFragment.java
new file mode 100644
index 0000000..3272c30
--- /dev/null
+++ b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/users/UsersFragment.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.google.android.car.kitchensink.users;
+
+import android.annotation.Nullable;
+import android.content.Context;
+import android.os.Bundle;
+import android.os.UserManager;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.ListView;
+import android.widget.Toast;
+
+import androidx.fragment.app.Fragment;
+
+import com.google.android.car.kitchensink.R;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Manipulate users in various ways
+ */
+public class UsersFragment extends Fragment {
+
+ private static final List<String> CONFIGURABLE_USER_RESTRICTIONS =
+ Arrays.asList(
+ UserManager.DISALLOW_ADD_USER,
+ UserManager.DISALLOW_BLUETOOTH,
+ UserManager.DISALLOW_FACTORY_RESET,
+ UserManager.DISALLOW_INSTALL_APPS,
+ UserManager.DISALLOW_MODIFY_ACCOUNTS,
+ UserManager.DISALLOW_OUTGOING_CALLS,
+ UserManager.DISALLOW_REMOVE_USER,
+ UserManager.DISALLOW_SMS,
+ UserManager.DISALLOW_UNINSTALL_APPS,
+ UserManager.DISALLOW_USER_SWITCH
+ );
+
+ @Nullable
+ @Override
+ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
+ @Nullable Bundle savedInstanceState) {
+ return inflater.inflate(R.layout.users, container, false);
+ }
+
+ public void onViewCreated(View view, Bundle savedInstanceState) {
+ ListView userRestrictionsList = view.findViewById(R.id.user_restrictions_list);
+ userRestrictionsList.setAdapter(
+ new UserRestrictionAdapter(getContext(), createUserRestrictionItems()));
+
+ Button applyButton = view.findViewById(R.id.apply_button);
+ applyButton.setOnClickListener(v -> {
+ UserRestrictionAdapter adapter =
+ (UserRestrictionAdapter) userRestrictionsList.getAdapter();
+ int count = adapter.getCount();
+ UserManager userManager =
+ (UserManager) getContext().getSystemService(Context.USER_SERVICE);
+
+ // Iterate through all of the user restrictions and set their values
+ for (int i = 0; i < count; i++) {
+ UserRestrictionListItem item = (UserRestrictionListItem) adapter.getItem(i);
+ userManager.setUserRestriction(item.getKey(), item.getIsChecked());
+ }
+
+ Toast.makeText(
+ getContext(), "User restrictions have been set!", Toast.LENGTH_SHORT)
+ .show();
+ });
+ }
+
+ private List<UserRestrictionListItem> createUserRestrictionItems() {
+ UserManager userManager = (UserManager) getContext().getSystemService(Context.USER_SERVICE);
+ ArrayList<UserRestrictionListItem> list = new ArrayList<>();
+ for (String key : CONFIGURABLE_USER_RESTRICTIONS) {
+ list.add(new UserRestrictionListItem(key, userManager.hasUserRestriction(key)));
+ }
+ return list;
+ }
+}
diff --git a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/vhal/VehicleHalFragment.java b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/vhal/VehicleHalFragment.java
index df5f0fc..c5998c9 100644
--- a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/vhal/VehicleHalFragment.java
+++ b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/vhal/VehicleHalFragment.java
@@ -17,10 +17,11 @@
import android.annotation.Nullable;
import android.app.AlertDialog;
-import android.content.DialogInterface;
-import android.content.DialogInterface.OnClickListener;
+import android.content.Context;
import android.hardware.automotive.vehicle.V2_0.IVehicle;
+import android.hardware.automotive.vehicle.V2_0.StatusCode;
import android.hardware.automotive.vehicle.V2_0.VehiclePropConfig;
+import android.hardware.automotive.vehicle.V2_0.VehiclePropValue;
import android.hardware.automotive.vehicle.V2_0.VehicleProperty;
import android.os.Bundle;
import android.os.RemoteException;
@@ -28,11 +29,12 @@
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
+import android.widget.Button;
+import android.widget.LinearLayout;
import android.widget.ListView;
+import android.widget.TextView;
import androidx.fragment.app.Fragment;
import com.google.android.car.kitchensink.KitchenSinkActivity;
@@ -43,28 +45,12 @@
import java.util.stream.Collectors;
public class VehicleHalFragment extends Fragment {
+
private static final String TAG = "CAR.VEHICLEHAL.KS";
private KitchenSinkActivity mActivity;
private ListView mListView;
- private final OnClickListener mNopOnClickListener = new OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) { }
- };
-
- private final OnItemClickListener mOnClickListener = new OnItemClickListener() {
- @Override
- public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
- HalPropertyInfo entry = (HalPropertyInfo)parent.getItemAtPosition(position);
- AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
- builder.setTitle("Info for " + entry.name)
- .setPositiveButton(android.R.string.yes, mNopOnClickListener)
- .setMessage(entry.config.toString())
- .show();
- }
- };
-
@Nullable
@Override
public View onCreateView(LayoutInflater inflater,
@@ -73,8 +59,6 @@
View view = inflater.inflate(R.layout.vhal, container, false);
mActivity = (KitchenSinkActivity) getHost();
mListView = view.findViewById(R.id.hal_prop_list);
- mListView.setOnItemClickListener(mOnClickListener);
-
return view;
}
@@ -103,12 +87,11 @@
.sorted()
.collect(Collectors.toList());
- mListView.setAdapter(new ArrayAdapter<HalPropertyInfo>(mActivity,
- android.R.layout.simple_list_item_1,
- supportedProperties));
+ mListView.setAdapter(new ListAdapter(mActivity, vehicle, supportedProperties));
}
private static class HalPropertyInfo implements Comparable<HalPropertyInfo> {
+
public final int id;
public final String name;
public final VehiclePropConfig config;
@@ -126,10 +109,7 @@
@Override
public boolean equals(Object other) {
- if (other instanceof HalPropertyInfo) {
- return ((HalPropertyInfo)other).id == id;
- }
- return false;
+ return other instanceof HalPropertyInfo && ((HalPropertyInfo) other).id == id;
}
@Override
@@ -141,5 +121,79 @@
public int compareTo(HalPropertyInfo halPropertyInfo) {
return name.compareTo(halPropertyInfo.name);
}
+
+ public String getValue(IVehicle vehicle) {
+ String result[] = new String[] {"<unknown>"};
+
+ try {
+ VehiclePropValue request = new VehiclePropValue();
+ // TODO: add zones support
+ request.prop = id;
+
+ // NB: this call is synchronous
+ vehicle.get(request, (status, propValue) -> {
+ if (status == StatusCode.OK) {
+ result[0] = propValue.value.toString();
+ }
+ });
+ } catch (android.os.RemoteException e) {
+ Log.e(TAG, "unable to read property " + name, e);
+ }
+
+ return result[0];
+ }
+ }
+
+ private static final class ListAdapter extends ArrayAdapter<HalPropertyInfo> {
+ private static final int RESOURCE_ID = R.layout.vhal_listitem;
+
+ // cannot use superclass' LayoutInflater as it is private
+ private final LayoutInflater mLayoutInflater;
+ private final IVehicle mVehicle;
+
+ ListAdapter(Context context, IVehicle vehicle, List<HalPropertyInfo> properties) {
+ super(context, RESOURCE_ID, properties);
+ mVehicle = vehicle;
+ mLayoutInflater = LayoutInflater.from(context);
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ final HalPropertyInfo item = getItem(position);
+
+ final LinearLayout viewLayout;
+ if (convertView != null && convertView instanceof LinearLayout) {
+ viewLayout = (LinearLayout)convertView;
+ } else {
+ // this is the value used by the superclass's view inflater
+ final boolean attachToRoot = false;
+
+ viewLayout =
+ (LinearLayout)mLayoutInflater.inflate(RESOURCE_ID, parent, attachToRoot);
+ }
+
+ TextView textString = viewLayout.findViewById(R.id.textString);
+ Button infoButton = viewLayout.findViewById(R.id.infoButton);
+ Button valueButton = viewLayout.findViewById(R.id.valueButton);
+
+ infoButton.setOnClickListener(btn -> {
+ AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
+ builder.setTitle("Configuration for " + item.name)
+ .setPositiveButton(android.R.string.yes, (x, y) -> { })
+ .setMessage(item.config.toString())
+ .show();
+ });
+
+ valueButton.setOnClickListener(btn -> {
+ AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
+ builder.setTitle("Value for " + item.name)
+ .setPositiveButton(android.R.string.yes, (x, y) -> { })
+ .setMessage(item.getValue(mVehicle))
+ .show();
+ });
+
+ textString.setText(item.toString());
+ return viewLayout;
+ }
}
}
diff --git a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/weblinks/WebLinksTestFragment.java b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/weblinks/WebLinksTestFragment.java
new file mode 100644
index 0000000..2d2f864
--- /dev/null
+++ b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/weblinks/WebLinksTestFragment.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.android.car.kitchensink.weblinks;
+
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.LinearLayout;
+
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
+import com.google.android.car.kitchensink.R;
+
+/**
+ * This fragment just has a few links to web pages.
+ */
+public class WebLinksTestFragment extends Fragment {
+ @Override
+ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
+ @Nullable Bundle savedInstanceState) {
+ View root = inflater.inflate(R.layout.weblinks_fragment, container, false);
+
+ LinearLayout buttons = root.findViewById(R.id.buttons);
+ for (int i = 0; i < buttons.getChildCount(); i++) {
+ buttons.getChildAt(i).setOnClickListener(this::onClick);
+ }
+
+ return root;
+ }
+
+ private void onClick(View view) {
+ String url = view.getTag().toString();
+
+ if (!url.startsWith("http")) {
+ url = "http://" + url;
+ }
+ startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
+ }
+}
diff --git a/tests/GarageModeTestApp/Android.mk b/tests/GarageModeTestApp/Android.mk
new file mode 100644
index 0000000..a3e60f8
--- /dev/null
+++ b/tests/GarageModeTestApp/Android.mk
@@ -0,0 +1,54 @@
+# Copyright (C) 2018 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
+
+LOCAL_PACKAGE_NAME := GarageModeTestApp
+LOCAL_PRIVATE_PLATFORM_APIS := true
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_JAVA_VERSION := 1.8
+
+LOCAL_PROGUARD_ENABLED := disabled
+
+LOCAL_DEX_PREOPT := false
+
+LOCAL_USE_AAPT2 := true
+
+LOCAL_PRIVILEGED_MODULE := true
+
+LOCAL_CERTIFICATE := platform
+
+LOCAL_STATIC_JAVA_LIBRARIES += vehicle-hal-support-lib
+
+LOCAL_STATIC_ANDROID_LIBRARIES += \
+ androidx.car_car \
+ androidx.legacy_legacy-support-v4 \
+ androidx.appcompat_appcompat
+
+LOCAL_JAVA_LIBRARIES += android.car
+
+include $(BUILD_PACKAGE)
+
+# Use the following include to make our test apk.
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tests/GarageModeTestApp/AndroidManifest.xml b/tests/GarageModeTestApp/AndroidManifest.xml
new file mode 100644
index 0000000..b33520f
--- /dev/null
+++ b/tests/GarageModeTestApp/AndroidManifest.xml
@@ -0,0 +1,40 @@
+<?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.google.android.car.garagemode.testapp"
+ android:sharedUserId="android.uid.system">
+
+ <uses-sdk
+ android:minSdkVersion="24"
+ android:targetSdkVersion='25'/>
+ <uses-permission android:name="android.car.permission.CAR_DRIVING_STATE" />
+ <uses-permission android:name="android.permission.BIND_JOB_SERVICE" />
+
+ <application android:label="GarageModeTestApp">
+ <activity android:name=".MainActivity"
+ android:theme="@style/GarageModeTheme"
+ android:label="@string/app_name">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN"/>
+ <category android:name="android.intent.category.LAUNCHER"/>
+ </intent-filter>
+ <meta-data android:name="distractionOptimized" android:value="true"/>
+ </activity>
+ <service android:name=".DishService"
+ android:permission="android.permission.BIND_JOB_SERVICE">
+ </service>
+ </application>
+</manifest>
diff --git a/tests/GarageModeTestApp/res/drawable/border.xml b/tests/GarageModeTestApp/res/drawable/border.xml
new file mode 100644
index 0000000..de84a3c
--- /dev/null
+++ b/tests/GarageModeTestApp/res/drawable/border.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="rectangle">
+ <corners
+ android:bottomRightRadius="5dp"
+ android:bottomLeftRadius="5dp"
+ android:topLeftRadius="5dp"
+ android:topRightRadius="5dp"/>
+ <stroke
+ android:width="2dip"
+ android:color="#212121" />
+</shape>
\ No newline at end of file
diff --git a/tests/GarageModeTestApp/res/layout/job_info_row.xml b/tests/GarageModeTestApp/res/layout/job_info_row.xml
new file mode 100644
index 0000000..92c633b
--- /dev/null
+++ b/tests/GarageModeTestApp/res/layout/job_info_row.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+ <TextView
+ android:id="@+id/jobId"
+ android:layout_height="match_parent"
+ android:layout_width="wrap_content"
+ android:layout_margin="5dp"
+ android:gravity="center_vertical"/>
+ <LinearLayout
+ android:layout_height="match_parent"
+ android:layout_width="wrap_content"
+ android:orientation="vertical">
+ <TextView
+ style="@style/ListEntryField"
+ android:id="@+id/requiredNetwork"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"/>
+ <TextView
+ style="@style/ListEntryField"
+ android:id="@+id/isPeriodic"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"/>
+ </LinearLayout>
+ <LinearLayout
+ android:layout_height="match_parent"
+ android:layout_width="wrap_content"
+ android:orientation="vertical">
+ <TextView
+ style="@style/ListEntryField"
+ android:id="@+id/isPersisted"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"/>
+ <TextView
+ style="@style/ListEntryField"
+ android:id="@+id/isPrefetch"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"/>
+ </LinearLayout>
+ <LinearLayout
+ android:layout_height="match_parent"
+ android:layout_width="wrap_content"
+ android:orientation="vertical">
+ <TextView
+ style="@style/ListEntryField"
+ android:id="@+id/isRequireBatteryNotLow"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"/>
+ <TextView
+ style="@style/ListEntryField"
+ android:id="@+id/isRequireCharging"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"/>
+ </LinearLayout>
+ <LinearLayout
+ android:layout_height="match_parent"
+ android:layout_width="wrap_content"
+ android:orientation="vertical">
+ <TextView
+ style="@style/ListEntryField"
+ android:id="@+id/isRequireDeviceIdle"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"/>
+ <TextView
+ style="@style/ListEntryField"
+ android:id="@+id/isRequireStorageNotLow"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"/>
+ </LinearLayout>
+</LinearLayout>
diff --git a/tests/GarageModeTestApp/res/layout/main_activity.xml b/tests/GarageModeTestApp/res/layout/main_activity.xml
new file mode 100644
index 0000000..b76e5b7
--- /dev/null
+++ b/tests/GarageModeTestApp/res/layout/main_activity.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+<androidx.drawerlayout.widget.DrawerLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:id="@+id/drawer_layout"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <LinearLayout
+ android:background="@android:color/black"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+ <!-- The min height of the Toolbar needs to be set to ensure that the icons in it
+ are vertically centered. -->
+ <androidx.appcompat.widget.Toolbar
+ android:id="@+id/car_toolbar"
+ android:background="@android:color/black"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/car_app_bar_height"
+ android:layout_gravity="center_vertical"
+ android:minHeight="@dimen/car_app_bar_height"
+ style="?attr/toolbarStyle" />
+
+ <FrameLayout
+ android:id="@+id/activity_content"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+ </LinearLayout>
+
+ <!-- Using a CosntraintLayout to specify a maxWidth. -->
+ <androidx.constraintlayout.widget.ConstraintLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_gravity="start"
+ android:layout_marginEnd="@dimen/car_margin"
+ android:maxWidth="@dimen/car_drawer_max_width">
+
+ <include
+ layout="@layout/car_drawer"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintStart_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent" />
+ </androidx.constraintlayout.widget.ConstraintLayout>
+</androidx.drawerlayout.widget.DrawerLayout>
diff --git a/tests/GarageModeTestApp/res/layout/offcar_testing.xml b/tests/GarageModeTestApp/res/layout/offcar_testing.xml
new file mode 100644
index 0000000..c14aa07
--- /dev/null
+++ b/tests/GarageModeTestApp/res/layout/offcar_testing.xml
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:weightSum="2">
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:orientation="vertical">
+ <LinearLayout
+ style="@style/SectionContainer"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+ <TextView
+ style="@style/SectionHeader"
+ android:text="@string/section_header_garage_mode_config"/>
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:weightSum="2">
+ <Button
+ style="@style/Button"
+ android:id="@+id/enterGarageModeBtn"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:text="@string/button_enter_garage_mode"/>
+ <Button
+ style="@style/Button"
+ android:id="@+id/exitGarageModeBtn"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:text="@string/button_exit_garage_mode"/>
+ </LinearLayout>
+ </LinearLayout>
+ <LinearLayout
+ style="@style/SectionContainer"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+ <TextView
+ style="@style/SectionHeader"
+ android:text="@string/section_header_watchdog"/>
+ <ScrollView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:fillViewport="true">
+ <TextView
+ android:id="@+id/garageModeWatchdog"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textSize="18sp"
+ android:text="@string/no_results"/>
+ </ScrollView>
+ </LinearLayout>
+ </LinearLayout>
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:orientation="vertical">
+ <LinearLayout
+ style="@style/SectionContainer"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:weightSum="5">
+ <TextView
+ style="@style/SectionHeader"
+ android:layout_weight="1"
+ android:text="@string/section_header_job_configuration"/>
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_weight="1">
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_weight="1">
+ <TextView
+ style="@style/SpinnerLabel"
+ android:text="@string/spinner_label_network_type"/>
+ <LinearLayout
+ style="@style/SectionContainer"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent">
+ <Spinner
+ style="@style/Spinner"
+ android:id="@+id/networkType"/>
+ </LinearLayout>
+ </LinearLayout>
+ <CheckBox
+ style="@style/Checkbox"
+ android:id="@+id/requirePersistedCheckbox"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:text="@string/checkbox_require_persisted"/>
+ </LinearLayout>
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:weightSum="2">
+ <CheckBox
+ style="@style/Checkbox"
+ android:id="@+id/requireIdlenessCheckbox"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:text="@string/checkbox_require_idleness"/>
+ <CheckBox
+ style="@style/Checkbox"
+ android:id="@+id/requireChargingCheckbox"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:text="@string/checkbox_require_charging"/>
+ </LinearLayout>
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:orientation="horizontal">
+ <TextView
+ style="@style/SpinnerLabel"
+ android:text="@string/spinner_label_job_duration"/>
+ <LinearLayout
+ style="@style/SectionContainer"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent">
+ <Spinner
+ style="@style/Spinner"
+ android:id="@+id/jobDuration"/>
+ </LinearLayout>
+ </LinearLayout>
+ <Button
+ style="@style/Button"
+ android:id="@+id/addJobBtn"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:text="@string/button_schedule_job"
+ android:layout_weight="1"/>
+ </LinearLayout>
+ <LinearLayout
+ style="@style/SectionContainer"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+ <TextView
+ style="@style/SectionHeader"
+ android:text="@string/section_header_jobs_list"/>
+ <ListView
+ android:id="@+id/jobsListView"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignParentLeft="true"
+ android:layout_alignParentTop="true"
+ android:focusable="false"/>
+ </LinearLayout>
+ </LinearLayout>
+</LinearLayout>
\ No newline at end of file
diff --git a/tests/GarageModeTestApp/res/values/colors.xml b/tests/GarageModeTestApp/res/values/colors.xml
new file mode 100644
index 0000000..a962308
--- /dev/null
+++ b/tests/GarageModeTestApp/res/values/colors.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources>
+ <color name="colorPrimary">#3F51B5</color>
+ <color name="colorPrimaryDark">#303F9F</color>
+ <color name="colorAccent">#FF4081</color>
+</resources>
diff --git a/tests/GarageModeTestApp/res/values/strings.xml b/tests/GarageModeTestApp/res/values/strings.xml
new file mode 100644
index 0000000..59945125
--- /dev/null
+++ b/tests/GarageModeTestApp/res/values/strings.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" translatable="false">GarageMode Test App</string>
+
+ <string name="button_schedule_job" translatable="false">Schedule Job</string>
+ <string name="button_job_info" translatable="false">Job Info</string>
+ <string name="button_enter_garage_mode" translatable="false">Enter GarageMode</string>
+ <string name="button_exit_garage_mode" translatable="false">Exit GarageMode</string>
+
+ <string name="checkbox_require_persisted" translatable="false">Persisted?</string>
+ <string name="checkbox_require_idleness" translatable="false">Require idleness?</string>
+ <string name="checkbox_require_charging" translatable="false">Require charging?</string>
+
+ <string name="no_results" translatable="false">No Results</string>
+
+ <string name="section_header_garage_mode_config" translatable="false">GarageMode Settings</string>
+ <string name="section_header_job_configuration" translatable="false">Job Configuration</string>
+ <string name="section_header_jobs_list" translatable="false">Scheduled Jobs</string>
+ <string name="section_header_watchdog" translatable="false">Watchdog</string>
+
+ <string name="spinner_label_garage_mode_duration" translatable="false">GarageMode max duration:</string>
+ <string name="spinner_label_job_duration" translatable="false">Job duration:</string>
+ <string name="spinner_label_network_type" translatable="false">Network type:</string>
+
+ <string-array name="network_types_list" translatable="false">
+ <item>ANY</item>
+ <item>NONE</item>
+ <item>UNMETERED</item>
+ </string-array>
+
+ <string-array name="duration_list" translatable="false">
+ <item>1 second</item>
+ <item>5 seconds</item>
+ <item>10 seconds</item>
+ <item>30 seconds</item>
+ <item>1 minute</item>
+ <item>5 minutes</item>
+ <item>1 hour</item>
+ </string-array>
+
+ <string name="car_drawer_open" translatable="false">Open drawer</string>
+ <string name="car_drawer_close" translatable="false">Close drawer</string>
+</resources>
diff --git a/tests/GarageModeTestApp/res/values/styles.xml b/tests/GarageModeTestApp/res/values/styles.xml
new file mode 100644
index 0000000..642e7ea
--- /dev/null
+++ b/tests/GarageModeTestApp/res/values/styles.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources>
+ <style name="GarageModeTheme" parent="Theme.Car.Dark.NoActionBar.Drawer">
+ <item name="android:textSize">24sp</item>
+ </style>
+ <style name="SectionContainer">
+ <!-- Customize your theme here. -->
+ <item name="android:background">@drawable/border</item>
+ <item name="android:padding">3dp</item>
+ <item name="android:layout_margin">5dp</item>
+ </style>
+ <style name="Button">
+ <item name="android:layout_margin">5dp</item>
+ </style>
+ <style name="Checkbox">
+ <item name="android:background">@drawable/border</item>
+ </style>
+ <style name="SpinnerLabel">
+ <item name="android:layout_width">wrap_content</item>
+ <item name="android:textStyle">bold</item>
+ <item name="android:gravity">center_vertical|end</item>
+ <item name="android:layout_height">match_parent</item>
+ </style>
+ <style name="Spinner">
+ <item name="android:layout_width">wrap_content</item>
+ <item name="android:layout_height">match_parent</item>
+ </style>
+ <style name="SectionHeader">
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:textStyle">bold</item>
+ <item name="android:textSize">26sp</item>
+ <item name="android:layout_marginBottom">5dp</item>
+ <item name="android:gravity">center</item>
+ </style>
+ <style name="ListEntryField">
+ <item name="android:background">@drawable/border</item>
+ <item name="android:textSize">18sp</item>
+ <item name="android:scrollHorizontally">false</item>
+ <item name="android:layout_margin">5dp</item>
+ <item name="android:padding">3dp</item>
+ </style>
+</resources>
diff --git a/tests/GarageModeTestApp/src/com/google/android/car/garagemode/testapp/CarIdlenessTrackerWrapper.java b/tests/GarageModeTestApp/src/com/google/android/car/garagemode/testapp/CarIdlenessTrackerWrapper.java
new file mode 100644
index 0000000..82a97e0
--- /dev/null
+++ b/tests/GarageModeTestApp/src/com/google/android/car/garagemode/testapp/CarIdlenessTrackerWrapper.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.google.android.car.garagemode.testapp;
+
+import android.content.Context;
+import android.content.Intent;
+
+/**
+ * Class that works with com.android.server.job.controller.idle.CarDeviceIdlenessTracker
+ */
+public class CarIdlenessTrackerWrapper {
+ public static final Logger LOG = new Logger("CarIdlenessTrackerWrapper");
+
+ public static final String ACTION_GARAGE_MODE_ON =
+ "com.android.server.jobscheduler.GARAGE_MODE_ON";
+ public static final String ACTION_GARAGE_MODE_OFF =
+ "com.android.server.jobscheduler.GARAGE_MODE_OFF";
+
+ public static final String ACTION_FORCE_IDLE = "com.android.server.jobscheduler.FORCE_IDLE";
+ public static final String ACTION_UNFORCE_IDLE = "com.android.server.jobscheduler.UNFORCE_IDLE";
+
+ public static void sendBroadcastToEnterGarageMode(Context context) {
+ Intent i = new Intent();
+ i.setAction(ACTION_GARAGE_MODE_ON);
+ i.setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_NO_ABORT);
+ context.sendBroadcast(i);
+ }
+
+ public static void sendBroadcastToExitGarageMode(Context context) {
+ Intent i = new Intent();
+ i.setAction(ACTION_GARAGE_MODE_OFF);
+ i.setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_NO_ABORT);
+ context.sendBroadcast(i);
+ }
+}
diff --git a/tests/GarageModeTestApp/src/com/google/android/car/garagemode/testapp/DishService.java b/tests/GarageModeTestApp/src/com/google/android/car/garagemode/testapp/DishService.java
new file mode 100644
index 0000000..5a87771
--- /dev/null
+++ b/tests/GarageModeTestApp/src/com/google/android/car/garagemode/testapp/DishService.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.google.android.car.garagemode.testapp;
+
+import android.app.job.JobParameters;
+import android.app.job.JobService;
+import android.os.AsyncTask;
+import android.os.Handler;
+import android.os.Message;
+import android.util.SparseArray;
+
+import java.lang.ref.WeakReference;
+
+public class DishService extends JobService {
+ private static final Logger LOG = new Logger("JobScheduler_DishService");
+ private static final int DELAY_MS = 1000; // wash a plate every second!
+
+ private static final int MSG_FINISHED = 0;
+ private static final int MSG_RUN_JOB = 1;
+ private static final int MSG_CANCEL_JOB = 2;
+
+ public static final String EXTRA_DISH_COUNT = "dish_count";
+
+ private final Handler mHandler = new Handler() {
+ private SparseArray<JobParameters> mTaskMap = new SparseArray<>();
+ @Override
+ public void handleMessage(Message msg) {
+ JobParameters job = (JobParameters) msg.obj;
+ switch (msg.what) {
+ case MSG_FINISHED:
+ LOG.d("Job done! " + job.getJobId());
+ mTaskMap.remove(job.getJobId());
+ jobFinished(job, false);
+ break;
+ case MSG_RUN_JOB:
+ DishWasherTask task = new DishWasherTask(this, job, msg.arg1);
+ task.execute();
+ mTaskMap.put(job.getJobId(), job);
+ break;
+ case MSG_CANCEL_JOB:
+ JobParameters job1 = mTaskMap.get(job.getJobId());
+ if (job1 != null) {
+ removeMessages(MSG_RUN_JOB, job1);
+ LOG.d("cancelled job " + job1);
+ mTaskMap.remove(job.getJobId());
+ }
+ break;
+ default:
+ LOG.w("Unknown message " + msg.what);
+ }
+ }
+ };
+
+ @Override
+ public boolean onStopJob(JobParameters jobParameters) {
+ LOG.d("onStopJob " + jobParameters);
+ Message msg = mHandler.obtainMessage(MSG_CANCEL_JOB, 0, 0, jobParameters);
+ mHandler.sendMessage(msg);
+ return false;
+ }
+
+ @Override
+ public boolean onStartJob(final JobParameters jobParameters) {
+ LOG.d("onStartJob " + jobParameters);
+ Message msg = mHandler.obtainMessage(MSG_RUN_JOB, 0, 0, jobParameters);
+ mHandler.sendMessage(msg);
+ return true;
+ }
+
+ private static final class DishWasherTask extends AsyncTask<Void, Void, Boolean> {
+ private final WeakReference<Handler> mHandler;
+ private final JobParameters mJobParameter;
+ private final int mMyDishNum;
+
+
+ DishWasherTask(Handler handler, JobParameters jobParameters, int dishNum) {
+ mHandler = new WeakReference<Handler>(handler);
+ mJobParameter = jobParameters;
+ mMyDishNum = dishNum;
+ }
+
+ @Override
+ protected Boolean doInBackground(Void... infos) {
+ int dishTotal = mJobParameter.getExtras().getInt(EXTRA_DISH_COUNT);
+
+ LOG.d("jobId: " + mJobParameter.getJobId() + " totalDish: " + dishTotal
+ + " washing: #" + mMyDishNum);
+ wash();
+ if (mMyDishNum >= dishTotal - 1) {
+ // all done!
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ protected void onPostExecute(Boolean result) {
+ final Handler handler = mHandler.get();
+ if (handler == null) {
+ return;
+ }
+ if (result) {
+ Message msg = handler.obtainMessage(MSG_RUN_JOB, mMyDishNum + 1, 0, mJobParameter);
+ handler.sendMessageDelayed(msg, DELAY_MS);
+ } else {
+ Message msg = handler.obtainMessage(MSG_FINISHED, 0, 0, mJobParameter);
+ handler.sendMessage(msg);
+ }
+ }
+
+ private void wash() {
+ // TODO: add heavy wash tasks here...
+ }
+ }
+}
diff --git a/tests/GarageModeTestApp/src/com/google/android/car/garagemode/testapp/IncarTestingFragment.java b/tests/GarageModeTestApp/src/com/google/android/car/garagemode/testapp/IncarTestingFragment.java
new file mode 100644
index 0000000..22b460e
--- /dev/null
+++ b/tests/GarageModeTestApp/src/com/google/android/car/garagemode/testapp/IncarTestingFragment.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.google.android.car.garagemode.testapp;
+
+import androidx.fragment.app.Fragment;
+
+public class IncarTestingFragment extends Fragment {
+
+}
diff --git a/tests/GarageModeTestApp/src/com/google/android/car/garagemode/testapp/JobInfoRowArrayAdapter.java b/tests/GarageModeTestApp/src/com/google/android/car/garagemode/testapp/JobInfoRowArrayAdapter.java
new file mode 100644
index 0000000..0e26fe7
--- /dev/null
+++ b/tests/GarageModeTestApp/src/com/google/android/car/garagemode/testapp/JobInfoRowArrayAdapter.java
@@ -0,0 +1,152 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.google.android.car.garagemode.testapp;
+
+import static android.graphics.Typeface.BOLD;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING;
+import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
+
+import android.app.job.JobInfo;
+import android.content.Context;
+import android.graphics.Color;
+import android.net.NetworkRequest;
+import android.text.Spannable;
+import android.text.SpannableStringBuilder;
+import android.text.style.ForegroundColorSpan;
+import android.text.style.StyleSpan;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
+import android.widget.TextView;
+
+import java.util.List;
+
+public class JobInfoRowArrayAdapter extends ArrayAdapter<JobInfo> {
+ public static final Logger LOG = new Logger("JobInfoRowArrayAdapter");
+ private class ViewHolder {
+ TextView mJobIDView;
+
+ TextView mRequiredNetworkView;
+ TextView mIsPeriodicView;
+ TextView mIsPersistedView;
+ TextView mIsPrefetchView;
+
+ TextView mIsRequireBatteryNotLowView;
+ TextView mIsRequireChargingView;
+ TextView mIsRequireDeviceIdleView;
+ TextView mIsRequireStorageNotLowView;
+
+ JobInfo mInfo;
+ }
+ private LayoutInflater mInflater;
+
+ public JobInfoRowArrayAdapter(Context context, int resource, List<JobInfo> objects) {
+ super(context, resource, objects);
+ mInflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ View row = convertView;
+ final JobInfo info = getItem(position);
+
+ ViewHolder holder;
+
+ if (row == null) {
+ row = mInflater.inflate(R.layout.job_info_row, parent, false);
+
+ holder = new ViewHolder();
+ holder.mJobIDView = row.findViewById(R.id.jobId);
+
+ holder.mRequiredNetworkView = row.findViewById(R.id.requiredNetwork);
+ holder.mIsPeriodicView = row.findViewById(R.id.isPeriodic);
+ holder.mIsPersistedView = row.findViewById(R.id.isPersisted);
+ holder.mIsPrefetchView = row.findViewById(R.id.isPrefetch);
+
+ holder.mIsRequireBatteryNotLowView = row.findViewById(R.id.isRequireBatteryNotLow);
+ holder.mIsRequireChargingView = row.findViewById(R.id.isRequireCharging);
+ holder.mIsRequireDeviceIdleView = row.findViewById(R.id.isRequireDeviceIdle);
+ holder.mIsRequireStorageNotLowView = row.findViewById(R.id.isRequireStorageNotLow);
+
+ holder.mInfo = info;
+
+ row.setTag(holder);
+ } else {
+ holder = (ViewHolder) row.getTag();
+ holder.mInfo = info;
+ }
+
+ holder.mJobIDView.setText("ID: " + info.getId());
+
+ setNetworkColoredText(holder.mRequiredNetworkView, "Network", info.getRequiredNetwork());
+
+ setColoredText(holder.mIsPeriodicView, "Periodic", info.isPeriodic());
+ setColoredText(holder.mIsPersistedView, "Persisted", info.isPersisted());
+ setColoredText(holder.mIsPrefetchView, "Prefetch", info.isPrefetch());
+
+ setColoredText(
+ holder.mIsRequireBatteryNotLowView,
+ "BatteryNotLow",
+ info.isRequireBatteryNotLow());
+ setColoredText(holder.mIsRequireChargingView, "Charging", info.isRequireCharging());
+ setColoredText(holder.mIsRequireDeviceIdleView, "DeviceIdle", info.isRequireDeviceIdle());
+ setColoredText(
+ holder.mIsRequireStorageNotLowView,
+ "StorageNotLow",
+ info.isRequireStorageNotLow());
+
+ return row;
+ }
+
+ private void setColoredText(TextView view, String label, boolean condition) {
+ SpannableStringBuilder sb;
+ String value = (condition ? "Yes" : "No");
+ int color = (condition ? Color.GREEN : Color.RED);
+ sb = new SpannableStringBuilder(label + ": " + value);
+ applyColorAndBoldness(
+ sb, color, label.length() + 2, label.length() + 2 + value.length());
+ view.setText(sb);
+ }
+
+ private void setNetworkColoredText(TextView view, String label, NetworkRequest networkReq) {
+ String networkType = getNetworkType(networkReq);
+ SpannableStringBuilder sb = new SpannableStringBuilder(label + ": " + networkType);
+ applyColorAndBoldness(
+ sb, Color.GREEN, label.length() + 2, label.length() + 2 + networkType.length());
+ view.setText(sb);
+ }
+
+ private void applyColorAndBoldness(SpannableStringBuilder sb, int color, int start, int end) {
+ sb.setSpan(new ForegroundColorSpan(color), start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
+ sb.setSpan(new StyleSpan(BOLD), start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
+ }
+
+ private String getNetworkType(NetworkRequest networkRequest) {
+ if (networkRequest == null) {
+ return "None";
+ } else if (networkRequest.networkCapabilities.hasCapability(NET_CAPABILITY_NOT_METERED)) {
+ return "Unmetered";
+ } else if (networkRequest.networkCapabilities.hasCapability(NET_CAPABILITY_NOT_ROAMING)) {
+ return "Not roaming";
+ } else if (networkRequest.networkCapabilities.hasTransport(TRANSPORT_CELLULAR)) {
+ return "Cellular";
+ } else {
+ return "Any";
+ }
+ }
+}
diff --git a/tests/GarageModeTestApp/src/com/google/android/car/garagemode/testapp/JobSchedulerWrapper.java b/tests/GarageModeTestApp/src/com/google/android/car/garagemode/testapp/JobSchedulerWrapper.java
new file mode 100644
index 0000000..a2d1edd
--- /dev/null
+++ b/tests/GarageModeTestApp/src/com/google/android/car/garagemode/testapp/JobSchedulerWrapper.java
@@ -0,0 +1,242 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.google.android.car.garagemode.testapp;
+
+import android.app.job.JobInfo;
+import android.app.job.JobScheduler;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.os.Handler;
+import android.os.PersistableBundle;
+import android.widget.ListView;
+import android.widget.Toast;
+
+import java.util.LinkedList;
+import java.util.List;
+
+class JobSchedulerWrapper {
+ private static final Logger LOG = new Logger("JobSchedulerWrapper");
+ private static final boolean DEBUG = false;
+
+ private static final String ANDROID_COMPONENT_PREFIX = "android/com.android.";
+ private static final String ANDROID_SETTINGS_PREFIX =
+ "com.android.settings/com.android.settings.";
+
+ private static final String PREFS_FILE_NAME = "garage_mode_job_scheduler";
+ private static final String PREFS_NEXT_JOB_ID = "next_job_id";
+
+ private JobScheduler mJobScheduler;
+ private Context mContext;
+ private ListView mListView;
+ private Handler mHandler;
+ private Watchdog mWatchdog;
+ private Runnable mRefreshWorker;
+
+ private List<JobInfo> mLastJobsList;
+ private List<JobInfo> mNewJobs;
+ private List<JobInfo> mCompletedJobs;
+ private JobInfoRowArrayAdapter mJobsListAdapter;
+
+ JobSchedulerWrapper(Context context, ListView listView) {
+ mContext = context;
+ mJobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
+ mListView = listView;
+
+ mLastJobsList = new LinkedList<>();
+ mNewJobs = new LinkedList<>();
+ mCompletedJobs = new LinkedList<>();
+ mJobsListAdapter = new JobInfoRowArrayAdapter(mContext, mListView.getId(), mLastJobsList);
+ mListView.setAdapter(mJobsListAdapter);
+
+ updateJobs();
+ if (DEBUG) {
+ printJobsOnce(mJobScheduler.getAllPendingJobs());
+ }
+ }
+
+ public void setWatchdog(Watchdog watchdog) {
+ mWatchdog = watchdog;
+ }
+
+ public synchronized void refresh() {
+ updateJobs();
+
+ reportNewJobs();
+ reportCompletedJobs();
+
+ if (mNewJobs.size() > 0 || mCompletedJobs.size() > 0) {
+ updateListView();
+ }
+ }
+
+ public void start() {
+ LOG.d("Starting JobSchedulerWrapper");
+ mHandler = new Handler();
+ mRefreshWorker = () -> {
+ refresh();
+ mHandler.postDelayed(mRefreshWorker, 1000);
+ };
+ mHandler.postDelayed(mRefreshWorker, 1000);
+ }
+
+ public void stop() {
+ LOG.d("Stopping JobSchedulerWrapper");
+ mHandler.removeCallbacks(mRefreshWorker);
+ mRefreshWorker = null;
+ mHandler = null;
+ mWatchdog = null;
+ }
+
+ public void scheduleAJob(
+ int amountOfSeconds,
+ int networkType,
+ boolean isChargingRequired,
+ boolean isIdleRequired) {
+ ComponentName jobComponentName = new ComponentName(mContext, DishService.class);
+ SharedPreferences prefs = mContext
+ .getSharedPreferences(PREFS_FILE_NAME, Context.MODE_PRIVATE);
+ int jobId = prefs.getInt(PREFS_NEXT_JOB_ID, 0);
+ PersistableBundle bundle = new PersistableBundle();
+
+ bundle.putInt(DishService.EXTRA_DISH_COUNT, amountOfSeconds);
+
+ while (checkIdForExistence(jobId)) {
+ jobId++;
+ }
+
+ JobInfo jobInfo = new JobInfo.Builder(jobId, jobComponentName)
+ .setRequiresCharging(isChargingRequired)
+ .setRequiresDeviceIdle(isIdleRequired)
+ .setExtras(bundle)
+ .setRequiredNetworkType(networkType)
+ .build();
+
+ mJobScheduler.schedule(jobInfo);
+ Toast.makeText(
+ mContext,
+ "Scheduled new job with id: " + jobInfo.getId(), Toast.LENGTH_LONG).show();
+
+ LOG.d("Scheduled a job: " + jobInfo);
+ SharedPreferences.Editor editor = prefs.edit();
+ editor.putInt(PREFS_NEXT_JOB_ID, jobId + 1);
+ editor.commit();
+
+ refresh();
+ }
+
+ private void updateListView() {
+ int index = mListView.getFirstVisiblePosition();
+ mJobsListAdapter.notifyDataSetChanged();
+ mListView.smoothScrollToPosition(index);
+ }
+
+ private boolean checkIdForExistence(int jobId) {
+ for (JobInfo job : mJobScheduler.getAllPendingJobs()) {
+ if (job.getId() == jobId) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private void printJobsOnce(List<JobInfo> list) {
+ LOG.d("=========================================================");
+ for (JobInfo job : list) {
+ LOG.d("Job(" + job.getId() + ") will run " + job.getService());
+ }
+ }
+
+ private void reportNewJobs() {
+ for (JobInfo job : mNewJobs) {
+ if (mWatchdog != null) {
+ mWatchdog.logEvent("New job with id(" + job.getId() + ") has been scheduled");
+ }
+ }
+ }
+
+ private void reportCompletedJobs() {
+ for (JobInfo job : mCompletedJobs) {
+ if (mWatchdog != null) {
+ mWatchdog.logEvent("Job with id(" + job.getId() + ") has been completed.");
+ }
+ }
+ }
+
+ private synchronized void updateJobs() {
+ List<JobInfo> currentJobs = mJobScheduler.getAllPendingJobs();
+
+ if (DEBUG) {
+ printJobsOnce(currentJobs);
+ printJobsOnce(mLastJobsList);
+ }
+
+ removeSystemJobsFromList(currentJobs);
+
+ mNewJobs = newJobsSince(mLastJobsList, currentJobs);
+ mCompletedJobs = completedJobsSince(mLastJobsList, currentJobs);
+
+ for (JobInfo job : mNewJobs) {
+ mLastJobsList.add(job);
+ }
+
+ for (JobInfo job : mCompletedJobs) {
+ mLastJobsList.remove(job);
+ }
+ }
+
+ private synchronized List<JobInfo> newJobsSince(List<JobInfo> oldList, List<JobInfo> newList) {
+ return findDiffBetween(newList, oldList);
+ }
+
+ private synchronized List<JobInfo> completedJobsSince(
+ List<JobInfo> oldList, List<JobInfo> newList) {
+ return findDiffBetween(oldList, newList);
+ }
+
+ private synchronized List<JobInfo> findDiffBetween(
+ List<JobInfo> fromList, List<JobInfo> toList) {
+ List<JobInfo> diffList = new LinkedList<>();
+ for (JobInfo fromJob : fromList) {
+ if (!toList.contains(fromJob)) {
+ diffList.add(fromJob);
+ }
+ }
+ return diffList;
+ }
+
+ private synchronized void removeSystemJobsFromList(List<JobInfo> list) {
+ List<JobInfo> jobsToRemove = new LinkedList<>();
+ for (JobInfo job : list) {
+ if (isSystemService(job)) {
+ jobsToRemove.add(job);
+ }
+ }
+ for (JobInfo job : jobsToRemove) {
+ list.remove(job);
+ }
+ }
+
+ private boolean isSystemService(JobInfo job) {
+ if (job.getService().toString().contains(ANDROID_COMPONENT_PREFIX)) {
+ return true;
+ }
+ if (job.getService().toString().contains(ANDROID_SETTINGS_PREFIX)) {
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/tests/GarageModeTestApp/src/com/google/android/car/garagemode/testapp/Logger.java b/tests/GarageModeTestApp/src/com/google/android/car/garagemode/testapp/Logger.java
new file mode 100644
index 0000000..192eec3
--- /dev/null
+++ b/tests/GarageModeTestApp/src/com/google/android/car/garagemode/testapp/Logger.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.google.android.car.garagemode.testapp;
+
+import android.util.Log;
+
+class Logger {
+ private final String mTag;
+ private final String mPrefix;
+
+ Logger(String prefix) {
+ mTag = "GarageModeTestApp";
+ mPrefix = prefix;
+ }
+
+ /** Passing message further to Log.v() */
+ public void v(String msg) {
+ Log.v(mTag, buildMessage(msg));
+ }
+
+ /** Passing message further to Log.v() */
+ public void v(String msg, Exception ex) {
+ Log.v(mTag, buildMessage(msg), ex);
+ }
+
+ /** Passing message further to Log.i() */
+ public void i(String msg) {
+ Log.i(mTag, buildMessage(msg));
+ }
+
+ /** Passing message further to Log.i() */
+ public void i(String msg, Exception ex) {
+ Log.i(mTag, buildMessage(msg), ex);
+ }
+
+ /** Passing message further to Log.d() */
+ public void d(String msg) {
+ Log.d(mTag, buildMessage(msg));
+ }
+
+ /** Passing message further to Log.d() */
+ public void d(String msg, Exception ex) {
+ Log.d(mTag, buildMessage(msg), ex);
+ }
+
+ /** Passing message further to Log.w() */
+ public void w(String msg, Exception ex) {
+ Log.w(mTag, buildMessage(msg), ex);
+ }
+
+ /** Passing message further to Log.w() */
+ public void w(String msg) {
+ Log.w(mTag, buildMessage(msg));
+ }
+
+ /** Passing message further to Log.e() */
+ public void e(String msg) {
+ Log.e(mTag, buildMessage(msg));
+ }
+
+ /** Passing message further to Log.e() */
+ public void e(String msg, Exception ex) {
+ Log.e(mTag, buildMessage(msg), ex);
+ }
+
+ /** Passing message further to Log.e() */
+ public void wtf(String msg) {
+ Log.wtf(mTag, buildMessage(msg));
+ }
+
+ /** Passing message further to Log.e() */
+ public void wtf(String msg, Exception ex) {
+ Log.wtf(mTag, buildMessage(msg), ex);
+ }
+
+ private String buildMessage(String msg) {
+ return String.format("[%s]: %s", mPrefix, msg);
+ }
+}
diff --git a/tests/GarageModeTestApp/src/com/google/android/car/garagemode/testapp/MainActivity.java b/tests/GarageModeTestApp/src/com/google/android/car/garagemode/testapp/MainActivity.java
new file mode 100644
index 0000000..2019b7e
--- /dev/null
+++ b/tests/GarageModeTestApp/src/com/google/android/car/garagemode/testapp/MainActivity.java
@@ -0,0 +1,208 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.google.android.car.garagemode.testapp;
+
+import android.content.res.Configuration;
+import android.os.Bundle;
+import android.view.MenuItem;
+
+import androidx.appcompat.app.ActionBarDrawerToggle;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.appcompat.widget.Toolbar;
+import androidx.car.drawer.CarDrawerAdapter;
+import androidx.car.drawer.CarDrawerController;
+import androidx.car.drawer.DrawerItemViewHolder;
+import androidx.drawerlayout.widget.DrawerLayout;
+import androidx.fragment.app.Fragment;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class MainActivity extends AppCompatActivity {
+ private static final Logger LOG = new Logger("MainActivity");
+
+ private CarDrawerController mDrawerController;
+ private Toolbar mToolbar;
+
+ private final List<MenuEntry> mMenuEntries = new ArrayList<MenuEntry>() {
+ {
+ add("Offcar testing", OffcarTestingFragment.class);
+ add("Incar testing", IncarTestingFragment.class);
+ add("Quit", MainActivity.this::finish);
+ }
+
+ <T extends Fragment> void add(String text, Class<T> clazz) {
+ add(new FragmentMenuEntry(text, clazz));
+ }
+
+ void add(String text, ClickHandler onClick) {
+ add(new OnClickMenuEntry(text, onClick));
+ }
+ };
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.main_activity);
+
+ DrawerLayout drawerLayout = findViewById(R.id.drawer_layout);
+ ActionBarDrawerToggle drawerToggle = new ActionBarDrawerToggle(
+ /* activity= */ this,
+ drawerLayout,
+ R.string.car_drawer_open,
+ R.string.car_drawer_close);
+
+ mToolbar = findViewById(R.id.car_toolbar);
+ setSupportActionBar(mToolbar);
+ getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+ getSupportActionBar().setHomeButtonEnabled(true);
+
+ mMenuEntries.get(0).onClick();
+
+ mDrawerController = new CarDrawerController(drawerLayout, drawerToggle);
+ mDrawerController.setRootAdapter(new DrawerAdapter());
+ }
+
+ @Override
+ protected void onPostCreate(Bundle savedInstanceState) {
+ super.onPostCreate(savedInstanceState);
+ mDrawerController.syncState();
+ }
+
+ @Override
+ protected void onStop() {
+ super.onStop();
+ mDrawerController.closeDrawer();
+ }
+
+ @Override
+ public void onConfigurationChanged(Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+ mDrawerController.onConfigurationChanged(newConfig);
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ return mDrawerController.onOptionsItemSelected(item) || super.onOptionsItemSelected(item);
+ }
+
+ private interface ClickHandler {
+ void onClick();
+ }
+
+ private abstract static class MenuEntry implements ClickHandler {
+ abstract String getText();
+ }
+
+ private final class OnClickMenuEntry extends MenuEntry {
+ private final String mText;
+ private final ClickHandler mClickHandler;
+
+ OnClickMenuEntry(String text, ClickHandler clickHandler) {
+ mText = text;
+ mClickHandler = clickHandler;
+ }
+
+ @Override
+ String getText() {
+ return mText;
+ }
+
+ @Override
+ public void onClick() {
+ mClickHandler.onClick();
+ }
+ }
+
+ private final class FragmentMenuEntry<T extends Fragment> extends MenuEntry {
+ private final class FragmentClassOrInstance<T extends Fragment> {
+ final Class<T> mClazz;
+ T mFragment = null;
+
+ FragmentClassOrInstance(Class<T> clazz) {
+ mClazz = clazz;
+ }
+
+ T getFragment() {
+ if (mFragment == null) {
+ try {
+ mFragment = mClazz.newInstance();
+ } catch (InstantiationException | IllegalAccessException e) {
+ LOG.e("unable to create fragment", e);
+ }
+ }
+ return mFragment;
+ }
+ }
+
+ private final String mText;
+ private final FragmentClassOrInstance<T> mFragment;
+
+ FragmentMenuEntry(String text, Class<T> clazz) {
+ mText = text;
+ mFragment = new FragmentClassOrInstance<>(clazz);
+ }
+
+ @Override
+ String getText() {
+ return mText;
+ }
+
+ @Override
+ public void onClick() {
+ Fragment fragment = mFragment.getFragment();
+ if (fragment != null) {
+ MainActivity.this.showFragment(fragment);
+ } else {
+ LOG.e("cannot show fragment for " + getText());
+ }
+ }
+ }
+
+ private void showFragment(Fragment fragment) {
+ getSupportFragmentManager().beginTransaction()
+ .replace(R.id.activity_content, fragment)
+ .commit();
+ }
+
+ private final class DrawerAdapter extends CarDrawerAdapter {
+ DrawerAdapter() {
+ super(MainActivity.this, true /* showDisabledOnListOnEmpty */);
+ setTitle(getString(R.string.app_name));
+ }
+
+ @Override
+ protected int getActualItemCount() {
+ return mMenuEntries.size();
+ }
+
+ @Override
+ protected void populateViewHolder(DrawerItemViewHolder holder, int position) {
+ holder.getTitleView().setText(mMenuEntries.get(position).getText());
+ holder.itemView.setOnClickListener(v -> onItemClick(holder.getAdapterPosition()));
+ }
+
+ private void onItemClick(int position) {
+ if ((position < 0) || (position >= mMenuEntries.size())) {
+ LOG.wtf("Unknown menu item: " + position);
+ return;
+ }
+
+ mMenuEntries.get(position).onClick();
+ mDrawerController.closeDrawer();
+ }
+ }
+}
diff --git a/tests/GarageModeTestApp/src/com/google/android/car/garagemode/testapp/OffcarTestingFragment.java b/tests/GarageModeTestApp/src/com/google/android/car/garagemode/testapp/OffcarTestingFragment.java
new file mode 100644
index 0000000..6d7a8ce
--- /dev/null
+++ b/tests/GarageModeTestApp/src/com/google/android/car/garagemode/testapp/OffcarTestingFragment.java
@@ -0,0 +1,219 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.google.android.car.garagemode.testapp;
+
+import android.app.job.JobInfo;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.ListView;
+import android.widget.Spinner;
+import android.widget.TextView;
+
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
+public class OffcarTestingFragment extends Fragment implements AdapterView.OnItemSelectedListener {
+ private static final Logger LOG = new Logger("OffcarTestingFragment");
+
+ private String mNetworkRequirement;
+ private int mJobDurationSelected;
+
+ private CheckBox mRequirePersisted;
+ private CheckBox mRequireIdleness;
+ private CheckBox mRequireCharging;
+
+ private Spinner mJobDurationSpinner;
+ private Spinner mNetworkTypeSpinner;
+
+ private TextView mWatchdogTextView;
+ private ListView mJobsListView;
+
+ private Button mEnterGarageModeBtn;
+ private Button mExitGarageModeBtn;
+ private Button mAddJobBtn;
+
+ private Watchdog mWatchdog;
+ private JobSchedulerWrapper mJobSchedulerWrapper;
+
+ @Nullable
+ @Override
+ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
+ @Nullable Bundle savedInstanceState) {
+ View v = inflater.inflate(R.layout.offcar_testing, container, false);
+
+ defineViewsFromFragment(v);
+
+ populateNetworkTypeSpinner();
+ populateJobDurationSpinner();
+
+ defineButtonActions();
+
+ return v;
+ }
+
+ @Override
+ public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
+ String value = (String) parent.getItemAtPosition(pos);
+ switch (parent.getId()) {
+ case R.id.networkType:
+ applyNetworkTypeRequirement(value);
+ break;
+ case R.id.jobDuration:
+ applyJobDuration(value);
+ break;
+ }
+ }
+
+ @Override
+ public void onNothingSelected(AdapterView<?> adapterView) {
+
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ LOG.d("Resuming app");
+
+ mWatchdog = new Watchdog(getContext(), mWatchdogTextView);
+ mWatchdog.start();
+ mJobSchedulerWrapper = new JobSchedulerWrapper(
+ getContext(),
+ mJobsListView);
+ mJobSchedulerWrapper.setWatchdog(mWatchdog);
+ mJobSchedulerWrapper.start();
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+ LOG.d("Pausing app");
+ mWatchdog.stop();
+ mWatchdog = null;
+ mJobSchedulerWrapper.stop();
+ mJobSchedulerWrapper = null;
+ }
+
+ private void defineViewsFromFragment(View v) {
+ mRequirePersisted = v.findViewById(R.id.requirePersistedCheckbox);
+ mRequireIdleness = v.findViewById(R.id.requireIdlenessCheckbox);
+ mRequireCharging = v.findViewById(R.id.requireChargingCheckbox);
+
+ mJobDurationSpinner = v.findViewById(R.id.jobDuration);
+ mNetworkTypeSpinner = v.findViewById(R.id.networkType);
+
+ mWatchdogTextView = v.findViewById(R.id.garageModeWatchdog);
+ mJobsListView = v.findViewById(R.id.jobsListView);
+
+ mEnterGarageModeBtn = v.findViewById(R.id.enterGarageModeBtn);
+ mExitGarageModeBtn = v.findViewById(R.id.exitGarageModeBtn);
+ mAddJobBtn = v.findViewById(R.id.addJobBtn);
+ }
+
+ private void defineButtonActions() {
+ mEnterGarageModeBtn.setOnClickListener(view -> onEnterGarageModeBtnClick());
+ mExitGarageModeBtn.setOnClickListener(view -> onExitGarageModeBtnClick());
+ mAddJobBtn.setOnClickListener(view -> onAddJobBtnClick());
+ }
+
+ private void onEnterGarageModeBtnClick() {
+ LOG.d("Entering garage mode...");
+ CarIdlenessTrackerWrapper.sendBroadcastToEnterGarageMode(getContext());
+ if (mWatchdog != null) {
+ mWatchdog.logEvent("Entering garage mode...");
+ }
+ }
+
+ private void onExitGarageModeBtnClick() {
+ LOG.d("Exiting garage mode...");
+ CarIdlenessTrackerWrapper.sendBroadcastToExitGarageMode(getContext());
+ if (mWatchdog != null) {
+ mWatchdog.logEvent("Exiting garage mode...");
+ }
+ }
+
+ private void onAddJobBtnClick() {
+ LOG.d("Adding a job...");
+ if (mJobSchedulerWrapper == null) {
+ LOG.e("JobSchedulerWrapper is not initialized yet. Try again later.");
+ return;
+ }
+ mJobSchedulerWrapper.scheduleAJob(
+ mJobDurationSelected,
+ parseNetworkRequirement(),
+ mRequireCharging.isChecked(),
+ mRequireIdleness.isChecked());
+ }
+
+ private void applyJobDuration(String value) {
+ String metric = value.split(" ")[1];
+ mJobDurationSelected = Integer.parseInt(value.split(" ")[0]);
+ if (metric.startsWith("minute")) {
+ mJobDurationSelected *= 60;
+ }
+ if (metric.startsWith("hour")) {
+ mJobDurationSelected *= 3600;
+ }
+ mWatchdog.logEvent("Job duration is now: " + mJobDurationSelected + "s");
+ }
+
+ private void applyNetworkTypeRequirement(String value) {
+ mNetworkRequirement = value;
+ mWatchdog.logEvent("Job network requirement changed to: " + value);
+ }
+
+ private int parseNetworkRequirement() {
+ if (mNetworkRequirement.equals("NONE")) {
+ return JobInfo.NETWORK_TYPE_NONE;
+ }
+ if (mNetworkRequirement.equals("UNMETERED")) {
+ return JobInfo.NETWORK_TYPE_UNMETERED;
+ }
+ if (mNetworkRequirement.equals("ANY")) {
+ return JobInfo.NETWORK_TYPE_ANY;
+ }
+ return JobInfo.NETWORK_BYTES_UNKNOWN;
+ }
+
+ private void populateJobDurationSpinner() {
+ populateSpinner(
+ mJobDurationSpinner,
+ ArrayAdapter.createFromResource(
+ getContext(),
+ R.array.duration_list,
+ android.R.layout.simple_spinner_item));
+ }
+
+ private void populateNetworkTypeSpinner() {
+ populateSpinner(
+ mNetworkTypeSpinner,
+ ArrayAdapter.createFromResource(
+ getContext(),
+ R.array.network_types_list,
+ android.R.layout.simple_spinner_item));
+ }
+
+ private void populateSpinner(Spinner spinner, ArrayAdapter adapter) {
+ adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
+ spinner.setAdapter(adapter);
+ spinner.setOnItemSelectedListener(this);
+ }
+}
diff --git a/tests/GarageModeTestApp/src/com/google/android/car/garagemode/testapp/Watchdog.java b/tests/GarageModeTestApp/src/com/google/android/car/garagemode/testapp/Watchdog.java
new file mode 100644
index 0000000..18ce8fa
--- /dev/null
+++ b/tests/GarageModeTestApp/src/com/google/android/car/garagemode/testapp/Watchdog.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.google.android.car.garagemode.testapp;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.os.Handler;
+import android.widget.TextView;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.LinkedList;
+
+public class Watchdog {
+ private static final Logger LOG = new Logger("Watchdog");
+
+ private static final String PREFS_FILE_NAME = "garage_mode_watchdog";
+ private static final String PREFS_EVENTS_LIST = "events_list";
+ private static final String PREFS_EVENTS_LIST_SEPARATOR = "\n";
+ // TODO(serikb): Convert TextView to ListView with per row coloring
+ private TextView mView;
+ private LinkedList<String> mEvents;
+ private Handler mWatchdogHandler;
+ private Runnable mRefreshLoop;
+ private SharedPreferences mSharedPrefs;
+
+ public Watchdog(Context context, TextView view) {
+ this(
+ context,
+ view,
+ context.getSharedPreferences(PREFS_FILE_NAME, Context.MODE_PRIVATE));
+ }
+
+ public Watchdog(Context context, TextView view, SharedPreferences prefs) {
+ mView = view;
+ mSharedPrefs = prefs;
+ mEvents = getEventsFromSharedPrefs(prefs);
+ }
+
+ public void logEvent(String s) {
+ Date date = new Date();
+ SimpleDateFormat dateFormat = new SimpleDateFormat("[yyyy-MM-dd hh:mm:ss]");
+ mEvents.addFirst(dateFormat.format(date) + " " + s);
+ if (mEvents.size() > 10000) {
+ mEvents.pollLast();
+ }
+ saveEventsToSharedPrefs(mSharedPrefs, mEvents);
+ }
+
+ public synchronized String getEventsAsText() {
+ return String.join("\n", mEvents);
+ }
+
+ public synchronized void refresh() {
+ mView.setText(getEventsAsText());
+ }
+
+ public void start() {
+ LOG.d("Starting Watchdog");
+ mWatchdogHandler = new Handler();
+ mRefreshLoop = () -> {
+ refresh();
+ mWatchdogHandler.postDelayed(mRefreshLoop, 500);
+ };
+ mWatchdogHandler.postDelayed(mRefreshLoop, 500);
+ }
+
+ public void stop() {
+ LOG.d("Stopping Watchdog");
+ mWatchdogHandler.removeCallbacks(mRefreshLoop);
+ mWatchdogHandler = null;
+ mRefreshLoop = null;
+ }
+
+ private LinkedList<String> getEventsFromSharedPrefs(SharedPreferences prefs) {
+ LinkedList<String> list = new LinkedList<>();
+ String file = prefs.getString(PREFS_EVENTS_LIST, "");
+ for (String line : file.split(PREFS_EVENTS_LIST_SEPARATOR)) {
+ list.add(line);
+ }
+ return list;
+ }
+
+ private void saveEventsToSharedPrefs(SharedPreferences prefs, LinkedList<String> list) {
+ String file = "";
+ for (String item : list) {
+ if (!file.isEmpty()) {
+ file += PREFS_EVENTS_LIST_SEPARATOR + item;
+ } else {
+ file += item;
+ }
+ }
+ SharedPreferences.Editor editor = prefs.edit();
+ editor.putString(PREFS_EVENTS_LIST, file);
+ editor.commit();
+ }
+}
diff --git a/tests/InstrumentClusterRendererSample/res/values/strings.xml b/tests/InstrumentClusterRendererSample/res/values/strings.xml
index 5c39d53..2666619 100644
--- a/tests/InstrumentClusterRendererSample/res/values/strings.xml
+++ b/tests/InstrumentClusterRendererSample/res/values/strings.xml
@@ -15,47 +15,47 @@
-->
<resources xmlns:xliff="http://schemas.android.com/tools">
- <string name="app_name">InstrumentClusterRendererImpl</string>
+ <string name="app_name" translatable="false">InstrumentClusterRendererImpl</string>
- <string name="incoming_call">Incoming call</string>
- <string name="dialing">Dialing</string>
- <string name="dummy_call_type">• Mobile</string>
+ <string name="incoming_call" translatable="false">Incoming call</string>
+ <string name="dialing" translatable="false">Dialing</string>
+ <string name="dummy_call_type" translatable="false">• Mobile</string>
- <string name="font_family_primary">sans-serif-medium</string>
- <string name="font_family_secondary">sans-serif-regular</string>
+ <string name="font_family_primary" translatable="false">sans-serif-medium</string>
+ <string name="font_family_secondary" translatable="false">sans-serif-regular</string>
- <string name="dummy_weather_forecast">Partly cloudy</string>
- <string name="dummy_weather_location">Mountain View, CA</string>
- <string name="dummy_weather_temperature">82°</string>
+ <string name="dummy_weather_forecast" translatable="false">Partly cloudy</string>
+ <string name="dummy_weather_location" translatable="false">Mountain View, CA</string>
+ <string name="dummy_weather_temperature" translatable="false">82°</string>
- <string name="nav_distance_units_ft">ft</string>
- <string name="nav_distance_units_meters">m</string>
- <string name="nav_distance_units_kilometers">km</string>
- <string name="nav_distance_units_miles">mi</string>
- <string name="nav_distance_units_yards">yd</string>
+ <string name="nav_distance_units_ft" translatable="false">ft</string>
+ <string name="nav_distance_units_meters" translatable="false">m</string>
+ <string name="nav_distance_units_kilometers" translatable="false">km</string>
+ <string name="nav_distance_units_miles" translatable="false">mi</string>
+ <string name="nav_distance_units_yards" translatable="false">yd</string>
- <string name="incoming_message">Incoming message</string>
+ <string name="incoming_message" translatable="false">Incoming message</string>
- <string name="unknown">Unknown</string>
- <string name="voicemail">Voicemail</string>
- <string name="phone_label_with_info">
+ <string name="unknown" translatable="false">Unknown</string>
+ <string name="voicemail" translatable="false">Voicemail</string>
+ <string name="phone_label_with_info" translatable="false">
<xliff:g id="label" example="Mobile">%1$s</xliff:g>
" \u00B7 "
<xliff:g id="duration" example="1:20">%2$s</xliff:g>
</string>
<!-- Status label for phone state [CHAR LIMIT=20] -->
- <string name="call_state_connecting">Connecting</string>
+ <string name="call_state_connecting" translatable="false">Connecting</string>
<!-- Status label for phone state [CHAR LIMIT=20] -->
- <string name="call_state_dialing">Dialing</string>
+ <string name="call_state_dialing" translatable="false">Dialing</string>
<!-- Status label for phone state [CHAR LIMIT=20] -->
- <string name="call_state_hold">On Hold</string>
+ <string name="call_state_hold" translatable="false">On Hold</string>
<!-- Status label for phone state [CHAR LIMIT=20] -->
- <string name="call_state_call_ended">Call Ended</string>
+ <string name="call_state_call_ended" translatable="false">Call Ended</string>
<!-- Status label for phone state [CHAR LIMIT=20] -->
- <string name="call_state_call_active">Connected</string>
+ <string name="call_state_call_active" translatable="false">Connected</string>
<!-- Status label for phone state [CHAR LIMIT=20] -->
- <string name="call_state_call_ringing">Ringing</string>
+ <string name="call_state_call_ringing" translatable="false">Ringing</string>
<!-- Status label for phone state [CHAR LIMIT=20] -->
- <string name="call_state_call_ending">Disconnecting</string>
+ <string name="call_state_call_ending" translatable="false">Disconnecting</string>
</resources>
diff --git a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/InstrumentClusterRenderingServiceImpl.java b/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/InstrumentClusterRenderingServiceImpl.java
index 15296d9..066072e 100644
--- a/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/InstrumentClusterRenderingServiceImpl.java
+++ b/tests/InstrumentClusterRendererSample/src/com/android/car/cluster/sample/InstrumentClusterRenderingServiceImpl.java
@@ -46,12 +46,12 @@
}
@Override
- protected NavigationRenderer getNavigationRenderer() {
+ public NavigationRenderer getNavigationRenderer() {
return mController.getNavigationRenderer();
}
@Override
- protected void onKeyEvent(KeyEvent keyEvent) {
+ public void onKeyEvent(KeyEvent keyEvent) {
// No need to handle key events in this implementation.
}
}
diff --git a/tests/PowerTestService/src/main.cpp b/tests/PowerTestService/src/main.cpp
index acd14ed..9a87408 100644
--- a/tests/PowerTestService/src/main.cpp
+++ b/tests/PowerTestService/src/main.cpp
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-#define LOG_TAG "PowerTestService"
+#define LOG_TAG "PowerTestService: "
#include <signal.h>
#include <utils/Log.h>
@@ -37,9 +37,11 @@
static std::atomic_bool run(true);
void onStateChanged(CarPowerManager::State state) {
- ALOGE("onStateChanged callback = %d", state);
- // Stop the loop
- run = false;
+ ALOGI(LOG_TAG "onStateChanged callback = %d", state);
+ if (state == CarPowerManager::State::kShutdownPrepare) {
+ // Stop the loop
+ run = false;
+ }
}
int main(int, char**)
@@ -48,7 +50,7 @@
sp<ProcessState> processSelf(ProcessState::self());
processSelf->startThreadPool();
- ALOGE(LOG_TAG " started");
+ ALOGI(LOG_TAG "started");
std::unique_ptr<CarPowerManager> carPowerManager(new CarPowerManager());
@@ -57,25 +59,17 @@
} while (retVal != 0);
do {
- CarPowerManager::BootReason bootReason;
- // Test code
- retVal = carPowerManager->getBootReason(&bootReason);
-
- if (retVal == 0) {
- ALOGE("bootreason = %d", bootReason);
- } else {
- ALOGE("ERROR: Could not read bootReason!!");
- }
-
+ ALOGI(LOG_TAG "Waiting for CarPowerManager listener to initiate SHUTDOWN_PREPARE...");
sleep(5);
} while (run);
+ ALOGI(LOG_TAG "Exited loop, shutting down");
+
// Unregister the listener
carPowerManager->clearListener();
// Wait for threads to finish, and then exit.
IPCThreadState::self()->joinThreadPool();
- ALOGE(LOG_TAG " joined and going down");
return 0;
}
diff --git a/tests/ThemePlayground/Android.mk b/tests/ThemePlayground/Android.mk
new file mode 100644
index 0000000..90d12b0
--- /dev/null
+++ b/tests/ThemePlayground/Android.mk
@@ -0,0 +1,48 @@
+#
+# Copyright (C) 2018 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_USE_AAPT2 := true
+
+LOCAL_MODULE_TAGS := optional
+LOCAL_AAPT_FLAGS := --auto-add-overlay
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
+
+LOCAL_STATIC_ANDROID_LIBRARIES += \
+ androidx.car_car \
+ car-theme-lib \
+ androidx.transition_transition \
+ androidx.legacy_legacy-support-v4 \
+ androidx-constraintlayout_constraintlayout
+
+LOCAL_MODULE_OWNER := google
+LOCAL_PACKAGE_NAME := ThemePlayground
+LOCAL_PRIVATE_PLATFORM_APIS := true
+LOCAL_CERTIFICATE := platform
+LOCAL_PRIVILEGED_MODULE := true
+LOCAL_STATIC_JAVA_LIBRARIES := \
+ androidx-constraintlayout_constraintlayout-solver
+
+LOCAL_PROGUARD_ENABLED := disabled
+
+LOCAL_JAVA_LIBRARIES += android.car
+
+include $(BUILD_PACKAGE)
diff --git a/tests/ThemePlayground/AndroidManifest.xml b/tests/ThemePlayground/AndroidManifest.xml
new file mode 100644
index 0000000..def394f
--- /dev/null
+++ b/tests/ThemePlayground/AndroidManifest.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.car.themeplayground">
+ <uses-sdk
+ android:minSdkVersion="26"
+ android:targetSdkVersion="26"/>
+ <uses-permission android:name="android.permission.MODIFY_DAY_NIGHT_MODE" />
+ <application
+ android:allowBackup="true"
+ android:icon="@drawable/ic_launcher"
+ android:label="@string/app_name"
+ android:supportsRtl="true"
+ android:theme="@style/Theme.App">
+ <activity
+ android:name=".TextSamples"
+ android:label="@string/app_name"
+ android:windowSoftInputMode="stateUnchanged"
+ android:resizeableActivity="true"
+ android:allowEmbedded="true">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+ <activity
+ android:name=".ColorSamples"
+ android:label="@string/panel_elements"
+ android:windowSoftInputMode="stateUnchanged"
+ android:resizeableActivity="true"
+ android:allowEmbedded="true">
+ </activity>
+ <activity android:name=".DialogSamples"
+ android:label="@string/dialog_elements"
+ android:parentActivityName="com.android.car.themeplayground.TextSamples">
+ </activity>
+ <activity android:name=".WidgetsSamples"
+ android:label="@string/widgets"
+ android:parentActivityName="com.android.car.themeplayground.TextSamples">
+ </activity>
+ <activity android:name=".PagedListViewSamples"
+ android:label="@string/paged_list_view"
+ android:parentActivityName="com.android.car.themeplayground.TextSamples">
+ </activity>
+ <activity android:name=".DefaultThemeSamples"
+ android:label="@string/default_themes"
+ android:parentActivityName="com.android.car.themeplayground.TextSamples">
+ </activity>
+ <activity android:name=".MultipleIntentSamples"
+ android:label="@string/multiple_intent"
+ android:parentActivityName="com.android.car.themeplayground.TextSamples">
+ </activity>
+ </application>
+</manifest>
\ No newline at end of file
diff --git a/tests/ThemePlayground/res/drawable/ic_launcher.png b/tests/ThemePlayground/res/drawable/ic_launcher.png
new file mode 100644
index 0000000..5d5dc1a
--- /dev/null
+++ b/tests/ThemePlayground/res/drawable/ic_launcher.png
Binary files differ
diff --git a/tests/ThemePlayground/res/drawable/ic_launcher_background.xml b/tests/ThemePlayground/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..29fd4e0
--- /dev/null
+++ b/tests/ThemePlayground/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,186 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="108dp"
+ android:height="108dp"
+ android:viewportHeight="108"
+ android:viewportWidth="108">
+ <path
+ android:fillColor="#26A69A"
+ android:pathData="M0,0h108v108h-108z" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M9,0L9,108"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M19,0L19,108"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M29,0L29,108"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M39,0L39,108"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M49,0L49,108"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M59,0L59,108"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M69,0L69,108"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M79,0L79,108"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M89,0L89,108"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M99,0L99,108"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,9L108,9"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,19L108,19"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,29L108,29"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,39L108,39"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,49L108,49"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,59L108,59"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,69L108,69"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,79L108,79"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,89L108,89"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,99L108,99"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M19,29L89,29"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M19,39L89,39"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M19,49L89,49"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M19,59L89,59"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M19,69L89,69"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M19,79L89,79"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M29,19L29,89"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M39,19L39,89"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M49,19L49,89"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M59,19L59,89"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M69,19L69,89"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M79,19L79,89"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+</vector>
diff --git a/tests/ThemePlayground/res/drawable/ic_launcher_foreground.xml b/tests/ThemePlayground/res/drawable/ic_launcher_foreground.xml
new file mode 100644
index 0000000..497b104
--- /dev/null
+++ b/tests/ThemePlayground/res/drawable/ic_launcher_foreground.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:aapt="http://schemas.android.com/aapt"
+ android:width="108dp"
+ android:height="108dp"
+ android:viewportHeight="108"
+ android:viewportWidth="108">
+ <path
+ android:fillType="evenOdd"
+ android:pathData="M32,64C32,64 38.39,52.99 44.13,50.95C51.37,48.37 70.14,49.57 70.14,49.57L108.26,87.69L108,109.01L75.97,107.97L32,64Z"
+ android:strokeColor="#00000000"
+ android:strokeWidth="1">
+ <aapt:attr name="android:fillColor">
+ <gradient
+ android:endX="78.5885"
+ android:endY="90.9159"
+ android:startX="48.7653"
+ android:startY="61.0927"
+ android:type="linear">
+ <item
+ android:color="#44000000"
+ android:offset="0.0" />
+ <item
+ android:color="#00000000"
+ android:offset="1.0" />
+ </gradient>
+ </aapt:attr>
+ </path>
+ <path
+ android:fillColor="#FFFFFF"
+ android:fillType="nonZero"
+ android:pathData="M66.94,46.02L66.94,46.02C72.44,50.07 76,56.61 76,64L32,64C32,56.61 35.56,50.11 40.98,46.06L36.18,41.19C35.45,40.45 35.45,39.3 36.18,38.56C36.91,37.81 38.05,37.81 38.78,38.56L44.25,44.05C47.18,42.57 50.48,41.71 54,41.71C57.48,41.71 60.78,42.57 63.68,44.05L69.11,38.56C69.84,37.81 70.98,37.81 71.71,38.56C72.44,39.3 72.44,40.45 71.71,41.19L66.94,46.02ZM62.94,56.92C64.08,56.92 65,56.01 65,54.88C65,53.76 64.08,52.85 62.94,52.85C61.8,52.85 60.88,53.76 60.88,54.88C60.88,56.01 61.8,56.92 62.94,56.92ZM45.06,56.92C46.2,56.92 47.13,56.01 47.13,54.88C47.13,53.76 46.2,52.85 45.06,52.85C43.92,52.85 43,53.76 43,54.88C43,56.01 43.92,56.92 45.06,56.92Z"
+ android:strokeColor="#00000000"
+ android:strokeWidth="1" />
+</vector>
diff --git a/tests/ThemePlayground/res/layout/device_default_theme_samples.xml b/tests/ThemePlayground/res/layout/device_default_theme_samples.xml
new file mode 100644
index 0000000..94391cd
--- /dev/null
+++ b/tests/ThemePlayground/res/layout/device_default_theme_samples.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<androidx.constraintlayout.widget.ConstraintLayout
+ 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"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ tools:context="com.codinginflow.radiobuttonexample.MainActivity">
+
+ <TextView
+ android:id="@+id/set_application_theme"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="8dp"
+ android:layout_marginTop="16dp"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ android:text="@string/theme_name"/>
+
+ <AutoCompleteTextView
+ android:id="@+id/theme_name"
+ android:layout_width="800dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:layout_marginStart="16dp"
+ android:layout_marginTop="8dp"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintEnd_toStartOf="@+id/button_apply"
+ app:layout_constraintStart_toEndOf="@+id/set_application_theme"/>
+
+ <Button
+ android:id="@+id/button_apply"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@+id/text_view_selected"
+ android:layout_centerHorizontal="true"
+ android:layout_marginTop="16dp"
+ android:text="apply"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toEndOf="@+id/theme_name"
+ app:layout_constraintTop_toTopOf="parent"/>
+
+ <include layout="@layout/menu_button"/>
+
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/tests/ThemePlayground/res/layout/dialog_samples.xml b/tests/ThemePlayground/res/layout/dialog_samples.xml
new file mode 100644
index 0000000..9958de1
--- /dev/null
+++ b/tests/ThemePlayground/res/layout/dialog_samples.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<androidx.constraintlayout.widget.ConstraintLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:id="@+id/dialogLayout"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <include layout="@layout/set_background"
+ android:id="@+id/setBackground"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="20dp"
+ app:layout_constraintBottom_toTopOf="@+id/showDialogBT"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="parent"/>
+
+
+ <Button
+ android:id="@+id/showDialogBT"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Show Dialog"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintLeft_toLeftOf="parent"
+ app:layout_constraintRight_toRightOf="parent"
+ app:layout_constraintTop_toTopOf="parent" />
+
+ <Button
+ android:id="@+id/showDialogWithCheckboxBT"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Show Dialog With Checkbox"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="@+id/showDialogBT" />
+
+ <include layout="@layout/menu_button"/>
+
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/tests/ThemePlayground/res/layout/item_list.xml b/tests/ThemePlayground/res/layout/item_list.xml
new file mode 100644
index 0000000..67b5b63
--- /dev/null
+++ b/tests/ThemePlayground/res/layout/item_list.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="10dp"
+ android:layout_marginBottom="10dp"
+ android:id="@+id/textTitle"
+ android:text="TESTING"/>
+
+</LinearLayout>
diff --git a/tests/ThemePlayground/res/layout/menu_button.xml b/tests/ThemePlayground/res/layout/menu_button.xml
new file mode 100644
index 0000000..9dbe9ee
--- /dev/null
+++ b/tests/ThemePlayground/res/layout/menu_button.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<androidx.constraintlayout.widget.ConstraintLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:id="@+id/dialogLayout"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <Button
+ android:id="@+id/button_menu"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@+id/text_view_selected"
+ android:layout_centerHorizontal="true"
+ android:layout_marginTop="20dp"
+ android:text="menu"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"/>
+
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/tests/ThemePlayground/res/layout/multiple_intent_samples.xml b/tests/ThemePlayground/res/layout/multiple_intent_samples.xml
new file mode 100644
index 0000000..fcca86f
--- /dev/null
+++ b/tests/ThemePlayground/res/layout/multiple_intent_samples.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<androidx.constraintlayout.widget.ConstraintLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <Button
+ android:id="@+id/fire_web_intent_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Fire Intent web"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintLeft_toLeftOf="parent"
+ app:layout_constraintRight_toRightOf="parent"
+ app:layout_constraintTop_toTopOf="parent" />
+ <include layout="@layout/menu_button"/>
+
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/tests/ThemePlayground/res/layout/paged_list_view_samples.xml b/tests/ThemePlayground/res/layout/paged_list_view_samples.xml
new file mode 100644
index 0000000..a3ebb1e
--- /dev/null
+++ b/tests/ThemePlayground/res/layout/paged_list_view_samples.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+ <androidx.car.widget.PagedListView
+ android:id="@+id/list"
+ android:theme="@style/PagedListTheme"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ app:gutter="both" />
+ <include layout="@layout/menu_button"/>
+</LinearLayout>
diff --git a/tests/ThemePlayground/res/layout/panel_samples.xml b/tests/ThemePlayground/res/layout/panel_samples.xml
new file mode 100644
index 0000000..8e19e14
--- /dev/null
+++ b/tests/ThemePlayground/res/layout/panel_samples.xml
@@ -0,0 +1,190 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<androidx.constraintlayout.widget.ConstraintLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+ <ScrollView
+ android:layout_width="0dp"
+ android:layout_height="0dp"
+ android:layout_marginBottom="8dp"
+ android:layout_marginEnd="16dp"
+ android:layout_marginStart="16dp"
+ android:layout_marginTop="8dp"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="parent">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <FrameLayout
+ android:layout_width="match_parent"
+ android:layout_height="100dp"
+ android:background="?android:attr/colorPrimary">
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="android:attr/colorPrimary"/>
+ </FrameLayout>
+ <FrameLayout
+ android:layout_width="match_parent"
+ android:layout_height="100dp"
+ android:background="?android:attr/colorPrimaryDark">
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="android:attr/colorPrimaryDark"/>
+ </FrameLayout>
+ <FrameLayout
+ android:layout_width="match_parent"
+ android:layout_height="100dp"
+ android:background="?android:attr/colorAccent">
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="android:attr/colorAccent"/>
+ </FrameLayout>
+ <FrameLayout
+ android:layout_width="match_parent"
+ android:layout_height="100dp"
+ android:background="?android:attr/colorForeground">
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="android:attr/colorForeground"
+ android:textColor="?android:attr/textColorPrimaryInverse"/>
+ </FrameLayout>
+ <FrameLayout
+ android:layout_width="match_parent"
+ android:layout_height="100dp"
+ android:background="?android:attr/colorBackground">
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="android:attr/colorBackground"/>
+ </FrameLayout>
+ <FrameLayout
+ android:layout_width="match_parent"
+ android:layout_height="100dp"
+ android:background="?android:attr/windowBackground">
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="android:attr/windowBackground"/>
+ </FrameLayout>
+ <FrameLayout
+ android:layout_width="match_parent"
+ android:layout_height="100dp"
+ android:background="?android:attr/colorBackgroundFloating">
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="android:attr/colorBackgroundFloating"/>
+ </FrameLayout>
+ <FrameLayout
+ android:layout_width="match_parent"
+ android:layout_height="100dp"
+ android:background="?android:attr/colorActivatedHighlight">
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="android:attr/colorActivatedHighlight"/>
+ </FrameLayout>
+ <FrameLayout
+ android:layout_width="match_parent"
+ android:layout_height="100dp"
+ android:background="?android:attr/colorControlActivated">
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="android:attr/colorControlActivated"/>
+ </FrameLayout>
+ <FrameLayout
+ android:layout_width="match_parent"
+ android:layout_height="100dp"
+ android:background="?android:attr/colorControlHighlight">
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="android:attr/colorControlHighlight"/>
+ </FrameLayout>
+ <FrameLayout
+ android:layout_width="match_parent"
+ android:layout_height="100dp"
+ android:background="?android:attr/colorControlNormal">
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="android:attr/colorControlNormal"/>
+ </FrameLayout>
+ <FrameLayout
+ android:layout_width="match_parent"
+ android:layout_height="100dp"
+ android:background="?android:attr/colorError">
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="android:attr/colorError"/>
+ </FrameLayout>
+ <FrameLayout
+ android:layout_width="match_parent"
+ android:layout_height="100dp"
+ android:background="?android:attr/colorButtonNormal">
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="android:attr/colorButtonNormal"/>
+ </FrameLayout>
+ <FrameLayout
+ android:layout_width="match_parent"
+ android:layout_height="100dp"
+ android:background="?android:attr/colorFocusedHighlight">
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="android:attr/colorFocusedHighlight"/>
+ </FrameLayout>
+ <FrameLayout
+ android:layout_width="match_parent"
+ android:layout_height="100dp"
+ android:background="?android:attr/panelColorBackground">
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="android:attr/panelColorBackground"/>
+ </FrameLayout>
+ <FrameLayout
+ android:layout_width="match_parent"
+ android:layout_height="100dp"
+ android:background="?android:attr/panelColorForeground">
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="android:attr/panelColorForeground"
+ android:textColor="?android:attr/textColorPrimaryInverse"/>
+ </FrameLayout>
+ </LinearLayout>
+ </ScrollView>
+ <include layout="@layout/menu_button"/>
+
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/tests/ThemePlayground/res/layout/set_background.xml b/tests/ThemePlayground/res/layout/set_background.xml
new file mode 100644
index 0000000..7cb86b9
--- /dev/null
+++ b/tests/ThemePlayground/res/layout/set_background.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:orientation="horizontal"
+ android:layout_height="match_parent">
+
+ <TextView
+ android:id="@+id/set_background_name"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="8dp"
+ android:layout_marginStart="8dp"
+ android:text="@string/background_name" />
+
+ <EditText
+ android:id="@+id/background_input_color"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="16dp"
+ android:layout_marginTop="8dp"
+ android:ems="10" />
+
+ <Button
+ android:id="@+id/set_background_color"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginEnd="8dp"
+ android:layout_marginTop="8dp"
+ android:layout_marginStart="30dp"
+ android:text="@string/apply"/>
+
+ <Button
+ android:id="@+id/reset"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginEnd="8dp"
+ android:layout_marginTop="8dp"
+ android:layout_marginStart="50dp"
+ android:text="@string/reset"/>
+</LinearLayout>
\ No newline at end of file
diff --git a/tests/ThemePlayground/res/layout/text_samples.xml b/tests/ThemePlayground/res/layout/text_samples.xml
new file mode 100644
index 0000000..cc806bf
--- /dev/null
+++ b/tests/ThemePlayground/res/layout/text_samples.xml
@@ -0,0 +1,137 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <include layout="@layout/set_background"
+ android:id="@+id/setBackground"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="20dp"
+ app:layout_constraintBottom_toTopOf="@+id/text_sample_list"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="parent"/>
+
+ <ScrollView
+ android:id="@+id/text_sample_list"
+ android:layout_width="0dp"
+ android:layout_height="0dp"
+ android:layout_marginBottom="8dp"
+ android:layout_marginEnd="8dp"
+ android:layout_marginStart="8dp"
+ android:layout_marginTop="8dp"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toBottomOf="@id/setBackground">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <TextView
+ android:id="@+id/unset"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="Text Appearance Not Set (thus textAppearanceSmall)"/>
+
+ <TextView
+ android:id="@+id/textAppearanceLarge"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="textAppearanceLarge"
+ android:textAppearance="?android:attr/textAppearanceLarge" />
+
+ <TextView
+ android:id="@+id/textAppearanceLargeInverse"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="textAppearanceLargeInverse"
+ android:textAppearance="?android:attr/textAppearanceLargeInverse" />
+
+ <TextView
+ android:id="@+id/textAppearanceMedium"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="TextApperanceMedium"
+ android:textAppearance="?android:attr/textAppearanceMedium" />
+
+ <TextView
+ android:id="@+id/textAppearanceMediumInverse"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="textAppearanceMediumInverse"
+ android:textAppearance="?android:attr/textAppearanceMediumInverse" />
+
+ <TextView
+ android:id="@+id/textAppearance"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="textAppearance"
+ android:textAppearance="?android:attr/textAppearance" />
+
+ <TextView
+ android:id="@+id/textAppearanceInverse"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="textAppearanceInverse"
+ android:textAppearance="?android:attr/textAppearanceInverse" />
+
+ <TextView
+ android:id="@+id/small"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="TextApperanceSmall"
+ android:textAppearance="?android:attr/textAppearanceSmall" />
+
+ <TextView
+ android:id="@+id/textAppearanceSmallInverse"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="textAppearanceSmallInverse"
+ android:textAppearance="?android:attr/textAppearanceSmallInverse" />
+
+ <TextView
+ android:id="@+id/textAppearanceListItem"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="textAppearanceListItem"
+ android:textAppearance="?android:attr/textAppearanceListItem" />
+
+ <TextView
+ android:id="@+id/textAppearanceListItemSmall"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="textAppearanceListItemSmall"
+ android:textAppearance="?android:attr/textAppearanceListItemSmall" />
+
+ <TextView
+ android:id="@+id/textAppearanceListItemSecondary"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="textAppearanceListItemSecondary"
+ android:textAppearance="?android:attr/textAppearanceListItemSecondary" />
+ </LinearLayout>
+ </ScrollView>
+ <include layout="@layout/menu_button"/>
+
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/tests/ThemePlayground/res/layout/widget_samples.xml b/tests/ThemePlayground/res/layout/widget_samples.xml
new file mode 100644
index 0000000..54472ac
--- /dev/null
+++ b/tests/ThemePlayground/res/layout/widget_samples.xml
@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<androidx.constraintlayout.widget.ConstraintLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:id="@+id/widgetLayout"
+ android:background="@color/widget_background"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <include layout="@layout/set_background"
+ android:id="@+id/setBackground"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="20dp"
+ app:layout_constraintBottom_toTopOf="@+id/widget_checkbox"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="parent"/>
+
+ <LinearLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="20dp"
+ android:layout_marginStart="100dp"
+ android:orientation="horizontal"
+ android:id="@+id/checkbox_layout"
+ app:layout_constraintTop_toBottomOf="@+id/setBackground"
+ app:layout_constraintStart_toStartOf="parent">
+
+ <TextView
+ android:id="@+id/widget_checkbox"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/widget_checkbox"/>
+
+ <CheckBox android:id="@+id/widget_checkbox"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="16dp"/>
+
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:layout_marginTop="20dp"
+ android:layout_marginStart="100dp"
+ android:id="@+id/switch_layout"
+ app:layout_constraintTop_toBottomOf="@+id/checkbox_layout"
+ app:layout_constraintStart_toStartOf="parent">
+
+ <TextView
+ android:id="@+id/toggle_switch"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/toggle_switch"/>
+
+ <Switch
+ android:id="@+id/widget_switch"
+ android:layout_width="wrap_content"
+ android:layout_marginStart="16dp"
+ android:layout_height="wrap_content"/>
+
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:layout_marginTop="20dp"
+ android:layout_marginStart="100dp"
+ android:id="@+id/progress_bar_layout"
+ app:layout_constraintTop_toBottomOf="@+id/switch_layout"
+ app:layout_constraintStart_toStartOf="parent">
+
+ <TextView
+ android:id="@+id/progress_bar"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/progress_bar"/>
+
+ <SeekBar
+ android:id="@+id/widget_seek_bar"
+ android:layout_width="200dp"
+ android:layout_height="30dp"
+ android:layout_marginStart="16dp"/>
+
+ </LinearLayout>
+
+
+ <Button
+ android:id="@+id/trigger_config_change"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Trigger Config change Day/Night Mode"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintLeft_toLeftOf="parent"
+ app:layout_constraintRight_toRightOf="parent"
+ app:layout_constraintTop_toBottomOf="@+id/progress_bar_layout"/>
+ <include layout="@layout/menu_button"/>
+
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/tests/ThemePlayground/res/menu/menu_main.xml b/tests/ThemePlayground/res/menu/menu_main.xml
new file mode 100644
index 0000000..eb7f771
--- /dev/null
+++ b/tests/ThemePlayground/res/menu/menu_main.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<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="com.google.themetesting.Main">
+ <item
+ android:id="@+id/text_elements"
+ android:orderInCategory="100"
+ android:title="@string/text_elements"
+ app:showAsAction="never" />
+ <item
+ android:id="@+id/panel_elements"
+ android:orderInCategory="100"
+ android:title="@string/panel_elements"
+ app:showAsAction="never" />
+ <item
+ android:id="@+id/dialog_elements"
+ android:orderInCategory="100"
+ android:title="@string/dialog_elements"
+ app:showAsAction="never" />
+ <item
+ android:id="@+id/toggle_theme"
+ android:orderInCategory="100"
+ android:title="@string/toggle_theme"
+ app:showAsAction="never" />
+ <item
+ android:id="@+id/widgets"
+ android:orderInCategory="100"
+ android:title="@string/widgets"
+ app:showAsAction="never" />
+ <item
+ android:id="@+id/page_list_view"
+ android:orderInCategory="100"
+ android:title="@string/paged_list_view"
+ app:showAsAction="never" />
+ <item
+ android:id="@+id/default_themes"
+ android:orderInCategory="100"
+ android:title="@string/default_themes"
+ app:showAsAction="never" />
+ <item
+ android:id="@+id/multiple_intent"
+ android:orderInCategory="100"
+ android:title="@string/multiple_intent"
+ app:showAsAction="never" />
+</menu>
\ No newline at end of file
diff --git a/tests/ThemePlayground/res/raw/theme_names.txt b/tests/ThemePlayground/res/raw/theme_names.txt
new file mode 100644
index 0000000..ea3394d
--- /dev/null
+++ b/tests/ThemePlayground/res/raw/theme_names.txt
@@ -0,0 +1,3 @@
+Theme.DeviceDefault
+Theme.DeviceDefault.Light
+Theme.DeviceDefault.NoActionBar
\ No newline at end of file
diff --git a/tests/ThemePlayground/res/values-af/strings.xml b/tests/ThemePlayground/res/values-af/strings.xml
new file mode 100644
index 0000000..1283b0d
--- /dev/null
+++ b/tests/ThemePlayground/res/values-af/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE-temaspeelgrond"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Tekselemente"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Kleurpanele"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Dialoë"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Verander opstelling (dag/nag)"</string>
+ <string name="apply" msgid="7165796721764564035">"Pas toe"</string>
+ <string name="widgets" msgid="2335373195144254853">"Legstukke"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Bladsy-lysaansig"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Merkblokkie"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Skuif skakelaar"</string>
+ <string name="reset" msgid="8400557536601938969">"Stel terug"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Vorderingsbalk"</string>
+ <string name="background_name" msgid="2753485007335630418">"Stel agtergrondkleur:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Pas temas toe"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Temanaam:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Kieser-aktiwiteit"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-am/strings.xml b/tests/ThemePlayground/res/values-am/strings.xml
new file mode 100644
index 0000000..5b27005
--- /dev/null
+++ b/tests/ThemePlayground/res/values-am/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE ገጽታ መጫወቻ ሜዳ"</string>
+ <string name="text_elements" msgid="6678400827142549036">"የጽሑፍ አባለ ነገራት"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"የቀለም ፓነሎች"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"ንግግሮች"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"ውቅረትን ይለውጡ(ቀን/ሌሊት)"</string>
+ <string name="apply" msgid="7165796721764564035">"ተግብር"</string>
+ <string name="widgets" msgid="2335373195144254853">"ፍርግሞች"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"በገጽ የተዘጋጀ የዝርዝር ዕይታ"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"አመልካች ሳጥን"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"ማብሪያ ማጥፊያን ቀያይር"</string>
+ <string name="reset" msgid="8400557536601938969">"ዳግም አስጀምር"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"የሂደት አሞሌ"</string>
+ <string name="background_name" msgid="2753485007335630418">"የዳራ ቀለም ያቀናብሩ ፦"</string>
+ <string name="default_themes" msgid="6668869906906304331">"ገጽታዎችን ተግብር"</string>
+ <string name="theme_name" msgid="8750875004662195520">"ገጽታ ስም፦"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"እርምጃ ይምረጡ"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-ar/strings.xml b/tests/ThemePlayground/res/values-ar/strings.xml
new file mode 100644
index 0000000..edf4844
--- /dev/null
+++ b/tests/ThemePlayground/res/values-ar/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"ملعب AAE للألعاب الترفيهية"</string>
+ <string name="text_elements" msgid="6678400827142549036">"عناصر النص"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"لوحات الألوان"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"مربعات الحوار"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"تغيير الضبط (النهار/الليل)"</string>
+ <string name="apply" msgid="7165796721764564035">"تطبيق"</string>
+ <string name="widgets" msgid="2335373195144254853">"الأدوات"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"قائمة الصفحات المرقّمة"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"مربع الاختيار"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"مفتاح التبديل"</string>
+ <string name="reset" msgid="8400557536601938969">"إعادة الضبط"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"شريط التقدم"</string>
+ <string name="background_name" msgid="2753485007335630418">"ضبط لون الخلفية:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"تطبيق التصميمات"</string>
+ <string name="theme_name" msgid="8750875004662195520">"اسم التصميم:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"نشاط أداة الاختيار"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-az/strings.xml b/tests/ThemePlayground/res/values-az/strings.xml
new file mode 100644
index 0000000..a3d66a5
--- /dev/null
+++ b/tests/ThemePlayground/res/values-az/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE Tema Effektləri"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Mətn elementləri"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Rəng panelləri"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Dialoqlar"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Konfiqurasiyanı dəyişin(Gündüz/Gecə)"</string>
+ <string name="apply" msgid="7165796721764564035">"Tətbiq edin"</string>
+ <string name="widgets" msgid="2335373195144254853">"Vidcetlər"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Səhifələnmiş siyahı görünüşü"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Qeyd xanası"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Dəyişdirmə düyməsi"</string>
+ <string name="reset" msgid="8400557536601938969">"Sıfırlayın"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Gedişat paneli"</string>
+ <string name="background_name" msgid="2753485007335630418">"Arxa fon rəngini ayarlayın:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Temaları tətbiq edin"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Tema adı:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Seçmə fəaliyyəti"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-b+sr+Latn/strings.xml b/tests/ThemePlayground/res/values-b+sr+Latn/strings.xml
new file mode 100644
index 0000000..f6eeb50
--- /dev/null
+++ b/tests/ThemePlayground/res/values-b+sr+Latn/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE Theme Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Text Elements"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Color Panels"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Dialogs"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Change configuration(Day/Night)"</string>
+ <string name="apply" msgid="7165796721764564035">"Apply"</string>
+ <string name="widgets" msgid="2335373195144254853">"Widgets"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Paged List View"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Checkbox"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Toggle Switch"</string>
+ <string name="reset" msgid="8400557536601938969">"Reset"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Progress Bar"</string>
+ <string name="background_name" msgid="2753485007335630418">"Set background color :"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Apply Themes"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Theme Name:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Chooser Activity"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-be/strings.xml b/tests/ThemePlayground/res/values-be/strings.xml
new file mode 100644
index 0000000..504146a
--- /dev/null
+++ b/tests/ThemePlayground/res/values-be/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE Theme Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Тэкставыя элементы"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Каляровыя панэлі"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Дыялогі"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Змяніць канфігурацыю (дзень/ноч)"</string>
+ <string name="apply" msgid="7165796721764564035">"Ужыць"</string>
+ <string name="widgets" msgid="2335373195144254853">"Віджэты"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"У выглядзе спіса са старонкамі"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Поле для птушкі"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Пераключальнік"</string>
+ <string name="reset" msgid="8400557536601938969">"Скінуць"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Індыкатар стану"</string>
+ <string name="background_name" msgid="2753485007335630418">"Задаць фонавы колер:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Ужыць тэмы"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Назва тэмы:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Дзеянні пры выбары"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-bg/strings.xml b/tests/ThemePlayground/res/values-bg/strings.xml
new file mode 100644
index 0000000..767db28
--- /dev/null
+++ b/tests/ThemePlayground/res/values-bg/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE Theme Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Текстови елементи"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Цветови панели"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Диалогови прозорци"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Промяна на конфигурацията (ден/нощ)"</string>
+ <string name="apply" msgid="7165796721764564035">"Прилагане"</string>
+ <string name="widgets" msgid="2335373195144254853">"Приспособления"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Списъчен изглед с номериране на страниците"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Квадратче за отметка"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Превключвател"</string>
+ <string name="reset" msgid="8400557536601938969">"Нулиране"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Лента за напредъка"</string>
+ <string name="background_name" msgid="2753485007335630418">"Задаване на цвят на фона:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Прилагане на темите"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Име на темата:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Инструмент за избор на активност"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-bn/strings.xml b/tests/ThemePlayground/res/values-bn/strings.xml
new file mode 100644
index 0000000..4ee67cd
--- /dev/null
+++ b/tests/ThemePlayground/res/values-bn/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE থিম প্লেগ্রাউন্ড"</string>
+ <string name="text_elements" msgid="6678400827142549036">"টেক্সট উপাদান"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"রঙয়ের প্যানেল"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"ডায়ালগ"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"কনফিগারেশন পরিবর্তন করুন(দিন/রাত)"</string>
+ <string name="apply" msgid="7165796721764564035">"প্রয়োগ করুন"</string>
+ <string name="widgets" msgid="2335373195144254853">"উইজেট"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"পৃষ্ঠা হিসেবে লোড করা তালিকার ভিউ"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"চেকবক্স"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"টগল সুইচ"</string>
+ <string name="reset" msgid="8400557536601938969">"রিসেট করুন"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"প্রগ্রেস বার"</string>
+ <string name="background_name" msgid="2753485007335630418">"ব্যাকগ্রাউন্ডের রঙ বেছে নিন :"</string>
+ <string name="default_themes" msgid="6668869906906304331">"থিম প্রয়োগ করুন"</string>
+ <string name="theme_name" msgid="8750875004662195520">"থিমের নাম:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"বেছে নেওয়ার অ্যাক্টিভিটি"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-bs/strings.xml b/tests/ThemePlayground/res/values-bs/strings.xml
new file mode 100644
index 0000000..97b53c6
--- /dev/null
+++ b/tests/ThemePlayground/res/values-bs/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"Playground s AAE temama"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Elementi teksta"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Ploče u boji"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Dijalozi"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Promijenite konfiguraciju(dan/noć)"</string>
+ <string name="apply" msgid="7165796721764564035">"Primijeni"</string>
+ <string name="widgets" msgid="2335373195144254853">"Vidžeti"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Prikaz po stranicama"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Polje za potvrdu"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Prekidač za uključivanje/isključivanje"</string>
+ <string name="reset" msgid="8400557536601938969">"Ponovo postavi"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Traka napretka"</string>
+ <string name="background_name" msgid="2753485007335630418">"Postavi boju pozadine:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Primijeni teme"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Tema Naziv:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Aktivnost birača"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-ca/strings.xml b/tests/ThemePlayground/res/values-ca/strings.xml
new file mode 100644
index 0000000..f6eeb50
--- /dev/null
+++ b/tests/ThemePlayground/res/values-ca/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE Theme Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Text Elements"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Color Panels"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Dialogs"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Change configuration(Day/Night)"</string>
+ <string name="apply" msgid="7165796721764564035">"Apply"</string>
+ <string name="widgets" msgid="2335373195144254853">"Widgets"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Paged List View"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Checkbox"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Toggle Switch"</string>
+ <string name="reset" msgid="8400557536601938969">"Reset"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Progress Bar"</string>
+ <string name="background_name" msgid="2753485007335630418">"Set background color :"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Apply Themes"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Theme Name:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Chooser Activity"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-cs/strings.xml b/tests/ThemePlayground/res/values-cs/strings.xml
new file mode 100644
index 0000000..fb7bb36
--- /dev/null
+++ b/tests/ThemePlayground/res/values-cs/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE Theme Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Textové prvky"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Panely barev"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Dialogová okna"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Změna konfigurace (den/noc)"</string>
+ <string name="apply" msgid="7165796721764564035">"Použít"</string>
+ <string name="widgets" msgid="2335373195144254853">"Widgety"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Seznam se stránkami"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Zaškrtávací políčko"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Přepínač"</string>
+ <string name="reset" msgid="8400557536601938969">"Resetovat"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Ukazatel průběhu"</string>
+ <string name="background_name" msgid="2753485007335630418">"Nastavit barvu pozadí:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Použít motivy"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Název motivu:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Výběr aktivity"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-da/strings.xml b/tests/ThemePlayground/res/values-da/strings.xml
new file mode 100644
index 0000000..f6eeb50
--- /dev/null
+++ b/tests/ThemePlayground/res/values-da/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE Theme Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Text Elements"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Color Panels"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Dialogs"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Change configuration(Day/Night)"</string>
+ <string name="apply" msgid="7165796721764564035">"Apply"</string>
+ <string name="widgets" msgid="2335373195144254853">"Widgets"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Paged List View"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Checkbox"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Toggle Switch"</string>
+ <string name="reset" msgid="8400557536601938969">"Reset"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Progress Bar"</string>
+ <string name="background_name" msgid="2753485007335630418">"Set background color :"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Apply Themes"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Theme Name:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Chooser Activity"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-de/strings.xml b/tests/ThemePlayground/res/values-de/strings.xml
new file mode 100644
index 0000000..aa5dc2b
--- /dev/null
+++ b/tests/ThemePlayground/res/values-de/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE-Design für Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Textelemente"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Farbsteuerfelder"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Dialogfelder"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Konfiguration ändern (Tag/Nacht)"</string>
+ <string name="apply" msgid="7165796721764564035">"Anwenden"</string>
+ <string name="widgets" msgid="2335373195144254853">"Widgets"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Seitennummerierte Liste"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Kästchen"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Schieberegler"</string>
+ <string name="reset" msgid="8400557536601938969">"Zurücksetzen"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Fortschrittsanzeige"</string>
+ <string name="background_name" msgid="2753485007335630418">"Hintergrundfarbe festlegen:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Designs anwenden"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Name des Designs:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Aktivität auswählen"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-el/strings.xml b/tests/ThemePlayground/res/values-el/strings.xml
new file mode 100644
index 0000000..abfb6b7
--- /dev/null
+++ b/tests/ThemePlayground/res/values-el/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE Theme Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Στοιχεία κειμένου"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Πλαίσια χρώματος"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Παράθυρα διαλόγου"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Αλλαγή διαμόρφωσης (Ημέρα/Νύχτα)"</string>
+ <string name="apply" msgid="7165796721764564035">"Εφαρμογή"</string>
+ <string name="widgets" msgid="2335373195144254853">"Γραφικά στοιχεία"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Προβολή λίστας στη σελίδα"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Πλαίσιο ελέγχου"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Διακόπτης εναλλαγής"</string>
+ <string name="reset" msgid="8400557536601938969">"Επαναφορά"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Γραμμή προόδου"</string>
+ <string name="background_name" msgid="2753485007335630418">"Ορισμός χρώματος παρασκηνίου:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Εφαρμογή θεμάτων"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Όνομα θέματος:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Επιλογή δραστηριότητας"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-en-rAU/strings.xml b/tests/ThemePlayground/res/values-en-rAU/strings.xml
new file mode 100644
index 0000000..749ab14
--- /dev/null
+++ b/tests/ThemePlayground/res/values-en-rAU/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE Theme Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Text Elements"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Colour Panels"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Dialogues"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Change configuration (Day/Night)"</string>
+ <string name="apply" msgid="7165796721764564035">"Apply"</string>
+ <string name="widgets" msgid="2335373195144254853">"Widgets"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Paged List View"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Tick box"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Toggle Switch"</string>
+ <string name="reset" msgid="8400557536601938969">"Reset"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Progress Bar"</string>
+ <string name="background_name" msgid="2753485007335630418">"Set background colour:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Apply Themes"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Theme Name:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Chooser Activity"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-en-rCA/strings.xml b/tests/ThemePlayground/res/values-en-rCA/strings.xml
new file mode 100644
index 0000000..749ab14
--- /dev/null
+++ b/tests/ThemePlayground/res/values-en-rCA/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE Theme Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Text Elements"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Colour Panels"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Dialogues"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Change configuration (Day/Night)"</string>
+ <string name="apply" msgid="7165796721764564035">"Apply"</string>
+ <string name="widgets" msgid="2335373195144254853">"Widgets"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Paged List View"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Tick box"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Toggle Switch"</string>
+ <string name="reset" msgid="8400557536601938969">"Reset"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Progress Bar"</string>
+ <string name="background_name" msgid="2753485007335630418">"Set background colour:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Apply Themes"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Theme Name:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Chooser Activity"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-en-rGB/strings.xml b/tests/ThemePlayground/res/values-en-rGB/strings.xml
new file mode 100644
index 0000000..749ab14
--- /dev/null
+++ b/tests/ThemePlayground/res/values-en-rGB/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE Theme Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Text Elements"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Colour Panels"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Dialogues"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Change configuration (Day/Night)"</string>
+ <string name="apply" msgid="7165796721764564035">"Apply"</string>
+ <string name="widgets" msgid="2335373195144254853">"Widgets"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Paged List View"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Tick box"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Toggle Switch"</string>
+ <string name="reset" msgid="8400557536601938969">"Reset"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Progress Bar"</string>
+ <string name="background_name" msgid="2753485007335630418">"Set background colour:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Apply Themes"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Theme Name:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Chooser Activity"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-en-rIN/strings.xml b/tests/ThemePlayground/res/values-en-rIN/strings.xml
new file mode 100644
index 0000000..749ab14
--- /dev/null
+++ b/tests/ThemePlayground/res/values-en-rIN/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE Theme Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Text Elements"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Colour Panels"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Dialogues"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Change configuration (Day/Night)"</string>
+ <string name="apply" msgid="7165796721764564035">"Apply"</string>
+ <string name="widgets" msgid="2335373195144254853">"Widgets"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Paged List View"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Tick box"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Toggle Switch"</string>
+ <string name="reset" msgid="8400557536601938969">"Reset"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Progress Bar"</string>
+ <string name="background_name" msgid="2753485007335630418">"Set background colour:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Apply Themes"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Theme Name:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Chooser Activity"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-en-rXC/strings.xml b/tests/ThemePlayground/res/values-en-rXC/strings.xml
new file mode 100644
index 0000000..98617a6
--- /dev/null
+++ b/tests/ThemePlayground/res/values-en-rXC/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE Theme Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Text Elements"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Color Panels"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Dialogs"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Change configuration(Day/Night)"</string>
+ <string name="apply" msgid="7165796721764564035">"Apply"</string>
+ <string name="widgets" msgid="2335373195144254853">"Widgets"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Paged List View"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Checkbox"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Toggle Switch"</string>
+ <string name="reset" msgid="8400557536601938969">"Reset"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Progress Bar"</string>
+ <string name="background_name" msgid="2753485007335630418">"Set background color :"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Apply Themes"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Theme Name:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Chooser Activity"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-es-rUS/strings.xml b/tests/ThemePlayground/res/values-es-rUS/strings.xml
new file mode 100644
index 0000000..26d0a5b
--- /dev/null
+++ b/tests/ThemePlayground/res/values-es-rUS/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE Theme Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Elementos de texto"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Paneles de color"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Diálogos"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Cambiar configuración (día/noche)"</string>
+ <string name="apply" msgid="7165796721764564035">"Aplicar"</string>
+ <string name="widgets" msgid="2335373195144254853">"Widgets"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Vista de lista paginada"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Casilla de verificación"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Interruptor para activar o desactivar"</string>
+ <string name="reset" msgid="8400557536601938969">"Restablecer"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Barra de progreso"</string>
+ <string name="background_name" msgid="2753485007335630418">"Establecer color de fondo:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Aplicar temas"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Nombre del tema:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Actividad del selector"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-es/strings.xml b/tests/ThemePlayground/res/values-es/strings.xml
new file mode 100644
index 0000000..a7ddd35
--- /dev/null
+++ b/tests/ThemePlayground/res/values-es/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE Theme Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Elementos de texto"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Paneles de color"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Cuadros de diálogo"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Cambiar configuración (día/noche)"</string>
+ <string name="apply" msgid="7165796721764564035">"Aplicar"</string>
+ <string name="widgets" msgid="2335373195144254853">"Widgets"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Lista de páginas"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Casilla"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Interruptor"</string>
+ <string name="reset" msgid="8400557536601938969">"Restablecer"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Barra de progreso"</string>
+ <string name="background_name" msgid="2753485007335630418">"Definir color de fondo:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Aplicar temas"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Nombre del tema:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Actividad del selector"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-et/strings.xml b/tests/ThemePlayground/res/values-et/strings.xml
new file mode 100644
index 0000000..c7581be
--- /dev/null
+++ b/tests/ThemePlayground/res/values-et/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE teema Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Tekstielemendid"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Värvipaneelid"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Dialoogid"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Seadistamise muutmine (päev/öö)"</string>
+ <string name="apply" msgid="7165796721764564035">"Rakendamine"</string>
+ <string name="widgets" msgid="2335373195144254853">"Vidinad"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Lehe loend"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Märkeruut"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Lüliti"</string>
+ <string name="reset" msgid="8400557536601938969">"Lähtestamine"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Edenemisriba"</string>
+ <string name="background_name" msgid="2753485007335630418">"Taustavärvi määramine:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Teemade rakendamine"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Teema nimi:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Valija tegevus"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-eu/strings.xml b/tests/ThemePlayground/res/values-eu/strings.xml
new file mode 100644
index 0000000..ed5cbc9
--- /dev/null
+++ b/tests/ThemePlayground/res/values-eu/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE Theme Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Testu-elementuak"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Kolore-panelak"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Leihoak"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Aldatu konfigurazioa (eguna/gaua)"</string>
+ <string name="apply" msgid="7165796721764564035">"Aplikatu"</string>
+ <string name="widgets" msgid="2335373195144254853">"Widgetak"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Zerrenda orrialdekatuaren ikuspegia"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Kontrol-laukia"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Etengailua"</string>
+ <string name="reset" msgid="8400557536601938969">"Berrezarri"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Garapen-barra"</string>
+ <string name="background_name" msgid="2753485007335630418">"Ezarri atzeko planoko kolorea:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Aplikatu gaiak"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Gaiaren izena:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Hautatzailearen jarduerak"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-fa/strings.xml b/tests/ThemePlayground/res/values-fa/strings.xml
new file mode 100644
index 0000000..165830f
--- /dev/null
+++ b/tests/ThemePlayground/res/values-fa/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE Theme Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"عناصر نوشتار"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"پانلهای رنگ"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"کادرهای گفتگو"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"تغییر پیکربندی (روز/شب)"</string>
+ <string name="apply" msgid="7165796721764564035">"اعمال"</string>
+ <string name="widgets" msgid="2335373195144254853">"ابزارکها"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"نمای فهرست صفحهبندیشده"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"کادر تأیید"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"سوئیچ روشن/خاموش کردن"</string>
+ <string name="reset" msgid="8400557536601938969">"بازنشانی"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"نوار پیشرفت"</string>
+ <string name="background_name" msgid="2753485007335630418">"تنظیم رنگ پسزمینه:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"اعمال طرح زمینه"</string>
+ <string name="theme_name" msgid="8750875004662195520">"نام طرح زمینه:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"فعالیت انتخابکننده"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-fi/strings.xml b/tests/ThemePlayground/res/values-fi/strings.xml
new file mode 100644
index 0000000..86e6b9a
--- /dev/null
+++ b/tests/ThemePlayground/res/values-fi/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE Theme Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Tekstielementit"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Väripaneelit"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Valintaikkunat"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Vaihda tilaa (päivä/yö)"</string>
+ <string name="apply" msgid="7165796721764564035">"Käytä"</string>
+ <string name="widgets" msgid="2335373195144254853">"Widgetit"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Sivuiksi jaettu luettelonäkymä"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Valintaruutu"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Päälle/pois-valitsin"</string>
+ <string name="reset" msgid="8400557536601938969">"Nollaa"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Etenemispalkki"</string>
+ <string name="background_name" msgid="2753485007335630418">"Aseta taustan väri:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Käytä teemoja"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Teeman nimi:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Toiminnon valitsin"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-fr-rCA/strings.xml b/tests/ThemePlayground/res/values-fr-rCA/strings.xml
new file mode 100644
index 0000000..36937e8
--- /dev/null
+++ b/tests/ThemePlayground/res/values-fr-rCA/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"Thème AAE Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Éléments de texte"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Panneaux de couleur"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Boîtes de dialogue"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Modifier la configuration (jour/nuit)"</string>
+ <string name="apply" msgid="7165796721764564035">"Appliquer"</string>
+ <string name="widgets" msgid="2335373195144254853">"Widgets"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Liste paginée"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Case à cocher"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Basculer le commutateur"</string>
+ <string name="reset" msgid="8400557536601938969">"Réinitialiser"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Barre de progression"</string>
+ <string name="background_name" msgid="2753485007335630418">"Définir la couleur de l\'arrière-plan :"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Appliquer des thèmes"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Nom du thème :"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Activité de l\'outil de sélection"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-fr/strings.xml b/tests/ThemePlayground/res/values-fr/strings.xml
new file mode 100644
index 0000000..17981ed
--- /dev/null
+++ b/tests/ThemePlayground/res/values-fr/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE Theme Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Éléments de texte"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Panneaux colorés"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Boîtes de dialogue"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Changer de configuration (Jour/Nuit)"</string>
+ <string name="apply" msgid="7165796721764564035">"Appliquer"</string>
+ <string name="widgets" msgid="2335373195144254853">"Widgets"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Vue Liste"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Case à cocher"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Déplacer le curseur"</string>
+ <string name="reset" msgid="8400557536601938969">"Réinitialiser"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Barre de progression"</string>
+ <string name="background_name" msgid="2753485007335630418">"Définir la couleur de l\'arrière-plan :"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Appliquer les thèmes"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Nom du thème :"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Activité de l\'outil de sélection"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-gl/strings.xml b/tests/ThemePlayground/res/values-gl/strings.xml
new file mode 100644
index 0000000..70ca1f5
--- /dev/null
+++ b/tests/ThemePlayground/res/values-gl/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE Theme Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Elementos de texto"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Paneis de cores"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Cadros de diálogo"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Cambiar configuración (día/noite)"</string>
+ <string name="apply" msgid="7165796721764564035">"Aplicar"</string>
+ <string name="widgets" msgid="2335373195144254853">"Widgets"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Vista de lista de páxinas"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Caixa de verificación"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Activar/desactivar interruptor"</string>
+ <string name="reset" msgid="8400557536601938969">"Restablecer"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Barra de progreso"</string>
+ <string name="background_name" msgid="2753485007335630418">"Definir cor de fondo:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Aplicar temas"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Nome do tema:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Actividade do selector"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-gu/strings.xml b/tests/ThemePlayground/res/values-gu/strings.xml
new file mode 100644
index 0000000..a08566f
--- /dev/null
+++ b/tests/ThemePlayground/res/values-gu/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE થીમનું પ્લેગ્રાઉન્ડ"</string>
+ <string name="text_elements" msgid="6678400827142549036">"ટેક્સ્ટના ઘટકો"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"રંગના પૅનલ"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"સંવાદો"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"ગોઠવણી બદલો (દિવસ/રાત્રિ)"</string>
+ <string name="apply" msgid="7165796721764564035">"લાગુ કરો"</string>
+ <string name="widgets" msgid="2335373195144254853">"વિજેટ"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"પેજનું સૂચિ દૃશ્ય"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"ચેકબૉક્સ"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"સ્વિચ ટૉગલ કરો"</string>
+ <string name="reset" msgid="8400557536601938969">"રીસેટ કરો"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"પ્રોગ્રેસ બાર"</string>
+ <string name="background_name" msgid="2753485007335630418">"બૅકગ્રાઉન્ડનો રંગ સેટ કરો:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"થીમ લાગુ કરો"</string>
+ <string name="theme_name" msgid="8750875004662195520">"થીમનું નામ:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"પસંદકર્તા પ્રવૃત્તિ"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-hi/strings.xml b/tests/ThemePlayground/res/values-hi/strings.xml
new file mode 100644
index 0000000..1dccee4
--- /dev/null
+++ b/tests/ThemePlayground/res/values-hi/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE थीम प्लेग्राउंड"</string>
+ <string name="text_elements" msgid="6678400827142549036">"लेख ऐलीमेंंट"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"रंग पैनल"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"संवाद"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"कॉन्फ़िगरेशन बदलें(दिन/रात)"</string>
+ <string name="apply" msgid="7165796721764564035">"लागू करें"</string>
+ <string name="widgets" msgid="2335373195144254853">"विजेट"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"पेज की गई सूची"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"चेकबॉक्स"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"टॉगल स्विच"</string>
+ <string name="reset" msgid="8400557536601938969">"रीसेट करें"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"प्रगति बार"</string>
+ <string name="background_name" msgid="2753485007335630418">"बैकग्राउंड का रंग सेट करें :"</string>
+ <string name="default_themes" msgid="6668869906906304331">"थीम लागू करें"</string>
+ <string name="theme_name" msgid="8750875004662195520">"थीम का नाम:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"चुनने की गतिविधि"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-hr/strings.xml b/tests/ThemePlayground/res/values-hr/strings.xml
new file mode 100644
index 0000000..1f5d533
--- /dev/null
+++ b/tests/ThemePlayground/res/values-hr/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"Playground s AAE temama"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Tekstni elementi"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Ploče u boji"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Dijaloški okviri"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Promijenite konfiguraciju (dan/noć)"</string>
+ <string name="apply" msgid="7165796721764564035">"Primijeni"</string>
+ <string name="widgets" msgid="2335373195144254853">"Widgeti"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Popis po stranicama"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Potvrdni okvir"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Prekidač za prebacivanje"</string>
+ <string name="reset" msgid="8400557536601938969">"Vrati na zadano"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Traka napretka"</string>
+ <string name="background_name" msgid="2753485007335630418">"Postavite boju pozadine:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Primijeni teme"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Naziv teme:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Aktivnost birača"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-hu/strings.xml b/tests/ThemePlayground/res/values-hu/strings.xml
new file mode 100644
index 0000000..f59015b
--- /dev/null
+++ b/tests/ThemePlayground/res/values-hu/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE-témapróbálgató"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Szöveges elemek"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Színválasztó panelek"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Párbeszédpanelek"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Konfiguráció módosítása (nappal/este)"</string>
+ <string name="apply" msgid="7165796721764564035">"Alkalmaz"</string>
+ <string name="widgets" msgid="2335373195144254853">"Modulok"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Oldalakra bontott listanézet"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Jelölőnégyzet"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Kapcsológomb"</string>
+ <string name="reset" msgid="8400557536601938969">"Visszaállítás"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Folyamatjelző"</string>
+ <string name="background_name" msgid="2753485007335630418">"Háttérszín beállítása:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Témák alkalmazása"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Téma neve:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Választótevékenység"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-hy/strings.xml b/tests/ThemePlayground/res/values-hy/strings.xml
new file mode 100644
index 0000000..e291b51
--- /dev/null
+++ b/tests/ThemePlayground/res/values-hy/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE Theme Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Տեքստային տարրեր"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Գունային վահանակներ"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Երկխոսության պատուհաններ"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Փոխել կազմաձևը (Օր/Գիշեր)"</string>
+ <string name="apply" msgid="7165796721764564035">"Կիրառել"</string>
+ <string name="widgets" msgid="2335373195144254853">"Վիջեթներ"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Էջակալված ցանկի տեսքով"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Նշավանդակ"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Փոխարկիչ"</string>
+ <string name="reset" msgid="8400557536601938969">"Վերակայել"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Ընթացագոտի"</string>
+ <string name="background_name" msgid="2753485007335630418">"Նշեք ֆոնի գույնը՝"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Կիրառել թեմաները"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Թեմայի անվանումը՝"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Ընտրիչների գործողություններ"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-in/strings.xml b/tests/ThemePlayground/res/values-in/strings.xml
new file mode 100644
index 0000000..35ed313
--- /dev/null
+++ b/tests/ThemePlayground/res/values-in/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"Playground Tema AAE"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Elemen Teks"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Panel Warna"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Dialog"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Ubah konfigurasi(Siang/Malam)"</string>
+ <string name="apply" msgid="7165796721764564035">"Terapkan"</string>
+ <string name="widgets" msgid="2335373195144254853">"Widget"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Daftar Dalam Halaman"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Kotak centang"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Aktifkan Tombol"</string>
+ <string name="reset" msgid="8400557536601938969">"Setel ulang"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Status Progres"</string>
+ <string name="background_name" msgid="2753485007335630418">"Setel warna latar belakang :"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Terapkan Tema"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Nama Tema:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Aktivitas Alat Pilih"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-is/strings.xml b/tests/ThemePlayground/res/values-is/strings.xml
new file mode 100644
index 0000000..d234bd3
--- /dev/null
+++ b/tests/ThemePlayground/res/values-is/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE-þema Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Textaeiningar"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Litaspjöld"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Gluggar"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Breyta stillingu (dagur/nótt)"</string>
+ <string name="apply" msgid="7165796721764564035">"Nota"</string>
+ <string name="widgets" msgid="2335373195144254853">"Græjur"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Listayfirlit á síðum"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Gátreitur"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Breyta rofa"</string>
+ <string name="reset" msgid="8400557536601938969">"Endurstilla"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Framvindustika"</string>
+ <string name="background_name" msgid="2753485007335630418">"Stilla bakgrunnslit:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Nota þemu"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Heiti þema:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Valaðgerð"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-it/strings.xml b/tests/ThemePlayground/res/values-it/strings.xml
new file mode 100644
index 0000000..9f48fc4
--- /dev/null
+++ b/tests/ThemePlayground/res/values-it/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE Theme Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Elementi di testo"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Riquadri dei colori"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Finestre di dialogo"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Modifica configurazione (Giorno/Notte)"</string>
+ <string name="apply" msgid="7165796721764564035">"Applica"</string>
+ <string name="widgets" msgid="2335373195144254853">"Widget"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Paged List View"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Casella di controllo"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Toggle Switch"</string>
+ <string name="reset" msgid="8400557536601938969">"Reimposta"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Barra di avanzamento"</string>
+ <string name="background_name" msgid="2753485007335630418">"Imposta colore di sfondo:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Applica temi"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Nome del tema:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Attività di scelta"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-iw/strings.xml b/tests/ThemePlayground/res/values-iw/strings.xml
new file mode 100644
index 0000000..ec0ca34
--- /dev/null
+++ b/tests/ThemePlayground/res/values-iw/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"Playground לעיצוב AAE"</string>
+ <string name="text_elements" msgid="6678400827142549036">"רכיבי טקסט"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"חלוניות צבע"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"תיבות דו-שיח"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"שינוי הגדרה (יום/לילה)"</string>
+ <string name="apply" msgid="7165796721764564035">"החלה"</string>
+ <string name="widgets" msgid="2335373195144254853">"רכיבי ווידג\'ט"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"תצוגת רשימה לפי דפים"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"תיבת סימון"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"החלפת מצב למתג"</string>
+ <string name="reset" msgid="8400557536601938969">"איפוס"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"סרגל התקדמות"</string>
+ <string name="background_name" msgid="2753485007335630418">"הגדרת צבע רקע :"</string>
+ <string name="default_themes" msgid="6668869906906304331">"החלת עיצובים"</string>
+ <string name="theme_name" msgid="8750875004662195520">"שם העיצוב:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"פעילות בוחר"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-ja/strings.xml b/tests/ThemePlayground/res/values-ja/strings.xml
new file mode 100644
index 0000000..6163e21
--- /dev/null
+++ b/tests/ThemePlayground/res/values-ja/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE Theme Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"テキスト要素"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"色パネル"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"ダイアログ"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"設定の変更(日中 / 夜間)"</string>
+ <string name="apply" msgid="7165796721764564035">"適用"</string>
+ <string name="widgets" msgid="2335373195144254853">"ウィジェット"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"ページング リスト表示"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"チェックボックス"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"切り替えスイッチ"</string>
+ <string name="reset" msgid="8400557536601938969">"リセット"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"進行状況バー"</string>
+ <string name="background_name" msgid="2753485007335630418">"背景色の設定:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"テーマの適用"</string>
+ <string name="theme_name" msgid="8750875004662195520">"テーマ名:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"チューザ アクティビティ"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-ka/strings.xml b/tests/ThemePlayground/res/values-ka/strings.xml
new file mode 100644
index 0000000..4c665f1
--- /dev/null
+++ b/tests/ThemePlayground/res/values-ka/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE თემიანი სათამაშო მოედანი"</string>
+ <string name="text_elements" msgid="6678400827142549036">"ტექსტური ელემენტები"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"ფერთა პანელები"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"დიალოგები"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"კონფიგურაციის შეცვლა (დღე/რამე)"</string>
+ <string name="apply" msgid="7165796721764564035">"მისადაგება"</string>
+ <string name="widgets" msgid="2335373195144254853">"ვიჯეტები"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"გვერდებიანი სიის ხედი"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"მოსანიშნი ველი"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"გადართვა"</string>
+ <string name="reset" msgid="8400557536601938969">"გადაყენება"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"პროგრესის ზოლი"</string>
+ <string name="background_name" msgid="2753485007335630418">"ფონის ფერის დაყენება:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"თემების მისადაგება"</string>
+ <string name="theme_name" msgid="8750875004662195520">"თემის სახელი:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"ამომრჩევის აქტივობა"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-kk/strings.xml b/tests/ThemePlayground/res/values-kk/strings.xml
new file mode 100644
index 0000000..5ad2927
--- /dev/null
+++ b/tests/ThemePlayground/res/values-kk/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE Theme Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Мәтін элементтері"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Түс панельдері"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Диалогтер"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Конфигурацияны өзгерту (күн/түн)"</string>
+ <string name="apply" msgid="7165796721764564035">"Қолдану"</string>
+ <string name="widgets" msgid="2335373195144254853">"Виджеттер"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Беттерге бөлінген тізімді көру"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Құсбелгі ұяшығы"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Ауыстырып қосу"</string>
+ <string name="reset" msgid="8400557536601938969">"Бастапқы күйге қайтару"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Орындалу барысының жолағы"</string>
+ <string name="background_name" msgid="2753485007335630418">"Фон түсін орнату:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Тақырыптарды қолдану"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Тақырып атауы:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Таңдау құралы әрекеті"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-km/strings.xml b/tests/ThemePlayground/res/values-km/strings.xml
new file mode 100644
index 0000000..48ae361
--- /dev/null
+++ b/tests/ThemePlayground/res/values-km/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE Theme Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"ធាតុអត្ថបទ"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"ផ្ទាំងពណ៌"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"ប្រអប់បញ្ចូល"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"ប្ដូរការកំណត់រចនាសម្ព័ន្ធ(ថ្ងៃ/យប់)"</string>
+ <string name="apply" msgid="7165796721764564035">"អនុវត្ត"</string>
+ <string name="widgets" msgid="2335373195144254853">"ធាតុក្រាហ្វិក"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"ទិដ្ឋភាពបញ្ជីដែលបានមើល"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"ប្រអប់ធីក"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"ប៊ូតុងបិទបើក"</string>
+ <string name="reset" msgid="8400557536601938969">"កំណត់ឡើងវិញ"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"របារដំណើរការ"</string>
+ <string name="background_name" msgid="2753485007335630418">"កំណត់ពណ៌ផ្ទៃខាងក្រោយ៖"</string>
+ <string name="default_themes" msgid="6668869906906304331">"ប្រើរចនាប័ទ្ម"</string>
+ <string name="theme_name" msgid="8750875004662195520">"ឈ្មោះរចនាប័ទ្ម៖"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"ជ្រើសរើសសកម្មភាព"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-ko/strings.xml b/tests/ThemePlayground/res/values-ko/strings.xml
new file mode 100644
index 0000000..7ab75a3
--- /dev/null
+++ b/tests/ThemePlayground/res/values-ko/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE Theme Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"텍스트 요소"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"색상 패널"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"대화상자"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"구성 변경(낮/밤)"</string>
+ <string name="apply" msgid="7165796721764564035">"적용"</string>
+ <string name="widgets" msgid="2335373195144254853">"위젯"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"페이지 목록"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"체크박스"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"스위치 전환"</string>
+ <string name="reset" msgid="8400557536601938969">"재설정"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"진행률 표시줄"</string>
+ <string name="background_name" msgid="2753485007335630418">"배경화면 색상 설정:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"테마 적용"</string>
+ <string name="theme_name" msgid="8750875004662195520">"테마 이름:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"선택기 동작"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-ky/strings.xml b/tests/ThemePlayground/res/values-ky/strings.xml
new file mode 100644
index 0000000..3d4aa82
--- /dev/null
+++ b/tests/ThemePlayground/res/values-ky/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE Theme Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Тексттин элементтери"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Түс панелдери"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Диалогдор"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Конфигурацияны өзгөртүү (Күн/Түн)"</string>
+ <string name="apply" msgid="7165796721764564035">"Колдонуу"</string>
+ <string name="widgets" msgid="2335373195144254853">"Виджеттер"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Paged List View"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Белгилөө кутучасы"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Toggle Switch"</string>
+ <string name="reset" msgid="8400557536601938969">"Баштапкы абалга келтирүү"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Аткаруу көрсөткүчү"</string>
+ <string name="background_name" msgid="2753485007335630418">"Фондун түсүн коюу:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Темаларды колдонуу"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Теманын аталышы:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Тандагычтын аракеттери"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-lo/strings.xml b/tests/ThemePlayground/res/values-lo/strings.xml
new file mode 100644
index 0000000..20ff0cc
--- /dev/null
+++ b/tests/ThemePlayground/res/values-lo/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"ສະໜາມຕົບແຕ່ງຮູບແບບສີສັນ AAE"</string>
+ <string name="text_elements" msgid="6678400827142549036">"ອົງປະກອບຂໍ້ຄວາມ"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"ແຜງສີ"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"ກ່ອງຂໍ້ຄວາມ"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"ປ່ຽນການກຳນົດຄ່າ (ກາງເວັນ/ກາງຄືນ)"</string>
+ <string name="apply" msgid="7165796721764564035">"ນຳໃຊ້"</string>
+ <string name="widgets" msgid="2335373195144254853">"ວິດເຈັດ"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"ມຸມມອງລາຍການເປັນໜ້າ"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"ກ່ອງເຄື່ອງໝາຍ"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"ປຸ່ມປິດເປີດ"</string>
+ <string name="reset" msgid="8400557536601938969">"ຣີເຊັດ"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"ແຖບຄວາມຄືບໜ້າ"</string>
+ <string name="background_name" msgid="2753485007335630418">"ຕັ້ງຄ່າສີພື້ນຫຼັງ :"</string>
+ <string name="default_themes" msgid="6668869906906304331">"ນຳໃຊ້ຮູບແບບສີສັນ"</string>
+ <string name="theme_name" msgid="8750875004662195520">"ຊື່ຮູບແບບສີສັນ:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"ການເຄື່ອນໄຫວຂອງຜູ້ເລືອກ"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-lt/strings.xml b/tests/ThemePlayground/res/values-lt/strings.xml
new file mode 100644
index 0000000..05cadab
--- /dev/null
+++ b/tests/ThemePlayground/res/values-lt/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE Theme Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Teksto elementai"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Spalvų skydeliai"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Dialogų langai"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Pakeisti konfigūraciją (diena / naktis)"</string>
+ <string name="apply" msgid="7165796721764564035">"Taikyti"</string>
+ <string name="widgets" msgid="2335373195144254853">"Valdikliai"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Į puslapius suskirstytas sąrašo rodinys"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Žymimasis laukelis"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Perjungti jungiklį"</string>
+ <string name="reset" msgid="8400557536601938969">"Nustatyti iš naujo"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Eigos juosta"</string>
+ <string name="background_name" msgid="2753485007335630418">"Nustatyti fono spalvą:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Taikyti temas"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Temos pavadinimas:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Parinkiklio veikla"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-lv/strings.xml b/tests/ThemePlayground/res/values-lv/strings.xml
new file mode 100644
index 0000000..1336171
--- /dev/null
+++ b/tests/ThemePlayground/res/values-lv/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE Theme Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Teksta elementi"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Krāsu panelis"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Dialoglodziņi"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Mainīt konfigurāciju (diena/nakts)"</string>
+ <string name="apply" msgid="7165796721764564035">"Lietot"</string>
+ <string name="widgets" msgid="2335373195144254853">"Logrīki"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Saraksta skats ar lapām"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Izvēles rūtiņa"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Pārslēgt slēdzi"</string>
+ <string name="reset" msgid="8400557536601938969">"Atiestatīt"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Norises josla"</string>
+ <string name="background_name" msgid="2753485007335630418">"Iestatiet fona krāsu:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Lietot motīvus"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Motīva nosaukums:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Atlasītāja darbība"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-mk/strings.xml b/tests/ThemePlayground/res/values-mk/strings.xml
new file mode 100644
index 0000000..3c298a8
--- /dev/null
+++ b/tests/ThemePlayground/res/values-mk/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE Theme Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Текстуални елементи"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Табли со бои"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Дијалози"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Смени ја конфигурацијата (ден/ноќ)"</string>
+ <string name="apply" msgid="7165796721764564035">"Примени"</string>
+ <string name="widgets" msgid="2335373195144254853">"Виџети"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Приказ на список за прелистување"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Поле за избор"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Копче за вклучување/исклучување"</string>
+ <string name="reset" msgid="8400557536601938969">"Ресетирај"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Лента за напредок"</string>
+ <string name="background_name" msgid="2753485007335630418">"Поставете боја на заднината:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Примени ги темите"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Име на тема:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Активност на избирачот"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-mn/strings.xml b/tests/ThemePlayground/res/values-mn/strings.xml
new file mode 100644
index 0000000..1014202
--- /dev/null
+++ b/tests/ThemePlayground/res/values-mn/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE загварын самбар"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Текстийн элемент"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Өнгөний хавтан"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Харилцах цонх"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Тохируулгыг өөрчлөх(Өдөр/Шөнө)"</string>
+ <string name="apply" msgid="7165796721764564035">"Ашиглах"</string>
+ <string name="widgets" msgid="2335373195144254853">"Жижиг хэрэгсэл"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Хуудас болгосон жагсаалт"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Checkbox"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Унтраалгыг унтраах/асаах"</string>
+ <string name="reset" msgid="8400557536601938969">"Шинэчлэх"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Явцын заалт"</string>
+ <string name="background_name" msgid="2753485007335630418">"Дэвсгэр өнгийг тохируулах :"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Загварыг ашиглах"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Загварын нэр:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Сонгогчийн үйл ажиллагаа"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-ms/strings.xml b/tests/ThemePlayground/res/values-ms/strings.xml
new file mode 100644
index 0000000..d12763e
--- /dev/null
+++ b/tests/ThemePlayground/res/values-ms/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"Taman Permainan Tema AAE"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Elemen Teks"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Panel Warna"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Dialog"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Tukar konfigurasi (Siang/Malam)"</string>
+ <string name="apply" msgid="7165796721764564035">"Gunakan"</string>
+ <string name="widgets" msgid="2335373195144254853">"Widget"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Paparan Senarai Berhalaman"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Kotak pilihan"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Togol Suis"</string>
+ <string name="reset" msgid="8400557536601938969">"Tetapkan semula"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Bar Kemajuan"</string>
+ <string name="background_name" msgid="2753485007335630418">"Tetapkan warna latar belakang :"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Gunakan Tema"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Nama Tema::"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Aktiviti Pemilih"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-my/strings.xml b/tests/ThemePlayground/res/values-my/strings.xml
new file mode 100644
index 0000000..2363586
--- /dev/null
+++ b/tests/ThemePlayground/res/values-my/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE Theme Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"စာသား အစိတ်အပိုင်းများ"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"အရောင်အကန့်များ"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"ဒိုင်ယာလော့ဂ်များ"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"စီစဉ်သတ်မှတ်မှု(နေ့/ည) ပြောင်းရန်"</string>
+ <string name="apply" msgid="7165796721764564035">"အသုံးပြုရန်"</string>
+ <string name="widgets" msgid="2335373195144254853">"ဝိဂျက်များ"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"စာမျက်နှာဖွဲ့ထားသော စာရင်းပုံစံ မြင်ကွင်း"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"အမှတ်ခြစ်ရန် နေရာ"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"ပြောင်းရန် ခလုတ်"</string>
+ <string name="reset" msgid="8400557536601938969">"ပြင်ဆင်သတ်မှတ်ရန်"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"တိုးတက်မှုပြ ဘား"</string>
+ <string name="background_name" msgid="2753485007335630418">"နောက်ခံအရောင် သတ်မှတ်ရန် -"</string>
+ <string name="default_themes" msgid="6668869906906304331">"အပြင်အဆင်များ သတ်မှတ်ရန်"</string>
+ <string name="theme_name" msgid="8750875004662195520">"အပြင်အဆင် အမည်-"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"ရွေးချယ်မှုစနစ် လုပ်ဆောင်ချက်"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-nb/strings.xml b/tests/ThemePlayground/res/values-nb/strings.xml
new file mode 100644
index 0000000..0a57d84
--- /dev/null
+++ b/tests/ThemePlayground/res/values-nb/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE Theme Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Tekstelementer"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Fargepaneler"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Dialogbokser"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Endre konfigurering (dag/natt)"</string>
+ <string name="apply" msgid="7165796721764564035">"Bruk"</string>
+ <string name="widgets" msgid="2335373195144254853">"Moduler"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Paged List View"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Avmerkingsboks"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Bryter"</string>
+ <string name="reset" msgid="8400557536601938969">"Tilbakestill"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Fremdriftslinje"</string>
+ <string name="background_name" msgid="2753485007335630418">"Angi bakgrunnsfarge:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Bruk temaer"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Temanavn:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Velgeraktivitet"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-night/colors.xml b/tests/ThemePlayground/res/values-night/colors.xml
new file mode 100644
index 0000000..036beb3
--- /dev/null
+++ b/tests/ThemePlayground/res/values-night/colors.xml
@@ -0,0 +1,18 @@
+<?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>
+ <color name="widget_background">#1565c0</color>
+</resources>
diff --git a/tests/ThemePlayground/res/values-nl/strings.xml b/tests/ThemePlayground/res/values-nl/strings.xml
new file mode 100644
index 0000000..5a71bec
--- /dev/null
+++ b/tests/ThemePlayground/res/values-nl/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE Theme Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Tekstelementen"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Kleurpanelen"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Dialoogvensters"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Configuratie wijzigen (dag/nacht)"</string>
+ <string name="apply" msgid="7165796721764564035">"Toepassen"</string>
+ <string name="widgets" msgid="2335373195144254853">"Widgets"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Gepagineerde lijstweergave"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Selectievakje"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Schakelaar"</string>
+ <string name="reset" msgid="8400557536601938969">"Resetten"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Voortgangsbalk"</string>
+ <string name="background_name" msgid="2753485007335630418">"Achtergrondkleur instellen:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Thema\'s toepassen"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Naam thema:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Kiezeractiviteit"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-pl/strings.xml b/tests/ThemePlayground/res/values-pl/strings.xml
new file mode 100644
index 0000000..bffdb8d
--- /dev/null
+++ b/tests/ThemePlayground/res/values-pl/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE Theme Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Elementy tekstowe"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Panele kolorów"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Okna"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Zmień konfigurację (dzień/noc)"</string>
+ <string name="apply" msgid="7165796721764564035">"Zastosuj"</string>
+ <string name="widgets" msgid="2335373195144254853">"Widżety"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Widok listy z podziałem na strony"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Pole wyboru"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Przełącz"</string>
+ <string name="reset" msgid="8400557536601938969">"Resetuj"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Pasek postępu"</string>
+ <string name="background_name" msgid="2753485007335630418">"Ustaw kolor tła:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Zastosuj motywy"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Nazwa motywu:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Aktywność narzędzia wyboru"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-pt-rPT/strings.xml b/tests/ThemePlayground/res/values-pt-rPT/strings.xml
new file mode 100644
index 0000000..3b0fab6
--- /dev/null
+++ b/tests/ThemePlayground/res/values-pt-rPT/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE Theme Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Elementos de texto"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Painéis de cor"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Caixas de diálogo"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Alterar a configuração (dia/noite)"</string>
+ <string name="apply" msgid="7165796721764564035">"Aplicar"</string>
+ <string name="widgets" msgid="2335373195144254853">"Widgets"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Vista de lista paginada"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Caixa de verificação"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Interruptor ativar/desativar"</string>
+ <string name="reset" msgid="8400557536601938969">"Repor"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Barra de progresso"</string>
+ <string name="background_name" msgid="2753485007335630418">"Defina a cor de fundo:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Aplicar temas"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Nome do tema:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Atividade do selecionador"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-pt/strings.xml b/tests/ThemePlayground/res/values-pt/strings.xml
new file mode 100644
index 0000000..03401d1
--- /dev/null
+++ b/tests/ThemePlayground/res/values-pt/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE Theme Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Elementos de texto"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Painéis de cor"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Caixas de diálogo"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Alterar configuração (dia/noite)"</string>
+ <string name="apply" msgid="7165796721764564035">"Aplicar"</string>
+ <string name="widgets" msgid="2335373195144254853">"Widgets"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Lista paginada"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Caixa de seleção"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Botão ativar/desativar"</string>
+ <string name="reset" msgid="8400557536601938969">"Redefinir"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Barra de progresso"</string>
+ <string name="background_name" msgid="2753485007335630418">"Definir cor do plano de fundo:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Aplicar temas"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Nome do tema:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Seletor de atividade"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-ro/strings.xml b/tests/ThemePlayground/res/values-ro/strings.xml
new file mode 100644
index 0000000..a5b8d09
--- /dev/null
+++ b/tests/ThemePlayground/res/values-ro/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"Playground cu tema AAE"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Elemente text"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Panouri de culori"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Dialoguri"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Schimbați configurația (zi/noapte)"</string>
+ <string name="apply" msgid="7165796721764564035">"Aplicați"</string>
+ <string name="widgets" msgid="2335373195144254853">"Widgeturi"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Listă cu pagini"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Casetă de selectare"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Comutator"</string>
+ <string name="reset" msgid="8400557536601938969">"Resetați"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Bară de progres"</string>
+ <string name="background_name" msgid="2753485007335630418">"Setați culoarea de fundal:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Aplicați teme"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Numele temei:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Activitatea selectorului"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-ru/strings.xml b/tests/ThemePlayground/res/values-ru/strings.xml
new file mode 100644
index 0000000..f6eeb50
--- /dev/null
+++ b/tests/ThemePlayground/res/values-ru/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE Theme Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Text Elements"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Color Panels"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Dialogs"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Change configuration(Day/Night)"</string>
+ <string name="apply" msgid="7165796721764564035">"Apply"</string>
+ <string name="widgets" msgid="2335373195144254853">"Widgets"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Paged List View"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Checkbox"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Toggle Switch"</string>
+ <string name="reset" msgid="8400557536601938969">"Reset"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Progress Bar"</string>
+ <string name="background_name" msgid="2753485007335630418">"Set background color :"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Apply Themes"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Theme Name:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Chooser Activity"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-si/strings.xml b/tests/ThemePlayground/res/values-si/strings.xml
new file mode 100644
index 0000000..d8d44fd
--- /dev/null
+++ b/tests/ThemePlayground/res/values-si/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE තේමා සෙල්ලම්පිටිය"</string>
+ <string name="text_elements" msgid="6678400827142549036">"පෙළ මූලිකාංග"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"වර්ණ පුවරු"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"සංවාද"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"වින්යාසය වෙනස් කරන්න (දිවා/රාත්රී)"</string>
+ <string name="apply" msgid="7165796721764564035">"යොදන්න"</string>
+ <string name="widgets" msgid="2335373195144254853">"විජට්ටු"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"පිටුමය ලැයිස්තු දසුන"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"තේරීම් කොටුව"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"ස්විචය ටොගල් කරන්න"</string>
+ <string name="reset" msgid="8400557536601938969">"යළි පිහිටුවන්න"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"ප්රගති තීරුව"</string>
+ <string name="background_name" msgid="2753485007335630418">"පසුබිම් වර්ණය සකසන්න :"</string>
+ <string name="default_themes" msgid="6668869906906304331">"තේමා යොදන්න"</string>
+ <string name="theme_name" msgid="8750875004662195520">"තේමාවේ නම:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"තෝරා ගන්නා ක්රියාකාරකම"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-sk/strings.xml b/tests/ThemePlayground/res/values-sk/strings.xml
new file mode 100644
index 0000000..4c2363c
--- /dev/null
+++ b/tests/ThemePlayground/res/values-sk/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE Theme Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Textové prvky"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Panely farieb"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Dialógové okná"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Zmeniť konfiguráciu (denný alebo nočný motív)"</string>
+ <string name="apply" msgid="7165796721764564035">"Použiť"</string>
+ <string name="widgets" msgid="2335373195144254853">"Miniaplikácie"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Zoznam so stránkami"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Začiarkavacie políčko"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Prepínač"</string>
+ <string name="reset" msgid="8400557536601938969">"Resetovať"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Ukazovateľ priebehu"</string>
+ <string name="background_name" msgid="2753485007335630418">"Nastaviť farbu pozadia:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Použiť motívy"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Názov motívu:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Aktivita výberu"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-sl/strings.xml b/tests/ThemePlayground/res/values-sl/strings.xml
new file mode 100644
index 0000000..89f42b6
--- /dev/null
+++ b/tests/ThemePlayground/res/values-sl/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"Preizkušanje teme AAE"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Besedilni elementi"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Barvne palete"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Pogovorna okna"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Spremeni konfiguracijo (dan/noč)"</string>
+ <string name="apply" msgid="7165796721764564035">"Uporabi"</string>
+ <string name="widgets" msgid="2335373195144254853">"Pripomočki"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Pogled ostranjenega seznama"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Potrditveno polje"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Preklopi stikalo"</string>
+ <string name="reset" msgid="8400557536601938969">"Ponastavi"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Vrstica napredovanja"</string>
+ <string name="background_name" msgid="2753485007335630418">"Nastavi barvo ozadja:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Uporabi teme"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Ime teme:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Dejavnost izbirnika"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-sq/strings.xml b/tests/ThemePlayground/res/values-sq/strings.xml
new file mode 100644
index 0000000..7522f55
--- /dev/null
+++ b/tests/ThemePlayground/res/values-sq/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"Playground i temës së AAE"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Elementet e tekstit"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Panelet e ngjyrave"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Dialogët"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Ndrysho konfigurimin (ditë/natë)"</string>
+ <string name="apply" msgid="7165796721764564035">"Zbato"</string>
+ <string name="widgets" msgid="2335373195144254853">"Miniaplikacionet"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Pamja listë me faqe"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Kutia e kontrollit"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Ndërro çelësin"</string>
+ <string name="reset" msgid="8400557536601938969">"Rivendos"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Shiriti i progresit"</string>
+ <string name="background_name" msgid="2753485007335630418">"Cakto ngjyrën e sfondit:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Zbato temat"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Emri i temës:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Aktiviteti i zgjedhësit"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-sr/strings.xml b/tests/ThemePlayground/res/values-sr/strings.xml
new file mode 100644
index 0000000..f6eeb50
--- /dev/null
+++ b/tests/ThemePlayground/res/values-sr/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE Theme Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Text Elements"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Color Panels"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Dialogs"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Change configuration(Day/Night)"</string>
+ <string name="apply" msgid="7165796721764564035">"Apply"</string>
+ <string name="widgets" msgid="2335373195144254853">"Widgets"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Paged List View"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Checkbox"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Toggle Switch"</string>
+ <string name="reset" msgid="8400557536601938969">"Reset"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Progress Bar"</string>
+ <string name="background_name" msgid="2753485007335630418">"Set background color :"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Apply Themes"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Theme Name:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Chooser Activity"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-sv/strings.xml b/tests/ThemePlayground/res/values-sv/strings.xml
new file mode 100644
index 0000000..f6eeb50
--- /dev/null
+++ b/tests/ThemePlayground/res/values-sv/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE Theme Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Text Elements"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Color Panels"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Dialogs"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Change configuration(Day/Night)"</string>
+ <string name="apply" msgid="7165796721764564035">"Apply"</string>
+ <string name="widgets" msgid="2335373195144254853">"Widgets"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Paged List View"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Checkbox"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Toggle Switch"</string>
+ <string name="reset" msgid="8400557536601938969">"Reset"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Progress Bar"</string>
+ <string name="background_name" msgid="2753485007335630418">"Set background color :"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Apply Themes"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Theme Name:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Chooser Activity"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-sw/strings.xml b/tests/ThemePlayground/res/values-sw/strings.xml
new file mode 100644
index 0000000..c40ec86
--- /dev/null
+++ b/tests/ThemePlayground/res/values-sw/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"Playground yenye Mandhari AAE"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Vipengele vya Maandishi"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Vidirisha vyenye Rangi"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Vidirisha"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Badilisha mipangilio (Mchana/Usiku)"</string>
+ <string name="apply" msgid="7165796721764564035">"Tumia"</string>
+ <string name="widgets" msgid="2335373195144254853">"Wijeti"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Mwonekano wa Orodha yenye Kurasa"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Kisanduku cha kuteua"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Geuza Swichi"</string>
+ <string name="reset" msgid="8400557536601938969">"Badilisha"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Upau wa Shughuli"</string>
+ <string name="background_name" msgid="2753485007335630418">"Weka rangi ya mandhari:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Weka Mandhari"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Jina la Mandhari:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Shughuli za Kiteuzi"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-te/strings.xml b/tests/ThemePlayground/res/values-te/strings.xml
new file mode 100644
index 0000000..2e588a8
--- /dev/null
+++ b/tests/ThemePlayground/res/values-te/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE థీమ్ ప్లేగ్రౌండ్"</string>
+ <string name="text_elements" msgid="6678400827142549036">"వచన సంబంధిత అంశాలు"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"రంగు ప్యానెల్లు"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"డైలాగ్లు"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"కాన్ఫిగరేషన్ మార్చు(పగలు/రాత్రి)"</string>
+ <string name="apply" msgid="7165796721764564035">"వర్తింపజేయి"</string>
+ <string name="widgets" msgid="2335373195144254853">"విడ్జెట్లు"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"పేజీలలో జాబితా వీక్షణ"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"చెక్బాక్స్"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"టోగుల్ స్విచ్"</string>
+ <string name="reset" msgid="8400557536601938969">"రీసెట్ చేయి"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"ప్రోగ్రెస్ బార్"</string>
+ <string name="background_name" msgid="2753485007335630418">"నేపథ్య రంగును సెట్ చేయడం:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"థీమ్లు వర్తింపజేయి"</string>
+ <string name="theme_name" msgid="8750875004662195520">"థీమ్ పేరు:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"ఎంచుకునే వారి కార్యకలాపం"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-th/strings.xml b/tests/ThemePlayground/res/values-th/strings.xml
new file mode 100644
index 0000000..5e96d1b
--- /dev/null
+++ b/tests/ThemePlayground/res/values-th/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE Theme Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"องค์ประกอบข้อความ"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"แผงสี"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"กล่องโต้ตอบ"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"เปลี่ยนการกำหนดค่า (กลางวัน/กลางคืน)"</string>
+ <string name="apply" msgid="7165796721764564035">"ใช้"</string>
+ <string name="widgets" msgid="2335373195144254853">"วิดเจ็ต"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Paged List View"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"ช่องทำเครื่องหมาย"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"สวิตช์สลับ"</string>
+ <string name="reset" msgid="8400557536601938969">"รีเซ็ต"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"แถบความคืบหน้า"</string>
+ <string name="background_name" msgid="2753485007335630418">"ตั้งค่าสีพื้นหลัง:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"ใช้ธีม"</string>
+ <string name="theme_name" msgid="8750875004662195520">"ชื่อธีม:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"กิจกรรมตัวเลือก"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-tl/strings.xml b/tests/ThemePlayground/res/values-tl/strings.xml
new file mode 100644
index 0000000..2d8ebf2
--- /dev/null
+++ b/tests/ThemePlayground/res/values-tl/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"Playground na may Tema ng AAE"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Mga Element ng Text"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Mga Panel ng Kulay"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Mga Dialog"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Palitan ang configuration(Araw/Gabi)"</string>
+ <string name="apply" msgid="7165796721764564035">"Ilapat"</string>
+ <string name="widgets" msgid="2335373195144254853">"Mga Widget"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"May Page na View ng Listahan"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Checkbox"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Switch ng Toggle"</string>
+ <string name="reset" msgid="8400557536601938969">"I-reset"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Progress Bar"</string>
+ <string name="background_name" msgid="2753485007335630418">"Itakda ang kulay ng background:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Ilapat ang Mga Tema"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Pangalan ng Tema:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Aktibidad ng Tagapili"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-tr/strings.xml b/tests/ThemePlayground/res/values-tr/strings.xml
new file mode 100644
index 0000000..48c74ce
--- /dev/null
+++ b/tests/ThemePlayground/res/values-tr/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE Temalı Oyun Alanı"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Metin Öğeleri"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Renk Panelleri"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"İletişim Kutuları"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Yapılandırmayı değiştir (Gündüz/Gece)"</string>
+ <string name="apply" msgid="7165796721764564035">"Uygula"</string>
+ <string name="widgets" msgid="2335373195144254853">"Widget\'lar"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Sayfalı Liste Görünümü"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Onay Kutusu"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Açma/Kapatma Anahtarı"</string>
+ <string name="reset" msgid="8400557536601938969">"Sıfırla"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"İlerleme Çubuğu"</string>
+ <string name="background_name" msgid="2753485007335630418">"Arka plan rengini ayarla:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Temaları Uygula"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Tema Adı:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Seçici Etkinliği"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-uk/strings.xml b/tests/ThemePlayground/res/values-uk/strings.xml
new file mode 100644
index 0000000..c39f961
--- /dev/null
+++ b/tests/ThemePlayground/res/values-uk/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE Theme Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Текстові елементи"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Панелі кольорів"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Вікна"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Змінити налаштування (день/ніч)"</string>
+ <string name="apply" msgid="7165796721764564035">"Застосувати"</string>
+ <string name="widgets" msgid="2335373195144254853">"Віджети"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Список зі сторінками"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Прапорець"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Перемкнути"</string>
+ <string name="reset" msgid="8400557536601938969">"Скинути"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Індикатор перебігу"</string>
+ <string name="background_name" msgid="2753485007335630418">"Налаштувати колір фону:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Застосувати теми"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Назва теми:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Активність вибору"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-ur/strings.xml b/tests/ThemePlayground/res/values-ur/strings.xml
new file mode 100644
index 0000000..bb1501f
--- /dev/null
+++ b/tests/ThemePlayground/res/values-ur/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE تھیم کا پلے گراؤںڈ"</string>
+ <string name="text_elements" msgid="6678400827142549036">"متن کے عناصر"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"رنگ کے پینلز"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"ڈائیلاگز"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"ترتیب تبدیل کریں(دن/رات)"</string>
+ <string name="apply" msgid="7165796721764564035">"لاگو کریں"</string>
+ <string name="widgets" msgid="2335373195144254853">"ویجیٹس"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"صفحہ والی فہرست کا منظر"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"چیک باکس"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"سوئچ ٹوگل کریں"</string>
+ <string name="reset" msgid="8400557536601938969">"دوبارہ ترتیب دیں"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"پیش رفت بار"</string>
+ <string name="background_name" msgid="2753485007335630418">"پس منظر کا رنگ سیٹ کریں :"</string>
+ <string name="default_themes" msgid="6668869906906304331">"تھیمز لاگو کریں"</string>
+ <string name="theme_name" msgid="8750875004662195520">"تھیم کا نام:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"منتخب کنندہ کی سرگرمی"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-uz/strings.xml b/tests/ThemePlayground/res/values-uz/strings.xml
new file mode 100644
index 0000000..1606552
--- /dev/null
+++ b/tests/ThemePlayground/res/values-uz/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE mavzu oʻyingohi"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Matn elementlari"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Ranglar paneli"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Muloqot oynalari"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Konfiguratsiyani almashtirish (kun/tun)"</string>
+ <string name="apply" msgid="7165796721764564035">"Tatbiq etish"</string>
+ <string name="widgets" msgid="2335373195144254853">"Vidjetlar"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Sahifali roʻyxat"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Belgilash katakchasi"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Almashtirish"</string>
+ <string name="reset" msgid="8400557536601938969">"Asliga qaytarish"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Jarayon indikatori"</string>
+ <string name="background_name" msgid="2753485007335630418">"Fon rangini belgilash:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Mavzular tatbiq qilish"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Mavzu nomi:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Tanlagich harakatlari"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-vi/strings.xml b/tests/ThemePlayground/res/values-vi/strings.xml
new file mode 100644
index 0000000..9cf82ab
--- /dev/null
+++ b/tests/ThemePlayground/res/values-vi/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE Theme Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Phần tử văn bản"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Bảng màu"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Hộp thoại"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Thay đổi cấu hình (ngày/đêm)"</string>
+ <string name="apply" msgid="7165796721764564035">"Áp dụng"</string>
+ <string name="widgets" msgid="2335373195144254853">"Tiện ích"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Chế độ xem danh sách đã đánh số trang"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Hộp kiểm"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Toggle Switch"</string>
+ <string name="reset" msgid="8400557536601938969">"Đặt lại"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Thanh tiến trình"</string>
+ <string name="background_name" msgid="2753485007335630418">"Đặt màu nền:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Áp dụng chủ đề"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Tên chủ đề:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Hoạt động của người chọn"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-zh-rCN/strings.xml b/tests/ThemePlayground/res/values-zh-rCN/strings.xml
new file mode 100644
index 0000000..b02ab07
--- /dev/null
+++ b/tests/ThemePlayground/res/values-zh-rCN/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE Theme Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"文字元素"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"颜色面板"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"对话框"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"更改配置(日间/夜间)"</string>
+ <string name="apply" msgid="7165796721764564035">"应用"</string>
+ <string name="widgets" msgid="2335373195144254853">"微件"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"分页列表视图"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"复选框"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"切换开关"</string>
+ <string name="reset" msgid="8400557536601938969">"重置"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"进度条"</string>
+ <string name="background_name" msgid="2753485007335630418">"设置背景颜色:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"应用主题背景"</string>
+ <string name="theme_name" msgid="8750875004662195520">"主题背景名称:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"选择器活动"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-zh-rHK/strings.xml b/tests/ThemePlayground/res/values-zh-rHK/strings.xml
new file mode 100644
index 0000000..f6eeb50
--- /dev/null
+++ b/tests/ThemePlayground/res/values-zh-rHK/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE Theme Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Text Elements"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Color Panels"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Dialogs"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Change configuration(Day/Night)"</string>
+ <string name="apply" msgid="7165796721764564035">"Apply"</string>
+ <string name="widgets" msgid="2335373195144254853">"Widgets"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Paged List View"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Checkbox"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Toggle Switch"</string>
+ <string name="reset" msgid="8400557536601938969">"Reset"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Progress Bar"</string>
+ <string name="background_name" msgid="2753485007335630418">"Set background color :"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Apply Themes"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Theme Name:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Chooser Activity"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-zh-rTW/strings.xml b/tests/ThemePlayground/res/values-zh-rTW/strings.xml
new file mode 100644
index 0000000..4c7979a
--- /dev/null
+++ b/tests/ThemePlayground/res/values-zh-rTW/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"AAE Theme Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"文字元素"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"色彩面板"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"對話方塊"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"變更設定 (日間/夜間)"</string>
+ <string name="apply" msgid="7165796721764564035">"套用"</string>
+ <string name="widgets" msgid="2335373195144254853">"小工具"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"分頁清單檢視"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"核取方塊"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"切換按鈕"</string>
+ <string name="reset" msgid="8400557536601938969">"重設"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"進度列"</string>
+ <string name="background_name" msgid="2753485007335630418">"設定背景顏色:"</string>
+ <string name="default_themes" msgid="6668869906906304331">"套用主題"</string>
+ <string name="theme_name" msgid="8750875004662195520">"主題名稱:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"選擇工具活動"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values-zu/strings.xml b/tests/ThemePlayground/res/values-zu/strings.xml
new file mode 100644
index 0000000..6fef2f3
--- /dev/null
+++ b/tests/ThemePlayground/res/values-zu/strings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="9186040863360456501">"I-AAE Theme Playground"</string>
+ <string name="text_elements" msgid="6678400827142549036">"Izinto zombhalo"</string>
+ <string name="panel_elements" msgid="9161555672590928319">"Amaphaneli ombala"</string>
+ <string name="dialog_elements" msgid="6396215643762839537">"Amabhokisi"</string>
+ <string name="toggle_theme" msgid="7848492095193989051">"Shintsha ukulungisa(Imini/Ubusuku)"</string>
+ <string name="apply" msgid="7165796721764564035">"Faka"</string>
+ <string name="widgets" msgid="2335373195144254853">"Amawijethi"</string>
+ <string name="paged_list_view" msgid="5049677197420640692">"Ukubuka kohlu kwekhasi"</string>
+ <string name="widget_checkbox" msgid="4242511776930245432">"Ibhokisi lokuthikha"</string>
+ <string name="toggle_switch" msgid="1631707268585200186">"Shintsha"</string>
+ <string name="reset" msgid="8400557536601938969">"Setha kabusha"</string>
+ <string name="progress_bar" msgid="6376805274151741928">"Ibha lokuqhubeka"</string>
+ <string name="background_name" msgid="2753485007335630418">"Setha umbala wangasemuva :"</string>
+ <string name="default_themes" msgid="6668869906906304331">"Faka amatimu"</string>
+ <string name="theme_name" msgid="8750875004662195520">"Igama letimu:"</string>
+ <string name="multiple_intent" msgid="1681121328768447099">"Isikhethi somsebenzi"</string>
+ <string name="default_background_color" msgid="3761355404069320575">"#90CAF9"</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values/colors.xml b/tests/ThemePlayground/res/values/colors.xml
new file mode 100644
index 0000000..421c33c
--- /dev/null
+++ b/tests/ThemePlayground/res/values/colors.xml
@@ -0,0 +1,18 @@
+<?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>
+ <color name="widget_background">#7986CB</color>
+</resources>
diff --git a/tests/ThemePlayground/res/values/strings.xml b/tests/ThemePlayground/res/values/strings.xml
new file mode 100644
index 0000000..b1a7544
--- /dev/null
+++ b/tests/ThemePlayground/res/values/strings.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" translable="false">AAE Theme Playground</string>
+ <string name="text_elements" translable="false">Text Elements</string>
+ <string name="panel_elements" translable="false">Color Panels</string>
+ <string name="dialog_elements" translable="false">Dialogs</string>
+ <string name="toggle_theme" translable="false">Change configuration(Day/Night)</string>
+ <string name="apply" translable="false">Apply</string>
+ <string name="widgets" translable="false">Widgets</string>
+ <string name="paged_list_view" translable="false">Paged List View</string>
+ <string name="widget_checkbox" translable="false">Checkbox</string>
+ <string name="toggle_switch" translable="false">Toggle Switch</string>
+ <string name="reset" translable="false">Reset</string>
+ <string name="progress_bar" translable="false">Progress Bar</string>
+ <string name="background_name" translable="false">Set background color :</string>
+ <string name="default_themes" translable="false">Apply Themes</string>
+ <string name="theme_name" translable="false">Theme Name:</string>
+ <string name="multiple_intent" translable="false">Chooser Activity</string>
+ <string name="default_background_color" translable="false">#90CAF9</string>
+</resources>
diff --git a/tests/ThemePlayground/res/values/themes.xml b/tests/ThemePlayground/res/values/themes.xml
new file mode 100644
index 0000000..1211c92
--- /dev/null
+++ b/tests/ThemePlayground/res/values/themes.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources>
+
+ <!--Theme for the app, it's defined empty here so it can be overlaid easily -->
+ <style name="Theme.App" parent="android:Theme.DeviceDefault">
+ </style>
+
+ <!--Theme for the dialog testing-->
+ <style name="Theme.Testing.Dialog.Alert" parent="android:Theme.DeviceDefault.Dialog.Alert">
+ </style>
+
+ <!--This Theme contains attributes required for components from the car support lib -->
+ <style name="PagedListTheme" parent="Theme.CarSupportWrapper.NoActionBar">
+ </style>
+</resources>
\ No newline at end of file
diff --git a/tests/ThemePlayground/src/com/android/car/themeplayground/AbstractSampleActivity.java b/tests/ThemePlayground/src/com/android/car/themeplayground/AbstractSampleActivity.java
new file mode 100644
index 0000000..85989ae
--- /dev/null
+++ b/tests/ThemePlayground/src/com/android/car/themeplayground/AbstractSampleActivity.java
@@ -0,0 +1,157 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.themeplayground;
+
+import android.app.Activity;
+import android.app.UiModeManager;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.Color;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.PopupMenu;
+import android.widget.TextView;
+import android.widget.Toast;
+
+/**
+ * Handles the menu for the theme playground app
+ */
+public abstract class AbstractSampleActivity extends Activity implements
+ PopupMenu.OnMenuItemClickListener {
+
+ private UiModeManager mUiModeManager;
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ // Inflate the menu; this adds items to the action bar if it is present.
+ getMenuInflater().inflate(R.menu.menu_main, menu);
+ mUiModeManager = (UiModeManager) this.getSystemService(Context.UI_MODE_SERVICE);
+ return true;
+ }
+
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case R.id.text_elements:
+ return startSampleActivity(TextSamples.class);
+ case R.id.panel_elements:
+ return startSampleActivity(ColorSamples.class);
+ case R.id.dialog_elements:
+ return startSampleActivity(DialogSamples.class);
+ case R.id.toggle_theme:
+ return toggleDayNight();
+ case R.id.widgets:
+ return startSampleActivity(WidgetsSamples.class);
+ case R.id.page_list_view:
+ return startSampleActivity(PagedListViewSamples.class);
+ case R.id.default_themes:
+ return startSampleActivity(DefaultThemeSamples.class);
+ case R.id.multiple_intent:
+ return startSampleActivity(MultipleIntentSamples.class);
+ default:
+ return true;
+ }
+ }
+
+ /**
+ * Will show the menu onclick of the menu button. This button will only appear when the theme is
+ * set to NoActionBar.
+ */
+ private void showPopupMenu(View v) {
+ PopupMenu popup = new PopupMenu(this, v);
+ popup.setOnMenuItemClickListener(this);
+ popup.inflate(R.menu.menu_main);
+ popup.show();
+ }
+
+ @Override
+ public boolean onMenuItemClick(MenuItem item) {
+ return onOptionsItemSelected(item);
+ }
+
+ @Override
+ protected void onStart() {
+ super.onStart();
+ bindMenuButton();
+ }
+
+
+ /**
+ * When theme is set to NoActionBar then the menu also disappears blocking the user to navigate
+ * between the activities. At that point this method will bring up the menu button that will
+ * help user to navigate between activities.
+ */
+ private void bindMenuButton() {
+ Button buttonMenu = findViewById(R.id.button_menu);
+ if (Utils.sThemeName.equals("Theme.DeviceDefault.NoActionBar")) {
+ buttonMenu.setVisibility(View.VISIBLE);
+ } else {
+ buttonMenu.setVisibility(View.GONE);
+ }
+ buttonMenu.setOnClickListener(v -> {
+ showPopupMenu(v);
+ });
+ }
+
+ /**
+ * Launch the given sample activity
+ */
+ private boolean startSampleActivity(Class<?> cls) {
+ Intent dialogIntent = new Intent(this, cls);
+ startActivity(dialogIntent);
+ return true;
+ }
+
+ private boolean toggleDayNight() {
+ mUiModeManager.setNightMode(
+ (mUiModeManager.getNightMode() == UiModeManager.MODE_NIGHT_YES)
+ ? UiModeManager.MODE_NIGHT_NO : UiModeManager.MODE_NIGHT_YES);
+ return true;
+ }
+
+ void setupBackgroundColorControls(int backgroundLayoutId) {
+ Button colorSetButton = findViewById(R.id.set_background_color);
+ ((EditText) findViewById(R.id.background_input_color)).setText(
+ R.string.default_background_color,
+ TextView.BufferType.EDITABLE);
+ colorSetButton.setOnClickListener(v -> {
+ String value = ((EditText) findViewById(R.id.background_input_color)).getText()
+ .toString();
+ try {
+ int color = Color.parseColor(value);
+ View dialogLayout = findViewById(backgroundLayoutId);
+ dialogLayout.setBackgroundColor(color);
+ } catch (Exception e) {
+ Toast.makeText(this, "not a color", Toast.LENGTH_LONG).show();
+ }
+ });
+ Button colorResetButton = findViewById(R.id.reset);
+ colorResetButton.setOnClickListener(v -> {
+ try {
+ View dialogLayout = findViewById(backgroundLayoutId);
+ dialogLayout.setBackgroundColor(android.R.color.black);
+ } catch (Exception e) {
+ Toast.makeText(this, "Something went Wrong. Try again later.",
+ Toast.LENGTH_LONG).show();
+ }
+ });
+ }
+}
diff --git a/tests/ThemePlayground/src/com/android/car/themeplayground/ColorSamples.java b/tests/ThemePlayground/src/com/android/car/themeplayground/ColorSamples.java
new file mode 100644
index 0000000..de82489
--- /dev/null
+++ b/tests/ThemePlayground/src/com/android/car/themeplayground/ColorSamples.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.themeplayground;
+
+import android.os.Bundle;
+
+/**
+ * Activity that renders a bunch of color values from the theme.
+ */
+public class ColorSamples extends AbstractSampleActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ Utils.onActivityCreateSetTheme(this);
+ setContentView(R.layout.panel_samples);
+ }
+}
diff --git a/tests/ThemePlayground/src/com/android/car/themeplayground/DefaultThemeSamples.java b/tests/ThemePlayground/src/com/android/car/themeplayground/DefaultThemeSamples.java
new file mode 100644
index 0000000..1b87e82
--- /dev/null
+++ b/tests/ThemePlayground/src/com/android/car/themeplayground/DefaultThemeSamples.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.themeplayground;
+
+import android.os.Bundle;
+import android.widget.ArrayAdapter;
+import android.widget.AutoCompleteTextView;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.Toast;
+
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Activity that shows different device default themes. Auto complete themes come from
+ * theme_names.txt file in the raw folder. User can also input a valid theme in the textbox even if
+ * the theme is not available in the auto-complete.
+ */
+public class DefaultThemeSamples extends AbstractSampleActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ Utils.onActivityCreateSetTheme(this);
+ setContentView(R.layout.device_default_theme_samples);
+ Button buttonApply = findViewById(R.id.button_apply);
+ AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.theme_name);
+ ArrayAdapter<String> adapter =
+ new ArrayAdapter<>(this, android.R.layout.simple_list_item_1,
+ listAllThemes());
+ textView.setAdapter(adapter);
+ buttonApply.setOnClickListener(v -> {
+ EditText input = findViewById(R.id.theme_name);
+ String themeName = input.getText().toString();
+ int themeResId = this.getResources().getIdentifier(themeName,
+ "style", "android");
+ if (themeResId == 0) {
+ Toast.makeText(this, "No such theme found. ",
+ Toast.LENGTH_SHORT).show();
+ return;
+ }
+ Toast.makeText(this, "Applying theme: " + themeName,
+ Toast.LENGTH_SHORT).show();
+ Utils.changeToTheme(this, themeName, themeResId);
+ });
+ }
+
+ private String[] listAllThemes() {
+ String data;
+ List<String> list = new ArrayList<>();
+ InputStream is = this.getResources().openRawResource(R.raw.theme_names);
+ BufferedReader reader = new BufferedReader(new InputStreamReader(is));
+ try {
+ while ((data = reader.readLine()) != null) {
+ list.add(data);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return list.toArray(new String[0]);
+ }
+}
diff --git a/tests/ThemePlayground/src/com/android/car/themeplayground/DialogSamples.java b/tests/ThemePlayground/src/com/android/car/themeplayground/DialogSamples.java
new file mode 100644
index 0000000..87480f5
--- /dev/null
+++ b/tests/ThemePlayground/src/com/android/car/themeplayground/DialogSamples.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.themeplayground;
+
+import android.app.AlertDialog;
+import android.os.Bundle;
+import android.view.ContextThemeWrapper;
+import android.widget.Button;
+import android.widget.TextView;
+
+
+/**
+ * Activity that shows different dialogs from the device default theme.
+ */
+public class DialogSamples extends AbstractSampleActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ Utils.onActivityCreateSetTheme(this);
+ setContentView(R.layout.dialog_samples);
+
+ Button mShowDialogBT = findViewById(R.id.showDialogBT);
+ Button mShowDialogWithCheckboxBT = findViewById(R.id.showDialogWithCheckboxBT);
+ setupBackgroundColorControls(R.id.dialogLayout);
+ mShowDialogBT.setOnClickListener(v -> openDialog(false));
+ mShowDialogWithCheckboxBT.setOnClickListener(v -> openDialog(true));
+ }
+
+
+ private void openDialog(boolean showCheckbox) {
+
+ AlertDialog.Builder builder = new AlertDialog.Builder(
+ new ContextThemeWrapper(this, R.style.Theme_Testing_Dialog_Alert));
+
+ if (showCheckbox) {
+ // Set Custom Title
+ TextView title = new TextView(this);
+ // Title Properties
+ title.setText("Custom Dialog Box");
+ builder.setCustomTitle(title);
+ builder.setMultiChoiceItems(new CharSequence[]{"I am a checkbox"},
+ new boolean[]{false},
+ (dialog, which, isChecked) -> {
+ });
+ } else {
+ builder.setTitle("Standard Alert Dialog")
+ .setMessage("With a message to show.");
+ }
+
+ builder.setPositiveButton("OK", (dialoginterface, i) -> {
+ }).setNegativeButton("CANCEL",
+ (dialog, which) -> {
+ });
+ builder.show();
+ }
+}
diff --git a/tests/ThemePlayground/src/com/android/car/themeplayground/MultipleIntentSamples.java b/tests/ThemePlayground/src/com/android/car/themeplayground/MultipleIntentSamples.java
new file mode 100644
index 0000000..b6a9aa3
--- /dev/null
+++ b/tests/ThemePlayground/src/com/android/car/themeplayground/MultipleIntentSamples.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.themeplayground;
+
+
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Bundle;
+import android.widget.Toast;
+
+/**
+ * Activity that shows how the Intent is handled when there are more than one application that could
+ * accept and handle the intent.
+ */
+public class MultipleIntentSamples extends AbstractSampleActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ Utils.onActivityCreateSetTheme(this);
+ setContentView(R.layout.multiple_intent_samples);
+ findViewById(R.id.fire_web_intent_button).setOnClickListener(
+ v -> triggerIntentResolverForWeb());
+ }
+
+ private void triggerIntentResolverForWeb() {
+ Intent intent = new Intent(Intent.ACTION_VIEW);
+ intent.setData(Uri.parse("http://www.google.com"));
+
+ if (intent.resolveActivity(getPackageManager()) != null) {
+ startActivity(intent);
+ } else {
+ Toast.makeText(this, "No Application Installed to handle this action",
+ Toast.LENGTH_LONG).show();
+ }
+ }
+}
diff --git a/tests/ThemePlayground/src/com/android/car/themeplayground/PagedListViewAdapter.java b/tests/ThemePlayground/src/com/android/car/themeplayground/PagedListViewAdapter.java
new file mode 100644
index 0000000..2b23f15
--- /dev/null
+++ b/tests/ThemePlayground/src/com/android/car/themeplayground/PagedListViewAdapter.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.themeplayground;
+
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
+import java.util.ArrayList;
+
+/**
+ * Implementation of {@link PagedListViewAdapter} that can be used with RecyclerViews.
+ */
+public class PagedListViewAdapter extends
+ RecyclerView.Adapter<PagedListViewAdapter.PagedListViewHolder> {
+
+ private ArrayList<String> mData;
+
+ PagedListViewAdapter(ArrayList<String> data) {
+ this.mData = data;
+ }
+
+ @NonNull
+ @Override
+ public PagedListViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ LayoutInflater inflator = LayoutInflater.from(parent.getContext());
+ View view = inflator.inflate(R.layout.item_list, parent, false);
+ return new PagedListViewHolder(view);
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull PagedListViewHolder holder, int position) {
+ String title = mData.get(position);
+ holder.mTextTitle.setText(title);
+ }
+
+ @Override
+ public int getItemCount() {
+ return mData.size();
+ }
+
+
+ /**
+ * Holds views for each element in the list.
+ */
+ public static class PagedListViewHolder extends RecyclerView.ViewHolder {
+ TextView mTextTitle;
+
+ PagedListViewHolder(@NonNull View itemView) {
+ super(itemView);
+ mTextTitle = itemView.findViewById(R.id.textTitle);
+ }
+ }
+}
diff --git a/tests/ThemePlayground/src/com/android/car/themeplayground/PagedListViewSamples.java b/tests/ThemePlayground/src/com/android/car/themeplayground/PagedListViewSamples.java
new file mode 100644
index 0000000..c301abf
--- /dev/null
+++ b/tests/ThemePlayground/src/com/android/car/themeplayground/PagedListViewSamples.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.themeplayground;
+
+import android.os.Bundle;
+
+import androidx.car.widget.PagedListView;
+
+import java.util.ArrayList;
+
+/**
+ * Activity that shows pagedlistView example with dummy data.
+ */
+public class PagedListViewSamples extends AbstractSampleActivity {
+
+ private final ArrayList<String> mData = new ArrayList<>();
+ private final int mDataToGenerate = 15;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ Utils.onActivityCreateSetTheme(this);
+ setContentView(R.layout.paged_list_view_samples);
+ PagedListView pagedListView = (PagedListView) findViewById(R.id.list);
+
+ PagedListViewAdapter pagedListAdapter = new PagedListViewAdapter(generateDummyData());
+ pagedListView.setAdapter(pagedListAdapter);
+ }
+
+ private ArrayList<String> generateDummyData() {
+ for (int i = 0; i <= mDataToGenerate; i++) {
+ mData.add("data" + i);
+ }
+ return mData;
+ }
+
+}
diff --git a/tests/ThemePlayground/src/com/android/car/themeplayground/TextSamples.java b/tests/ThemePlayground/src/com/android/car/themeplayground/TextSamples.java
new file mode 100644
index 0000000..9b02050
--- /dev/null
+++ b/tests/ThemePlayground/src/com/android/car/themeplayground/TextSamples.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.themeplayground;
+
+import android.os.Bundle;
+
+/**
+ * Activity that shows text values from the device default theme
+ */
+public class TextSamples extends AbstractSampleActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ Utils.onActivityCreateSetTheme(this);
+ setContentView(R.layout.text_samples);
+ setupBackgroundColorControls(R.id.text_sample_list);
+ }
+}
diff --git a/tests/ThemePlayground/src/com/android/car/themeplayground/Utils.java b/tests/ThemePlayground/src/com/android/car/themeplayground/Utils.java
new file mode 100644
index 0000000..0990273
--- /dev/null
+++ b/tests/ThemePlayground/src/com/android/car/themeplayground/Utils.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.themeplayground;
+
+import android.app.Activity;
+import android.content.Intent;
+
+/**
+ * Utility class for changing the theme of the app at run time.
+ */
+public class Utils {
+ static String sThemeName = "";
+ private static int sThemeResId = 0;
+
+ /**
+ * Set the theme of the Activity, and restart it by creating a new Activity of the same type.
+ */
+ public static void changeToTheme(Activity activity, String themeName, int themeResId) {
+ sThemeName = themeName;
+ sThemeResId = themeResId;
+ activity.finish();
+ activity.startActivity(new Intent(activity, activity.getClass()));
+ }
+
+ /** Set the theme of the activity, according to the configuration. */
+ public static void onActivityCreateSetTheme(Activity activity) {
+ if (sThemeName.equals("")) {
+ activity.setTheme(android.R.style.Theme_DeviceDefault);
+ } else {
+ activity.setTheme(sThemeResId);
+ }
+ }
+}
diff --git a/tests/ThemePlayground/src/com/android/car/themeplayground/WidgetsSamples.java b/tests/ThemePlayground/src/com/android/car/themeplayground/WidgetsSamples.java
new file mode 100644
index 0000000..c124f85
--- /dev/null
+++ b/tests/ThemePlayground/src/com/android/car/themeplayground/WidgetsSamples.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.themeplayground;
+
+import android.app.UiModeManager;
+import android.content.Context;
+import android.os.Bundle;
+import android.widget.Button;
+
+/**
+ * Activity that shows different widgets on configuration changes.
+ */
+public class WidgetsSamples extends AbstractSampleActivity {
+
+ private UiModeManager mUiModeManager;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ Utils.onActivityCreateSetTheme(this);
+ setContentView(R.layout.widget_samples);
+ Button triggerConfigChanges = findViewById(R.id.trigger_config_change);
+ mUiModeManager = (UiModeManager) this.getSystemService(Context.UI_MODE_SERVICE);
+ setupBackgroundColorControls(R.id.widgetLayout);
+ triggerConfigChanges.setOnClickListener(v -> {
+ if (mUiModeManager.getNightMode() == UiModeManager.MODE_NIGHT_YES) {
+ mUiModeManager.setNightMode(UiModeManager.MODE_NIGHT_NO);
+ } else {
+ mUiModeManager.setNightMode(UiModeManager.MODE_NIGHT_YES);
+ }
+ });
+ }
+}
diff --git a/tests/UxRestrictionsSample/AndroidManifest.xml b/tests/UxRestrictionsSample/AndroidManifest.xml
index 4c702ca..bd28e0d 100644
--- a/tests/UxRestrictionsSample/AndroidManifest.xml
+++ b/tests/UxRestrictionsSample/AndroidManifest.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source Project
+<!-- Copyright (C) 2018 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -14,17 +14,21 @@
limitations under the License.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.google.android.car.uxr.sample" android:sharedUserId="android.uid.system">
+ package="com.google.android.car.uxr.sample" android:sharedUserId="android.uid.system">
- <uses-permission android:name="android.car.permission.CAR_DRIVING_STATE" />
+ <uses-permission android:name="android.car.permission.CAR_DRIVING_STATE"/>
<application android:label="UxRestrictions Sample">
- <activity android:name=".MainActivity">
+ <activity android:name=".MainActivity" android:theme="@style/AppTheme" android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<meta-data android:name="distractionOptimized" android:value="true"/>
</activity>
+ <activity android:name=".SampleMessageActivity"
+ android:theme="@style/AppTheme">
+ <meta-data android:name="distractionOptimized" android:value="true"/>
+ </activity>
</application>
</manifest>
diff --git a/tests/UxRestrictionsSample/res/layout/activity_sample_message.xml b/tests/UxRestrictionsSample/res/layout/activity_sample_message.xml
new file mode 100644
index 0000000..a778975
--- /dev/null
+++ b/tests/UxRestrictionsSample/res/layout/activity_sample_message.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+ <Button
+ android:id="@+id/home_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/return_home"
+ android:textAllCaps="false"
+ android:textAppearance="?android:textAppearanceLarge"/>
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+ <androidx.car.widget.PagedListView
+ android:id="@+id/paged_list_view"
+ android:layout_height="match_parent"
+ android:layout_width="wrap_content"
+ android:layout_weight="4"/>
+ </LinearLayout>
+</LinearLayout>
diff --git a/tests/UxRestrictionsSample/res/layout/main_activity.xml b/tests/UxRestrictionsSample/res/layout/main_activity.xml
index ec0d226..0b097fb 100644
--- a/tests/UxRestrictionsSample/res/layout/main_activity.xml
+++ b/tests/UxRestrictionsSample/res/layout/main_activity.xml
@@ -13,55 +13,167 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<androidx.car.moderator.SpeedBumpView
+<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
- <LinearLayout
- android:orientation="horizontal"
+ <LinearLayout
+ android:layout_height="match_parent"
+ android:layout_width="0dp"
+ android:layout_weight="1"
+ android:orientation="vertical">
+
+ <TextView
android:layout_width="match_parent"
- android:layout_height="match_parent">
+ android:layout_height="wrap_content"
+ android:text="@string/status_header"
+ android:layout_gravity="center"
+ android:padding="@dimen/section_padding"
+ android:textSize="@dimen/header_text_size"
+ android:textAppearance="?android:textAppearanceLarge"/>
- <LinearLayout
- android:layout_height="match_parent"
- android:layout_width="0dp"
- android:layout_weight="1"
- android:orientation="vertical"
- android:gravity="center">
- <TextView
- android:id="@+id/driving_state"
- android:layout_gravity="center"
- android:layout_width="match_parent"
- android:textAppearance="?android:textAppearanceLarge"
- android:layout_height="wrap_content" />
- <TextView
- android:id="@+id/do_status"
- android:layout_gravity="center"
- android:layout_width="match_parent"
- android:textAppearance="?android:textAppearanceLarge"
- android:layout_height="wrap_content" />
- <TextView
- android:id="@+id/uxr_status"
- android:layout_gravity="center"
- android:layout_width="match_parent"
- android:textAppearance="?android:textAppearanceLarge"
- android:layout_height="wrap_content" />
- <Button
- android:id="@+id/toggle_status"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="Disable Ux Restrictions"
- android:textSize="32sp"/>
- </LinearLayout>
+ <TextView
+ android:id="@+id/driving_state"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/driving_state"
+ android:textSize="@dimen/info_text_size"
+ android:layout_gravity="center"
+ android:padding="@dimen/section_padding"
+ android:textAppearance="?android:textAppearanceLarge"/>
- <androidx.car.widget.PagedListView
- android:id="@+id/paged_list_view"
- android:layout_width="0dp"
- android:layout_height="match_parent"
- android:layout_weight="4" />
+ <TextView
+ android:id="@+id/do_status"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/is_do_reqd"
+ android:textSize="@dimen/info_text_size"
+ android:padding="@dimen/section_padding"
+ android:textAppearance="?android:textAppearanceLarge"/>
+
+ <TextView
+ android:id="@+id/uxr_status"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/active_restrictions"
+ android:padding="@dimen/section_padding"
+ android:textSize="@dimen/info_text_size"
+ android:textAppearance="?android:textAppearanceLarge"/>
+
+ <TextView
+ android:id="@+id/show_uxr_config"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/uxr_config_header"
+ android:padding="@dimen/section_padding"
+ android:textSize="@dimen/info_text_size"
+ android:textAppearance="?android:textAppearanceLarge"/>
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1dp"
+ android:padding="@dimen/section_padding"
+ android:layout_marginBottom="10dp"
+ android:background="@android:color/darker_gray"/>
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/action_header"
+ android:padding="@dimen/section_padding"
+ android:textSize="@dimen/header_text_size"
+ android:textAppearance="?android:textAppearanceLarge"/>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+ <Button
+ android:id="@+id/toggle_status"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="@dimen/section_padding"
+ android:padding="@dimen/section_padding"
+ android:text="@string/disable_uxr"
+ android:textAllCaps="false"
+ android:textSize="@dimen/info_text_size"/>
+ <Button
+ android:id="@+id/show_staged_config"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="@dimen/section_padding"
+ android:padding="@dimen/section_padding"
+ android:text="@string/show_staged_config"
+ android:textAllCaps="false"
+ android:textSize="@dimen/info_text_size"/>
+ <Button
+ android:id="@+id/show_prod_config"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="@dimen/section_padding"
+ android:padding="@dimen/section_padding"
+ android:text="@string/show_prod_config"
+ android:textAllCaps="false"
+ android:textSize="@dimen/info_text_size"/>
</LinearLayout>
-</androidx.car.moderator.SpeedBumpView>
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1dp"
+ android:layout_marginTop="@dimen/section_padding"
+ android:layout_marginBottom="10dp"
+ android:background="@android:color/darker_gray"/>
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/sample_header"
+ android:padding="@dimen/section_padding"
+ android:textSize="@dimen/header_text_size"
+ android:textAppearance="?android:textAppearanceLarge"/>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+ <Button
+ android:id="@+id/launch_message"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:padding="@dimen/section_padding"
+ android:text="@string/sample_msg_activity"
+ android:textAllCaps="false"
+ android:textSize="@dimen/info_text_size"/>
+ </LinearLayout>
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1dp"
+ android:layout_marginTop="@dimen/section_padding"
+ android:layout_marginBottom="10dp"
+ android:background="@android:color/darker_gray"/>
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/save_uxr_config_header"
+ android:padding="@dimen/section_padding"
+ android:textSize="@dimen/header_text_size"
+ android:textAppearance="?android:textAppearanceLarge"/>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+ <Button
+ android:id="@+id/save_uxr_config"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:padding="@dimen/section_padding"
+ android:text="@string/save_uxr_config"
+ android:textSize="@dimen/info_text_size"/>
+ </LinearLayout>
+ </LinearLayout>
+</LinearLayout>
+
diff --git a/tests/UxRestrictionsSample/res/values/dimens.xml b/tests/UxRestrictionsSample/res/values/dimens.xml
new file mode 100644
index 0000000..66f0aea
--- /dev/null
+++ b/tests/UxRestrictionsSample/res/values/dimens.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources>
+ <dimen name="section_padding">5dp</dimen>
+
+ <!-- Text size for the sample app -->
+ <dimen name="info_text_size">24sp</dimen>
+ <dimen name="header_text_size">32sp</dimen>
+</resources>
diff --git a/tests/UxRestrictionsSample/res/values/strings.xml b/tests/UxRestrictionsSample/res/values/strings.xml
new file mode 100644
index 0000000..b36d7f9
--- /dev/null
+++ b/tests/UxRestrictionsSample/res/values/strings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" translatable="false">UxRestrictionsSample</string>
+ <string name="title_activity_main" translatable="false">MainActivity</string>
+ <string name="status_header" translatable="false"><u>Current Status</u></string>
+ <string name="driving_state" translatable="false">Driving State: </string>
+ <string name="is_do_reqd" translatable="false">Distraction Optimization Required? </string>
+ <string name="active_restrictions" translatable="false">Active UX Restrictions: </string>
+ <string name="uxr_config_header" translatable="false">UxR Configuration: </string>
+ <string name="action_header" translatable="false"><u>Available Actions</u></string>
+ <string name="disable_uxr" translatable="false">Disable Ux Restriction Engine</string>
+ <string name="show_staged_config" translatable="false">Show Staged Config</string>
+ <string name="show_prod_config" translatable="false">Show Production Config</string>
+ <string name="sample_header" translatable="false"><u>Sample Activities</u></string>
+ <string name="sample_msg_activity" translatable="false">Sample Message Activity</string>
+ <string name="return_home" translatable="false"><u>Return Home</u></string>
+ <string name="save_uxr_config_header" translatable="false"><u>Save UX Restrictions For Next Boot</u></string>
+ <string name="save_uxr_config" translatable="false">Save UX Restrictions</string>
+ <string name="set_uxr_config_dialog_title" translatable="false">Select restrictions for IDLING/MOVING</string>
+ <string name="set_uxr_config_dialog_negative_button" translatable="false">Cancel</string>
+ <string name="set_uxr_config_dialog_positive_button" translatable="false">Save UXR Config</string>
+ <string name="no_staged_config" translatable="false">There is no staged configuration found</string>
+ <string name="no_prod_config" translatable="false">There is no production configuration found</string>
+ <string name="staged_config_title" translatable="false">Staged Config</string>
+ <string name="prod_config_title" translatable="false">Production Config</string>
+</resources>
diff --git a/tests/UxRestrictionsSample/res/values/styles.xml b/tests/UxRestrictionsSample/res/values/styles.xml
new file mode 100644
index 0000000..05d0d03
--- /dev/null
+++ b/tests/UxRestrictionsSample/res/values/styles.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources>
+
+ <style name="AppTheme" parent="@style/Theme.Car.NoActionBar">
+ <item name="android:windowBackground">@android:color/black</item>
+ </style>
+</resources>
\ No newline at end of file
diff --git a/tests/UxRestrictionsSample/src/com/google/android/car/uxr/sample/MainActivity.java b/tests/UxRestrictionsSample/src/com/google/android/car/uxr/sample/MainActivity.java
index ba82e6f..27738bc 100644
--- a/tests/UxRestrictionsSample/src/com/google/android/car/uxr/sample/MainActivity.java
+++ b/tests/UxRestrictionsSample/src/com/google/android/car/uxr/sample/MainActivity.java
@@ -15,31 +15,32 @@
*/
package com.google.android.car.uxr.sample;
-import android.annotation.DrawableRes;
+import static android.car.drivingstate.CarDrivingStateEvent.DRIVING_STATE_IDLING;
+import static android.car.drivingstate.CarDrivingStateEvent.DRIVING_STATE_MOVING;
+import static android.car.drivingstate.CarDrivingStateEvent.DRIVING_STATE_PARKED;
+
import android.app.Activity;
+import android.app.AlertDialog;
import android.car.Car;
import android.car.CarNotConnectedException;
import android.car.content.pm.CarPackageManager;
import android.car.drivingstate.CarDrivingStateEvent;
import android.car.drivingstate.CarDrivingStateManager;
import android.car.drivingstate.CarUxRestrictions;
+import android.car.drivingstate.CarUxRestrictionsConfiguration;
import android.car.drivingstate.CarUxRestrictionsManager;
import android.content.ComponentName;
+import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
+import android.util.JsonWriter;
import android.util.Log;
+import android.view.View;
import android.widget.Button;
import android.widget.TextView;
-import androidx.car.widget.ListItem;
-import androidx.car.widget.ListItemAdapter;
-import androidx.car.widget.ListItemProvider;
-import androidx.car.widget.PagedListView;
-import androidx.car.widget.TextListItem;
-
-import java.util.ArrayList;
-import java.util.List;
+import java.io.CharArrayWriter;
/**
* Sample app that uses components in car support library to demonstrate Car drivingstate UXR
@@ -48,6 +49,20 @@
public class MainActivity extends Activity {
public static final String TAG = "drivingstate";
+ // Order of elements is based on number of bits shifted in value of the constants.
+ private static final CharSequence[] UX_RESTRICTION_NAMES = new CharSequence[]{
+ "BASELINE",
+ "NO_DIALPAD",
+ "NO_FILTERING",
+ "LIMIT_STRING_LENGTH",
+ "NO_KEYBOARD",
+ "NO_VIDEO",
+ "LIMIT_CONTENT",
+ "NO_SETUP",
+ "NO_TEXT_MESSAGE",
+ "NO_VOICE_TRANSCRIPTION",
+ };
+
private Car mCar;
private CarDrivingStateManager mCarDrivingStateManager;
private CarUxRestrictionsManager mCarUxRestrictionsManager;
@@ -56,8 +71,12 @@
private TextView mDistractionOptStatus;
private TextView mUxrStatus;
private Button mToggleButton;
+ private Button mSampleMsgButton;
+ private Button mSaveUxrConfigButton;
+ private Button mShowStagedConfig;
+ private Button mShowProdConfig;
+
private boolean mEnableUxR;
- private PagedListView mPagedListView;
private final ServiceConnection mCarConnectionListener =
new ServiceConnection() {
@@ -72,7 +91,6 @@
Car.CAR_UX_RESTRICTION_SERVICE);
mCarPackageManager = (CarPackageManager) mCar.getCarManager(
Car.PACKAGE_SERVICE);
-
if (mCarDrivingStateManager != null) {
mCarDrivingStateManager.registerListener(mDrvStateChangeListener);
updateDrivingStateText(
@@ -82,7 +100,6 @@
mCarUxRestrictionsManager.registerListener(mUxRChangeListener);
updateUxRText(mCarUxRestrictionsManager.getCurrentCarUxRestrictions());
}
-
} catch (CarNotConnectedException e) {
Log.e(TAG, "Failed to get a connection", e);
}
@@ -104,7 +121,9 @@
: "No Distraction Optimization required");
mUxrStatus.setText("Active Restrictions : 0x"
- + Integer.toHexString(restrictions.getActiveRestrictions()));
+ + Integer.toHexString(restrictions.getActiveRestrictions())
+ + " - "
+ + Integer.toBinaryString(restrictions.getActiveRestrictions()));
mDistractionOptStatus.requestLayout();
mUxrStatus.requestLayout();
@@ -131,13 +150,13 @@
}
String displayText;
switch (state.eventValue) {
- case CarDrivingStateEvent.DRIVING_STATE_PARKED:
+ case DRIVING_STATE_PARKED:
displayText = "Parked";
break;
- case CarDrivingStateEvent.DRIVING_STATE_IDLING:
+ case DRIVING_STATE_IDLING:
displayText = "Idling";
break;
- case CarDrivingStateEvent.DRIVING_STATE_MOVING:
+ case DRIVING_STATE_MOVING:
displayText = "Moving";
break;
default:
@@ -155,79 +174,126 @@
this::updateDrivingStateText;
@Override
- public void onCreate(Bundle savedInstanceState) {
+ protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+
setContentView(R.layout.main_activity);
mDrvStatus = findViewById(R.id.driving_state);
mDistractionOptStatus = findViewById(R.id.do_status);
mUxrStatus = findViewById(R.id.uxr_status);
mToggleButton = findViewById(R.id.toggle_status);
- mPagedListView = findViewById(R.id.paged_list_view);
- setUpPagedListView();
+ mSaveUxrConfigButton = findViewById(R.id.save_uxr_config);
+ mSaveUxrConfigButton.setOnClickListener(v -> saveUxrConfig());
- mToggleButton.setOnClickListener(v -> {
- updateToggleUxREnable();
- });
+ mShowStagedConfig = findViewById(R.id.show_staged_config);
+ mShowStagedConfig.setOnClickListener(v -> showStagedUxRestrictionsConfig());
+ mShowProdConfig = findViewById(R.id.show_prod_config);
+ mShowProdConfig.setOnClickListener(v -> showProdUxRestrictionsConfig());
+ mToggleButton.setOnClickListener(v -> updateToggleUxREnable());
+
+ mSampleMsgButton = findViewById(R.id.launch_message);
+ mSampleMsgButton.setOnClickListener(this::launchSampleMsgActivity);
// Connect to car service
mCar = Car.createCar(this, mCarConnectionListener);
mCar.connect();
}
- private void setUpPagedListView() {
- ListItemAdapter adapter = new ListItemAdapter(this, populateData());
- mPagedListView.setAdapter(adapter);
+ private void saveUxrConfig() {
+ // Pop up a dialog to build the IDLING restrictions.
+ boolean[] selected = new boolean[UX_RESTRICTION_NAMES.length];
+ new AlertDialog.Builder(this)
+ .setTitle(R.string.set_uxr_config_dialog_title)
+ .setMultiChoiceItems(UX_RESTRICTION_NAMES, null,
+ (dialog, which, isChecked) -> selected[which] = isChecked)
+ .setPositiveButton(R.string.set_uxr_config_dialog_positive_button,
+ (dialog, id) -> setUxRestrictionsConfig(selected))
+ .setNegativeButton(R.string.set_uxr_config_dialog_negative_button, null)
+ .show();
}
- private ListItemProvider populateData() {
- List<ListItem> items = new ArrayList<>();
- items.add(createMessage(android.R.drawable.ic_menu_myplaces, "alice",
- "i have a really important message but it may hinder your ability to drive. "));
+ private void setUxRestrictionsConfig(boolean[] selected) {
+ int selectedRestrictions = 0;
+ // Iteration starts at 1 because 0 is BASELINE (no restrictions).
+ for (int i = 1; i < selected.length; i++) {
+ if (selected[i]) {
+ selectedRestrictions += 1 << (i - 1);
+ }
+ }
+ boolean reqOpt = selectedRestrictions != 0;
+ CarUxRestrictionsConfiguration config = new CarUxRestrictionsConfiguration.Builder()
+ .setUxRestrictions(DRIVING_STATE_PARKED, false, 0)
+ .setUxRestrictions(DRIVING_STATE_IDLING, reqOpt, selectedRestrictions)
+ .setUxRestrictions(DRIVING_STATE_MOVING, reqOpt, selectedRestrictions)
+ .build();
- items.add(createMessage(android.R.drawable.ic_menu_myplaces, "bob",
- "hey this is a really long message that i have always wanted to say. but before " +
- "saying it i feel it's only appropriate if i lay some groundwork for it. "
- + ""));
- items.add(createMessage(android.R.drawable.ic_menu_myplaces, "mom",
- "i think you are the best. i think you are the best. i think you are the best. " +
- "i think you are the best. i think you are the best. i think you are the "
- + "best. "
- +
- "i think you are the best. i think you are the best. i think you are the "
- + "best. "
- +
- "i think you are the best. i think you are the best. i think you are the "
- + "best. "
- +
- "i think you are the best. i think you are the best. i think you are the "
- + "best. "
- +
- "i think you are the best. i think you are the best. "));
- items.add(createMessage(android.R.drawable.ic_menu_myplaces, "john", "hello world"));
- items.add(createMessage(android.R.drawable.ic_menu_myplaces, "jeremy",
- "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor " +
- "incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, " +
- "quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo " +
- "consequat. Duis aute irure dolor in reprehenderit in voluptate velit " +
- "esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat " +
- "cupidatat non proident, sunt in culpa qui officia deserunt mollit " +
- "anim id est laborum."));
- return new ListItemProvider.ListProvider(items);
+ try {
+ mCarUxRestrictionsManager.saveUxRestrictionsConfigurationForNextBoot(config);
+ } catch (CarNotConnectedException e) {
+ Log.e(TAG, "Car not connected", e);
+ }
}
- private TextListItem createMessage(@DrawableRes int profile, String contact, String message) {
- TextListItem item = new TextListItem(this);
- item.setPrimaryActionIcon(profile, false /* useLargeIcon */);
- item.setTitle(contact);
- item.setBody(message);
- item.setSupplementalIcon(android.R.drawable.stat_notify_chat, false);
- return item;
+ private void showStagedUxRestrictionsConfig() {
+ try {
+ CarUxRestrictionsConfiguration stagedConfig =
+ mCarUxRestrictionsManager.getStagedConfig();
+ if (stagedConfig == null) {
+ new AlertDialog.Builder(this)
+ .setMessage(R.string.no_staged_config)
+ .show();
+ return;
+ }
+ CharArrayWriter charWriter = new CharArrayWriter();
+ JsonWriter writer = new JsonWriter(charWriter);
+ writer.setIndent("\t");
+ stagedConfig.writeJson(writer);
+ new AlertDialog.Builder(this)
+ .setTitle(R.string.staged_config_title)
+ .setMessage(charWriter.toString())
+ .show();
+ } catch (CarNotConnectedException e) {
+ Log.e(TAG, "Car not connected", e);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ private void showProdUxRestrictionsConfig() {
+ try {
+ CarUxRestrictionsConfiguration prodConfig =
+ mCarUxRestrictionsManager.getConfig();
+ if (prodConfig == null) {
+ new AlertDialog.Builder(this)
+ .setMessage(R.string.no_prod_config)
+ .show();
+ return;
+ }
+ CharArrayWriter charWriter = new CharArrayWriter();
+ JsonWriter writer = new JsonWriter(charWriter);
+ writer.setIndent("\t");
+ prodConfig.writeJson(writer);
+ new AlertDialog.Builder(this)
+ .setTitle(R.string.prod_config_title)
+ .setMessage(charWriter.toString())
+ .show();
+ } catch (CarNotConnectedException e) {
+ Log.e(TAG, "Car not connected", e);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ private void launchSampleMsgActivity(View view) {
+ Intent msgIntent = new Intent(this, SampleMessageActivity.class);
+ startActivity(msgIntent);
}
@Override
protected void onDestroy() {
+ super.onDestroy();
try {
if (mCarUxRestrictionsManager != null) {
mCarUxRestrictionsManager.unregisterListener();
diff --git a/tests/UxRestrictionsSample/src/com/google/android/car/uxr/sample/SampleMessageActivity.java b/tests/UxRestrictionsSample/src/com/google/android/car/uxr/sample/SampleMessageActivity.java
new file mode 100644
index 0000000..1c9bc95
--- /dev/null
+++ b/tests/UxRestrictionsSample/src/com/google/android/car/uxr/sample/SampleMessageActivity.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.google.android.car.uxr.sample;
+
+import android.annotation.DrawableRes;
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.Button;
+
+import androidx.car.widget.ListItem;
+import androidx.car.widget.ListItemAdapter;
+import androidx.car.widget.ListItemProvider;
+import androidx.car.widget.PagedListView;
+import androidx.car.widget.TextListItem;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * A Sample Messaging Activity that illustrates how to truncate the string length on receiving the
+ * corresponding UX restriction.
+ */
+public class SampleMessageActivity extends Activity {
+ private Button mHomeButton;
+ private PagedListView mPagedListView;
+ private ListItemAdapter mAdapter;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_sample_message);
+ mHomeButton = findViewById(R.id.home_button);
+ mHomeButton.setOnClickListener(this::returnHome);
+
+ mPagedListView = findViewById(R.id.paged_list_view);
+ setUpPagedListView();
+ }
+
+ @Override
+ protected void onStart() {
+ super.onStart();
+ if (mAdapter != null) {
+ mAdapter.start();
+ }
+ }
+
+ @Override
+ protected void onStop() {
+ super.onStop();
+ if (mAdapter != null) {
+ mAdapter.stop();
+ }
+ }
+
+ private void returnHome(View view) {
+ Intent homeIntent = new Intent(this, MainActivity.class);
+ startActivity(homeIntent);
+ }
+
+ private void setUpPagedListView() {
+ mAdapter = new ListItemAdapter(this, populateData());
+ mPagedListView.setAdapter(mAdapter);
+ }
+
+ private ListItemProvider populateData() {
+ List<ListItem> items = new ArrayList<>();
+ items.add(createMessage(android.R.drawable.ic_menu_myplaces, "alice",
+ "i have a really important message but it may hinder your ability to drive. "));
+
+ items.add(createMessage(android.R.drawable.ic_menu_myplaces, "bob",
+ "hey this is a really long message that i have always wanted to say. but before "
+ + "saying it i feel it's only appropriate if i lay some groundwork for it. "
+ + ""));
+ items.add(createMessage(android.R.drawable.ic_menu_myplaces, "mom",
+ "i think you are the best. i think you are the best. i think you are the best. "
+ + "i think you are the best. i think you are the best. i think you are the "
+ + "best. "
+ + "i think you are the best. i think you are the best. i think you are the "
+ + "best. "
+ + "i think you are the best. i think you are the best. i think you are the "
+ + "best. "
+ + "i think you are the best. i think you are the best. i think you are the "
+ + "best. "
+ + "i think you are the best. i think you are the best. "));
+ items.add(createMessage(android.R.drawable.ic_menu_myplaces, "john", "hello world"));
+ items.add(createMessage(android.R.drawable.ic_menu_myplaces, "jeremy",
+ "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor "
+ + "incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, "
+ + "quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo "
+ + "consequat. Duis aute irure dolor in reprehenderit in voluptate velit "
+ + "esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat "
+ + "cupidatat non proident, sunt in culpa qui officia deserunt mollit "
+ + "anim id est laborum."));
+ return new ListItemProvider.ListProvider(items);
+ }
+
+ private TextListItem createMessage(@DrawableRes int profile, String contact, String message) {
+ TextListItem item = new TextListItem(this);
+ item.setPrimaryActionIcon(profile, TextListItem.PRIMARY_ACTION_ICON_SIZE_SMALL);
+ item.setTitle(contact);
+ item.setBody(message);
+ item.setSupplementalIcon(android.R.drawable.stat_notify_chat, false);
+ return item;
+ }
+
+}
diff --git a/tests/VmsPublisherClientSample/res/values/strings.xml b/tests/VmsPublisherClientSample/res/values/strings.xml
index df8bf05..9d548e4 100644
--- a/tests/VmsPublisherClientSample/res/values/strings.xml
+++ b/tests/VmsPublisherClientSample/res/values/strings.xml
@@ -14,5 +14,5 @@
limitations under the License.
-->
<resources>
- <string name="app_name">VmsPublisherClientSample</string>
+ <string name="app_name" translatable="false">VmsPublisherClientSample</string>
</resources>
diff --git a/tests/VmsSubscriberClientSample/Android.mk b/tests/VmsSubscriberClientSample/Android.mk
index c577aaf..2568ffc 100644
--- a/tests/VmsSubscriberClientSample/Android.mk
+++ b/tests/VmsSubscriberClientSample/Android.mk
@@ -35,6 +35,4 @@
LOCAL_JAVA_LIBRARIES += android.car
-include packages/services/Car/car-support-lib/car-support.mk
-
include $(BUILD_PACKAGE)
\ No newline at end of file
diff --git a/tests/VmsSubscriberClientSample/res/values/strings.xml b/tests/VmsSubscriberClientSample/res/values/strings.xml
index 24df55e..64b8482 100644
--- a/tests/VmsSubscriberClientSample/res/values/strings.xml
+++ b/tests/VmsSubscriberClientSample/res/values/strings.xml
@@ -1,3 +1,3 @@
<resources>
- <string name="app_name">VmsSubscriberClientSample</string>
+ <string name="app_name" translatable="false">VmsSubscriberClientSample</string>
</resources>
diff --git a/tests/VmsSubscriberClientSample/src/com/google/android/car/vms/subscriber/VmsSubscriberClientSampleActivity.java b/tests/VmsSubscriberClientSample/src/com/google/android/car/vms/subscriber/VmsSubscriberClientSampleActivity.java
index d1b92dc..ca9915d 100644
--- a/tests/VmsSubscriberClientSample/src/com/google/android/car/vms/subscriber/VmsSubscriberClientSampleActivity.java
+++ b/tests/VmsSubscriberClientSample/src/com/google/android/car/vms/subscriber/VmsSubscriberClientSampleActivity.java
@@ -17,15 +17,19 @@
package com.google.android.car.vms.subscriber;
import android.app.Activity;
+import android.car.Car;
+import android.car.CarNotConnectedException;
import android.car.vms.VmsAvailableLayers;
import android.car.vms.VmsLayer;
import android.car.vms.VmsSubscriberManager;
+import android.content.ComponentName;
+import android.content.ServiceConnection;
import android.content.pm.PackageManager;
import android.os.Bundle;
-import android.support.car.Car;
-import android.support.car.CarConnectionCallback;
+import android.os.IBinder;
import android.util.Log;
import android.widget.TextView;
+
import java.util.concurrent.Executor;
/**
@@ -57,7 +61,7 @@
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(R.id.textview);
if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) {
- mCarApi = Car.createCar(this, mCarConnectionCallback);
+ mCarApi = Car.createCar(this, mCarServiceConnection);
mCarApi.connect();
} else {
Log.d(TAG, "No automotive feature.");
@@ -73,16 +77,16 @@
Log.i(TAG, "onDestroy");
}
- private final CarConnectionCallback mCarConnectionCallback = new CarConnectionCallback() {
+ private final ServiceConnection mCarServiceConnection = new ServiceConnection() {
@Override
- public void onConnected(Car car) {
+ public void onServiceConnected(ComponentName name, IBinder service) {
Log.d(TAG, "Connected to Car Service");
mVmsSubscriberManager = getVmsSubscriberManager();
configureSubscriptions(mVmsSubscriberManager);
}
@Override
- public void onDisconnected(Car car) {
+ public void onServiceDisconnected(ComponentName name) {
Log.d(TAG, "Disconnect from Car Service");
if (mVmsSubscriberManager != null) {
try {
@@ -97,8 +101,8 @@
private VmsSubscriberManager getVmsSubscriberManager() {
try {
return (VmsSubscriberManager) mCarApi.getCarManager(
- android.car.Car.VMS_SUBSCRIBER_SERVICE);
- } catch (android.support.car.CarNotConnectedException e) {
+ Car.VMS_SUBSCRIBER_SERVICE);
+ } catch (CarNotConnectedException e) {
Log.e(TAG, "Car is not connected!", e);
}
return null;
@@ -108,7 +112,7 @@
try {
vmsSubscriberManager.setVmsSubscriberClientCallback(mExecutor, mClientCallback);
vmsSubscriberManager.subscribe(TEST_LAYER);
- } catch (android.car.CarNotConnectedException e) {
+ } catch (CarNotConnectedException e) {
Log.e(TAG, "Car is not connected!", e);
}
}
diff --git a/tests/android_car_api_test/Android.mk b/tests/android_car_api_test/Android.mk
index b1c2728..c1d412c 100644
--- a/tests/android_car_api_test/Android.mk
+++ b/tests/android_car_api_test/Android.mk
@@ -35,7 +35,7 @@
LOCAL_STATIC_JAVA_LIBRARIES := junit
LOCAL_STATIC_JAVA_LIBRARIES += \
- android-support-test \
+ androidx.test.rules \
android.hidl.base-V1.0-java \
android.hardware.automotive.vehicle-V2.0-java \
diff --git a/tests/android_car_api_test/src/android/car/apitest/CarHvacManagerTest.java b/tests/android_car_api_test/src/android/car/apitest/CarHvacManagerTest.java
index 7196d14..2fc57eb 100644
--- a/tests/android_car_api_test/src/android/car/apitest/CarHvacManagerTest.java
+++ b/tests/android_car_api_test/src/android/car/apitest/CarHvacManagerTest.java
@@ -43,7 +43,7 @@
public void testAllHvacProperties() throws Exception {
List<CarPropertyConfig> properties = mHvacManager.getPropertyList();
Set<Class> supportedTypes = new HashSet<>(Arrays.asList(
- new Class[] { Integer.class, Float.class, Boolean.class }));
+ new Class[] { Integer.class, Float.class, Boolean.class, Integer[].class }));
for (CarPropertyConfig property : properties) {
if (supportedTypes.contains(property.getPropertyType())) {
@@ -80,7 +80,6 @@
break;
case CarHvacManager.ID_ZONED_FAN_SPEED_SETPOINT: // zoned int
case CarHvacManager.ID_ZONED_FAN_SPEED_RPM:
- case CarHvacManager.ID_ZONED_FAN_DIRECTION_AVAILABLE:
case CarHvacManager.ID_ZONED_SEAT_TEMP:
checkTypeAndGlobal(Integer.class, false, property);
checkIntMinMax(property);
@@ -88,6 +87,9 @@
case CarHvacManager.ID_ZONED_FAN_DIRECTION:
checkTypeAndGlobal(Integer.class, false, property);
break;
+ case CarHvacManager.ID_ZONED_FAN_DIRECTION_AVAILABLE:
+ checkTypeAndGlobal(Integer[].class, false, property);
+ break;
case CarHvacManager.ID_ZONED_AC_ON: // zoned boolean
case CarHvacManager.ID_ZONED_AUTOMATIC_MODE_ON:
case CarHvacManager.ID_ZONED_AIR_RECIRCULATION_ON:
@@ -103,10 +105,10 @@
private void checkTypeAndGlobal(Class clazz, boolean global, CarPropertyConfig<Integer> property) {
assertEquals("Wrong type, expecting " + clazz + " type for id:" + property.getPropertyId(),
- clazz, property.getPropertyType());
+ clazz, property.getPropertyType());
assertEquals("Wrong zone, should " + (global ? "" : "not ") + "be global for id: " +
- property.getPropertyId() + ", area type:" + property.getAreaType(),
- global, property.isGlobalProperty());
+ property.getPropertyId() + ", area type:" + property.getAreaType(),
+ global, property.isGlobalProperty());
}
private void checkIntMinMax(CarPropertyConfig<Integer> property) {
diff --git a/tests/android_car_api_test/src/android/car/apitest/CarProjectionManagerTest.java b/tests/android_car_api_test/src/android/car/apitest/CarProjectionManagerTest.java
index 889a60a..abfeb11 100644
--- a/tests/android_car_api_test/src/android/car/apitest/CarProjectionManagerTest.java
+++ b/tests/android_car_api_test/src/android/car/apitest/CarProjectionManagerTest.java
@@ -18,12 +18,20 @@
import android.app.Service;
import android.car.Car;
import android.car.CarProjectionManager;
+import android.car.CarProjectionManager.ProjectionAccessPointCallback;
import android.content.Intent;
+import android.net.wifi.WifiConfiguration;
import android.os.Binder;
import android.os.IBinder;
-import android.test.suitebuilder.annotation.MediumTest;
+import android.test.suitebuilder.annotation.LargeTest;
+import android.test.suitebuilder.annotation.Suppress;
-@MediumTest
+import androidx.test.filters.RequiresDevice;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+@LargeTest
public class CarProjectionManagerTest extends CarApiTestBase {
private static final String TAG = CarProjectionManagerTest.class.getSimpleName();
@@ -96,4 +104,22 @@
assertTrue(TestService.getBound());
mManager.unregisterProjectionRunner(intent);
}
+
+ //TODO(b/120081013): move this test to CTS
+ @Suppress
+ @RequiresDevice
+ public void testAccessPoint() throws Exception {
+ CountDownLatch startedLatch = new CountDownLatch(1);
+
+ mManager.startProjectionAccessPoint(new ProjectionAccessPointCallback() {
+ @Override
+ public void onStarted(WifiConfiguration wifiConfiguration) {
+ startedLatch.countDown();
+ }
+ });
+
+ assertTrue(startedLatch.await(30, TimeUnit.SECONDS));
+
+ mManager.stopProjectionAccessPoint();
+ }
}
diff --git a/tests/android_car_api_test/src/android/car/apitest/CarUxRestrictionsConfigurationTest.java b/tests/android_car_api_test/src/android/car/apitest/CarUxRestrictionsConfigurationTest.java
new file mode 100644
index 0000000..f86c76e
--- /dev/null
+++ b/tests/android_car_api_test/src/android/car/apitest/CarUxRestrictionsConfigurationTest.java
@@ -0,0 +1,387 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.car.apitest;
+
+import static android.car.drivingstate.CarDrivingStateEvent.DRIVING_STATE_IDLING;
+import static android.car.drivingstate.CarDrivingStateEvent.DRIVING_STATE_MOVING;
+import static android.car.drivingstate.CarDrivingStateEvent.DRIVING_STATE_PARKED;
+import static android.car.drivingstate.CarUxRestrictions.UX_RESTRICTIONS_BASELINE;
+import static android.car.drivingstate.CarUxRestrictions.UX_RESTRICTIONS_FULLY_RESTRICTED;
+import static android.car.drivingstate.CarUxRestrictions.UX_RESTRICTIONS_NO_VIDEO;
+import static android.car.drivingstate.CarUxRestrictionsConfiguration.Builder.SpeedRange.MAX_SPEED;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.drivingstate.CarUxRestrictionsConfiguration;
+import android.util.JsonReader;
+import android.util.JsonWriter;
+
+import androidx.test.filters.SmallTest;
+
+import junit.framework.TestCase;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+
+/**
+ * Unit test for UXR config and its subclasses.
+ */
+@SmallTest
+public class CarUxRestrictionsConfigurationTest extends TestCase {
+
+ // This test verifies the expected way to build config would succeed.
+ public void testConstruction() {
+ new CarUxRestrictionsConfiguration.Builder().build();
+
+ new CarUxRestrictionsConfiguration.Builder()
+ .setMaxStringLength(1)
+ .build();
+
+ new CarUxRestrictionsConfiguration.Builder()
+ .setUxRestrictions(DRIVING_STATE_PARKED, false, UX_RESTRICTIONS_BASELINE)
+ .build();
+
+ new CarUxRestrictionsConfiguration.Builder()
+ .setUxRestrictions(DRIVING_STATE_MOVING, true, UX_RESTRICTIONS_FULLY_RESTRICTED)
+ .build();
+
+ new CarUxRestrictionsConfiguration.Builder()
+ .setUxRestrictions(DRIVING_STATE_MOVING,
+ new CarUxRestrictionsConfiguration.Builder.SpeedRange(0f, MAX_SPEED),
+ true, UX_RESTRICTIONS_FULLY_RESTRICTED)
+ .build();
+
+ new CarUxRestrictionsConfiguration.Builder()
+ .setUxRestrictions(DRIVING_STATE_MOVING,
+ new CarUxRestrictionsConfiguration.Builder.SpeedRange(0f, 1f),
+ true, UX_RESTRICTIONS_FULLY_RESTRICTED)
+ .setUxRestrictions(DRIVING_STATE_MOVING,
+ new CarUxRestrictionsConfiguration.Builder.SpeedRange(1f, MAX_SPEED),
+ true, UX_RESTRICTIONS_FULLY_RESTRICTED)
+ .build();
+ }
+
+ public void testUnspecifiedDrivingStateUsesDefaultRestriction() {
+ CarUxRestrictionsConfiguration config =
+ new CarUxRestrictionsConfiguration.Builder().build();
+
+ CarUxRestrictions parkedRestrictions = config.getUxRestrictions(DRIVING_STATE_PARKED, 0f);
+ assertTrue(parkedRestrictions.isRequiresDistractionOptimization());
+ assertEquals(parkedRestrictions.getActiveRestrictions(), UX_RESTRICTIONS_FULLY_RESTRICTED);
+
+ CarUxRestrictions movingRestrictions = config.getUxRestrictions(DRIVING_STATE_MOVING, 1f);
+ assertTrue(movingRestrictions.isRequiresDistractionOptimization());
+ assertEquals(movingRestrictions.getActiveRestrictions(), UX_RESTRICTIONS_FULLY_RESTRICTED);
+ }
+
+ public void testBuilderValidation_MultipleSpeedRange_NonZeroStart() {
+ CarUxRestrictionsConfiguration.Builder builder =
+ new CarUxRestrictionsConfiguration.Builder();
+ builder.setUxRestrictions(DRIVING_STATE_MOVING,
+ new CarUxRestrictionsConfiguration.Builder.SpeedRange(1, 2),
+ true, UX_RESTRICTIONS_FULLY_RESTRICTED);
+ builder.setUxRestrictions(DRIVING_STATE_MOVING,
+ new CarUxRestrictionsConfiguration.Builder.SpeedRange(2, MAX_SPEED),
+ true, UX_RESTRICTIONS_FULLY_RESTRICTED);
+
+ try {
+ builder.build();
+ fail();
+ } catch (IllegalStateException e) {
+ // Expected exception.
+ }
+ }
+
+ public void testBuilderValidation_SpeedRange_NonZeroStart() {
+ CarUxRestrictionsConfiguration.Builder builder =
+ new CarUxRestrictionsConfiguration.Builder();
+ builder.setUxRestrictions(DRIVING_STATE_MOVING,
+ new CarUxRestrictionsConfiguration.Builder.SpeedRange(1, MAX_SPEED),
+ true, UX_RESTRICTIONS_FULLY_RESTRICTED);
+
+ try {
+ builder.build();
+ fail();
+ } catch (IllegalStateException e) {
+ // Expected exception.
+ }
+ }
+
+ public void testBuilderValidation_SpeedRange_Overlap() {
+ CarUxRestrictionsConfiguration.Builder builder =
+ new CarUxRestrictionsConfiguration.Builder();
+ builder.setUxRestrictions(DRIVING_STATE_MOVING,
+ new CarUxRestrictionsConfiguration.Builder.SpeedRange(0, 5), true,
+ UX_RESTRICTIONS_FULLY_RESTRICTED);
+ builder.setUxRestrictions(DRIVING_STATE_MOVING,
+ new CarUxRestrictionsConfiguration.Builder.SpeedRange(4), true,
+ UX_RESTRICTIONS_FULLY_RESTRICTED);
+
+ try {
+ builder.build();
+ fail();
+ } catch (IllegalStateException e) {
+ // Expected exception.
+ }
+ }
+
+ public void testBuilderValidation_SpeedRange_Gap() {
+ CarUxRestrictionsConfiguration.Builder builder =
+ new CarUxRestrictionsConfiguration.Builder();
+ builder.setUxRestrictions(DRIVING_STATE_MOVING,
+ new CarUxRestrictionsConfiguration.Builder.SpeedRange(0, 5), true,
+ UX_RESTRICTIONS_FULLY_RESTRICTED);
+ builder.setUxRestrictions(DRIVING_STATE_MOVING,
+ new CarUxRestrictionsConfiguration.Builder.SpeedRange(8), true,
+ UX_RESTRICTIONS_FULLY_RESTRICTED);
+
+ try {
+ builder.build();
+ fail();
+ } catch (IllegalStateException e) {
+ // Expected exception.
+ }
+ }
+
+ public void testBuilderValidation_NonMovingStateCannotUseSpeedRange() {
+ CarUxRestrictionsConfiguration.Builder builder =
+ new CarUxRestrictionsConfiguration.Builder();
+ try {
+ builder.setUxRestrictions(DRIVING_STATE_PARKED,
+ new CarUxRestrictionsConfiguration.Builder.SpeedRange(0, 5), true,
+ UX_RESTRICTIONS_FULLY_RESTRICTED);
+ } catch (IllegalArgumentException e) {
+ // Expected exception.
+ }
+ }
+
+ public void testSpeedRange_Construction() {
+ new CarUxRestrictionsConfiguration.Builder.SpeedRange(0f);
+ new CarUxRestrictionsConfiguration.Builder.SpeedRange(0f, 1f);
+ new CarUxRestrictionsConfiguration.Builder.SpeedRange(0f, MAX_SPEED);
+ }
+
+ public void testSpeedRange_NegativeMax() {
+ try {
+ new CarUxRestrictionsConfiguration.Builder.SpeedRange(2f, -1f);
+ } catch (IllegalArgumentException e) {
+ // Expected exception.
+ }
+ }
+
+ public void testSpeedRange_MinGreaterThanMax() {
+ try {
+ new CarUxRestrictionsConfiguration.Builder.SpeedRange(5f, 2f);
+ } catch (IllegalArgumentException e) {
+ // Expected exception.
+ }
+ }
+
+ public void testSpeedRangeComparison_DifferentMin() {
+ CarUxRestrictionsConfiguration.Builder.SpeedRange s1 =
+ new CarUxRestrictionsConfiguration.Builder.SpeedRange(1f);
+ CarUxRestrictionsConfiguration.Builder.SpeedRange s2 =
+ new CarUxRestrictionsConfiguration.Builder.SpeedRange(2f);
+ assertTrue(s1.compareTo(s2) < 0);
+ assertTrue(s2.compareTo(s1) > 0);
+ }
+
+ public void testSpeedRangeComparison_SameMin() {
+ CarUxRestrictionsConfiguration.Builder.SpeedRange s1 =
+ new CarUxRestrictionsConfiguration.Builder.SpeedRange(1f);
+ CarUxRestrictionsConfiguration.Builder.SpeedRange s2 =
+ new CarUxRestrictionsConfiguration.Builder.SpeedRange(1f);
+ assertTrue(s1.compareTo(s2) == 0);
+ }
+
+ public void testSpeedRangeComparison_SameMinDifferentMax() {
+ CarUxRestrictionsConfiguration.Builder.SpeedRange s1 =
+ new CarUxRestrictionsConfiguration.Builder.SpeedRange(0f, 1f);
+ CarUxRestrictionsConfiguration.Builder.SpeedRange s2 =
+ new CarUxRestrictionsConfiguration.Builder.SpeedRange(0f, 2f);
+ assertTrue(s1.compareTo(s2) < 0);
+ assertTrue(s2.compareTo(s1) > 0);
+ }
+
+ public void testSpeedRangeComparison_MaxSpeed() {
+ CarUxRestrictionsConfiguration.Builder.SpeedRange s1 =
+ new CarUxRestrictionsConfiguration.Builder.SpeedRange(0f, 1f);
+ CarUxRestrictionsConfiguration.Builder.SpeedRange s2 =
+ new CarUxRestrictionsConfiguration.Builder.SpeedRange(0f);
+ assertTrue(s1.compareTo(s2) < 0);
+ assertTrue(s2.compareTo(s1) > 0);
+ }
+
+ public void testSpeedRangeEquals() {
+ CarUxRestrictionsConfiguration.Builder.SpeedRange s1, s2;
+
+ s1 = new CarUxRestrictionsConfiguration.Builder.SpeedRange(0f);
+ assertTrue(s1.equals(s1));
+
+ s1 = new CarUxRestrictionsConfiguration.Builder.SpeedRange(1f);
+ s2 = new CarUxRestrictionsConfiguration.Builder.SpeedRange(1f);
+ assertTrue(s1.compareTo(s2) == 0);
+ assertTrue(s1.equals(s2));
+
+ s1 = new CarUxRestrictionsConfiguration.Builder.SpeedRange(0f, 1f);
+ s2 = new CarUxRestrictionsConfiguration.Builder.SpeedRange(0f, 1f);
+ assertTrue(s1.equals(s2));
+
+ s1 = new CarUxRestrictionsConfiguration.Builder.SpeedRange(0f, MAX_SPEED);
+ s2 = new CarUxRestrictionsConfiguration.Builder.SpeedRange(0f, MAX_SPEED);
+ assertTrue(s1.equals(s2));
+
+ s1 = new CarUxRestrictionsConfiguration.Builder.SpeedRange(0f);
+ s2 = new CarUxRestrictionsConfiguration.Builder.SpeedRange(1f);
+ assertFalse(s1.equals(s2));
+
+ s1 = new CarUxRestrictionsConfiguration.Builder.SpeedRange(0f, 1f);
+ s2 = new CarUxRestrictionsConfiguration.Builder.SpeedRange(0f, 2f);
+ assertFalse(s1.equals(s2));
+ }
+
+ // TODO: add more tests that each verifies setting one filed in builder can be
+ // successfully retrieved out of saved json.
+ public void testJsonSerialization_DefaultConstructor() {
+ CarUxRestrictionsConfiguration config =
+ new CarUxRestrictionsConfiguration.Builder().build();
+
+ verifyConfigThroughJsonSerialization(config);
+ }
+
+ public void testJsonSerialization_RestrictionParameters() {
+ CarUxRestrictionsConfiguration config = new CarUxRestrictionsConfiguration.Builder()
+ .setMaxStringLength(1)
+ .setMaxCumulativeContentItems(1)
+ .setMaxContentDepth(1)
+ .build();
+
+ verifyConfigThroughJsonSerialization(config);
+ }
+
+ public void testJsonSerialization_NonMovingStateRestrictions() {
+ CarUxRestrictionsConfiguration config = new CarUxRestrictionsConfiguration.Builder()
+ .setUxRestrictions(DRIVING_STATE_PARKED, false, UX_RESTRICTIONS_BASELINE)
+ .build();
+
+ verifyConfigThroughJsonSerialization(config);
+ }
+
+ public void testJsonSerialization_MovingStateNoSpeedRange() {
+ CarUxRestrictionsConfiguration config = new CarUxRestrictionsConfiguration.Builder()
+ .setUxRestrictions(DRIVING_STATE_MOVING, true, UX_RESTRICTIONS_FULLY_RESTRICTED)
+ .build();
+
+ verifyConfigThroughJsonSerialization(config);
+ }
+
+ public void testJsonSerialization_MovingStateWithSpeedRange() {
+ CarUxRestrictionsConfiguration config = new CarUxRestrictionsConfiguration.Builder()
+ .setUxRestrictions(DRIVING_STATE_MOVING,
+ new CarUxRestrictionsConfiguration.Builder.SpeedRange(0f, 5f),
+ true, UX_RESTRICTIONS_FULLY_RESTRICTED)
+ .setUxRestrictions(DRIVING_STATE_MOVING,
+ new CarUxRestrictionsConfiguration.Builder.SpeedRange(5f, MAX_SPEED),
+ true, UX_RESTRICTIONS_FULLY_RESTRICTED)
+ .build();
+
+ verifyConfigThroughJsonSerialization(config);
+ }
+
+ public void testDump() {
+ CarUxRestrictionsConfiguration[] configs = new CarUxRestrictionsConfiguration[] {
+ // Driving state with no speed range
+ new CarUxRestrictionsConfiguration.Builder()
+ .setUxRestrictions(DRIVING_STATE_PARKED, false, UX_RESTRICTIONS_BASELINE)
+ .setUxRestrictions(DRIVING_STATE_IDLING, true, UX_RESTRICTIONS_NO_VIDEO)
+ .setUxRestrictions(DRIVING_STATE_MOVING, true, UX_RESTRICTIONS_NO_VIDEO)
+ .build(),
+ // Parameters
+ new CarUxRestrictionsConfiguration.Builder()
+ .setMaxStringLength(1)
+ .setMaxContentDepth(1)
+ .setMaxCumulativeContentItems(1)
+ .build(),
+ // Driving state with single speed range
+ new CarUxRestrictionsConfiguration.Builder()
+ .setUxRestrictions(DRIVING_STATE_MOVING,
+ new CarUxRestrictionsConfiguration.Builder.SpeedRange(0f),
+ true, UX_RESTRICTIONS_NO_VIDEO)
+ .build(),
+ // Driving state with multiple speed ranges
+ new CarUxRestrictionsConfiguration.Builder()
+ .setUxRestrictions(DRIVING_STATE_MOVING,
+ new CarUxRestrictionsConfiguration.Builder.SpeedRange(0f, 1f),
+ true, UX_RESTRICTIONS_NO_VIDEO)
+ .setUxRestrictions(DRIVING_STATE_MOVING,
+ new CarUxRestrictionsConfiguration.Builder.SpeedRange(1f),
+ true, UX_RESTRICTIONS_NO_VIDEO)
+ .build(),
+ };
+
+ for (CarUxRestrictionsConfiguration config : configs) {
+ config.dump(new PrintWriter(new ByteArrayOutputStream()));
+ }
+ }
+
+ public void testDumpContainsNecessaryInfo() {
+
+ CarUxRestrictionsConfiguration config = new CarUxRestrictionsConfiguration.Builder()
+ .setUxRestrictions(DRIVING_STATE_MOVING,
+ new CarUxRestrictionsConfiguration.Builder.SpeedRange(0f, 1f),
+ true, UX_RESTRICTIONS_NO_VIDEO)
+ .setUxRestrictions(DRIVING_STATE_MOVING,
+ new CarUxRestrictionsConfiguration.Builder.SpeedRange(1f),
+ true, UX_RESTRICTIONS_NO_VIDEO)
+ .build();
+ ByteArrayOutputStream output = new ByteArrayOutputStream();
+ try (PrintWriter writer = new PrintWriter(output)) {
+ config.dump(writer);
+ }
+
+ String dump = new String(output.toByteArray());
+ assertTrue(dump.contains("Max String length"));
+ assertTrue(dump.contains("Max Cumulative Content Items"));
+ assertTrue(dump.contains("Max Content depth"));
+ assertTrue(dump.contains("State:moving"));
+ assertTrue(dump.contains("Speed Range"));
+ assertTrue(dump.contains("Requires DO?"));
+ assertTrue(dump.contains("Restrictions"));
+ }
+
+ private void verifyConfigThroughJsonSerialization(CarUxRestrictionsConfiguration config) {
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ try (JsonWriter writer = new JsonWriter(new OutputStreamWriter(out))) {
+ config.writeJson(writer);
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail();
+ }
+
+ ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
+ try (JsonReader reader = new JsonReader(new InputStreamReader(in))) {
+ CarUxRestrictionsConfiguration deserialized = CarUxRestrictionsConfiguration.readJson(
+ reader);
+ assertTrue(config.equals(deserialized));
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail();
+ }
+ }
+}
diff --git a/tests/android_support_car_api_test/Android.mk b/tests/android_support_car_api_test/Android.mk
deleted file mode 100644
index 90aa767..0000000
--- a/tests/android_support_car_api_test/Android.mk
+++ /dev/null
@@ -1,41 +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.
-#
-#
-
-LOCAL_PATH:= $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_PACKAGE_NAME := AndroidSupportCarApiTest
-LOCAL_PRIVATE_PLATFORM_APIS := true
-
-# for system|privileged permission.
-LOCAL_CERTIFICATE := platform
-
-LOCAL_MODULE_TAGS := tests
-
-# When built explicitly put it in the data partition
-LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
-
-LOCAL_PROGUARD_ENABLED := disabled
-
-LOCAL_STATIC_JAVA_LIBRARIES := junit
-LOCAL_STATIC_JAVA_LIBRARIES += android.support.car android-support-test
-
-LOCAL_JAVA_LIBRARIES := android.car android.test.runner android.test.base
-
-include $(BUILD_PACKAGE)
diff --git a/tests/android_support_car_api_test/AndroidManifest.xml b/tests/android_support_car_api_test/AndroidManifest.xml
deleted file mode 100644
index ba4a53e..0000000
--- a/tests/android_support_car_api_test/AndroidManifest.xml
+++ /dev/null
@@ -1,35 +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.
--->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
- package="com.android.support.car.apitest"
- android:sharedUserId="android.uid.system" >
-
- <uses-sdk android:minSdkVersion="23" android:targetSdkVersion="23" />
- <instrumentation android:name="android.test.InstrumentationTestRunner"
- android:targetPackage="com.android.support.car.apitest"
- android:label="Tests for Car APIs"/>
-
- <application android:label="CarApiTest">
- <uses-library android:name="android.test.runner" />
- <activity android:name=".TestCarProxyActivity">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- </intent-filter>
- </activity>
- </application>
-</manifest>
diff --git a/tests/android_support_car_api_test/src/com/android/support/car/apitest/CarApiTestBase.java b/tests/android_support_car_api_test/src/com/android/support/car/apitest/CarApiTestBase.java
deleted file mode 100644
index 981de14..0000000
--- a/tests/android_support_car_api_test/src/com/android/support/car/apitest/CarApiTestBase.java
+++ /dev/null
@@ -1,74 +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 com.android.support.car.apitest;
-
-import android.os.Looper;
-import android.support.car.Car;
-import android.support.car.CarConnectionCallback;
-import android.test.AndroidTestCase;
-
-import java.util.concurrent.Semaphore;
-import java.util.concurrent.TimeUnit;
-
-public class CarApiTestBase extends AndroidTestCase {
- protected static final long DEFAULT_WAIT_TIMEOUT_MS = 1000;
-
- private Car mCar;
-
- private final DefaultCarConnectionCallback mConnectionCallbacks =
- new DefaultCarConnectionCallback();
-
- protected void assertMainThread() {
- assertTrue(Looper.getMainLooper().isCurrentThread());
- }
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- mCar = Car.createCar(getContext(), mConnectionCallbacks);
- mCar.connect();
- mConnectionCallbacks.waitForConnection(DEFAULT_WAIT_TIMEOUT_MS);
- }
-
- @Override
- protected void tearDown() throws Exception {
- super.tearDown();
- mCar.disconnect();
- }
-
- protected synchronized Car getCar() {
- return mCar;
- }
-
- protected class DefaultCarConnectionCallback extends CarConnectionCallback {
- private final Semaphore mConnectionWait = new Semaphore(0);
-
- public void waitForConnection(long timeoutMs) throws InterruptedException {
- mConnectionWait.tryAcquire(timeoutMs, TimeUnit.MILLISECONDS);
- }
- @Override
- public void onDisconnected(Car car) {
- assertMainThread();
- }
-
- @Override
- public void onConnected(Car car) {
- assertMainThread();
- mConnectionWait.release();
- }
- }
-}
diff --git a/tests/android_support_car_api_test/src/com/android/support/car/apitest/CarAppFocusManagerTest.java b/tests/android_support_car_api_test/src/com/android/support/car/apitest/CarAppFocusManagerTest.java
deleted file mode 100644
index 2d58e56..0000000
--- a/tests/android_support_car_api_test/src/com/android/support/car/apitest/CarAppFocusManagerTest.java
+++ /dev/null
@@ -1,353 +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 com.android.support.car.apitest;
-
-import android.support.car.Car;
-import android.support.car.CarAppFocusManager;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.util.Log;
-
-import java.util.concurrent.Semaphore;
-import java.util.concurrent.TimeUnit;
-
-@MediumTest
-public class CarAppFocusManagerTest extends CarApiTestBase {
- private static final String TAG = CarAppFocusManagerTest.class.getSimpleName();
- private CarAppFocusManager mManager;
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- mManager = (CarAppFocusManager) getCar().getCarManager(Car.APP_FOCUS_SERVICE);
- assertNotNull(mManager);
-
- // Request all application focuses and abandon them to ensure no active context is present
- // when test starts.
- int[] activeTypes = {CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION,
- CarAppFocusManager.APP_FOCUS_TYPE_VOICE_COMMAND};
- FocusOwnershipCallback owner = new FocusOwnershipCallback();
- for (int i = 0; i < activeTypes.length; i++) {
- mManager.requestAppFocus(activeTypes[i], owner);
- owner.waitForOwnershipGrantAndAssert(DEFAULT_WAIT_TIMEOUT_MS, activeTypes[i]);
- mManager.abandonAppFocus(owner, activeTypes[i]);
- owner.waitForOwnershipLossAndAssert(
- DEFAULT_WAIT_TIMEOUT_MS, activeTypes[i]);
- }
- }
-
- public void testSetActiveNullListener() throws Exception {
- try {
- mManager.requestAppFocus(CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION, null);
- fail();
- } catch (IllegalArgumentException e) {
- // expected
- }
- }
-
- public void testRegisterNull() throws Exception {
- try {
- mManager.addFocusListener(null, CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION);
- fail();
- } catch (IllegalArgumentException e) {
- // expected
- }
- }
-
- public void testRegisterUnregister() throws Exception {
- FocusChangedListener listener = new FocusChangedListener();
- FocusChangedListener listener2 = new FocusChangedListener();
- mManager.addFocusListener(listener, CarAppFocusManager.APP_FOCUS_TYPE_VOICE_COMMAND);
- mManager.addFocusListener(listener2, CarAppFocusManager.APP_FOCUS_TYPE_VOICE_COMMAND);
- mManager.removeFocusListener(listener);
- mManager.removeFocusListener(listener2);
- }
-
- public void testFocusChange() throws Exception {
- DefaultCarConnectionCallback connectionCallbacks =
- new DefaultCarConnectionCallback();
- Car car2 = Car.createCar(getContext(), connectionCallbacks, null);
- car2.connect();
- connectionCallbacks.waitForConnection(DEFAULT_WAIT_TIMEOUT_MS);
- CarAppFocusManager manager2 = (CarAppFocusManager)
- car2.getCarManager(Car.APP_FOCUS_SERVICE);
- assertNotNull(manager2);
- final int[] emptyFocus = new int[0];
-
- FocusChangedListener change = new FocusChangedListener();
- FocusChangedListener change2 = new FocusChangedListener();
- FocusOwnershipCallback owner = new FocusOwnershipCallback();
- FocusOwnershipCallback owner2 = new FocusOwnershipCallback();
- mManager.addFocusListener(change, CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION);
- mManager.addFocusListener(change, CarAppFocusManager.APP_FOCUS_TYPE_VOICE_COMMAND);
- manager2.addFocusListener(change2, CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION);
- manager2.addFocusListener(change2, CarAppFocusManager.APP_FOCUS_TYPE_VOICE_COMMAND);
-
- mManager.requestAppFocus(CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION, owner);
- assertTrue(owner.waitForOwnershipGrantAndAssert(DEFAULT_WAIT_TIMEOUT_MS,
- CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION));
-
- assertTrue(mManager.isOwningFocus(CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION, owner));
- assertFalse(mManager.isOwningFocus(CarAppFocusManager.APP_FOCUS_TYPE_VOICE_COMMAND, owner));
- assertFalse(manager2.isOwningFocus(CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION, owner2));
- assertFalse(manager2.isOwningFocus(CarAppFocusManager.APP_FOCUS_TYPE_VOICE_COMMAND, owner2));
-
- assertTrue(change2.waitForFocusChangeAndAssert(DEFAULT_WAIT_TIMEOUT_MS,
- CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION, true));
- assertTrue(change.waitForFocusChangeAndAssert(DEFAULT_WAIT_TIMEOUT_MS,
- CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION, true));
-
- mManager.requestAppFocus(CarAppFocusManager.APP_FOCUS_TYPE_VOICE_COMMAND, owner);
- assertTrue(owner.waitForOwnershipGrantAndAssert(DEFAULT_WAIT_TIMEOUT_MS,
- CarAppFocusManager.APP_FOCUS_TYPE_VOICE_COMMAND));
- assertTrue(mManager.isOwningFocus(CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION, owner));
- assertTrue(mManager.isOwningFocus(CarAppFocusManager.APP_FOCUS_TYPE_VOICE_COMMAND, owner));
- assertFalse(manager2.isOwningFocus(CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION, owner2));
- assertFalse(manager2.isOwningFocus(CarAppFocusManager.APP_FOCUS_TYPE_VOICE_COMMAND,
- owner2));
- assertTrue(change2.waitForFocusChangeAndAssert(DEFAULT_WAIT_TIMEOUT_MS,
- CarAppFocusManager.APP_FOCUS_TYPE_VOICE_COMMAND, true));
- assertTrue(change.waitForFocusChangeAndAssert(DEFAULT_WAIT_TIMEOUT_MS,
- CarAppFocusManager.APP_FOCUS_TYPE_VOICE_COMMAND, true));
-
- // this should be no-op
- change.reset();
- change2.reset();
- mManager.requestAppFocus(CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION, owner);
- assertTrue(owner.waitForOwnershipGrantAndAssert(DEFAULT_WAIT_TIMEOUT_MS,
- CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION));
-
- assertFalse(change2.waitForFocusChangeAndAssert(DEFAULT_WAIT_TIMEOUT_MS,
- CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION, true));
- assertFalse(change.waitForFocusChangeAndAssert(DEFAULT_WAIT_TIMEOUT_MS,
- CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION, true));
-
- manager2.requestAppFocus(CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION, owner2);
- assertTrue(owner2.waitForOwnershipGrantAndAssert(DEFAULT_WAIT_TIMEOUT_MS,
- CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION));
-
- assertFalse(mManager.isOwningFocus(CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION, owner));
- assertTrue(mManager.isOwningFocus(CarAppFocusManager.APP_FOCUS_TYPE_VOICE_COMMAND, owner));
- assertTrue(manager2.isOwningFocus(CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION, owner2));
- assertFalse(manager2.isOwningFocus(CarAppFocusManager.APP_FOCUS_TYPE_VOICE_COMMAND, owner2));
- assertTrue(owner.waitForOwnershipLossAndAssert(DEFAULT_WAIT_TIMEOUT_MS,
- CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION));
-
- // no-op as it is not owning it
- change.reset();
- change2.reset();
- mManager.abandonAppFocus(owner, CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION);
- assertFalse(mManager.isOwningFocus(CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION, owner));
- assertTrue(mManager.isOwningFocus(CarAppFocusManager.APP_FOCUS_TYPE_VOICE_COMMAND, owner));
- assertTrue(manager2.isOwningFocus(CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION, owner2));
- assertFalse(manager2.isOwningFocus(CarAppFocusManager.APP_FOCUS_TYPE_VOICE_COMMAND, owner2));
-
- change.reset();
- change2.reset();
- mManager.abandonAppFocus(owner, CarAppFocusManager.APP_FOCUS_TYPE_VOICE_COMMAND);
- assertFalse(mManager.isOwningFocus(CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION, owner));
- assertFalse(mManager.isOwningFocus(CarAppFocusManager.APP_FOCUS_TYPE_VOICE_COMMAND, owner));
- assertTrue(manager2.isOwningFocus(CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION, owner2));
- assertFalse(manager2.isOwningFocus(CarAppFocusManager.APP_FOCUS_TYPE_VOICE_COMMAND, owner2));
- assertTrue(change2.waitForFocusChangeAndAssert(DEFAULT_WAIT_TIMEOUT_MS,
- CarAppFocusManager.APP_FOCUS_TYPE_VOICE_COMMAND, false));
- assertTrue(change.waitForFocusChangeAndAssert(DEFAULT_WAIT_TIMEOUT_MS,
- CarAppFocusManager.APP_FOCUS_TYPE_VOICE_COMMAND, false));
-
- change.reset();
- change2.reset();
- manager2.abandonAppFocus(owner2, CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION);
- assertFalse(mManager.isOwningFocus(CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION, owner));
- assertFalse(mManager.isOwningFocus(CarAppFocusManager.APP_FOCUS_TYPE_VOICE_COMMAND, owner));
- assertFalse(manager2.isOwningFocus(CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION, owner2));
- assertFalse(manager2.isOwningFocus(CarAppFocusManager.APP_FOCUS_TYPE_VOICE_COMMAND, owner2));
- assertTrue(change.waitForFocusChangeAndAssert(DEFAULT_WAIT_TIMEOUT_MS,
- CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION, false));
- mManager.removeFocusListener(change);
- manager2.removeFocusListener(change2);
- }
-
- public void testFilter() throws Exception {
- DefaultCarConnectionCallback connectionCallbacks =
- new DefaultCarConnectionCallback();
- Car car2 = Car.createCar(getContext(), connectionCallbacks);
- car2.connect();
- connectionCallbacks.waitForConnection(DEFAULT_WAIT_TIMEOUT_MS);
- CarAppFocusManager manager2 = (CarAppFocusManager)
- car2.getCarManager(Car.APP_FOCUS_SERVICE);
- assertNotNull(manager2);
-
- FocusChangedListener listener = new FocusChangedListener();
- FocusChangedListener listener2 = new FocusChangedListener();
- FocusOwnershipCallback owner = new FocusOwnershipCallback();
- mManager.addFocusListener(listener, CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION);
- mManager.addFocusListener(listener, CarAppFocusManager.APP_FOCUS_TYPE_VOICE_COMMAND);
- manager2.addFocusListener(listener2, CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION);
-
- mManager.requestAppFocus(CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION, owner);
- assertTrue(owner.waitForOwnershipGrantAndAssert(DEFAULT_WAIT_TIMEOUT_MS,
- CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION));
-
- assertTrue(listener.waitForFocusChangeAndAssert(DEFAULT_WAIT_TIMEOUT_MS,
- CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION, true));
- assertTrue(listener2.waitForFocusChangeAndAssert(DEFAULT_WAIT_TIMEOUT_MS,
- CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION, true));
-
- listener.reset();
- listener2.reset();
- mManager.requestAppFocus(CarAppFocusManager.APP_FOCUS_TYPE_VOICE_COMMAND, owner);
- assertTrue(owner.waitForOwnershipGrantAndAssert(DEFAULT_WAIT_TIMEOUT_MS,
- CarAppFocusManager.APP_FOCUS_TYPE_VOICE_COMMAND));
-
- assertTrue(listener.waitForFocusChangeAndAssert(DEFAULT_WAIT_TIMEOUT_MS,
- CarAppFocusManager.APP_FOCUS_TYPE_VOICE_COMMAND, true));
- assertFalse(listener2.waitForFocusChangeAndAssert(DEFAULT_WAIT_TIMEOUT_MS,
- CarAppFocusManager.APP_FOCUS_TYPE_VOICE_COMMAND, true));
-
- listener.reset();
- listener2.reset();
- mManager.abandonAppFocus(owner, CarAppFocusManager.APP_FOCUS_TYPE_VOICE_COMMAND);
- assertTrue(listener.waitForFocusChangeAndAssert(DEFAULT_WAIT_TIMEOUT_MS,
- CarAppFocusManager.APP_FOCUS_TYPE_VOICE_COMMAND, false));
- assertFalse(listener2.waitForFocusChangeAndAssert(DEFAULT_WAIT_TIMEOUT_MS,
- CarAppFocusManager.APP_FOCUS_TYPE_VOICE_COMMAND, false));
-
- listener.reset();
- listener2.reset();
- mManager.abandonAppFocus(owner, CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION);
- assertTrue(listener.waitForFocusChangeAndAssert(DEFAULT_WAIT_TIMEOUT_MS,
- CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION, false));
- assertTrue(listener2.waitForFocusChangeAndAssert(DEFAULT_WAIT_TIMEOUT_MS,
- CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION, false));
- }
-
- public void testMultipleChangeListenersPerManager() throws Exception {
- FocusChangedListener listener = new FocusChangedListener();
- FocusChangedListener listener2 = new FocusChangedListener();
- FocusOwnershipCallback owner = new FocusOwnershipCallback();
- mManager.addFocusListener(listener, CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION);
- mManager.addFocusListener(listener, CarAppFocusManager.APP_FOCUS_TYPE_VOICE_COMMAND);
- mManager.addFocusListener(listener2, CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION);
-
- mManager.requestAppFocus(CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION, owner);
- assertTrue(owner.waitForOwnershipGrantAndAssert(DEFAULT_WAIT_TIMEOUT_MS,
- CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION));
-
- assertTrue(listener.waitForFocusChangeAndAssert(DEFAULT_WAIT_TIMEOUT_MS,
- CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION, true));
- assertTrue(listener2.waitForFocusChangeAndAssert(DEFAULT_WAIT_TIMEOUT_MS,
- CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION, true));
-
- listener.reset();
- listener2.reset();
- mManager.requestAppFocus(CarAppFocusManager.APP_FOCUS_TYPE_VOICE_COMMAND, owner);
- assertTrue(owner.waitForOwnershipGrantAndAssert(DEFAULT_WAIT_TIMEOUT_MS,
- CarAppFocusManager.APP_FOCUS_TYPE_VOICE_COMMAND));
-
- assertTrue(listener.waitForFocusChangeAndAssert(DEFAULT_WAIT_TIMEOUT_MS,
- CarAppFocusManager.APP_FOCUS_TYPE_VOICE_COMMAND, true));
- assertFalse(listener2.waitForFocusChangeAndAssert(DEFAULT_WAIT_TIMEOUT_MS,
- CarAppFocusManager.APP_FOCUS_TYPE_VOICE_COMMAND, true));
-
- listener.reset();
- listener2.reset();
- mManager.abandonAppFocus(owner, CarAppFocusManager.APP_FOCUS_TYPE_VOICE_COMMAND);
- assertTrue(listener.waitForFocusChangeAndAssert(DEFAULT_WAIT_TIMEOUT_MS,
- CarAppFocusManager.APP_FOCUS_TYPE_VOICE_COMMAND, false));
- assertFalse(listener2.waitForFocusChangeAndAssert(DEFAULT_WAIT_TIMEOUT_MS,
- CarAppFocusManager.APP_FOCUS_TYPE_VOICE_COMMAND, false));
-
- listener.reset();
- listener2.reset();
- mManager.abandonAppFocus(owner, CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION);
- assertTrue(listener.waitForFocusChangeAndAssert(DEFAULT_WAIT_TIMEOUT_MS,
- CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION, false));
- assertTrue(listener2.waitForFocusChangeAndAssert(DEFAULT_WAIT_TIMEOUT_MS,
- CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION, false));
- }
-
- private class FocusChangedListener implements CarAppFocusManager.OnAppFocusChangedListener {
- private int mLastChangeAppType;
- private boolean mLastChangeAppActive;
- private final Semaphore mChangeWait = new Semaphore(0);
-
- public boolean waitForFocusChangeAndAssert(long timeoutMs, int expectedAppType,
- boolean expectedAppActive) throws Exception {
- if (!mChangeWait.tryAcquire(timeoutMs, TimeUnit.MILLISECONDS)) {
- return false;
- }
- assertEquals(expectedAppType, mLastChangeAppType);
- assertEquals(expectedAppActive, mLastChangeAppActive);
- return true;
- }
-
- public void reset() {
- mLastChangeAppType = 0;
- mLastChangeAppActive = false;
- }
-
- @Override
- public void onAppFocusChanged(CarAppFocusManager manager, int appType, boolean active) {
- Log.i(TAG, "onAppFocusChanged appType=" + appType + " active=" + active);
- assertMainThread();
- mLastChangeAppType = appType;
- mLastChangeAppActive = active;
- mChangeWait.release();
- }
- }
-
- private class FocusOwnershipCallback
- implements CarAppFocusManager.OnAppFocusOwnershipCallback {
- private int mLastLossEvent;
- private final Semaphore mLossEventWait = new Semaphore(0);
-
- private int mLastGrantEvent;
- private final Semaphore mGrantEventWait = new Semaphore(0);
-
- public boolean waitForOwnershipLossAndAssert(long timeoutMs, int expectedAppType)
- throws Exception {
- if (!mLossEventWait.tryAcquire(timeoutMs, TimeUnit.MILLISECONDS)) {
- return false;
- }
- assertEquals(expectedAppType, mLastLossEvent);
- return true;
- }
-
- public boolean waitForOwnershipGrantAndAssert(long timeoutMs, int expectedAppType)
- throws Exception {
- if (!mGrantEventWait.tryAcquire(timeoutMs, TimeUnit.MILLISECONDS)) {
- return false;
- }
- assertEquals(expectedAppType, mLastGrantEvent);
- return true;
- }
-
- @Override
- public void onAppFocusOwnershipLost(CarAppFocusManager manager, int appType) {
- Log.i(TAG, "onAppFocusOwnershipLost " + appType);
- assertMainThread();
- mLastLossEvent = appType;
- mLossEventWait.release();
- }
-
- @Override
- public void onAppFocusOwnershipGranted(CarAppFocusManager manager, int appType) {
- Log.i(TAG, "onAppFocusOwnershipGranted " + appType);
- assertMainThread();
- mLastGrantEvent = appType;
- mGrantEventWait.release();
- }
- }
-}
diff --git a/tests/android_support_car_api_test/src/com/android/support/car/apitest/CarNavigationStatusManagerTest.java b/tests/android_support_car_api_test/src/com/android/support/car/apitest/CarNavigationStatusManagerTest.java
deleted file mode 100644
index d57d9ee..0000000
--- a/tests/android_support_car_api_test/src/com/android/support/car/apitest/CarNavigationStatusManagerTest.java
+++ /dev/null
@@ -1,108 +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.support.car.apitest;
-
-import static android.support.car.CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION;
-
-import android.os.Bundle;
-import android.support.car.Car;
-import android.support.car.CarAppFocusManager;
-import android.support.car.CarAppFocusManager.OnAppFocusChangedListener;
-import android.support.car.CarAppFocusManager.OnAppFocusOwnershipCallback;
-import android.support.car.navigation.CarNavigationInstrumentCluster;
-import android.support.car.navigation.CarNavigationStatusManager;
-import android.test.suitebuilder.annotation.MediumTest;
-
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Unit tests for {@link android.support.car.navigation.CarNavigationStatusManager}
- */
-@MediumTest
-public class CarNavigationStatusManagerTest extends CarApiTestBase {
-
- private CarNavigationStatusManager mCarNavigationStatusManager;
- private CarAppFocusManager mCarAppFocusManager;
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- mCarNavigationStatusManager =
- (CarNavigationStatusManager) getCar().getCarManager(Car.CAR_NAVIGATION_SERVICE);
- assertNotNull(mCarNavigationStatusManager);
- mCarAppFocusManager =
- (CarAppFocusManager) getCar().getCarManager(Car.APP_FOCUS_SERVICE);
- assertNotNull(mCarAppFocusManager);
- }
-
- public void testStart() throws Exception {
- final CountDownLatch onStartLatch = new CountDownLatch(1);
-
- mCarNavigationStatusManager.addListener(
- new CarNavigationStatusManager.CarNavigationCallback() {
- @Override
- public void onInstrumentClusterStarted(CarNavigationStatusManager manager,
- CarNavigationInstrumentCluster instrumentCluster) {
- // return type cannot be asserted.
- instrumentCluster.supportsCustomImages();
- instrumentCluster.getMinIntervalMillis();
- onStartLatch.countDown();
- }
-
- @Override
- public void onInstrumentClusterStopped(CarNavigationStatusManager manager) {
- // TODO
- }
- });
-
- assertTrue(onStartLatch.await(DEFAULT_WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS));
-
- try {
- mCarNavigationStatusManager.sendEvent(1, new Bundle());
- fail();
- } catch (IllegalStateException expected) {
- // Expected. Client should acquire focus ownership for APP_FOCUS_TYPE_NAVIGATION.
- }
-
- mCarAppFocusManager
- .addFocusListener(new OnAppFocusChangedListener() {
- @Override
- public void onAppFocusChanged(CarAppFocusManager manager, int appType,
- boolean active) {
- // Nothing to do here.
- }
- }, APP_FOCUS_TYPE_NAVIGATION);
- CarAppFocusManager.OnAppFocusOwnershipCallback
- ownershipCallback = new OnAppFocusOwnershipCallback() {
- @Override
- public void onAppFocusOwnershipLost(CarAppFocusManager manager, int focusType) {
- // Nothing to do here.
- }
-
- @Override
- public void onAppFocusOwnershipGranted(CarAppFocusManager manager, int focusType) {
- // Nothing to do here.
- }
- };
- mCarAppFocusManager.requestAppFocus(APP_FOCUS_TYPE_NAVIGATION, ownershipCallback);
- assertTrue(mCarAppFocusManager.isOwningFocus(APP_FOCUS_TYPE_NAVIGATION, ownershipCallback));
-
- // TODO: we should use mocked HAL to be able to verify this, right now just make sure that
- // it is not crashing and logcat has appropriate traces.
- mCarNavigationStatusManager.sendEvent(1, new Bundle());
- }
-}
diff --git a/tests/android_support_car_api_test/src/com/android/support/car/apitest/CarPackageManagerTest.java b/tests/android_support_car_api_test/src/com/android/support/car/apitest/CarPackageManagerTest.java
deleted file mode 100644
index c42a8cb..0000000
--- a/tests/android_support_car_api_test/src/com/android/support/car/apitest/CarPackageManagerTest.java
+++ /dev/null
@@ -1,80 +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 com.android.support.car.apitest;
-
-import android.os.Looper;
-import android.support.car.Car;
-import android.support.car.CarConnectionCallback;
-import android.support.car.content.pm.CarPackageManager;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
-
-import java.util.concurrent.Semaphore;
-import java.util.concurrent.TimeUnit;
-
-@MediumTest
-public class CarPackageManagerTest extends AndroidTestCase {
- private static final long DEFAULT_WAIT_TIMEOUT_MS = 3000;
-
- private final Semaphore mConnectionWait = new Semaphore(0);
-
- private Car mCar;
- private CarPackageManager mCarPackageManager;
-
- private final CarConnectionCallback mConnectionCallbacks =
- new CarConnectionCallback() {
- @Override
- public void onDisconnected(Car car) {
- assertMainThread();
- }
-
-
- @Override
- public void onConnected(Car car) {
- assertMainThread();
- mConnectionWait.release();
- }
- };
-
- private void assertMainThread() {
- assertTrue(Looper.getMainLooper().isCurrentThread());
- }
-
- private void waitForConnection(long timeoutMs) throws InterruptedException {
- mConnectionWait.tryAcquire(timeoutMs, TimeUnit.MILLISECONDS);
- }
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- mCar = Car.createCar(getContext(), mConnectionCallbacks);
- mCar.connect();
- waitForConnection(DEFAULT_WAIT_TIMEOUT_MS);
- mCarPackageManager = (CarPackageManager) mCar.getCarManager(Car.PACKAGE_SERVICE);
- assertNotNull(mCarPackageManager);
- }
-
- @Override
- protected void tearDown() throws Exception {
- super.tearDown();
- mCar.disconnect();
- }
-
- public void testCreate() throws Exception {
- //nothing to do for now
- }
-}
diff --git a/tests/android_support_car_api_test/src/com/android/support/car/apitest/CarSensorManagerTest.java b/tests/android_support_car_api_test/src/com/android/support/car/apitest/CarSensorManagerTest.java
deleted file mode 100644
index bc97d67..0000000
--- a/tests/android_support_car_api_test/src/com/android/support/car/apitest/CarSensorManagerTest.java
+++ /dev/null
@@ -1,197 +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 com.android.support.car.apitest;
-
-import static android.content.pm.PackageManager.FEATURE_AUTOMOTIVE;
-
-import android.os.Looper;
-import android.support.car.Car;
-import android.support.car.CarConnectionCallback;
-import android.support.car.hardware.CarSensorEvent;
-import android.support.car.hardware.CarSensorManager;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
-
-import java.lang.reflect.Field;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.Semaphore;
-import java.util.concurrent.TimeUnit;
-
-@MediumTest
-public class CarSensorManagerTest extends AndroidTestCase {
- private static final long DEFAULT_WAIT_TIMEOUT_MS = 3000;
-
- private final Semaphore mConnectionWait = new Semaphore(0);
-
- private Car mCar;
- private CarSensorManager mCarSensorManager;
-
- private final CarConnectionCallback mConnectionCallbacks =
- new CarConnectionCallback() {
- @Override
- public void onDisconnected(Car car) {
- assertMainThread();
- }
-
- @Override
- public void onConnected(Car car) {
- assertMainThread();
- mConnectionWait.release();
- }
- };
-
- private void assertMainThread() {
- assertTrue(Looper.getMainLooper().isCurrentThread());
- }
- private void waitForConnection(long timeoutMs) throws InterruptedException {
- mConnectionWait.tryAcquire(timeoutMs, TimeUnit.MILLISECONDS);
- }
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- mCar = Car.createCar(getContext(), mConnectionCallbacks);
- mCar.connect();
- waitForConnection(DEFAULT_WAIT_TIMEOUT_MS);
- mCarSensorManager =
- (CarSensorManager) mCar.getCarManager(Car.SENSOR_SERVICE);
- }
-
- @Override
- protected void tearDown() throws Exception {
- super.tearDown();
- mCar.disconnect();
- }
-
- public void testDrivingPolicy() throws Exception {
- // Embedded does not support SENSOR_TYPE_DRIVING_STATUS. Hence this test is not run in
- // Android Auto Embedded.
- if (getContext().getPackageManager().hasSystemFeature(FEATURE_AUTOMOTIVE)) {
- return;
- }
-
- int[] supportedSensors = mCarSensorManager.getSupportedSensors();
- assertNotNull(supportedSensors);
- boolean found = false;
- for (int sensor: supportedSensors) {
- if (sensor == CarSensorManager.SENSOR_TYPE_DRIVING_STATUS) {
- found = true;
- break;
- }
- }
- assertTrue(found);
- assertTrue(mCarSensorManager.isSensorSupported(
- CarSensorManager.SENSOR_TYPE_DRIVING_STATUS));
- CarSensorEvent lastEvent = mCarSensorManager.getLatestSensorEvent(
- CarSensorManager.SENSOR_TYPE_DRIVING_STATUS);
- assertNotNull(lastEvent);
- }
-
- public void testSensorType() throws Exception {
- List<Field> androidCarAllIntMembers = TestUtil.getAllPublicStaticFinalMembers(
- android.car.hardware.CarSensorManager.class, int.class);
- List<Field> supportCarAllIntMembers = TestUtil.getAllPublicStaticFinalMembers(
- android.support.car.hardware.CarSensorManager.class, int.class);
- List<Field> androidCarSensorTypes = filterSensorTypes(androidCarAllIntMembers);
- List<Field> supportCarSensorTypes = filterSensorTypes(supportCarAllIntMembers);
- Map<Integer, Field> androidCarSensorTypeToField = new HashMap<>();
- for (Field androidCarSensorType : androidCarSensorTypes) {
- androidCarSensorTypeToField.put(androidCarSensorType.getInt(null),
- androidCarSensorType);
- }
- StringBuilder builder = new StringBuilder();
- boolean failed = false;
- for (Field supportCarSensorType : supportCarSensorTypes) {
- Field androidCarSensorType = androidCarSensorTypeToField.get(
- supportCarSensorType.getInt(null));
- assertNotNull("Sensor type:" + supportCarSensorType.getName() +
- " not defined in android.car", androidCarSensorType);
- if (supportCarSensorType.getName().equals(androidCarSensorType.getName())) {
- // match ok
- } else if (androidCarSensorType.getName().startsWith("SENSOR_TYPE_RESERVED")) {
- // not used in android.car, ok
- } else if (supportCarSensorType.getName().startsWith("SENSOR_TYPE_RESERVED")) {
- // used in android.car but reserved in support.car
- } else {
- failed = true;
- builder.append("android.support sensor has name:" + supportCarSensorType.getName() +
- " while android.car sensor has name:" + androidCarSensorType.getName() +
- "\n");
- }
- androidCarSensorTypeToField.remove(supportCarSensorType.getInt(null));
- }
- assertFalse(builder.toString(), failed);
- assertTrue("android Car sensor has additional types defined:" + androidCarSensorTypeToField,
- androidCarSensorTypeToField.size() == 0);
- }
-
- public void testSensorRate() throws Exception {
- List<Field> androidCarAllIntMembers = TestUtil.getAllPublicStaticFinalMembers(
- android.car.hardware.CarSensorManager.class, int.class);
- List<Field> supportCarAllIntMembers = TestUtil.getAllPublicStaticFinalMembers(
- android.support.car.hardware.CarSensorManager.class, int.class);
- List<Field> androidCarSensorRates = filterSensorRates(androidCarAllIntMembers);
- List<Field> supportCarSensorRates = filterSensorRates(supportCarAllIntMembers);
- Map<Integer, Field> androidCarSensorRateToField = new HashMap<>();
- for (Field androidCarSensorRate : androidCarSensorRates) {
- androidCarSensorRateToField.put(androidCarSensorRate.getInt(null),
- androidCarSensorRate);
- }
- StringBuilder builder = new StringBuilder();
- boolean failed = false;
- for (Field supprotCarSensorRate : supportCarSensorRates) {
- Field androidCarSensorRate = androidCarSensorRateToField.get(
- supprotCarSensorRate.getInt(null));
- assertNotNull("Sensor rate:" + supprotCarSensorRate.getName() +
- " not defined in android.car", androidCarSensorRate);
- if (supprotCarSensorRate.getName().equals(androidCarSensorRate.getName())) {
- // match ok
- } else {
- failed = true;
- builder.append("android.support sensor rate has name:" +
- supprotCarSensorRate.getName() +
- " while android.car sensor rate has name:" +
- androidCarSensorRate.getName());
- }
- androidCarSensorRateToField.remove(supprotCarSensorRate.getInt(null));
- }
- assertFalse(builder.toString(), failed);
- assertTrue("android Car sensor has additional rates defined:" + androidCarSensorRateToField,
- androidCarSensorRateToField.size() == 0);
- }
-
- private List<Field> filterSensorTypes(List<Field> fields) {
- return filterFields(fields, "SENSOR_TYPE_");
- }
-
- private List<Field> filterSensorRates(List<Field> fields) {
- return filterFields(fields, "SENSOR_RATE_");
- }
-
- private List<Field> filterFields(List<Field> fields, String prefix) {
- List<Field> result = new LinkedList<>();
- for (Field f : fields) {
- if (f.getName().startsWith(prefix)) {
- result.add(f);
- }
- }
- return result;
- }
-}
diff --git a/tests/android_support_car_api_test/src/com/android/support/car/apitest/CarTest.java b/tests/android_support_car_api_test/src/com/android/support/car/apitest/CarTest.java
deleted file mode 100644
index d707253..0000000
--- a/tests/android_support_car_api_test/src/com/android/support/car/apitest/CarTest.java
+++ /dev/null
@@ -1,96 +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 com.android.support.car.apitest;
-
-import android.os.Looper;
-import android.support.car.Car;
-import android.support.car.CarConnectionCallback;
-import android.support.car.hardware.CarSensorManager;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
-
-import java.util.concurrent.Semaphore;
-import java.util.concurrent.TimeUnit;
-
-@MediumTest
-public class CarTest extends AndroidTestCase {
- private static final long DEFAULT_WAIT_TIMEOUT_MS = 3000;
-
- private final Semaphore mConnectionWait = new Semaphore(0);
-
- private final CarConnectionCallback mConnectionCallbacks =
- new CarConnectionCallback() {
-
- @Override
- public void onDisconnected(Car car) {
- assertMainThread();
- }
-
- @Override
- public void onConnected(Car car) {
- assertMainThread();
- mConnectionWait.release();
- }
- };
-
- private void assertMainThread() {
- assertTrue(Looper.getMainLooper().isCurrentThread());
- }
-
- private void waitForConnection(long timeoutMs) throws InterruptedException {
- mConnectionWait.tryAcquire(timeoutMs, TimeUnit.MILLISECONDS);
- }
-
- public void testCarConnection() throws Exception {
- Car car = Car.createCar(getContext(), mConnectionCallbacks);
- assertFalse(car.isConnected());
- assertFalse(car.isConnecting());
- car.connect();
- //TODO fix race here
- assertTrue(car.isConnecting());
- waitForConnection(DEFAULT_WAIT_TIMEOUT_MS);
- assertTrue(car.isConnected());
- assertFalse(car.isConnecting());
- CarSensorManager carSensorManager =
- (CarSensorManager) car.getCarManager(Car.SENSOR_SERVICE);
- assertNotNull(carSensorManager);
- CarSensorManager carSensorManager2 =
- (CarSensorManager) car.getCarManager(Car.SENSOR_SERVICE);
- assertEquals(carSensorManager, carSensorManager2);
- Object noSuchService = car.getCarManager("No such service");
- assertNull(noSuchService);
- // double disconnect should be safe.
- car.disconnect();
- car.disconnect();
- assertFalse(car.isConnected());
- assertFalse(car.isConnecting());
- }
-
- public void testDoubleConnect() throws Exception {
- Car car = Car.createCar(getContext(), mConnectionCallbacks);
- assertFalse(car.isConnected());
- assertFalse(car.isConnecting());
- car.connect();
- try {
- car.connect();
- fail("double connect should throw an exception");
- } catch (IllegalStateException e) {
- // expected
- }
- car.disconnect();
- }
-}
diff --git a/tests/android_support_car_api_test/src/com/android/support/car/apitest/TestAction.java b/tests/android_support_car_api_test/src/com/android/support/car/apitest/TestAction.java
deleted file mode 100644
index 472b825..0000000
--- a/tests/android_support_car_api_test/src/com/android/support/car/apitest/TestAction.java
+++ /dev/null
@@ -1,91 +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 com.android.support.car.apitest;
-
-import android.util.Log;
-
-import java.util.concurrent.Semaphore;
-import java.util.concurrent.TimeUnit;
-
-import junit.framework.Assert;
-
-/**
- * A generic test action, whose run method will be called with a parameter.
- */
-public abstract class TestAction<T> {
- /** for passing additional test specific parameters */
- public volatile Object arg0;
- public volatile Object arg1;
- private static final String TAG = "CAR.TEST";
- private Throwable mLastThrowable;
- private Semaphore mWaitSemaphore = new Semaphore(0);
-
- abstract public void run(T param);
-
- public void doRun(T param) {
- Log.i(TAG, "TestAction doRun " + this + " param:" + param);
- try {
- run(param);
- } catch (Throwable t) {
- Log.i(TAG, "TestAction doRun get exception", t);
- mLastThrowable = t;
- }
- mWaitSemaphore.release();
- }
-
- public void assertTestRun(long timeoutMs) throws Throwable {
- if (!mWaitSemaphore.tryAcquire(timeoutMs, TimeUnit.MILLISECONDS)) {
- Assert.fail("timeout");
- }
- if (mLastThrowable != null) {
- throw mLastThrowable;
- }
- }
-
- public void assertNotRun(long waitMs) throws Throwable {
- if (!mWaitSemaphore.tryAcquire(waitMs, TimeUnit.MILLISECONDS)) {
- return;
- }
- if (mLastThrowable != null) {
- Log.e(TAG, "Action was run, but failed");
- throw mLastThrowable;
- }
- Assert.fail("Action was run");
- }
-
- public boolean waitForTest(long timeoutMs) throws Throwable {
- if (mWaitSemaphore.tryAcquire(timeoutMs, TimeUnit.MILLISECONDS)) {
- if (mLastThrowable != null) {
- throw mLastThrowable;
- }
- return true;
- }
- return false;
- }
-
- public void resetRunState() {
- mWaitSemaphore.drainPermits();
- }
-
- public static <U> TestAction<U> buildEmptyAction() {
- return new TestAction<U>() {
- @Override
- public void run(U param) {
- }
- };
- }
-}
diff --git a/tests/android_support_car_api_test/src/com/android/support/car/apitest/TestUtil.java b/tests/android_support_car_api_test/src/com/android/support/car/apitest/TestUtil.java
deleted file mode 100644
index 71213ad..0000000
--- a/tests/android_support_car_api_test/src/com/android/support/car/apitest/TestUtil.java
+++ /dev/null
@@ -1,35 +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.support.car.apitest;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-import java.util.LinkedList;
-import java.util.List;
-
-public class TestUtil {
-
- public static List<Field> getAllPublicStaticFinalMembers(Class cls, Class typeClass) {
- List<Field> result = new LinkedList<>();
- for (Field f : cls.getDeclaredFields()) {
- int mod = f.getModifiers();
- if (Modifier.isPublic(mod) && Modifier.isStatic(mod) && Modifier.isFinal(mod)) {
- result.add(f);
- }
- }
- return result;
- }
-}
diff --git a/tests/carservice_test/Android.mk b/tests/carservice_test/Android.mk
index d4c327c..2ac3256 100644
--- a/tests/carservice_test/Android.mk
+++ b/tests/carservice_test/Android.mk
@@ -20,7 +20,8 @@
LOCAL_SRC_FILES := $(call all-java-files-under, src)
-LOCAL_RESOURCE_DIR += packages/services/Car/service/res
+LOCAL_RESOURCE_DIR += $(LOCAL_PATH)/res \
+ packages/services/Car/service/res
LOCAL_AAPT_FLAGS += --extra-packages com.android.car --auto-add-overlay
@@ -38,16 +39,21 @@
LOCAL_PROGUARD_ENABLED := disabled
LOCAL_STATIC_JAVA_LIBRARIES := junit
-LOCAL_STATIC_JAVA_LIBRARIES += car-service-lib-for-test \
- vehicle-hal-support-lib \
- car-systemtest \
- mockito-target-inline \
- android-support-test \
- android.hardware.automotive.vehicle-V2.0-java \
- com.android.car.test.utils \
- truth-prebuilt
+LOCAL_STATIC_JAVA_LIBRARIES += \
+ car-service-lib-for-test \
+ vehicle-hal-support-lib \
+ car-systemtest \
+ mockito-target-inline \
+ androidx.test.rules \
+ android.hardware.automotive.vehicle-V2.0-java \
+ com.android.car.test.utils \
+ truth-prebuilt
-LOCAL_JAVA_LIBRARIES := android.car android.test.runner android.test.base
+LOCAL_JAVA_LIBRARIES := \
+ android.car \
+ android.car.userlib \
+ android.test.runner \
+ android.test.base
LOCAL_JNI_SHARED_LIBRARIES := libdexmakerjvmtiagent
diff --git a/tests/carservice_test/AndroidManifest.xml b/tests/carservice_test/AndroidManifest.xml
index 19a5552..7c92513 100644
--- a/tests/carservice_test/AndroidManifest.xml
+++ b/tests/carservice_test/AndroidManifest.xml
@@ -29,7 +29,7 @@
<uses-permission android:name="android.car.permission.CAR_CONTROL_AUDIO_SETTINGS" />
<uses-permission android:name="android.car.permission.STORAGE_MONITORING" />
- <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+ <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
android:targetPackage="com.android.car.test"
android:label="Tests for Car APIs"/>
@@ -50,6 +50,7 @@
<activity android:name="com.android.car.SystemActivityMonitoringServiceTest$ActivityA"/>
<activity android:name="com.android.car.SystemActivityMonitoringServiceTest$ActivityB"/>
<activity android:name="com.android.car.SystemActivityMonitoringServiceTest$ActivityC"/>
+ <activity android:name="com.android.car.SystemActivityMonitoringServiceTest$ActivityThatFinishesImmediately"/>
<activity android:name="com.android.car.SystemActivityMonitoringServiceTest$BlockingActivity"
android:taskAffinity="com.android.car.carservicetest.block"/>
diff --git a/tests/carservice_test/res/xml/ux_restrictions_moving_state_multi_speed_range.xml b/tests/carservice_test/res/xml/ux_restrictions_moving_state_multi_speed_range.xml
new file mode 100644
index 0000000..9dd3678
--- /dev/null
+++ b/tests/carservice_test/res/xml/ux_restrictions_moving_state_multi_speed_range.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+This xml contains UX restrictions configuration for testing.
+-->
+<UxRestrictions xmlns:car="http://schemas.android.com/apk/res-auto">
+ <RestrictionMapping>
+ <DrivingState car:state="moving" car:minSpeed="0" car:maxSpeed="5.0">
+ <Restrictions car:requiresDistractionOptimization="true" car:uxr="no_video"/>
+ </DrivingState>
+ <!-- Restrictions for speed >=5 -->
+ <DrivingState car:state="moving" car:minSpeed="5.0">
+ <Restrictions car:requiresDistractionOptimization="true" car:uxr="no_keyboard"/>
+ </DrivingState>
+ </RestrictionMapping>
+</UxRestrictions>
diff --git a/tests/carservice_test/res/xml/ux_restrictions_moving_state_no_speed_range.xml b/tests/carservice_test/res/xml/ux_restrictions_moving_state_no_speed_range.xml
new file mode 100644
index 0000000..405619e
--- /dev/null
+++ b/tests/carservice_test/res/xml/ux_restrictions_moving_state_no_speed_range.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+This xml contains UX restrictions configuration for testing.
+-->
+
+<UxRestrictions xmlns:car="http://schemas.android.com/apk/res-auto">
+ <RestrictionMapping>
+ <DrivingState car:state="moving">
+ <Restrictions car:requiresDistractionOptimization="true" car:uxr="no_video"/>
+ </DrivingState>
+ </RestrictionMapping>
+</UxRestrictions>
diff --git a/tests/carservice_test/res/xml/ux_restrictions_moving_state_single_speed_range.xml b/tests/carservice_test/res/xml/ux_restrictions_moving_state_single_speed_range.xml
new file mode 100644
index 0000000..4cd11b0
--- /dev/null
+++ b/tests/carservice_test/res/xml/ux_restrictions_moving_state_single_speed_range.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+This xml contains UX restrictions configuration for testing.
+-->
+<UxRestrictions xmlns:car="http://schemas.android.com/apk/res-auto">
+ <RestrictionMapping>
+ <DrivingState car:state="moving" car:minSpeed="0">
+ <Restrictions car:requiresDistractionOptimization="true" car:uxr="no_video"/>
+ </DrivingState>
+ </RestrictionMapping>
+</UxRestrictions>
diff --git a/tests/carservice_test/res/xml/ux_restrictions_non_moving_state.xml b/tests/carservice_test/res/xml/ux_restrictions_non_moving_state.xml
new file mode 100644
index 0000000..cc49260
--- /dev/null
+++ b/tests/carservice_test/res/xml/ux_restrictions_non_moving_state.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+This xml contains UX restrictions configuration for testing.
+-->
+<UxRestrictions xmlns:car="http://schemas.android.com/apk/res-auto">
+ <RestrictionMapping>
+ <DrivingState car:state="parked">
+ <Restrictions car:requiresDistractionOptimization="false" car:uxr="baseline"/>
+ </DrivingState>
+ <DrivingState car:state="idling">
+ <Restrictions car:requiresDistractionOptimization="true" car:uxr="no_video"/>
+ </DrivingState>
+ </RestrictionMapping>
+</UxRestrictions>
diff --git a/tests/carservice_test/res/xml/ux_restrictions_only_parameters.xml b/tests/carservice_test/res/xml/ux_restrictions_only_parameters.xml
new file mode 100644
index 0000000..4c30c16
--- /dev/null
+++ b/tests/carservice_test/res/xml/ux_restrictions_only_parameters.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+This xml contains UX restrictions configuration for testing.
+-->
+
+<UxRestrictions xmlns:car="http://schemas.android.com/apk/res-auto">
+ <!-- restriction parameters -->
+ <RestrictionParameters>
+ <StringRestrictions car:maxLength="1"/>
+ <ContentRestrictions car:maxCumulativeItems="1" car:maxDepth="1"/>
+ </RestrictionParameters>
+</UxRestrictions>
diff --git a/tests/carservice_test/src/android/media/tests/AudioPolicyTest.java b/tests/carservice_test/src/android/media/tests/AudioPolicyTest.java
index 9fcf449..9e0f311 100644
--- a/tests/carservice_test/src/android/media/tests/AudioPolicyTest.java
+++ b/tests/carservice_test/src/android/media/tests/AudioPolicyTest.java
@@ -30,11 +30,12 @@
import android.media.audiopolicy.AudioPolicy;
import android.os.Handler;
import android.os.Looper;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.MediumTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.Log;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.MediumTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/tests/carservice_test/src/com/android/car/AppFocusTest.java b/tests/carservice_test/src/com/android/car/AppFocusTest.java
index 630717f..910a132 100644
--- a/tests/carservice_test/src/com/android/car/AppFocusTest.java
+++ b/tests/carservice_test/src/com/android/car/AppFocusTest.java
@@ -19,10 +19,11 @@
import android.car.Car;
import android.car.CarAppFocusManager;
-import android.support.test.filters.MediumTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.Log;
+import androidx.test.filters.MediumTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/tests/carservice_test/src/com/android/car/CarAudioManagerTest.java b/tests/carservice_test/src/com/android/car/CarAudioManagerTest.java
index 1eb641f..d11159e 100644
--- a/tests/carservice_test/src/com/android/car/CarAudioManagerTest.java
+++ b/tests/carservice_test/src/com/android/car/CarAudioManagerTest.java
@@ -17,10 +17,11 @@
import android.car.Car;
import android.car.media.CarAudioManager;
-import android.support.test.filters.MediumTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.Log;
+import androidx.test.filters.MediumTest;
+import androidx.test.runner.AndroidJUnit4;
+
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/tests/carservice_test/src/com/android/car/CarCabinManagerTest.java b/tests/carservice_test/src/com/android/car/CarCabinManagerTest.java
index 67725b9..46d54b7 100644
--- a/tests/carservice_test/src/com/android/car/CarCabinManagerTest.java
+++ b/tests/carservice_test/src/com/android/car/CarCabinManagerTest.java
@@ -30,11 +30,12 @@
import android.hardware.automotive.vehicle.V2_0.VehiclePropValue;
import android.hardware.automotive.vehicle.V2_0.VehicleProperty;
import android.os.SystemClock;
-import android.support.test.filters.MediumTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.Log;
import android.util.MutableInt;
+import androidx.test.filters.MediumTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.car.vehiclehal.VehiclePropValueBuilder;
import com.android.car.vehiclehal.test.MockedVehicleHal.VehicleHalPropertyHandler;
diff --git a/tests/carservice_test/src/com/android/car/CarDiagnosticConstantsTest.java b/tests/carservice_test/src/com/android/car/CarDiagnosticConstantsTest.java
index 4d08e2d..2955345 100644
--- a/tests/carservice_test/src/com/android/car/CarDiagnosticConstantsTest.java
+++ b/tests/carservice_test/src/com/android/car/CarDiagnosticConstantsTest.java
@@ -16,10 +16,11 @@
package com.android.car;
-import android.support.test.filters.MediumTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.Log;
+import androidx.test.filters.MediumTest;
+import androidx.test.runner.AndroidJUnit4;
+
import junit.framework.TestCase;
import org.junit.Test;
diff --git a/tests/carservice_test/src/com/android/car/CarDiagnosticManagerTest.java b/tests/carservice_test/src/com/android/car/CarDiagnosticManagerTest.java
index ac07d0e..f73c401 100644
--- a/tests/carservice_test/src/com/android/car/CarDiagnosticManagerTest.java
+++ b/tests/carservice_test/src/com/android/car/CarDiagnosticManagerTest.java
@@ -16,7 +16,6 @@
package com.android.car;
-import static java.lang.Integer.toHexString;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
@@ -37,12 +36,13 @@
import android.hardware.automotive.vehicle.V2_0.VehiclePropValue;
import android.hardware.automotive.vehicle.V2_0.VehicleProperty;
import android.os.SystemClock;
-import android.support.test.filters.MediumTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.JsonReader;
import android.util.JsonWriter;
import android.util.Log;
+import androidx.test.filters.MediumTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.car.vehiclehal.DiagnosticEventBuilder;
import com.android.car.vehiclehal.DiagnosticJson;
import com.android.car.vehiclehal.VehiclePropValueBuilder;
@@ -51,6 +51,8 @@
import org.junit.Test;
import org.junit.runner.RunWith;
+import static java.lang.Integer.toHexString;
+
import java.io.StringReader;
import java.io.StringWriter;
import java.util.Arrays;
diff --git a/tests/carservice_test/src/com/android/car/CarDrivingRestrictionsTest.java b/tests/carservice_test/src/com/android/car/CarDrivingRestrictionsTest.java
index 31ed4b2..88b00cc 100644
--- a/tests/carservice_test/src/com/android/car/CarDrivingRestrictionsTest.java
+++ b/tests/carservice_test/src/com/android/car/CarDrivingRestrictionsTest.java
@@ -31,10 +31,11 @@
import android.hardware.automotive.vehicle.V2_0.VehicleGear;
import android.hardware.automotive.vehicle.V2_0.VehicleProperty;
import android.os.SystemClock;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.Log;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.car.vehiclehal.VehiclePropValueBuilder;
import com.android.internal.annotations.GuardedBy;
@@ -48,6 +49,16 @@
.getSimpleName();
private CarDrivingStateManager mCarDrivingStateManager;
private CarUxRestrictionsManager mCarUxRManager;
+ // Currently set restrictions currently set in car_ux_restrictions_map.xml
+ private static final int UX_RESTRICTIONS_MOVING = CarUxRestrictions.UX_RESTRICTIONS_NO_DIALPAD
+ | CarUxRestrictions.UX_RESTRICTIONS_NO_FILTERING
+ | CarUxRestrictions.UX_RESTRICTIONS_LIMIT_STRING_LENGTH
+ | CarUxRestrictions.UX_RESTRICTIONS_NO_KEYBOARD
+ | CarUxRestrictions.UX_RESTRICTIONS_NO_VIDEO
+ | CarUxRestrictions.UX_RESTRICTIONS_LIMIT_CONTENT
+ | CarUxRestrictions.UX_RESTRICTIONS_NO_SETUP
+ | CarUxRestrictions.UX_RESTRICTIONS_NO_TEXT_MESSAGE;
+
@Override
protected synchronized void configureMockedHal() {
@@ -128,8 +139,7 @@
restrictions = listener.waitForUxRestrictionsChange();
assertNotNull(restrictions);
assertTrue(restrictions.isRequiresDistractionOptimization());
- assertThat(restrictions.getActiveRestrictions())
- .isEqualTo(CarUxRestrictions.UX_RESTRICTIONS_FULLY_RESTRICTED);
+ assertThat(restrictions.getActiveRestrictions()).isEqualTo(UX_RESTRICTIONS_MOVING);
// Test Idling state and corresponding restrictions based on car_ux_restrictions_map.xml
listener.reset();
diff --git a/tests/carservice_test/src/com/android/car/CarHvacManagerTest.java b/tests/carservice_test/src/com/android/car/CarHvacManagerTest.java
index 1493fe9..a32cca5 100644
--- a/tests/carservice_test/src/com/android/car/CarHvacManagerTest.java
+++ b/tests/carservice_test/src/com/android/car/CarHvacManagerTest.java
@@ -32,11 +32,12 @@
import android.hardware.automotive.vehicle.V2_0.VehiclePropertyAccess;
import android.hardware.automotive.vehicle.V2_0.VehiclePropertyChangeMode;
import android.os.SystemClock;
-import android.support.test.filters.MediumTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.Log;
import android.util.MutableInt;
+import androidx.test.filters.MediumTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.car.vehiclehal.VehiclePropValueBuilder;
import com.android.car.vehiclehal.test.MockedVehicleHal.VehicleHalPropertyHandler;
diff --git a/tests/carservice_test/src/com/android/car/CarInfoManagerTest.java b/tests/carservice_test/src/com/android/car/CarInfoManagerTest.java
index 9f5aa3a..f028663 100644
--- a/tests/carservice_test/src/com/android/car/CarInfoManagerTest.java
+++ b/tests/carservice_test/src/com/android/car/CarInfoManagerTest.java
@@ -22,8 +22,9 @@
import android.car.Car;
import android.car.CarInfoManager;
import android.hardware.automotive.vehicle.V2_0.VehicleProperty;
-import android.support.test.filters.MediumTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.MediumTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.car.vehiclehal.VehiclePropValueBuilder;
diff --git a/tests/carservice_test/src/com/android/car/CarPackageManagerTest.java b/tests/carservice_test/src/com/android/car/CarPackageManagerTest.java
index 9c65555..8068241 100644
--- a/tests/carservice_test/src/com/android/car/CarPackageManagerTest.java
+++ b/tests/carservice_test/src/com/android/car/CarPackageManagerTest.java
@@ -24,10 +24,12 @@
import android.car.content.pm.AppBlockingPackageInfo;
import android.car.content.pm.CarAppBlockingPolicy;
import android.car.content.pm.CarPackageManager;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.Log;
+import androidx.test.filters.SmallTest;
+import androidx.test.filters.Suppress;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.car.pm.CarPackageManagerService;
import org.junit.Test;
@@ -82,6 +84,9 @@
assertFalse(mCarPm.isServiceDistractionOptimized(serviceClassName, null));
}
+ // TODO(b/113531788): Suppress this temporarily. Need to find the cause of issue and re-evaluate
+ // if the test is necessary.
+ @Suppress
@Test
public void testSettingWhitelist() throws Exception {
init(false);
diff --git a/tests/carservice_test/src/com/android/car/CarPowerManagementTest.java b/tests/carservice_test/src/com/android/car/CarPowerManagementTest.java
index c449302..ab5c271 100644
--- a/tests/carservice_test/src/com/android/car/CarPowerManagementTest.java
+++ b/tests/carservice_test/src/com/android/car/CarPowerManagementTest.java
@@ -18,7 +18,6 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
-import android.hardware.automotive.vehicle.V2_0.VehicleApPowerBootupReason;
import android.hardware.automotive.vehicle.V2_0.VehicleApPowerStateConfigFlag;
import android.hardware.automotive.vehicle.V2_0.VehicleApPowerStateReport;
import android.hardware.automotive.vehicle.V2_0.VehicleApPowerStateReq;
@@ -26,10 +25,13 @@
import android.hardware.automotive.vehicle.V2_0.VehicleApPowerStateShutdownParam;
import android.hardware.automotive.vehicle.V2_0.VehiclePropValue;
import android.hardware.automotive.vehicle.V2_0.VehicleProperty;
+import android.hardware.automotive.vehicle.V2_0.VehiclePropertyAccess;
+import android.hardware.automotive.vehicle.V2_0.VehiclePropertyChangeMode;
import android.os.SystemClock;
-import android.support.test.annotation.UiThreadTest;
-import android.support.test.filters.MediumTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.filters.MediumTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.car.systeminterface.DisplayInterface;
import com.android.car.systeminterface.SystemInterface;
@@ -59,75 +61,219 @@
return builder.withDisplayInterface(mMockDisplayInterface);
}
- private void setupPowerPropertyAndStart(boolean allowSleep) throws Exception {
+ protected synchronized void configureMockedHal() {
addProperty(VehicleProperty.AP_POWER_STATE_REQ, mPowerStateHandler)
.setConfigArray(Lists.newArrayList(
- allowSleep ? VehicleApPowerStateConfigFlag.ENABLE_DEEP_SLEEP_FLAG : 0));
- addProperty(VehicleProperty.AP_POWER_STATE_REPORT, mPowerStateHandler);
+ VehicleApPowerStateConfigFlag.ENABLE_DEEP_SLEEP_FLAG))
+ .setChangeMode(VehiclePropertyChangeMode.ON_CHANGE).build();
+ addProperty(VehicleProperty.AP_POWER_STATE_REPORT, mPowerStateHandler)
+ .setAccess(VehiclePropertyAccess.WRITE)
+ .setChangeMode(VehiclePropertyChangeMode.ON_CHANGE).build();
+ }
- addStaticProperty(VehicleProperty.AP_POWER_BOOTUP_REASON,
- VehiclePropValueBuilder.newBuilder(VehicleProperty.AP_POWER_BOOTUP_REASON)
- .addIntValue(VehicleApPowerBootupReason.USER_POWER_ON)
- .build());
-
- reinitializeMockedHal();
+ /**********************************************************************************************
+ * Test immediate shutdown
+ **********************************************************************************************/
+ @Test
+ @UiThreadTest
+ public void testImmediateShutdownFromWaitForVhal() throws Exception {
+ assertWaitForVhal();
+ mPowerStateHandler.sendStateAndCheckResponse(
+ VehicleApPowerStateReq.SHUTDOWN_PREPARE,
+ VehicleApPowerStateShutdownParam.SHUTDOWN_IMMEDIATELY,
+ VehicleApPowerStateReport.SHUTDOWN_START);
}
@Test
@UiThreadTest
- public void testImmediateShutdown() throws Exception {
- setupPowerPropertyAndStart(true);
- assertBootComplete();
- mPowerStateHandler.sendPowerState(
+ public void testImmediateShutdownFromOn() throws Exception {
+ assertWaitForVhal();
+ // Transition to ON state first
+ mPowerStateHandler.sendStateAndCheckResponse(
+ VehicleApPowerStateReq.ON,
+ 0,
+ VehicleApPowerStateReport.ON);
+ // Send immediate shutdown from ON state
+ mPowerStateHandler.sendStateAndCheckResponse(
+ VehicleApPowerStateReq.SHUTDOWN_PREPARE,
+ VehicleApPowerStateShutdownParam.SHUTDOWN_IMMEDIATELY,
+ VehicleApPowerStateReport.SHUTDOWN_START);
+ }
+
+ @Test
+ @UiThreadTest
+ public void testImmediateShutdownFromShutdownPrepare() throws Exception {
+ assertWaitForVhal();
+ // Put device into SHUTDOWN_PREPARE
+ mPowerStateHandler.sendStateAndCheckResponse(
+ VehicleApPowerStateReq.SHUTDOWN_PREPARE,
+ VehicleApPowerStateShutdownParam.CAN_SLEEP,
+ VehicleApPowerStateReport.SHUTDOWN_PREPARE);
+ // Initiate shutdown immediately while in SHUTDOWN_PREPARE
+ mPowerStateHandler.sendStateAndCheckResponse(
+ VehicleApPowerStateReq.SHUTDOWN_PREPARE,
+ VehicleApPowerStateShutdownParam.SHUTDOWN_IMMEDIATELY,
+ VehicleApPowerStateReport.SHUTDOWN_START);
+ }
+
+ /**********************************************************************************************
+ * Test cancelling of shutdown.
+ **********************************************************************************************/
+ @Test
+ @UiThreadTest
+ public void testCancelShutdownFromShutdownPrepare() throws Exception {
+ assertWaitForVhal();
+ mPowerStateHandler.sendStateAndCheckResponse(
+ VehicleApPowerStateReq.SHUTDOWN_PREPARE,
+ VehicleApPowerStateShutdownParam.CAN_SLEEP,
+ VehicleApPowerStateReport.SHUTDOWN_PREPARE);
+ // Shutdown may only be cancelled from SHUTDOWN_PREPARE
+ mPowerStateHandler.sendStateAndCheckResponse(
+ VehicleApPowerStateReq.CANCEL_SHUTDOWN,
+ 0,
+ VehicleApPowerStateReport.SHUTDOWN_CANCELLED);
+ }
+
+ /**********************************************************************************************
+ * Test for invalid state transtions
+ **********************************************************************************************/
+ @Test
+ @UiThreadTest
+ public void testInivalidTransitionsFromWaitForVhal() throws Exception {
+ assertWaitForVhal();
+ mPowerStateHandler.sendStateAndExpectNoResponse(VehicleApPowerStateReq.CANCEL_SHUTDOWN, 0);
+ mPowerStateHandler.sendStateAndExpectNoResponse(VehicleApPowerStateReq.FINISHED, 0);
+ }
+
+ @Test
+ @UiThreadTest
+ public void testInvalidTransitionsFromOn() throws Exception {
+ assertWaitForVhal();
+ // Transition to ON state first
+ mPowerStateHandler.sendStateAndCheckResponse(
+ VehicleApPowerStateReq.ON,
+ 0,
+ VehicleApPowerStateReport.ON);
+ mPowerStateHandler.sendStateAndExpectNoResponse(VehicleApPowerStateReq.CANCEL_SHUTDOWN, 0);
+ mPowerStateHandler.sendStateAndExpectNoResponse(VehicleApPowerStateReq.FINISHED, 0);
+ }
+
+ @Test
+ @UiThreadTest
+ public void testInvalidTransitionsFromPrepareShutdown() throws Exception {
+ assertWaitForVhal();
+ // Increase the timeout to handle all the test cases here
+ CarPowerManagementService.setShutdownPrepareTimeout(15 * 1000);
+ // Transition to SHUTDOWN_PREPARE first
+ mPowerStateHandler.sendStateAndCheckResponse(
+ VehicleApPowerStateReq.SHUTDOWN_PREPARE,
+ VehicleApPowerStateShutdownParam.CAN_SLEEP,
+ VehicleApPowerStateReport.SHUTDOWN_PREPARE);
+ // Cannot go back to ON state from here
+ mPowerStateHandler.sendStateAndExpectNoResponse(VehicleApPowerStateReq.ON, 0);
+ // PREPARE_SHUTDOWN should not generate state transitions unless it's an IMMEDIATE_SHUTDOWN
+ mPowerStateHandler.sendStateAndExpectNoResponse(
+ VehicleApPowerStateReq.SHUTDOWN_PREPARE,
+ VehicleApPowerStateShutdownParam.CAN_SLEEP);
+ mPowerStateHandler.sendStateAndExpectNoResponse(
+ VehicleApPowerStateReq.SHUTDOWN_PREPARE,
+ VehicleApPowerStateShutdownParam.SHUTDOWN_ONLY);
+ // Test the FINISH message last, in case SHUTDOWN_PREPARE finishes early and this test
+ // should be failing.
+ mPowerStateHandler.sendStateAndExpectNoResponse(VehicleApPowerStateReq.FINISHED, 0);
+ }
+
+ @Test
+ @UiThreadTest
+ public void testInvalidTransitionsFromWaitForFinish() throws Exception {
+ assertWaitForVhal();
+ mPowerStateHandler.sendStateAndCheckResponse(
+ VehicleApPowerStateReq.SHUTDOWN_PREPARE,
+ VehicleApPowerStateShutdownParam.CAN_SLEEP,
+ VehicleApPowerStateReport.DEEP_SLEEP_ENTRY);
+ // Once the device has entered WAIT_FOR_FINISH, shutdown cannot be cancelled.
+ mPowerStateHandler.sendStateAndExpectNoResponse(VehicleApPowerStateReq.CANCEL_SHUTDOWN, 0);
+ mPowerStateHandler.sendStateAndExpectNoResponse(VehicleApPowerStateReq.ON, 0);
+ mPowerStateHandler.sendStateAndExpectNoResponse(
+ VehicleApPowerStateReq.SHUTDOWN_PREPARE,
+ VehicleApPowerStateShutdownParam.CAN_SLEEP);
+ mPowerStateHandler.sendStateAndExpectNoResponse(
+ VehicleApPowerStateReq.SHUTDOWN_PREPARE,
+ VehicleApPowerStateShutdownParam.SHUTDOWN_ONLY);
+ // TODO: This state may be allowed in the future, if we decide it's necessary
+ mPowerStateHandler.sendStateAndExpectNoResponse(
VehicleApPowerStateReq.SHUTDOWN_PREPARE,
VehicleApPowerStateShutdownParam.SHUTDOWN_IMMEDIATELY);
- mPowerStateHandler.waitForStateSetAndGetAll(DEFAULT_WAIT_TIMEOUT_MS,
- VehicleApPowerStateReport.SHUTDOWN_START);
- mPowerStateHandler.sendPowerState(VehicleApPowerStateReq.ON_FULL, 0);
}
@Test
@UiThreadTest
- public void testDisplayOnOff() throws Exception {
- setupPowerPropertyAndStart(true);
- assertBootComplete();
- for (int i = 0; i < 2; i++) {
- mPowerStateHandler.sendPowerState(VehicleApPowerStateReq.ON_DISP_OFF, 0);
- mMockDisplayInterface.waitForDisplayState(false);
- mPowerStateHandler.sendPowerState(VehicleApPowerStateReq.ON_FULL, 0);
- mMockDisplayInterface.waitForDisplayState(true);
+ public void testInvalidTransitionsFromWaitForFinish2() throws Exception {
+ assertWaitForVhal();
+ mPowerStateHandler.sendStateAndCheckResponse(
+ VehicleApPowerStateReq.SHUTDOWN_PREPARE,
+ VehicleApPowerStateShutdownParam.SHUTDOWN_ONLY,
+ VehicleApPowerStateReport.SHUTDOWN_START);
+ // Once the device has entered WAIT_FOR_FINISH, shutdown cannot be cancelled.
+ mPowerStateHandler.sendStateAndExpectNoResponse(VehicleApPowerStateReq.CANCEL_SHUTDOWN, 0);
+ mPowerStateHandler.sendStateAndExpectNoResponse(VehicleApPowerStateReq.ON, 0);
+ mPowerStateHandler.sendStateAndExpectNoResponse(
+ VehicleApPowerStateReq.SHUTDOWN_PREPARE,
+ VehicleApPowerStateShutdownParam.CAN_SLEEP);
+ mPowerStateHandler.sendStateAndExpectNoResponse(
+ VehicleApPowerStateReq.SHUTDOWN_PREPARE,
+ VehicleApPowerStateShutdownParam.SHUTDOWN_ONLY);
+ // TODO: This state may be allowed in the future, if we decide it's necessary
+ mPowerStateHandler.sendStateAndExpectNoResponse(
+ VehicleApPowerStateReq.SHUTDOWN_PREPARE,
+ VehicleApPowerStateShutdownParam.SHUTDOWN_IMMEDIATELY);
+ }
+
+ /**********************************************************************************************
+ * Test sleep entry
+ **********************************************************************************************/
+ // This test also verifies the display state as the device goes in and out of suspend.
+ @Test
+ @UiThreadTest
+ public void testSleepEntry() throws Exception {
+ assertWaitForVhal();
+ mMockDisplayInterface.waitForDisplayState(false);
+ mPowerStateHandler.sendStateAndCheckResponse(
+ VehicleApPowerStateReq.ON,
+ 0,
+ VehicleApPowerStateReport.ON);
+ mMockDisplayInterface.waitForDisplayState(true);
+ mPowerStateHandler.sendPowerState(
+ VehicleApPowerStateReq.SHUTDOWN_PREPARE,
+ VehicleApPowerStateShutdownParam.CAN_SLEEP);
+ assertResponse(VehicleApPowerStateReport.SHUTDOWN_PREPARE, 0, true);
+ mMockDisplayInterface.waitForDisplayState(false);
+ assertResponse(VehicleApPowerStateReport.DEEP_SLEEP_ENTRY, 0, false);
+ mMockDisplayInterface.waitForDisplayState(false);
+ mPowerStateHandler.sendPowerState(VehicleApPowerStateReq.FINISHED, 0);
+ assertResponse(VehicleApPowerStateReport.DEEP_SLEEP_EXIT, 0, true);
+ mMockDisplayInterface.waitForDisplayState(false);
+ }
+
+ private void assertResponse(int expectedState, int expectedParam, boolean checkParam)
+ throws Exception {
+ LinkedList<int[]> setEvents = mPowerStateHandler.waitForStateSetAndGetAll(
+ DEFAULT_WAIT_TIMEOUT_MS, expectedState);
+ int[] last = setEvents.getLast();
+ assertEquals(expectedState, last[0]);
+ if (checkParam) {
+ assertEquals(expectedParam, last[1]);
}
}
- /* TODO make deep sleep work to test this
- @Test public void testSleepEntry() throws Exception {
- assertBootComplete();
- mPowerStateHandler.sendPowerState(
- VehicleApPowerState.SHUTDOWN_PREPARE,
- VehicleApPowerStateShutdownParam.CAN_SLEEP);
- assertResponse(VehicleApPowerSetState.DEEP_SLEEP_ENTRY, 0);
- assertResponse(VehicleApPowerSetState.DEEP_SLEEP_EXIT, 0);
- mPowerStateHandler.sendPowerState(
- VehicleApPowerState.ON_FULL,
- 0);
- }*/
-
- private void assertResponse(int expectedResponseState, int expectedResponseParam)
- throws Exception {
- LinkedList<int[]> setEvents = mPowerStateHandler.waitForStateSetAndGetAll(
- DEFAULT_WAIT_TIMEOUT_MS, expectedResponseState);
- int[] last = setEvents.getLast();
- assertEquals(expectedResponseState, last[0]);
- assertEquals(expectedResponseParam, last[1]);
- }
-
- private void assertBootComplete() throws Exception {
+ private void assertWaitForVhal() throws Exception {
mPowerStateHandler.waitForSubscription(DEFAULT_WAIT_TIMEOUT_MS);
LinkedList<int[]> setEvents = mPowerStateHandler.waitForStateSetAndGetAll(
- DEFAULT_WAIT_TIMEOUT_MS, VehicleApPowerStateReport.BOOT_COMPLETE);
+ DEFAULT_WAIT_TIMEOUT_MS, VehicleApPowerStateReport.WAIT_FOR_VHAL);
int[] first = setEvents.getFirst();
- assertEquals(VehicleApPowerStateReport.BOOT_COMPLETE, first[0]);
+ assertEquals(VehicleApPowerStateReport.WAIT_FOR_VHAL, first[0]);
assertEquals(0, first[1]);
+ CarPowerManagementService.setShutdownPrepareTimeout(0);
}
private final class MockDisplayInterface implements DisplayInterface {
@@ -158,11 +304,14 @@
@Override
public void stopDisplayStateMonitoring() {}
+
+ @Override
+ public void refreshDisplayBrightness() {}
}
private class PowerStatePropertyHandler implements VehicleHalPropertyHandler {
- private int mPowerState = VehicleApPowerStateReq.ON_FULL;
+ private int mPowerState = VehicleApPowerStateReq.ON;
private int mPowerParam = 0;
private final Semaphore mSubscriptionWaitSemaphore = new Semaphore(0);
@@ -232,6 +381,34 @@
}
}
+ private void sendStateAndCheckResponse(int state, int param, int expectedSet)
+ throws Exception {
+ sendPowerState(state, param);
+ waitForStateSetAndGetAll(DEFAULT_WAIT_TIMEOUT_MS, expectedSet);
+ }
+
+ /**
+ * Checks that a power state transition does NOT occur. If any state does occur during
+ * the timeout period, then the test fails.
+ */
+ private void sendStateAndExpectNoResponse(int state, int param) throws Exception {
+ sendPowerState(state, param);
+ // Wait to see if a state transition occurs
+ if (!mSetWaitSemaphore.tryAcquire(DEFAULT_WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
+ // No state transition, this is a success!
+ return;
+ } else {
+ synchronized (this) {
+ int[] newState = mSetStates.pop();
+ if (newState[0] != VehicleApPowerStateReport.SHUTDOWN_POSTPONE) {
+ fail("Unexpected state change occured, state=" + newState[0]);
+ }
+ // Reset the collected states
+ mSetStates = new LinkedList<>();
+ }
+ }
+ }
+
private void sendPowerState(int state, int param) {
getMockedVehicleHal().injectEvent(
VehiclePropValueBuilder.newBuilder(VehicleProperty.AP_POWER_STATE_REQ)
diff --git a/tests/carservice_test/src/com/android/car/CarProjectionManagerTest.java b/tests/carservice_test/src/com/android/car/CarProjectionManagerTest.java
index 8b108df..8efc823 100644
--- a/tests/carservice_test/src/com/android/car/CarProjectionManagerTest.java
+++ b/tests/carservice_test/src/com/android/car/CarProjectionManagerTest.java
@@ -26,11 +26,12 @@
import android.hardware.automotive.vehicle.V2_0.VehicleProperty;
import android.hardware.automotive.vehicle.V2_0.VehiclePropertyAccess;
import android.os.SystemClock;
-import android.support.test.filters.MediumTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.Log;
import android.view.KeyEvent;
+import androidx.test.filters.MediumTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.car.vehiclehal.VehiclePropValueBuilder;
import com.android.car.vehiclehal.test.MockedVehicleHal.VehicleHalPropertyHandler;
diff --git a/tests/carservice_test/src/com/android/car/CarStorageMonitoringTest.java b/tests/carservice_test/src/com/android/car/CarStorageMonitoringTest.java
index 1157007..75296d9 100644
--- a/tests/carservice_test/src/com/android/car/CarStorageMonitoringTest.java
+++ b/tests/carservice_test/src/com/android/car/CarStorageMonitoringTest.java
@@ -27,8 +27,8 @@
import android.annotation.Nullable;
import android.car.Car;
import android.car.storagemonitoring.CarStorageMonitoringManager;
-import android.car.storagemonitoring.IoStatsEntry;
import android.car.storagemonitoring.IoStats;
+import android.car.storagemonitoring.IoStatsEntry;
import android.car.storagemonitoring.LifetimeWriteInfo;
import android.car.storagemonitoring.UidIoRecord;
import android.car.storagemonitoring.WearEstimate;
@@ -37,13 +37,14 @@
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo;
import android.os.SystemClock;
-import android.support.test.filters.MediumTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.JsonWriter;
import android.util.Log;
import android.util.Pair;
import android.util.SparseArray;
+import androidx.test.filters.MediumTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.car.storagemonitoring.LifetimeWriteInfoProvider;
import com.android.car.storagemonitoring.UidIoStatsProvider;
import com.android.car.storagemonitoring.WearEstimateRecord;
@@ -55,13 +56,6 @@
import com.android.car.systeminterface.SystemStateInterface;
import com.android.car.systeminterface.TimeInterface;
-import com.android.car.test.utils.TemporaryFile;
-import java.util.ArrayDeque;
-import java.util.Collection;
-import java.util.Objects;
-import java.util.Queue;
-import org.json.JSONArray;
-import org.json.JSONObject;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestName;
@@ -78,6 +72,7 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
/** Test the public entry points for the CarStorageMonitoringManager */
@RunWith(AndroidJUnit4.class)
@@ -914,7 +909,7 @@
public void shutdown() {}
@Override
- public boolean enterDeepSleep(int wakeupTimeSec) {
+ public boolean enterDeepSleep() {
return true;
}
diff --git a/tests/carservice_test/src/com/android/car/CarUxRestrictionsConfigurationXmlParserTest.java b/tests/carservice_test/src/com/android/car/CarUxRestrictionsConfigurationXmlParserTest.java
new file mode 100644
index 0000000..cad210e
--- /dev/null
+++ b/tests/carservice_test/src/com/android/car/CarUxRestrictionsConfigurationXmlParserTest.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car;
+
+import static android.car.drivingstate.CarDrivingStateEvent.DRIVING_STATE_IDLING;
+import static android.car.drivingstate.CarDrivingStateEvent.DRIVING_STATE_MOVING;
+import static android.car.drivingstate.CarDrivingStateEvent.DRIVING_STATE_PARKED;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.drivingstate.CarUxRestrictionsConfiguration;
+import android.content.Context;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.MediumTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.IOException;
+
+@RunWith(AndroidJUnit4.class)
+@MediumTest
+public class CarUxRestrictionsConfigurationXmlParserTest {
+ private Context getContext() {
+ return InstrumentationRegistry.getTargetContext();
+ }
+
+ @Test
+ public void testParsingDefaultConfiguration() throws IOException, XmlPullParserException {
+ CarUxRestrictionsConfigurationXmlParser.parse(getContext(), R.xml.car_ux_restrictions_map);
+ }
+
+ @Test
+ public void testParsingParameters() throws IOException, XmlPullParserException {
+ CarUxRestrictionsConfiguration config = CarUxRestrictionsConfigurationXmlParser.parse(
+ getContext(), R.xml.ux_restrictions_only_parameters);
+
+ CarUxRestrictions r = config.getUxRestrictions(DRIVING_STATE_PARKED, 0f);
+ assertEquals(1, r.getMaxContentDepth());
+ assertEquals(1, r.getMaxCumulativeContentItems());
+ assertEquals(1, r.getMaxRestrictedStringLength());
+ }
+
+ @Test
+ public void testParsingNonMovingState() throws IOException, XmlPullParserException {
+ CarUxRestrictionsConfiguration config = CarUxRestrictionsConfigurationXmlParser.parse(
+ getContext(), R.xml.ux_restrictions_non_moving_state);
+
+ CarUxRestrictions parked = config.getUxRestrictions(DRIVING_STATE_PARKED, 0f);
+ assertFalse(parked.isRequiresDistractionOptimization());
+
+ CarUxRestrictions idling = config.getUxRestrictions(DRIVING_STATE_IDLING, 0f);
+ assertTrue(idling.isRequiresDistractionOptimization());
+ assertEquals(CarUxRestrictions.UX_RESTRICTIONS_NO_VIDEO, idling.getActiveRestrictions());
+ }
+
+ @Test
+ public void testParsingMovingState_NoSpeedRange() throws IOException, XmlPullParserException {
+ CarUxRestrictionsConfiguration config = CarUxRestrictionsConfigurationXmlParser.parse(
+ getContext(), R.xml.ux_restrictions_moving_state_no_speed_range);
+
+ CarUxRestrictions r = config.getUxRestrictions(DRIVING_STATE_MOVING, 1f);
+ assertTrue(r.isRequiresDistractionOptimization());
+ assertEquals(CarUxRestrictions.UX_RESTRICTIONS_NO_VIDEO, r.getActiveRestrictions());
+ }
+
+ @Test
+ public void testParsingMovingState_SingleSpeedRange()
+ throws IOException, XmlPullParserException {
+ CarUxRestrictionsConfiguration config = CarUxRestrictionsConfigurationXmlParser.parse(
+ getContext(), R.xml.ux_restrictions_moving_state_single_speed_range);
+
+ CarUxRestrictions r = config.getUxRestrictions(DRIVING_STATE_MOVING, 1f);
+ assertTrue(r.isRequiresDistractionOptimization());
+ assertEquals(CarUxRestrictions.UX_RESTRICTIONS_NO_VIDEO, r.getActiveRestrictions());
+ }
+
+ @Test
+ public void testParsingMovingState_MultiSpeedRange()
+ throws IOException, XmlPullParserException {
+ CarUxRestrictionsConfiguration config = CarUxRestrictionsConfigurationXmlParser.parse(
+ getContext(), R.xml.ux_restrictions_moving_state_single_speed_range);
+
+ CarUxRestrictions slow = config.getUxRestrictions(DRIVING_STATE_MOVING, 1f);
+ assertTrue(slow.isRequiresDistractionOptimization());
+ assertEquals(CarUxRestrictions.UX_RESTRICTIONS_NO_VIDEO, slow.getActiveRestrictions());
+
+ CarUxRestrictions fast = config.getUxRestrictions(DRIVING_STATE_MOVING, 6f);
+ assertTrue(fast.isRequiresDistractionOptimization());
+ assertEquals(CarUxRestrictions.UX_RESTRICTIONS_NO_VIDEO, fast.getActiveRestrictions());
+ }
+}
diff --git a/tests/carservice_test/src/com/android/car/CarUxRestrictionsManagerServiceTest.java b/tests/carservice_test/src/com/android/car/CarUxRestrictionsManagerServiceTest.java
new file mode 100644
index 0000000..de1c16e
--- /dev/null
+++ b/tests/carservice_test/src/com/android/car/CarUxRestrictionsManagerServiceTest.java
@@ -0,0 +1,236 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.anyString;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.car.drivingstate.CarDrivingStateEvent;
+import android.car.drivingstate.CarUxRestrictionsConfiguration;
+import android.car.hardware.CarPropertyValue;
+import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
+import android.content.res.Resources;
+import android.hardware.automotive.vehicle.V2_0.VehicleProperty;
+import android.util.JsonReader;
+import android.util.JsonWriter;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.MediumTest;
+import androidx.test.runner.AndroidJUnit4;
+
+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.xmlpull.v1.XmlPullParserException;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+
+@RunWith(AndroidJUnit4.class)
+@MediumTest
+public class CarUxRestrictionsManagerServiceTest {
+ private CarUxRestrictionsManagerService mService;
+
+ @Mock
+ private CarDrivingStateService mMockDrivingStateService;
+ @Mock
+ private CarPropertyService mMockCarPropertyService;
+ @Mock
+ private CarUserManagerHelper mMockCarUserManagerHelper;
+
+ private Context mSpyContext;
+
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+ mSpyContext = spy(InstrumentationRegistry.getTargetContext());
+
+ setUpMockParkedState();
+
+ mService = new CarUxRestrictionsManagerService(mSpyContext,
+ mMockDrivingStateService, mMockCarPropertyService, mMockCarUserManagerHelper);
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ mService = null;
+ }
+
+ @Test
+ public void testSaveConfig_WriteStagedFile() throws Exception {
+ // Reset spy context because service tries to access production config
+ // during construction (due to calling loadConfig()).
+ reset(mSpyContext);
+
+ File staged = setupMockFile(CarUxRestrictionsManagerService.CONFIG_FILENAME_STAGED, null);
+ CarUxRestrictionsConfiguration config = createEmptyConfig();
+
+ assertTrue(mService.saveUxRestrictionsConfigurationForNextBoot(config));
+ assertTrue(readFile(staged).equals(config));
+ // Verify prod config file was not touched.
+ verify(mSpyContext, never()).getFileStreamPath(
+ CarUxRestrictionsManagerService.CONFIG_FILENAME_PRODUCTION);
+ }
+
+ @Test
+ public void testSaveConfig_ReturnFalseOnException() throws Exception {
+ File tempFile = File.createTempFile("uxr_test", null);
+ doReturn(tempFile).when(mSpyContext).getFileStreamPath(anyString());
+
+ CarUxRestrictionsConfiguration spyConfig = spy(createEmptyConfig());
+ doThrow(new IOException()).when(spyConfig).writeJson(any(JsonWriter.class));
+
+ assertFalse(mService.saveUxRestrictionsConfigurationForNextBoot(spyConfig));
+ }
+
+ @Test
+ public void testSaveConfig_DoesNotAffectCurrentConfig() throws Exception {
+ File tempFile = File.createTempFile("uxr_test", null);
+ doReturn(tempFile).when(mSpyContext).getFileStreamPath(anyString());
+ CarUxRestrictionsConfiguration spyConfig = spy(createEmptyConfig());
+
+ CarUxRestrictionsConfiguration currentConfig = mService.getConfig();
+ assertTrue(mService.saveUxRestrictionsConfigurationForNextBoot(spyConfig));
+
+ verify(spyConfig).writeJson(any(JsonWriter.class));
+ // Verify current config is untouched by address comparison.
+ assertTrue(mService.getConfig() == currentConfig);
+ }
+
+ @Test
+ public void testLoadConfig_UseDefaultConfigWhenNoSavedConfigFileNoXml() {
+ // Prevent R.xml.car_ux_restrictions_map being returned.
+ Resources spyResources = spy(mSpyContext.getResources());
+ doReturn(spyResources).when(mSpyContext).getResources();
+ doReturn(null).when(spyResources).getXml(anyInt());
+
+ assertTrue(mService.loadConfig().equals(mService.createDefaultConfig()));
+ }
+
+ @Test
+ public void testLoadConfig_UseXml() throws IOException, XmlPullParserException {
+ CarUxRestrictionsConfiguration expected = CarUxRestrictionsConfigurationXmlParser.parse(
+ mSpyContext, R.xml.car_ux_restrictions_map);
+
+ CarUxRestrictionsConfiguration actual = mService.loadConfig();
+
+ assertTrue(actual.equals(expected));
+ }
+
+ @Test
+ public void testLoadConfig_UseProdConfig() throws IOException {
+ CarUxRestrictionsConfiguration expected = createEmptyConfig();
+ setupMockFile(CarUxRestrictionsManagerService.CONFIG_FILENAME_PRODUCTION, expected);
+
+ CarUxRestrictionsConfiguration actual = mService.loadConfig();
+
+ assertTrue(actual.equals(expected));
+ }
+
+ @Test
+ public void testLoadConfig_PromoteStagedFileWhenParked() throws Exception {
+ CarUxRestrictionsConfiguration expected = createEmptyConfig();
+ // Staged file contains actual config. Ignore prod since it should be overwritten by staged.
+ File staged = setupMockFile(CarUxRestrictionsManagerService.CONFIG_FILENAME_STAGED,
+ expected);
+ // Set up temp file for prod to avoid polluting other tests.
+ setupMockFile(CarUxRestrictionsManagerService.CONFIG_FILENAME_PRODUCTION, null);
+
+ CarUxRestrictionsConfiguration actual = mService.loadConfig();
+
+ // Staged file should be moved as production.
+ assertFalse(staged.exists());
+ assertTrue(actual.equals(expected));
+ }
+
+ @Test
+ public void testLoadConfig_NoPromoteStagedFileWhenMoving() throws Exception {
+ CarUxRestrictionsConfiguration expected = createEmptyConfig();
+ File staged = setupMockFile(CarUxRestrictionsManagerService.CONFIG_FILENAME_STAGED, null);
+ // Prod file contains actual config. Ignore staged since it should not be promoted.
+ setupMockFile(CarUxRestrictionsManagerService.CONFIG_FILENAME_PRODUCTION, expected);
+
+ setUpMockDrivingState();
+ CarUxRestrictionsConfiguration actual = mService.loadConfig();
+
+ // Staged file should be untouched.
+ assertTrue(staged.exists());
+ assertTrue(actual.equals(expected));
+ }
+
+ private CarUxRestrictionsConfiguration createEmptyConfig() {
+ return new CarUxRestrictionsConfiguration.Builder().build();
+ }
+
+ private void setUpMockParkedState() {
+ when(mMockDrivingStateService.getCurrentDrivingState()).thenReturn(
+ new CarDrivingStateEvent(CarDrivingStateEvent.DRIVING_STATE_PARKED, 0));
+
+ CarPropertyValue<Float> speed = new CarPropertyValue<>(VehicleProperty.PERF_VEHICLE_SPEED,
+ 0, 0f);
+ when(mMockCarPropertyService.getProperty(VehicleProperty.PERF_VEHICLE_SPEED, 0))
+ .thenReturn(speed);
+ }
+
+ private void setUpMockDrivingState() {
+ when(mMockDrivingStateService.getCurrentDrivingState()).thenReturn(
+ new CarDrivingStateEvent(CarDrivingStateEvent.DRIVING_STATE_MOVING, 0));
+
+ CarPropertyValue<Float> speed = new CarPropertyValue<>(VehicleProperty.PERF_VEHICLE_SPEED,
+ 0, 30f);
+ when(mMockCarPropertyService.getProperty(VehicleProperty.PERF_VEHICLE_SPEED, 0))
+ .thenReturn(speed);
+ }
+
+ private File setupMockFile(String filename, CarUxRestrictionsConfiguration config)
+ throws IOException {
+ File f = File.createTempFile("uxr_test", null);
+ doReturn(f).when(mSpyContext).getFileStreamPath(filename);
+
+ if (config != null) {
+ try (JsonWriter writer = new JsonWriter(
+ new OutputStreamWriter(new FileOutputStream(f), "UTF-8"))) {
+ config.writeJson(writer);
+ }
+ }
+ return f;
+ }
+
+ private CarUxRestrictionsConfiguration readFile(File file) throws Exception {
+ try (JsonReader reader = new JsonReader(
+ new InputStreamReader(new FileInputStream(file), "UTF-8"))) {
+ return CarUxRestrictionsConfiguration.readJson(reader);
+ }
+ }
+}
diff --git a/tests/carservice_test/src/com/android/car/CarVendorExtensionManagerTest.java b/tests/carservice_test/src/com/android/car/CarVendorExtensionManagerTest.java
index 1f6bb10..97d5003 100644
--- a/tests/carservice_test/src/com/android/car/CarVendorExtensionManagerTest.java
+++ b/tests/carservice_test/src/com/android/car/CarVendorExtensionManagerTest.java
@@ -32,11 +32,12 @@
import android.hardware.automotive.vehicle.V2_0.VehiclePropertyGroup;
import android.hardware.automotive.vehicle.V2_0.VehiclePropertyType;
import android.os.SystemClock;
-import android.support.test.filters.MediumTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.Log;
import android.util.SparseArray;
+import androidx.test.filters.MediumTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.car.vehiclehal.test.MockedVehicleHal;
import com.android.car.vehiclehal.test.VehiclePropConfigBuilder;
diff --git a/tests/carservice_test/src/com/android/car/FastPairProviderTest.java b/tests/carservice_test/src/com/android/car/FastPairProviderTest.java
index 02c4cf1..6aee11d 100644
--- a/tests/carservice_test/src/com/android/car/FastPairProviderTest.java
+++ b/tests/carservice_test/src/com/android/car/FastPairProviderTest.java
@@ -28,8 +28,9 @@
import android.content.Context;
import android.content.res.Resources;
import android.os.ParcelUuid;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Assert;
import org.junit.Before;
diff --git a/tests/carservice_test/src/com/android/car/MockedCarTestBase.java b/tests/carservice_test/src/com/android/car/MockedCarTestBase.java
index c63c980..e327470 100644
--- a/tests/carservice_test/src/com/android/car/MockedCarTestBase.java
+++ b/tests/carservice_test/src/com/android/car/MockedCarTestBase.java
@@ -34,11 +34,12 @@
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.annotation.UiThreadTest;
import android.util.Log;
import android.util.SparseArray;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.annotation.UiThreadTest;
+
import com.android.car.pm.CarPackageManagerService;
import com.android.car.systeminterface.DisplayInterface;
import com.android.car.systeminterface.IOInterface;
@@ -297,6 +298,9 @@
@Override
public void stopDisplayStateMonitoring() {}
+
+ @Override
+ public void refreshDisplayBrightness() {}
}
static final class MockIOInterface implements IOInterface {
@@ -413,7 +417,7 @@
public void shutdown() {}
@Override
- public boolean enterDeepSleep(int wakeupTimeSec) {
+ public boolean enterDeepSleep() {
return true;
}
diff --git a/tests/carservice_test/src/com/android/car/SystemActivityMonitoringServiceTest.java b/tests/carservice_test/src/com/android/car/SystemActivityMonitoringServiceTest.java
index 6c546fc..906192a 100644
--- a/tests/carservice_test/src/com/android/car/SystemActivityMonitoringServiceTest.java
+++ b/tests/carservice_test/src/com/android/car/SystemActivityMonitoringServiceTest.java
@@ -22,9 +22,11 @@
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.MediumTest;
-import android.support.test.runner.AndroidJUnit4;
+import android.os.Bundle;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.MediumTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.car.SystemActivityMonitoringService.TopTaskInfoContainer;
@@ -35,14 +37,16 @@
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
+import java.util.function.BooleanSupplier;
@RunWith(AndroidJUnit4.class)
@MediumTest
public class SystemActivityMonitoringServiceTest {
private static final long ACTIVITY_TIME_OUT = 5000;
+ private static final long DEFAULT_TIMEOUT_SECONDS = 2;
private SystemActivityMonitoringService mService;
- private Semaphore mSemaphore = new Semaphore(0);
+ private Semaphore mActivityLaunchSemaphore = new Semaphore(0);
private final TopTaskInfoContainer[] mTopTaskInfo = new TopTaskInfoContainer[1];
@@ -51,12 +55,12 @@
mService = new SystemActivityMonitoringService(getContext());
mService.registerActivityLaunchListener(topTask -> {
if (!getTestContext().getPackageName().equals(topTask.topActivity.getPackageName())) {
- return; // Ignore activities outside of this test case.
+ return; // Ignore activities outside of this test case.
}
synchronized (mTopTaskInfo) {
mTopTaskInfo[0] = topTask;
}
- mSemaphore.release();
+ mActivityLaunchSemaphore.release();
});
}
@@ -93,6 +97,35 @@
assertTopTaskActivity(blockingActivity);
}
+ @Test
+ public void testRemovesFromTopTasks() throws Exception {
+ ComponentName activityThatFinishesImmediately =
+ toComponentName(getTestContext(), ActivityThatFinishesImmediately.class);
+ startActivity(getContext(), activityThatFinishesImmediately);
+ waitUntil(() -> topTasksHasComponent(activityThatFinishesImmediately));
+ waitUntil(() -> !topTasksHasComponent(activityThatFinishesImmediately));
+ }
+
+
+ private void waitUntil(BooleanSupplier condition) throws Exception {
+ while (!condition.getAsBoolean()) {
+ boolean didAquire =
+ mActivityLaunchSemaphore.tryAcquire(DEFAULT_TIMEOUT_SECONDS, TimeUnit.SECONDS);
+ if (!didAquire && !condition.getAsBoolean()) {
+ throw new RuntimeException("failed while waiting for condition to become true");
+ }
+ }
+ }
+
+ private boolean topTasksHasComponent(ComponentName component) {
+ for (TopTaskInfoContainer topTaskInfoContainer: mService.getTopTasks()) {
+ if (topTaskInfoContainer.topActivity.equals(component)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
/** Activity that closes itself after some timeout to clean up the screen. */
public static class TempActivity extends Activity {
@Override
@@ -105,10 +138,20 @@
public static class ActivityA extends TempActivity {}
public static class ActivityB extends TempActivity {}
public static class ActivityC extends TempActivity {}
+
+ public static class ActivityThatFinishesImmediately extends Activity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ finish();
+ }
+ }
+
public static class BlockingActivity extends TempActivity {}
private void assertTopTaskActivity(ComponentName activity) throws Exception{
- assertTrue(mSemaphore.tryAcquire(2, TimeUnit.SECONDS));
+ assertTrue(mActivityLaunchSemaphore.tryAcquire(2, TimeUnit.SECONDS));
synchronized (mTopTaskInfo) {
assertEquals(activity, mTopTaskInfo[0].topActivity);
}
diff --git a/tests/carservice_test/src/com/android/car/VmsHalServiceSubscriptionEventTest.java b/tests/carservice_test/src/com/android/car/VmsHalServiceSubscriptionEventTest.java
index 82c9361..ad586ae 100644
--- a/tests/carservice_test/src/com/android/car/VmsHalServiceSubscriptionEventTest.java
+++ b/tests/carservice_test/src/com/android/car/VmsHalServiceSubscriptionEventTest.java
@@ -25,11 +25,14 @@
import android.hardware.automotive.vehicle.V2_0.VehicleProperty;
import android.hardware.automotive.vehicle.V2_0.VehiclePropertyAccess;
import android.hardware.automotive.vehicle.V2_0.VehiclePropertyChangeMode;
+import android.hardware.automotive.vehicle.V2_0.VmsAvailabilityStateIntegerValuesIndex;
+import android.hardware.automotive.vehicle.V2_0.VmsBaseMessageIntegerValuesIndex;
import android.hardware.automotive.vehicle.V2_0.VmsMessageType;
import android.hardware.automotive.vehicle.V2_0.VmsMessageWithLayerIntegerValuesIndex;
import android.hardware.automotive.vehicle.V2_0.VmsSubscriptionsStateIntegerValuesIndex;
-import android.support.test.filters.MediumTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.MediumTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.car.vehiclehal.VehiclePropValueBuilder;
import com.android.car.vehiclehal.test.MockedVehicleHal;
@@ -66,9 +69,9 @@
@Override
public void setUp() throws Exception {
+ mHalHandlerSemaphore = new Semaphore(0);
super.setUp();
mHal = getMockedVehicleHal();
- mHalHandlerSemaphore = new Semaphore(0);
}
@Test
@@ -99,19 +102,30 @@
* responds with the same layers.
*/
private void subscriptionTestLogic(List<VmsLayer> layers) throws Exception {
+ // Wait for availability change message that signals the service is ready.
+ assertTrue(mHalHandlerSemaphore.tryAcquire(2L, TimeUnit.SECONDS));
+ // Validate response.
+ ArrayList<Integer> v = mHalHandler.getValues();
+ int messageType = v.get(VmsBaseMessageIntegerValuesIndex.MESSAGE_TYPE);
+ int sequenceNumber = v.get(VmsAvailabilityStateIntegerValuesIndex.SEQUENCE_NUMBER);
+ assertEquals(VmsMessageType.AVAILABILITY_CHANGE, messageType);
+ assertEquals(0, sequenceNumber);
+
for (VmsLayer layer : layers) {
subscribeViaHal(layer);
}
// Send subscription request.
mHal.injectEvent(createHalSubscriptionRequest());
- // Wait for response.
+
+ // Wait for subscription response
assertTrue(mHalHandlerSemaphore.tryAcquire(2L, TimeUnit.SECONDS));
+
// Validate response.
- ArrayList<Integer> v = mHalHandler.getValues();
- int messageType = v.get(VmsSubscriptionsStateIntegerValuesIndex.MESSAGE_TYPE);
- int sequenceNumber = v.get(VmsSubscriptionsStateIntegerValuesIndex.SEQUENCE_NUMBER);
- int numberLayers = v.get(VmsSubscriptionsStateIntegerValuesIndex.NUMBER_OF_LAYERS);
+ v = mHalHandler.getValues();
+ messageType = v.get(VmsBaseMessageIntegerValuesIndex.MESSAGE_TYPE);
assertEquals(VmsMessageType.SUBSCRIPTIONS_RESPONSE, messageType);
+ sequenceNumber = v.get(VmsSubscriptionsStateIntegerValuesIndex.SEQUENCE_NUMBER);
+ int numberLayers = v.get(VmsSubscriptionsStateIntegerValuesIndex.NUMBER_OF_LAYERS);
assertEquals(layers.size(), numberLayers);
List<VmsLayer> receivedLayers = new ArrayList<>();
int start = VmsSubscriptionsStateIntegerValuesIndex.SUBSCRIPTIONS_START;
@@ -136,11 +150,11 @@
assertTrue(mHalHandlerSemaphore.tryAcquire(2L, TimeUnit.SECONDS));
// Validate response.
ArrayList<Integer> v = mHalHandler.getValues();
- int messsageType = v.get(VmsMessageWithLayerIntegerValuesIndex.MESSAGE_TYPE);
+ int messsageType = v.get(VmsBaseMessageIntegerValuesIndex.MESSAGE_TYPE);
+ assertEquals(VmsMessageType.SUBSCRIBE, messsageType);
int layerId = v.get(VmsMessageWithLayerIntegerValuesIndex.LAYER_TYPE);
int layerVersion = v.get(VmsMessageWithLayerIntegerValuesIndex.LAYER_VERSION);
int fused = v.get(VmsMessageWithLayerIntegerValuesIndex.LAYER_SUBTYPE);
- assertEquals(VmsMessageType.SUBSCRIBE, messsageType);
assertEquals(layer.getType(), layerId);
assertEquals(layer.getVersion(), layerVersion);
}
@@ -173,4 +187,4 @@
return mValues;
}
}
-}
\ No newline at end of file
+}
diff --git a/tests/carservice_test/src/com/android/car/VmsOperationRecorderTest.java b/tests/carservice_test/src/com/android/car/VmsOperationRecorderTest.java
index 7820936..2c41f32 100644
--- a/tests/carservice_test/src/com/android/car/VmsOperationRecorderTest.java
+++ b/tests/carservice_test/src/com/android/car/VmsOperationRecorderTest.java
@@ -22,11 +22,10 @@
import android.car.vms.VmsLayerDependency;
import android.car.vms.VmsLayersOffering;
import android.car.vms.VmsOperationRecorder;
-import android.support.test.filters.MediumTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.Log;
-import junit.framework.TestCase;
+import androidx.test.filters.MediumTest;
+import androidx.test.runner.AndroidJUnit4;
import org.json.JSONArray;
import org.json.JSONException;
@@ -112,13 +111,13 @@
@Test
public void testSetLayersOffering0() throws Exception {
mRecorder.setLayersOffering(layersOffering0);
- assertJsonMsgEquals("{'setLayersOffering':{}}");
+ assertJsonMsgEquals("{'setLayersOffering':{'publisherId':66}}");
}
@Test
public void testSetLayersOffering2() throws Exception {
mRecorder.setLayersOffering(layersOffering2);
- assertJsonMsgEquals("{'setLayersOffering':{'layerDependency':["
+ assertJsonMsgEquals("{'setLayersOffering':{'publisherId':66,'layerDependency':["
+ "{'layer':{'type':3,'subtype':5,'version':4}},"
+ "{'layer':{'type':1,'subtype':3,'version':2},'dependency':["
+ "{'type':2,'subtype':4,'version':3},{'type':3,'subtype':5,'version':4}]}"
@@ -175,13 +174,13 @@
@Test
public void testSetPublisherLayersOffering() throws Exception {
mRecorder.setPublisherLayersOffering(layersOffering1);
- assertJsonMsgEquals("{'setPublisherLayersOffering':{'layerDependency':["
+ assertJsonMsgEquals("{'setPublisherLayersOffering':{'publisherId':66,'layerDependency':["
+ "{'layer':{'type':3,'subtype':5,'version':4}}]}}");
}
@Test public void testSetHalPublisherLayersOffering() throws Exception {
mRecorder.setHalPublisherLayersOffering(layersOffering1);
- assertJsonMsgEquals("{'setHalPublisherLayersOffering':{'layerDependency':["
+ assertJsonMsgEquals("{'setHalPublisherLayersOffering':{'publisherId':66,'layerDependency':["
+ "{'layer':{'type':3,'subtype':5,'version':4}}]}}");
}
diff --git a/tests/carservice_test/src/com/android/car/VmsPublisherClientServiceTest.java b/tests/carservice_test/src/com/android/car/VmsPublisherClientServiceTest.java
index d8cbe7b..a54b0e3 100644
--- a/tests/carservice_test/src/com/android/car/VmsPublisherClientServiceTest.java
+++ b/tests/carservice_test/src/com/android/car/VmsPublisherClientServiceTest.java
@@ -28,10 +28,11 @@
import android.hardware.automotive.vehicle.V2_0.VmsBaseMessageIntegerValuesIndex;
import android.hardware.automotive.vehicle.V2_0.VmsMessageType;
import android.hardware.automotive.vehicle.V2_0.VmsMessageWithLayerIntegerValuesIndex;
-import android.support.test.filters.MediumTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.Log;
+import androidx.test.filters.MediumTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.car.vehiclehal.VehiclePropValueBuilder;
import com.android.car.vehiclehal.test.MockedVehicleHal;
import com.android.car.vehiclehal.test.MockedVehicleHal.VehicleHalPropertyHandler;
diff --git a/tests/carservice_test/src/com/android/car/VmsPublisherPermissionsTest.java b/tests/carservice_test/src/com/android/car/VmsPublisherPermissionsTest.java
deleted file mode 100644
index a4d094a..0000000
--- a/tests/carservice_test/src/com/android/car/VmsPublisherPermissionsTest.java
+++ /dev/null
@@ -1,126 +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.car;
-
-import static org.junit.Assert.assertTrue;
-
-import android.car.VehicleAreaType;
-import android.content.pm.PackageManager;
-import android.hardware.automotive.vehicle.V2_0.VehiclePropValue;
-import android.hardware.automotive.vehicle.V2_0.VehicleProperty;
-import android.hardware.automotive.vehicle.V2_0.VehiclePropertyAccess;
-import android.hardware.automotive.vehicle.V2_0.VehiclePropertyChangeMode;
-import android.hardware.automotive.vehicle.V2_0.VmsBaseMessageIntegerValuesIndex;
-import android.hardware.automotive.vehicle.V2_0.VmsMessageType;
-import android.support.test.filters.MediumTest;
-import android.support.test.runner.AndroidJUnit4;
-
-import com.android.car.vehiclehal.VehiclePropValueBuilder;
-import com.android.car.vehiclehal.test.MockedVehicleHal;
-import com.android.car.vehiclehal.test.MockedVehicleHal.VehicleHalPropertyHandler;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.util.ArrayList;
-import java.util.concurrent.Semaphore;
-import java.util.concurrent.TimeUnit;
-
-@RunWith(AndroidJUnit4.class)
-@MediumTest
-public class VmsPublisherPermissionsTest extends MockedCarTestBase {
- private static final String TAG = "VmsPublisherTest";
- private static final int MOCK_PUBLISHER_LAYER_ID = 0;
- private static final int MOCK_PUBLISHER_LAYER_VERSION = 0;
- private static final int MOCK_PUBLISHER_LAYER_FUSION_INT_VALUE = 0;
-
- private HalHandler mHalHandler;
- // Used to block until the HAL property is updated in HalHandler.onPropertySet.
- private Semaphore mHalHandlerSemaphore;
-
- @Override
- protected synchronized void configureMockedHal() {
- mHalHandler = new HalHandler();
- addProperty(VehicleProperty.VEHICLE_MAP_SERVICE, mHalHandler)
- .setChangeMode(VehiclePropertyChangeMode.ON_CHANGE)
- .setAccess(VehiclePropertyAccess.READ_WRITE)
- .addAreaConfig(VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL, 0, 0);
- }
-
- @Override
- protected synchronized void configureResourceOverrides(MockResources resources) {
- resources.overrideResource(R.array.vmsPublisherClients, new String[]{
- "com.google.android.car.vms.publisher/.VmsPublisherClientSampleService"})
- .overrideResource(R.array.vmsSafePermissions,
- new String[]{"android.permission.ACCESS_FINE_LOCATION"});
- }
-
- private VehiclePropValue getHalSubscriptionRequest() {
- return VehiclePropValueBuilder.newBuilder(VehicleProperty.VEHICLE_MAP_SERVICE)
- .addIntValue(VmsMessageType.SUBSCRIBE)
- .addIntValue(MOCK_PUBLISHER_LAYER_ID)
- .addIntValue(MOCK_PUBLISHER_LAYER_VERSION)
- .addIntValue(MOCK_PUBLISHER_LAYER_FUSION_INT_VALUE)
- .build();
- }
-
- @Override
- public void setUp() throws Exception {
- /**
- * First init the semaphore, setUp will start a series of events that will ultimately
- * update the HAL layer and release this semaphore.
- */
- mHalHandlerSemaphore = new Semaphore(0);
- super.setUp();
-
- // Inject a subscribe event which simulates the HAL is subscribed to the Sample Publisher.
- MockedVehicleHal mHal = getMockedVehicleHal();
- mHal.injectEvent(getHalSubscriptionRequest());
- }
-
- /**
- * The method setUp initializes all the Car services, including the VmsPublisherService.
- * The VmsPublisherService will start and configure its list of clients. This list was
- * overridden in the method getCarServiceContext.
- * Therefore, only VmsPublisherClientSampleService will be started.
- * The service VmsPublisherClientSampleService will publish one message, which is validated in
- * this test.
- */
- @Test
- public void testPermissions() throws Exception {
- assertTrue(mHalHandlerSemaphore.tryAcquire(2L, TimeUnit.SECONDS));
- // At this point the client initialization finished. Let's validate the permissions.
- // The VMS service should be allowed to grant ACCESS_FINE_LOCATION.
- assertTrue(
- getContext().getPackageManager().checkPermission(
- "android.permission.ACCESS_FINE_LOCATION",
- "com.google.android.car.vms.publisher")
- == PackageManager.PERMISSION_GRANTED);
- }
-
- private class HalHandler implements VehicleHalPropertyHandler {
- @Override
- public synchronized void onPropertySet(VehiclePropValue value) {
- // If this is the data message release the semaphore so the test can continue.
- ArrayList<Integer> int32Values = value.value.int32Values;
- if (int32Values.get(VmsBaseMessageIntegerValuesIndex.MESSAGE_TYPE) ==
- VmsMessageType.DATA) {
- mHalHandlerSemaphore.release();
- }
- }
- }
-}
diff --git a/tests/carservice_test/src/com/android/car/VmsPublisherSubscriberTest.java b/tests/carservice_test/src/com/android/car/VmsPublisherSubscriberTest.java
index 1ef35f7..e5a592c 100644
--- a/tests/carservice_test/src/com/android/car/VmsPublisherSubscriberTest.java
+++ b/tests/carservice_test/src/com/android/car/VmsPublisherSubscriberTest.java
@@ -28,8 +28,10 @@
import android.hardware.automotive.vehicle.V2_0.VehicleProperty;
import android.hardware.automotive.vehicle.V2_0.VehiclePropertyAccess;
import android.hardware.automotive.vehicle.V2_0.VehiclePropertyChangeMode;
-import android.support.test.filters.MediumTest;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.FlakyTest;
+import androidx.test.filters.MediumTest;
+import androidx.test.runner.AndroidJUnit4;
import com.android.car.vehiclehal.test.MockedVehicleHal;
@@ -47,6 +49,7 @@
@RunWith(AndroidJUnit4.class)
@MediumTest
+@FlakyTest // TODO(b/116333782): Remove the flag when issue fixed
public class VmsPublisherSubscriberTest extends MockedCarTestBase {
private static final int LAYER_ID = 88;
private static final int LAYER_VERSION = 19;
diff --git a/tests/carservice_test/src/com/android/car/VmsSubscriberManagerTest.java b/tests/carservice_test/src/com/android/car/VmsSubscriberManagerTest.java
index 643ffff..8bb4f27 100644
--- a/tests/carservice_test/src/com/android/car/VmsSubscriberManagerTest.java
+++ b/tests/carservice_test/src/com/android/car/VmsSubscriberManagerTest.java
@@ -34,10 +34,11 @@
import android.hardware.automotive.vehicle.V2_0.VmsAvailabilityStateIntegerValuesIndex;
import android.hardware.automotive.vehicle.V2_0.VmsMessageType;
import android.os.SystemClock;
-import android.support.test.filters.MediumTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.Log;
+import androidx.test.filters.MediumTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.android.car.vehiclehal.VehiclePropValueBuilder;
import com.android.car.vehiclehal.test.MockedVehicleHal.VehicleHalPropertyHandler;
@@ -119,9 +120,9 @@
@Override
public void setUp() throws Exception {
mExecutor = new ThreadPerTaskExecutor();
- super.setUp();
mSubscriberSemaphore = new Semaphore(0);
mHalHandlerSemaphore = new Semaphore(0);
+ super.setUp();
}
// Test injecting a value in the HAL and verifying it propagates to a subscriber.
diff --git a/tests/carservice_test/src/com/android/car/garagemode/ControllerTest.java b/tests/carservice_test/src/com/android/car/garagemode/ControllerTest.java
new file mode 100644
index 0000000..ae6896d
--- /dev/null
+++ b/tests/carservice_test/src/com/android/car/garagemode/ControllerTest.java
@@ -0,0 +1,189 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.garagemode;
+
+import static com.android.car.garagemode.GarageMode.ACTION_GARAGE_MODE_OFF;
+import static com.android.car.garagemode.GarageMode.ACTION_GARAGE_MODE_ON;
+import static com.android.car.garagemode.GarageMode.JOB_SNAPSHOT_INITIAL_UPDATE_MS;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import android.car.Car;
+import android.car.CarNotConnectedException;
+import android.car.hardware.power.CarPowerManager;
+import android.car.hardware.power.CarPowerManager.CarPowerStateListener;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Handler;
+import android.os.Looper;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class ControllerTest {
+ private static final Logger LOG = new Logger("ControllerTest");
+
+ @Mock private Context mContextMock;
+ @Mock private Looper mLooperMock;
+ @Mock private Handler mHandlerMock;
+ @Mock private Car mCarMock;
+ @Mock private CarPowerManager mCarPowerManagerMock;
+ @Captor private ArgumentCaptor<Intent> mIntentCaptor;
+ @Captor private ArgumentCaptor<Integer> mIntegerCaptor;
+
+ private static final String[] sTemplateWakeupSchedule = new String[] {
+ "15m,1",
+ "6h,4",
+ "1d,1"};
+ private static final int[] sTemplateWakeupScheduleSeconds = new int[] {
+ 15 * 60,
+ 6 * 60 * 60,
+ 6 * 60 * 60,
+ 6 * 60 * 60,
+ 6 * 60 * 60,
+ 24 * 60 * 60};
+ private Controller mController;
+ private WakeupPolicy mWakeupPolicy;
+ private CompletableFuture<Void> mFuture;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mWakeupPolicy = new WakeupPolicy(sTemplateWakeupSchedule);
+ mController = new Controller(
+ mContextMock,
+ mLooperMock,
+ mWakeupPolicy,
+ mHandlerMock,
+ null,
+ mCarMock);
+ mController.setCarPowerManager(mCarPowerManagerMock);
+ mFuture = new CompletableFuture<>();
+ }
+
+ @Test
+ public void testOnShutdownPrepare_shouldInitiateGarageMode() {
+ startAndAssertGarageModeWithSignal(CarPowerStateListener.SHUTDOWN_PREPARE);
+ verify(mContextMock).sendBroadcast(mIntentCaptor.capture());
+ verifyGarageModeBroadcast(mIntentCaptor.getAllValues(), 1, ACTION_GARAGE_MODE_ON);
+ }
+
+ @Test
+ public void testOnShutdownCancelled_shouldCancelGarageMode() {
+ startAndAssertGarageModeWithSignal(CarPowerStateListener.SHUTDOWN_PREPARE);
+
+ // Sending shutdown cancelled signal to controller, GarageMode should wrap up and stop
+ mController.onStateChanged(CarPowerStateListener.SHUTDOWN_CANCELLED, null);
+
+ // Verify that wake up counter is reset and GarageMode is not active anymore
+ assertThat(mController.mWakeupPolicy.mIndex).isEqualTo(0);
+ assertThat(mController.isGarageModeActive()).isFalse();
+
+ // Verify that monitoring thread has stopped
+ verify(mHandlerMock).removeCallbacks(any(Runnable.class));
+
+ // Verify that OFF signal broadcasted to JobScheduler
+ verify(mContextMock, times(2)).sendBroadcast(mIntentCaptor.capture());
+ verifyGarageModeBroadcast(mIntentCaptor.getAllValues(), 1, ACTION_GARAGE_MODE_ON);
+ verifyGarageModeBroadcast(mIntentCaptor.getAllValues(), 2, ACTION_GARAGE_MODE_OFF);
+
+ // Verify that bounded future got cancelled
+ assertThat(mFuture.isDone()).isTrue();
+ assertThat(mFuture.isCancelled()).isTrue();
+ }
+
+ @Test
+ public void testWakeupTimeProgression() throws CarNotConnectedException {
+ // Doing initial suspend
+ startAndAssertGarageModeWithSignal(CarPowerStateListener.SHUTDOWN_PREPARE);
+
+ // Finish GarageMode and check next scheduled time
+ mController.finishGarageMode();
+ assertThat(mController.isGarageModeActive()).isFalse();
+
+ // Start GarageMode again without waking up car
+ mFuture = new CompletableFuture<>();
+ mController.onStateChanged(CarPowerStateListener.SHUTDOWN_PREPARE, mFuture);
+
+ assertThat(mController.mWakeupPolicy.mIndex).isEqualTo(2);
+ assertThat(mController.isGarageModeActive()).isTrue();
+
+ // Finish GarageMode and check next scheduled time
+ mController.finishGarageMode();
+ assertThat(mController.isGarageModeActive()).isFalse();
+
+ for (int i = 0; i < 4; i++) {
+ mFuture = new CompletableFuture<>();
+ mController.onStateChanged(CarPowerStateListener.SHUTDOWN_PREPARE, mFuture);
+ mController.finishGarageMode();
+ assertThat(mController.isGarageModeActive()).isFalse();
+ assertThat(mController.mWakeupPolicy.mIndex).isEqualTo(i + 3);
+ }
+ verify(mCarPowerManagerMock, times(6)).scheduleNextWakeupTime(mIntegerCaptor.capture());
+ verifyScheduledTimes(mIntegerCaptor.getAllValues());
+ }
+
+ private void verifyGarageModeBroadcast(List<Intent> intents, int times, String action) {
+ // Capture sent intent and verify that it is correct
+ Intent i = intents.get(times - 1);
+ assertThat(i.getAction()).isEqualTo(action);
+
+ // Verify that additional critical flags are bundled as well
+ final int flags = Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_NO_ABORT;
+ boolean areRequiredFlagsSet = ((flags & i.getFlags()) == flags);
+ assertThat(areRequiredFlagsSet).isTrue();
+ }
+
+ private void verifyScheduledTimes(List<Integer> ints) {
+ int idx = 0;
+ for (int i : ints) {
+ assertThat(i).isEqualTo(sTemplateWakeupScheduleSeconds[idx++]);
+ }
+ }
+
+ private void startAndAssertGarageModeWithSignal(int signal) {
+ assertThat(mController.mWakeupPolicy.mIndex).isEqualTo(0);
+
+ // Sending notification that state has changed
+ mController.onStateChanged(signal, mFuture);
+
+ // Assert that GarageMode has been started
+ assertThat(mController.isGarageModeActive()).isTrue();
+ assertThat(mController.mWakeupPolicy.mIndex).isEqualTo(1);
+
+ // Verify that worker that polls running jobs from JobScheduler is scheduled.
+ verify(mHandlerMock).postDelayed(any(), eq(JOB_SNAPSHOT_INITIAL_UPDATE_MS));
+ }
+}
diff --git a/tests/carservice_test/src/com/android/car/garagemode/GarageModeServiceTest.java b/tests/carservice_test/src/com/android/car/garagemode/GarageModeServiceTest.java
index 8a9a90d..91059fc 100644
--- a/tests/carservice_test/src/com/android/car/garagemode/GarageModeServiceTest.java
+++ b/tests/carservice_test/src/com/android/car/garagemode/GarageModeServiceTest.java
@@ -16,286 +16,53 @@
package com.android.car.garagemode;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertThat;
-import android.car.settings.CarSettings;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.ContentResolver;
import android.content.Context;
-import android.content.SharedPreferences;
-import android.os.HandlerThread;
-import android.os.Looper;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.annotation.UiThreadTest;
-import android.support.test.filters.MediumTest;
-import android.support.test.runner.AndroidJUnit4;
-import com.android.car.CarPowerManagementService;
-import com.android.car.DeviceIdleControllerWrapper;
-import com.android.car.R;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import java.io.PrintWriter;
import java.util.List;
@RunWith(AndroidJUnit4.class)
-@MediumTest
+@SmallTest
public class GarageModeServiceTest {
- private static final int WAIT_FOR_COMPLETION_TIME_MS = 3000;
+ @Mock private Context mMockContext;
+ @Mock private Controller mMockController;
+ @Mock private ContentResolver mMockContentResolver;
+ @Mock private PrintWriter mMockPrintWriter;
+ @Captor private ArgumentCaptor<String> mCaptorString;
- @Test
- @UiThreadTest
- public void testMaintenanceActive() throws Exception {
- MockCarPowerManagementService powerManagementService = new MockCarPowerManagementService();
- MockDeviceIdleController controller = new MockDeviceIdleController(true);
- GarageModeServiceForTest garageMode = new GarageModeServiceForTest(getContext(),
- powerManagementService,
- controller);
- garageMode.init();
- final int index1 = garageMode.getGarageModeIndex();
- assertEquals(garageMode.getMaintenanceWindow(),
- powerManagementService.doNotifyPrepareShutdown(false));
- assertEquals(true, garageMode.isInGarageMode());
- assertEquals(true, garageMode.isMaintenanceActive());
+ private GarageModeService mService;
- controller.setMaintenanceActivity(false);
- assertEquals(false, garageMode.isInGarageMode());
- assertEquals(false, garageMode.isMaintenanceActive());
- final int index2 = garageMode.getGarageModeIndex();
-
- assertEquals(1, index2 - index1);
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ when(mMockContext.getContentResolver()).thenReturn(mMockContentResolver);
+ mService = new GarageModeService(mMockContext, mMockController);
}
@Test
- @UiThreadTest
- public void testMaintenanceInactive() throws Exception {
- MockCarPowerManagementService powerManagementService = new MockCarPowerManagementService();
- MockDeviceIdleController controller = new MockDeviceIdleController(false);
- GarageModeServiceForTest garageMode = new GarageModeServiceForTest(getContext(),
- powerManagementService,
- controller);
- garageMode.init();
- assertEquals(garageMode.getMaintenanceWindow(),
- powerManagementService.doNotifyPrepareShutdown(false));
- assertEquals(true, garageMode.isInGarageMode());
- assertEquals(false, garageMode.isMaintenanceActive());
- }
+ public void testDump_shouldSucceed() {
+ when(mMockController.isGarageModeActive()).thenReturn(true);
- @Test
- @UiThreadTest
- public void testDisplayOn() throws Exception {
- MockCarPowerManagementService powerManagementService = new MockCarPowerManagementService();
- MockDeviceIdleController controller = new MockDeviceIdleController(true);
- GarageModeServiceForTest garageMode = new GarageModeServiceForTest(getContext(),
- powerManagementService,
- controller);
- garageMode.init();
-
- powerManagementService.doNotifyPrepareShutdown(false);
- assertTrue(garageMode.getGarageModeIndex() > 0);
- powerManagementService.doNotifyPowerOn(true);
- assertEquals(0, garageMode.getGarageModeIndex());
- }
-
- @Test
- @UiThreadTest
- public void testPolicyIndexing() throws Exception {
- // Background processing of asynchronous messages.
- HandlerThread thread = new HandlerThread("testPolicy");
- thread.start();
-
- // Test that the index is saved in the prefs and that this index is used to determine the
- // next wakeup time.
- MockCarPowerManagementService powerManagementService = new MockCarPowerManagementService();
- MockDeviceIdleController controller = new MockDeviceIdleController(true);
- GarageModeServiceForTest garageMode = new GarageModeServiceForTest(getContext(),
- powerManagementService,
- controller,
- thread.getLooper());
- GarageModePolicy policy = new GarageModePolicy(new String[] {
- "15m,1",
- "6h,8",
- "1d,5",
- });
- SharedPreferences prefs =
- getContext().getSharedPreferences("testPolicy", Context.MODE_PRIVATE);
- prefs.edit().putInt("garage_mode_index", 0).apply();
- garageMode.init(policy, prefs);
-
- assertEquals(15 * 60, garageMode.getWakeupTime());
- garageMode.onPrepareShutdown(false);
- garageMode.onShutdown();
- assertEquals(6 * 60 * 60, garageMode.getWakeupTime());
- Thread.sleep(WAIT_FOR_COMPLETION_TIME_MS);
- assertEquals(1, prefs.getInt("garage_mode_index", 0));
-
- garageMode = new GarageModeServiceForTest(getContext(),
- powerManagementService,
- controller,
- thread.getLooper());
- // Jump ahead 8 restarts.
- prefs = getContext().getSharedPreferences("testPolicy", Context.MODE_PRIVATE);
- prefs.edit().putInt("garage_mode_index", 8).apply();
- garageMode.init(policy, prefs);
-
- assertEquals(6 * 60 * 60, garageMode.getWakeupTime());
- garageMode.onPrepareShutdown(false);
- garageMode.onShutdown();
- assertEquals(24 * 60 * 60, garageMode.getWakeupTime());
- Thread.sleep(WAIT_FOR_COMPLETION_TIME_MS);
- assertEquals(9, prefs.getInt("garage_mode_index", 0));
- }
-
- @Test
- public void testPolicyParserValid() throws Exception {
- WakeupInterval[] expected = new WakeupInterval[] {
- new WakeupInterval(15 * 60, 1),
- new WakeupInterval(6 * 60 * 60, 8),
- new WakeupInterval(24 * 60 * 60, 5),
- };
- List<WakeupInterval> received = new GarageModePolicy(new String[] {
- "15m,1",
- "6h,8",
- "1d,5",
- }).getWakeupIntervals();
-
- assertEquals(expected.length, received.size());
- for (int i = 0; i < expected.length; i++) {
- assertEquals(expected[i].getWakeupInterval(), received.get(i).getWakeupInterval());
- assertEquals(expected[i].getNumAttempts(), received.get(i).getNumAttempts());
- }
- }
-
- @Test
- public void testPolicyParser() {
- GarageModePolicy policy;
-
- policy = new GarageModePolicy(null);
- assertEquals(0, policy.getWakeupIntervals().size());
-
- policy = new GarageModePolicy(new String[] {});
- assertEquals(0, policy.getWakeupIntervals().size());
-
- policy = new GarageModePolicy(new String[] {""});
- assertEquals(0, policy.getWakeupIntervals().size());
-
- policy = new GarageModePolicy(new String[] {"15,1"});
- assertEquals(0, policy.getWakeupIntervals().size());
-
- policy = new GarageModePolicy(new String[] {"15y,1"});
- assertEquals(0, policy.getWakeupIntervals().size());
-
- policy = new GarageModePolicy(new String[] {"15m"});
- assertEquals(0, policy.getWakeupIntervals().size());
-
- policy = new GarageModePolicy(new String[] {"15m,Q"});
- assertEquals(0, policy.getWakeupIntervals().size());
-
- policy = new GarageModePolicy(new String[] {"15m,-1"});
- assertEquals(0, policy.getWakeupIntervals().size());
-
- policy = new GarageModePolicy(new String[] {",1"});
- assertEquals(0, policy.getWakeupIntervals().size());
-
- policy = new GarageModePolicy(new String[] {"m,1"});
- assertEquals(0, policy.getWakeupIntervals().size());
-
- policy = new GarageModePolicy(new String[] {"Qm,1"});
- assertEquals(0, policy.getWakeupIntervals().size());
-
- policy = new GarageModePolicy(new String[] {"-10m,1"});
- assertEquals(0, policy.getWakeupIntervals().size());
-
- }
-
- @Test
- public void testPolicyInResource() throws Exception {
- // Test that the policy in the resource file parses fine.
- GarageModePolicy policy = new GarageModePolicy(getContext().getResources().getStringArray(
- R.array.config_garageModeCadence));
- assertTrue(policy.getWakeupIntervals().size() > 0);
- }
-
- private static class MockCarPowerManagementService extends CarPowerManagementService {
- public long doNotifyPrepareShutdown(boolean shuttingdown) {
- return notifyPrepareShutdown(shuttingdown);
- }
-
- public void doNotifyPowerOn(boolean displayOn) {
- notifyPowerOn(displayOn);
- }
- }
-
- private static class GarageModeServiceForTest extends GarageModeService {
- GarageModeServiceForTest(Context context,
- CarPowerManagementService powerManagementService,
- DeviceIdleControllerWrapper controllerWrapper,
- Looper looper) {
- super(context, powerManagementService, controllerWrapper, looper);
- }
-
- GarageModeServiceForTest(Context context,
- CarPowerManagementService powerManagementService,
- DeviceIdleControllerWrapper controllerWrapper) {
- super(context, powerManagementService, controllerWrapper, Looper.myLooper());
- }
-
- public long getMaintenanceWindow() {
- return CarSettings.DEFAULT_GARAGE_MODE_MAINTENANCE_WINDOW;
- }
-
- public boolean isInGarageMode() {
- synchronized (this) {
- return mInGarageMode;
- }
- }
-
- public boolean isMaintenanceActive() {
- synchronized (this) {
- return mMaintenanceActive;
- }
- }
-
- public int getGarageModeIndex() {
- synchronized (this) {
- return mGarageModeIndex;
- }
- }
- }
-
- private Context getContext() {
- return InstrumentationRegistry.getTargetContext();
- }
-
- private static class MockDeviceIdleController extends DeviceIdleControllerWrapper {
-
- private final boolean mInitialActive;
-
- MockDeviceIdleController(boolean active) {
- super();
- mInitialActive = active;
- }
-
- @Override
- protected boolean startLocked() {
- return mInitialActive;
- }
-
- @Override
- public void stopTracking() {
- // nothing to clean up
- }
-
- @Override
- protected void reportActiveLocked(final boolean active) {
- // directly calling the callback instead of posting to handler, to make testing easier.
- if (mListener.get() != null) {
- mListener.get().onMaintenanceActivityChanged(active);
- }
- }
-
- public void setMaintenanceActivity(boolean active) {
- super.setMaintenanceActivity(active);
- }
+ mService.dump(mMockPrintWriter);
+ verify(mMockPrintWriter).println(mCaptorString.capture());
+ List<String> strings = mCaptorString.getAllValues();
+ assertThat(strings.get(0)).isEqualTo("GarageModeInProgress true");
}
}
diff --git a/tests/carservice_test/src/com/android/car/garagemode/WakeupPolicyTest.java b/tests/carservice_test/src/com/android/car/garagemode/WakeupPolicyTest.java
new file mode 100644
index 0000000..921434b
--- /dev/null
+++ b/tests/carservice_test/src/com/android/car/garagemode/WakeupPolicyTest.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.garagemode;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.car.R;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class WakeupPolicyTest {
+ @Test
+ public void testPolicyParser() {
+ WakeupPolicy policy;
+
+ policy = new WakeupPolicy(null);
+ assertThat(policy.getWakupIntervalsAmount()).isEqualTo(0);
+
+ policy = new WakeupPolicy(new String[] {});
+ assertThat(policy.getWakupIntervalsAmount()).isEqualTo(0);
+
+ policy = new WakeupPolicy(new String[] {""});
+ assertThat(policy.getWakupIntervalsAmount()).isEqualTo(0);
+
+ policy = new WakeupPolicy(new String[] {"15,1"});
+ assertThat(policy.getWakupIntervalsAmount()).isEqualTo(0);
+
+ policy = new WakeupPolicy(new String[] {"15y,1"});
+ assertThat(policy.getWakupIntervalsAmount()).isEqualTo(0);
+
+ policy = new WakeupPolicy(new String[] {"15m"});
+ assertThat(policy.getWakupIntervalsAmount()).isEqualTo(0);
+
+ policy = new WakeupPolicy(new String[] {"15m,Q"});
+ assertThat(policy.getWakupIntervalsAmount()).isEqualTo(0);
+
+ policy = new WakeupPolicy(new String[] {"15m,-1"});
+ assertThat(policy.getWakupIntervalsAmount()).isEqualTo(0);
+
+ policy = new WakeupPolicy(new String[] {",1"});
+ assertThat(policy.getWakupIntervalsAmount()).isEqualTo(0);
+
+ policy = new WakeupPolicy(new String[] {"m,1"});
+ assertThat(policy.getWakupIntervalsAmount()).isEqualTo(0);
+
+ policy = new WakeupPolicy(new String[] {"Qm,1"});
+ assertThat(policy.getWakupIntervalsAmount()).isEqualTo(0);
+
+ policy = new WakeupPolicy(new String[] {"-10m,1"});
+ assertThat(policy.getWakupIntervalsAmount()).isEqualTo(0);
+ }
+
+ @Test
+ public void testPolicyInResource() throws Exception {
+ // Test that the policy in the resource file parses fine.
+ WakeupPolicy policy = new WakeupPolicy(
+ getContext().getResources().getStringArray(R.array.config_garageModeCadence));
+ assertThat(policy.getWakupIntervalsAmount() > 0).isTrue();
+ }
+
+ private Context getContext() {
+ return InstrumentationRegistry.getTargetContext();
+ }
+}
diff --git a/tests/carservice_unit_test/Android.mk b/tests/carservice_unit_test/Android.mk
index 06e50b7..ccc97b5 100644
--- a/tests/carservice_unit_test/Android.mk
+++ b/tests/carservice_unit_test/Android.mk
@@ -36,12 +36,14 @@
LOCAL_JAVA_LIBRARIES := \
android.car \
+ android.car.userlib \
android.test.runner \
android.test.base
LOCAL_STATIC_JAVA_LIBRARIES := \
junit \
- android-support-test \
+ androidx.test.core \
+ androidx.test.rules \
mockito-target-minus-junit4 \
com.android.car.test.utils \
truth-prebuilt
diff --git a/tests/carservice_unit_test/AndroidManifest.xml b/tests/carservice_unit_test/AndroidManifest.xml
index 0f67275..1a9a3cc 100644
--- a/tests/carservice_unit_test/AndroidManifest.xml
+++ b/tests/carservice_unit_test/AndroidManifest.xml
@@ -18,7 +18,7 @@
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
package="com.android.car.carservice_unittest"
android:sharedUserId="android.uid.system" >
- <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+ <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
android:targetPackage="com.android.car"
android:label="Unit Tests for Car APIs"/>
diff --git a/tests/carservice_unit_test/src/android/car/userlib/CarUserManagerHelperTest.java b/tests/carservice_unit_test/src/android/car/userlib/CarUserManagerHelperTest.java
new file mode 100644
index 0000000..19ae7f4
--- /dev/null
+++ b/tests/carservice_unit_test/src/android/car/userlib/CarUserManagerHelperTest.java
@@ -0,0 +1,937 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.car.userlib;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import android.app.ActivityManager;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.UserInfo;
+import android.graphics.Bitmap;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.SystemProperties;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.provider.Settings;
+import android.sysprop.CarProperties;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+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 java.util.ArrayList;
+import java.util.List;
+
+/**
+ * This class contains unit tests for the {@link CarUserManagerHelper}.
+ * It tests that {@link CarUserManagerHelper} does the right thing for user management flows.
+ *
+ * The following mocks are used:
+ * 1. {@link Context} provides system services and resources.
+ * 2. {@link UserManager} provides dummy users and user info.
+ * 3. {@link ActivityManager} to verify user switch is invoked.
+ * 4. {@link CarUserManagerHelper.OnUsersUpdateListener} registers a listener for user updates.
+ */
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class CarUserManagerHelperTest {
+ @Mock
+ private Context mContext;
+ @Mock
+ private UserManager mUserManager;
+ @Mock
+ private ActivityManager mActivityManager;
+ @Mock
+ private CarUserManagerHelper.OnUsersUpdateListener mTestListener;
+
+ private static final String GUEST_USER_NAME = "testGuest";
+ private static final String TEST_USER_NAME = "testUser";
+ private static final String DEFAULT_ADMIN_NAME = "defaultAdminName";
+
+ private CarUserManagerHelper mCarUserManagerHelper;
+ private UserInfo mCurrentProcessUser;
+ private UserInfo mSystemUser;
+ private int mForegroundUserId;
+ private UserInfo mForegroundUser;
+
+ @Before
+ public void setUpMocksAndVariables() throws Exception {
+ MockitoAnnotations.initMocks(this);
+ doReturn(mUserManager).when(mContext).getSystemService(Context.USER_SERVICE);
+ doReturn(mActivityManager).when(mContext).getSystemService(Context.ACTIVITY_SERVICE);
+ doReturn(InstrumentationRegistry.getTargetContext().getResources())
+ .when(mContext).getResources();
+ doReturn(InstrumentationRegistry.getTargetContext().getContentResolver())
+ .when(mContext).getContentResolver();
+ doReturn(mContext).when(mContext).getApplicationContext();
+ mCarUserManagerHelper = new CarUserManagerHelper(mContext);
+ mCarUserManagerHelper.setDefaultAdminName(DEFAULT_ADMIN_NAME);
+
+ mCurrentProcessUser = createUserInfoForId(UserHandle.myUserId());
+ mSystemUser = createUserInfoForId(UserHandle.USER_SYSTEM);
+ doReturn(mCurrentProcessUser).when(mUserManager).getUserInfo(UserHandle.myUserId());
+
+ // Get the ID of the foreground user running this test.
+ // We cannot mock the foreground user since getCurrentUser is static.
+ // We cannot rely on foreground_id != system_id, they could be the same user.
+ mForegroundUserId = ActivityManager.getCurrentUser();
+ mForegroundUser = createUserInfoForId(mForegroundUserId);
+
+ // Restore the non-headless state before every test. Individual tests can set the property
+ // to true to test the headless system user scenario.
+ CarProperties.headless_system_user(false);
+ }
+
+ @Test
+ public void checkIsSystemUser() {
+ UserInfo testInfo = new UserInfo();
+
+ testInfo.id = UserHandle.USER_SYSTEM;
+ assertThat(mCarUserManagerHelper.isSystemUser(testInfo)).isTrue();
+
+ testInfo.id = UserHandle.USER_SYSTEM + 2; // Make it different than system id.
+ assertThat(mCarUserManagerHelper.isSystemUser(testInfo)).isFalse();
+ }
+
+ // System user will not be returned when calling get all users.
+ @Test
+ public void testHeadlessUser0GetAllUsers_NotReturnSystemUser() {
+ CarProperties.headless_system_user(true);
+ UserInfo otherUser1 = createUserInfoForId(10);
+ UserInfo otherUser2 = createUserInfoForId(11);
+ UserInfo otherUser3 = createUserInfoForId(12);
+
+ mockGetUsers(mSystemUser, otherUser1, otherUser2, otherUser3);
+
+ assertThat(mCarUserManagerHelper.getAllUsers())
+ .containsExactly(otherUser1, otherUser2, otherUser3);
+ }
+
+ @Test
+ public void testGetAllSwitchableUsers() {
+ // Create two non-foreground users.
+ UserInfo user1 = createUserInfoForId(mForegroundUserId + 1);
+ UserInfo user2 = createUserInfoForId(mForegroundUserId + 2);
+
+ mockGetUsers(mForegroundUser, user1, user2);
+
+ // Should return all non-foreground users.
+ assertThat(mCarUserManagerHelper.getAllSwitchableUsers()).containsExactly(user1, user2);
+ }
+
+ @Test
+ public void testGetAllPersistentUsers() {
+ // Create two non-ephemeral users.
+ UserInfo user1 = createUserInfoForId(mForegroundUserId);
+ UserInfo user2 = createUserInfoForId(mForegroundUserId + 1);
+ // Create two ephemeral users.
+ UserInfo user3 = new UserInfo(
+ /* id= */mForegroundUserId + 2, /* name = */ "user3", UserInfo.FLAG_EPHEMERAL);
+ UserInfo user4 = new UserInfo(
+ /* id= */mForegroundUserId + 3, /* name = */ "user4", UserInfo.FLAG_EPHEMERAL);
+
+ mockGetUsers(user1, user2, user3, user4);
+
+ // Should return all non-ephemeral users.
+ assertThat(mCarUserManagerHelper.getAllPersistentUsers()).containsExactly(user1, user2);
+ }
+
+ @Test
+ public void testGetAllAdminUsers() {
+ // Create two admin, and two non-admin users.
+ UserInfo user1 = new UserInfo(/* id= */ 10, /* name = */ "user10", UserInfo.FLAG_ADMIN);
+ UserInfo user2 = createUserInfoForId(11);
+ UserInfo user3 = createUserInfoForId(12);
+ UserInfo user4 = new UserInfo(/* id= */ 13, /* name = */ "user13", UserInfo.FLAG_ADMIN);
+
+ mockGetUsers(user1, user2, user3, user4);
+
+ // Should return only admin users.
+ assertThat(mCarUserManagerHelper.getAllAdminUsers()).containsExactly(user1, user4);
+ }
+
+ @Test
+ public void testGetAllUsersExceptGuests() {
+ // Create two users and a guest user.
+ UserInfo user1 = createUserInfoForId(10);
+ UserInfo user2 = createUserInfoForId(12);
+ UserInfo user3 = new UserInfo(/* id= */ 13, /* name = */ "user13", UserInfo.FLAG_GUEST);
+
+ mockGetUsers(user1, user2, user3);
+
+ // Should not return guests.
+ assertThat(mCarUserManagerHelper.getAllUsersExceptGuests())
+ .containsExactly(user1, user2);
+ }
+
+ @Test
+ public void testUserCanBeRemoved() {
+ UserInfo testInfo = new UserInfo();
+
+ // System user cannot be removed.
+ testInfo.id = UserHandle.USER_SYSTEM;
+ assertThat(mCarUserManagerHelper.canUserBeRemoved(testInfo)).isFalse();
+
+ testInfo.id = UserHandle.USER_SYSTEM + 2; // Make it different than system id.
+ assertThat(mCarUserManagerHelper.canUserBeRemoved(testInfo)).isTrue();
+ }
+
+ @Test
+ public void testCurrentProcessCanAddUsers() {
+ doReturn(false).when(mUserManager)
+ .hasUserRestriction(UserManager.DISALLOW_ADD_USER);
+ assertThat(mCarUserManagerHelper.canCurrentProcessAddUsers()).isTrue();
+
+ doReturn(true).when(mUserManager)
+ .hasUserRestriction(UserManager.DISALLOW_ADD_USER);
+ assertThat(mCarUserManagerHelper.canCurrentProcessAddUsers()).isFalse();
+ }
+
+ @Test
+ public void testCurrentProcessCanRemoveUsers() {
+ doReturn(false).when(mUserManager)
+ .hasUserRestriction(UserManager.DISALLOW_REMOVE_USER);
+ assertThat(mCarUserManagerHelper.canCurrentProcessRemoveUsers()).isTrue();
+
+ doReturn(true).when(mUserManager)
+ .hasUserRestriction(UserManager.DISALLOW_REMOVE_USER);
+ assertThat(mCarUserManagerHelper.canCurrentProcessRemoveUsers()).isFalse();
+ }
+
+ @Test
+ public void testCurrentProcessCanSwitchUsers() {
+ doReturn(false).when(mUserManager)
+ .hasUserRestriction(UserManager.DISALLOW_USER_SWITCH);
+ assertThat(mCarUserManagerHelper.canCurrentProcessSwitchUsers()).isTrue();
+
+ doReturn(true).when(mUserManager)
+ .hasUserRestriction(UserManager.DISALLOW_USER_SWITCH);
+ assertThat(mCarUserManagerHelper.canCurrentProcessSwitchUsers()).isFalse();
+ }
+
+ @Test
+ public void testCurrentGuestProcessCannotModifyAccounts() {
+ assertThat(mCarUserManagerHelper.canCurrentProcessModifyAccounts()).isTrue();
+
+ doReturn(true).when(mUserManager).isGuestUser();
+
+ assertThat(mCarUserManagerHelper.canCurrentProcessModifyAccounts()).isFalse();
+ }
+
+ @Test
+ public void testCurrentDemoProcessCannotModifyAccounts() {
+ assertThat(mCarUserManagerHelper.canCurrentProcessModifyAccounts()).isTrue();
+
+ doReturn(true).when(mUserManager).isDemoUser();
+
+ assertThat(mCarUserManagerHelper.canCurrentProcessModifyAccounts()).isFalse();
+ }
+
+ @Test
+ public void testCurrentDisallowModifyAccountsProcessIsEnforced() {
+ assertThat(mCarUserManagerHelper.canCurrentProcessModifyAccounts()).isTrue();
+
+ doReturn(true).when(mUserManager)
+ .hasUserRestriction(UserManager.DISALLOW_MODIFY_ACCOUNTS);
+
+ assertThat(mCarUserManagerHelper.canCurrentProcessModifyAccounts()).isFalse();
+ }
+
+ @Test
+ public void testGetMaxSupportedUsers() {
+ SystemProperties.set("fw.max_users", "11");
+
+ assertThat(mCarUserManagerHelper.getMaxSupportedUsers()).isEqualTo(11);
+
+ // In headless user 0 model, we want to exclude the system user.
+ CarProperties.headless_system_user(true);
+ assertThat(mCarUserManagerHelper.getMaxSupportedUsers()).isEqualTo(10);
+ }
+
+ @Test
+ public void testGetMaxSupportedRealUsers() {
+ SystemProperties.set("fw.max_users", "7");
+
+ // Create three managed profiles, and two normal users.
+ UserInfo user1 = createUserInfoForId(10);
+ UserInfo user2 =
+ new UserInfo(/* id= */ 11, /* name = */ "user11", UserInfo.FLAG_MANAGED_PROFILE);
+ UserInfo user3 =
+ new UserInfo(/* id= */ 12, /* name = */ "user12", UserInfo.FLAG_MANAGED_PROFILE);
+ UserInfo user4 = createUserInfoForId(13);
+ UserInfo user5 =
+ new UserInfo(/* id= */ 14, /* name = */ "user14", UserInfo.FLAG_MANAGED_PROFILE);
+
+ mockGetUsers(user1, user2, user3, user4, user5);
+
+ // Max users - # managed profiles.
+ assertThat(mCarUserManagerHelper.getMaxSupportedRealUsers()).isEqualTo(4);
+ }
+
+ @Test
+ public void testIsUserLimitReached() {
+ UserInfo user1 = createUserInfoForId(10);
+ UserInfo user2 =
+ new UserInfo(/* id= */ 11, /* name = */ "user11", UserInfo.FLAG_MANAGED_PROFILE);
+ UserInfo user3 =
+ new UserInfo(/* id= */ 12, /* name = */ "user12", UserInfo.FLAG_MANAGED_PROFILE);
+ UserInfo user4 = createUserInfoForId(13);
+
+ mockGetUsers(user1, user2, user3, user4);
+
+ SystemProperties.set("fw.max_users", "5");
+ assertThat(mCarUserManagerHelper.isUserLimitReached()).isFalse();
+
+ SystemProperties.set("fw.max_users", "4");
+ assertThat(mCarUserManagerHelper.isUserLimitReached()).isTrue();
+ }
+
+ @Test
+ public void testHeadlessSystemUser_IsUserLimitReached() {
+ CarProperties.headless_system_user(true);
+ UserInfo user1 = createUserInfoForId(10);
+ UserInfo user2 =
+ new UserInfo(/* id= */ 11, /* name = */ "user11", UserInfo.FLAG_MANAGED_PROFILE);
+ UserInfo user3 =
+ new UserInfo(/* id= */ 12, /* name = */ "user12", UserInfo.FLAG_MANAGED_PROFILE);
+ UserInfo user4 = createUserInfoForId(13);
+
+ mockGetUsers(mSystemUser, user1, user2, user3, user4);
+
+ SystemProperties.set("fw.max_users", "6");
+ assertThat(mCarUserManagerHelper.isUserLimitReached()).isFalse();
+
+ SystemProperties.set("fw.max_users", "5");
+ assertThat(mCarUserManagerHelper.isUserLimitReached()).isTrue();
+ }
+
+ @Test
+ public void testIsUserLimitReachedIgnoresGuests() {
+ SystemProperties.set("fw.max_users", "5");
+
+ UserInfo user1 = createUserInfoForId(10);
+ UserInfo user2 =
+ new UserInfo(/* id= */ 11, /* name = */ "user11", UserInfo.FLAG_MANAGED_PROFILE);
+ UserInfo user3 =
+ new UserInfo(/* id= */ 12, /* name = */ "user12", UserInfo.FLAG_MANAGED_PROFILE);
+ UserInfo user4 = createUserInfoForId(13);
+ UserInfo user5 = new UserInfo(/* id= */ 14, /* name = */ "user14", UserInfo.FLAG_GUEST);
+ UserInfo user6 = createUserInfoForId(15);
+
+ mockGetUsers(user1, user2, user3, user4);
+ assertThat(mCarUserManagerHelper.isUserLimitReached()).isFalse();
+
+ // Add guest user. Verify it doesn't affect the limit.
+ mockGetUsers(user1, user2, user3, user4, user5);
+ assertThat(mCarUserManagerHelper.isUserLimitReached()).isFalse();
+
+ // Add normal user. Limit is reached
+ mockGetUsers(user1, user2, user3, user4, user5, user6);
+ assertThat(mCarUserManagerHelper.isUserLimitReached()).isTrue();
+ }
+
+ @Test
+ public void testCreateNewAdminUserCallsCreateUser() {
+ // Make sure current user is admin, since only admins can create other admins.
+ doReturn(true).when(mUserManager).isAdminUser();
+
+ mCarUserManagerHelper.createNewAdminUser(TEST_USER_NAME);
+ verify(mUserManager).createUser(TEST_USER_NAME, UserInfo.FLAG_ADMIN);
+ }
+
+ @Test
+ public void testCreateNewAdminUserReturnsNullUsers() {
+ // Make sure current user is admin, since only admins can create other admins.
+ doReturn(true).when(mUserManager).isAdminUser();
+
+ doReturn(null).when(mUserManager).createUser(TEST_USER_NAME, UserInfo.FLAG_ADMIN);
+ assertThat(mCarUserManagerHelper.createNewAdminUser(TEST_USER_NAME)).isNull();
+ }
+
+ @Test
+ public void testCreateNewAdminUserReturnsCreatedUser() {
+ // Make sure current user is admin, since only admins can create other admins.
+ doReturn(true).when(mUserManager).isAdminUser();
+
+ UserInfo newUser = new UserInfo();
+ newUser.name = TEST_USER_NAME;
+ doReturn(newUser).when(mUserManager).createUser(TEST_USER_NAME, UserInfo.FLAG_ADMIN);
+ assertThat(mCarUserManagerHelper.createNewAdminUser(TEST_USER_NAME)).isEqualTo(newUser);
+ }
+
+ @Test
+ public void testCreateNewAdminUserWithDefaultUserNameCallsCreateUser() {
+ // Make sure current user is admin, since only admins can create other admins.
+ doReturn(true).when(mUserManager).isAdminUser();
+
+ mCarUserManagerHelper.createNewAdminUser();
+ verify(mUserManager).createUser(DEFAULT_ADMIN_NAME, UserInfo.FLAG_ADMIN);
+ }
+
+ @Test
+ public void testCreateNewAdminUserWithDefaultUserNameReturnsNullUsers() {
+ // Make sure current user is admin, since only admins can create other admins.
+ doReturn(true).when(mUserManager).isAdminUser();
+
+ doReturn(null).when(mUserManager).createUser(DEFAULT_ADMIN_NAME, UserInfo.FLAG_ADMIN);
+ assertThat(mCarUserManagerHelper.createNewAdminUser(DEFAULT_ADMIN_NAME)).isNull();
+ }
+
+ @Test
+ public void testCreateNewAdminUserWithDefaultUserNameReturnsCreatedUser() {
+ // Make sure current user is admin, since only admins can create other admins.
+ doReturn(true).when(mUserManager).isAdminUser();
+
+ UserInfo newUser = new UserInfo();
+ newUser.name = DEFAULT_ADMIN_NAME;
+ doReturn(newUser).when(mUserManager).createUser(DEFAULT_ADMIN_NAME, UserInfo.FLAG_ADMIN);
+ assertThat(mCarUserManagerHelper.createNewAdminUser()).isEqualTo(newUser);
+ }
+
+ @Test
+ public void testAdminsCanCreateAdmins() {
+ String newAdminName = "Test new admin";
+ UserInfo expectedAdmin = new UserInfo();
+ expectedAdmin.name = newAdminName;
+ doReturn(expectedAdmin).when(mUserManager).createUser(newAdminName, UserInfo.FLAG_ADMIN);
+
+ // Admins can create other admins.
+ doReturn(true).when(mUserManager).isAdminUser();
+ UserInfo actualAdmin = mCarUserManagerHelper.createNewAdminUser(newAdminName);
+ assertThat(actualAdmin).isEqualTo(expectedAdmin);
+ }
+
+ @Test
+ public void testNonAdminsCanNotCreateAdmins() {
+ String newAdminName = "Test new admin";
+ UserInfo expectedAdmin = new UserInfo();
+ expectedAdmin.name = newAdminName;
+ doReturn(expectedAdmin).when(mUserManager).createUser(newAdminName, UserInfo.FLAG_ADMIN);
+
+ // Test that non-admins cannot create new admins.
+ doReturn(false).when(mUserManager).isAdminUser(); // Current user non-admin.
+ assertThat(mCarUserManagerHelper.createNewAdminUser(newAdminName)).isNull();
+ }
+
+ @Test
+ public void testSystemUserCanCreateAdmins() {
+ String newAdminName = "Test new admin";
+ UserInfo expectedAdmin = new UserInfo();
+ expectedAdmin.name = newAdminName;
+
+ doReturn(expectedAdmin).when(mUserManager).createUser(newAdminName, UserInfo.FLAG_ADMIN);
+
+ // System user can create admins.
+ doReturn(true).when(mUserManager).isSystemUser();
+ UserInfo actualAdmin = mCarUserManagerHelper.createNewAdminUser(newAdminName);
+ assertThat(actualAdmin).isEqualTo(expectedAdmin);
+ }
+
+ @Test
+ public void testCreateNewNonAdminUser() {
+ // Verify createUser on UserManager gets called.
+ mCarUserManagerHelper.createNewNonAdminUser(TEST_USER_NAME);
+ verify(mUserManager).createUser(TEST_USER_NAME, 0);
+
+ doReturn(null).when(mUserManager).createUser(TEST_USER_NAME, 0);
+ assertThat(mCarUserManagerHelper.createNewNonAdminUser(TEST_USER_NAME)).isNull();
+
+ UserInfo newUser = new UserInfo();
+ newUser.name = TEST_USER_NAME;
+ doReturn(newUser).when(mUserManager).createUser(TEST_USER_NAME, 0);
+ assertThat(mCarUserManagerHelper.createNewNonAdminUser(TEST_USER_NAME)).isEqualTo(newUser);
+ }
+
+ @Test
+ public void testCannotRemoveSystemUser() {
+ assertThat(mCarUserManagerHelper.removeUser(mSystemUser, GUEST_USER_NAME)).isFalse();
+ }
+
+ @Test
+ public void testAdminsCanRemoveOtherUsers() {
+ int idToRemove = mCurrentProcessUser.id + 2;
+ UserInfo userToRemove = createUserInfoForId(idToRemove);
+
+ doReturn(true).when(mUserManager).removeUser(idToRemove);
+
+ // If Admin is removing non-current, non-system user, simply calls removeUser.
+ doReturn(true).when(mUserManager).isAdminUser();
+ assertThat(mCarUserManagerHelper.removeUser(userToRemove, GUEST_USER_NAME)).isTrue();
+ verify(mUserManager).removeUser(idToRemove);
+ }
+
+ @Test
+ public void testNonAdminsCanNotRemoveOtherUsers() {
+ UserInfo otherUser = createUserInfoForId(mCurrentProcessUser.id + 2);
+
+ // Make current user non-admin.
+ doReturn(false).when(mUserManager).isAdminUser();
+
+ // Mock so that removeUser always pretends it's successful.
+ doReturn(true).when(mUserManager).removeUser(anyInt());
+
+ // If Non-Admin is trying to remove someone other than themselves, they should fail.
+ assertThat(mCarUserManagerHelper.removeUser(otherUser, GUEST_USER_NAME)).isFalse();
+ verify(mUserManager, never()).removeUser(otherUser.id);
+ }
+
+ @Test
+ public void testRemoveLastActiveUser() {
+ // Cannot remove system user.
+ assertThat(mCarUserManagerHelper.removeUser(mSystemUser, GUEST_USER_NAME)).isFalse();
+
+ UserInfo adminInfo = new UserInfo(/* id= */10, "admin", UserInfo.FLAG_ADMIN);
+ mockGetUsers(adminInfo);
+
+ assertThat(mCarUserManagerHelper.removeUser(adminInfo, GUEST_USER_NAME))
+ .isEqualTo(false);
+ }
+
+ @Test
+ public void testRemoveLastAdminUser() {
+ // Make current user admin.
+ doReturn(true).when(mUserManager).isAdminUser();
+
+ UserInfo adminInfo = new UserInfo(/* id= */10, "admin", UserInfo.FLAG_ADMIN);
+ UserInfo nonAdminInfo = new UserInfo(/* id= */11, "non-admin", 0);
+ mockGetUsers(adminInfo, nonAdminInfo);
+
+ UserInfo newAdminInfo = new UserInfo(/* id= */12, DEFAULT_ADMIN_NAME, UserInfo.FLAG_ADMIN);
+ doReturn(newAdminInfo)
+ .when(mUserManager).createUser(DEFAULT_ADMIN_NAME, UserInfo.FLAG_ADMIN);
+
+ mCarUserManagerHelper.removeUser(adminInfo, GUEST_USER_NAME);
+ verify(mUserManager).createUser(DEFAULT_ADMIN_NAME, UserInfo.FLAG_ADMIN);
+ verify(mActivityManager).switchUser(newAdminInfo.id);
+ verify(mUserManager).removeUser(adminInfo.id);
+ }
+
+ @Test
+ public void testRemoveLastAdminUserFailsToCreateNewUser() {
+ // Make current user admin.
+ doReturn(true).when(mUserManager).isAdminUser();
+
+ UserInfo adminInfo = new UserInfo(/* id= */10, "admin", UserInfo.FLAG_ADMIN);
+ UserInfo nonAdminInfo = new UserInfo(/* id= */11, "non-admin", 0);
+ mockGetUsers(adminInfo, nonAdminInfo);
+
+ UserInfo newAdminInfo = new UserInfo(/* id= */12, DEFAULT_ADMIN_NAME, UserInfo.FLAG_ADMIN);
+ doReturn(newAdminInfo)
+ .when(mUserManager).createUser(DEFAULT_ADMIN_NAME, UserInfo.FLAG_ADMIN);
+
+ // Fail to create a new user to force a failure case
+ doReturn(null)
+ .when(mUserManager).createUser(DEFAULT_ADMIN_NAME, UserInfo.FLAG_ADMIN);
+
+ mCarUserManagerHelper.removeUser(adminInfo, GUEST_USER_NAME);
+ verify(mUserManager).createUser(DEFAULT_ADMIN_NAME, UserInfo.FLAG_ADMIN);
+ verify(mActivityManager, never()).switchUser(anyInt());
+ verify(mUserManager, never()).removeUser(adminInfo.id);
+ }
+
+ @Test
+ public void testSwitchToGuest() {
+ mCarUserManagerHelper.startGuestSession(GUEST_USER_NAME);
+ verify(mUserManager).createGuest(mContext, GUEST_USER_NAME);
+
+ UserInfo guestInfo = new UserInfo(/* id= */21, GUEST_USER_NAME, UserInfo.FLAG_GUEST);
+ doReturn(guestInfo).when(mUserManager).createGuest(mContext, GUEST_USER_NAME);
+ mCarUserManagerHelper.startGuestSession(GUEST_USER_NAME);
+ verify(mActivityManager).switchUser(21);
+ }
+
+ @Test
+ public void testSwitchToId() {
+ int userIdToSwitchTo = mForegroundUserId + 2;
+ doReturn(true).when(mActivityManager).switchUser(userIdToSwitchTo);
+
+ assertThat(mCarUserManagerHelper.switchToUserId(userIdToSwitchTo)).isTrue();
+ verify(mActivityManager).switchUser(userIdToSwitchTo);
+ }
+
+ @Test
+ public void testSwitchToForegroundIdExitsEarly() {
+ doReturn(true).when(mActivityManager).switchUser(mForegroundUserId);
+
+ assertThat(mCarUserManagerHelper.switchToUserId(mForegroundUserId)).isFalse();
+ verify(mActivityManager, never()).switchUser(mForegroundUserId);
+ }
+
+ @Test
+ public void testCannotSwitchIfSwitchingNotAllowed() {
+ int userIdToSwitchTo = mForegroundUserId + 2;
+ doReturn(true).when(mActivityManager).switchUser(userIdToSwitchTo);
+ doReturn(true).when(mUserManager).hasUserRestriction(UserManager.DISALLOW_USER_SWITCH);
+ assertThat(mCarUserManagerHelper.switchToUserId(userIdToSwitchTo)).isFalse();
+ verify(mActivityManager, never()).switchUser(userIdToSwitchTo);
+ }
+
+ @Test
+ public void testGetUserIcon() {
+ mCarUserManagerHelper.getUserIcon(mCurrentProcessUser);
+ verify(mUserManager).getUserIcon(mCurrentProcessUser.id);
+ }
+
+ @Test
+ public void testScaleUserIcon() {
+ Bitmap fakeIcon = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
+ Drawable scaledIcon = mCarUserManagerHelper.scaleUserIcon(fakeIcon, 300);
+ assertThat(scaledIcon.getIntrinsicWidth()).isEqualTo(300);
+ assertThat(scaledIcon.getIntrinsicHeight()).isEqualTo(300);
+ }
+
+ @Test
+ public void testSetUserName() {
+ UserInfo testInfo = createUserInfoForId(mCurrentProcessUser.id + 3);
+ String newName = "New Test Name";
+ mCarUserManagerHelper.setUserName(testInfo, newName);
+ verify(mUserManager).setUserName(mCurrentProcessUser.id + 3, newName);
+ }
+
+ @Test
+ public void testIsCurrentProcessSystemUser() {
+ doReturn(true).when(mUserManager).isAdminUser();
+ assertThat(mCarUserManagerHelper.isCurrentProcessAdminUser()).isTrue();
+
+ doReturn(false).when(mUserManager).isAdminUser();
+ assertThat(mCarUserManagerHelper.isCurrentProcessAdminUser()).isFalse();
+ }
+
+ @Test
+ public void testGrantAdminPermissions() {
+ int userId = 30;
+ UserInfo testInfo = createUserInfoForId(userId);
+
+ // Test that non-admins cannot grant admin permissions.
+ doReturn(false).when(mUserManager).isAdminUser(); // Current user non-admin.
+ mCarUserManagerHelper.grantAdminPermissions(testInfo);
+ verify(mUserManager, never()).setUserAdmin(userId);
+
+ // Admins can grant admin permissions.
+ doReturn(true).when(mUserManager).isAdminUser();
+ mCarUserManagerHelper.grantAdminPermissions(testInfo);
+ verify(mUserManager).setUserAdmin(userId);
+ }
+
+ @Test
+ public void testSetUserRestriction() {
+ int userId = 20;
+ UserInfo testInfo = createUserInfoForId(userId);
+
+ mCarUserManagerHelper.setUserRestriction(
+ testInfo, UserManager.DISALLOW_ADD_USER, /* enable= */ true);
+ verify(mUserManager).setUserRestriction(
+ UserManager.DISALLOW_ADD_USER, true, UserHandle.of(userId));
+
+ mCarUserManagerHelper.setUserRestriction(
+ testInfo, UserManager.DISALLOW_REMOVE_USER, /* enable= */ false);
+ verify(mUserManager).setUserRestriction(
+ UserManager.DISALLOW_REMOVE_USER, false, UserHandle.of(userId));
+ }
+
+ @Test
+ public void testDefaultNonAdminRestrictions() {
+ String testUserName = "Test User";
+ int userId = 20;
+ UserInfo newNonAdmin = createUserInfoForId(userId);
+
+ doReturn(newNonAdmin).when(mUserManager).createUser(testUserName, /* flags= */ 0);
+
+ mCarUserManagerHelper.createNewNonAdminUser(testUserName);
+
+ verify(mUserManager).setUserRestriction(
+ UserManager.DISALLOW_FACTORY_RESET, /* enable= */ true, UserHandle.of(userId));
+ verify(mUserManager).setUserRestriction(
+ UserManager.DISALLOW_SMS, /* enable= */ false, UserHandle.of(userId));
+ verify(mUserManager).setUserRestriction(
+ UserManager.DISALLOW_OUTGOING_CALLS, /* enable= */ false, UserHandle.of(userId));
+ }
+
+ @Test
+ public void testDefaultGuestRestrictions() {
+ int guestRestrictionsExpectedCount = 7;
+
+ ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
+ mCarUserManagerHelper.initDefaultGuestRestrictions();
+
+ verify(mUserManager).setDefaultGuestRestrictions(bundleCaptor.capture());
+ Bundle guestRestrictions = bundleCaptor.getValue();
+
+ assertThat(guestRestrictions.keySet()).hasSize(guestRestrictionsExpectedCount);
+ assertThat(guestRestrictions.getBoolean(UserManager.DISALLOW_FACTORY_RESET)).isTrue();
+ assertThat(guestRestrictions.getBoolean(UserManager.DISALLOW_REMOVE_USER)).isTrue();
+ assertThat(guestRestrictions.getBoolean(UserManager.DISALLOW_MODIFY_ACCOUNTS)).isTrue();
+ assertThat(guestRestrictions.getBoolean(UserManager.DISALLOW_OUTGOING_CALLS)).isTrue();
+ assertThat(guestRestrictions.getBoolean(UserManager.DISALLOW_SMS)).isTrue();
+ assertThat(guestRestrictions.getBoolean(UserManager.DISALLOW_INSTALL_APPS)).isTrue();
+ assertThat(guestRestrictions.getBoolean(UserManager.DISALLOW_UNINSTALL_APPS)).isTrue();
+ }
+
+ @Test
+ public void testGrantingAdminPermissionsRemovesNonAdminRestrictions() {
+ int testUserId = 30;
+ boolean restrictionEnabled = false;
+ UserInfo testInfo = createUserInfoForId(testUserId);
+
+ // Only admins can grant permissions.
+ doReturn(true).when(mUserManager).isAdminUser();
+
+ mCarUserManagerHelper.grantAdminPermissions(testInfo);
+
+ verify(mUserManager).setUserRestriction(
+ UserManager.DISALLOW_FACTORY_RESET, restrictionEnabled, UserHandle.of(testUserId));
+ }
+
+ @Test
+ public void testRegisterUserChangeReceiver() {
+ mCarUserManagerHelper.registerOnUsersUpdateListener(mTestListener);
+
+ ArgumentCaptor<BroadcastReceiver> receiverCaptor =
+ ArgumentCaptor.forClass(BroadcastReceiver.class);
+ ArgumentCaptor<UserHandle> handleCaptor = ArgumentCaptor.forClass(UserHandle.class);
+ ArgumentCaptor<IntentFilter> filterCaptor = ArgumentCaptor.forClass(IntentFilter.class);
+ ArgumentCaptor<String> permissionCaptor = ArgumentCaptor.forClass(String.class);
+ ArgumentCaptor<Handler> handlerCaptor = ArgumentCaptor.forClass(Handler.class);
+
+ verify(mContext).registerReceiverAsUser(
+ receiverCaptor.capture(),
+ handleCaptor.capture(),
+ filterCaptor.capture(),
+ permissionCaptor.capture(),
+ handlerCaptor.capture());
+
+ // Verify we're listening to Intents from ALL users.
+ assertThat(handleCaptor.getValue()).isEqualTo(UserHandle.ALL);
+
+ // Verify the presence of each intent in the filter.
+ // Verify the exact number of filters. Every time a new intent is added, this test should
+ // get updated.
+ assertThat(filterCaptor.getValue().countActions()).isEqualTo(6);
+ assertThat(filterCaptor.getValue().hasAction(Intent.ACTION_USER_REMOVED)).isTrue();
+ assertThat(filterCaptor.getValue().hasAction(Intent.ACTION_USER_ADDED)).isTrue();
+ assertThat(filterCaptor.getValue().hasAction(Intent.ACTION_USER_INFO_CHANGED)).isTrue();
+ assertThat(filterCaptor.getValue().hasAction(Intent.ACTION_USER_SWITCHED)).isTrue();
+ assertThat(filterCaptor.getValue().hasAction(Intent.ACTION_USER_STOPPED)).isTrue();
+ assertThat(filterCaptor.getValue().hasAction(Intent.ACTION_USER_UNLOCKED)).isTrue();
+
+ // Verify that calling the receiver calls the listener.
+ receiverCaptor.getValue().onReceive(mContext, new Intent());
+ verify(mTestListener).onUsersUpdate();
+
+ assertThat(permissionCaptor.getValue()).isNull();
+ assertThat(handlerCaptor.getValue()).isNull();
+
+ // Unregister the receiver.
+ mCarUserManagerHelper.unregisterOnUsersUpdateListener(mTestListener);
+ verify(mContext).unregisterReceiver(receiverCaptor.getValue());
+ }
+
+ @Test
+ public void testMultipleRegistrationsOfSameListener() {
+ CarUserManagerHelper.OnUsersUpdateListener listener =
+ Mockito.mock(CarUserManagerHelper.OnUsersUpdateListener.class);
+
+ ArgumentCaptor<BroadcastReceiver> receiverCaptor =
+ ArgumentCaptor.forClass(BroadcastReceiver.class);
+
+ mCarUserManagerHelper.registerOnUsersUpdateListener(listener);
+ mCarUserManagerHelper.registerOnUsersUpdateListener(listener);
+ // Even for multiple registrations of the same listener, broadcast receiver registered once.
+ verify(mContext, times(1))
+ .registerReceiverAsUser(receiverCaptor.capture(), any(), any(), any(), any());
+
+ // Verify that calling the receiver calls the listener.
+ receiverCaptor.getValue().onReceive(mContext, new Intent());
+ verify(listener).onUsersUpdate();
+
+ // Verify that a single removal unregisters the listener.
+ mCarUserManagerHelper.unregisterOnUsersUpdateListener(listener);
+ verify(mContext).unregisterReceiver(any());
+ }
+
+ @Test
+ public void testMultipleUnregistrationsOfTheSameListener() {
+ CarUserManagerHelper.OnUsersUpdateListener listener =
+ Mockito.mock(CarUserManagerHelper.OnUsersUpdateListener.class);
+ mCarUserManagerHelper.registerOnUsersUpdateListener(listener);
+
+ // Verify that a multiple unregistrations cause only one unregister for broadcast receiver.
+ mCarUserManagerHelper.unregisterOnUsersUpdateListener(listener);
+ mCarUserManagerHelper.unregisterOnUsersUpdateListener(listener);
+ mCarUserManagerHelper.unregisterOnUsersUpdateListener(listener);
+ verify(mContext, times(1)).unregisterReceiver(any());
+ }
+
+ @Test
+ public void testUnregisterReceiverCalledAfterAllListenersUnregister() {
+ CarUserManagerHelper.OnUsersUpdateListener listener1 =
+ Mockito.mock(CarUserManagerHelper.OnUsersUpdateListener.class);
+ CarUserManagerHelper.OnUsersUpdateListener listener2 =
+ Mockito.mock(CarUserManagerHelper.OnUsersUpdateListener.class);
+
+ mCarUserManagerHelper.registerOnUsersUpdateListener(listener1);
+ mCarUserManagerHelper.registerOnUsersUpdateListener(listener2);
+
+ mCarUserManagerHelper.unregisterOnUsersUpdateListener(listener1);
+ verify(mContext, never()).unregisterReceiver(any());
+
+ mCarUserManagerHelper.unregisterOnUsersUpdateListener(listener2);
+ verify(mContext, times(1)).unregisterReceiver(any());
+ }
+
+ @Test
+ public void testRegisteringMultipleListeners() {
+ CarUserManagerHelper.OnUsersUpdateListener listener1 =
+ Mockito.mock(CarUserManagerHelper.OnUsersUpdateListener.class);
+ CarUserManagerHelper.OnUsersUpdateListener listener2 =
+ Mockito.mock(CarUserManagerHelper.OnUsersUpdateListener.class);
+ ArgumentCaptor<BroadcastReceiver> receiverCaptor =
+ ArgumentCaptor.forClass(BroadcastReceiver.class);
+
+ mCarUserManagerHelper.registerOnUsersUpdateListener(listener1);
+ mCarUserManagerHelper.registerOnUsersUpdateListener(listener2);
+ verify(mContext, times(1))
+ .registerReceiverAsUser(receiverCaptor.capture(), any(), any(), any(), any());
+
+ // Verify that calling the receiver calls both listeners.
+ receiverCaptor.getValue().onReceive(mContext, new Intent());
+ verify(listener1).onUsersUpdate();
+ verify(listener2).onUsersUpdate();
+ }
+
+ @Test
+ public void testUnregisteringListenerStopsUpdatesForListener() {
+ CarUserManagerHelper.OnUsersUpdateListener listener1 =
+ Mockito.mock(CarUserManagerHelper.OnUsersUpdateListener.class);
+ CarUserManagerHelper.OnUsersUpdateListener listener2 =
+ Mockito.mock(CarUserManagerHelper.OnUsersUpdateListener.class);
+ ArgumentCaptor<BroadcastReceiver> receiverCaptor =
+ ArgumentCaptor.forClass(BroadcastReceiver.class);
+
+ mCarUserManagerHelper.registerOnUsersUpdateListener(listener1);
+ mCarUserManagerHelper.registerOnUsersUpdateListener(listener2);
+ verify(mContext, times(1))
+ .registerReceiverAsUser(receiverCaptor.capture(), any(), any(), any(), any());
+
+ // Unregister listener2
+ mCarUserManagerHelper.unregisterOnUsersUpdateListener(listener2);
+
+ // Verify that calling the receiver calls only one listener.
+ receiverCaptor.getValue().onReceive(mContext, new Intent());
+ verify(listener1).onUsersUpdate();
+ verify(listener2, never()).onUsersUpdate();
+ }
+
+ @Test
+ public void testGetInitialUserWithValidLastActiveUser() {
+ CarProperties.headless_system_user(true);
+ int lastActiveUserId = 12;
+
+ UserInfo otherUser1 = createUserInfoForId(lastActiveUserId - 2);
+ UserInfo otherUser2 = createUserInfoForId(lastActiveUserId - 1);
+ UserInfo otherUser3 = createUserInfoForId(lastActiveUserId);
+
+ setLastActiveUser(lastActiveUserId);
+ mockGetUsers(mSystemUser, otherUser1, otherUser2, otherUser3);
+
+ assertThat(mCarUserManagerHelper.getInitialUser()).isEqualTo(lastActiveUserId);
+ }
+
+ @Test
+ public void testGetInitialUserWithNonExistLastActiveUser() {
+ CarProperties.headless_system_user(true);
+ int lastActiveUserId = 12;
+
+ UserInfo otherUser1 = createUserInfoForId(lastActiveUserId - 2);
+ UserInfo otherUser2 = createUserInfoForId(lastActiveUserId - 1);
+
+ setLastActiveUser(lastActiveUserId);
+ mockGetUsers(mSystemUser, otherUser1, otherUser2);
+
+ assertThat(mCarUserManagerHelper.getInitialUser()).isEqualTo(lastActiveUserId - 2);
+ }
+
+ @Test
+ public void test_CreateNewOrFindExistingGuest_ReturnsExistingGuest() {
+ // Create two users and a guest user.
+ UserInfo user1 = createUserInfoForId(10);
+ UserInfo user2 = createUserInfoForId(12);
+ UserInfo user3 = new UserInfo(/* id= */ 13, /* name = */ "user13", UserInfo.FLAG_GUEST);
+
+ mockGetUsers(user1, user2, user3);
+ doReturn(null).when(mUserManager).createGuest(any(), any());
+
+ UserInfo guest = mCarUserManagerHelper.createNewOrFindExistingGuest(GUEST_USER_NAME);
+ assertThat(guest).isEqualTo(user3);
+ }
+
+ @Test
+ public void test_CreateNewOrFindExistingGuest_CreatesNewGuest_IfNoExisting() {
+ // Create two users.
+ UserInfo user1 = createUserInfoForId(10);
+ UserInfo user2 = createUserInfoForId(12);
+
+ mockGetUsers(user1, user2);
+
+ // Create a user for the "new guest" user.
+ UserInfo guestInfo = new UserInfo(/* id= */21, GUEST_USER_NAME, UserInfo.FLAG_GUEST);
+ doReturn(guestInfo).when(mUserManager).createGuest(mContext, GUEST_USER_NAME);
+
+ UserInfo guest = mCarUserManagerHelper.createNewOrFindExistingGuest(GUEST_USER_NAME);
+ verify(mUserManager).createGuest(mContext, GUEST_USER_NAME);
+ assertThat(guest).isEqualTo(guestInfo);
+ }
+
+ private UserInfo createUserInfoForId(int id) {
+ UserInfo userInfo = new UserInfo();
+ userInfo.id = id;
+ return userInfo;
+ }
+
+ private void mockGetUsers(UserInfo... users) {
+ List<UserInfo> testUsers = new ArrayList<>();
+ for (UserInfo user: users) {
+ testUsers.add(user);
+ }
+ doReturn(testUsers).when(mUserManager).getUsers(true);
+ }
+
+ private void setLastActiveUser(int userId) {
+ Settings.Global.putInt(InstrumentationRegistry.getTargetContext().getContentResolver(),
+ Settings.Global.LAST_ACTIVE_USER_ID, userId);
+ }
+}
diff --git a/tests/carservice_unit_test/src/com/android/car/BluetoothAutoConnectPolicyTest.java b/tests/carservice_unit_test/src/com/android/car/BluetoothAutoConnectPolicyTest.java
index a180886..8a27909 100644
--- a/tests/carservice_unit_test/src/com/android/car/BluetoothAutoConnectPolicyTest.java
+++ b/tests/carservice_unit_test/src/com/android/car/BluetoothAutoConnectPolicyTest.java
@@ -64,7 +64,10 @@
* and connection results can be injected (imitating results from the stack)
* 2. {@link CarCabinService} & {@link CarSensorService} - Fake vehicle events are injected to the
* policy's Broadcast Receiver.
+ *
+ * TODO(b/77825248): Fix the flakiness to enable the test class again
*/
+@Suppress
public class BluetoothAutoConnectPolicyTest extends AndroidTestCase {
private BluetoothDeviceConnectionPolicy mBluetoothDeviceConnectionPolicyTest;
private BluetoothAdapter mBluetoothAdapter;
diff --git a/tests/carservice_unit_test/src/com/android/car/CarConfigurationServiceTest.java b/tests/carservice_unit_test/src/com/android/car/CarConfigurationServiceTest.java
index 58b9c9a..9254a56 100644
--- a/tests/carservice_unit_test/src/com/android/car/CarConfigurationServiceTest.java
+++ b/tests/carservice_unit_test/src/com/android/car/CarConfigurationServiceTest.java
@@ -27,8 +27,9 @@
import static com.google.common.truth.Truth.assertThat;
import android.car.settings.SpeedBumpConfiguration;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
import org.json.JSONException;
import org.json.JSONObject;
diff --git a/tests/carservice_unit_test/src/com/android/car/CarInputServiceTest.java b/tests/carservice_unit_test/src/com/android/car/CarInputServiceTest.java
new file mode 100644
index 0000000..2db29db
--- /dev/null
+++ b/tests/carservice_unit_test/src/com/android/car/CarInputServiceTest.java
@@ -0,0 +1,360 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.isNull;
+import static org.mockito.Mockito.atLeast;
+import static org.mockito.Mockito.clearInvocations;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.ignoreStubs;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+import android.car.input.CarInputHandlingService.InputFilter;
+import android.car.input.ICarInputListener;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.os.RemoteException;
+import android.os.UserHandle;
+import android.service.voice.VoiceInteractionSession;
+import android.telecom.TelecomManager;
+import android.view.KeyEvent;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.car.hal.InputHalService;
+import com.android.internal.app.AssistUtils;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.Spy;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+
+import java.util.function.Supplier;
+
+@RunWith(AndroidJUnit4.class)
+public class CarInputServiceTest {
+ @Rule public MockitoRule rule = MockitoJUnit.rule();
+
+ @Mock InputHalService mInputHalService;
+ @Mock TelecomManager mTelecomManager;
+ @Mock AssistUtils mAssistUtils;
+ @Mock CarInputService.KeyEventListener mDefaultMainListener;
+ @Mock Supplier<String> mLastCallSupplier;
+
+ @Spy Context mContext = ApplicationProvider.getApplicationContext();
+ @Spy Handler mHandler = new Handler(Looper.getMainLooper());
+
+ private CarInputService mCarInputService;
+
+ @Before
+ public void setUp() {
+ mCarInputService = new CarInputService(mContext, mInputHalService, mHandler,
+ mTelecomManager, mAssistUtils, mDefaultMainListener, mLastCallSupplier,
+ /* customInputServiceComponent= */ null);
+
+ when(mInputHalService.isKeyInputSupported()).thenReturn(true);
+ mCarInputService.init();
+
+ // Delay Handler callbacks until flushHandler() is called.
+ doReturn(true).when(mHandler).sendMessageAtTime(any(), anyLong());
+ }
+
+ @Test
+ public void ordinaryEvents_onMainDisplay_routedToInputManager() {
+ KeyEvent event = send(Key.DOWN, KeyEvent.KEYCODE_ENTER, Display.MAIN);
+
+ verify(mDefaultMainListener).onKeyEvent(event);
+ }
+
+ @Test
+ public void ordinaryEvents_onInstrumentClusterDisplay_notRoutedToInputManager() {
+ send(Key.DOWN, KeyEvent.KEYCODE_ENTER, Display.INSTRUMENT_CLUSTER);
+
+ verify(mDefaultMainListener, never()).onKeyEvent(any());
+ }
+
+ @Test
+ public void ordinaryEvents_onInstrumentClusterDisplay_routedToListener() {
+ CarInputService.KeyEventListener listener = mock(CarInputService.KeyEventListener.class);
+ mCarInputService.setInstrumentClusterKeyListener(listener);
+
+ KeyEvent event = send(Key.DOWN, KeyEvent.KEYCODE_ENTER, Display.INSTRUMENT_CLUSTER);
+ verify(listener).onKeyEvent(event);
+ }
+
+ @Test
+ public void customEventHandler_capturesRegisteredEvents_ignoresUnregisteredEvents()
+ throws RemoteException {
+ KeyEvent event;
+ ICarInputListener listener = registerInputListener(
+ new InputFilter(KeyEvent.KEYCODE_ENTER, InputHalService.DISPLAY_MAIN),
+ new InputFilter(KeyEvent.KEYCODE_ENTER, InputHalService.DISPLAY_INSTRUMENT_CLUSTER),
+ new InputFilter(KeyEvent.KEYCODE_MENU, InputHalService.DISPLAY_MAIN));
+
+ CarInputService.KeyEventListener instrumentClusterListener =
+ mock(CarInputService.KeyEventListener.class);
+ mCarInputService.setInstrumentClusterKeyListener(instrumentClusterListener);
+
+ event = send(Key.DOWN, KeyEvent.KEYCODE_ENTER, Display.MAIN);
+ verify(listener).onKeyEvent(event, InputHalService.DISPLAY_MAIN);
+ verify(mDefaultMainListener, never()).onKeyEvent(any());
+
+ event = send(Key.DOWN, KeyEvent.KEYCODE_ENTER, Display.INSTRUMENT_CLUSTER);
+ verify(listener).onKeyEvent(event, InputHalService.DISPLAY_INSTRUMENT_CLUSTER);
+ verify(instrumentClusterListener, never()).onKeyEvent(any());
+
+ event = send(Key.DOWN, KeyEvent.KEYCODE_MENU, Display.MAIN);
+ verify(listener).onKeyEvent(event, InputHalService.DISPLAY_MAIN);
+ verify(mDefaultMainListener, never()).onKeyEvent(any());
+
+ event = send(Key.DOWN, KeyEvent.KEYCODE_MENU, Display.INSTRUMENT_CLUSTER);
+ verify(listener, never()).onKeyEvent(event, InputHalService.DISPLAY_INSTRUMENT_CLUSTER);
+ verify(instrumentClusterListener).onKeyEvent(event);
+ }
+
+ @Test
+ public void voiceKey_shortPress_withRegisteredListener_triggersListener() {
+ Runnable listener = mock(Runnable.class);
+ mCarInputService.setVoiceAssistantKeyListener(listener);
+
+ send(Key.DOWN, KeyEvent.KEYCODE_VOICE_ASSIST, Display.MAIN);
+ send(Key.UP, KeyEvent.KEYCODE_VOICE_ASSIST, Display.MAIN);
+
+ verify(listener).run();
+ }
+
+ @Test
+ public void voiceKey_longPress_withRegisteredListener_triggersListener() {
+ Runnable shortPressListener = mock(Runnable.class);
+ Runnable longPressListener = mock(Runnable.class);
+ mCarInputService.setVoiceAssistantKeyListener(shortPressListener);
+ mCarInputService.setLongVoiceAssistantKeyListener(longPressListener);
+
+ send(Key.DOWN, KeyEvent.KEYCODE_VOICE_ASSIST, Display.MAIN);
+ verify(shortPressListener, never()).run();
+ verify(longPressListener, never()).run();
+
+ // Simulate the long-press timer expiring.
+ flushHandler();
+ verify(longPressListener).run();
+
+ // Ensure that the short-press listener is *not* called.
+ send(Key.UP, KeyEvent.KEYCODE_VOICE_ASSIST, Display.MAIN);
+ flushHandler();
+ verify(shortPressListener, never()).run();
+ }
+
+ @Test
+ public void voiceKey_shortPress_withoutRegisteredListener_triggersAssistUtils() {
+ when(mAssistUtils.getAssistComponentForUser(anyInt()))
+ .thenReturn(new ComponentName("pkg", "cls"));
+
+ send(Key.DOWN, KeyEvent.KEYCODE_VOICE_ASSIST, Display.MAIN);
+ send(Key.UP, KeyEvent.KEYCODE_VOICE_ASSIST, Display.MAIN);
+
+ ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
+ verify(mAssistUtils).showSessionForActiveService(
+ bundleCaptor.capture(),
+ eq(VoiceInteractionSession.SHOW_SOURCE_PUSH_TO_TALK),
+ any(),
+ isNull());
+ assertThat(bundleCaptor.getValue().getBoolean(CarInputService.EXTRA_CAR_PUSH_TO_TALK))
+ .isTrue();
+ }
+
+ @Test
+ public void voiceKey_longPress_withoutRegisteredListener_triggersAssistUtils() {
+ when(mAssistUtils.getAssistComponentForUser(anyInt()))
+ .thenReturn(new ComponentName("pkg", "cls"));
+
+ send(Key.DOWN, KeyEvent.KEYCODE_VOICE_ASSIST, Display.MAIN);
+ flushHandler();
+
+ ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
+ verify(mAssistUtils).showSessionForActiveService(
+ bundleCaptor.capture(),
+ eq(VoiceInteractionSession.SHOW_SOURCE_PUSH_TO_TALK),
+ any(),
+ isNull());
+ assertThat(bundleCaptor.getValue().getBoolean(CarInputService.EXTRA_CAR_PUSH_TO_TALK))
+ .isTrue();
+
+ send(Key.UP, KeyEvent.KEYCODE_VOICE_ASSIST, Display.MAIN);
+ verifyNoMoreInteractions(ignoreStubs(mAssistUtils));
+ }
+
+ @Test
+ public void voiceKey_repeatedEvents_ignored() {
+ // Pressing a key starts the long-press timer.
+ send(Key.DOWN, KeyEvent.KEYCODE_VOICE_ASSIST, Display.MAIN);
+ verify(mHandler).sendMessageAtTime(any(), anyLong());
+ clearInvocations(mHandler);
+
+ // Repeated KEY_DOWN events don't reset the timer.
+ sendWithRepeat(Key.DOWN, KeyEvent.KEYCODE_VOICE_ASSIST, Display.MAIN, 1);
+ verify(mHandler, never()).sendMessageAtTime(any(), anyLong());
+ }
+
+ @Test
+ public void callKey_shortPress_launchesDialer() {
+ ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
+
+ doNothing().when(mContext).startActivityAsUser(any(), any(), any());
+
+ send(Key.DOWN, KeyEvent.KEYCODE_CALL, Display.MAIN);
+ send(Key.UP, KeyEvent.KEYCODE_CALL, Display.MAIN);
+
+ verify(mContext).startActivityAsUser(
+ intentCaptor.capture(), any(), eq(UserHandle.CURRENT_OR_SELF));
+ assertThat(intentCaptor.getValue().getAction()).isEqualTo(Intent.ACTION_DIAL);
+ }
+
+ @Test
+ public void callKey_shortPress_whenCallRinging_answersCall() {
+ when(mTelecomManager.isRinging()).thenReturn(true);
+
+ send(Key.DOWN, KeyEvent.KEYCODE_CALL, Display.MAIN);
+ send(Key.UP, KeyEvent.KEYCODE_CALL, Display.MAIN);
+
+ verify(mTelecomManager).acceptRingingCall();
+ // Ensure default handler does not run.
+ verify(mContext, never()).startActivityAsUser(any(), any(), any());
+ }
+
+ @Test
+ public void callKey_longPress_redialsLastCall() {
+ ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
+
+ when(mLastCallSupplier.get()).thenReturn("1234567890");
+ doNothing().when(mContext).startActivityAsUser(any(), any(), any());
+
+ send(Key.DOWN, KeyEvent.KEYCODE_CALL, Display.MAIN);
+ flushHandler();
+
+ verify(mContext).startActivityAsUser(
+ intentCaptor.capture(), any(), eq(UserHandle.CURRENT_OR_SELF));
+
+ Intent intent = intentCaptor.getValue();
+ assertThat(intent.getAction()).isEqualTo(Intent.ACTION_CALL);
+ assertThat(intent.getData()).isEqualTo(Uri.parse("tel:1234567890"));
+
+ clearInvocations(mContext);
+ send(Key.UP, KeyEvent.KEYCODE_CALL, Display.MAIN);
+ verify(mContext, never()).startActivityAsUser(any(), any(), any());
+ }
+
+ @Test
+ public void callKey_longPress_withNoLastCall_doesNothing() {
+ when(mLastCallSupplier.get()).thenReturn("");
+
+ send(Key.DOWN, KeyEvent.KEYCODE_CALL, Display.MAIN);
+ flushHandler();
+
+ verify(mContext, never()).startActivityAsUser(any(), any(), any());
+ }
+
+ @Test
+ public void callKey_longPress_whenCallRinging_answersCall() {
+ when(mTelecomManager.isRinging()).thenReturn(true);
+
+ send(Key.DOWN, KeyEvent.KEYCODE_CALL, Display.MAIN);
+ flushHandler();
+
+ verify(mTelecomManager).acceptRingingCall();
+
+ send(Key.UP, KeyEvent.KEYCODE_CALL, Display.MAIN);
+ // Ensure that default handler does not run, either after accepting ringing call,
+ // or as a result of key-up.
+ verify(mContext, never()).startActivityAsUser(any(), any(), any());
+ }
+
+ @Test
+ public void callKey_repeatedEvents_ignored() {
+ // Pressing a key starts the long-press timer.
+ send(Key.DOWN, KeyEvent.KEYCODE_CALL, Display.MAIN);
+ verify(mHandler).sendMessageAtTime(any(), anyLong());
+ clearInvocations(mHandler);
+
+ // Repeated KEY_DOWN events don't reset the timer.
+ sendWithRepeat(Key.DOWN, KeyEvent.KEYCODE_CALL, Display.MAIN, 1);
+ verify(mHandler, never()).sendMessageAtTime(any(), anyLong());
+ }
+ private enum Key {DOWN, UP}
+
+ private enum Display {MAIN, INSTRUMENT_CLUSTER}
+
+ private KeyEvent send(Key action, int keyCode, Display display) {
+ return sendWithRepeat(action, keyCode, display, 0);
+ }
+
+ private KeyEvent sendWithRepeat(Key action, int keyCode, Display display, int repeatCount) {
+ KeyEvent event = new KeyEvent(
+ /* downTime= */ 0L,
+ /* eventTime= */ 0L,
+ action == Key.DOWN ? KeyEvent.ACTION_DOWN : KeyEvent.ACTION_UP,
+ keyCode,
+ repeatCount);
+ mCarInputService.onKeyEvent(
+ event,
+ display == Display.MAIN
+ ? InputHalService.DISPLAY_MAIN
+ : InputHalService.DISPLAY_INSTRUMENT_CLUSTER);
+ return event;
+ }
+
+ private ICarInputListener registerInputListener(InputFilter... handledKeys) {
+ ICarInputListener listener = mock(ICarInputListener.class);
+ mCarInputService.mCarInputListener = listener;
+ mCarInputService.setHandledKeys(handledKeys);
+ return listener;
+ }
+
+ private void flushHandler() {
+ ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class);
+
+ verify(mHandler, atLeast(0)).sendMessageAtTime(messageCaptor.capture(), anyLong());
+
+ for (Message message : messageCaptor.getAllValues()) {
+ mHandler.dispatchMessage(message);
+ }
+
+ clearInvocations(mHandler);
+ }
+}
diff --git a/tests/carservice_unit_test/src/com/android/car/CarLocationServiceTest.java b/tests/carservice_unit_test/src/com/android/car/CarLocationServiceTest.java
index b071e99..dabb617 100644
--- a/tests/carservice_unit_test/src/com/android/car/CarLocationServiceTest.java
+++ b/tests/carservice_unit_test/src/com/android/car/CarLocationServiceTest.java
@@ -18,6 +18,7 @@
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertTrue;
+import static junit.framework.Assert.fail;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
@@ -26,12 +27,14 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.car.Car;
import android.car.hardware.CarPropertyValue;
import android.car.hardware.CarSensorEvent;
import android.car.hardware.CarSensorManager;
+import android.car.hardware.power.CarPowerManager.CarPowerStateListener;
import android.car.hardware.property.CarPropertyEvent;
import android.car.hardware.property.ICarPropertyEventListener;
-import android.car.user.CarUserManagerHelper;
+import android.car.userlib.CarUserManagerHelper;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
@@ -40,8 +43,9 @@
import android.location.LocationManager;
import android.os.RemoteException;
import android.os.SystemClock;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
import com.android.internal.util.ArrayUtils;
@@ -62,6 +66,7 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
+import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CountDownLatch;
import java.util.stream.Collectors;
@@ -74,7 +79,6 @@
* 1. {@link Context} provides files and a mocked {@link LocationManager}.
* 2. {@link LocationManager} provides dummy {@link Location}s.
* 3. {@link CarPropertyService} registers a listener for ignition state events.
- * 3. {@link CarPowerManagementService} registers a handler for power events.
* 4. {@link CarUserManagerHelper} tells whether or not the system user is headless.
*/
@RunWith(AndroidJUnit4.class)
@@ -84,10 +88,10 @@
private CarLocationService mCarLocationService;
private Context mContext;
private CountDownLatch mLatch;
+ private Car mCar;
@Mock private Context mMockContext;
@Mock private LocationManager mMockLocationManager;
@Mock private CarPropertyService mMockCarPropertyService;
- @Mock private CarPowerManagementService mMockCarPowerManagementService;
@Mock private CarUserManagerHelper mMockCarUserManagerHelper;
/**
@@ -98,8 +102,9 @@
MockitoAnnotations.initMocks(this);
mContext = InstrumentationRegistry.getTargetContext();
mLatch = new CountDownLatch(1);
- mCarLocationService = new CarLocationService(mMockContext, mMockCarPowerManagementService,
- mMockCarPropertyService, mMockCarUserManagerHelper) {
+ mCar = new Car(mContext, null, null);
+ mCarLocationService = new CarLocationService(
+ mMockContext, mMockCarPropertyService, mMockCarUserManagerHelper, mCar) {
@Override
void asyncOperation(Runnable operation) {
super.asyncOperation(() -> {
@@ -143,8 +148,6 @@
public void testRegistersToReceiveEvents() {
ArgumentCaptor<IntentFilter> argument = ArgumentCaptor.forClass(IntentFilter.class);
mCarLocationService.init();
- verify(mMockCarPowerManagementService).registerPowerEventProcessingHandler(
- mCarLocationService);
verify(mMockContext).registerReceiver(eq(mCarLocationService), argument.capture());
IntentFilter intentFilter = argument.getValue();
assertEquals(4, intentFilter.countActions());
@@ -203,7 +206,7 @@
}
/**
- * Test that the {@link CarLocationService} parses a location from a JSON seialization and then
+ * Test that the {@link CarLocationService} parses a location from a JSON serialization and then
* injects it into the {@link LocationManager} upon user switch if the system user is headless.
*/
@Test
@@ -366,10 +369,10 @@
/**
* Test that the {@link CarLocationService} stores the {@link LocationManager}'s last known
- * location upon prepare-shutdown events.
+ * location upon power state-changed SUSPEND events.
*/
@Test
- public void testStoresLocationUponPrepareShutdown()
+ public void testStoresLocationUponStateChanged()
throws IOException, RemoteException, InterruptedException {
long currentTime = System.currentTimeMillis();
long elapsedTime = SystemClock.elapsedRealtimeNanos();
@@ -385,9 +388,11 @@
.thenReturn(timbuktu);
when(mMockContext.getFileStreamPath("location_cache.json"))
.thenReturn(mContext.getFileStreamPath(TEST_FILENAME));
- mCarLocationService.onPrepareShutdown(true);
+ CompletableFuture<Void> future = new CompletableFuture<>();
+ mCarLocationService.onStateChanged(CarPowerStateListener.SHUTDOWN_PREPARE, future);
mLatch.await();
verify(mMockLocationManager).getLastKnownLocation(LocationManager.GPS_PROVIDER);
+ assertTrue(future.isDone());
String actualContents = readCacheFile();
long oneDayMs = 24 * 60 * 60 * 1000;
long granularCurrentTime = (currentTime / oneDayMs) * oneDayMs;
@@ -397,6 +402,23 @@
}
/**
+ * Test that the {@link CarLocationService} does not throw an exception on SUSPEND_EXIT events.
+ */
+ @Test
+ public void testDoesNotThrowExceptionUponStateChanged() {
+ try {
+ mCarLocationService.onStateChanged(CarPowerStateListener.SUSPEND_ENTER, null);
+ mCarLocationService.onStateChanged(CarPowerStateListener.SUSPEND_EXIT, null);
+ mCarLocationService.onStateChanged(CarPowerStateListener.SHUTDOWN_ENTER, null);
+ mCarLocationService.onStateChanged(CarPowerStateListener.ON, null);
+ mCarLocationService.onStateChanged(CarPowerStateListener.WAIT_FOR_VHAL, null);
+ mCarLocationService.onStateChanged(CarPowerStateListener.SHUTDOWN_CANCELLED, null);
+ } catch (Exception e) {
+ fail("onStateChanged should not throw an exception: " + e);
+ }
+ }
+
+ /**
* Test that the {@link CarLocationService} does not store null locations.
*/
@Test
diff --git a/tests/carservice_unit_test/src/com/android/car/CarPowerManagementServiceTest.java b/tests/carservice_unit_test/src/com/android/car/CarPowerManagementServiceTest.java
index cb2b4b8..70cec5d 100644
--- a/tests/carservice_unit_test/src/com/android/car/CarPowerManagementServiceTest.java
+++ b/tests/carservice_unit_test/src/com/android/car/CarPowerManagementServiceTest.java
@@ -16,12 +16,15 @@
package com.android.car;
+import android.car.hardware.power.CarPowerManager.CarPowerStateListener;
+import android.car.hardware.power.ICarPowerStateListener;
+import android.hardware.automotive.vehicle.V2_0.VehicleApPowerStateReq;
+import android.hardware.automotive.vehicle.V2_0.VehicleApPowerStateShutdownParam;
+import android.os.RemoteException;
import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.SmallTest;
import android.util.Log;
-import com.android.car.CarPowerManagementService.PowerEventProcessingHandler;
-import com.android.car.CarPowerManagementService.PowerServiceEventListener;
import com.android.car.hal.PowerHalService;
import com.android.car.hal.PowerHalService.PowerState;
import com.android.car.systeminterface.DisplayInterface;
@@ -34,6 +37,7 @@
import java.io.File;
import java.io.IOException;
import java.time.Duration;
+import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
@@ -47,12 +51,12 @@
private final MockSystemStateInterface mSystemStateInterface = new MockSystemStateInterface();
private final MockWakeLockInterface mWakeLockInterface = new MockWakeLockInterface();
private final MockIOInterface mIOInterface = new MockIOInterface();
+ private final PowerSignalListener mPowerSignalListener = new PowerSignalListener();
private MockedPowerHalService mPowerHal;
private SystemInterface mSystemInterface;
private CarPowerManagementService mService;
- private final PowerEventListener mPowerEventListener = new PowerEventListener();
- private PowerEventProcessingHandlerImpl mPowerEventProcessingHandler;
+ private CompletableFuture<Void> mFuture;
@Override
protected void setUp() throws Exception {
@@ -78,157 +82,155 @@
/**
* Helper method to create mService and initialize a test case
*/
- private void initTest(long processingTimeMs, int wakeupTime) throws Exception {
+ private void initTest(int wakeupTime) throws Exception {
mService = new CarPowerManagementService(getContext(), mPowerHal, mSystemInterface);
mService.init();
- mService.registerPowerEventListener(mPowerEventListener);
- mPowerEventProcessingHandler = new PowerEventProcessingHandlerImpl(processingTimeMs,
- wakeupTime);
- mService.registerPowerEventProcessingHandler(mPowerEventProcessingHandler);
- assertStateReceived(MockedPowerHalService.SET_BOOT_COMPLETE, 0);
- mPowerEventProcessingHandler.waitForPowerOn(WAIT_TIMEOUT_MS);
+ CarPowerManagementService.setShutdownPrepareTimeout(0);
+ mPowerHal.setSignalListener(mPowerSignalListener);
+ if (wakeupTime > 0) {
+ registerListenerToService();
+ mService.scheduleNextWakeupTime(wakeupTime);
+ }
+ assertStateReceived(MockedPowerHalService.SET_WAIT_FOR_VHAL, 0);
}
public void testBootComplete() throws Exception {
- initTest(0, 0);
- }
-
- public void testDisplayOff() throws Exception {
- initTest(0,0);
- // it will call display on for initial state
- assertTrue(mDisplayInterface.waitForDisplayStateChange(WAIT_TIMEOUT_MS));
- mPowerHal.setCurrentPowerState(new PowerState(PowerHalService.STATE_ON_DISP_OFF, 0));
- assertFalse(mDisplayInterface.waitForDisplayStateChange(WAIT_TIMEOUT_MS));
+ initTest(0);
}
public void testDisplayOn() throws Exception {
// start with display off
mSystemInterface.setDisplayState(false);
mDisplayInterface.waitForDisplayStateChange(WAIT_TIMEOUT_MS);
- initTest(0,0);
+ initTest(0);
+
+ // Transition to ON state
+ mPowerHal.setCurrentPowerState(new PowerState(VehicleApPowerStateReq.ON, 0));
// display should be turned on as it started with off state.
assertTrue(mDisplayInterface.waitForDisplayStateChange(WAIT_TIMEOUT_MS));
}
public void testShutdown() throws Exception {
- final int wakeupTime = 100;
- initTest(0, wakeupTime);
+ initTest(0);
+
+ // Transition to ON state
+ mPowerHal.setCurrentPowerState(new PowerState(VehicleApPowerStateReq.ON, 0));
assertTrue(mDisplayInterface.waitForDisplayStateChange(WAIT_TIMEOUT_MS));
- mPowerHal.setCurrentPowerState(new PowerState(PowerHalService.STATE_SHUTDOWN_PREPARE,
- PowerHalService.SHUTDOWN_IMMEDIATELY));
- assertStateReceived(PowerHalService.SET_SHUTDOWN_START, wakeupTime);
+ mPowerHal.setCurrentPowerState(
+ new PowerState(
+ VehicleApPowerStateReq.SHUTDOWN_PREPARE,
+ VehicleApPowerStateShutdownParam.SHUTDOWN_IMMEDIATELY));
+ // Since modules have to manually schedule next wakeup, we should not schedule next wakeup
+ // To test module behavior, we need to actually implement mock listener module.
+ assertStateReceived(PowerHalService.SET_SHUTDOWN_START, 0);
assertFalse(mDisplayInterface.waitForDisplayStateChange(WAIT_TIMEOUT_MS));
- mPowerEventListener.waitForShutdown(WAIT_TIMEOUT_MS);
+ mPowerSignalListener.waitForShutdown(WAIT_TIMEOUT_MS);
mSystemStateInterface.waitForShutdown(WAIT_TIMEOUT_MS);
}
public void testShutdownWithProcessing() throws Exception {
- final long processingTimeMs = 3000;
final int wakeupTime = 100;
- initTest(processingTimeMs, wakeupTime);
- assertTrue(mDisplayInterface.waitForDisplayStateChange(WAIT_TIMEOUT_MS));
-
- mPowerHal.setCurrentPowerState(new PowerState(PowerHalService.STATE_SHUTDOWN_PREPARE, 0));
- mPowerEventProcessingHandler.waitForPrepareShutdown(WAIT_TIMEOUT_MS);
- assertStateReceivedForShutdownOrSleepWithPostpone(PowerHalService.SET_SHUTDOWN_START,
- WAIT_TIMEOUT_LONG_MS, wakeupTime);
- assertFalse(mDisplayInterface.waitForDisplayStateChange(WAIT_TIMEOUT_MS));
- mPowerEventListener.waitForShutdown(WAIT_TIMEOUT_MS);
+ initTest(wakeupTime);
+ mPowerHal.setCurrentPowerState(new PowerState(VehicleApPowerStateReq.SHUTDOWN_PREPARE, 0));
+ assertStateReceivedForShutdownOrSleepWithPostpone(
+ PowerHalService.SET_SHUTDOWN_START, WAIT_TIMEOUT_LONG_MS, wakeupTime);
+ mPowerSignalListener.waitForShutdown(WAIT_TIMEOUT_MS);
+ // Send the finished signal
+ mPowerHal.setCurrentPowerState(new PowerState(VehicleApPowerStateReq.FINISHED, 0));
mSystemStateInterface.waitForShutdown(WAIT_TIMEOUT_MS);
}
public void testSleepEntryAndWakeup() throws Exception {
final int wakeupTime = 100;
- initTest(0, wakeupTime);
- assertTrue(mDisplayInterface.waitForDisplayStateChange(WAIT_TIMEOUT_MS));
-
- mPowerHal.setCurrentPowerState(new PowerState(PowerHalService.STATE_SHUTDOWN_PREPARE,
- PowerHalService.SHUTDOWN_CAN_SLEEP));
- assertFalse(mDisplayInterface.waitForDisplayStateChange(WAIT_TIMEOUT_MS));
- assertStateReceived(PowerHalService.SET_DEEP_SLEEP_ENTRY, 0);
- mPowerEventListener.waitForSleepEntry(WAIT_TIMEOUT_MS);
- int wakeupTimeReceived = mSystemStateInterface.waitForSleepEntryAndWakeup(WAIT_TIMEOUT_MS);
- assertEquals(wakeupTime, wakeupTimeReceived);
+ initTest(wakeupTime);
+ mPowerHal.setCurrentPowerState(new PowerState(VehicleApPowerStateReq.SHUTDOWN_PREPARE,
+ VehicleApPowerStateShutdownParam.CAN_SLEEP));
+ assertStateReceivedForShutdownOrSleepWithPostpone(
+ PowerHalService.SET_DEEP_SLEEP_ENTRY, WAIT_TIMEOUT_LONG_MS, wakeupTime);
+ mPowerSignalListener.waitForSleepEntry(WAIT_TIMEOUT_MS);
+ // Send the finished signal from HAL to CPMS
+ mPowerHal.setCurrentPowerState(new PowerState(VehicleApPowerStateReq.FINISHED, 0));
+ mSystemStateInterface.waitForSleepEntryAndWakeup(WAIT_TIMEOUT_MS);
assertStateReceived(PowerHalService.SET_DEEP_SLEEP_EXIT, 0);
- mPowerEventListener.waitForSleepExit(WAIT_TIMEOUT_MS);
-
- }
-
- public void testSleepEntryAndPowerOnWithProcessing() throws Exception {
- final long processingTimeMs = 3000;
- final int wakeupTime = 100;
- initTest(processingTimeMs, wakeupTime);
- assertTrue(mDisplayInterface.waitForDisplayStateChange(WAIT_TIMEOUT_MS));
-
- mPowerHal.setCurrentPowerState(new PowerState(PowerHalService.STATE_SHUTDOWN_PREPARE,
- PowerHalService.SHUTDOWN_CAN_SLEEP));
- mPowerEventProcessingHandler.waitForPrepareShutdown(WAIT_TIMEOUT_MS);
- assertFalse(mDisplayInterface.waitForDisplayStateChange(WAIT_TIMEOUT_MS));
- assertStateReceivedForShutdownOrSleepWithPostpone(PowerHalService.SET_DEEP_SLEEP_ENTRY,
- WAIT_TIMEOUT_LONG_MS, 0);
- mPowerEventListener.waitForSleepEntry(WAIT_TIMEOUT_MS);
- // set power on here without notification. PowerManager should check the state after sleep
- // exit
- mPowerHal.setCurrentPowerState(new PowerState(PowerHalService.STATE_ON_DISP_OFF, 0), false);
- int wakeupTimeReceived = mSystemStateInterface.waitForSleepEntryAndWakeup(WAIT_TIMEOUT_MS);
- assertEquals(wakeupTime, wakeupTimeReceived);
- assertStateReceived(PowerHalService.SET_DEEP_SLEEP_EXIT, 0);
- mPowerEventListener.waitForSleepExit(WAIT_TIMEOUT_MS);
- mPowerEventProcessingHandler.waitForPowerOn(WAIT_TIMEOUT_MS);
+ mPowerSignalListener.waitForSleepExit(WAIT_TIMEOUT_MS);
}
public void testSleepEntryAndWakeUpForProcessing() throws Exception {
- final long processingTimeMs = 3000;
final int wakeupTime = 100;
- initTest(processingTimeMs, wakeupTime);
+ initTest(wakeupTime);
+ mPowerHal.setCurrentPowerState(new PowerState(VehicleApPowerStateReq.ON, 0));
assertTrue(mDisplayInterface.waitForDisplayStateChange(WAIT_TIMEOUT_MS));
-
- mPowerHal.setCurrentPowerState(new PowerState(PowerHalService.STATE_SHUTDOWN_PREPARE,
- PowerHalService.SHUTDOWN_CAN_SLEEP));
- mPowerEventProcessingHandler.waitForPrepareShutdown(WAIT_TIMEOUT_MS);
+ mPowerHal.setCurrentPowerState(new PowerState(VehicleApPowerStateReq.SHUTDOWN_PREPARE,
+ VehicleApPowerStateShutdownParam.CAN_SLEEP));
assertFalse(mDisplayInterface.waitForDisplayStateChange(WAIT_TIMEOUT_MS));
- assertStateReceivedForShutdownOrSleepWithPostpone(PowerHalService.SET_DEEP_SLEEP_ENTRY,
- WAIT_TIMEOUT_LONG_MS, 0);
- mPowerEventListener.waitForSleepEntry(WAIT_TIMEOUT_MS);
+ assertStateReceivedForShutdownOrSleepWithPostpone(
+ PowerHalService.SET_DEEP_SLEEP_ENTRY, WAIT_TIMEOUT_LONG_MS, wakeupTime);
+ mPowerSignalListener.waitForSleepEntry(WAIT_TIMEOUT_MS);
+ // Send the finished signal
+ mPowerHal.setCurrentPowerState(new PowerState(VehicleApPowerStateReq.FINISHED, 0));
mSystemStateInterface.setWakeupCausedByTimer(true);
- int wakeupTimeReceived = mSystemStateInterface.waitForSleepEntryAndWakeup(WAIT_TIMEOUT_MS);
- assertEquals(wakeupTime, wakeupTimeReceived);
+ mSystemStateInterface.waitForSleepEntryAndWakeup(WAIT_TIMEOUT_MS);
assertStateReceived(PowerHalService.SET_DEEP_SLEEP_EXIT, 0);
- mPowerEventListener.waitForSleepExit(WAIT_TIMEOUT_MS);
+ mPowerSignalListener.waitForSleepExit(WAIT_TIMEOUT_MS);
+ mService.scheduleNextWakeupTime(wakeupTime);
// second processing after wakeup
assertFalse(mDisplayInterface.getDisplayState());
- mPowerEventProcessingHandler.waitForPrepareShutdown(WAIT_TIMEOUT_MS);
- assertStateReceivedForShutdownOrSleepWithPostpone(PowerHalService.SET_DEEP_SLEEP_ENTRY,
- WAIT_TIMEOUT_LONG_MS, 0);
- mPowerEventListener.waitForSleepEntry(WAIT_TIMEOUT_MS);
+ mPowerHal.setCurrentPowerState(new PowerState(VehicleApPowerStateReq.ON, 0));
+ assertTrue(mDisplayInterface.waitForDisplayStateChange(WAIT_TIMEOUT_MS));
+ mPowerHal.setCurrentPowerState(new PowerState(VehicleApPowerStateReq.SHUTDOWN_PREPARE,
+ VehicleApPowerStateShutdownParam.CAN_SLEEP));
+ assertStateReceivedForShutdownOrSleepWithPostpone(
+ PowerHalService.SET_DEEP_SLEEP_ENTRY, WAIT_TIMEOUT_LONG_MS, wakeupTime);
+ mPowerSignalListener.waitForSleepEntry(WAIT_TIMEOUT_MS);
+ mPowerHal.setCurrentPowerState(new PowerState(VehicleApPowerStateReq.FINISHED, 0));
// PM will shutdown system as it was not woken-up due to timer and it is not power on.
mSystemStateInterface.setWakeupCausedByTimer(false);
- wakeupTimeReceived = mSystemStateInterface.waitForSleepEntryAndWakeup(WAIT_TIMEOUT_MS);
- assertEquals(wakeupTime, wakeupTimeReceived);
+ mSystemStateInterface.waitForSleepEntryAndWakeup(WAIT_TIMEOUT_MS);
+ // Since we just woke up from shutdown, wake up time will be 0
assertStateReceived(PowerHalService.SET_DEEP_SLEEP_EXIT, 0);
- assertStateReceived(PowerHalService.SET_SHUTDOWN_START, wakeupTime);
- mPowerEventListener.waitForShutdown(WAIT_TIMEOUT_MS);
- mSystemStateInterface.waitForShutdown(WAIT_TIMEOUT_MS);
assertFalse(mDisplayInterface.getDisplayState());
}
+ private void registerListenerToService() {
+ ICarPowerStateListener listenerToService = new ICarPowerStateListener.Stub() {
+ @Override
+ public void onStateChanged(int state, int token) throws RemoteException {
+ if (state == CarPowerStateListener.SHUTDOWN_ENTER
+ || state == CarPowerStateListener.SUSPEND_ENTER) {
+ mFuture = new CompletableFuture<>();
+ mFuture.whenComplete((res, ex) -> {
+ if (ex == null) {
+ mService.finished(this, token);
+ }
+ });
+ } else {
+ mFuture = null;
+ }
+ }
+ };
+ mService.registerListener(listenerToService);
+ }
+
private void assertStateReceived(int expectedState, int expectedParam) throws Exception {
int[] state = mPowerHal.waitForSend(WAIT_TIMEOUT_MS);
assertEquals(expectedState, state[0]);
assertEquals(expectedParam, state[1]);
}
- private void assertStateReceivedForShutdownOrSleepWithPostpone(int lastState, long timeoutMs,
- int expectedParamForShutdown) throws Exception {
+ private void assertStateReceivedForShutdownOrSleepWithPostpone(
+ int lastState, long timeoutMs, int expectedParamForShutdownOrSuspend) throws Exception {
while (true) {
+ if (mFuture != null && !mFuture.isDone()) {
+ mFuture.complete(null);
+ }
int[] state = mPowerHal.waitForSend(timeoutMs);
if (state[0] == PowerHalService.SET_SHUTDOWN_POSTPONE) {
continue;
}
if (state[0] == lastState) {
- assertEquals(expectedParamForShutdown, state[1]);
+ assertEquals(expectedParamForShutdownOrSuspend, state[1]);
return;
}
}
@@ -268,13 +270,15 @@
@Override
public void stopDisplayStateMonitoring() {}
+
+ @Override
+ public void refreshDisplayBrightness() {}
}
private static final class MockSystemStateInterface implements SystemStateInterface {
private final Semaphore mShutdownWait = new Semaphore(0);
private final Semaphore mSleepWait = new Semaphore(0);
private final Semaphore mSleepExitWait = new Semaphore(0);
- private int mWakeupTime;
private boolean mWakeupCausedByTimer = false;
@Override
@@ -287,8 +291,7 @@
}
@Override
- public boolean enterDeepSleep(int wakeupTimeSec) {
- mWakeupTime = wakeupTimeSec;
+ public boolean enterDeepSleep() {
mSleepWait.release();
try {
mSleepExitWait.acquire();
@@ -297,10 +300,9 @@
return true;
}
- public int waitForSleepEntryAndWakeup(long timeoutMs) throws Exception {
+ public void waitForSleepEntryAndWakeup(long timeoutMs) throws Exception {
waitForSemaphore(mSleepWait, timeoutMs);
mSleepExitWait.release();
- return mWakeupTime;
}
@Override
@@ -361,77 +363,37 @@
}
}
- private class PowerEventListener implements PowerServiceEventListener {
+ private class PowerSignalListener implements MockedPowerHalService.SignalListener {
private final Semaphore mShutdownWait = new Semaphore(0);
private final Semaphore mSleepEntryWait = new Semaphore(0);
private final Semaphore mSleepExitWait = new Semaphore(0);
- @Override
- public void onShutdown() {
- mShutdownWait.release();
+ public void waitForSleepExit(long timeoutMs) throws Exception {
+ waitForSemaphore(mSleepExitWait, timeoutMs);
}
public void waitForShutdown(long timeoutMs) throws Exception {
waitForSemaphore(mShutdownWait, timeoutMs);
}
- @Override
- public void onSleepEntry() {
- mSleepEntryWait.release();
- }
-
public void waitForSleepEntry(long timeoutMs) throws Exception {
waitForSemaphore(mSleepEntryWait, timeoutMs);
}
@Override
- public void onSleepExit() {
- mSleepExitWait.release();
- }
-
- public void waitForSleepExit(long timeoutMs) throws Exception {
- waitForSemaphore(mSleepExitWait, timeoutMs);
- }
- }
-
- private class PowerEventProcessingHandlerImpl implements PowerEventProcessingHandler {
- private final long mProcessingTime;
- private final int mWakeupTime;
- private final Semaphore mPrepareShutdownWait = new Semaphore(0);
- private final Semaphore mOnPowerOnWait = new Semaphore(0);
- private boolean mShuttingDown;
- private boolean mDisplayOn;
-
- private PowerEventProcessingHandlerImpl(long processingTime, int wakeupTime) {
- mProcessingTime = processingTime;
- mWakeupTime = wakeupTime;
- }
-
- @Override
- public long onPrepareShutdown(boolean shuttingDown) {
- mShuttingDown = shuttingDown;
- mPrepareShutdownWait.release();
- return mProcessingTime;
- }
- public boolean waitForPrepareShutdown(long timeoutMs) throws Exception {
- waitForSemaphore(mPrepareShutdownWait, timeoutMs);
- return mShuttingDown;
- }
-
- @Override
- public void onPowerOn(boolean displayOn) {
- mDisplayOn = displayOn;
- mOnPowerOnWait.release();
- }
-
- public boolean waitForPowerOn(long timeoutMs) throws Exception {
- waitForSemaphore(mOnPowerOnWait, timeoutMs);
- return mDisplayOn;
- }
-
- @Override
- public int getWakeupTime() {
- return mWakeupTime;
+ public void sendingSignal(int signal) {
+ if (signal == PowerHalService.SET_SHUTDOWN_START) {
+ mShutdownWait.release();
+ return;
+ }
+ if (signal == PowerHalService.SET_DEEP_SLEEP_ENTRY) {
+ mSleepEntryWait.release();
+ return;
+ }
+ if (signal == PowerHalService.SET_DEEP_SLEEP_EXIT) {
+ mSleepExitWait.release();
+ return;
+ }
}
}
}
diff --git a/tests/carservice_unit_test/src/com/android/car/CarUserManagerHelperTest.java b/tests/carservice_unit_test/src/com/android/car/CarUserManagerHelperTest.java
deleted file mode 100644
index 5ec5f08..0000000
--- a/tests/carservice_unit_test/src/com/android/car/CarUserManagerHelperTest.java
+++ /dev/null
@@ -1,789 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.Matchers.any;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-
-import android.app.ActivityManager;
-import android.car.user.CarUserManagerHelper;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.pm.UserInfo;
-import android.graphics.Bitmap;
-import android.graphics.drawable.Drawable;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.SystemProperties;
-import android.os.UserHandle;
-import android.os.UserManager;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-import android.sysprop.CarProperties;
-
-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 java.util.ArrayList;
-import java.util.List;
-
-/**
- * This class contains unit tests for the {@link CarUserManagerHelper}.
- * It tests that {@link CarUserManagerHelper} does the right thing for user management flows.
- *
- * The following mocks are used:
- * 1. {@link Context} provides system services and resources.
- * 2. {@link UserManager} provides dummy users and user info.
- * 3. {@link ActivityManager} to verify user switch is invoked.
- * 4. {@link CarUserManagerHelper.OnUsersUpdateListener} registers a listener for user updates.
- */
-@RunWith(AndroidJUnit4.class)
-@SmallTest
-public class CarUserManagerHelperTest {
- @Mock
- private Context mContext;
- @Mock
- private UserManager mUserManager;
- @Mock
- private ActivityManager mActivityManager;
- @Mock
- private CarUserManagerHelper.OnUsersUpdateListener mTestListener;
-
- private CarUserManagerHelper mCarUserManagerHelper;
- private UserInfo mCurrentProcessUser;
- private UserInfo mSystemUser;
- private String mGuestUserName = "testGuest";
- private String mTestUserName = "testUser";
- private int mForegroundUserId;
- private UserInfo mForegroundUser;
-
- @Before
- public void setUpMocksAndVariables() throws Exception {
- MockitoAnnotations.initMocks(this);
- doReturn(mUserManager).when(mContext).getSystemService(Context.USER_SERVICE);
- doReturn(mActivityManager).when(mContext).getSystemService(Context.ACTIVITY_SERVICE);
- doReturn(InstrumentationRegistry.getTargetContext().getResources())
- .when(mContext).getResources();
- doReturn(mContext).when(mContext).getApplicationContext();
- mCarUserManagerHelper = new CarUserManagerHelper(mContext);
-
- mCurrentProcessUser = createUserInfoForId(UserHandle.myUserId());
- mSystemUser = createUserInfoForId(UserHandle.USER_SYSTEM);
- doReturn(mCurrentProcessUser).when(mUserManager).getUserInfo(UserHandle.myUserId());
-
- // Get the ID of the foreground user running this test.
- // We cannot mock the foreground user since getCurrentUser is static.
- // We cannot rely on foreground_id != system_id, they could be the same user.
- mForegroundUserId = ActivityManager.getCurrentUser();
- mForegroundUser = createUserInfoForId(mForegroundUserId);
-
- // Restore the non-headless state before every test. Individual tests can set the property
- // to true to test the headless system user scenario.
- CarProperties.headless_system_user(false);
- }
-
- @Test
- public void checkIsSystemUser() {
- UserInfo testInfo = new UserInfo();
-
- testInfo.id = UserHandle.USER_SYSTEM;
- assertThat(mCarUserManagerHelper.isSystemUser(testInfo)).isTrue();
-
- testInfo.id = UserHandle.USER_SYSTEM + 2; // Make it different than system id.
- assertThat(mCarUserManagerHelper.isSystemUser(testInfo)).isFalse();
- }
-
- // System user will not be returned when calling get all users.
- @Test
- public void testHeadlessUser0GetAllUsers_NotReturnSystemUser() {
- CarProperties.headless_system_user(true);
- UserInfo otherUser1 = createUserInfoForId(10);
- UserInfo otherUser2 = createUserInfoForId(11);
- UserInfo otherUser3 = createUserInfoForId(12);
-
- mockGetUsers(mSystemUser, otherUser1, otherUser2, otherUser3);
-
- assertThat(mCarUserManagerHelper.getAllUsers())
- .containsExactly(otherUser1, otherUser2, otherUser3);
- }
-
- @Test
- public void testGetAllSwitchableUsers() {
- // Create two non-foreground users.
- UserInfo user1 = createUserInfoForId(mForegroundUserId + 1);
- UserInfo user2 = createUserInfoForId(mForegroundUserId + 2);
-
- mockGetUsers(mForegroundUser, user1, user2);
-
- // Should return all non-foreground users.
- assertThat(mCarUserManagerHelper.getAllSwitchableUsers()).containsExactly(user1, user2);
- }
-
- @Test
- public void testGetAllPersistentUsers() {
- // Create two non-ephemeral users.
- UserInfo user1 = createUserInfoForId(mForegroundUserId);
- UserInfo user2 = createUserInfoForId(mForegroundUserId + 1);
- // Create two ephemeral users.
- UserInfo user3 = new UserInfo(
- /* id= */mForegroundUserId + 2, /* name = */ "user3", UserInfo.FLAG_EPHEMERAL);
- UserInfo user4 = new UserInfo(
- /* id= */mForegroundUserId + 3, /* name = */ "user4", UserInfo.FLAG_EPHEMERAL);
-
- mockGetUsers(user1, user2, user3, user4);
-
- // Should return all non-ephemeral users.
- assertThat(mCarUserManagerHelper.getAllPersistentUsers()).containsExactly(user1, user2);
- }
-
- @Test
- public void testGetAllAdminUsers() {
- // Create two admin, and two non-admin users.
- UserInfo user1 = new UserInfo(/* id= */ 10, /* name = */ "user10", UserInfo.FLAG_ADMIN);
- UserInfo user2 = createUserInfoForId(11);
- UserInfo user3 = createUserInfoForId(12);
- UserInfo user4 = new UserInfo(/* id= */ 13, /* name = */ "user13", UserInfo.FLAG_ADMIN);
-
- mockGetUsers(user1, user2, user3, user4);
-
- // Should return only admin users.
- assertThat(mCarUserManagerHelper.getAllAdminUsers()).containsExactly(user1, user4);
- }
-
- @Test
- public void testGetAllUsersExceptGuests() {
- // Create two users and a guest user.
- UserInfo user1 = createUserInfoForId(10);
- UserInfo user2 = createUserInfoForId(12);
- UserInfo user3 = new UserInfo(/* id= */ 13, /* name = */ "user13", UserInfo.FLAG_GUEST);
-
- mockGetUsers(user1, user2, user3);
-
- // Should not return guests.
- assertThat(mCarUserManagerHelper.getAllUsersExceptGuests())
- .containsExactly(user1, user2);
- }
-
- @Test
- public void testUserCanBeRemoved() {
- UserInfo testInfo = new UserInfo();
-
- // System user cannot be removed.
- testInfo.id = UserHandle.USER_SYSTEM;
- assertThat(mCarUserManagerHelper.canUserBeRemoved(testInfo)).isFalse();
-
- testInfo.id = UserHandle.USER_SYSTEM + 2; // Make it different than system id.
- assertThat(mCarUserManagerHelper.canUserBeRemoved(testInfo)).isTrue();
- }
-
- @Test
- public void testCurrentProcessCanAddUsers() {
- doReturn(false).when(mUserManager)
- .hasUserRestriction(UserManager.DISALLOW_ADD_USER);
- assertThat(mCarUserManagerHelper.canCurrentProcessAddUsers()).isTrue();
-
- doReturn(true).when(mUserManager)
- .hasUserRestriction(UserManager.DISALLOW_ADD_USER);
- assertThat(mCarUserManagerHelper.canCurrentProcessAddUsers()).isFalse();
- }
-
- @Test
- public void testCurrentProcessCanRemoveUsers() {
- doReturn(false).when(mUserManager)
- .hasUserRestriction(UserManager.DISALLOW_REMOVE_USER);
- assertThat(mCarUserManagerHelper.canCurrentProcessRemoveUsers()).isTrue();
-
- doReturn(true).when(mUserManager)
- .hasUserRestriction(UserManager.DISALLOW_REMOVE_USER);
- assertThat(mCarUserManagerHelper.canCurrentProcessRemoveUsers()).isFalse();
- }
-
- @Test
- public void testCurrentProcessCanSwitchUsers() {
- doReturn(false).when(mUserManager)
- .hasUserRestriction(UserManager.DISALLOW_USER_SWITCH);
- assertThat(mCarUserManagerHelper.canCurrentProcessSwitchUsers()).isTrue();
-
- doReturn(true).when(mUserManager)
- .hasUserRestriction(UserManager.DISALLOW_USER_SWITCH);
- assertThat(mCarUserManagerHelper.canCurrentProcessSwitchUsers()).isFalse();
- }
-
- @Test
- public void testCurrentGuestProcessCannotModifyAccounts() {
- assertThat(mCarUserManagerHelper.canCurrentProcessModifyAccounts()).isTrue();
-
- doReturn(true).when(mUserManager).isGuestUser();
-
- assertThat(mCarUserManagerHelper.canCurrentProcessModifyAccounts()).isFalse();
- }
-
- @Test
- public void testCurrentDemoProcessCannotModifyAccounts() {
- assertThat(mCarUserManagerHelper.canCurrentProcessModifyAccounts()).isTrue();
-
- doReturn(true).when(mUserManager).isDemoUser();
-
- assertThat(mCarUserManagerHelper.canCurrentProcessModifyAccounts()).isFalse();
- }
-
- @Test
- public void testCurrentDisallowModifyAccountsProcessIsEnforced() {
- assertThat(mCarUserManagerHelper.canCurrentProcessModifyAccounts()).isTrue();
-
- doReturn(true).when(mUserManager)
- .hasUserRestriction(UserManager.DISALLOW_MODIFY_ACCOUNTS);
-
- assertThat(mCarUserManagerHelper.canCurrentProcessModifyAccounts()).isFalse();
- }
-
- @Test
- public void testGetMaxSupportedUsers() {
- SystemProperties.set("fw.max_users", "11");
-
- assertThat(mCarUserManagerHelper.getMaxSupportedUsers()).isEqualTo(11);
-
- // In headless user 0 model, we want to exclude the system user.
- CarProperties.headless_system_user(true);
- assertThat(mCarUserManagerHelper.getMaxSupportedUsers()).isEqualTo(10);
- }
-
- @Test
- public void testGetMaxSupportedRealUsers() {
- SystemProperties.set("fw.max_users", "7");
-
- // Create three managed profiles, and two normal users.
- UserInfo user1 = createUserInfoForId(10);
- UserInfo user2 =
- new UserInfo(/* id= */ 11, /* name = */ "user11", UserInfo.FLAG_MANAGED_PROFILE);
- UserInfo user3 =
- new UserInfo(/* id= */ 12, /* name = */ "user12", UserInfo.FLAG_MANAGED_PROFILE);
- UserInfo user4 = createUserInfoForId(13);
- UserInfo user5 =
- new UserInfo(/* id= */ 14, /* name = */ "user14", UserInfo.FLAG_MANAGED_PROFILE);
-
- mockGetUsers(user1, user2, user3, user4, user5);
-
- // Max users - # managed profiles.
- assertThat(mCarUserManagerHelper.getMaxSupportedRealUsers()).isEqualTo(4);
- }
-
- @Test
- public void testIsUserLimitReached() {
- UserInfo user1 = createUserInfoForId(10);
- UserInfo user2 =
- new UserInfo(/* id= */ 11, /* name = */ "user11", UserInfo.FLAG_MANAGED_PROFILE);
- UserInfo user3 =
- new UserInfo(/* id= */ 12, /* name = */ "user12", UserInfo.FLAG_MANAGED_PROFILE);
- UserInfo user4 = createUserInfoForId(13);
-
- mockGetUsers(user1, user2, user3, user4);
-
- SystemProperties.set("fw.max_users", "5");
- assertThat(mCarUserManagerHelper.isUserLimitReached()).isFalse();
-
- SystemProperties.set("fw.max_users", "4");
- assertThat(mCarUserManagerHelper.isUserLimitReached()).isTrue();
- }
-
- @Test
- public void testHeadlessSystemUser_IsUserLimitReached() {
- CarProperties.headless_system_user(true);
- UserInfo user1 = createUserInfoForId(10);
- UserInfo user2 =
- new UserInfo(/* id= */ 11, /* name = */ "user11", UserInfo.FLAG_MANAGED_PROFILE);
- UserInfo user3 =
- new UserInfo(/* id= */ 12, /* name = */ "user12", UserInfo.FLAG_MANAGED_PROFILE);
- UserInfo user4 = createUserInfoForId(13);
-
- mockGetUsers(mSystemUser, user1, user2, user3, user4);
-
- SystemProperties.set("fw.max_users", "6");
- assertThat(mCarUserManagerHelper.isUserLimitReached()).isFalse();
-
- SystemProperties.set("fw.max_users", "5");
- assertThat(mCarUserManagerHelper.isUserLimitReached()).isTrue();
- }
-
- @Test
- public void testIsUserLimitReachedIgnoresGuests() {
- SystemProperties.set("fw.max_users", "5");
-
- UserInfo user1 = createUserInfoForId(10);
- UserInfo user2 =
- new UserInfo(/* id= */ 11, /* name = */ "user11", UserInfo.FLAG_MANAGED_PROFILE);
- UserInfo user3 =
- new UserInfo(/* id= */ 12, /* name = */ "user12", UserInfo.FLAG_MANAGED_PROFILE);
- UserInfo user4 = createUserInfoForId(13);
- UserInfo user5 = new UserInfo(/* id= */ 14, /* name = */ "user14", UserInfo.FLAG_GUEST);
- UserInfo user6 = createUserInfoForId(15);
-
- mockGetUsers(user1, user2, user3, user4);
- assertThat(mCarUserManagerHelper.isUserLimitReached()).isFalse();
-
- // Add guest user. Verify it doesn't affect the limit.
- mockGetUsers(user1, user2, user3, user4, user5);
- assertThat(mCarUserManagerHelper.isUserLimitReached()).isFalse();
-
- // Add normal user. Limit is reached
- mockGetUsers(user1, user2, user3, user4, user5, user6);
- assertThat(mCarUserManagerHelper.isUserLimitReached()).isTrue();
- }
-
- @Test
- public void testCreateNewAdminUser() {
- // Make sure current user is admin, since only admins can create other admins.
- doReturn(true).when(mUserManager).isAdminUser();
-
- // Verify createUser on UserManager gets called.
- mCarUserManagerHelper.createNewAdminUser(mTestUserName);
- verify(mUserManager).createUser(mTestUserName, UserInfo.FLAG_ADMIN);
-
- doReturn(null).when(mUserManager).createUser(mTestUserName, UserInfo.FLAG_ADMIN);
- assertThat(mCarUserManagerHelper.createNewAdminUser(mTestUserName)).isNull();
-
- UserInfo newUser = new UserInfo();
- newUser.name = mTestUserName;
- doReturn(newUser).when(mUserManager).createUser(mTestUserName, UserInfo.FLAG_ADMIN);
- assertThat(mCarUserManagerHelper.createNewAdminUser(mTestUserName)).isEqualTo(newUser);
- }
-
- @Test
- public void testAdminsCanCreateAdmins() {
- String newAdminName = "Test new admin";
- UserInfo expectedAdmin = new UserInfo();
- expectedAdmin.name = newAdminName;
- doReturn(expectedAdmin).when(mUserManager).createUser(newAdminName, UserInfo.FLAG_ADMIN);
-
- // Admins can create other admins.
- doReturn(true).when(mUserManager).isAdminUser();
- UserInfo actualAdmin = mCarUserManagerHelper.createNewAdminUser(newAdminName);
- assertThat(actualAdmin).isEqualTo(expectedAdmin);
- }
-
- @Test
- public void testNonAdminsCanNotCreateAdmins() {
- String newAdminName = "Test new admin";
- UserInfo expectedAdmin = new UserInfo();
- expectedAdmin.name = newAdminName;
- doReturn(expectedAdmin).when(mUserManager).createUser(newAdminName, UserInfo.FLAG_ADMIN);
-
- // Test that non-admins cannot create new admins.
- doReturn(false).when(mUserManager).isAdminUser(); // Current user non-admin.
- assertThat(mCarUserManagerHelper.createNewAdminUser(newAdminName)).isNull();
- }
-
- @Test
- public void testSystemUserCanCreateAdmins() {
- String newAdminName = "Test new admin";
- UserInfo expectedAdmin = new UserInfo();
- expectedAdmin.name = newAdminName;
-
- doReturn(expectedAdmin).when(mUserManager).createUser(newAdminName, UserInfo.FLAG_ADMIN);
-
- // System user can create admins.
- doReturn(true).when(mUserManager).isSystemUser();
- UserInfo actualAdmin = mCarUserManagerHelper.createNewAdminUser(newAdminName);
- assertThat(actualAdmin).isEqualTo(expectedAdmin);
- }
-
- @Test
- public void testCreateNewNonAdminUser() {
- // Verify createUser on UserManager gets called.
- mCarUserManagerHelper.createNewNonAdminUser(mTestUserName);
- verify(mUserManager).createUser(mTestUserName, 0);
-
- doReturn(null).when(mUserManager).createUser(mTestUserName, 0);
- assertThat(mCarUserManagerHelper.createNewNonAdminUser(mTestUserName)).isNull();
-
- UserInfo newUser = new UserInfo();
- newUser.name = mTestUserName;
- doReturn(newUser).when(mUserManager).createUser(mTestUserName, 0);
- assertThat(mCarUserManagerHelper.createNewNonAdminUser(mTestUserName)).isEqualTo(newUser);
- }
-
- @Test
- public void testCannotRemoveSystemUser() {
- assertThat(mCarUserManagerHelper.removeUser(mSystemUser, mGuestUserName)).isFalse();
- }
-
- @Test
- public void testAdminsCanRemoveOtherUsers() {
- int idToRemove = mCurrentProcessUser.id + 2;
- UserInfo userToRemove = createUserInfoForId(idToRemove);
-
- doReturn(true).when(mUserManager).removeUser(idToRemove);
-
- // If Admin is removing non-current, non-system user, simply calls removeUser.
- doReturn(true).when(mUserManager).isAdminUser();
- assertThat(mCarUserManagerHelper.removeUser(userToRemove, mGuestUserName)).isTrue();
- verify(mUserManager).removeUser(idToRemove);
- }
-
- @Test
- public void testNonAdminsCanNotRemoveOtherUsers() {
- UserInfo otherUser = createUserInfoForId(mCurrentProcessUser.id + 2);
-
- // Make current user non-admin.
- doReturn(false).when(mUserManager).isAdminUser();
-
- // Mock so that removeUser always pretends it's successful.
- doReturn(true).when(mUserManager).removeUser(anyInt());
-
- // If Non-Admin is trying to remove someone other than themselves, they should fail.
- assertThat(mCarUserManagerHelper.removeUser(otherUser, mGuestUserName)).isFalse();
- verify(mUserManager, never()).removeUser(otherUser.id);
- }
-
- @Test
- public void testRemoveLastActiveUser() {
- // Cannot remove system user.
- assertThat(mCarUserManagerHelper.removeUser(mSystemUser, mGuestUserName)).isFalse();
-
- UserInfo adminInfo = new UserInfo(/* id= */10, "admin", UserInfo.FLAG_ADMIN);
- mockGetUsers(adminInfo);
-
- assertThat(mCarUserManagerHelper.removeUser(adminInfo, mGuestUserName))
- .isEqualTo(false);
- }
-
- @Test
- public void testSwitchToGuest() {
- mCarUserManagerHelper.startNewGuestSession(mGuestUserName);
- verify(mUserManager).createGuest(mContext, mGuestUserName);
-
- UserInfo guestInfo = new UserInfo(/* id= */21, mGuestUserName, UserInfo.FLAG_GUEST);
- doReturn(guestInfo).when(mUserManager).createGuest(mContext, mGuestUserName);
- mCarUserManagerHelper.startNewGuestSession(mGuestUserName);
- verify(mActivityManager).switchUser(21);
- }
-
- @Test
- public void testGetUserIcon() {
- mCarUserManagerHelper.getUserIcon(mCurrentProcessUser);
- verify(mUserManager).getUserIcon(mCurrentProcessUser.id);
- }
-
- @Test
- public void testScaleUserIcon() {
- Bitmap fakeIcon = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
- Drawable scaledIcon = mCarUserManagerHelper.scaleUserIcon(fakeIcon, 300);
- assertThat(scaledIcon.getIntrinsicWidth()).isEqualTo(300);
- assertThat(scaledIcon.getIntrinsicHeight()).isEqualTo(300);
- }
-
- @Test
- public void testSetUserName() {
- UserInfo testInfo = createUserInfoForId(mCurrentProcessUser.id + 3);
- String newName = "New Test Name";
- mCarUserManagerHelper.setUserName(testInfo, newName);
- verify(mUserManager).setUserName(mCurrentProcessUser.id + 3, newName);
- }
-
- @Test
- public void testIsCurrentProcessSystemUser() {
- doReturn(true).when(mUserManager).isAdminUser();
- assertThat(mCarUserManagerHelper.isCurrentProcessAdminUser()).isTrue();
-
- doReturn(false).when(mUserManager).isAdminUser();
- assertThat(mCarUserManagerHelper.isCurrentProcessAdminUser()).isFalse();
- }
-
- @Test
- public void testAssignAdminPrivileges() {
- int userId = 30;
- UserInfo testInfo = createUserInfoForId(userId);
-
- // Test that non-admins cannot assign admin privileges.
- doReturn(false).when(mUserManager).isAdminUser(); // Current user non-admin.
- mCarUserManagerHelper.assignAdminPrivileges(testInfo);
- verify(mUserManager, never()).setUserAdmin(userId);
-
- // Admins can assign admin privileges.
- doReturn(true).when(mUserManager).isAdminUser();
- mCarUserManagerHelper.assignAdminPrivileges(testInfo);
- verify(mUserManager).setUserAdmin(userId);
- }
-
- @Test
- public void testSetUserRestriction() {
- int userId = 20;
- UserInfo testInfo = createUserInfoForId(userId);
-
- mCarUserManagerHelper.setUserRestriction(
- testInfo, UserManager.DISALLOW_ADD_USER, /* enable= */ true);
- verify(mUserManager).setUserRestriction(
- UserManager.DISALLOW_ADD_USER, true, UserHandle.of(userId));
-
- mCarUserManagerHelper.setUserRestriction(
- testInfo, UserManager.DISALLOW_REMOVE_USER, /* enable= */ false);
- verify(mUserManager).setUserRestriction(
- UserManager.DISALLOW_REMOVE_USER, false, UserHandle.of(userId));
- }
-
- @Test
- public void testDefaultNonAdminRestrictions() {
- String testUserName = "Test User";
- int userId = 20;
- UserInfo newNonAdmin = createUserInfoForId(userId);
-
- doReturn(newNonAdmin).when(mUserManager).createUser(testUserName, /* flags= */ 0);
-
- mCarUserManagerHelper.createNewNonAdminUser(testUserName);
-
- verify(mUserManager).setUserRestriction(
- UserManager.DISALLOW_FACTORY_RESET, /* enable= */ true, UserHandle.of(userId));
- verify(mUserManager).setUserRestriction(
- UserManager.DISALLOW_SMS, /* enable= */ false, UserHandle.of(userId));
- verify(mUserManager).setUserRestriction(
- UserManager.DISALLOW_OUTGOING_CALLS, /* enable= */ false, UserHandle.of(userId));
- }
-
- @Test
- public void testDefaultGuestRestrictions() {
- int guestRestrictionsExpectedCount = 7;
-
- ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
- mCarUserManagerHelper.initDefaultGuestRestrictions();
-
- verify(mUserManager).setDefaultGuestRestrictions(bundleCaptor.capture());
- Bundle guestRestrictions = bundleCaptor.getValue();
-
- assertThat(guestRestrictions.keySet()).hasSize(guestRestrictionsExpectedCount);
- assertThat(guestRestrictions.getBoolean(UserManager.DISALLOW_FACTORY_RESET)).isTrue();
- assertThat(guestRestrictions.getBoolean(UserManager.DISALLOW_REMOVE_USER)).isTrue();
- assertThat(guestRestrictions.getBoolean(UserManager.DISALLOW_MODIFY_ACCOUNTS)).isTrue();
- assertThat(guestRestrictions.getBoolean(UserManager.DISALLOW_OUTGOING_CALLS)).isTrue();
- assertThat(guestRestrictions.getBoolean(UserManager.DISALLOW_SMS)).isTrue();
- assertThat(guestRestrictions.getBoolean(UserManager.DISALLOW_INSTALL_APPS)).isTrue();
- assertThat(guestRestrictions.getBoolean(UserManager.DISALLOW_UNINSTALL_APPS)).isTrue();
- }
-
- @Test
- public void testAssigningAdminPrivilegesRemovesNonAdminRestrictions() {
- int testUserId = 30;
- boolean restrictionEnabled = false;
- UserInfo testInfo = createUserInfoForId(testUserId);
-
- // Only admins can assign privileges.
- doReturn(true).when(mUserManager).isAdminUser();
-
- mCarUserManagerHelper.assignAdminPrivileges(testInfo);
-
- verify(mUserManager).setUserRestriction(
- UserManager.DISALLOW_FACTORY_RESET, restrictionEnabled, UserHandle.of(testUserId));
- }
-
- @Test
- public void testRegisterUserChangeReceiver() {
- mCarUserManagerHelper.registerOnUsersUpdateListener(mTestListener);
-
- ArgumentCaptor<BroadcastReceiver> receiverCaptor =
- ArgumentCaptor.forClass(BroadcastReceiver.class);
- ArgumentCaptor<UserHandle> handleCaptor = ArgumentCaptor.forClass(UserHandle.class);
- ArgumentCaptor<IntentFilter> filterCaptor = ArgumentCaptor.forClass(IntentFilter.class);
- ArgumentCaptor<String> permissionCaptor = ArgumentCaptor.forClass(String.class);
- ArgumentCaptor<Handler> handlerCaptor = ArgumentCaptor.forClass(Handler.class);
-
- verify(mContext).registerReceiverAsUser(
- receiverCaptor.capture(),
- handleCaptor.capture(),
- filterCaptor.capture(),
- permissionCaptor.capture(),
- handlerCaptor.capture());
-
- // Verify we're listening to Intents from ALL users.
- assertThat(handleCaptor.getValue()).isEqualTo(UserHandle.ALL);
-
- // Verify the presence of each intent in the filter.
- // Verify the exact number of filters. Every time a new intent is added, this test should
- // get updated.
- assertThat(filterCaptor.getValue().countActions()).isEqualTo(6);
- assertThat(filterCaptor.getValue().hasAction(Intent.ACTION_USER_REMOVED)).isTrue();
- assertThat(filterCaptor.getValue().hasAction(Intent.ACTION_USER_ADDED)).isTrue();
- assertThat(filterCaptor.getValue().hasAction(Intent.ACTION_USER_INFO_CHANGED)).isTrue();
- assertThat(filterCaptor.getValue().hasAction(Intent.ACTION_USER_SWITCHED)).isTrue();
- assertThat(filterCaptor.getValue().hasAction(Intent.ACTION_USER_STOPPED)).isTrue();
- assertThat(filterCaptor.getValue().hasAction(Intent.ACTION_USER_UNLOCKED)).isTrue();
-
- // Verify that calling the receiver calls the listener.
- receiverCaptor.getValue().onReceive(mContext, new Intent());
- verify(mTestListener).onUsersUpdate();
-
- assertThat(permissionCaptor.getValue()).isNull();
- assertThat(handlerCaptor.getValue()).isNull();
-
- // Unregister the receiver.
- mCarUserManagerHelper.unregisterOnUsersUpdateListener(mTestListener);
- verify(mContext).unregisterReceiver(receiverCaptor.getValue());
- }
-
- @Test
- public void testMultipleRegistrationsOfSameListener() {
- CarUserManagerHelper.OnUsersUpdateListener listener =
- Mockito.mock(CarUserManagerHelper.OnUsersUpdateListener.class);
-
- ArgumentCaptor<BroadcastReceiver> receiverCaptor =
- ArgumentCaptor.forClass(BroadcastReceiver.class);
-
- mCarUserManagerHelper.registerOnUsersUpdateListener(listener);
- mCarUserManagerHelper.registerOnUsersUpdateListener(listener);
- // Even for multiple registrations of the same listener, broadcast receiver registered once.
- verify(mContext, times(1))
- .registerReceiverAsUser(receiverCaptor.capture(), any(), any(), any(), any());
-
- // Verify that calling the receiver calls the listener.
- receiverCaptor.getValue().onReceive(mContext, new Intent());
- verify(listener).onUsersUpdate();
-
- // Verify that a single removal unregisters the listener.
- mCarUserManagerHelper.unregisterOnUsersUpdateListener(listener);
- verify(mContext).unregisterReceiver(any());
- }
-
- @Test
- public void testMultipleUnregistrationsOfTheSameListener() {
- CarUserManagerHelper.OnUsersUpdateListener listener =
- Mockito.mock(CarUserManagerHelper.OnUsersUpdateListener.class);
- mCarUserManagerHelper.registerOnUsersUpdateListener(listener);
-
- // Verify that a multiple unregistrations cause only one unregister for broadcast receiver.
- mCarUserManagerHelper.unregisterOnUsersUpdateListener(listener);
- mCarUserManagerHelper.unregisterOnUsersUpdateListener(listener);
- mCarUserManagerHelper.unregisterOnUsersUpdateListener(listener);
- verify(mContext, times(1)).unregisterReceiver(any());
- }
-
- @Test
- public void testUnregisterReceiverCalledAfterAllListenersUnregister() {
- CarUserManagerHelper.OnUsersUpdateListener listener1 =
- Mockito.mock(CarUserManagerHelper.OnUsersUpdateListener.class);
- CarUserManagerHelper.OnUsersUpdateListener listener2 =
- Mockito.mock(CarUserManagerHelper.OnUsersUpdateListener.class);
-
- mCarUserManagerHelper.registerOnUsersUpdateListener(listener1);
- mCarUserManagerHelper.registerOnUsersUpdateListener(listener2);
-
- mCarUserManagerHelper.unregisterOnUsersUpdateListener(listener1);
- verify(mContext, never()).unregisterReceiver(any());
-
- mCarUserManagerHelper.unregisterOnUsersUpdateListener(listener2);
- verify(mContext, times(1)).unregisterReceiver(any());
- }
-
- @Test
- public void testRegisteringMultipleListeners() {
- CarUserManagerHelper.OnUsersUpdateListener listener1 =
- Mockito.mock(CarUserManagerHelper.OnUsersUpdateListener.class);
- CarUserManagerHelper.OnUsersUpdateListener listener2 =
- Mockito.mock(CarUserManagerHelper.OnUsersUpdateListener.class);
- ArgumentCaptor<BroadcastReceiver> receiverCaptor =
- ArgumentCaptor.forClass(BroadcastReceiver.class);
-
- mCarUserManagerHelper.registerOnUsersUpdateListener(listener1);
- mCarUserManagerHelper.registerOnUsersUpdateListener(listener2);
- verify(mContext, times(1))
- .registerReceiverAsUser(receiverCaptor.capture(), any(), any(), any(), any());
-
- // Verify that calling the receiver calls both listeners.
- receiverCaptor.getValue().onReceive(mContext, new Intent());
- verify(listener1).onUsersUpdate();
- verify(listener2).onUsersUpdate();
- }
-
- @Test
- public void testUnregisteringListenerStopsUpdatesForListener() {
- CarUserManagerHelper.OnUsersUpdateListener listener1 =
- Mockito.mock(CarUserManagerHelper.OnUsersUpdateListener.class);
- CarUserManagerHelper.OnUsersUpdateListener listener2 =
- Mockito.mock(CarUserManagerHelper.OnUsersUpdateListener.class);
- ArgumentCaptor<BroadcastReceiver> receiverCaptor =
- ArgumentCaptor.forClass(BroadcastReceiver.class);
-
- mCarUserManagerHelper.registerOnUsersUpdateListener(listener1);
- mCarUserManagerHelper.registerOnUsersUpdateListener(listener2);
- verify(mContext, times(1))
- .registerReceiverAsUser(receiverCaptor.capture(), any(), any(), any(), any());
-
- // Unregister listener2
- mCarUserManagerHelper.unregisterOnUsersUpdateListener(listener2);
-
- // Verify that calling the receiver calls only one listener.
- receiverCaptor.getValue().onReceive(mContext, new Intent());
- verify(listener1).onUsersUpdate();
- verify(listener2, never()).onUsersUpdate();
- }
-
- @Test
- public void testGetInitialUserWithValidLastActiveUser() {
- CarProperties.headless_system_user(true);
- int lastActiveUserId = 12;
-
- UserInfo otherUser1 = createUserInfoForId(lastActiveUserId - 2);
- UserInfo otherUser2 = createUserInfoForId(lastActiveUserId - 1);
- UserInfo otherUser3 = createUserInfoForId(lastActiveUserId);
-
- mCarUserManagerHelper.setLastActiveUser(
- lastActiveUserId, /* skipGlobalSettings= */ true);
- mockGetUsers(mSystemUser, otherUser1, otherUser2, otherUser3);
-
- assertThat(mCarUserManagerHelper.getInitialUser()).isEqualTo(lastActiveUserId);
- }
-
- @Test
- public void testGetInitialUserWithNonExistLastActiveUser() {
- CarProperties.headless_system_user(true);
- int lastActiveUserId = 12;
-
- UserInfo otherUser1 = createUserInfoForId(lastActiveUserId - 2);
- UserInfo otherUser2 = createUserInfoForId(lastActiveUserId - 1);
-
- mCarUserManagerHelper.setLastActiveUser(
- lastActiveUserId, /* skipGlobalSettings= */ true);
- mockGetUsers(mSystemUser, otherUser1, otherUser2);
-
- assertThat(mCarUserManagerHelper.getInitialUser()).isEqualTo(lastActiveUserId - 2);
- }
-
- private UserInfo createUserInfoForId(int id) {
- UserInfo userInfo = new UserInfo();
- userInfo.id = id;
- return userInfo;
- }
-
- private void mockGetUsers(UserInfo... users) {
- List<UserInfo> testUsers = new ArrayList<>();
- for (UserInfo user: users) {
- testUsers.add(user);
- }
- doReturn(testUsers).when(mUserManager).getUsers(true);
- }
-}
diff --git a/tests/carservice_unit_test/src/com/android/car/MockedPowerHalService.java b/tests/carservice_unit_test/src/com/android/car/MockedPowerHalService.java
index 405c014..7359a03 100644
--- a/tests/carservice_unit_test/src/com/android/car/MockedPowerHalService.java
+++ b/tests/carservice_unit_test/src/com/android/car/MockedPowerHalService.java
@@ -15,6 +15,7 @@
*/
package com.android.car;
+import android.hardware.automotive.vehicle.V2_0.VehicleApPowerStateReq;
import android.util.Log;
import com.android.car.hal.PowerHalService;
@@ -28,11 +29,16 @@
private final boolean mIsPowerStateSupported;
private final boolean mIsDeepSleepAllowed;
private final boolean mIsTimedWakeupAllowed;
- private PowerState mCurrentPowerState = new PowerState(PowerHalService.STATE_ON_FULL, 0);
+ private PowerState mCurrentPowerState = new PowerState(VehicleApPowerStateReq.ON, 0);
private PowerEventListener mListener;
+ private SignalListener mSignalListener;
private final LinkedList<int[]> mSentStates = new LinkedList<>();
+ interface SignalListener {
+ void sendingSignal(int signal);
+ }
+
public MockedPowerHalService(boolean isPowerStateSupported, boolean isDeepSleepAllowed,
boolean isTimedWakeupAllowed) {
super(new VehicleHal(null, null, null, null));
@@ -46,16 +52,21 @@
mListener = listener;
}
- @Override
- public void sendBootComplete() {
- Log.i(TAG, "sendBootComplete");
- doSendState(SET_BOOT_COMPLETE, 0);
+ // For testing purposes only
+ public synchronized void setSignalListener(SignalListener listener) {
+ mSignalListener = listener;
}
@Override
- public void sendSleepEntry() {
+ public void sendWaitForVhal() {
+ Log.i(TAG, "sendBootComplete");
+ doSendState(SET_WAIT_FOR_VHAL, 0);
+ }
+
+ @Override
+ public void sendSleepEntry(int wakeupTimeSec) {
Log.i(TAG, "sendSleepEntry");
- doSendState(SET_DEEP_SLEEP_ENTRY, 0);
+ doSendState(SET_DEEP_SLEEP_ENTRY, wakeupTimeSec);
}
@Override
@@ -76,18 +87,6 @@
doSendState(SET_SHUTDOWN_START, wakeupTimeSec);
}
- @Override
- public void sendDisplayOn() {
- Log.i(TAG, "sendDisplayOn");
- doSendState(SET_DISPLAY_ON, 0);
- }
-
- @Override
- public void sendDisplayOff() {
- Log.i(TAG, "sendDisplayOff");
- doSendState(SET_DISPLAY_OFF, 0);
- }
-
public synchronized int[] waitForSend(long timeoutMs) throws Exception {
if (mSentStates.size() == 0) {
wait(timeoutMs);
@@ -96,6 +95,13 @@
}
private synchronized void doSendState(int state, int param) {
+ SignalListener listener;
+ synchronized (this) {
+ listener = mSignalListener;
+ }
+ if (listener != null) {
+ listener.sendingSignal(state);
+ }
int[] toSend = new int[] {state, param};
mSentStates.addLast(toSend);
notifyAll();
diff --git a/tests/carservice_unit_test/src/com/android/car/hal/InputHalServiceTest.java b/tests/carservice_unit_test/src/com/android/car/hal/InputHalServiceTest.java
new file mode 100644
index 0000000..32f8e1d
--- /dev/null
+++ b/tests/carservice_unit_test/src/com/android/car/hal/InputHalServiceTest.java
@@ -0,0 +1,240 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.hal;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.hardware.automotive.vehicle.V2_0.VehicleHwKeyInputAction;
+import android.hardware.automotive.vehicle.V2_0.VehiclePropConfig;
+import android.hardware.automotive.vehicle.V2_0.VehiclePropValue;
+import android.hardware.automotive.vehicle.V2_0.VehicleProperty;
+import android.view.KeyEvent;
+
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.car.vehiclehal.test.VehiclePropConfigBuilder;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+import java.util.function.LongSupplier;
+
+@RunWith(AndroidJUnit4.class)
+public class InputHalServiceTest {
+ @Rule public MockitoRule mMockitoRule = MockitoJUnit.rule();
+
+ @Mock VehicleHal mVehicleHal;
+ @Mock InputHalService.InputListener mInputListener;
+ @Mock LongSupplier mUptimeSupplier;
+
+ private static final VehiclePropConfig HW_KEY_INPUT_CONFIG =
+ VehiclePropConfigBuilder.newBuilder(VehicleProperty.HW_KEY_INPUT).build();
+ private static final int DISPLAY = 42;
+
+ private enum Key { DOWN, UP }
+
+ private InputHalService mInputHalService;
+
+ @Before
+ public void setUp() {
+ when(mUptimeSupplier.getAsLong()).thenReturn(0L);
+ mInputHalService = new InputHalService(mVehicleHal, mUptimeSupplier);
+ mInputHalService.init();
+ }
+
+ @After
+ public void tearDown() {
+ mInputHalService.release();
+ mInputHalService = null;
+ }
+
+ @Test
+ public void ignoresSetListener_beforeKeyInputSupported() {
+ assertThat(mInputHalService.isKeyInputSupported()).isFalse();
+
+ mInputHalService.setInputListener(mInputListener);
+
+ mInputHalService.handleHalEvents(
+ ImmutableList.of(makeKeyPropValue(Key.DOWN, KeyEvent.KEYCODE_ENTER)));
+ verify(mInputListener, never()).onKeyEvent(any(), anyInt());
+ }
+
+ @Test
+ public void takesKeyInputProperty() {
+ Set<VehiclePropConfig> offeredProps = ImmutableSet.of(
+ VehiclePropConfigBuilder.newBuilder(VehicleProperty.ABS_ACTIVE).build(),
+ HW_KEY_INPUT_CONFIG,
+ VehiclePropConfigBuilder.newBuilder(VehicleProperty.CURRENT_GEAR).build());
+
+ Collection<VehiclePropConfig> takenProps =
+ mInputHalService.takeSupportedProperties(offeredProps);
+
+ assertThat(takenProps).containsExactly(HW_KEY_INPUT_CONFIG);
+ assertThat(mInputHalService.isKeyInputSupported()).isTrue();
+ }
+
+ @Test
+ public void dispatchesInputEvent_single_toListener() {
+ subscribeListener();
+
+ KeyEvent event = dispatchSingleEvent(Key.DOWN, KeyEvent.KEYCODE_ENTER);
+ assertThat(event.getAction()).isEqualTo(KeyEvent.ACTION_DOWN);
+ assertThat(event.getKeyCode()).isEqualTo(KeyEvent.KEYCODE_ENTER);
+ }
+
+ @Test
+ public void dispatchesInputEvent_multiple_toListener() {
+ subscribeListener();
+
+ // KeyEvents get recycled, so we can't just use ArgumentCaptor#getAllValues here.
+ // We need to make a copy of the information we need at the time of the call.
+ List<KeyEvent> events = new ArrayList<>();
+ doAnswer(inv -> {
+ KeyEvent event = inv.getArgument(0);
+ events.add(event.copy());
+ return null;
+ }).when(mInputListener).onKeyEvent(any(), eq(DISPLAY));
+
+ mInputHalService.handleHalEvents(
+ ImmutableList.of(
+ makeKeyPropValue(Key.DOWN, KeyEvent.KEYCODE_ENTER),
+ makeKeyPropValue(Key.DOWN, KeyEvent.KEYCODE_MENU)));
+
+ assertThat(events.get(0).getKeyCode()).isEqualTo(KeyEvent.KEYCODE_ENTER);
+ assertThat(events.get(1).getKeyCode()).isEqualTo(KeyEvent.KEYCODE_MENU);
+
+ events.forEach(KeyEvent::recycle);
+ }
+
+ @Test
+ public void handlesRepeatedKeys() {
+ subscribeListener();
+
+ KeyEvent event = dispatchSingleEvent(Key.DOWN, KeyEvent.KEYCODE_ENTER);
+ assertThat(event.getAction()).isEqualTo(KeyEvent.ACTION_DOWN);
+ assertThat(event.getKeyCode()).isEqualTo(KeyEvent.KEYCODE_ENTER);
+ assertThat(event.getEventTime()).isEqualTo(0L);
+ assertThat(event.getDownTime()).isEqualTo(0L);
+ assertThat(event.getRepeatCount()).isEqualTo(0);
+
+ when(mUptimeSupplier.getAsLong()).thenReturn(5L);
+ event = dispatchSingleEvent(Key.DOWN, KeyEvent.KEYCODE_ENTER);
+
+ assertThat(event.getAction()).isEqualTo(KeyEvent.ACTION_DOWN);
+ assertThat(event.getKeyCode()).isEqualTo(KeyEvent.KEYCODE_ENTER);
+ assertThat(event.getEventTime()).isEqualTo(5L);
+ assertThat(event.getDownTime()).isEqualTo(5L);
+ assertThat(event.getRepeatCount()).isEqualTo(1);
+
+ when(mUptimeSupplier.getAsLong()).thenReturn(10L);
+ event = dispatchSingleEvent(Key.UP, KeyEvent.KEYCODE_ENTER);
+
+ assertThat(event.getAction()).isEqualTo(KeyEvent.ACTION_UP);
+ assertThat(event.getKeyCode()).isEqualTo(KeyEvent.KEYCODE_ENTER);
+ assertThat(event.getEventTime()).isEqualTo(10L);
+ assertThat(event.getDownTime()).isEqualTo(5L);
+ assertThat(event.getRepeatCount()).isEqualTo(0);
+
+ when(mUptimeSupplier.getAsLong()).thenReturn(15L);
+ event = dispatchSingleEvent(Key.DOWN, KeyEvent.KEYCODE_ENTER);
+
+ assertThat(event.getAction()).isEqualTo(KeyEvent.ACTION_DOWN);
+ assertThat(event.getKeyCode()).isEqualTo(KeyEvent.KEYCODE_ENTER);
+ assertThat(event.getEventTime()).isEqualTo(15L);
+ assertThat(event.getDownTime()).isEqualTo(15L);
+ assertThat(event.getRepeatCount()).isEqualTo(0);
+ }
+
+ @Test
+ public void handlesKeyUp_withoutKeyDown() {
+ subscribeListener();
+
+ when(mUptimeSupplier.getAsLong()).thenReturn(42L);
+ KeyEvent event = dispatchSingleEvent(Key.UP, KeyEvent.KEYCODE_ENTER);
+
+ assertThat(event.getEventTime()).isEqualTo(42L);
+ assertThat(event.getDownTime()).isEqualTo(42L);
+ assertThat(event.getRepeatCount()).isEqualTo(0);
+ }
+
+ @Test
+ public void separateKeyDownEvents_areIndependent() {
+ subscribeListener();
+
+ when(mUptimeSupplier.getAsLong()).thenReturn(27L);
+ dispatchSingleEvent(Key.DOWN, KeyEvent.KEYCODE_ENTER);
+
+ when(mUptimeSupplier.getAsLong()).thenReturn(42L);
+ KeyEvent event = dispatchSingleEvent(Key.DOWN, KeyEvent.KEYCODE_MENU);
+
+ assertThat(event.getKeyCode()).isEqualTo(KeyEvent.KEYCODE_MENU);
+ assertThat(event.getDownTime()).isEqualTo(42L);
+ assertThat(event.getRepeatCount()).isEqualTo(0);
+ }
+
+ private void subscribeListener() {
+ mInputHalService.takeSupportedProperties(ImmutableSet.of(HW_KEY_INPUT_CONFIG));
+ assertThat(mInputHalService.isKeyInputSupported()).isTrue();
+
+ mInputHalService.setInputListener(mInputListener);
+ verify(mVehicleHal).subscribeProperty(mInputHalService, VehicleProperty.HW_KEY_INPUT);
+ }
+
+
+ private VehiclePropValue makeKeyPropValue(Key action, int code) {
+ VehiclePropValue v = new VehiclePropValue();
+ v.prop = VehicleProperty.HW_KEY_INPUT;
+ v.value.int32Values.add(
+ (action == Key.DOWN
+ ? VehicleHwKeyInputAction.ACTION_DOWN
+ : VehicleHwKeyInputAction.ACTION_UP));
+ v.value.int32Values.add(code);
+ v.value.int32Values.add(DISPLAY);
+ return v;
+ }
+
+ private KeyEvent dispatchSingleEvent(Key action, int code) {
+ ArgumentCaptor<KeyEvent> captor = ArgumentCaptor.forClass(KeyEvent.class);
+ reset(mInputListener);
+ mInputHalService.handleHalEvents(ImmutableList.of(makeKeyPropValue(action, code)));
+ verify(mInputListener).onKeyEvent(captor.capture(), eq(DISPLAY));
+ reset(mInputListener);
+ return captor.getValue();
+ }
+}
diff --git a/tests/carservice_unit_test/src/com/android/car/hal/VmsHalServiceTest.java b/tests/carservice_unit_test/src/com/android/car/hal/VmsHalServiceTest.java
new file mode 100644
index 0000000..3e9eb56
--- /dev/null
+++ b/tests/carservice_unit_test/src/com/android/car/hal/VmsHalServiceTest.java
@@ -0,0 +1,167 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.hal;
+
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.verify;
+
+import android.car.vms.VmsAssociatedLayer;
+import android.car.vms.VmsAvailableLayers;
+import android.car.vms.VmsLayer;
+import android.car.vms.VmsLayerDependency;
+import android.car.vms.VmsLayersOffering;
+import android.os.Binder;
+import android.os.IBinder;
+
+import androidx.test.runner.AndroidJUnit4;
+
+import com.google.android.collect.Sets;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+
+@RunWith(AndroidJUnit4.class)
+public class VmsHalServiceTest {
+ @Rule public MockitoRule mockito = MockitoJUnit.rule();
+ @Mock private VehicleHal mMockVehicleHal;
+ @Mock private VmsHalService.VmsHalSubscriberListener mMockHalSusbcriber;
+ private IBinder mToken;
+ private VmsHalService mHalService;
+
+ @Before
+ public void setUp() throws Exception {
+ mToken = new Binder();
+ mHalService = new VmsHalService(mMockVehicleHal);
+ mHalService.addSubscriberListener(mMockHalSusbcriber);
+ }
+
+ @Test
+ public void testSetPublisherLayersOffering() {
+ VmsLayer layer = new VmsLayer(1, 2, 3);
+ VmsLayersOffering offering = new VmsLayersOffering(
+ Sets.newHashSet(new VmsLayerDependency(layer)), 12345);
+ mHalService.setPublisherLayersOffering(mToken, offering);
+
+ VmsAssociatedLayer associatedLayer = new VmsAssociatedLayer(layer, Sets.newHashSet(12345));
+ verify(mMockHalSusbcriber).onLayersAvaiabilityChange(eq(new VmsAvailableLayers(
+ Sets.newHashSet(associatedLayer),
+ 1)));
+ }
+
+ @Test
+ public void testSetPublisherLayersOffering_Repeated() {
+ VmsLayer layer = new VmsLayer(1, 2, 3);
+ VmsLayersOffering offering = new VmsLayersOffering(
+ Sets.newHashSet(new VmsLayerDependency(layer)), 12345);
+ mHalService.setPublisherLayersOffering(mToken, offering);
+ mHalService.setPublisherLayersOffering(mToken, offering);
+
+ VmsAssociatedLayer associatedLayer = new VmsAssociatedLayer(layer, Sets.newHashSet(12345));
+ verify(mMockHalSusbcriber).onLayersAvaiabilityChange(eq(new VmsAvailableLayers(
+ Sets.newHashSet(associatedLayer),
+ 1)));
+ verify(mMockHalSusbcriber).onLayersAvaiabilityChange(eq(new VmsAvailableLayers(
+ Sets.newHashSet(associatedLayer),
+ 2)));
+
+ }
+
+ @Test
+ public void testSetPublisherLayersOffering_MultiplePublishers() {
+ VmsLayer layer = new VmsLayer(1, 2, 3);
+ VmsLayersOffering offering = new VmsLayersOffering(
+ Sets.newHashSet(new VmsLayerDependency(layer)), 12345);
+ VmsLayersOffering offering2 = new VmsLayersOffering(
+ Sets.newHashSet(new VmsLayerDependency(layer)), 54321);
+ mHalService.setPublisherLayersOffering(mToken, offering);
+ mHalService.setPublisherLayersOffering(new Binder(), offering2);
+
+ verify(mMockHalSusbcriber).onLayersAvaiabilityChange(eq(new VmsAvailableLayers(
+ Sets.newHashSet(new VmsAssociatedLayer(layer, Sets.newHashSet(12345))),
+ 1)));
+ verify(mMockHalSusbcriber).onLayersAvaiabilityChange(eq(new VmsAvailableLayers(
+ Sets.newHashSet(new VmsAssociatedLayer(layer, Sets.newHashSet(12345, 54321))),
+ 2)));
+
+ }
+
+ @Test
+ public void testSetPublisherLayersOffering_MultiplePublishers_SharedToken() {
+ VmsLayer layer = new VmsLayer(1, 2, 3);
+ VmsLayersOffering offering = new VmsLayersOffering(
+ Sets.newHashSet(new VmsLayerDependency(layer)), 12345);
+ VmsLayersOffering offering2 = new VmsLayersOffering(
+ Sets.newHashSet(new VmsLayerDependency(layer)), 54321);
+ mHalService.setPublisherLayersOffering(mToken, offering);
+ mHalService.setPublisherLayersOffering(mToken, offering2);
+
+ verify(mMockHalSusbcriber).onLayersAvaiabilityChange(eq(new VmsAvailableLayers(
+ Sets.newHashSet(new VmsAssociatedLayer(layer, Sets.newHashSet(12345))),
+ 1)));
+ verify(mMockHalSusbcriber).onLayersAvaiabilityChange(eq(new VmsAvailableLayers(
+ Sets.newHashSet(new VmsAssociatedLayer(layer, Sets.newHashSet(12345, 54321))),
+ 2)));
+ }
+
+ @Test
+ public void testSetPublisherLayersOffering_MultiplePublishers_MultipleLayers() {
+ VmsLayer layer = new VmsLayer(1, 2, 3);
+ VmsLayer layer2 = new VmsLayer(2, 2, 3);
+ VmsLayersOffering offering = new VmsLayersOffering(
+ Sets.newHashSet(new VmsLayerDependency(layer)), 12345);
+ VmsLayersOffering offering2 = new VmsLayersOffering(
+ Sets.newHashSet(new VmsLayerDependency(layer2)), 54321);
+ mHalService.setPublisherLayersOffering(mToken, offering);
+ mHalService.setPublisherLayersOffering(new Binder(), offering2);
+
+ verify(mMockHalSusbcriber).onLayersAvaiabilityChange(eq(new VmsAvailableLayers(
+ Sets.newHashSet(new VmsAssociatedLayer(layer, Sets.newHashSet(12345))),
+ 1)));
+ verify(mMockHalSusbcriber).onLayersAvaiabilityChange(eq(new VmsAvailableLayers(
+ Sets.newHashSet(
+ new VmsAssociatedLayer(layer, Sets.newHashSet(12345)),
+ new VmsAssociatedLayer(layer2, Sets.newHashSet(54321))),
+ 2)));
+
+ }
+
+ @Test
+ public void testSetPublisherLayersOffering_MultiplePublishers_MultipleLayers_SharedToken() {
+ VmsLayer layer = new VmsLayer(1, 2, 3);
+ VmsLayer layer2 = new VmsLayer(2, 2, 3);
+ VmsLayersOffering offering = new VmsLayersOffering(
+ Sets.newHashSet(new VmsLayerDependency(layer)), 12345);
+ VmsLayersOffering offering2 = new VmsLayersOffering(
+ Sets.newHashSet(new VmsLayerDependency(layer2)), 54321);
+ mHalService.setPublisherLayersOffering(mToken, offering);
+ mHalService.setPublisherLayersOffering(mToken, offering2);
+
+ verify(mMockHalSusbcriber).onLayersAvaiabilityChange(eq(new VmsAvailableLayers(
+ Sets.newHashSet(new VmsAssociatedLayer(layer, Sets.newHashSet(12345))),
+ 1)));
+ verify(mMockHalSusbcriber).onLayersAvaiabilityChange(eq(new VmsAvailableLayers(
+ Sets.newHashSet(
+ new VmsAssociatedLayer(layer, Sets.newHashSet(12345)),
+ new VmsAssociatedLayer(layer2, Sets.newHashSet(54321))),
+ 2)));
+
+ }
+}
diff --git a/tests/carservice_unit_test/src/com/android/car/storagemonitoring/IoStatsTrackerTest.java b/tests/carservice_unit_test/src/com/android/car/storagemonitoring/IoStatsTrackerTest.java
index c7b2a0b..46a85db 100644
--- a/tests/carservice_unit_test/src/com/android/car/storagemonitoring/IoStatsTrackerTest.java
+++ b/tests/carservice_unit_test/src/com/android/car/storagemonitoring/IoStatsTrackerTest.java
@@ -20,14 +20,17 @@
import android.car.storagemonitoring.UidIoRecord;
import android.test.suitebuilder.annotation.MediumTest;
import android.util.SparseArray;
+
import com.android.car.procfsinspector.ProcessInfo;
import com.android.car.systeminterface.SystemStateInterface;
+
+import junit.framework.TestCase;
+
import java.time.Duration;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
-import junit.framework.TestCase;
/**
* Tests IoStatsTracker functionality.
@@ -299,7 +302,7 @@
}
@Override
- public boolean enterDeepSleep(int wakeupTimeSec) {
+ public boolean enterDeepSleep() {
return true;
}
diff --git a/tests/carservice_unit_test/src/com/android/car/user/CarUserServiceTest.java b/tests/carservice_unit_test/src/com/android/car/user/CarUserServiceTest.java
index 48d447b..1947c8f 100644
--- a/tests/carservice_unit_test/src/com/android/car/user/CarUserServiceTest.java
+++ b/tests/carservice_unit_test/src/com/android/car/user/CarUserServiceTest.java
@@ -20,9 +20,11 @@
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
-import android.car.user.CarUserManagerHelper;
+import android.car.settings.CarSettings;
+import android.car.userlib.CarUserManagerHelper;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
@@ -30,7 +32,10 @@
import android.location.LocationManager;
import android.os.UserHandle;
import android.os.UserManager;
-import android.support.test.runner.AndroidJUnit4;
+import android.provider.Settings;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
@@ -40,7 +45,6 @@
import org.mockito.MockitoAnnotations;
import java.util.ArrayList;
-import java.util.List;
/**
* This class contains unit tests for the {@link CarUserService}.
@@ -67,6 +71,8 @@
@Mock
private CarUserManagerHelper mCarUserManagerHelper;
+ private static final String DEFAULT_ADMIN_NAME = "defaultName";
+
/**
* Initialize all of the objects with the @Mock annotation.
*/
@@ -75,10 +81,15 @@
MockitoAnnotations.initMocks(this);
doReturn(mApplicationContext).when(mMockContext).getApplicationContext();
doReturn(mLocationManager).when(mMockContext).getSystemService(Context.LOCATION_SERVICE);
+ doReturn(InstrumentationRegistry.getTargetContext().getContentResolver())
+ .when(mMockContext).getContentResolver();
mCarUserService = new CarUserService(mMockContext, mCarUserManagerHelper);
doReturn(new ArrayList<>()).when(mCarUserManagerHelper).getAllUsers();
+
+ // Restore default value at the beginning of each test.
+ putSettingsInt(CarSettings.Global.DEFAULT_USER_RESTRICTIONS_SET, 0);
}
/**
@@ -107,20 +118,6 @@
}
/**
- * Test that the {@link CarUserService} starts up a secondary admin user upon first run.
- */
- @Test
- public void testStartsSecondaryAdminUserOnFirstRun() {
- UserInfo admin = mockAdmin(/* adminId= */ 10);
-
- mCarUserService.onReceive(mMockContext,
- new Intent(Intent.ACTION_LOCKED_BOOT_COMPLETED));
-
- verify(mCarUserManagerHelper).createNewAdminUser(CarUserService.OWNER_NAME);
- verify(mCarUserManagerHelper).switchToUser(admin);
- }
-
- /**
* Test that the {@link CarUserService} disable modify account for user 0 upon first run.
*/
@Test
@@ -130,8 +127,6 @@
systemUser.id = UserHandle.USER_SYSTEM;
doReturn(systemUser).when(mCarUserManagerHelper).getSystemUserInfo();
- mockAdmin(10);
-
mCarUserService.onReceive(mMockContext,
new Intent(Intent.ACTION_LOCKED_BOOT_COMPLETED));
@@ -140,12 +135,29 @@
}
/**
+ * Test that the {@link CarUserService} does not set restrictions on user 0 if they have already
+ * been set.
+ */
+ @Test
+ public void testDoesNotSetSystemUserRestrictions_IfRestrictionsAlreadySet() {
+ // Mock system user.
+ UserInfo systemUser = new UserInfo();
+ systemUser.id = UserHandle.USER_SYSTEM;
+ doReturn(systemUser).when(mCarUserManagerHelper).getSystemUserInfo();
+
+ putSettingsInt(CarSettings.Global.DEFAULT_USER_RESTRICTIONS_SET, 1);
+ mCarUserService.onReceive(mMockContext,
+ new Intent(Intent.ACTION_LOCKED_BOOT_COMPLETED));
+
+ verify(mCarUserManagerHelper, never())
+ .setUserRestriction(systemUser, UserManager.DISALLOW_MODIFY_ACCOUNTS, true);
+ }
+
+ /**
* Test that the {@link CarUserService} disable location service for user 0 upon first run.
*/
@Test
public void testDisableLocationForSystemUserOnFirstRun() {
- mockAdmin(/* adminId= */ 10);
-
mCarUserService.onReceive(mMockContext,
new Intent(Intent.ACTION_LOCKED_BOOT_COMPLETED));
@@ -154,47 +166,6 @@
}
/**
- * Test that the {@link CarUserService} updates last active user to the first admin user
- * on first run.
- */
- @Test
- public void testUpdateLastActiveUserOnFirstRun() {
- UserInfo admin = mockAdmin(/* adminId= */ 10);
-
- mCarUserService.onReceive(mMockContext,
- new Intent(Intent.ACTION_LOCKED_BOOT_COMPLETED));
-
- verify(mCarUserManagerHelper)
- .setLastActiveUser(admin.id, /* skipGlobalSetting= */ false);
- }
-
- /**
- * Test that the {@link CarUserService} starts up the last active user on reboot.
- */
- @Test
- public void testStartsLastActiveUserOnReboot() {
- List<UserInfo> users = new ArrayList<>();
-
- int adminUserId = 10;
- UserInfo admin = new UserInfo(adminUserId, CarUserService.OWNER_NAME, UserInfo.FLAG_ADMIN);
-
- int secUserId = 11;
- UserInfo secUser =
- new UserInfo(secUserId, CarUserService.OWNER_NAME, UserInfo.FLAG_ADMIN);
-
- users.add(admin);
- users.add(secUser);
-
- doReturn(users).when(mCarUserManagerHelper).getAllUsers();
- doReturn(secUserId).when(mCarUserManagerHelper).getInitialUser();
-
- mCarUserService.onReceive(mMockContext,
- new Intent(Intent.ACTION_LOCKED_BOOT_COMPLETED));
-
- verify(mCarUserManagerHelper).switchToUserId(secUserId);
- }
-
- /**
* Test that the {@link CarUserService} updates last active user on user switch intent.
*/
@Test
@@ -208,26 +179,45 @@
mCarUserService.onReceive(mMockContext, intent);
- verify(mCarUserManagerHelper).setLastActiveUser(
- lastActiveUserId, /* skipGlobalSetting= */ false);
+ verify(mCarUserManagerHelper).setLastActiveUser(lastActiveUserId);
}
/**
* Test that the {@link CarUserService} sets default guest restrictions on first boot.
*/
@Test
- public void testInitializeGuestRestrictionsOnFirstRun() {
- mockAdmin(/* adminId= */ 10);
-
- mCarUserService.onReceive(mMockContext,
- new Intent(Intent.ACTION_LOCKED_BOOT_COMPLETED));
-
+ public void testInitializeGuestRestrictions_IfNotAlreadySet() {
+ mCarUserService.onReceive(mMockContext, new Intent(Intent.ACTION_LOCKED_BOOT_COMPLETED));
verify(mCarUserManagerHelper).initDefaultGuestRestrictions();
+ assertThat(getSettingsInt(CarSettings.Global.DEFAULT_USER_RESTRICTIONS_SET)).isEqualTo(1);
+ }
+
+ /**
+ * Test that the {@link CarUserService} does not set restrictions after they have been set once.
+ */
+ @Test
+ public void test_DoesNotInitializeGuestRestrictions_IfAlreadySet() {
+ putSettingsInt(CarSettings.Global.DEFAULT_USER_RESTRICTIONS_SET, 1);
+ mCarUserService.onReceive(mMockContext, new Intent(Intent.ACTION_LOCKED_BOOT_COMPLETED));
+ verify(mCarUserManagerHelper, never()).initDefaultGuestRestrictions();
+ }
+
+ private void putSettingsInt(String key, int value) {
+ Settings.Global.putInt(InstrumentationRegistry.getTargetContext().getContentResolver(),
+ key, value);
+ }
+
+ private int getSettingsInt(String key) {
+ return Settings.Global.getInt(
+ InstrumentationRegistry.getTargetContext().getContentResolver(),
+ key, /* default= */ 0);
}
private UserInfo mockAdmin(int adminId) {
- UserInfo admin = new UserInfo(adminId, CarUserService.OWNER_NAME, UserInfo.FLAG_ADMIN);
- doReturn(admin).when(mCarUserManagerHelper).createNewAdminUser(CarUserService.OWNER_NAME);
+ UserInfo admin = new UserInfo(adminId, DEFAULT_ADMIN_NAME,
+ UserInfo.FLAG_ADMIN);
+ doReturn(admin).when(mCarUserManagerHelper).createNewAdminUser();
+
return admin;
}
}
diff --git a/tests/obd2_app/res/values/arrays.xml b/tests/obd2_app/res/values/arrays.xml
index 2bd7ce3..3b3c4ac 100644
--- a/tests/obd2_app/res/values/arrays.xml
+++ b/tests/obd2_app/res/values/arrays.xml
@@ -14,12 +14,12 @@
limitations under the License.
-->
<resources>
- <string-array name="scan_delay_entries">
+ <string-array name="scan_delay_entries" translatable="false">
<item>2 seconds</item>
<item>5 seconds</item>
<item>10 seconds</item>
</string-array>
- <string-array name="scan_delay_entryValues">
+ <string-array name="scan_delay_entryValues" translatable="false">
<item>2</item>
<item>5</item>
<item>10</item>
diff --git a/tests/obd2_app/res/values/strings.xml b/tests/obd2_app/res/values/strings.xml
index c615c4f..28db929 100644
--- a/tests/obd2_app/res/values/strings.xml
+++ b/tests/obd2_app/res/values/strings.xml
@@ -14,39 +14,39 @@
limitations under the License.
-->
<resources>
- <string name="app_name">Obd2App</string>
- <string name="title_activity_settings">Settings</string>
+ <string name="app_name" translatable="false">Obd2App</string>
+ <string name="title_activity_settings" translatable="false">Settings</string>
<!-- Strings related to Settings -->
<!-- Example General settings -->
- <string name="pref_header_general">General</string>
+ <string name="pref_header_general" translatable="false">General</string>
- <string name="pref_title_social_recommendations">Enable social recommendations</string>
- <string name="pref_description_social_recommendations">Recommendations for people to contact based
+ <string name="pref_title_social_recommendations" translatable="false">Enable social recommendations</string>
+ <string name="pref_description_social_recommendations" translatable="false">Recommendations for people to contact based
on your message history
</string>
- <string name="pref_title_display_name">Display name</string>
- <string name="pref_default_display_name">John Smith</string>
+ <string name="pref_title_display_name" translatable="false">Display name</string>
+ <string name="pref_default_display_name" translatable="false">John Smith</string>
- <string name="pref_title_add_friends_to_messages">Add friends to messages</string>
- <string-array name="pref_example_list_titles">
+ <string name="pref_title_add_friends_to_messages" translatable="false">Add friends to messages</string>
+ <string-array name="pref_example_list_titles" translatable="false">
<item>Always</item>
<item>When possible</item>
<item>Never</item>
</string-array>
- <string-array name="pref_example_list_values">
+ <string-array name="pref_example_list_values" translatable="false">
<item>1</item>
<item>0</item>
<item>-1</item>
</string-array>
<!-- Example settings for Data & Sync -->
- <string name="pref_header_data_sync">Data & sync</string>
+ <string name="pref_header_data_sync" translatable="false">Data & sync</string>
- <string name="pref_title_sync_frequency">Sync frequency</string>
- <string-array name="pref_sync_frequency_titles">
+ <string name="pref_title_sync_frequency" translatable="false">Sync frequency</string>
+ <string-array name="pref_sync_frequency_titles" translatable="false">
<item>15 minutes</item>
<item>30 minutes</item>
<item>1 hour</item>
@@ -54,7 +54,7 @@
<item>6 hours</item>
<item>Never</item>
</string-array>
- <string-array name="pref_sync_frequency_values">
+ <string-array name="pref_sync_frequency_values" translatable="false">
<item>15</item>
<item>30</item>
<item>60</item>
@@ -63,13 +63,13 @@
<item>-1</item>
</string-array>
- <string-array name="list_preference_entries">
+ <string-array name="list_preference_entries" translatable="false">
<item>Entry 1</item>
<item>Entry 2</item>
<item>Entry 3</item>
</string-array>
- <string-array name="list_preference_entry_values">
+ <string-array name="list_preference_entry_values" translatable="false">
<item>1</item>
<item>2</item>
<item>3</item>
@@ -77,15 +77,15 @@
<string-array name="multi_select_list_preference_default_value"/>
- <string name="pref_title_system_sync_settings">System sync settings</string>
+ <string name="pref_title_system_sync_settings" translatable="false">System sync settings</string>
<!-- Example settings for Notifications -->
- <string name="pref_header_notifications">Notifications</string>
+ <string name="pref_header_notifications" translatable="false">Notifications</string>
- <string name="pref_title_new_message_notifications">New message notifications</string>
+ <string name="pref_title_new_message_notifications" translatable="false">New message notifications</string>
- <string name="pref_title_ringtone">Ringtone</string>
- <string name="pref_ringtone_silent">Silent</string>
+ <string name="pref_title_ringtone" translatable="false">Ringtone</string>
+ <string name="pref_ringtone_silent" translatable="false">Silent</string>
- <string name="pref_title_vibrate">Vibrate</string>
+ <string name="pref_title_vibrate" translatable="false">Vibrate</string>
</resources>
diff --git a/tests/obd2_test/Android.mk b/tests/obd2_test/Android.mk
index 06ffe31..f2ae94d 100644
--- a/tests/obd2_test/Android.mk
+++ b/tests/obd2_test/Android.mk
@@ -33,7 +33,7 @@
LOCAL_PROGUARD_ENABLED := disabled
LOCAL_STATIC_JAVA_LIBRARIES += com.android.car.obd2 \
- android-support-test \
+ androidx.test.rules \
LOCAL_JAVA_LIBRARIES := android.car android.test.runner
diff --git a/tests/obd2_test/AndroidManifest.xml b/tests/obd2_test/AndroidManifest.xml
index 0de21a4..ee40a8a 100644
--- a/tests/obd2_test/AndroidManifest.xml
+++ b/tests/obd2_test/AndroidManifest.xml
@@ -18,7 +18,7 @@
package="com.android.car.obd2.test"
android:sharedUserId="android.uid.system" >
- <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+ <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
android:targetPackage="com.android.car.obd2.test"
android:label="Tests for OBD2 APIs"/>
diff --git a/tests/robotests/Android.mk b/tests/robotests/Android.mk
index 3152109..4ad36fa 100644
--- a/tests/robotests/Android.mk
+++ b/tests/robotests/Android.mk
@@ -34,6 +34,7 @@
LOCAL_JAVA_LIBRARIES := \
android.car \
+ android.car.userlib \
robolectric_android-all-stub \
Robolectric_all-target \
mockito-robolectric-prebuilt \
diff --git a/tests/robotests/src/com/android/car/users/CarUserManagerHelperRoboTest.java b/tests/robotests/src/com/android/car/users/CarUserManagerHelperRoboTest.java
index fcfd6dc..6a90cdf 100644
--- a/tests/robotests/src/com/android/car/users/CarUserManagerHelperRoboTest.java
+++ b/tests/robotests/src/com/android/car/users/CarUserManagerHelperRoboTest.java
@@ -21,7 +21,7 @@
import static org.mockito.Mockito.when;
import android.app.ActivityManager;
-import android.car.user.CarUserManagerHelper;
+import android.car.userlib.CarUserManagerHelper;
import android.content.Context;
import android.content.pm.UserInfo;
import android.os.UserManager;
diff --git a/tests/usb/AoapHostApp/Android.mk b/tests/usb/AoapHostApp/Android.mk
index 9fc286a..b020473 100644
--- a/tests/usb/AoapHostApp/Android.mk
+++ b/tests/usb/AoapHostApp/Android.mk
@@ -32,7 +32,7 @@
LOCAL_PROGUARD_ENABLED := disabled
-LOCAL_STATIC_JAVA_LIBRARIES := junit
-include packages/services/Car/car-support-lib/car-support.mk
+LOCAL_STATIC_JAVA_LIBRARIES := junit \
+ android.car
include $(BUILD_PACKAGE)
diff --git a/tests/usb/AoapHostApp/res/values/strings.xml b/tests/usb/AoapHostApp/res/values/strings.xml
index f2caeb3..1643b19 100644
--- a/tests/usb/AoapHostApp/res/values/strings.xml
+++ b/tests/usb/AoapHostApp/res/values/strings.xml
@@ -14,6 +14,6 @@
limitations under the License.
-->
<resources>
- <string name="app_title">AOAP Test Host App</string>
- <string name="exit">Exit</string>
+ <string name="app_title" translatable="false">AOAP Test Host App</string>
+ <string name="exit" translatable="false">Exit</string>
</resources>
diff --git a/tests/usb/AoapPhoneCompanionApp/res/values/strings.xml b/tests/usb/AoapPhoneCompanionApp/res/values/strings.xml
index bea6654..9b98c9b 100644
--- a/tests/usb/AoapPhoneCompanionApp/res/values/strings.xml
+++ b/tests/usb/AoapPhoneCompanionApp/res/values/strings.xml
@@ -14,6 +14,6 @@
limitations under the License.
-->
<resources>
- <string name="app_title">AOAP Test Companion App</string>
- <string name="exit">Exit</string>
+ <string name="app_title" translatable="false">AOAP Test Companion App</string>
+ <string name="exit" translatable="false">Exit</string>
</resources>
diff --git a/tests/vehiclehal_test/Android.mk b/tests/vehiclehal_test/Android.mk
index d5adc65..58678b3 100644
--- a/tests/vehiclehal_test/Android.mk
+++ b/tests/vehiclehal_test/Android.mk
@@ -33,7 +33,7 @@
LOCAL_PROGUARD_ENABLED := disabled
LOCAL_STATIC_JAVA_LIBRARIES += vehicle-hal-support-lib \
- android-support-test \
+ androidx.test.rules \
android.hidl.base-V1.0-java \
android.hardware.automotive.vehicle-V2.0-java
diff --git a/tests/vehiclehal_test/AndroidManifest.xml b/tests/vehiclehal_test/AndroidManifest.xml
index c03406d..ee0dccc 100644
--- a/tests/vehiclehal_test/AndroidManifest.xml
+++ b/tests/vehiclehal_test/AndroidManifest.xml
@@ -20,7 +20,7 @@
<uses-permission android:name="android.car.permission.CONTROL_CAR_CLIMATE" />
- <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+ <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
android:targetPackage="com.android.car.vehiclehal.test"
android:label="Tests for Vehicle HAL APIs"/>
diff --git a/tests/vehiclehal_test/assets/car_diagnostic_test.json b/tests/vehiclehal_test/assets/car_diagnostic_test.json
new file mode 100644
index 0000000..d81926e
--- /dev/null
+++ b/tests/vehiclehal_test/assets/car_diagnostic_test.json
@@ -0,0 +1,2712 @@
+[
+ {
+ "timestamp": 1000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [42.22222, 64, 214.0625, 0.0, 0.0, 0.0, 0.0, 0.0, 3080, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 31.764706, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 2000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [42.22222, 64, 216.40625, 0.0, 0.0, 0.0, 0.0, 0.0, 3084, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 3000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [41.77778, 64, 214.0625, 0.0, 0.0, 0.0, 0.0, 0.0, 3078, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 31.764706, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 4000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [40.88889, 64, 207.03125, 0.0, 0.0, 0.0, 0.0, 0.0, 2873, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 31.764706, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 5000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [40.88889, 65, 214.0625, 0.0, 0.0, 0.0, 0.0, 0.0, 3078, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 31.764706, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 6000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [41.333332, 65, 200, 0.0, 0.0, 0.0, 0.0, 0.0, 2869, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 31.764706, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 7000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [52, 66, 230.46875, 0.0, 0.0, 0.0, 0.0, 0.0, 3090, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 8000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [68.44444, 66, 214.0625, 0.0, 0.0, 0.0, 0.0, 0.0, 4110, 1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 34.11765, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 9000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [51.11111, 66, 223.4375, 0.0, 0.0, 0.0, 0.0, 0.0, 3633, 5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 30.19608, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 10000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [50.666668, 67, 230.46875, 0.0, 0.0, 0.0, 0.0, 0.0, 3135, 4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.941177, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 11000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [48.444443, 67, 228.125, 0.0, 0.0, 0.0, 0.0, 0.0, 3125, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 27.450981, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 12000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [55.555557, 68, 209.375, 0.0, 0.0, 0.0, 0.0, 0.0, 2857, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 26.27451, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 13000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [82.666664, 68, 202.34375, 0.0, 0.0, 0.0, 0.0, 0.0, 4899, 6, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 17.254902, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 14000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [45.333332, 68, 237.5, 0.0, 0.0, 0.0, 0.0, 0.0, 8483, 17, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.941177, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 15000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [28, 69, 188.28125, 0.0, 0.0, 0.0, 0.0, 0.0, 5158, 18, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 34.11765, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 16000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [36, 69, 216.40625, 0.0, 0.0, 0.0, 0.0, 0.0, 6184, 20, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 34.11765, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 17000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [31.11111, 70, 200, 0.0, 0.0, 0.0, 0.0, 0.0, 6207, 21, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 30.19608, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 18000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [28.88889, 70, 192.96875, 0.0, 0.0, 0.0, 0.0, 0.0, 5409, 19, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 36.47059, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 19000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [92.888885, 71, 200, 0.0, 0.0, 0.0, 0.0, 0.0, 5653, 18, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 24.705883, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 20000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [31.555555, 71, 209.375, 0.0, 0.0, 0.0, 0.0, 0.0, 7988, 26, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.941177, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 21000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [33.333332, 72, 176.5625, 0.0, 0.0, 0.0, 0.0, 0.0, 4134, 21, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.941177, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 22000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [49.333332, 72, 192.96875, 0.0, 0.0, 0.0, 0.0, 0.0, 3109, 14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 30.19608, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 23000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "P0420",
+ "floatValues": [49.333332, 72, 192.96875, 0.0, 0.0, 0.0, 0.0, 0.0, 3109, 14, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 30.19608, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896065
+ },
+ {
+ "timestamp": 24000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [44.88889, 73, 223.4375, 0.0, 0.0, 0.0, 0.0, 0.0, 3635, 16, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 28.62745, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 25000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [45.77778, 73, 228.125, 0.0, 0.0, 0.0, 0.0, 0.0, 3619, 11, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 34.11765, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 26000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [36, 74, 216.40625, 0.0, 0.0, 0.0, 0.0, 0.0, 4637, 10, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 35.686275, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 27000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [36, 74, 228.125, 0.0, 0.0, 0.0, 0.0, 0.0, 7199, 15, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 30.19608, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 28000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [47.555557, 75, 211.71875, 0.0, 0.0, 0.0, 0.0, 0.0, 3894, 11, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 24.705883, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 70, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 29000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [48, 75, 218.75, 0.0, 0.0, 0.0, 0.0, 0.0, 3108, 1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 27.450981, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 30000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [45.77778, 75, 216.40625, 0.0, 0.0, 0.0, 0.0, 0.0, 3087, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 27.450981, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 74, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 31000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [45.77778, 76, 214.0625, 0.0, 0.0, 0.0, 0.0, 0.0, 3091, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 76, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 32000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [45.77778, 76, 216.40625, 0.0, 0.0, 0.0, 0.0, 0.0, 3090, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 78, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 33000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [45.77778, 77, 214.0625, 0.0, 0.0, 0.0, 0.0, 0.0, 3083, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 30.19608, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 34000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [45.333332, 77, 211.71875, 0.0, 0.0, 0.0, 0.0, 0.0, 3080, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 30.19608, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 35000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [45.77778, 77, 216.40625, 0.0, 0.0, 0.0, 0.0, 0.0, 3078, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 36000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [45.77778, 78, 211.71875, 0.0, 0.0, 0.0, 0.0, 0.0, 3077, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 30.19608, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 86, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 37000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [46.22222, 78, 211.71875, 0.0, 0.0, 0.0, 0.0, 0.0, 3078, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 38000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [45.77778, 78, 214.0625, 0.0, 0.0, 0.0, 0.0, 0.0, 3082, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 31.37255, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 39000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [45.333332, 79, 209.375, 0.0, 0.0, 0.0, 0.0, 0.0, 3076, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 40000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [46.22222, 79, 214.0625, 0.0, 0.0, 0.0, 0.0, 0.0, 3080, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 30.588236, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 94, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 41000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [45.77778, 79, 209.375, 0.0, 0.0, 0.0, 0.0, 0.0, 2879, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 42000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [45.77778, 79, 204.6875, 0.0, 0.0, 0.0, 0.0, 0.0, 3076, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 98, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 43000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [45.77778, 80, 214.0625, 0.0, 0.0, 0.0, 0.0, 0.0, 3082, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 44000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [45.77778, 80, 204.6875, 0.0, 0.0, 0.0, 0.0, 0.0, 2877, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 102, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 45000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [45.77778, 80, 207.03125, 0.0, 0.0, 0.0, 0.0, 0.0, 3076, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 104, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 46000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [45.77778, 81, 211.71875, 0.0, 0.0, 0.0, 0.0, 0.0, 3077, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 106, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 47000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [45.77778, 81, 204.6875, 0.0, 0.0, 0.0, 0.0, 0.0, 3072, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 48000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [46.22222, 81, 207.03125, 0.0, 0.0, 0.0, 0.0, 0.0, 3082, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 110, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 49000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [45.77778, 82, 202.34375, 0.0, 0.0, 0.0, 0.0, 0.0, 2879, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 50000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [45.77778, 82, 202.34375, 0.0, 0.0, 0.0, 0.0, 0.0, 3080, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 114, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 51000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [46.22222, 82, 204.6875, 0.0, 0.0, 0.0, 0.0, 0.0, 3077, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 116, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 52000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [46.22222, 82, 202.34375, 0.0, 0.0, 0.0, 0.0, 0.0, 2877, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 118, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 53000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [46.22222, 83, 204.6875, 0.0, 0.0, 0.0, 0.0, 0.0, 3079, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 120, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 54000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [46.22222, 83, 200, 0.0, 0.0, 0.0, 0.0, 0.0, 3073, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 31.764706, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 122, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 55000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [46.666668, 83, 197.65625, 0.0, 0.0, 0.0, 0.0, 0.0, 3078, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 124, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 56000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [46.22222, 83, 204.6875, 0.0, 0.0, 0.0, 0.0, 0.0, 3082, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 126, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 57000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [46.22222, 84, 197.65625, 0.0, 0.0, 0.0, 0.0, 0.0, 3073, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 58000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [47.11111, 84, 200, 0.0, 0.0, 0.0, 0.0, 0.0, 3075, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 130, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 59000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [46.22222, 84, 197.65625, 0.0, 0.0, 0.0, 0.0, 0.0, 3081, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 132, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 60000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [46.22222, 85, 195.3125, 0.0, 0.0, 0.0, 0.0, 0.0, 2878, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 134, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 61000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [46.666668, 85, 200, 0.0, 0.0, 0.0, 0.0, 0.0, 3082, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 31.764706, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 136, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 62000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [46.666668, 85, 195.3125, 0.0, 0.0, 0.0, 0.0, 0.0, 2879, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 138, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 63000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [47.11111, 85, 195.3125, 0.0, 0.0, 0.0, 0.0, 0.0, 3074, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 140, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 64000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [46.666668, 86, 197.65625, 0.0, 0.0, 0.0, 0.0, 0.0, 3085, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 142, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 65000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [47.11111, 86, 188.28125, 0.0, 0.0, 0.0, 0.0, 0.0, 3072, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 27.450981, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 144, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 66000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [49.77778, 86, 209.375, 0.0, 0.0, 0.0, 0.0, 0.0, 7177, 11, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 22.745098, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 146, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 67000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [41.333332, 86, 192.96875, 0.0, 0.0, 0.0, 0.0, 0.0, 4126, 15, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 22.745098, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 148, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 68000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [77.333336, 86, 200, 0.0, 0.0, 0.0, 0.0, 0.0, 6438, 20, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 22.745098, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 150, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 69000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [112.888885, 86, 202.34375, 0.0, 0.0, 0.0, 0.0, 0.0, 8746, 30, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 8.627451, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 152, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 70000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [103.111115, 86, 211.71875, 0.0, 0.0, 0.0, 0.0, 0.0, 14082, 44, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 20.784313, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 154, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 71000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [73.333336, 86, 214.0625, 0.0, 0.0, 0.0, 0.0, 0.0, 15639, 54, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 26.27451, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 156, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 72000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [63.555557, 85, 200, 0.0, 0.0, 0.0, 0.0, 0.0, 10268, 59, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 30.19608, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 158, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 73000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [24, 85, 146.09375, 0.0, 0.0, 0.0, 0.0, 0.0, 5928, 60, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 34.901962, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 160, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 74000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [59.555557, 85, 188.28125, 0.0, 0.0, 0.0, 0.0, 0.0, 6418, 58, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 30.19608, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 162, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 75000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [34.22222, 85, 214.0625, 0.0, 0.0, 0.0, 0.0, 0.0, 6179, 59, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 34.11765, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 164, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 76000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [99.55556, 85, 197.65625, 0.0, 0.0, 0.0, 0.0, 0.0, 7483, 59, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 28.62745, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 166, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 77000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [96.888885, 86, 195.3125, 0.0, 0.0, 0.0, 0.0, 0.0, 6660, 63, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 168, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 78000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [54.666668, 86, 200, 0.0, 0.0, 0.0, 0.0, 0.0, 8460, 66, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 170, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 79000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [20, 86, 167.1875, 0.0, 0.0, 0.0, 0.0, 0.0, 5431, 56, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 31.764706, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 172, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 80000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [15.111111, 86, 200, 0.0, 0.0, 0.0, 0.0, 0.0, 4868, 48, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [4, 0, 0, 0, 0, 0, 0, 174, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 81000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [83.55556, 87, 209.375, 0.0, 0.0, 0.0, 0.0, 0.0, 7195, 47, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [4, 0, 0, 0, 0, 0, 0, 176, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 82000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [104, 87, 200, 0.0, 0.0, 0.0, 0.0, 0.0, 6423, 48, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 26.27451, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 178, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 83000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [112.888885, 87, 216.40625, 0.0, 0.0, 0.0, 0.0, 0.0, 11582, 55, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 22.745098, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 180, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 84000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [113.333336, 87, 216.40625, 0.0, 0.0, 0.0, 0.0, 0.0, 13336, 67, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 26.27451, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 182, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 85000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [24, 87, 174.21875, 0.0, 0.0, 0.0, 0.0, 0.0, 12304, 73, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 24.705883, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 184, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 86000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [20.88889, 87, 181.25, 0.0, 0.0, 0.0, 0.0, 0.0, 6717, 68, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 30.19608, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 186, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 87000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [20.444445, 86, 200, 0.0, 0.0, 0.0, 0.0, 0.0, 4654, 47, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [4, 0, 0, 0, 0, 0, 0, 188, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 88000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [29.333334, 86, 197.65625, 0.0, 0.0, 0.0, 0.0, 0.0, 3330, 30, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 34.901962, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 190, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 89000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [40.88889, 87, 197.65625, 0.0, 0.0, 0.0, 0.0, 0.0, 3097, 13, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 34.901962, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 192, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 90000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [45.77778, 87, 214.0625, 0.0, 0.0, 0.0, 0.0, 0.0, 3088, 2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 34.11765, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 194, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 91000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [42.666668, 88, 209.375, 0.0, 0.0, 0.0, 0.0, 0.0, 3075, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 26.27451, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 92000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [41.77778, 88, 207.03125, 0.0, 0.0, 0.0, 0.0, 0.0, 3072, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 26.27451, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 93000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [41.77778, 88, 214.0625, 0.0, 0.0, 0.0, 0.0, 0.0, 3074, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 200, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 94000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [42.22222, 89, 204.6875, 0.0, 0.0, 0.0, 0.0, 0.0, 2873, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 33.333332, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 202, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 95000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [42.666668, 89, 207.03125, 0.0, 0.0, 0.0, 0.0, 0.0, 2878, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 204, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 96000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [42.666668, 89, 209.375, 0.0, 0.0, 0.0, 0.0, 0.0, 3072, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 206, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 97000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [42.666668, 90, 202.34375, 0.0, 0.0, 0.0, 0.0, 0.0, 2870, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 208, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 98000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [42.666668, 90, 209.375, 0.0, 0.0, 0.0, 0.0, 0.0, 3075, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 210, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 99000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [43.11111, 90, 204.6875, 0.0, 0.0, 0.0, 0.0, 0.0, 2872, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 212, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 100000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [43.11111, 91, 202.34375, 0.0, 0.0, 0.0, 0.0, 0.0, 3082, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 214, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 101000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [43.11111, 91, 209.375, 0.0, 0.0, 0.0, 0.0, 0.0, 3072, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 216, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 102000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [43.11111, 91, 204.6875, 0.0, 0.0, 0.0, 0.0, 0.0, 2879, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 218, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 103000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [43.555557, 91, 209.375, 0.0, 0.0, 0.0, 0.0, 0.0, 3079, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 104000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [43.11111, 91, 202.34375, 0.0, 0.0, 0.0, 0.0, 0.0, 2876, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 222, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 105000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [43.555557, 91, 197.65625, 0.0, 0.0, 0.0, 0.0, 0.0, 3074, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 224, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 106000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [43.555557, 91, 207.03125, 0.0, 0.0, 0.0, 0.0, 0.0, 3078, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 226, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 107000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [43.11111, 92, 197.65625, 0.0, 0.0, 0.0, 0.0, 0.0, 3074, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 108000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [43.555557, 92, 200, 0.0, 0.0, 0.0, 0.0, 0.0, 3076, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 230, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 109000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [43.555557, 92, 207.03125, 0.0, 0.0, 0.0, 0.0, 0.0, 3080, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 232, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 110000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [43.555557, 92, 197.65625, 0.0, 0.0, 0.0, 0.0, 0.0, 2878, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 234, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 111000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [43.555557, 92, 204.6875, 0.0, 0.0, 0.0, 0.0, 0.0, 3082, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 112000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [44.444443, 92, 200, 0.0, 0.0, 0.0, 0.0, 0.0, 3076, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 238, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 113000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [43.555557, 92, 197.65625, 0.0, 0.0, 0.0, 0.0, 0.0, 3075, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 240, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 114000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [43.555557, 92, 195.3125, 0.0, 0.0, 0.0, 0.0, 0.0, 2872, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 243, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 115000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [44.444443, 92, 197.65625, 0.0, 0.0, 0.0, 0.0, 0.0, 3077, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 244, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 116000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [44, 92, 202.34375, 0.0, 0.0, 0.0, 0.0, 0.0, 3083, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 246, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 117000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [44, 92, 200, 0.0, 0.0, 0.0, 0.0, 0.0, 3080, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 248, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 118000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [44, 92, 195.3125, 0.0, 0.0, 0.0, 0.0, 0.0, 3077, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 250, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 119000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [44, 92, 200, 0.0, 0.0, 0.0, 0.0, 0.0, 3081, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 252, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 120000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [44, 92, 192.96875, 0.0, 0.0, 0.0, 0.0, 0.0, 3080, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 254, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 121000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [44, 92, 195.3125, 0.0, 0.0, 0.0, 0.0, 0.0, 2879, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 256, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 122000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [44.444443, 92, 197.65625, 0.0, 0.0, 0.0, 0.0, 0.0, 3073, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 258, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 123000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [44.444443, 92, 188.28125, 0.0, 0.0, 0.0, 0.0, 0.0, 2879, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 260, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 124000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [44.444443, 92, 197.65625, 0.0, 0.0, 0.0, 0.0, 0.0, 3076, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 262, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 125000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [59.555557, 92, 197.65625, 0.0, 0.0, 0.0, 0.0, 0.0, 3104, 1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 30.19608, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 264, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 126000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [100.888885, 92, 204.6875, 0.0, 0.0, 0.0, 0.0, 0.0, 8255, 15, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 9.411765, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 266, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 127000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [99.55556, 92, 209.375, 0.0, 0.0, 0.0, 0.0, 0.0, 11276, 33, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 15.686275, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 268, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 128000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [90.666664, 92, 209.375, 0.0, 0.0, 0.0, 0.0, 0.0, 15618, 50, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 26.27451, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 270, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 129000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [111.55556, 90, 216.40625, 0.0, 0.0, 0.0, 0.0, 0.0, 13109, 63, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 30.19608, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 272, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 130000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [111.55556, 89, 211.71875, 0.0, 0.0, 0.0, 0.0, 0.0, 14343, 74, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 17.647058, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 131000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [21.777779, 88, 192.96875, 0.0, 0.0, 0.0, 0.0, 0.0, 15921, 83, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 9.803922, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 276, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 132000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [34.666668, 87, 183.59375, 0.0, 0.0, 0.0, 0.0, 0.0, 4400, 55, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 26.27451, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 278, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 133000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [30.666666, 87, 183.59375, 0.0, 0.0, 0.0, 0.0, 0.0, 3117, 32, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 28.62745, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 280, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 134000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [29.333334, 87, 197.65625, 0.0, 0.0, 0.0, 0.0, 0.0, 3108, 26, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 28.62745, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 282, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 135000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [32.88889, 87, 195.3125, 0.0, 0.0, 0.0, 0.0, 0.0, 3106, 21, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 34.11765, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 284, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 136000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [111.111115, 88, 207.03125, 0.0, 0.0, 0.0, 0.0, 0.0, 4115, 17, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 17.254902, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 286, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 137000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [112.44444, 89, 209.375, 0.0, 0.0, 0.0, 0.0, 0.0, 8991, 30, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 26.27451, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 288, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 138000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [95.55556, 89, 197.65625, 0.0, 0.0, 0.0, 0.0, 0.0, 9513, 43, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 28.62745, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 290, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 139000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [27.555555, 89, 195.3125, 0.0, 0.0, 0.0, 0.0, 0.0, 9518, 50, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 34.509804, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 292, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 140000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [19.555555, 89, 178.90625, 0.0, 0.0, 0.0, 0.0, 0.0, 6418, 49, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 30.19608, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 294, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 141000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [20.88889, 89, 188.28125, 0.0, 0.0, 0.0, 0.0, 0.0, 5173, 40, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 34.11765, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 296, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 142000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [28.444445, 89, 185.9375, 0.0, 0.0, 0.0, 0.0, 0.0, 4112, 32, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.941177, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 298, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 143000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [113.333336, 89, 202.34375, 0.0, 0.0, 0.0, 0.0, 0.0, 8720, 37, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 28.62745, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 300, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 144000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [109.333336, 89, 216.40625, 0.0, 0.0, 0.0, 0.0, 0.0, 16412, 52, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 12.54902, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 302, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 145000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [22.666666, 89, 178.90625, 0.0, 0.0, 0.0, 0.0, 0.0, 13828, 61, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.941177, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 304, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 146000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [28.88889, 88, 197.65625, 0.0, 0.0, 0.0, 0.0, 0.0, 6447, 61, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 34.11765, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 306, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 147000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [16.88889, 87, 200, 0.0, 0.0, 0.0, 0.0, 0.0, 5657, 56, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 30.19608, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 308, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 148000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [19.11111, 87, 200, 0.0, 0.0, 0.0, 0.0, 0.0, 4873, 48, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 35.686275, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [4, 0, 0, 0, 0, 0, 0, 310, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 149000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [27.11111, 87, 185.9375, 0.0, 0.0, 0.0, 0.0, 0.0, 3613, 34, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [4, 0, 0, 0, 0, 0, 0, 312, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 150000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [30.222221, 88, 202.34375, 0.0, 0.0, 0.0, 0.0, 0.0, 3131, 19, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 36.862747, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 314, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 151000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [36.444443, 88, 209.375, 0.0, 0.0, 0.0, 0.0, 0.0, 3844, 8, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 34.901962, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 316, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 152000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [43.555557, 88, 209.375, 0.0, 0.0, 0.0, 0.0, 0.0, 3080, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 28.62745, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 318, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 153000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [42.666668, 89, 197.65625, 0.0, 0.0, 0.0, 0.0, 0.0, 2866, 1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.941177, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 320, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 154000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [76, 89, 200, 0.0, 0.0, 0.0, 0.0, 0.0, 7457, 13, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 10.588236, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 322, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 155000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [105.77778, 90, 204.6875, 0.0, 0.0, 0.0, 0.0, 0.0, 9272, 27, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 15.686275, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 324, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 156000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [87.55556, 90, 211.71875, 0.0, 0.0, 0.0, 0.0, 0.0, 13585, 43, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 28.62745, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 326, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 157000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [42.666668, 89, 190.625, 0.0, 0.0, 0.0, 0.0, 0.0, 11024, 53, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 20.784313, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 328, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 158000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [18.222221, 88, 155.46875, 0.0, 0.0, 0.0, 0.0, 0.0, 6927, 51, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 28.62745, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 330, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 159000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [21.333334, 88, 157.8125, 0.0, 0.0, 0.0, 0.0, 0.0, 5148, 38, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 34.11765, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 332, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 160000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [26.222221, 88, 139.0625, 0.0, 0.0, 0.0, 0.0, 0.0, 3594, 29, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 26.27451, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 334, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 161000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [48.88889, 88, 185.9375, 0.0, 0.0, 0.0, 0.0, 0.0, 3350, 25, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 18.82353, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 336, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 162000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [79.55556, 88, 202.34375, 0.0, 0.0, 0.0, 0.0, 0.0, 8456, 34, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 26.27451, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 338, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 163000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [30.666666, 89, 185.9375, 0.0, 0.0, 0.0, 0.0, 0.0, 6163, 40, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 36.47059, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 340, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 164000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [24, 89, 188.28125, 0.0, 0.0, 0.0, 0.0, 0.0, 4886, 32, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 30.588236, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 342, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 165000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [54.22222, 89, 192.96875, 0.0, 0.0, 0.0, 0.0, 0.0, 5130, 29, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 28.62745, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 344, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 166000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [112.888885, 89, 202.34375, 0.0, 0.0, 0.0, 0.0, 0.0, 9525, 38, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 26.27451, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 346, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 167000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [99.55556, 89, 202.34375, 0.0, 0.0, 0.0, 0.0, 0.0, 10513, 49, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 348, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 168000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [76.888885, 89, 202.34375, 0.0, 0.0, 0.0, 0.0, 0.0, 8248, 54, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.941177, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 350, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 169000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [59.11111, 89, 197.65625, 0.0, 0.0, 0.0, 0.0, 0.0, 8484, 59, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 352, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 170000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [74.22222, 89, 211.71875, 0.0, 0.0, 0.0, 0.0, 0.0, 5945, 61, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.941177, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 354, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 171000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [23.11111, 89, 178.90625, 0.0, 0.0, 0.0, 0.0, 0.0, 6197, 61, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 34.901962, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 356, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 172000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [20.88889, 89, 200, 0.0, 0.0, 0.0, 0.0, 0.0, 5904, 59, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 34.901962, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [4, 0, 0, 0, 0, 0, 0, 358, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 173000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [35.11111, 89, 207.03125, 0.0, 0.0, 0.0, 0.0, 0.0, 6154, 60, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 30.19608, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 360, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 174000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [16.88889, 90, 181.25, 0.0, 0.0, 0.0, 0.0, 0.0, 5636, 59, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 28.62745, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 362, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 175000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [54.666668, 90, 200, 0.0, 0.0, 0.0, 0.0, 0.0, 5411, 54, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 24.705883, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [4, 0, 0, 0, 0, 0, 0, 364, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 176000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [24.444445, 90, 195.3125, 0.0, 0.0, 0.0, 0.0, 0.0, 5688, 55, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.941177, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 366, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 177000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [48.88889, 90, 211.71875, 0.0, 0.0, 0.0, 0.0, 0.0, 5903, 55, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 26.27451, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 368, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 178000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [20.88889, 91, 204.6875, 0.0, 0.0, 0.0, 0.0, 0.0, 5162, 51, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 30.19608, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 370, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 179000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [24, 91, 188.28125, 0.0, 0.0, 0.0, 0.0, 0.0, 4124, 44, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 372, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 180000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [23.555555, 91, 181.25, 0.0, 0.0, 0.0, 0.0, 0.0, 3132, 37, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 34.901962, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 181000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [28, 91, 197.65625, 0.0, 0.0, 0.0, 0.0, 0.0, 3128, 24, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 34.901962, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 376, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 182000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [38.666668, 91, 200, 0.0, 0.0, 0.0, 0.0, 0.0, 3089, 15, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 39.607845, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 378, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 183000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [42.666668, 91, 209.375, 0.0, 0.0, 0.0, 0.0, 0.0, 2869, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 30.19608, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 380, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 184000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [39.555557, 91, 197.65625, 0.0, 0.0, 0.0, 0.0, 0.0, 2877, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 26.27451, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 382, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 185000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [39.11111, 92, 200, 0.0, 0.0, 0.0, 0.0, 0.0, 2871, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 28.62745, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 384, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 186000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [39.11111, 92, 197.65625, 0.0, 0.0, 0.0, 0.0, 0.0, 2872, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 387, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 187000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [39.11111, 92, 200, 0.0, 0.0, 0.0, 0.0, 0.0, 2870, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 30.19608, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 389, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 188000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [39.555557, 92, 197.65625, 0.0, 0.0, 0.0, 0.0, 0.0, 3073, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 391, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 189000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [39.555557, 92, 202.34375, 0.0, 0.0, 0.0, 0.0, 0.0, 3077, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 30.19608, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 392, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 190000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [40.444443, 92, 197.65625, 0.0, 0.0, 0.0, 0.0, 0.0, 2867, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 30.19608, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 394, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 191000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [40, 93, 202.34375, 0.0, 0.0, 0.0, 0.0, 0.0, 3072, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 30.19608, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 396, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 192000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [40, 93, 204.6875, 0.0, 0.0, 0.0, 0.0, 0.0, 3078, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 30.19608, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 398, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 193000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [40, 93, 197.65625, 0.0, 0.0, 0.0, 0.0, 0.0, 2875, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 30.588236, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 400, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 194000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [40, 93, 202.34375, 0.0, 0.0, 0.0, 0.0, 0.0, 3074, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 30.19608, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 402, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 195000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [40.444443, 93, 195.3125, 0.0, 0.0, 0.0, 0.0, 0.0, 2878, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 30.19608, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 404, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 196000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [40.444443, 93, 202.34375, 0.0, 0.0, 0.0, 0.0, 0.0, 3081, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 30.19608, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 406, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 197000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [40.444443, 93, 202.34375, 0.0, 0.0, 0.0, 0.0, 0.0, 3085, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 30.19608, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 408, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 198000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [40.444443, 93, 195.3125, 0.0, 0.0, 0.0, 0.0, 0.0, 2877, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 30.19608, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 410, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 199000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [40.88889, 93, 202.34375, 0.0, 0.0, 0.0, 0.0, 0.0, 3079, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 30.19608, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 412, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 200000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [40.88889, 93, 197.65625, 0.0, 0.0, 0.0, 0.0, 0.0, 3082, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 30.19608, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 414, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 201000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [40.444443, 94, 200, 0.0, 0.0, 0.0, 0.0, 0.0, 3079, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 30.19608, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 416, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 202000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [40.88889, 94, 204.6875, 0.0, 0.0, 0.0, 0.0, 0.0, 3077, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 30.19608, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 418, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 203000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [40.88889, 94, 192.96875, 0.0, 0.0, 0.0, 0.0, 0.0, 3076, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 30.19608, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 420, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 204000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [40.88889, 94, 195.3125, 0.0, 0.0, 0.0, 0.0, 0.0, 3075, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 30.19608, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 422, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 205000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [41.333332, 94, 202.34375, 0.0, 0.0, 0.0, 0.0, 0.0, 3080, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 30.19608, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 424, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 206000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [40.88889, 94, 195.3125, 0.0, 0.0, 0.0, 0.0, 0.0, 3080, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 30.19608, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 426, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 207000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [40.88889, 94, 197.65625, 0.0, 0.0, 0.0, 0.0, 0.0, 3081, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 30.19608, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 428, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 208000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [40.88889, 94, 192.96875, 0.0, 0.0, 0.0, 0.0, 0.0, 3085, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 30.19608, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 430, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 209000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [84, 94, 197.65625, 0.0, 0.0, 0.0, 0.0, 0.0, 3900, 2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 11.372549, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 432, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 210000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [73.333336, 94, 207.03125, 0.0, 0.0, 0.0, 0.0, 0.0, 6937, 15, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 17.254902, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 434, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 211000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [100.888885, 94, 211.71875, 0.0, 0.0, 0.0, 0.0, 0.0, 10253, 30, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 10.588236, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 436, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 212000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [104, 94, 214.0625, 0.0, 0.0, 0.0, 0.0, 0.0, 14653, 46, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 22.745098, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 438, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 213000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [55.555557, 93, 209.375, 0.0, 0.0, 0.0, 0.0, 0.0, 17934, 59, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 24.705883, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 440, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 214000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [28.444445, 91, 190.625, 0.0, 0.0, 0.0, 0.0, 0.0, 8757, 62, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 22.745098, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 442, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 215000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [17.777779, 90, 188.28125, 0.0, 0.0, 0.0, 0.0, 0.0, 5642, 58, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 30.19608, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 444, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 216000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [25.333334, 89, 171.875, 0.0, 0.0, 0.0, 0.0, 0.0, 3630, 38, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 30.19608, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 446, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 217000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [25.777779, 89, 178.90625, 0.0, 0.0, 0.0, 0.0, 0.0, 3130, 27, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 30.19608, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 448, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 218000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [40, 90, 200, 0.0, 0.0, 0.0, 0.0, 0.0, 3091, 13, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.941177, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 450, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 219000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [43.11111, 90, 207.03125, 0.0, 0.0, 0.0, 0.0, 0.0, 3340, 4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 30.19608, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 452, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 220000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [40.444443, 91, 197.65625, 0.0, 0.0, 0.0, 0.0, 0.0, 2874, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 30.19608, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 454, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 221000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [39.555557, 91, 202.34375, 0.0, 0.0, 0.0, 0.0, 0.0, 2877, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 27.450981, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 456, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 222000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [39.11111, 92, 197.65625, 0.0, 0.0, 0.0, 0.0, 0.0, 3074, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 458, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 223000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [39.555557, 92, 197.65625, 0.0, 0.0, 0.0, 0.0, 0.0, 2866, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 460, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 224000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [39.11111, 92, 202.34375, 0.0, 0.0, 0.0, 0.0, 0.0, 3072, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 462, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 225000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [39.555557, 93, 195.3125, 0.0, 0.0, 0.0, 0.0, 0.0, 2873, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 464, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 226000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [40, 93, 204.6875, 0.0, 0.0, 0.0, 0.0, 0.0, 3076, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 466, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 227000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [40.444443, 93, 200, 0.0, 0.0, 0.0, 0.0, 0.0, 3073, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 31.764706, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 468, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 228000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [40, 93, 200, 0.0, 0.0, 0.0, 0.0, 0.0, 3074, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 470, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 229000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [40.444443, 93, 204.6875, 0.0, 0.0, 0.0, 0.0, 0.0, 3074, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 472, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 230000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [40.444443, 93, 197.65625, 0.0, 0.0, 0.0, 0.0, 0.0, 2873, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 474, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 231000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [40.88889, 93, 200, 0.0, 0.0, 0.0, 0.0, 0.0, 3074, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 476, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 232000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [40.444443, 93, 204.6875, 0.0, 0.0, 0.0, 0.0, 0.0, 3074, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 478, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 233000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [40.444443, 94, 200, 0.0, 0.0, 0.0, 0.0, 0.0, 2879, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 480, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 234000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [40.88889, 94, 202.34375, 0.0, 0.0, 0.0, 0.0, 0.0, 3074, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 482, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 235000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [40.444443, 94, 197.65625, 0.0, 0.0, 0.0, 0.0, 0.0, 3079, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 484, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 236000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [40.444443, 94, 200, 0.0, 0.0, 0.0, 0.0, 0.0, 3074, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 486, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 237000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [40.88889, 94, 202.34375, 0.0, 0.0, 0.0, 0.0, 0.0, 3077, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 488, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 238000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [40.88889, 94, 195.3125, 0.0, 0.0, 0.0, 0.0, 0.0, 3073, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 490, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 239000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [41.333332, 94, 197.65625, 0.0, 0.0, 0.0, 0.0, 0.0, 2879, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 492, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 240000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [40.88889, 94, 200, 0.0, 0.0, 0.0, 0.0, 0.0, 3080, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 494, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 241000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [40.88889, 94, 192.96875, 0.0, 0.0, 0.0, 0.0, 0.0, 3072, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 496, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 242000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [41.333332, 94, 197.65625, 0.0, 0.0, 0.0, 0.0, 0.0, 3084, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 31.764706, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 498, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 243000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [41.333332, 94, 192.96875, 0.0, 0.0, 0.0, 0.0, 0.0, 3072, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 500, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 244000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [41.333332, 94, 195.3125, 0.0, 0.0, 0.0, 0.0, 0.0, 2878, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 502, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 245000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [41.333332, 94, 197.65625, 0.0, 0.0, 0.0, 0.0, 0.0, 3082, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 504, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 246000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [41.333332, 94, 195.3125, 0.0, 0.0, 0.0, 0.0, 0.0, 3073, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 506, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 247000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [41.77778, 94, 195.3125, 0.0, 0.0, 0.0, 0.0, 0.0, 3079, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 508, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 248000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [41.333332, 94, 192.96875, 0.0, 0.0, 0.0, 0.0, 0.0, 3075, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 510, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 249000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [41.333332, 94, 190.625, 0.0, 0.0, 0.0, 0.0, 0.0, 2874, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 512, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 250000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [41.333332, 94, 197.65625, 0.0, 0.0, 0.0, 0.0, 0.0, 3079, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 514, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 251000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [42.22222, 94, 192.96875, 0.0, 0.0, 0.0, 0.0, 0.0, 2879, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 31.764706, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 516, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 252000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [41.77778, 94, 192.96875, 0.0, 0.0, 0.0, 0.0, 0.0, 2872, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 518, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 253000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [41.77778, 94, 200, 0.0, 0.0, 0.0, 0.0, 0.0, 3077, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 520, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 254000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [41.77778, 94, 190.625, 0.0, 0.0, 0.0, 0.0, 0.0, 2872, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 31.764706, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 522, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 255000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [41.77778, 94, 195.3125, 0.0, 0.0, 0.0, 0.0, 0.0, 3079, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 524, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 256000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [41.77778, 94, 192.96875, 0.0, 0.0, 0.0, 0.0, 0.0, 2875, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 526, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 257000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [41.77778, 94, 192.96875, 0.0, 0.0, 0.0, 0.0, 0.0, 2879, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 528, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 258000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [42.22222, 94, 197.65625, 0.0, 0.0, 0.0, 0.0, 0.0, 3078, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 31.764706, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 530, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 259000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [41.77778, 94, 192.96875, 0.0, 0.0, 0.0, 0.0, 0.0, 3077, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.156864, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 532, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 260000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [51.555557, 95, 209.375, 0.0, 0.0, 0.0, 0.0, 0.0, 5426, 5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 22.745098, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 534, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 261000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [66.22222, 96, 204.6875, 0.0, 0.0, 0.0, 0.0, 0.0, 9000, 18, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 27.450981, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 536, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 262000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [53.333332, 95, 204.6875, 0.0, 0.0, 0.0, 0.0, 0.0, 7996, 24, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 18.82353, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 538, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 263000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [109.333336, 95, 202.34375, 0.0, 0.0, 0.0, 0.0, 0.0, 6195, 29, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 10.588236, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 540, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 264000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [61.77778, 94, 204.6875, 0.0, 0.0, 0.0, 0.0, 0.0, 12839, 40, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 23.529411, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 542, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 265000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [111.55556, 94, 207.03125, 0.0, 0.0, 0.0, 0.0, 0.0, 10757, 49, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 27.450981, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 544, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 266000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [85.77778, 93, 202.34375, 0.0, 0.0, 0.0, 0.0, 0.0, 12836, 61, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 28.62745, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 546, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 267000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [34.22222, 92, 200, 0.0, 0.0, 0.0, 0.0, 0.0, 10042, 65, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 32.941177, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 548, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 268000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [111.55556, 92, 216.40625, 0.0, 0.0, 0.0, 0.0, 0.0, 9733, 66, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 26.27451, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 550, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 269000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [56.88889, 91, 202.34375, 0.0, 0.0, 0.0, 0.0, 0.0, 10302, 70, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 27.450981, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 552, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 270000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [111.111115, 91, 209.375, 0.0, 0.0, 0.0, 0.0, 0.0, 15104, 73, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 19.215687, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 554, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ },
+ {
+ "timestamp": 271000000,
+ "areaId": 0,
+ "value": {
+ "stringValue": "",
+ "floatValues": [75.111115, 91, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 16423, 86, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ "int32Values": [2, 0, 0, 0, 0, 0, 0, 556, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ },
+ "prop": 299896064
+ }
+]
diff --git a/tests/vehiclehal_test/assets/car_info_test.json b/tests/vehiclehal_test/assets/car_info_test.json
new file mode 100644
index 0000000..90c9bdc
--- /dev/null
+++ b/tests/vehiclehal_test/assets/car_info_test.json
@@ -0,0 +1,20 @@
+[
+ {
+ "timestamp": 1526063903356950016,
+ "areaId": 0,
+ "value": 15000,
+ "prop": 291504388
+ },
+ {
+ "timestamp": 1526063903358950016,
+ "areaId": 0,
+ "value": 150000,
+ "prop": 291504390
+ },
+ {
+ "timestamp": 1526063903360950016,
+ "areaId": 0,
+ "value": "Test Car",
+ "prop": 286261505
+ }
+]
diff --git a/tests/vehiclehal_test/src/com/android/car/vehiclehal/test/CarDiagnosticTest.java b/tests/vehiclehal_test/src/com/android/car/vehiclehal/test/CarDiagnosticTest.java
new file mode 100644
index 0000000..c39683a
--- /dev/null
+++ b/tests/vehiclehal_test/src/com/android/car/vehiclehal/test/CarDiagnosticTest.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.vehiclehal.test;
+
+import static junit.framework.Assert.assertTrue;
+
+import android.car.Car;
+import android.car.diagnostic.CarDiagnosticEvent;
+import android.car.diagnostic.CarDiagnosticManager;
+import android.car.diagnostic.FloatSensorIndex;
+import android.car.diagnostic.IntegerSensorIndex;
+import android.car.hardware.CarPropertyValue;
+import android.car.hardware.CarSensorManager;
+import android.hardware.automotive.vehicle.V2_0.VehiclePropValue;
+import android.hardware.automotive.vehicle.V2_0.VehicleProperty;
+import android.util.Log;
+import android.util.SparseIntArray;
+
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.car.vehiclehal.VehiclePropValueBuilder;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.File;
+import java.time.Duration;
+import java.util.List;
+
+@RunWith(AndroidJUnit4.class)
+@LargeTest
+public class CarDiagnosticTest extends E2eCarTestBase {
+
+ private static final String TAG = Utils.concatTag(CarDiagnosticTest.class);
+
+ private static final Duration TEST_TIME_OUT = Duration.ofMinutes(5);
+
+ private static final String CAR_DIAGNOSTIC_TEST_JSON = "car_diagnostic_test.json";
+
+ private static final SparseIntArray DIAGNOSTIC_PROPERTY_MAP;
+
+ static {
+ DIAGNOSTIC_PROPERTY_MAP = new SparseIntArray();
+ DIAGNOSTIC_PROPERTY_MAP.append(
+ CarDiagnosticManager.FRAME_TYPE_LIVE, VehicleProperty.OBD2_LIVE_FRAME);
+ DIAGNOSTIC_PROPERTY_MAP.append(
+ CarDiagnosticManager.FRAME_TYPE_FREEZE, VehicleProperty.OBD2_FREEZE_FRAME);
+ }
+
+ private class CarDiagnosticListner implements CarDiagnosticManager.OnDiagnosticEventListener {
+
+ private VhalEventVerifier mVerifier;
+
+ CarDiagnosticListner(VhalEventVerifier verifier) {
+ mVerifier = verifier;
+ }
+
+ @Override
+ public void onDiagnosticEvent(CarDiagnosticEvent event) {
+ mVerifier.verify(fromCarDiagnosticEvent(event));
+ }
+ }
+
+ private static CarPropertyValue<VehiclePropValue.RawValue> fromCarDiagnosticEvent(
+ final CarDiagnosticEvent event) {
+ int prop = DIAGNOSTIC_PROPERTY_MAP.get(event.frameType);
+ VehiclePropValueBuilder builder = VehiclePropValueBuilder.newBuilder(prop);
+
+ for (int i = 0; i <= IntegerSensorIndex.LAST_SYSTEM; i++) {
+ builder.addIntValue(event.getSystemIntegerSensor(i, 0));
+ }
+ for (int i = 0; i <= FloatSensorIndex.LAST_SYSTEM; i++) {
+ builder.addFloatValue(event.getSystemFloatSensor(i, 0));
+ }
+
+ builder.setStringValue(event.dtc);
+ return new CarPropertyValue<>(prop, 0, builder.build().value);
+ }
+
+ @Test
+ public void testDiagnosticEvents() throws Exception {
+ Log.d(TAG, "Prepare Diagnostic test data");
+ List<CarPropertyValue> expectedEvents = getExpectedEvents(CAR_DIAGNOSTIC_TEST_JSON);
+ VhalEventVerifier verifier = new VhalEventVerifier(expectedEvents);
+
+ CarDiagnosticManager diagnosticManager = (CarDiagnosticManager) mCar.getCarManager(
+ Car.DIAGNOSTIC_SERVICE);
+
+ CarDiagnosticListner listner = new CarDiagnosticListner(verifier);
+
+ assertTrue("Failed to register for OBD2 diagnostic live frame.",
+ diagnosticManager.registerListener(listner,
+ CarDiagnosticManager.FRAME_TYPE_LIVE,
+ CarSensorManager.SENSOR_RATE_NORMAL));
+ assertTrue("Failed to register for OBD2 diagnostic freeze frame.",
+ diagnosticManager.registerListener(listner,
+ CarDiagnosticManager.FRAME_TYPE_FREEZE,
+ CarSensorManager.SENSOR_RATE_NORMAL));
+
+ File sharedJson = makeShareable(CAR_DIAGNOSTIC_TEST_JSON);
+ Log.d(TAG, "Send command to VHAL to start generation");
+ VhalEventGenerator diagnosticGenerator =
+ new JsonVhalEventGenerator(mVehicle).setJsonFile(sharedJson);
+ diagnosticGenerator.start();
+
+ Log.d(TAG, "Receiving and verifying VHAL events");
+ verifier.waitForEnd(TEST_TIME_OUT.toMillis());
+
+ Log.d(TAG, "Send command to VHAL to stop generation");
+ diagnosticGenerator.stop();
+ diagnosticManager.unregisterListener(listner);
+
+ assertTrue("Detected mismatched events: " + verifier.getResultString(),
+ verifier.getMismatchedEvents().isEmpty());
+ }
+}
diff --git a/tests/vehiclehal_test/src/com/android/car/vehiclehal/test/CarHvacTest.java b/tests/vehiclehal_test/src/com/android/car/vehiclehal/test/CarHvacTest.java
deleted file mode 100644
index 08544bd..0000000
--- a/tests/vehiclehal_test/src/com/android/car/vehiclehal/test/CarHvacTest.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.car.vehiclehal.test;
-
-import static org.junit.Assert.assertTrue;
-
-import static java.lang.Integer.toHexString;
-
-import android.car.Car;
-import android.car.hardware.CarPropertyConfig;
-import android.car.hardware.CarPropertyValue;
-import android.car.hardware.hvac.CarHvacManager;
-import android.car.hardware.hvac.CarHvacManager.CarHvacEventCallback;
-import android.hardware.automotive.vehicle.V2_0.VehiclePropValue;
-import android.hardware.automotive.vehicle.V2_0.VehicleProperty;
-import android.support.test.filters.LargeTest;
-import android.support.test.runner.AndroidJUnit4;
-import android.util.ArraySet;
-import android.util.Log;
-
-import org.junit.Assert;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.io.File;
-import java.time.Duration;
-import java.util.Set;
-
-
-/**
- * The test suite will execute end-to-end Car HVAC API test by generating HVAC property data from
- * default VHAL and verify those data on the fly. The test data is coming from assets/ folder in the
- * test APK and will be shared with VHAL to execute the test.
- */
-@RunWith(AndroidJUnit4.class)
-@LargeTest
-public class CarHvacTest extends E2eCarTestBase {
- private static final String TAG = Utils.concatTag(CarHvacTest.class);
-
- // Test should be completed within 1 hour as it only covers a finite set of HVAC properties
- private static final Duration TEST_TIME_OUT = Duration.ofHours(1);
-
- private static final String CAR_HVAC_TEST_JSON = "car_hvac_test.json";
-
- // Referred to hardware/interfaces/automotive/vehicle/2.0/types.hal, some of the HVAC properties
- // are in CONTINUOUS mode. They should be omitted when testing ON_CHANGE properties.
- private static final Set<Integer> CONTINUOUS_HVAC_PROPS;
-
- private Integer mNumPropEventsToSkip;
-
- static {
- CONTINUOUS_HVAC_PROPS = new ArraySet<>();
- CONTINUOUS_HVAC_PROPS.add(VehicleProperty.ENV_OUTSIDE_TEMPERATURE);
- }
-
-
- private class CarHvacOnChangeEventListener implements CarHvacEventCallback {
- private VhalEventVerifier mVerifier;
-
- CarHvacOnChangeEventListener(VhalEventVerifier verifier) {
- mVerifier = verifier;
- }
-
- @Override
- public void onChangeEvent(CarPropertyValue carPropertyValue) {
- VehiclePropValue event = Utils.fromHvacPropertyValue(carPropertyValue);
- if (!CONTINUOUS_HVAC_PROPS.contains(event.prop)) {
- synchronized (mNumPropEventsToSkip) {
- if (mNumPropEventsToSkip == 0) {
- mVerifier.verify(Utils.fromHvacPropertyValue(carPropertyValue));
- } else {
- mNumPropEventsToSkip--;
- }
- }
- }
- }
-
- @Override
- public void onErrorEvent(final int propertyId, final int zone) {
- Assert.fail("Error: propertyId=" + toHexString(propertyId) + " zone=" + zone);
- }
- }
-
- private Integer calculateNumPropEventsToSkip(CarHvacManager hvacMgr) {
- int numToSkip = 0;
- try {
- for (CarPropertyConfig c: hvacMgr.getPropertyList()) {
- if (!CONTINUOUS_HVAC_PROPS.contains(c.getPropertyId())) {
- numToSkip += c.getAreaCount();
- }
- }
- } catch (Exception e) {
- Log.d(TAG, "Unhandled exception thrown: ", e);
- }
- return Integer.valueOf(numToSkip);
- }
- @Test
- public void testHvacOperations() throws Exception {
- Log.d(TAG, "Prepare HVAC test data");
- VhalEventVerifier verifier = new VhalEventVerifier(getExpectedEvents(CAR_HVAC_TEST_JSON));
- File sharedJson = makeShareable(CAR_HVAC_TEST_JSON);
-
- Log.d(TAG, "Start listening to the HAL");
- CarHvacManager hvacMgr = (CarHvacManager) mCar.getCarManager(Car.HVAC_SERVICE);
- // Calculate number of properties to skip due to registration event
- mNumPropEventsToSkip = calculateNumPropEventsToSkip(hvacMgr);
- CarHvacEventCallback callback = new CarHvacOnChangeEventListener(verifier);
- hvacMgr.registerCallback(callback);
-
- Log.d(TAG, "Send command to VHAL to start generation");
- VhalEventGenerator hvacGenerator =
- new JsonVhalEventGenerator(mVehicle).setJsonFile(sharedJson);
- hvacGenerator.start();
-
- Log.d(TAG, "Receiving and verifying VHAL events");
- verifier.waitForEnd(TEST_TIME_OUT.toMillis());
-
- Log.d(TAG, "Send command to VHAL to stop generation");
- hvacGenerator.stop();
- hvacMgr.unregisterCallback(callback);
-
- assertTrue("Detected mismatched events: " + verifier.getResultString(),
- verifier.getMismatchedEvents().isEmpty());
- }
-}
diff --git a/tests/vehiclehal_test/src/com/android/car/vehiclehal/test/CarPropertyTest.java b/tests/vehiclehal_test/src/com/android/car/vehiclehal/test/CarPropertyTest.java
new file mode 100644
index 0000000..e47c733
--- /dev/null
+++ b/tests/vehiclehal_test/src/com/android/car/vehiclehal/test/CarPropertyTest.java
@@ -0,0 +1,207 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.car.vehiclehal.test;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import android.car.Car;
+import android.car.hardware.CarPropertyConfig;
+import android.car.hardware.CarPropertyValue;
+import android.car.hardware.property.CarPropertyManager;
+import android.util.ArraySet;
+import android.util.Log;
+
+import androidx.test.filters.LargeTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static java.lang.Integer.toHexString;
+
+import java.io.File;
+import java.time.Duration;
+import java.util.List;
+
+/**
+ * The test suite will execute end-to-end Car Property API test by generating VHAL property data
+ * from default VHAL and verify those data on the fly. The test data is coming from assets/ folder
+ * in the test APK and will be shared with VHAL to execute the test.
+ */
+@RunWith(AndroidJUnit4.class)
+@LargeTest
+public class CarPropertyTest extends E2eCarTestBase {
+
+ private static final String TAG = Utils.concatTag(CarPropertyTest.class);
+
+ // Test should be completed within 10 minutes as it only covers a finite set of properties
+ private static final Duration TEST_TIME_OUT = Duration.ofMinutes(10);
+
+ private static final String CAR_HVAC_TEST_JSON = "car_hvac_test.json";
+ private static final String CAR_INFO_TEST_JSON = "car_info_test.json";
+
+ private class CarPropertyEventReceiver implements
+ CarPropertyManager.CarPropertyEventListener {
+
+ private VhalEventVerifier mVerifier;
+ private Integer mNumOfEventToSkip;
+
+ CarPropertyEventReceiver(VhalEventVerifier verifier, int numOfEventToSkip) {
+ mVerifier = verifier;
+ mNumOfEventToSkip = numOfEventToSkip;
+ }
+
+ @Override
+ public void onChangeEvent(CarPropertyValue carPropertyValue) {
+ Log.d(TAG, "Received event: " + carPropertyValue);
+ synchronized (mNumOfEventToSkip) {
+ if (mNumOfEventToSkip > 0) {
+ mNumOfEventToSkip--;
+ return;
+ }
+ }
+ mVerifier.verify(carPropertyValue);
+ }
+
+ @Override
+ public void onErrorEvent(final int propertyId, final int zone) {
+ Assert.fail("Error: propertyId=" + toHexString(propertyId) + " zone=" + zone);
+ }
+ }
+
+ private int countNumPropEventsToSkip(CarPropertyManager propMgr, ArraySet<Integer> props) {
+ int numToSkip = 0;
+ for (CarPropertyConfig c : propMgr.getPropertyList(props)) {
+ numToSkip += c.getAreaCount();
+ }
+ return numToSkip;
+ }
+
+ /**
+ * This test will let Default VHAL to generate HVAC data and verify on-the-fly in the test. It
+ * is simulating the HVAC actions coming from hard buttons in a car.
+ * @throws Exception
+ */
+ @Test
+ public void testHvacHardButtonOperations() throws Exception {
+ Log.d(TAG, "Prepare HVAC test data");
+ List<CarPropertyValue> expectedEvents = getExpectedEvents(CAR_HVAC_TEST_JSON);
+ VhalEventVerifier verifier = new VhalEventVerifier(expectedEvents);
+
+ CarPropertyManager propMgr = (CarPropertyManager) mCar.getCarManager(Car.PROPERTY_SERVICE);
+ assertNotNull("CarPropertyManager is null", propMgr);
+
+ ArraySet<Integer> props = new ArraySet<>();
+ for (CarPropertyValue event : expectedEvents) {
+ if (!props.contains(event.getPropertyId())) {
+ props.add(event.getPropertyId());
+ }
+ }
+
+ int numToSkip = countNumPropEventsToSkip(propMgr, props);
+ Log.d(TAG, String.format("Start listening to the HAL."
+ + " Skipping %d events for listener registration", numToSkip));
+ CarPropertyManager.CarPropertyEventListener receiver =
+ new CarPropertyEventReceiver(verifier, numToSkip);
+ for (Integer prop : props) {
+ propMgr.registerListener(receiver, prop, 0);
+ }
+
+ File sharedJson = makeShareable(CAR_HVAC_TEST_JSON);
+ Log.d(TAG, "Send command to VHAL to start generation");
+ VhalEventGenerator hvacGenerator =
+ new JsonVhalEventGenerator(mVehicle).setJsonFile(sharedJson);
+ hvacGenerator.start();
+
+ Log.d(TAG, "Receiving and verifying VHAL events");
+ verifier.waitForEnd(TEST_TIME_OUT.toMillis());
+
+ Log.d(TAG, "Send command to VHAL to stop generation");
+ hvacGenerator.stop();
+ propMgr.unregisterListener(receiver);
+
+ assertTrue("Detected mismatched events: " + verifier.getResultString(),
+ verifier.getMismatchedEvents().isEmpty());
+ }
+
+ /**
+ * This test will exercise on "set" calls to inject HVAC data in order to test the Car Property
+ * API end-to-end functionality.
+ * @throws Exception
+ */
+ @Test
+ @SuppressWarnings("unchecked")
+ public void testHvacSetGetOperations() throws Exception {
+ Log.d(TAG, "Prepare HVAC test data");
+ List<CarPropertyValue> expectedEvents = getExpectedEvents(CAR_HVAC_TEST_JSON);
+
+ CarPropertyManager propMgr = (CarPropertyManager) mCar.getCarManager(Car.PROPERTY_SERVICE);
+ assertNotNull("CarPropertyManager is null", propMgr);
+
+ final long waitForSetMillisecond = 2;
+ for (CarPropertyValue expectedEvent : expectedEvents) {
+ Class valueClass = expectedEvent.getValue().getClass();
+ propMgr.setProperty(valueClass,
+ expectedEvent.getPropertyId(),
+ expectedEvent.getAreaId(),
+ expectedEvent.getValue());
+
+ Thread.sleep(waitForSetMillisecond);
+ CarPropertyValue receivedEvent = propMgr.getProperty(valueClass,
+ expectedEvent.getPropertyId(), expectedEvent.getAreaId());
+ assertTrue("Mismatched events, expected: " + expectedEvent + ", received: "
+ + receivedEvent, Utils.areCarPropertyValuesEqual(expectedEvent, receivedEvent));
+ }
+ }
+
+ /**
+ * This test will load static vehicle information from test data file and verify them through
+ * get calls.
+ * @throws Exception
+ */
+ @Test
+ public void testStaticInfoOperations() throws Exception {
+ Log.d(TAG, "Prepare static car information");
+
+ List<CarPropertyValue> expectedEvents = getExpectedEvents(CAR_INFO_TEST_JSON);
+ CarPropertyManager propMgr = (CarPropertyManager) mCar.getCarManager(Car.PROPERTY_SERVICE);
+ assertNotNull("CarPropertyManager is null", propMgr);
+
+ File sharedJson = makeShareable(CAR_INFO_TEST_JSON);
+ Log.d(TAG, "Send command to VHAL to start generation");
+ VhalEventGenerator infoGenerator =
+ new JsonVhalEventGenerator(mVehicle).setJsonFile(sharedJson);
+ infoGenerator.start();
+
+ // Wait for some time to ensure information is all loaded
+ // It is assuming the test data is not very large
+ Thread.sleep(2000);
+
+ Log.d(TAG, "Send command to VHAL to stop generation");
+ infoGenerator.stop();
+
+ for (CarPropertyValue expectedEvent : expectedEvents) {
+ CarPropertyValue actualEvent = propMgr.getProperty(
+ expectedEvent.getPropertyId(), expectedEvent.getAreaId());
+ assertTrue(String.format(
+ "Mismatched car information data, actual: %s, expected: %s",
+ actualEvent, expectedEvent),
+ Utils.areCarPropertyValuesEqual(actualEvent, expectedEvent));
+ }
+ }
+}
diff --git a/tests/vehiclehal_test/src/com/android/car/vehiclehal/test/E2eCarTestBase.java b/tests/vehiclehal_test/src/com/android/car/vehiclehal/test/E2eCarTestBase.java
index 5960422..d78713f 100644
--- a/tests/vehiclehal_test/src/com/android/car/vehiclehal/test/E2eCarTestBase.java
+++ b/tests/vehiclehal_test/src/com/android/car/vehiclehal/test/E2eCarTestBase.java
@@ -19,18 +19,19 @@
import static org.junit.Assume.assumeTrue;
import android.car.Car;
+import android.car.hardware.CarPropertyValue;
import android.content.ComponentName;
import android.content.Context;
import android.content.ServiceConnection;
import android.hardware.automotive.vehicle.V2_0.IVehicle;
import android.hardware.automotive.vehicle.V2_0.StatusCode;
-import android.hardware.automotive.vehicle.V2_0.VehiclePropValue;
import android.os.ConditionVariable;
import android.os.FileUtils;
import android.os.IBinder;
-import android.support.test.InstrumentationRegistry;
import android.util.Log;
+import androidx.test.InstrumentationRegistry;
+
import com.google.android.collect.Lists;
import org.json.JSONException;
@@ -44,7 +45,6 @@
import java.io.OutputStream;
import java.util.List;
-
public class E2eCarTestBase {
private static final String TAG = Utils.concatTag(E2eCarTestBase.class);
private static final int DEFAULT_WAIT_TIMEOUT_MS = 1000;
@@ -82,7 +82,7 @@
}
}
- protected List<VehiclePropValue> getExpectedEvents(String fileName)
+ protected List<CarPropertyValue> getExpectedEvents(String fileName)
throws IOException, JSONException {
try (InputStream in = mContext.getAssets().open(fileName)) {
Log.d(TAG, "Reading golden test data" + fileName);
diff --git a/tests/vehiclehal_test/src/com/android/car/vehiclehal/test/E2ePerformanceTest.java b/tests/vehiclehal_test/src/com/android/car/vehiclehal/test/E2ePerformanceTest.java
index 6427a07..d2f6669 100644
--- a/tests/vehiclehal_test/src/com/android/car/vehiclehal/test/E2ePerformanceTest.java
+++ b/tests/vehiclehal_test/src/com/android/car/vehiclehal/test/E2ePerformanceTest.java
@@ -21,8 +21,6 @@
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
-import static java.lang.Integer.toHexString;
-
import android.annotation.Nullable;
import android.car.Car;
import android.car.CarNotConnectedException;
@@ -32,17 +30,20 @@
import android.car.hardware.hvac.CarHvacManager;
import android.hardware.automotive.vehicle.V2_0.VehicleProperty;
import android.os.SystemClock;
-import android.support.test.filters.MediumTest;
-import android.support.test.runner.AndroidJUnit4;
import android.util.Log;
import android.util.SparseArray;
import android.util.SparseIntArray;
+import androidx.test.filters.MediumTest;
+import androidx.test.runner.AndroidJUnit4;
+
import com.google.android.collect.Lists;
import org.junit.Test;
import org.junit.runner.RunWith;
+import static java.lang.Integer.toHexString;
+
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
diff --git a/tests/vehiclehal_test/src/com/android/car/vehiclehal/test/JsonVhalEventGenerator.java b/tests/vehiclehal_test/src/com/android/car/vehiclehal/test/JsonVhalEventGenerator.java
index 702f5f0..4560b8c 100644
--- a/tests/vehiclehal_test/src/com/android/car/vehiclehal/test/JsonVhalEventGenerator.java
+++ b/tests/vehiclehal_test/src/com/android/car/vehiclehal/test/JsonVhalEventGenerator.java
@@ -28,6 +28,9 @@
class JsonVhalEventGenerator implements VhalEventGenerator {
+ // Exactly one iteration is required for JSON-based end-to-end test
+ private static final int NUM_OF_ITERATION = 1;
+
private IVehicle mVehicle;
private File mFile;
@@ -47,7 +50,7 @@
public void start() throws RemoteException {
VehiclePropValue request =
VehiclePropValueBuilder.newBuilder(GENERATE_FAKE_DATA_CONTROLLING_PROPERTY)
- .addIntValue(CMD_START_JSON)
+ .addIntValue(CMD_START_JSON, NUM_OF_ITERATION)
.setStringValue(mFile.getAbsolutePath())
.build();
assertEquals(StatusCode.OK, mVehicle.set(request));
@@ -58,6 +61,7 @@
VehiclePropValue request =
VehiclePropValueBuilder.newBuilder(GENERATE_FAKE_DATA_CONTROLLING_PROPERTY)
.addIntValue(CMD_STOP_JSON)
+ .setStringValue(mFile.getAbsolutePath())
.build();
assertEquals(StatusCode.OK, mVehicle.set(request));
}
diff --git a/tests/vehiclehal_test/src/com/android/car/vehiclehal/test/Utils.java b/tests/vehiclehal_test/src/com/android/car/vehiclehal/test/Utils.java
index 6a4b496..496b504 100644
--- a/tests/vehiclehal_test/src/com/android/car/vehiclehal/test/Utils.java
+++ b/tests/vehiclehal_test/src/com/android/car/vehiclehal/test/Utils.java
@@ -16,13 +16,10 @@
package com.android.car.vehiclehal.test;
-import static java.lang.Integer.toHexString;
-
import android.car.hardware.CarPropertyValue;
import android.hardware.automotive.vehicle.V2_0.IVehicle;
import android.hardware.automotive.vehicle.V2_0.VehiclePropConfig;
import android.hardware.automotive.vehicle.V2_0.VehiclePropValue;
-import android.os.HidlSupport;
import android.os.RemoteException;
import android.util.Log;
@@ -102,55 +99,13 @@
* @param value2
* @return true if equal
*/
- static boolean areVehiclePropValuesEqual(final VehiclePropValue value1,
- final VehiclePropValue value2) {
+ static boolean areCarPropertyValuesEqual(final CarPropertyValue value1,
+ final CarPropertyValue value2) {
return value1 == value2
|| value1 != null
&& value2 != null
- && value1.prop == value2.prop
- && value1.areaId == value2.areaId
- && HidlSupport.deepEquals(value1.value, value2.value);
- }
-
- /**
- * The method will convert prop ID to hexadecimal format, and omit timestamp and status
- *
- * @param value
- * @return String
- */
- static String vehiclePropValueToString(final VehiclePropValue value) {
- return "{.prop = 0x" + toHexString(value.prop)
- + ", .areaId = " + value.areaId
- + ", .value = " + value.value + "}";
- }
-
- static VehiclePropValue fromHvacPropertyValue(CarPropertyValue value) {
- VehiclePropValueBuilder builder =
- VehiclePropValueBuilder.newBuilder(
- VhalPropMaps.getHvacVhalProp(value.getPropertyId()));
- return fromCarPropertyValue(value, builder);
- }
-
- private static VehiclePropValue fromCarPropertyValue(
- CarPropertyValue value, VehiclePropValueBuilder builder) {
- builder.setAreaId(value.getAreaId()).setTimestamp(value.getTimestamp());
-
- //TODO: Consider move this conversion to VehiclePropValueBuilder
- Object o = value.getValue();
- if (o instanceof Boolean) {
- builder.addIntValue((boolean) o ? 1 : 0);
- } else if (o instanceof Integer) {
- builder.addIntValue((int) o);
- } else if (o instanceof Float) {
- builder.addFloatValue((float) o);
- } else if (o instanceof Long) {
- builder.setInt64Value((long) o);
- } else if (o instanceof String) {
- builder.setStringValue((String) o);
- } else { //TODO: Add support for MIXED type
- throw new IllegalArgumentException("Unrecognized car property value type, "
- + o.getClass());
- }
- return builder.build();
+ && value1.getPropertyId() == value2.getPropertyId()
+ && value1.getAreaId() == value2.getAreaId()
+ && value1.getValue().equals(value2.getValue());
}
}
diff --git a/tests/vehiclehal_test/src/com/android/car/vehiclehal/test/VhalEventVerifier.java b/tests/vehiclehal_test/src/com/android/car/vehiclehal/test/VhalEventVerifier.java
index 5ac92ca..62dbf5c 100644
--- a/tests/vehiclehal_test/src/com/android/car/vehiclehal/test/VhalEventVerifier.java
+++ b/tests/vehiclehal_test/src/com/android/car/vehiclehal/test/VhalEventVerifier.java
@@ -15,7 +15,7 @@
*/
package com.android.car.vehiclehal.test;
-import android.hardware.automotive.vehicle.V2_0.VehiclePropValue;
+import android.car.hardware.CarPropertyValue;
import android.os.ConditionVariable;
import java.util.ArrayList;
@@ -28,7 +28,7 @@
* The verifier will provide formatted result for all mismatched events in sequence.
*/
class VhalEventVerifier {
- private List<VehiclePropValue> mExpectedEvents;
+ private List<CarPropertyValue> mExpectedEvents;
// A pointer to keep track of the next expected event in the list
private int mIdx;
private List<MismatchedEventPair> mMismatchedEvents;
@@ -37,10 +37,10 @@
static class MismatchedEventPair {
public final int idx;
- public final VehiclePropValue expectedEvent;
- public final VehiclePropValue mismatchedEvent;
+ public final CarPropertyValue expectedEvent;
+ public final CarPropertyValue mismatchedEvent;
- MismatchedEventPair(VehiclePropValue expectedEvent, VehiclePropValue mismatchedEvent,
+ MismatchedEventPair(CarPropertyValue expectedEvent, CarPropertyValue mismatchedEvent,
int idx) {
this.idx = idx;
this.expectedEvent = expectedEvent;
@@ -48,7 +48,7 @@
}
}
- VhalEventVerifier(List<VehiclePropValue> expectedEvents) {
+ VhalEventVerifier(List<CarPropertyValue> expectedEvents) {
mExpectedEvents = expectedEvents;
mIdx = 0;
mMismatchedEvents = new ArrayList<>();
@@ -62,12 +62,12 @@
*
* @param nextEvent to be verified
*/
- public void verify(VehiclePropValue nextEvent) {
+ public void verify(CarPropertyValue nextEvent) {
if (mIdx >= mExpectedEvents.size()) {
return;
}
- VehiclePropValue expectedEvent = mExpectedEvents.get(mIdx);
- if (!Utils.areVehiclePropValuesEqual(expectedEvent, nextEvent)) {
+ CarPropertyValue expectedEvent = mExpectedEvents.get(mIdx);
+ if (!Utils.areCarPropertyValuesEqual(expectedEvent, nextEvent)) {
mMismatchedEvents.add(new MismatchedEventPair(expectedEvent, nextEvent, mIdx));
}
if (++mIdx == mExpectedEvents.size()) {
@@ -87,8 +87,8 @@
StringBuilder resultBuilder = new StringBuilder();
for (MismatchedEventPair pair : mMismatchedEvents) {
resultBuilder.append("Index " + pair.idx + ": Expected "
- + Utils.vehiclePropValueToString(pair.expectedEvent) + ", Received "
- + Utils.vehiclePropValueToString(pair.mismatchedEvent) + "\n");
+ + pair.expectedEvent + ", Received "
+ + pair.mismatchedEvent + "\n");
}
return resultBuilder.toString();
}
diff --git a/tests/vehiclehal_test/src/com/android/car/vehiclehal/test/VhalJsonReader.java b/tests/vehiclehal_test/src/com/android/car/vehiclehal/test/VhalJsonReader.java
index bf4e32f..7731273 100644
--- a/tests/vehiclehal_test/src/com/android/car/vehiclehal/test/VhalJsonReader.java
+++ b/tests/vehiclehal_test/src/com/android/car/vehiclehal/test/VhalJsonReader.java
@@ -17,7 +17,7 @@
import static java.lang.Integer.toHexString;
-import android.hardware.automotive.vehicle.V2_0.VehiclePropValue;
+import android.car.hardware.CarPropertyValue;
import android.hardware.automotive.vehicle.V2_0.VehiclePropertyType;
import com.android.car.vehiclehal.VehiclePropValueBuilder;
@@ -44,11 +44,15 @@
private static final String JSON_FIELD_AREA_ID = "areaId";
private static final String JSON_FIELD_TIMESTAMP = "timestamp";
private static final String JSON_FIELD_VALUE = "value";
+ private static final String JSON_FIELD_INT32_VALUES = "int32Values";
+ private static final String JSON_FIELD_INT64_VALUES = "int64Values";
+ private static final String JSON_FIELD_FLOAT_VALUES = "floatValues";
+ private static final String JSON_FIELD_STRING_VALUE = "stringValue";
- public static List<VehiclePropValue> readFromJson(InputStream in)
+ public static List<CarPropertyValue> readFromJson(InputStream in)
throws IOException, JSONException {
JSONArray rawEvents = new JSONArray(readJsonString(in));
- List<VehiclePropValue> events = new ArrayList<>();
+ List<CarPropertyValue> events = new ArrayList<>();
for (int i = 0; i < rawEvents.length(); i++) {
events.add(getEvent(rawEvents.getJSONObject(i)));
}
@@ -64,32 +68,64 @@
return builder.toString();
}
- private static VehiclePropValue getEvent(JSONObject rawEvent) throws JSONException {
+ private static CarPropertyValue<?> getEvent(JSONObject rawEvent) throws JSONException {
int prop = rawEvent.getInt(JSON_FIELD_PROP);
- VehiclePropValueBuilder builder = VehiclePropValueBuilder.newBuilder(prop)
- .setAreaId(rawEvent.getInt(JSON_FIELD_AREA_ID))
- .setTimestamp(rawEvent.getLong(JSON_FIELD_TIMESTAMP));
+ int areaId = rawEvent.getInt(JSON_FIELD_AREA_ID);
+ long timestamp = rawEvent.getLong(JSON_FIELD_TIMESTAMP);
switch (prop & VehiclePropertyType.MASK) {
case VehiclePropertyType.BOOLEAN:
+ return new CarPropertyValue<>(prop, areaId, CarPropertyValue.STATUS_AVAILABLE,
+ timestamp, rawEvent.getInt(JSON_FIELD_VALUE) != 0);
case VehiclePropertyType.INT32:
- builder.addIntValue(rawEvent.getInt(JSON_FIELD_VALUE));
- break;
+ return new CarPropertyValue<>(prop, areaId, CarPropertyValue.STATUS_AVAILABLE,
+ timestamp, rawEvent.getInt(JSON_FIELD_VALUE));
case VehiclePropertyType.INT64:
- builder.setInt64Value(rawEvent.getLong(JSON_FIELD_VALUE));
- break;
+ return new CarPropertyValue<>(prop, areaId, CarPropertyValue.STATUS_AVAILABLE,
+ timestamp, rawEvent.getLong(JSON_FIELD_VALUE));
case VehiclePropertyType.FLOAT:
- builder.addFloatValue((float) rawEvent.getDouble(JSON_FIELD_VALUE));
- break;
+ return new CarPropertyValue<>(prop, areaId,
+ CarPropertyValue.STATUS_AVAILABLE, timestamp,
+ (float) rawEvent.getDouble(JSON_FIELD_VALUE));
case VehiclePropertyType.STRING:
- builder.setStringValue(rawEvent.getString(JSON_FIELD_VALUE));
- break;
- //TODO: Add VehiclePropertyType.MIXED type support
+ return new CarPropertyValue<>(prop, areaId, CarPropertyValue.STATUS_AVAILABLE,
+ timestamp, rawEvent.getString(JSON_FIELD_VALUE));
+ // TODO: CarPropertyValue API has not supported VehiclePropertyType.MIXED type yet.
+ // Here is a temporary solution to use VehiclePropValue.RawValue
+ case VehiclePropertyType.MIXED:
+ VehiclePropValueBuilder builder = VehiclePropValueBuilder.newBuilder(prop);
+ JSONObject rawValueJson = rawEvent.getJSONObject(JSON_FIELD_VALUE);
+ copyValuesArray(
+ builder, rawValueJson.optJSONArray(JSON_FIELD_INT32_VALUES), Integer.class);
+ copyValuesArray(
+ builder, rawValueJson.optJSONArray(JSON_FIELD_INT64_VALUES), Long.class);
+ copyValuesArray(
+ builder, rawValueJson.optJSONArray(JSON_FIELD_FLOAT_VALUES), Float.class);
+ builder.setStringValue(rawValueJson.getString(JSON_FIELD_STRING_VALUE));
+
+ return new CarPropertyValue<>(prop, areaId, CarPropertyValue.STATUS_AVAILABLE,
+ timestamp, builder.build().value);
default:
throw new IllegalArgumentException("Property type 0x"
+ toHexString(prop & VehiclePropertyType.MASK)
+ " is not supported in the test.");
}
- return builder.build();
+ }
+
+ private static void copyValuesArray(VehiclePropValueBuilder builder, JSONArray jsonArray,
+ Class clazz) throws JSONException {
+ if (jsonArray == null) {
+ return;
+ }
+ for (int i = 0; i < jsonArray.length(); i++) {
+ if (clazz == Integer.class) {
+ builder.addIntValue(jsonArray.getInt(i));
+ } else if (clazz == Long.class) {
+ // It is really "add" the value
+ builder.setInt64Value(jsonArray.getLong(i));
+ } else if (clazz == Float.class) {
+ builder.addFloatValue((float) jsonArray.getDouble(i));
+ } // TODO: Add support for byte array if required
+ }
}
}
diff --git a/tests/vehiclehal_test/src/com/android/car/vehiclehal/test/VhalPropMaps.java b/tests/vehiclehal_test/src/com/android/car/vehiclehal/test/VhalPropMaps.java
deleted file mode 100644
index f24cad6..0000000
--- a/tests/vehiclehal_test/src/com/android/car/vehiclehal/test/VhalPropMaps.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.car.vehiclehal.test;
-
-import android.car.hardware.hvac.CarHvacManager;
-import android.hardware.automotive.vehicle.V2_0.VehicleProperty;
-import android.util.SparseIntArray;
-
-class VhalPropMaps {
-
- private static final SparseIntArray HVAC_PROP_MAP;
-
- static {
- HVAC_PROP_MAP = new SparseIntArray();
- HVAC_PROP_MAP.put(CarHvacManager.ID_MIRROR_DEFROSTER_ON,
- VehicleProperty.HVAC_SIDE_MIRROR_HEAT);
- HVAC_PROP_MAP.put(CarHvacManager.ID_STEERING_WHEEL_HEAT,
- VehicleProperty.HVAC_STEERING_WHEEL_HEAT);
- HVAC_PROP_MAP.put(CarHvacManager.ID_OUTSIDE_AIR_TEMP,
- VehicleProperty.ENV_OUTSIDE_TEMPERATURE);
- HVAC_PROP_MAP.put(CarHvacManager.ID_TEMPERATURE_DISPLAY_UNITS,
- VehicleProperty.HVAC_TEMPERATURE_DISPLAY_UNITS);
- HVAC_PROP_MAP.put(CarHvacManager.ID_ZONED_TEMP_SETPOINT,
- VehicleProperty.HVAC_TEMPERATURE_SET);
- HVAC_PROP_MAP.put(CarHvacManager.ID_ZONED_TEMP_ACTUAL,
- VehicleProperty.HVAC_TEMPERATURE_CURRENT);
- HVAC_PROP_MAP.put(CarHvacManager.ID_ZONED_FAN_SPEED_SETPOINT,
- VehicleProperty.HVAC_FAN_SPEED);
- HVAC_PROP_MAP.put(CarHvacManager.ID_ZONED_FAN_SPEED_RPM,
- VehicleProperty.HVAC_ACTUAL_FAN_SPEED_RPM);
- HVAC_PROP_MAP.put(CarHvacManager.ID_ZONED_FAN_DIRECTION_AVAILABLE,
- VehicleProperty.HVAC_FAN_DIRECTION_AVAILABLE);
- HVAC_PROP_MAP.put(CarHvacManager.ID_ZONED_FAN_DIRECTION,
- VehicleProperty.HVAC_FAN_DIRECTION);
- HVAC_PROP_MAP.put(CarHvacManager.ID_ZONED_SEAT_TEMP,
- VehicleProperty.HVAC_SEAT_TEMPERATURE);
- HVAC_PROP_MAP.put(CarHvacManager.ID_ZONED_AC_ON,
- VehicleProperty.HVAC_AC_ON);
- HVAC_PROP_MAP.put(CarHvacManager.ID_ZONED_AUTOMATIC_MODE_ON,
- VehicleProperty.HVAC_AUTO_ON);
- HVAC_PROP_MAP.put(CarHvacManager.ID_ZONED_AIR_RECIRCULATION_ON,
- VehicleProperty.HVAC_RECIRC_ON);
- HVAC_PROP_MAP.put(CarHvacManager.ID_ZONED_MAX_AC_ON,
- VehicleProperty.HVAC_MAX_AC_ON);
- HVAC_PROP_MAP.put(CarHvacManager.ID_ZONED_DUAL_ZONE_ON,
- VehicleProperty.HVAC_DUAL_ON);
- HVAC_PROP_MAP.put(CarHvacManager.ID_ZONED_MAX_DEFROST_ON,
- VehicleProperty.HVAC_MAX_DEFROST_ON);
- HVAC_PROP_MAP.put(CarHvacManager.ID_ZONED_HVAC_POWER_ON,
- VehicleProperty.HVAC_POWER_ON);
- HVAC_PROP_MAP.put(CarHvacManager.ID_ZONED_HVAC_AUTO_RECIRC_ON,
- VehicleProperty.HVAC_AUTO_RECIRC_ON);
- HVAC_PROP_MAP.put(CarHvacManager.ID_WINDOW_DEFROSTER_ON,
- VehicleProperty.HVAC_DEFROSTER);
- }
-
- static int getHvacVhalProp(final int hvacProp) {
- return HVAC_PROP_MAP.get(hvacProp);
- }
-}
diff --git a/tools/emulator/vhal_consts_2_0.py b/tools/emulator/vhal_consts_2_0.py
index a9d9990..85351c0 100644
--- a/tools/emulator/vhal_consts_2_0.py
+++ b/tools/emulator/vhal_consts_2_0.py
@@ -138,13 +138,6 @@
STATUSCODE_ACCESS_DENIED = 0x4
STATUSCODE_INTERNAL_ERROR = 0x5
-# Wheel
-WHEEL_UNKNOWN = 0x0
-WHEEL_LEFT_FRONT = 0x1
-WHEEL_RIGHT_FRONT = 0x2
-WHEEL_LEFT_REAR = 0x4
-WHEEL_RIGHT_REAR = 0x8
-
# VehicleLightState
VEHICLELIGHTSTATE_OFF = 0x0
VEHICLELIGHTSTATE_ON = 0x1
@@ -266,17 +259,19 @@
VEHICLETURNSIGNAL_LEFT = 0x2
# EvConnectorType
-EVCONNECTORTYPE_EV_CONNECTOR_TYPE_UNKNOWN = 0x0
-EVCONNECTORTYPE_EV_CONNECTOR_TYPE_J1772 = 0x1
-EVCONNECTORTYPE_EV_CONNECTOR_TYPE_MENNEKES = 0x2
-EVCONNECTORTYPE_EV_CONNECTOR_TYPE_CHADEMO = 0x3
-EVCONNECTORTYPE_EV_CONNECTOR_TYPE_COMBO_1 = 0x4
-EVCONNECTORTYPE_EV_CONNECTOR_TYPE_COMBO_2 = 0x5
-EVCONNECTORTYPE_EV_CONNECTOR_TYPE_TESLA_ROADSTER = 0x6
-EVCONNECTORTYPE_EV_CONNECTOR_TYPE_TESLA_HPWC = 0x7
-EVCONNECTORTYPE_EV_CONNECTOR_TYPE_TESLA_SUPERCHARGER = 0x8
-EVCONNECTORTYPE_EV_CONNECTOR_TYPE_GBT = 0x9
-EVCONNECTORTYPE_EV_CONNECTOR_TYPE_OTHER = 0x65
+EVCONNECTORTYPE_UNKNOWN = 0x0
+EVCONNECTORTYPE_IEC_TYPE_1_AC = 0x1
+EVCONNECTORTYPE_IEC_TYPE_2_AC = 0x2
+EVCONNECTORTYPE_IEC_TYPE_3_AC = 0x3
+EVCONNECTORTYPE_IEC_TYPE_4_DC = 0x4
+EVCONNECTORTYPE_IEC_TYPE_1_CCS_DC = 0x5
+EVCONNECTORTYPE_IEC_TYPE_2_CCS_DC = 0x6
+EVCONNECTORTYPE_TESLA_ROADSTER = 0x7
+EVCONNECTORTYPE_TESLA_HPWC = 0x8
+EVCONNECTORTYPE_TESLA_SUPERCHARGER = 0x9
+EVCONNECTORTYPE_GBT_AC = 0xa
+EVCONNECTORTYPE_GBT_DC = 0xb
+EVCONNECTORTYPE_OTHER = 0x65
# VehiclePropertyType
VEHICLEPROPERTYTYPE_STRING = 0x100000
@@ -309,6 +304,13 @@
OBD2SECONDARYAIRSTATUS_FROM_OUTSIDE_OR_OFF = 0x4
OBD2SECONDARYAIRSTATUS_PUMP_ON_FOR_DIAGNOSTICS = 0x8
+# VehicleAreaWheel
+VEHICLEAREAWHEEL_UNKNOWN = 0x0
+VEHICLEAREAWHEEL_LEFT_FRONT = 0x1
+VEHICLEAREAWHEEL_RIGHT_FRONT = 0x2
+VEHICLEAREAWHEEL_LEFT_REAR = 0x4
+VEHICLEAREAWHEEL_RIGHT_REAR = 0x8
+
# VehicleGear
VEHICLEGEAR_GEAR_NEUTRAL = 0x1
VEHICLEGEAR_GEAR_REVERSE = 0x2
@@ -410,7 +412,7 @@
VEHICLEPROPERTY_EV_CHARGE_PORT_CONNECTED = 0x1120030b
VEHICLEPROPERTY_EV_BATTERY_INSTANTANEOUS_CHARGE_RATE = 0x1160030c
VEHICLEPROPERTY_RANGE_REMAINING = 0x11600308
-VEHICLEPROPERTY_TIRE_PRESSURE = 0x17e00309
+VEHICLEPROPERTY_TIRE_PRESSURE = 0x17600309
VEHICLEPROPERTY_GEAR_SELECTION = 0x11400400
VEHICLEPROPERTY_CURRENT_GEAR = 0x11400401
VEHICLEPROPERTY_PARKING_BRAKE_ON = 0x11200402
@@ -442,7 +444,6 @@
VEHICLEPROPERTY_HVAC_AUTO_RECIRC_ON = 0x15200512
VEHICLEPROPERTY_HVAC_SEAT_VENTILATION = 0x15400513
VEHICLEPROPERTY_ENV_OUTSIDE_TEMPERATURE = 0x11600703
-VEHICLEPROPERTY_ENV_CABIN_TEMPERATURE = 0x15600704
VEHICLEPROPERTY_AP_POWER_STATE_REQ = 0x11410a00
VEHICLEPROPERTY_AP_POWER_STATE_REPORT = 0x11410a01
VEHICLEPROPERTY_AP_POWER_BOOTUP_REASON = 0x11400a02
diff --git a/user/car-user-lib/Android.bp b/user/car-user-lib/Android.bp
new file mode 100644
index 0000000..c96d01f
--- /dev/null
+++ b/user/car-user-lib/Android.bp
@@ -0,0 +1,26 @@
+// Copyright (C) 2018 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+java_library {
+ name: "android.car.userlib",
+ srcs: [
+ "src/**/*.java",
+ ],
+ product_variables: {
+ pdk: {
+ enabled: false,
+ },
+ },
+ installable: true,
+}
diff --git a/user/car-user-lib/AndroidManifest.xml b/user/car-user-lib/AndroidManifest.xml
new file mode 100644
index 0000000..4fbe42f
--- /dev/null
+++ b/user/car-user-lib/AndroidManifest.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
+ package="android.car.userlib" >
+ <uses-sdk android:minSdkVersion="23" android:targetSdkVersion="23" />
+</manifest>
\ No newline at end of file
diff --git a/user/car-user-lib/src/android/car/userlib/CarUserManagerHelper.java b/user/car-user-lib/src/android/car/userlib/CarUserManagerHelper.java
new file mode 100644
index 0000000..d1ecf13
--- /dev/null
+++ b/user/car-user-lib/src/android/car/userlib/CarUserManagerHelper.java
@@ -0,0 +1,1097 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.car.userlib;
+
+import android.Manifest;
+import android.annotation.Nullable;
+import android.annotation.RequiresPermission;
+import android.app.ActivityManager;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.UserInfo;
+import android.graphics.Bitmap;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.provider.Settings;
+import android.sysprop.CarProperties;
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.UserIcons;
+
+import com.google.android.collect.Sets;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Helper class for {@link UserManager}, this is meant to be used by builds that support
+ * Multi-user model with headless user 0. User 0 is not associated with a real person, and
+ * can not be brought to foreground.
+ *
+ * <p>This class provides method for user management, including creating, removing, adding
+ * and switching users. Methods related to get users will exclude system user by default.
+ *
+ * @hide
+ */
+public class CarUserManagerHelper {
+ private static final String TAG = "CarUserManagerHelper";
+
+ /**
+ * Default set of restrictions for Non-Admin users.
+ */
+ private static final Set<String> DEFAULT_NON_ADMIN_RESTRICTIONS = Sets.newArraySet(
+ UserManager.DISALLOW_FACTORY_RESET,
+ UserManager.DISALLOW_RUN_IN_BACKGROUND
+ );
+
+ /**
+ * Additional optional set of restrictions for Non-Admin users.
+ */
+ public static final Set<String> OPTIONAL_NON_ADMIN_RESTRICTIONS = Sets.newArraySet(
+ UserManager.DISALLOW_ADD_USER,
+ UserManager.DISALLOW_OUTGOING_CALLS,
+ UserManager.DISALLOW_SMS,
+ UserManager.DISALLOW_INSTALL_APPS,
+ UserManager.DISALLOW_UNINSTALL_APPS
+ );
+
+ /**
+ * Default set of restrictions for Guest users.
+ */
+ private static final Set<String> DEFAULT_GUEST_RESTRICTIONS = Sets.newArraySet(
+ UserManager.DISALLOW_FACTORY_RESET,
+ UserManager.DISALLOW_REMOVE_USER,
+ UserManager.DISALLOW_MODIFY_ACCOUNTS,
+ UserManager.DISALLOW_OUTGOING_CALLS,
+ UserManager.DISALLOW_SMS,
+ UserManager.DISALLOW_INSTALL_APPS,
+ UserManager.DISALLOW_UNINSTALL_APPS
+ );
+
+ private final Context mContext;
+ private final UserManager mUserManager;
+ private final ActivityManager mActivityManager;
+ private String mDefaultAdminName;
+ private Bitmap mDefaultGuestUserIcon;
+ private ArrayList<OnUsersUpdateListener> mUpdateListeners;
+ private final BroadcastReceiver mUserChangeReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ ArrayList<OnUsersUpdateListener> copyOfUpdateListeners;
+ synchronized (mUpdateListeners) {
+ copyOfUpdateListeners = new ArrayList(mUpdateListeners);
+ }
+
+ for (OnUsersUpdateListener listener : copyOfUpdateListeners) {
+ listener.onUsersUpdate();
+ }
+ }
+ };
+
+ /**
+ * Initializes with a default name for admin users.
+ *
+ * @param context Application Context
+ */
+ public CarUserManagerHelper(Context context) {
+ mUpdateListeners = new ArrayList<>();
+ mContext = context.getApplicationContext();
+ mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
+ mActivityManager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
+ }
+
+ /**
+ * Registers a listener for updates to all users - removing, adding users or changing user info.
+ *
+ * @param listener Instance of {@link OnUsersUpdateListener}.
+ */
+ public void registerOnUsersUpdateListener(OnUsersUpdateListener listener) {
+ if (listener == null) {
+ return;
+ }
+
+ synchronized (mUpdateListeners) {
+ if (mUpdateListeners.isEmpty()) {
+ // First listener being added, register receiver.
+ registerReceiver();
+ }
+
+ if (!mUpdateListeners.contains(listener)) {
+ mUpdateListeners.add(listener);
+ }
+ }
+ }
+
+ /**
+ * Unregisters on user update listener.
+ * Unregisters {@code BroadcastReceiver} if no listeners remain.
+ *
+ * @param listener Instance of {@link OnUsersUpdateListener} to unregister.
+ */
+ public void unregisterOnUsersUpdateListener(OnUsersUpdateListener listener) {
+ synchronized (mUpdateListeners) {
+ if (mUpdateListeners.contains(listener)) {
+ mUpdateListeners.remove(listener);
+
+ if (mUpdateListeners.isEmpty()) {
+ // No more listeners, unregister broadcast receiver.
+ unregisterReceiver();
+ }
+ }
+ }
+ }
+
+ /**
+ * Set default boot into user.
+ *
+ * @param userId default user id to boot into.
+ */
+ public void setDefaultBootUser(int userId) {
+ Settings.Global.putInt(
+ mContext.getContentResolver(),
+ Settings.Global.DEFAULT_USER_ID_TO_BOOT_INTO, userId);
+ }
+
+ /**
+ * Set last active user.
+ *
+ * @param userId last active user id.
+ */
+ public void setLastActiveUser(int userId) {
+ Settings.Global.putInt(
+ mContext.getContentResolver(), Settings.Global.LAST_ACTIVE_USER_ID, userId);
+ }
+
+ /**
+ * Set last active user.
+ *
+ * @param userId last active user id.
+ * @param skipGlobalSetting whether to skip set the global settings value.
+ * @deprecated Use {@link #setDefaultBootUser(int)} instead.
+ */
+ @Deprecated
+ public void setLastActiveUser(int userId, boolean skipGlobalSetting) {
+ if (!skipGlobalSetting) {
+ Settings.Global.putInt(
+ mContext.getContentResolver(), Settings.Global.LAST_ACTIVE_USER_ID, userId);
+ }
+ }
+
+ /**
+ * Get user id for the default boot into user.
+ *
+ * @return user id of the default boot into user
+ */
+ public int getDefaultBootUser() {
+ // Make user 10 the original default boot user.
+ return Settings.Global.getInt(
+ mContext.getContentResolver(), Settings.Global.DEFAULT_USER_ID_TO_BOOT_INTO,
+ /* default user id= */ 10);
+ }
+
+ /**
+ * Get user id for the last active user.
+ *
+ * @return user id of the last active user.
+ */
+ public int getLastActiveUser() {
+ return Settings.Global.getInt(
+ mContext.getContentResolver(), Settings.Global.LAST_ACTIVE_USER_ID,
+ /* default user id= */ UserHandle.USER_SYSTEM);
+ }
+
+ /**
+ * Get user id for the initial user to boot into. This is only applicable for headless
+ * system user model.
+ *
+ * <p>If failed to retrieve the id stored in global settings or the retrieved id does not
+ * exist on device, then return the user with smallest user id.
+ *
+ * @return user id of the last active user or the smallest user id on the device.
+ */
+ public int getInitialUser() {
+ int lastActiveUserId = getLastActiveUser();
+
+ boolean isUserExist = false;
+ List<UserInfo> allUsers = getAllPersistentUsers();
+ int smallestUserId = Integer.MAX_VALUE;
+ for (UserInfo user : allUsers) {
+ if (user.id == lastActiveUserId) {
+ isUserExist = true;
+ }
+ smallestUserId = Math.min(user.id, smallestUserId);
+ }
+
+ // If the last active user is system user or the user id doesn't exist on device,
+ // return the smallest id or all users.
+ if (lastActiveUserId == UserHandle.USER_SYSTEM || !isUserExist) {
+ Log.e(TAG, "Can't get last active user id or the user no longer exist, user id: ."
+ + lastActiveUserId);
+ lastActiveUserId = smallestUserId;
+ }
+
+ return lastActiveUserId;
+ }
+
+ /**
+ * Sets default guest restrictions that will be applied every time a Guest user is created.
+ *
+ * <p> Restrictions are written to disk and persistent across boots.
+ */
+ public void initDefaultGuestRestrictions() {
+ Bundle defaultGuestRestrictions = new Bundle();
+ for (String restriction : DEFAULT_GUEST_RESTRICTIONS) {
+ defaultGuestRestrictions.putBoolean(restriction, true);
+ }
+ mUserManager.setDefaultGuestRestrictions(defaultGuestRestrictions);
+ }
+
+ /**
+ * Returns {@code true} if the system is in the headless user 0 model.
+ *
+ * @return {@boolean true} if headless system user.
+ */
+ public boolean isHeadlessSystemUser() {
+ return CarProperties.headless_system_user().orElse(false);
+ }
+
+ /**
+ * Gets UserInfo for the system user.
+ *
+ * @return {@link UserInfo} for the system user.
+ */
+ public UserInfo getSystemUserInfo() {
+ return mUserManager.getUserInfo(UserHandle.USER_SYSTEM);
+ }
+
+ /**
+ * Gets UserInfo for the current foreground user.
+ *
+ * Concept of foreground user is relevant for the multi-user deployment. Foreground user
+ * corresponds to the currently "logged in" user.
+ *
+ * @return {@link UserInfo} for the foreground user.
+ */
+ public UserInfo getCurrentForegroundUserInfo() {
+ return mUserManager.getUserInfo(getCurrentForegroundUserId());
+ }
+
+ /**
+ * @return Id of the current foreground user.
+ */
+ public int getCurrentForegroundUserId() {
+ return mActivityManager.getCurrentUser();
+ }
+
+ /**
+ * Gets UserInfo for the user running the caller process.
+ *
+ * <p>Differentiation between foreground user and current process user is relevant for
+ * multi-user deployments.
+ *
+ * <p>Some multi-user aware components (like SystemUI) needs to run a singleton component
+ * in system user. Current process user is always the same for that component, even when
+ * the foreground user changes.
+ *
+ * @return {@link UserInfo} for the user running the current process.
+ */
+ public UserInfo getCurrentProcessUserInfo() {
+ return mUserManager.getUserInfo(getCurrentProcessUserId());
+ }
+
+ /**
+ * @return Id for the user running the current process.
+ */
+ public int getCurrentProcessUserId() {
+ return UserHandle.myUserId();
+ }
+
+ /**
+ * Gets all the existing users on the system that are not currently running as
+ * the foreground user.
+ * These are all the users that can be switched to from the foreground user.
+ *
+ * @return List of {@code UserInfo} for each user that is not the foreground user.
+ */
+ public List<UserInfo> getAllSwitchableUsers() {
+ if (isHeadlessSystemUser()) {
+ return getAllUsersExceptSystemUserAndSpecifiedUser(getCurrentForegroundUserId());
+ } else {
+ return getAllUsersExceptSpecifiedUser(getCurrentForegroundUserId());
+ }
+ }
+
+ /**
+ * Gets all the users that can be brought to the foreground on the system.
+ *
+ * @return List of {@code UserInfo} for users that associated with a real person.
+ */
+ public List<UserInfo> getAllUsers() {
+ if (isHeadlessSystemUser()) {
+ return getAllUsersExceptSystemUserAndSpecifiedUser(UserHandle.USER_SYSTEM);
+ } else {
+ return mUserManager.getUsers(/* excludeDying= */ true);
+ }
+ }
+
+ /**
+ * Gets all the users that are non-ephemeral and can be brought to the foreground on the system.
+ *
+ * @return List of {@code UserInfo} for non-ephemeral users that associated with a real person.
+ */
+ public List<UserInfo> getAllPersistentUsers() {
+ List<UserInfo> users = getAllUsers();
+ for (Iterator<UserInfo> iterator = users.iterator(); iterator.hasNext(); ) {
+ UserInfo userInfo = iterator.next();
+ if (userInfo.isEphemeral()) {
+ // Remove user that is ephemeral.
+ iterator.remove();
+ }
+ }
+ return users;
+ }
+
+ /**
+ * Gets all the users that can be brought to the foreground on the system that have admin roles.
+ *
+ * @return List of {@code UserInfo} for admin users that associated with a real person.
+ */
+ public List<UserInfo> getAllAdminUsers() {
+ List<UserInfo> users = getAllUsers();
+
+ for (Iterator<UserInfo> iterator = users.iterator(); iterator.hasNext(); ) {
+ UserInfo userInfo = iterator.next();
+ if (!userInfo.isAdmin()) {
+ // Remove user that is not admin.
+ iterator.remove();
+ }
+ }
+ return users;
+ }
+
+ /**
+ * Gets all users that are not guests.
+ *
+ * @return List of {@code UserInfo} for all users who are not guest users.
+ */
+ public List<UserInfo> getAllUsersExceptGuests() {
+ List<UserInfo> users = getAllUsers();
+
+ for (Iterator<UserInfo> iterator = users.iterator(); iterator.hasNext(); ) {
+ UserInfo userInfo = iterator.next();
+ if (userInfo.isGuest()) {
+ // Remove guests.
+ iterator.remove();
+ }
+ }
+ return users;
+ }
+
+ /**
+ * Get all the users except the one with userId passed in.
+ *
+ * @param userId of the user not to be returned.
+ * @return All users other than user with userId.
+ */
+ private List<UserInfo> getAllUsersExceptSpecifiedUser(int userId) {
+ List<UserInfo> users = mUserManager.getUsers(/* excludeDying= */true);
+
+ for (Iterator<UserInfo> iterator = users.iterator(); iterator.hasNext(); ) {
+ UserInfo userInfo = iterator.next();
+ if (userInfo.id == userId) {
+ // Remove user with userId from the list.
+ iterator.remove();
+ }
+ }
+ return users;
+ }
+
+ /**
+ * Get all the users except system user and the one with userId passed in.
+ *
+ * @param userId of the user not to be returned.
+ * @return All users other than system user and user with userId.
+ */
+ private List<UserInfo> getAllUsersExceptSystemUserAndSpecifiedUser(int userId) {
+ List<UserInfo> users = mUserManager.getUsers(/* excludeDying= */true);
+
+ for (Iterator<UserInfo> iterator = users.iterator(); iterator.hasNext(); ) {
+ UserInfo userInfo = iterator.next();
+ if (userInfo.id == userId || userInfo.id == UserHandle.USER_SYSTEM) {
+ // Remove user with userId from the list.
+ iterator.remove();
+ }
+ }
+ return users;
+ }
+
+ /**
+ * Maximum number of users allowed on the device. This includes real users, managed profiles
+ * and restricted users, but excludes guests.
+ *
+ * <p> It excludes system user in headless system user model.
+ *
+ * @return Maximum number of users that can be present on the device.
+ */
+ public int getMaxSupportedUsers() {
+ if (isHeadlessSystemUser()) {
+ return UserManager.getMaxSupportedUsers() - 1;
+ }
+ return UserManager.getMaxSupportedUsers();
+ }
+
+ /**
+ * Get the maximum number of real (non-guest, non-managed profile) users that can be created on
+ * the device. This is a dynamic value and it decreases with the increase of the number of
+ * managed profiles on the device.
+ *
+ * <p> It excludes system user in headless system user model.
+ *
+ * @return Maximum number of real users that can be created.
+ */
+ public int getMaxSupportedRealUsers() {
+ return getMaxSupportedUsers() - getManagedProfilesCount();
+ }
+
+ /**
+ * Returns true if the maximum number of users on the device has been reached, false otherwise.
+ */
+ public boolean isUserLimitReached() {
+ int countNonGuestUsers = getAllUsersExceptGuests().size();
+ int maxSupportedUsers = getMaxSupportedUsers();
+
+ if (countNonGuestUsers > maxSupportedUsers) {
+ Log.e(TAG, "There are more users on the device than allowed.");
+ return true;
+ }
+
+ return getAllUsersExceptGuests().size() == maxSupportedUsers;
+ }
+
+ private int getManagedProfilesCount() {
+ List<UserInfo> users = getAllUsers();
+
+ // Count all users that are managed profiles of another user.
+ int managedProfilesCount = 0;
+ for (UserInfo user : users) {
+ if (user.isManagedProfile()) {
+ managedProfilesCount++;
+ }
+ }
+ return managedProfilesCount;
+ }
+
+ // User information accessors
+
+ /**
+ * Checks whether the user is system user.
+ *
+ * @param userInfo User to check against system user.
+ * @return {@code true} if system user, {@code false} otherwise.
+ */
+ public boolean isSystemUser(UserInfo userInfo) {
+ return userInfo.id == UserHandle.USER_SYSTEM;
+ }
+
+ /**
+ * Checks whether the user is default user.
+ *
+ * @param userInfo User to check against system user.
+ * @return {@code true} if is default user, {@code false} otherwise.
+ */
+ public boolean isDefaultUser(UserInfo userInfo) {
+ return userInfo.id == getDefaultBootUser();
+ }
+
+ /**
+ * Checks whether the user is last active user.
+ *
+ * @param userInfo User to check against last active user.
+ * @return {@code true} if is last active user, {@code false} otherwise.
+ */
+ public boolean isLastActiveUser(UserInfo userInfo) {
+ return userInfo.id == getLastActiveUser();
+ }
+
+ /**
+ * Checks whether passed in user is the foreground user.
+ *
+ * @param userInfo User to check.
+ * @return {@code true} if foreground user, {@code false} otherwise.
+ */
+ public boolean isForegroundUser(UserInfo userInfo) {
+ return getCurrentForegroundUserId() == userInfo.id;
+ }
+
+ /**
+ * Checks whether passed in user is the user that's running the current process.
+ *
+ * @param userInfo User to check.
+ * @return {@code true} if user running the process, {@code false} otherwise.
+ */
+ public boolean isCurrentProcessUser(UserInfo userInfo) {
+ return getCurrentProcessUserId() == userInfo.id;
+ }
+
+ // Foreground user information accessors.
+
+ /**
+ * Checks if the foreground user is a guest user.
+ */
+ public boolean isForegroundUserGuest() {
+ return getCurrentForegroundUserInfo().isGuest();
+ }
+
+ /**
+ * Checks if the foreground user is a demo user.
+ */
+ public boolean isForegroundUserDemo() {
+ return getCurrentForegroundUserInfo().isDemo();
+ }
+
+ /**
+ * Checks if the foreground user is ephemeral.
+ */
+ public boolean isForegroundUserEphemeral() {
+ return getCurrentForegroundUserInfo().isEphemeral();
+ }
+
+ /**
+ * Checks if the given user is non-ephemeral.
+ *
+ * @param userId User to check
+ * @return {@code true} if given user is persistent user.
+ */
+ public boolean isPersistentUser(int userId) {
+ UserInfo user = mUserManager.getUserInfo(userId);
+ return !user.isEphemeral();
+ }
+
+ /**
+ * Returns whether this user can be removed from the system.
+ *
+ * @param userInfo User to be removed
+ * @return {@code true} if they can be removed, {@code false} otherwise.
+ */
+ public boolean canUserBeRemoved(UserInfo userInfo) {
+ return !isSystemUser(userInfo);
+ }
+
+ /**
+ * Returns whether a user has a restriction.
+ *
+ * @param restriction Restriction to check. Should be a UserManager.* restriction.
+ * @param userInfo the user whose restriction is to be checked
+ */
+ public boolean hasUserRestriction(String restriction, UserInfo userInfo) {
+ return mUserManager.hasUserRestriction(restriction, userInfo.getUserHandle());
+ }
+
+ /**
+ * Return whether the foreground user has a restriction.
+ *
+ * @param restriction Restriction to check. Should be a UserManager.* restriction.
+ * @return Whether that restriction exists for the foreground user.
+ */
+ public boolean foregroundUserHasUserRestriction(String restriction) {
+ return hasUserRestriction(restriction, getCurrentForegroundUserInfo());
+ }
+
+ /**
+ * Checks if the foreground user can add new users.
+ */
+ public boolean canForegroundUserAddUsers() {
+ return !foregroundUserHasUserRestriction(UserManager.DISALLOW_ADD_USER);
+ }
+
+ /**
+ * Checks if the current process user can modify accounts. Demo and Guest users cannot modify
+ * accounts even if the DISALLOW_MODIFY_ACCOUNTS restriction is not applied.
+ */
+ public boolean canForegroundUserModifyAccounts() {
+ return !foregroundUserHasUserRestriction(UserManager.DISALLOW_MODIFY_ACCOUNTS)
+ && !isForegroundUserDemo()
+ && !isForegroundUserGuest();
+ }
+
+ /**
+ * Checks if the foreground user can switch to other users.
+ */
+ public boolean canForegroundUserSwitchUsers() {
+ return !foregroundUserHasUserRestriction(UserManager.DISALLOW_USER_SWITCH);
+ }
+
+ // Current process user information accessors
+
+ /**
+ * Checks whether this process is running under the system user.
+ */
+ public boolean isCurrentProcessSystemUser() {
+ return mUserManager.isSystemUser();
+ }
+
+ /**
+ * Checks if the calling app is running in a demo user.
+ */
+ public boolean isCurrentProcessDemoUser() {
+ return mUserManager.isDemoUser();
+ }
+
+ /**
+ * Checks if the calling app is running as an admin user.
+ */
+ public boolean isCurrentProcessAdminUser() {
+ return mUserManager.isAdminUser();
+ }
+
+ /**
+ * Checks if the calling app is running as a guest user.
+ */
+ public boolean isCurrentProcessGuestUser() {
+ return mUserManager.isGuestUser();
+ }
+
+ /**
+ * Check is the calling app is running as a restricted profile user (ie. a LinkedUser).
+ * Restricted profiles are only available when {@link #isHeadlessSystemUser()} is false.
+ */
+ public boolean isCurrentProcessRestrictedProfileUser() {
+ return mUserManager.isRestrictedProfile();
+ }
+
+ // Current process user restriction accessors
+
+ /**
+ * Return whether the user running the current process has a restriction.
+ *
+ * @param restriction Restriction to check. Should be a UserManager.* restriction.
+ * @return Whether that restriction exists for the user running the process.
+ */
+ public boolean isCurrentProcessUserHasRestriction(String restriction) {
+ return mUserManager.hasUserRestriction(restriction);
+ }
+
+ /**
+ * Checks if the current process user can modify accounts. Demo and Guest users cannot modify
+ * accounts even if the DISALLOW_MODIFY_ACCOUNTS restriction is not applied.
+ */
+ public boolean canCurrentProcessModifyAccounts() {
+ return !isCurrentProcessUserHasRestriction(UserManager.DISALLOW_MODIFY_ACCOUNTS)
+ && !isCurrentProcessDemoUser()
+ && !isCurrentProcessGuestUser();
+ }
+
+ /**
+ * Checks if the user running the current process can add new users.
+ */
+ public boolean canCurrentProcessAddUsers() {
+ return !isCurrentProcessUserHasRestriction(UserManager.DISALLOW_ADD_USER);
+ }
+
+ /**
+ * Checks if the user running the current process can remove users.
+ */
+ public boolean canCurrentProcessRemoveUsers() {
+ return !isCurrentProcessUserHasRestriction(UserManager.DISALLOW_REMOVE_USER);
+ }
+
+ /**
+ * Checks if the user running the current process is allowed to switch to another user.
+ */
+ public boolean canCurrentProcessSwitchUsers() {
+ return !isCurrentProcessUserHasRestriction(UserManager.DISALLOW_USER_SWITCH);
+ }
+
+ /**
+ * Grants admin permissions to the user.
+ *
+ * @param user User to be upgraded to Admin status.
+ */
+ @RequiresPermission(allOf = {
+ Manifest.permission.INTERACT_ACROSS_USERS_FULL,
+ Manifest.permission.MANAGE_USERS
+ })
+ public void grantAdminPermissions(UserInfo user) {
+ if (!isCurrentProcessAdminUser()) {
+ Log.w(TAG, "Only admin users can assign admin permissions.");
+ return;
+ }
+
+ mUserManager.setUserAdmin(user.id);
+
+ // Remove restrictions imposed on non-admins.
+ setDefaultNonAdminRestrictions(user, /* enable= */ false);
+ setOptionalNonAdminRestrictions(user, /* enable= */ false);
+ }
+
+ /**
+ * Creates a new user on the system with a default user name. This user name is set during
+ * constrution. The created user would be granted admin role. Only admins can create other
+ * admins.
+ *
+ * @return Newly created admin user, null if failed to create a user.
+ */
+ @Nullable
+ public UserInfo createNewAdminUser() {
+ return createNewAdminUser(getDefaultAdminName());
+ }
+
+ /**
+ * Creates a new user on the system, the created user would be granted admin role.
+ * Only admins can create other admins.
+ *
+ * @param userName Name to give to the newly created user.
+ * @return Newly created admin user, null if failed to create a user.
+ */
+ @Nullable
+ public UserInfo createNewAdminUser(String userName) {
+ if (!(isCurrentProcessAdminUser() || isCurrentProcessSystemUser())) {
+ // Only Admins or System user can create other privileged users.
+ Log.e(TAG, "Only admin users and system user can create other admins.");
+ return null;
+ }
+
+ UserInfo user = mUserManager.createUser(userName, UserInfo.FLAG_ADMIN);
+ if (user == null) {
+ // Couldn't create user, most likely because there are too many.
+ Log.w(TAG, "can't create admin user.");
+ return null;
+ }
+ assignDefaultIcon(user);
+
+ // Set disallow background run for admin users, users will be killed when switched away.
+ setUserRestriction(user, UserManager.DISALLOW_RUN_IN_BACKGROUND, /* enable= */ true);
+ return user;
+ }
+
+ /**
+ * Creates a new non-admin user on the system.
+ *
+ * @param userName Name to give to the newly created user.
+ * @return Newly created non-admin user, null if failed to create a user.
+ */
+ @Nullable
+ public UserInfo createNewNonAdminUser(String userName) {
+ UserInfo user = mUserManager.createUser(userName, 0);
+ if (user == null) {
+ // Couldn't create user, most likely because there are too many.
+ Log.w(TAG, "can't create non-admin user.");
+ return null;
+ }
+ setDefaultNonAdminRestrictions(user, /* enable= */ true);
+
+ // Each non-admin has sms and outgoing call restrictions applied by the UserManager on
+ // creation. We want to enable these permissions by default in the car.
+ setUserRestriction(user, UserManager.DISALLOW_SMS, /* enable= */ false);
+ setUserRestriction(user, UserManager.DISALLOW_OUTGOING_CALLS, /* enable= */ false);
+
+ assignDefaultIcon(user);
+ return user;
+ }
+
+ /**
+ * Sets the values of default Non-Admin restrictions to the passed in value.
+ *
+ * @param userInfo User to set restrictions on.
+ * @param enable If true, restriction is ON, If false, restriction is OFF.
+ */
+ private void setDefaultNonAdminRestrictions(UserInfo userInfo, boolean enable) {
+ for (String restriction : DEFAULT_NON_ADMIN_RESTRICTIONS) {
+ setUserRestriction(userInfo, restriction, enable);
+ }
+ }
+
+ /**
+ * Sets the values of settings controllable restrictions to the passed in value.
+ *
+ * @param userInfo User to set restrictions on.
+ * @param enable If true, restriction is ON, If false, restriction is OFF.
+ */
+ private void setOptionalNonAdminRestrictions(UserInfo userInfo, boolean enable) {
+ for (String restriction : OPTIONAL_NON_ADMIN_RESTRICTIONS) {
+ setUserRestriction(userInfo, restriction, enable);
+ }
+ }
+
+ /**
+ * Sets the value of the specified restriction for the specified user.
+ *
+ * @param userInfo the user whose restriction is to be changed
+ * @param restriction the key of the restriction
+ * @param enable the value for the restriction. if true, turns the restriction ON, if false,
+ * turns the restriction OFF.
+ */
+ public void setUserRestriction(UserInfo userInfo, String restriction, boolean enable) {
+ UserHandle userHandle = UserHandle.of(userInfo.id);
+ mUserManager.setUserRestriction(restriction, enable, userHandle);
+ }
+
+ /**
+ * Tries to remove the user that's passed in. System user cannot be removed.
+ * If the user to be removed is user currently running the process,
+ * it switches to the guest user first, and then removes the user.
+ * If the user being removed is the last admin user, this will create a new admin user.
+ *
+ * @param userInfo User to be removed
+ * @param guestUserName User name to use for the guest user if we need to switch to it
+ * @return {@code true} if user is successfully removed, {@code false} otherwise.
+ */
+ public boolean removeUser(UserInfo userInfo, String guestUserName) {
+ if (isSystemUser(userInfo)) {
+ Log.w(TAG, "User " + userInfo.id + " is system user, could not be removed.");
+ return false;
+ }
+
+ // Try to create a new admin before deleting the current one.
+ if (userInfo.isAdmin() && getAllAdminUsers().size() <= 1) {
+ return removeLastAdmin(userInfo);
+ }
+
+ if (!isCurrentProcessAdminUser() && !isCurrentProcessUser(userInfo)) {
+ // If the caller is non-admin, they can only delete themselves.
+ Log.e(TAG, "Non-admins cannot remove other users.");
+ return false;
+ }
+
+ if (userInfo.id == getCurrentForegroundUserId()) {
+ if (!canCurrentProcessSwitchUsers()) {
+ // If we can't switch to a different user, we can't exit this one and therefore
+ // can't delete it.
+ Log.w(TAG, "User switching is not allowed. Current user cannot be deleted");
+ return false;
+ }
+ startGuestSession(guestUserName);
+ }
+
+ return mUserManager.removeUser(userInfo.id);
+ }
+
+ private boolean removeLastAdmin(UserInfo userInfo) {
+ if (Log.isLoggable(TAG, Log.INFO)) {
+ Log.i(TAG, "User " + userInfo.id
+ + " is the last admin user on device. Creating a new admin.");
+ }
+
+ UserInfo newAdmin = createNewAdminUser(getDefaultAdminName());
+ if (newAdmin == null) {
+ Log.w(TAG, "Couldn't create another admin, cannot delete current user.");
+ return false;
+ }
+
+ switchToUser(newAdmin);
+ return mUserManager.removeUser(userInfo.id);
+ }
+
+ /**
+ * Switches (logs in) to another user given user id.
+ *
+ * @param id User id to switch to.
+ * @return {@code true} if user switching succeed.
+ */
+ public boolean switchToUserId(int id) {
+ if (id == UserHandle.USER_SYSTEM && isHeadlessSystemUser()) {
+ // System User doesn't associate with real person, can not be switched to.
+ return false;
+ }
+ if (!canCurrentProcessSwitchUsers()) {
+ return false;
+ }
+ if (id == getCurrentForegroundUserId()) {
+ return false;
+ }
+ return mActivityManager.switchUser(id);
+ }
+
+ /**
+ * Switches (logs in) to another user.
+ *
+ * @param userInfo User to switch to.
+ * @return {@code true} if user switching succeed.
+ */
+ public boolean switchToUser(UserInfo userInfo) {
+ return switchToUserId(userInfo.id);
+ }
+
+ /**
+ * Creates a new guest or finds the existing one, and switches into it.
+ *
+ * @param guestName Username for the guest user.
+ * @return {@code true} if switch to guest user succeed.
+ */
+ public boolean startGuestSession(String guestName) {
+ UserInfo guest = createNewOrFindExistingGuest(guestName);
+ if (guest == null) {
+ return false;
+ }
+ return switchToUserId(guest.id);
+ }
+
+ /**
+ * Creates and returns a new guest user or returns the existing one.
+ * Returns null if it fails to create a new guest.
+ *
+ * @param guestName Username for guest if new guest is being created.
+ */
+ @Nullable
+ public UserInfo createNewOrFindExistingGuest(String guestName) {
+ // CreateGuest will return null if a guest already exists.
+ UserInfo newGuest = mUserManager.createGuest(mContext, guestName);
+ if (newGuest != null) {
+ assignDefaultIcon(newGuest);
+ return newGuest;
+ }
+
+ UserInfo existingGuest = findExistingGuestUser();
+ if (existingGuest == null) {
+ // Most likely a guest got removed just before we tried to look for it.
+ Log.w(TAG, "Couldn't create a new guest and couldn't find an existing one.");
+ }
+
+ return existingGuest;
+ }
+
+ /**
+ * Returns UserInfo for the existing guest user, or null if there are no guests on the device.
+ */
+ @Nullable
+ private UserInfo findExistingGuestUser() {
+ for (UserInfo userInfo : getAllUsers()) {
+ if (userInfo.isGuest() && !userInfo.guestToRemove) {
+ return userInfo;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Gets a bitmap representing the user's default avatar.
+ *
+ * @param userInfo User whose avatar should be returned.
+ * @return Default user icon
+ */
+ public Bitmap getUserDefaultIcon(UserInfo userInfo) {
+ return UserIcons.convertToBitmap(
+ UserIcons.getDefaultUserIcon(mContext.getResources(), userInfo.id, false));
+ }
+
+ /**
+ * Gets a bitmap representing the default icon for a Guest user.
+ *
+ * @return Default guest user icon
+ */
+ public Bitmap getGuestDefaultIcon() {
+ if (mDefaultGuestUserIcon == null) {
+ mDefaultGuestUserIcon = UserIcons.convertToBitmap(UserIcons.getDefaultUserIcon(
+ mContext.getResources(), UserHandle.USER_NULL, false));
+ }
+ return mDefaultGuestUserIcon;
+ }
+
+ /**
+ * Gets an icon for the user.
+ *
+ * @param userInfo User for which we want to get the icon.
+ * @return a Bitmap for the icon
+ */
+ public Bitmap getUserIcon(UserInfo userInfo) {
+ Bitmap picture = mUserManager.getUserIcon(userInfo.id);
+
+ if (picture == null) {
+ return assignDefaultIcon(userInfo);
+ }
+
+ return picture;
+ }
+
+ /**
+ * Method for scaling a Bitmap icon to a desirable size.
+ *
+ * @param icon Bitmap to scale.
+ * @param desiredSize Wanted size for the icon.
+ * @return Drawable for the icon, scaled to the new size.
+ */
+ public Drawable scaleUserIcon(Bitmap icon, int desiredSize) {
+ Bitmap scaledIcon = Bitmap.createScaledBitmap(
+ icon, desiredSize, desiredSize, true /* filter */);
+ return new BitmapDrawable(mContext.getResources(), scaledIcon);
+ }
+
+ /**
+ * Sets new Username for the user.
+ *
+ * @param user User whose name should be changed.
+ * @param name New username.
+ */
+ public void setUserName(UserInfo user, String name) {
+ mUserManager.setUserName(user.id, name);
+ }
+
+ private void registerReceiver() {
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(Intent.ACTION_USER_REMOVED);
+ filter.addAction(Intent.ACTION_USER_ADDED);
+ filter.addAction(Intent.ACTION_USER_INFO_CHANGED);
+ filter.addAction(Intent.ACTION_USER_SWITCHED);
+ filter.addAction(Intent.ACTION_USER_STOPPED);
+ filter.addAction(Intent.ACTION_USER_UNLOCKED);
+ mContext.registerReceiverAsUser(mUserChangeReceiver, UserHandle.ALL, filter, null, null);
+ }
+
+ // Assigns a default icon to a user according to the user's id.
+ private Bitmap assignDefaultIcon(UserInfo userInfo) {
+ Bitmap bitmap = userInfo.isGuest()
+ ? getGuestDefaultIcon() : getUserDefaultIcon(userInfo);
+ mUserManager.setUserIcon(userInfo.id, bitmap);
+ return bitmap;
+ }
+
+ private void unregisterReceiver() {
+ mContext.unregisterReceiver(mUserChangeReceiver);
+ }
+
+ private String getDefaultAdminName() {
+ if (TextUtils.isEmpty(mDefaultAdminName)) {
+ mDefaultAdminName = mContext.getString(com.android.internal.R.string.owner_name);
+ }
+ return mDefaultAdminName;
+ }
+
+ @VisibleForTesting
+ void setDefaultAdminName(String defaultAdminName) {
+ mDefaultAdminName = defaultAdminName;
+ }
+
+ /**
+ * Interface for listeners that want to register for receiving updates to changes to the users
+ * on the system including removing and adding users, and changing user info.
+ */
+ public interface OnUsersUpdateListener {
+ /**
+ * Method that will get called when users list has been changed.
+ */
+ void onUsersUpdate();
+ }
+}