Merge "Remove support for archives from External and Bugreport providers."
diff --git a/Android.bp b/Android.bp
new file mode 100644
index 0000000..010b2b4
--- /dev/null
+++ b/Android.bp
@@ -0,0 +1,18 @@
+// Copyright (C) 2016 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+subdirs = [
+ "native/android",
+ "native/graphics/jni",
+]
diff --git a/Android.mk b/Android.mk
index 32c54f8..121a38e 100644
--- a/Android.mk
+++ b/Android.mk
@@ -1113,7 +1113,14 @@
$(static_doc_index_redirect): $(LOCAL_PATH)/docs/docs-documentation-redirect.html
$(copy-file-to-target)
+static_doc_properties := $(out_dir)/source.properties
+$(static_doc_properties): \
+ $(LOCAL_PATH)/docs/source.properties | $(ACP)
+ $(hide) mkdir -p $(dir $@)
+ $(hide) $(ACP) $< $@
+
$(full_target): $(static_doc_index_redirect)
+$(full_target): $(static_doc_properties)
$(full_target): $(framework_built)
diff --git a/api/current.txt b/api/current.txt
index bf549bf..1143d6b 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -59799,6 +59799,7 @@
method public static final void clearCache();
method public static final void clearCache(java.lang.ClassLoader);
method public boolean containsKey(java.lang.String);
+ method public java.lang.String getBaseBundleName();
method public static final java.util.ResourceBundle getBundle(java.lang.String);
method public static final java.util.ResourceBundle getBundle(java.lang.String, java.util.ResourceBundle.Control);
method public static final java.util.ResourceBundle getBundle(java.lang.String, java.util.Locale);
diff --git a/api/system-current.txt b/api/system-current.txt
index 382afa5..f187a87 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -63336,6 +63336,7 @@
method public static final void clearCache();
method public static final void clearCache(java.lang.ClassLoader);
method public boolean containsKey(java.lang.String);
+ method public java.lang.String getBaseBundleName();
method public static final java.util.ResourceBundle getBundle(java.lang.String);
method public static final java.util.ResourceBundle getBundle(java.lang.String, java.util.ResourceBundle.Control);
method public static final java.util.ResourceBundle getBundle(java.lang.String, java.util.Locale);
diff --git a/api/test-current.txt b/api/test-current.txt
index e94df76..d3c6e30 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -59901,6 +59901,7 @@
method public static final void clearCache();
method public static final void clearCache(java.lang.ClassLoader);
method public boolean containsKey(java.lang.String);
+ method public java.lang.String getBaseBundleName();
method public static final java.util.ResourceBundle getBundle(java.lang.String);
method public static final java.util.ResourceBundle getBundle(java.lang.String, java.util.ResourceBundle.Control);
method public static final java.util.ResourceBundle getBundle(java.lang.String, java.util.Locale);
diff --git a/core/java/android/accounts/ChooseTypeAndAccountActivity.java b/core/java/android/accounts/ChooseTypeAndAccountActivity.java
index 133df2b..aed7a36 100644
--- a/core/java/android/accounts/ChooseTypeAndAccountActivity.java
+++ b/core/java/android/accounts/ChooseTypeAndAccountActivity.java
@@ -399,7 +399,7 @@
* useless.
*/
private void setNonLabelThemeAndCallSuperCreate(Bundle savedInstanceState) {
- setTheme(R.style.Theme_Material_Light_Dialog_NoActionBar);
+ setTheme(R.style.Theme_DeviceDefault_Light_Dialog_NoActionBar);
super.onCreate(savedInstanceState);
}
diff --git a/core/java/android/animation/ObjectAnimator.java b/core/java/android/animation/ObjectAnimator.java
index 9a2aa30..0c21c4f 100644
--- a/core/java/android/animation/ObjectAnimator.java
+++ b/core/java/android/animation/ObjectAnimator.java
@@ -977,8 +977,9 @@
@Override
void animateValue(float fraction) {
final Object target = getTarget();
- if (target == null) {
- // We lost the target reference, cancel and clean up.
+ if (mTarget != null && target == null) {
+ // We lost the target reference, cancel and clean up. Note: we allow null target if the
+ /// target has never been set.
cancel();
return;
}
diff --git a/core/java/android/hardware/location/ContextHubService.java b/core/java/android/hardware/location/ContextHubService.java
index 19c82a5..35df015 100644
--- a/core/java/android/hardware/location/ContextHubService.java
+++ b/core/java/android/hardware/location/ContextHubService.java
@@ -18,6 +18,8 @@
import java.io.FileDescriptor;
import java.io.PrintWriter;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
import java.util.ArrayList;
import java.util.HashMap;
@@ -146,6 +148,36 @@
return mContextHubInfo[contextHubHandle];
}
+ // TODO(b/30808791): Remove this when NanoApp's API is correctly treating
+ // app IDs as 64-bits.
+ private static long parseAppId(NanoApp app) {
+ // NOTE: If this shifting seems odd (since it's actually "ONAN"), note
+ // that it matches how this is defined in context_hub.h.
+ final int HEADER_MAGIC =
+ (((int)'N' << 0) |
+ ((int)'A' << 8) |
+ ((int)'N' << 16) |
+ ((int)'O' << 24));
+ final int HEADER_MAGIC_OFFSET = 4;
+ final int HEADER_APP_ID_OFFSET = 8;
+
+ ByteBuffer header = ByteBuffer.wrap(app.getAppBinary())
+ .order(ByteOrder.LITTLE_ENDIAN);
+
+ try {
+ if (header.getInt(HEADER_MAGIC_OFFSET) == HEADER_MAGIC) {
+ // This is a legitimate nanoapp header. Let's grab the app ID.
+ return header.getLong(HEADER_APP_ID_OFFSET);
+ }
+ } catch (IndexOutOfBoundsException e) {
+ // The header is undersized. We'll fall through to our code
+ // path below, which handles being unable to parse the header.
+ }
+ // We failed to parse the header. Even through it's probably wrong,
+ // let's give NanoApp's idea of our ID. This is at least consistent.
+ return app.getAppId();
+ }
+
@Override
public int loadNanoApp(int contextHubHandle, NanoApp app) throws RemoteException {
checkPermissions();
@@ -165,27 +197,14 @@
msgHeader[HEADER_FIELD_MSG_TYPE] = MSG_LOAD_NANO_APP;
long appId = app.getAppId();
- // TODO(b/30808791): Remove this hack when the NanoApp API is fixed.
- // Due to a bug in the NanoApp API, only the least significant four
- // bytes of the app ID can be stored. The most significant five
- // bytes of a normal app ID are the "vendor", and thus the most
- // significant of the bytes we have is the least significant byte
- // of the vendor. In the case that byte is the ASCII value for
- // lower-case 'L', we assume the vendor is supposed to be "Googl"
- // and fill in the four most significant bytes accordingly.
+ // TODO(b/30808791): Remove this hack when the NanoApp API is fixed,
+ // and getAppId() returns a 'long' instead of an 'int'.
if ((appId >> 32) != 0) {
// We're unlikely to notice this warning, but at least
// we can avoid running our hack logic.
Log.w(TAG, "Code has not been updated since API fix.");
} else {
- // Note: Lower-case 'L', not the number 1.
- if (((appId >> 24) & 0xFF) == (long)'l') {
- // Assume we're a Google nanoapp.
- appId |= ((long)'G') << 56;
- appId |= ((long)'o') << 48;
- appId |= ((long)'o') << 40;
- appId |= ((long)'g') << 32;
- }
+ appId = parseAppId(app);
}
msgHeader[HEADER_FIELD_LOAD_APP_ID_LO] = (int)(appId & 0xFFFFFFFF);
diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java
index 1aed9b3..8d4d0a5 100644
--- a/core/java/android/os/PowerManager.java
+++ b/core/java/android/os/PowerManager.java
@@ -1340,6 +1340,11 @@
}
/** @hide */
+ public String getTag() {
+ return mTag;
+ }
+
+ /** @hide */
public void setHistoryTag(String tag) {
mHistoryTag = tag;
}
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 099622c..357d6f9 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -3126,7 +3126,7 @@
android:killAfterRestore="false"
android:icon="@drawable/ic_launcher_android"
android:supportsRtl="true"
- android:theme="@style/Theme.Material.Light.DarkActionBar"
+ android:theme="@style/Theme.DeviceDefault.Light.DarkActionBar"
android:defaultToDeviceProtectedStorage="true"
android:directBootAware="true">
<activity android:name="com.android.internal.app.ChooserActivity"
@@ -3163,7 +3163,7 @@
android:label="@string/managed_profile_label">
</activity-alias>
<activity android:name="com.android.internal.app.HeavyWeightSwitcherActivity"
- android:theme="@style/Theme.Material.Light.Dialog"
+ android:theme="@style/Theme.DeviceDefault.Light.Dialog"
android:label="@string/heavy_weight_switcher_title"
android:finishOnCloseSystemDialogs="true"
android:excludeFromRecents="true"
@@ -3196,7 +3196,7 @@
<activity android:name="android.accounts.ChooseAccountActivity"
android:excludeFromRecents="true"
android:exported="true"
- android:theme="@style/Theme.Material.Light.Dialog"
+ android:theme="@style/Theme.DeviceDefault.Light.Dialog"
android:label="@string/choose_account_label"
android:process=":ui">
</activity>
@@ -3204,14 +3204,14 @@
<activity android:name="android.accounts.ChooseTypeAndAccountActivity"
android:excludeFromRecents="true"
android:exported="true"
- android:theme="@style/Theme.Material.Light.Dialog"
+ android:theme="@style/Theme.DeviceDefault.Light.Dialog"
android:label="@string/choose_account_label"
android:process=":ui">
</activity>
<activity android:name="android.accounts.ChooseAccountTypeActivity"
android:excludeFromRecents="true"
- android:theme="@style/Theme.Material.Light.Dialog"
+ android:theme="@style/Theme.DeviceDefault.Light.Dialog"
android:label="@string/choose_account_label"
android:process=":ui">
</activity>
@@ -3219,19 +3219,19 @@
<activity android:name="android.accounts.CantAddAccountActivity"
android:excludeFromRecents="true"
android:exported="true"
- android:theme="@style/Theme.Material.Light.Dialog.NoActionBar"
+ 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.Material.Light.DialogWhenLarge"
+ android:theme="@style/Theme.DeviceDefault.Light.DialogWhenLarge"
android:process=":ui">
</activity>
<activity android:name="android.content.SyncActivityTooManyDeletes"
- android:theme="@style/Theme.Material.Light.Dialog"
+ android:theme="@style/Theme.DeviceDefault.Light.Dialog"
android:label="@string/sync_too_many_deletes"
android:process=":ui">
</activity>
@@ -3251,7 +3251,7 @@
</activity>
<activity android:name="com.android.internal.app.NetInitiatedActivity"
- android:theme="@style/Theme.Material.Light.Dialog.Alert"
+ android:theme="@style/Theme.DeviceDefault.Light.Dialog.Alert"
android:excludeFromRecents="true"
android:process=":ui">
</activity>
@@ -3272,7 +3272,7 @@
<activity android:name="com.android.internal.app.ConfirmUserCreationActivity"
android:excludeFromRecents="true"
android:process=":ui"
- android:theme="@style/Theme.Material.Light.Dialog.Alert">
+ 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" />
@@ -3280,7 +3280,7 @@
</activity>
<activity android:name="com.android.internal.app.UnlaunchableAppActivity"
- android:theme="@style/Theme.Material.Light.Dialog.Alert"
+ android:theme="@style/Theme.DeviceDefault.Light.Dialog.Alert"
android:excludeFromRecents="true"
android:process=":ui">
</activity>
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index 1961843..f588520 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Foonopsies"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Skermslot"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Sit af"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Foutverslag"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Neem foutverslag"</string>
<string name="bugreport_message" msgid="398447048750350456">"Dit sal inligting oor die huidige toestand van jou toestel insamel om as \'n e-posboodskap te stuur. Dit sal \'n tydjie neem vandat die foutverslag begin is totdat dit reg is om gestuur te word; wees asseblief geduldig."</string>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index e332cee1..ac2e76b 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"የስልክ አማራጮች"</string>
<string name="global_action_lock" msgid="2844945191792119712">"ማያ ቆልፍ"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"ኃይል አጥፋ"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"የሳንካ ሪፖርት"</string>
<string name="bugreport_title" msgid="2667494803742548533">"የሳንካ ሪፖርት ውሰድ"</string>
<string name="bugreport_message" msgid="398447048750350456">"ይሄ እንደ የኢሜይል መልዕክት አድርጎ የሚልከውን ስለመሣሪያዎ የአሁኑ ሁኔታ መረጃ ይሰበስባል። የሳንካ ሪፖርቱን ከመጀመር ጀምሮ እስኪላክ ድረስ ትንሽ ጊዜ ይወስዳል፤ እባክዎ ይታገሱ።"</string>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 388ae0f..3805612 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -222,6 +222,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"خيارات الهاتف"</string>
<string name="global_action_lock" msgid="2844945191792119712">"تأمين الشاشة"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"إيقاف التشغيل"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"تقرير الأخطاء"</string>
<string name="bugreport_title" msgid="2667494803742548533">"إعداد تقرير بالأخطاء"</string>
<string name="bugreport_message" msgid="398447048750350456">"سيجمع هذا معلومات حول حالة جهازك الحالي لإرسالها كرسالة إلكترونية، ولكنه سيستغرق وقتًا قليلاً من بدء عرض تقرير بالأخطاء. وحتى يكون جاهزًا للإرسال، الرجاء الانتظار."</string>
diff --git a/core/res/res/values-az-rAZ/strings.xml b/core/res/res/values-az-rAZ/strings.xml
index 3e84f7a..d3ee4a4 100644
--- a/core/res/res/values-az-rAZ/strings.xml
+++ b/core/res/res/values-az-rAZ/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Telefon seçimləri"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Ekran kilidi"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Söndür"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Baq hesabatı"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Baqı xəbər verin"</string>
<string name="bugreport_message" msgid="398447048750350456">"Bu, sizin hazırkı cihaz durumu haqqında məlumat toplayacaq ki, elektron məktub şəklində göndərsin. Baq raportuna başlamaq üçün bir az vaxt lazım ola bilər, bir az səbr edin."</string>
diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml
index 53fc741..72671f1 100644
--- a/core/res/res/values-b+sr+Latn/strings.xml
+++ b/core/res/res/values-b+sr+Latn/strings.xml
@@ -216,6 +216,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Opcije telefona"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Zaključaj ekran"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Isključi"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Izveštaj o grešci"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Napravi izveštaj o grešci"</string>
<string name="bugreport_message" msgid="398447048750350456">"Ovim će se prikupiti informacije o trenutnom stanju uređaja kako bi bile poslate u poruci e-pošte. Od započinjanja izveštaja o grešci do trenutka za njegovo slanje proći će neko vreme; budite strpljivi."</string>
@@ -256,9 +258,9 @@
<string name="permgrouplab_storage" msgid="1971118770546336966">"Skladište"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"pristupa slikama, medijima i datotekama na uređaju"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Mikrofon"</string>
- <string name="permgroupdesc_microphone" msgid="4988812113943554584">"snima audio snimke"</string>
+ <string name="permgroupdesc_microphone" msgid="4988812113943554584">"snima audio"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Kamera"</string>
- <string name="permgroupdesc_camera" msgid="3250611594678347720">"snima slike i video snimke"</string>
+ <string name="permgroupdesc_camera" msgid="3250611594678347720">"snima slike i video"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"upućuje telefonske pozive i upravlja njima"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Senzori za telo"</string>
diff --git a/core/res/res/values-be-rBY/strings.xml b/core/res/res/values-be-rBY/strings.xml
index 1ba2345..3f2e07c 100644
--- a/core/res/res/values-be-rBY/strings.xml
+++ b/core/res/res/values-be-rBY/strings.xml
@@ -218,6 +218,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Параметры тэлефона"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Блакіроўка экрана"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Выключыць"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Справаздача пра памылкі"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Справаздача пра памылку"</string>
<string name="bugreport_message" msgid="398447048750350456">"Будзе збiрацца iнфармацыя пра бягучы стан прылады, якая будзе адпраўляцца на электронную пошту. Стварэнне справаздачы пра памылкi зойме некаторы час."</string>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index 7dfd94c..e7ac345 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Опции на телефона"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Заключване на екрана"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Изключване"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Сигнал за програмна грешка"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Сигнал за програмна грешка"</string>
<string name="bugreport_message" msgid="398447048750350456">"По този начин ще се събере информация за текущото състояние на устройството ви, която да се изпрати като имейл съобщение. След стартирането на процеса ще мине известно време, докато сигналът за програмна грешка бъде готов за подаване. Моля, имайте търпение."</string>
diff --git a/core/res/res/values-bn-rBD/strings.xml b/core/res/res/values-bn-rBD/strings.xml
index 1a67dfa..b69a123 100644
--- a/core/res/res/values-bn-rBD/strings.xml
+++ b/core/res/res/values-bn-rBD/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"ফোন বিকল্পগুলি"</string>
<string name="global_action_lock" msgid="2844945191792119712">"স্ক্রীণ লক"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"পাওয়ার বন্ধ করুন"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"ত্রুটির প্রতিবেদন"</string>
<string name="bugreport_title" msgid="2667494803742548533">"ত্রুটির অভিযোগ করুন"</string>
<string name="bugreport_message" msgid="398447048750350456">"এটি একটি ই-মেল বার্তা পাঠানোর জন্য আপনার ডিভাইসের বর্তমান অবস্থা সম্পর্কে তথ্য সংগ্রহ করবে৷ ত্রুটির প্রতিবেদন শুরুর সময় থেকে এটি পাঠানোর জন্য প্রস্তুত হতে কিছুটা সময় নেবে; দয়া করে ধৈর্য রাখুন৷"</string>
diff --git a/core/res/res/values-bs-rBA/strings.xml b/core/res/res/values-bs-rBA/strings.xml
index 9519215..019ff1d 100644
--- a/core/res/res/values-bs-rBA/strings.xml
+++ b/core/res/res/values-bs-rBA/strings.xml
@@ -216,6 +216,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Opcije telefona"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Zaključavanje ekrana"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Isključi telefon"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Izvještaj o greškama"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Kreirajte izvještaj o greškama"</string>
<string name="bugreport_message" msgid="398447048750350456">"Ovim će se prikupljati informacije o trenutnom stanju uređaja, koji će biti poslani kao poruka e-pošte. Može malo potrajati dok se izvještaj o greškama ne kreira i bude spreman za slanje. Budite strpljivi."</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index baf4080..8926fce 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Opcions del telèfon"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Bloqueig de pantalla"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Apaga"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Informe d\'error"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Crea informe d\'errors"</string>
<string name="bugreport_message" msgid="398447048750350456">"Es recopilarà informació sobre l\'estat actual del dispositiu i se t\'enviarà per correu electrònic. Passaran uns quants minuts des de l\'inici de l\'informe d\'errors fins al seu enviament, per la qual cosa et recomanem que tinguis paciència."</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 9a6526e..a9ff27d 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -218,6 +218,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Možnosti telefonu"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Zámek obrazovky"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Vypnout"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Hlášení chyb"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Vytvořit chybové hlášení"</string>
<string name="bugreport_message" msgid="398447048750350456">"Shromažďuje informace o aktuálním stavu zařízení. Tyto informace je následně možné poslat v e-mailové zprávě, chvíli však potrvá, než bude hlášení o chybě připraveno k odeslání. Buďte prosím trpěliví."</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 8edd692..487432b 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Indstillinger for telefon"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Skærmlås"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Sluk"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Fejlrapport"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Lav fejlrapport"</string>
<string name="bugreport_message" msgid="398447048750350456">"Der indsamles oplysninger om din enheds aktuelle status, der efterfølgende sendes i en e-mail. Der går lidt tid, fra fejlrapporten påbegyndes, til den er klar til at blive sendt. Tak for tålmodigheden."</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index b2765d5..6b05253 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Telefonoptionen"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Displaysperre"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Ausschalten"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Fehlerbericht"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Fehlerbericht abrufen"</string>
<string name="bugreport_message" msgid="398447048750350456">"Bei diesem Fehlerbericht werden Daten zum aktuellen Status deines Geräts erfasst und als E-Mail versandt. Vom Start des Berichts bis zu seinem Versand kann es eine Weile dauern. Bitte habe etwas Geduld."</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index 2b0c4a7..a6ee8c2 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Επιλογές τηλεφώνου"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Κλείδωμα οθόνης"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Απενεργοποίηση"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Αναφορά σφαλμάτων"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Λήψη αναφοράς σφάλματος"</string>
<string name="bugreport_message" msgid="398447048750350456">"Θα συλλέξει πληροφορίες σχετικά με την τρέχουσα κατάσταση της συσκευής σας και θα τις στείλει μέσω μηνύματος ηλεκτρονικού ταχυδρομείου. Απαιτείται λίγος χρόνος για τη σύνταξη της αναφοράς σφάλματος και την αποστολή της. Κάντε λίγη υπομονή."</string>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index 8be6295..6342966 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Phone options"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Screen lock"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Power off"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Bug report"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Take bug report"</string>
<string name="bugreport_message" msgid="398447048750350456">"This will collect information about your current device state, to send as an email message. It will take a little time from starting the bug report until it is ready to be sent. Please be patient."</string>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 8be6295..6342966 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Phone options"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Screen lock"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Power off"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Bug report"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Take bug report"</string>
<string name="bugreport_message" msgid="398447048750350456">"This will collect information about your current device state, to send as an email message. It will take a little time from starting the bug report until it is ready to be sent. Please be patient."</string>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index 8be6295..6342966 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Phone options"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Screen lock"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Power off"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Bug report"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Take bug report"</string>
<string name="bugreport_message" msgid="398447048750350456">"This will collect information about your current device state, to send as an email message. It will take a little time from starting the bug report until it is ready to be sent. Please be patient."</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index f293d29..0ba371f 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Opciones de dispositivo"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Bloqueo de pantalla"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Apagar"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Informe de errores"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Iniciar informe de errores"</string>
<string name="bugreport_message" msgid="398447048750350456">"Se recopilará información sobre el estado actual de tu dispositivo, que se enviará por correo. Pasarán unos minutos desde que se inicie el informe de errores hasta que se envíe, por lo que te recomendamos que tengas paciencia."</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index 5760e12..d60fa83 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Opciones del teléfono"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Bloqueo de pantalla"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Apagar"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Informe de error"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Crear informe de errores"</string>
<string name="bugreport_message" msgid="398447048750350456">"Se recopilará información sobre el estado actual de tu dispositivo y se enviará por correo electrónico. Pasarán unos minutos desde que empiece a generarse el informe de errores hasta que se envíe."</string>
diff --git a/core/res/res/values-et-rEE/strings.xml b/core/res/res/values-et-rEE/strings.xml
index 5066ce1..15fa79f 100644
--- a/core/res/res/values-et-rEE/strings.xml
+++ b/core/res/res/values-et-rEE/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Telefonivalikud"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Ekraanilukk"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Lülita välja"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Veaaruanne"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Veaaruande võtmine"</string>
<string name="bugreport_message" msgid="398447048750350456">"Nii kogutakse teavet teie seadme praeguse oleku kohta, et saata see meilisõnumina. Enne kui saate veaaruande ära saata, võtab selle loomine natuke aega; varuge kannatust."</string>
diff --git a/core/res/res/values-eu-rES/strings.xml b/core/res/res/values-eu-rES/strings.xml
index 0a6c753..47e64c3 100644
--- a/core/res/res/values-eu-rES/strings.xml
+++ b/core/res/res/values-eu-rES/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Telefonoaren aukerak"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Pantailaren blokeoa"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Itzali"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Akatsen txostena"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Sortu akatsen txostena"</string>
<string name="bugreport_message" msgid="398447048750350456">"Gailuaren uneko egoerari buruzko informazioa bilduko da, mezu elektroniko gisa bidaltzeko. Minutu batzuk igaroko dira akatsen txostena sortzen hasten denetik bidaltzeko prest egon arte. Itxaron, mesedez."</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 35589b0..95c0db7 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"گزینههای تلفن"</string>
<string name="global_action_lock" msgid="2844945191792119712">"قفل صفحه"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"خاموش کردن"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"گزارش اشکال"</string>
<string name="bugreport_title" msgid="2667494803742548533">"گرفتن گزارش اشکال"</string>
<string name="bugreport_message" msgid="398447048750350456">"این گزارش اطلاعات مربوط به وضعیت دستگاه کنونی شما را جمعآوری میکند تا به صورت یک پیام رایانامه ارسال شود. از زمان شروع گزارش اشکال تا آماده شدن برای ارسال اندکی زمان میبرد؛ لطفاً شکیبا باشید."</string>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 07afcf6..e11b2ca 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Puhelimen asetukset"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Näytön lukitus"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Katkaise virta"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Virheraportti"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Luo virheraportti"</string>
<string name="bugreport_message" msgid="398447048750350456">"Toiminto kerää tietoja laitteen tilasta ja lähettää ne sähköpostitse. Virheraportti on valmis lähetettäväksi hetken kuluttua - kiitos kärsivällisyydestäsi."</string>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index bf7e3dd..c1e1808 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Options du téléphone"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Verrouillage de l\'écran"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Éteindre"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Rapport de bogue"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Créer un rapport de bogue"</string>
<string name="bugreport_message" msgid="398447048750350456">"Cela permet de recueillir des informations concernant l\'état actuel de votre appareil. Ces informations sont ensuite envoyées sous forme de courriel. Merci de patienter pendant la préparation du rapport de bogue. Cette opération peut prendre quelques instants."</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 28073a8..850301f 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Options du téléphone"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Verrouillage de l\'écran"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Éteindre"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Rapport de bug"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Créer un rapport de bug"</string>
<string name="bugreport_message" msgid="398447048750350456">"Cela permet de recueillir des informations concernant l\'état actuel de votre appareil. Ces informations sont ensuite envoyées sous forme d\'e-mail. Merci de patienter pendant la préparation du rapport de bug. Cette opération peut prendre quelques instants."</string>
diff --git a/core/res/res/values-gl-rES/strings.xml b/core/res/res/values-gl-rES/strings.xml
index ea94f6a..8a37cff 100644
--- a/core/res/res/values-gl-rES/strings.xml
+++ b/core/res/res/values-gl-rES/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Opcións de teléfono"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Bloqueo da pantalla"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Apagar"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Informe de erros"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Crear informe de erros"</string>
<string name="bugreport_message" msgid="398447048750350456">"Este informe recompilará información acerca do estado actual do teu dispositivo para enviala en forma de mensaxe de correo electrónico. O informe de erros tardará un pouco en completarse desde o seu inicio ata que estea preparado para enviarse, polo que che recomendamos que teñas paciencia."</string>
diff --git a/core/res/res/values-gu-rIN/strings.xml b/core/res/res/values-gu-rIN/strings.xml
index b3af1f1..2cd3da8 100644
--- a/core/res/res/values-gu-rIN/strings.xml
+++ b/core/res/res/values-gu-rIN/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"ફોન વિકલ્પો"</string>
<string name="global_action_lock" msgid="2844945191792119712">"સ્ક્રીન લૉક"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"પાવર બંધ"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"બગ રિપોર્ટ"</string>
<string name="bugreport_title" msgid="2667494803742548533">"બગ રિપોર્ટ લો"</string>
<string name="bugreport_message" msgid="398447048750350456">"આ, એક ઇ-મેઇલ સંદેશ તરીકે મોકલવા માટે, તમારા વર્તમાન ઉપકરણ સ્થિતિ વિશેની માહિતી એકત્રિત કરશે. એક બગ રિપોર્ટ પ્રારંભ કરીને તે મોકલવા માટે તૈયાર ન થઈ જાય ત્યાં સુધી તેમાં થોડો સમય લાગશે; કૃપા કરીને ધીરજ રાખો."</string>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index 6a093965..d87f747 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"फ़ोन विकल्प"</string>
<string name="global_action_lock" msgid="2844945191792119712">"स्क्रीन लॉक"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"पावर बंद"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"बग रिपोर्ट"</string>
<string name="bugreport_title" msgid="2667494803742548533">"बग रिपोर्ट प्राप्त करें"</string>
<string name="bugreport_message" msgid="398447048750350456">"ईमेल संदेश के रूप में भेजने के लिए, इसके द्वारा आपके डिवाइस की वर्तमान स्थिति के बारे में जानकारी एकत्र की जाएगी. बग रिपोर्ट प्रारंभ करने से लेकर भेजने के लिए तैयार होने तक कुछ समय लगेगा; कृपया धैर्य रखें."</string>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index b28ea1c..ed55b3f 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -216,6 +216,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Opcije telefona"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Zaključavanje zaslona"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Isključi"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Izvješće o bugovima"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Izvješće o programskoj pogrešci"</string>
<string name="bugreport_message" msgid="398447048750350456">"Time će se prikupiti podaci o trenutačnom stanju vašeg uređaja koje ćete nam poslati u e-poruci. Za pripremu izvješća o programskoj pogrešci potrebno je nešto vremena pa vas molimo za strpljenje."</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 470f17f..f4ea98d 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Telefonbeállítások"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Képernyő lezárása"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Kikapcsolás"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Programhiba bejelentése"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Hibajelentés készítése"</string>
<string name="bugreport_message" msgid="398447048750350456">"Ezzel információt fog gyűjteni az eszköz jelenlegi állapotáról, amelyet a rendszer e-mailben fog elküldeni. Kérjük, legyen türelemmel, amíg a hibajelentés elkészül, és küldhető állapotba kerül."</string>
diff --git a/core/res/res/values-hy-rAM/strings.xml b/core/res/res/values-hy-rAM/strings.xml
index b0f0f51..f43dfb3 100644
--- a/core/res/res/values-hy-rAM/strings.xml
+++ b/core/res/res/values-hy-rAM/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Հեռախոսի ընտրանքներ"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Էկրանի փական"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Անջատել"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Վրիպակի զեկույց"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Գրել սխալի զեկույց"</string>
<string name="bugreport_message" msgid="398447048750350456">"Սա տեղեկություններ կհավաքագրի ձեր սարքի առկա կարգավիճակի մասին և կուղարկի այն էլեկտրոնային նամակով: Որոշակի ժամանակ կպահանջվի վրիպակի մասին զեկուցելու պահից սկսած մինչ ուղարկելը: Խնդրում ենք փոքր-ինչ համբերատար լինել:"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index 35c489a..2cbb6fb 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Opsi telepon"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Kunci layar"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Matikan daya"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Laporan bug"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Ambil laporan bug"</string>
<string name="bugreport_message" msgid="398447048750350456">"Ini akan mengumpulkan informasi status perangkat Anda saat ini, untuk dikirimkan sebagai pesan email. Harap bersabar, mungkin perlu waktu untuk memulai laporan bug hingga siap dikirim."</string>
diff --git a/core/res/res/values-is-rIS/strings.xml b/core/res/res/values-is-rIS/strings.xml
index 59b3ecb..ffd1e31 100644
--- a/core/res/res/values-is-rIS/strings.xml
+++ b/core/res/res/values-is-rIS/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Valkostir síma"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Skjálás"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Slökkva"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Villutilkynning"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Útbúa villutilkynningu"</string>
<string name="bugreport_message" msgid="398447048750350456">"Þetta safnar upplýsingum um núverandi stöðu tækisins til að senda með tölvupósti. Það tekur smástund frá því villutilkynningin er ræst og þar til hún er tilbúin til sendingar – sýndu biðlund."</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 9c0f6b7..e576d8d 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Opzioni telefono"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Blocco schermo"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Spegni"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Segnalazione di bug"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Apri segnalazione bug"</string>
<string name="bugreport_message" msgid="398447048750350456">"Verranno raccolte informazioni sullo stato corrente del dispositivo che saranno inviate sotto forma di messaggio email. Passerà un po\' di tempo prima che la segnalazione di bug aperta sia pronta per essere inviata; ti preghiamo di avere pazienza."</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 466d574..c0c1871 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -218,6 +218,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"אפשרויות טלפון"</string>
<string name="global_action_lock" msgid="2844945191792119712">"נעילת מסך"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"כיבוי"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"דיווח על באג"</string>
<string name="bugreport_title" msgid="2667494803742548533">"שלח דיווח על באג"</string>
<string name="bugreport_message" msgid="398447048750350456">"פעולה זו תאסוף מידע על מצב המכשיר הנוכחי שלך על מנת לשלוח אותו כהודעת אימייל. היא תימשך זמן קצר מרגע פתיחת דיווח הבאג ועד לשליחת ההודעה בפועל. אנא המתן בסבלנות."</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index ddd6e83..5924737 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"携帯電話オプション"</string>
<string name="global_action_lock" msgid="2844945191792119712">"画面ロック"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"電源を切る"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"バグレポート"</string>
<string name="bugreport_title" msgid="2667494803742548533">"バグレポートを取得"</string>
<string name="bugreport_message" msgid="398447048750350456">"現在の端末の状態に関する情報が収集され、その内容がメールで送信されます。バグレポートが開始してから送信可能な状態となるまでには多少の時間がかかりますのでご了承ください。"</string>
diff --git a/core/res/res/values-ka-rGE/strings.xml b/core/res/res/values-ka-rGE/strings.xml
index 3acc952..b563591 100644
--- a/core/res/res/values-ka-rGE/strings.xml
+++ b/core/res/res/values-ka-rGE/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"ტელეფონის პარამეტრები"</string>
<string name="global_action_lock" msgid="2844945191792119712">"ეკრანის დაბლოკვა"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"კვების გამორთვა"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"ხარვეზის შესახებ ანგარიში"</string>
<string name="bugreport_title" msgid="2667494803742548533">"შექმენით შეცდომის ანგარიში"</string>
<string name="bugreport_message" msgid="398447048750350456">"იგი შეაგროვებს ინფორმაციას თქვენი მოწყობილობის ამჟამინდელი მდგომარეობის შესახებ, რათა ის ელფოსტის შეტყობინების სახით გააგზავნოს. ხარვეზის ანგარიშის მომზადებასა და შეტყობინების გაგზავნას გარკვეული დრო სჭირდება. გთხოვთ, მოითმინოთ."</string>
diff --git a/core/res/res/values-kk-rKZ/strings.xml b/core/res/res/values-kk-rKZ/strings.xml
index c63d772..e752aba 100644
--- a/core/res/res/values-kk-rKZ/strings.xml
+++ b/core/res/res/values-kk-rKZ/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Телефон опциялары"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Экранды құлыптау"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Өшіру"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Вирус туралы хабарлау"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Қате туралы есеп құру"</string>
<string name="bugreport_message" msgid="398447048750350456">"Құрылғының қазіргі күйі туралы ақпаратты жинап, электрондық хабармен жібереді. Есеп әзір болғанша біраз уақыт кетеді, шыдай тұрыңыз."</string>
diff --git a/core/res/res/values-km-rKH/strings.xml b/core/res/res/values-km-rKH/strings.xml
index 9f24460..3fcf41c 100644
--- a/core/res/res/values-km-rKH/strings.xml
+++ b/core/res/res/values-km-rKH/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"ជម្រើសទូរស័ព្ទ"</string>
<string name="global_action_lock" msgid="2844945191792119712">"ចាក់សោអេក្រង់"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"បិទ"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"របាយការណ៍កំហុស"</string>
<string name="bugreport_title" msgid="2667494803742548533">"យករបាយការណ៍កំហុស"</string>
<string name="bugreport_message" msgid="398447048750350456">"វានឹងប្រមូលព័ត៌មានអំពីស្ថានភាពឧបករណ៍របស់អ្នក ដើម្បីផ្ញើជាសារអ៊ីមែល។ វានឹងចំណាយពេលតិចពីពេលចាប់ផ្ដើមរបាយការណ៍រហូតដល់ពេលវារួចរាល់ដើម្បីផ្ញើ សូមអត់ធ្មត់។"</string>
diff --git a/core/res/res/values-kn-rIN/strings.xml b/core/res/res/values-kn-rIN/strings.xml
index 095fee6..cd3f948 100644
--- a/core/res/res/values-kn-rIN/strings.xml
+++ b/core/res/res/values-kn-rIN/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"ಫೋನ್ ಆಯ್ಕೆಗಳು"</string>
<string name="global_action_lock" msgid="2844945191792119712">"ಸ್ಕ್ರೀನ್ ಲಾಕ್"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"ಪವರ್ ಆಫ್ ಮಾಡು"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"ದೋಷದ ವರದಿ"</string>
<string name="bugreport_title" msgid="2667494803742548533">"ದೋಷ ವರದಿ ರಚಿಸಿ"</string>
<string name="bugreport_message" msgid="398447048750350456">"ನಿಮ್ಮ ಸಾಧನದ ಪ್ರಸ್ತುತ ಸ್ಥಿತಿಯ ಕುರಿತು ಮಾಹಿತಿಯನ್ನು ಸಂಗ್ರಹಿಸಿಕೊಳ್ಳುವುದರ ಜೊತೆ ಇ-ಮೇಲ್ ರೂಪದಲ್ಲಿ ನಿಮಗೆ ರವಾನಿಸುತ್ತದೆ. ಇದು ದೋಷ ವರದಿಯನ್ನು ಪ್ರಾರಂಭಿಸಿದ ಸಮಯದಿಂದ ಅದನ್ನು ಕಳುಹಿಸುವವರೆಗೆ ಸ್ವಲ್ಪ ಸಮಯವನ್ನು ತೆಗೆದುಕೊಳ್ಳುತ್ತದೆ; ದಯವಿಟ್ಟು ತಾಳ್ಮೆಯಿಂದಿರಿ."</string>
@@ -979,8 +981,8 @@
<string name="whichSendToApplication" msgid="8272422260066642057">"ಇದನ್ನು ಬಳಸಿಕೊಂಡು ಕಳುಹಿಸಿ"</string>
<string name="whichSendToApplicationNamed" msgid="7768387871529295325">"%1$s ಬಳಸಿಕೊಂಡು ಕಳುಹಿಸಿ"</string>
<string name="whichSendToApplicationLabel" msgid="8878962419005813500">"ಕಳುಹಿಸು"</string>
- <string name="whichHomeApplication" msgid="4307587691506919691">"ಹೋಮ್ ಅಪ್ಲಿಕೇಶನ್ ಆಯ್ಕೆಮಾಡಿ"</string>
- <string name="whichHomeApplicationNamed" msgid="4493438593214760979">"ಹೋಮ್ ಎಂಬಂತೆ %1$s ಅನ್ನು ಬಳಸಿ"</string>
+ <string name="whichHomeApplication" msgid="4307587691506919691">"ಮುಖಪುಟ ಅಪ್ಲಿಕೇಶನ್ ಆಯ್ಕೆಮಾಡಿ"</string>
+ <string name="whichHomeApplicationNamed" msgid="4493438593214760979">"ಮುಖಪುಟ ಎಂಬಂತೆ %1$s ಅನ್ನು ಬಳಸಿ"</string>
<string name="whichHomeApplicationLabel" msgid="809529747002918649">"ಚಿತ್ರ ಕ್ಯಾಪ್ಚರ್ ಮಾಡಿ"</string>
<string name="whichImageCaptureApplication" msgid="3680261417470652882">"ಇದರ ಜೊತೆಗೆ ಚಿತ್ರ ಕ್ಯಾಪ್ಚರ್ ಮಾಡಿ"</string>
<string name="whichImageCaptureApplicationNamed" msgid="8619384150737825003">"%1$s ಜೊತೆ ಚಿತ್ರ ಕ್ಯಾಪ್ಚರ್ ಮಾಡಿ"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index f5f0f99..8de15a8 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"휴대전화 옵션"</string>
<string name="global_action_lock" msgid="2844945191792119712">"화면 잠금"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"종료"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"버그 신고"</string>
<string name="bugreport_title" msgid="2667494803742548533">"버그 신고"</string>
<string name="bugreport_message" msgid="398447048750350456">"현재 기기 상태에 대한 정보를 수집하여 이메일 메시지로 전송합니다. 버그 신고를 시작하여 전송할 준비가 되려면 약간 시간이 걸립니다."</string>
diff --git a/core/res/res/values-ky-rKG/strings.xml b/core/res/res/values-ky-rKG/strings.xml
index 9a28b98..2d155bf 100644
--- a/core/res/res/values-ky-rKG/strings.xml
+++ b/core/res/res/values-ky-rKG/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Телефон мүмкүнчүлүктөрү"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Экран кулпусу"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Кубатын өчүрүү"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Ката тууралуу билдирүү"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Ката тууралуу билдирүү түзүү"</string>
<string name="bugreport_message" msgid="398447048750350456">"Бул сиздин түзмөгүңүздүн учурдагы абалын эмейл билдирүүсү катары жөнөтүш максатында маалымат чогултат. Ката тууралуу билдирүү түзүлүп башталып, жөнөтүлгөнгө чейин бир аз убакыт керек болот; сураныч, бир аз күтө туруңуз."</string>
diff --git a/core/res/res/values-lo-rLA/strings.xml b/core/res/res/values-lo-rLA/strings.xml
index bb27f43..0676d15 100644
--- a/core/res/res/values-lo-rLA/strings.xml
+++ b/core/res/res/values-lo-rLA/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"ໂຕເລືອກໂທລະສັບ"</string>
<string name="global_action_lock" msgid="2844945191792119712">"ລັອກໜ້າຈໍ"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"ປິດ"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"ລາຍງານຂໍ້ຜິດພາດ"</string>
<string name="bugreport_title" msgid="2667494803742548533">"ໃຊ້ລາຍງານຂໍ້ບົກພ່ອງ"</string>
<string name="bugreport_message" msgid="398447048750350456">"ນີ້ຈະເປັນການເກັບກຳຂໍ້ມູນກ່ຽວກັບ ສະຖານະປັດຈຸບັນຂອງອຸປະກອນທ່ານ ເພື່ອສົ່ງເປັນຂໍ້ຄວາມທາງອີເມວ. ມັນຈະໃຊ້ເວລາໜ້ອຍນຶ່ງ ໃນການເລີ່ມຕົ້ນການລາຍງານຂໍ້ຜິດພາດ ຈົນກວ່າຈະພ້ອມທີ່ຈະສົ່ງໄດ້, ກະລຸນາລໍຖ້າ."</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index 64e0d44..f43e6e8 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -218,6 +218,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Telefono parinktys"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Ekrano užraktas"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Išjungiamas maitinimas"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Pranešimas apie riktą"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Pranešti apie riktą"</string>
<string name="bugreport_message" msgid="398447048750350456">"Bus surinkta informacija apie dabartinę įrenginio būseną ir išsiųsta el. pašto pranešimu. Šiek tiek užtruks, kol pranešimas apie riktą bus paruoštas siųsti; būkite kantrūs."</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index c3d126c..3aa408a 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -216,6 +216,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Tālruņa opcijas"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Ekrāna bloķētājs"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Strāvas padeve ir izslēgta."</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Kļūdu ziņojums"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Kļūdu ziņojuma sagatavošana"</string>
<string name="bugreport_message" msgid="398447048750350456">"Veicot šo darbību, tiks apkopota informācija par jūsu ierīces pašreizējo stāvokli un nosūtīta e-pasta ziņojuma veidā. Kļūdu ziņojuma pabeigšanai un nosūtīšanai var būt nepieciešams laiks. Lūdzu, esiet pacietīgs."</string>
diff --git a/core/res/res/values-mk-rMK/strings.xml b/core/res/res/values-mk-rMK/strings.xml
index 4a5d24b..437df10 100644
--- a/core/res/res/values-mk-rMK/strings.xml
+++ b/core/res/res/values-mk-rMK/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Опции на телефон"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Заклучи екран"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Исклучи"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Извештај за грешка"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Земи извештај за грешки"</string>
<string name="bugreport_message" msgid="398447048750350456">"Ова ќе собира информации за моменталната состојба на вашиот уред, за да ги испрати како порака по е-пошта. Тоа ќе одземе малку време почнувајќи од извештајот за грешки додека не се подготви за праќање; бидете трпеливи."</string>
diff --git a/core/res/res/values-ml-rIN/strings.xml b/core/res/res/values-ml-rIN/strings.xml
index e74074c..76d05c7 100644
--- a/core/res/res/values-ml-rIN/strings.xml
+++ b/core/res/res/values-ml-rIN/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"ഫോൺ ഓപ്ഷനുകൾ"</string>
<string name="global_action_lock" msgid="2844945191792119712">"സ്ക്രീൻ ലോക്ക്"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"പവർ ഓഫാക്കുക"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"ബഗ് റിപ്പോർട്ട്"</string>
<string name="bugreport_title" msgid="2667494803742548533">"ബഗ് റിപ്പോർട്ട് എടുക്കുക"</string>
<string name="bugreport_message" msgid="398447048750350456">"ഒരു ഇമെയിൽ സന്ദേശമായി അയയ്ക്കുന്നതിന്, ഇത് നിങ്ങളുടെ നിലവിലെ ഉപകരണ നിലയെക്കുറിച്ചുള്ള വിവരങ്ങൾ ശേഖരിക്കും. ബഗ് റിപ്പോർട്ട് ആരംഭിക്കുന്നതിൽ നിന്ന് ഇത് അയയ്ക്കാനായി തയ്യാറാകുന്നതുവരെ അൽപ്പസമയമെടുക്കും; ക്ഷമയോടെ കാത്തിരിക്കുക."</string>
diff --git a/core/res/res/values-mn-rMN/strings.xml b/core/res/res/values-mn-rMN/strings.xml
index 96643dc..074e5c3 100644
--- a/core/res/res/values-mn-rMN/strings.xml
+++ b/core/res/res/values-mn-rMN/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Утасны сонголтууд"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Дэлгэцний түгжээ"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Унтраах"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Алдаа мэдээллэх"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Согог репорт авах"</string>
<string name="bugreport_message" msgid="398447048750350456">"Энэ таны төхөөрөмжийн одоогийн статусын талаарх мэдээллийг цуглуулах ба имэйл мессеж болгон илгээнэ. Алдааны мэдэгдлээс эхэлж илгээхэд бэлэн болоход хэсэг хугацаа зарцуулагдана тэвчээртэй байна уу."</string>
diff --git a/core/res/res/values-mr-rIN/strings.xml b/core/res/res/values-mr-rIN/strings.xml
index d98bb85..1997714 100644
--- a/core/res/res/values-mr-rIN/strings.xml
+++ b/core/res/res/values-mr-rIN/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"फोन पर्याय"</string>
<string name="global_action_lock" msgid="2844945191792119712">"स्क्रीन लॉक"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"बंद"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"दोष अहवाल"</string>
<string name="bugreport_title" msgid="2667494803742548533">"दोष अहवाल घ्या"</string>
<string name="bugreport_message" msgid="398447048750350456">"ई-मेल संदेश म्हणून पाठविण्यासाठी, हे आपल्या वर्तमान डिव्हाइस स्थितीविषयी माहिती संकलित करेल. दोष अहवाल प्रारंभ करण्यापासून तो पाठविण्यापर्यंत थोडा वेळ लागेल; कृपया धीर धरा."</string>
diff --git a/core/res/res/values-ms-rMY/strings.xml b/core/res/res/values-ms-rMY/strings.xml
index 1596dee..0846ede 100644
--- a/core/res/res/values-ms-rMY/strings.xml
+++ b/core/res/res/values-ms-rMY/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Pilihan telefon"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Kunci skrin"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Matikan kuasa"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Laporan pepijat"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Ambil laporan pepijat"</string>
<string name="bugreport_message" msgid="398447048750350456">"Ini akan mengumpul maklumat tentang keadaan peranti semasa anda untuk dihantarkan sebagai mesej e-mel. Harap bersabar, mungkin perlu sedikit masa untuk memulakan laporan sehingga siap untuk dihantar."</string>
diff --git a/core/res/res/values-my-rMM/strings.xml b/core/res/res/values-my-rMM/strings.xml
index 73d8561..549bb69 100644
--- a/core/res/res/values-my-rMM/strings.xml
+++ b/core/res/res/values-my-rMM/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"ဖုန်းဆိုင်ရာရွေးချယ်မှုများ"</string>
<string name="global_action_lock" msgid="2844945191792119712">"ဖုန်းမျက်နှာပြင်အား သော့ချရန်"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"ပါဝါပိတ်ရန်"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"အမှားရှာဖွေပြင်ဆင်မှုမှတ်တမ်း"</string>
<string name="bugreport_title" msgid="2667494803742548533">"အမှားရှာဖွေပြင်ဆင်မှုမှတ်တမ်းအား ယူရန်"</string>
<string name="bugreport_message" msgid="398447048750350456">"သင့်ရဲ့ လက်ရှိ စက်အခြေအနေ အချက်အလက်များကို အီးမေးလ် အနေဖြင့် ပေးပို့ရန် စုဆောင်းပါမည်။ အမှားရှာဖွေပြင်ဆင်မှုမှတ်တမ်းမှ ပေးပို့ရန် အသင့်ဖြစ်သည်အထိ အချိန် အနည်းငယ်ကြာမြင့်မှာ ဖြစ်သဖြင့် သည်းခံပြီး စောင့်ပါရန်"</string>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index b2045e7..33f1436 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Telefoninnstillinger"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Lås skjermen"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Slå av"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Feilrapport"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Utfør feilrapport"</string>
<string name="bugreport_message" msgid="398447048750350456">"Informasjon om tilstanden til enheten din samles inn og sendes som en e-post. Det tar litt tid fra du starter feilrapporten til e-posten er klar, så vær tålmodig."</string>
diff --git a/core/res/res/values-ne-rNP/strings.xml b/core/res/res/values-ne-rNP/strings.xml
index 97eccb8..d4ad51f 100644
--- a/core/res/res/values-ne-rNP/strings.xml
+++ b/core/res/res/values-ne-rNP/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"फोन विकल्पहरू"</string>
<string name="global_action_lock" msgid="2844945191792119712">"स्क्रिन बन्द"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"बन्द गर्नुहोस्"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"बग रिपोर्ट"</string>
<string name="bugreport_title" msgid="2667494803742548533">"बग रिपोर्ट लिनुहोस्"</string>
<string name="bugreport_message" msgid="398447048750350456">"एउटा इमेल सन्देशको रूपमा पठाउनलाई यसले तपाईँको हालैको उपकरणको अवस्थाको बारेमा सूचना जम्मा गर्ने छ। बग रिपोर्ट सुरु गरेदेखि पठाउन तयार नभएसम्म यसले केही समय लिन्छ; कृपया धैर्य गर्नुहोस्।"</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 30c7f7c..33fcb8a 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Telefoonopties"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Schermvergrendeling"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Uitschakelen"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Foutenrapport"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Foutenrapport genereren"</string>
<string name="bugreport_message" msgid="398447048750350456">"Hiermee worden gegevens over de huidige status van je apparaat verzameld en als e-mail verzonden. Wanneer u een foutenrapport start, duurt het even voordat het kan worden verzonden. Even geduld alstublieft."</string>
diff --git a/core/res/res/values-pa-rIN/strings.xml b/core/res/res/values-pa-rIN/strings.xml
index f5210f8..ae8a4b1 100644
--- a/core/res/res/values-pa-rIN/strings.xml
+++ b/core/res/res/values-pa-rIN/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"ਫੋਨ ਚੋਣਾਂ"</string>
<string name="global_action_lock" msgid="2844945191792119712">"ਸਕ੍ਰੀਨ ਲੌਕ"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"ਪਾਵਰ ਬੰਦ"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"ਬਗ ਰਿਪੋਰਟ"</string>
<string name="bugreport_title" msgid="2667494803742548533">"ਬਗ ਰਿਪੋਰਟ ਲਓ"</string>
<string name="bugreport_message" msgid="398447048750350456">"ਇਹ ਇੱਕ ਈ-ਮੇਲ ਸੁਨੇਹਾ ਭੇਜਣ ਲਈ, ਤੁਹਾਡੀ ਵਰਤਮਾਨ ਡੀਵਾਈਸ ਬਾਰੇ ਜਾਣਕਾਰੀ ਇਕੱਤਰ ਕਰੇਗਾ। ਬਗ ਰਿਪੋਰਟ ਸ਼ੁਰੂ ਕਰਨ ਵਿੱਚ ਥੋੜ੍ਹਾ ਸਮਾਂ ਲੱਗੇਗਾ ਜਦੋਂ ਤੱਕ ਇਹ ਭੇਜੇ ਜਾਣ ਲਈ ਤਿਆਰ ਨਾ ਹੋਵੇ, ਕਿਰਪਾ ਕਰਕੇ ਧੀਰਜ ਰੱਖੋ।"</string>
@@ -1638,7 +1640,7 @@
<item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ਚੁਣਿਆ ਗਿਆ</item>
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ਚੁਣਿਆ ਗਿਆ</item>
</plurals>
- <string name="default_notification_channel_label" msgid="6950908610709016902">"ਵਿਵਿਧ"</string>
+ <string name="default_notification_channel_label" msgid="6950908610709016902">"ਫੁਟਕਲ"</string>
<string name="importance_from_user" msgid="7318955817386549931">"ਤੁਸੀਂ ਇਹਨਾਂ ਸੂਚਨਾਵਾਂ ਦੀ ਮਹੱਤਤਾ ਸੈੱਟ ਕੀਤੀ।"</string>
<string name="importance_from_person" msgid="9160133597262938296">"ਇਹ ਸ਼ਾਮਲ ਲੋਕਾਂ ਦੇ ਕਾਰਨ ਮਹੱਤਵਪੂਰਨ ਹੈ।"</string>
<string name="user_creation_account_exists" msgid="1942606193570143289">"ਕੀ <xliff:g id="APP">%1$s</xliff:g> ਨੂੰ <xliff:g id="ACCOUNT">%2$s</xliff:g> ਨਾਲ ਇੱਕ ਨਵਾਂ ਵਰਤੋਂਕਾਰ ਬਣਾਉਣ ਦੀ ਮਨਜ਼ੂਰੀ ਦੇਣੀ ਹੈ?"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 91931b1..8a2dae5 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -218,6 +218,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Opcje telefonu"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Blokada ekranu"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Wyłącz"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Zgłoszenie błędu"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Zgłoś błąd"</string>
<string name="bugreport_message" msgid="398447048750350456">"Informacje o bieżącym stanie urządzenia zostaną zebrane i wysłane e-mailem. Przygotowanie zgłoszenia błędu do wysłania chwilę potrwa, więc zachowaj cierpliwość."</string>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index c5ce01f..191a41a 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Opções do telefone"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Bloquear tela"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Desligar"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Relatório de bugs"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Obter relatório de bugs"</string>
<string name="bugreport_message" msgid="398447048750350456">"Isto coletará informações sobre o estado atual do dispositivo para enviá-las em uma mensagem de e-mail. Após iniciar o relatório de bugs, será necessário aguardar algum tempo até que esteja pronto para ser enviado."</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index b25f8ff..9db6a76 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Opções do telefone"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Bloqueio de ecrã"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Desligar"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Relatório de erros"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Criar relatório de erros"</string>
<string name="bugreport_message" msgid="398447048750350456">"Será recolhida informação sobre o estado atual do seu dispositivo a enviar através de uma mensagem de email. Demorará algum tempo até que o relatório de erro esteja pronto para ser enviado. Aguarde um pouco."</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index c5ce01f..191a41a 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Opções do telefone"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Bloquear tela"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Desligar"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Relatório de bugs"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Obter relatório de bugs"</string>
<string name="bugreport_message" msgid="398447048750350456">"Isto coletará informações sobre o estado atual do dispositivo para enviá-las em uma mensagem de e-mail. Após iniciar o relatório de bugs, será necessário aguardar algum tempo até que esteja pronto para ser enviado."</string>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 867ccc8..197da96 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -216,6 +216,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Opțiuni telefon"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Blocați ecranul"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Opriți alimentarea"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Raport despre erori"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Executați un raport despre erori"</string>
<string name="bugreport_message" msgid="398447048750350456">"Acest raport va colecta informații despre starea actuală a dispozitivului, pentru a le trimite într-un e-mail. Aveți răbdare după pornirea raportului despre erori până când va fi gata de trimis."</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 4e7624e..11f19b8 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -218,6 +218,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Параметры телефона"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Блокировка экрана"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Отключить питание"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Отчет об ошибке"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Отчет об ошибке"</string>
<string name="bugreport_message" msgid="398447048750350456">"Информация о текущем состоянии вашего устройства будет собрана и отправлена по электронной почте. Подготовка отчета займет некоторое время."</string>
diff --git a/core/res/res/values-si-rLK/strings.xml b/core/res/res/values-si-rLK/strings.xml
index a1fd8c6..73e28dc 100644
--- a/core/res/res/values-si-rLK/strings.xml
+++ b/core/res/res/values-si-rLK/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"දුරකථන විකල්ප"</string>
<string name="global_action_lock" msgid="2844945191792119712">"තිර අගුල"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"බලය අක්රිය කරන්න"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"දෝෂ වර්තාව"</string>
<string name="bugreport_title" msgid="2667494803742548533">"දෝෂ වාර්තාවක් ගන්න"</string>
<string name="bugreport_message" msgid="398447048750350456">"ඊ-තැපැල් පණිවිඩයක් ලෙස යැවීමට මෙය ඔබගේ වත්මන් උපාංග තත්වය ගැන තොරතුරු එකතු කරනු ඇත. දෝෂ වාර්තාව ආරම්භ කර එය යැවීමට සූදානම් කරන තෙක් එයට කිසියම් කාලයක් ගතවනු ඇත; කරුණාකර ඉවසන්න."</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index e4a1c9d..2aa140a 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -218,6 +218,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Možnosti telefónu"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Zámka obrazovky"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Vypnúť"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Hlásenie o chybách"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Vytvoriť hlásenie chyby"</string>
<string name="bugreport_message" msgid="398447048750350456">"Týmto zhromaždíte informácie o aktuálnom stave zariadenia. Informácie je potom možné odoslať e-mailom, chvíľu však potrvá, kým bude hlásenie chyby pripravené na odoslanie. Prosíme vás preto o trpezlivosť."</string>
@@ -1675,7 +1677,7 @@
</plurals>
<string name="zen_mode_until" msgid="7336308492289875088">"Do <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="9128205721301330797">"Do <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (ďalší budík)"</string>
- <string name="zen_mode_forever" msgid="7420011936770086993">"Dokým túto funkciu nevypnete"</string>
+ <string name="zen_mode_forever" msgid="7420011936770086993">"Kým túto funkciu nevypnete"</string>
<string name="zen_mode_forever_dnd" msgid="3792132696572189081">"Dokým nevypnete stav Nerušiť"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Zbaliť"</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index 5feeb07..d942c46 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -218,6 +218,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Možnosti telefona"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Zaklep zaslona"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Izklopi"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Poročilo o napakah"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Ustvari poročilo o napakah"</string>
<string name="bugreport_message" msgid="398447048750350456">"S tem bodo zbrani podatki o trenutnem stanju naprave, ki bodo poslani v e-poštnem sporočilu. Izvedba poročila o napakah in priprava trajata nekaj časa, zato bodite potrpežljivi."</string>
diff --git a/core/res/res/values-sq-rAL/strings.xml b/core/res/res/values-sq-rAL/strings.xml
index 75e134c..26637b4 100644
--- a/core/res/res/values-sq-rAL/strings.xml
+++ b/core/res/res/values-sq-rAL/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Opsionet e telefonit"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Kyçja e ekranit"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Fik"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Raporti i defekteve në kod"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Merr raportin e defekteve në kod"</string>
<string name="bugreport_message" msgid="398447048750350456">"Ky funksion mundëson mbledhjen e informacioneve mbi gjendjen aktuale të pajisjes për ta dërguar si mesazh mail-i. Do të duhet pak kohë nga nisja e raportit të defekteve në kod. Faleminderit për durimin."</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index 4349221..162debe 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -216,6 +216,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Опције телефона"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Закључај екран"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Искључи"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Извештај о грешци"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Направи извештај о грешци"</string>
<string name="bugreport_message" msgid="398447048750350456">"Овим ће се прикупити информације о тренутном стању уређаја како би биле послате у поруци е-поште. Од започињања извештаја о грешци до тренутка за његово слање проћи ће неко време; будите стрпљиви."</string>
@@ -256,9 +258,9 @@
<string name="permgrouplab_storage" msgid="1971118770546336966">"Складиште"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"приступа сликама, медијима и датотекама на уређају"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Микрофон"</string>
- <string name="permgroupdesc_microphone" msgid="4988812113943554584">"снима аудио снимке"</string>
+ <string name="permgroupdesc_microphone" msgid="4988812113943554584">"снима аудио"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Камера"</string>
- <string name="permgroupdesc_camera" msgid="3250611594678347720">"снима слике и видео снимке"</string>
+ <string name="permgroupdesc_camera" msgid="3250611594678347720">"снима слике и видео"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Телефон"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"упућује телефонске позиве и управља њима"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Сензори за тело"</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 2085ca7..a0b6db3 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Telefonalternativ"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Skärmlås"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Stäng av"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Felrapport"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Skapa felrapport"</string>
<string name="bugreport_message" msgid="398447048750350456">"Nu hämtas information om aktuell status för enheten, som sedan skickas i ett e-postmeddelade. Det tar en liten stund innan felrapporten är färdig och kan skickas, så vi ber dig ha tålamod."</string>
@@ -671,7 +673,7 @@
<string name="lockscreen_carrier_default" msgid="6169005837238288522">"Ingen tjänst"</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"Skärmen har låsts."</string>
<string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Tryck på Menu om du vill låsa upp eller ringa nödsamtal."</string>
- <string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Tryck på Menu om du vill låsa upp."</string>
+ <string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Tryck på Menu för att låsa upp."</string>
<string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Rita grafiskt lösenord för att låsa upp"</string>
<string name="lockscreen_emergency_call" msgid="5298642613417801888">"Nödsamtal"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"Tillbaka till samtal"</string>
@@ -1656,7 +1658,7 @@
<string name="new_sms_notification_title" msgid="8442817549127555977">"Du har nya meddelanden"</string>
<string name="new_sms_notification_content" msgid="7002938807812083463">"Öppna sms-appen och visa meddelandet"</string>
<string name="user_encrypted_title" msgid="9054897468831672082">"Vissa funktioner är begränsade"</string>
- <string name="user_encrypted_message" msgid="4923292604515744267">"Tryck om du vill låsa upp"</string>
+ <string name="user_encrypted_message" msgid="4923292604515744267">"Tryck för att låsa upp"</string>
<string name="user_encrypted_detail" msgid="5708447464349420392">"Användaruppgifterna är låsta"</string>
<string name="profile_encrypted_detail" msgid="3700965619978314974">"Jobbprofilen är låst"</string>
<string name="profile_encrypted_message" msgid="6964994232310195874">"Tryck och lås upp jobbprofilen"</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 5256d72..2f5c4f9 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -212,6 +212,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Chaguo za simu"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Funga skrini"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Zima"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Ripoti ya hitilafu"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Chukua ripoti ya hitilafu"</string>
<string name="bugreport_message" msgid="398447048750350456">"Hii itakusanya maelezo kuhusu hali ya kifaa chako kwa sasa, na itume kama barua pepe. Itachukua muda mfupi tangu ripoti ya hitilafu ianze kuzalishwa hadi iwe tayari kutumwa; vumilia."</string>
diff --git a/core/res/res/values-ta-rIN/strings.xml b/core/res/res/values-ta-rIN/strings.xml
index 0e1afe9..1cb4062 100644
--- a/core/res/res/values-ta-rIN/strings.xml
+++ b/core/res/res/values-ta-rIN/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"தொலைபேசி விருப்பங்கள்"</string>
<string name="global_action_lock" msgid="2844945191792119712">"திரைப் பூட்டு"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"முடக்கு"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"பிழை அறிக்கை"</string>
<string name="bugreport_title" msgid="2667494803742548533">"பிழை அறிக்கையை எடு"</string>
<string name="bugreport_message" msgid="398447048750350456">"உங்கள் நடப்புச் சாதன நிலையை மின்னஞ்சல் செய்தியாக அனுப்ப, அது குறித்த தகவலை இது சேகரிக்கும். பிழை அறிக்கையைத் தொடங்குவதில் இருந்து, அது அனுப்புவதற்குத் தயாராகும் வரை, இதற்குச் சிறிது நேரம் ஆகும்; பொறுமையாகக் காத்திருக்கவும்."</string>
diff --git a/core/res/res/values-te-rIN/strings.xml b/core/res/res/values-te-rIN/strings.xml
index cc47e81..e9aa6ba 100644
--- a/core/res/res/values-te-rIN/strings.xml
+++ b/core/res/res/values-te-rIN/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"ఫోన్ ఎంపికలు"</string>
<string name="global_action_lock" msgid="2844945191792119712">"స్క్రీన్ లాక్"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"పవర్ ఆఫ్ చేయి"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"బగ్ నివేదిక"</string>
<string name="bugreport_title" msgid="2667494803742548533">"బగ్ నివేదికను సిద్ధం చేయి"</string>
<string name="bugreport_message" msgid="398447048750350456">"ఇది ఇ-మెయిల్ సందేశం రూపంలో పంపడానికి మీ ప్రస్తుత పరికర స్థితి గురించి సమాచారాన్ని సేకరిస్తుంది. బగ్ నివేదికను ప్రారంభించడం మొదలుకొని పంపడానికి సిద్ధం చేసే వరకు ఇందుకు కొంత సమయం పడుతుంది; దయచేసి ఓపిక పట్టండి."</string>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index d3781d5..f3445cb 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"ตัวเลือกโทรศัพท์"</string>
<string name="global_action_lock" msgid="2844945191792119712">"ล็อกหน้าจอ"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"ปิดเครื่อง"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"รายงานข้อบกพร่อง"</string>
<string name="bugreport_title" msgid="2667494803742548533">"ใช้รายงานข้อบกพร่อง"</string>
<string name="bugreport_message" msgid="398447048750350456">"การดำเนินการนี้จะรวบรวมข้อมูลเกี่ยวกับสถานะปัจจุบันของอุปกรณ์ของคุณ โดยจะส่งไปในรูปแบบข้อความอีเมล อาจใช้เวลาสักครู่ตั้งแต่เริ่มการสร้างรายงานข้อบกพร่องจนกระทั่งเสร็จสมบูรณ์ โปรดอดทนรอ"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index b9c7657..ef1a57d 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Pagpipilian sa telepono"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Pag-lock sa screen"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"I-off"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Ulat sa bug"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Kunin ang ulat sa bug"</string>
<string name="bugreport_message" msgid="398447048750350456">"Mangongolekta ito ng impormasyon tungkol sa kasalukuyang katayuan ng iyong device, na ipapadala bilang mensaheng e-mail. Gugugol ito ng kaunting oras mula sa pagsisimula ng ulat sa bug hanggang sa handa na itong maipadala; mangyaring magpasensya."</string>
@@ -1150,7 +1152,7 @@
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"Nakakonekta sa isang accessory ng USB"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"I-tap para sa higit pang mga opsyon."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Konektado ang debugging ng USB"</string>
- <string name="adb_active_notification_message" msgid="4948470599328424059">"I-tap upang i-disable ang pagde-debug ng USB."</string>
+ <string name="adb_active_notification_message" msgid="4948470599328424059">"I-tap upang i-disable ang pag-debug ng USB."</string>
<string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Kinukuha ang ulat ng bug…"</string>
<string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Gusto mo bang ibahagi ang ulat ng bug?"</string>
<string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Ibinabahagi ang ulat ng bug…"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 4f4789b..daefd3d 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Telefon seçenekleri"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Ekran kilidi"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Kapat"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Hata raporu"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Hata raporu al"</string>
<string name="bugreport_message" msgid="398447048750350456">"Bu rapor, e-posta iletisi olarak göndermek üzere cihazınızın şu anki durumuyla ilgili bilgi toplar. Hata raporu başlatıldıktan sonra hazır olması biraz zaman alabilir, lütfen sabırlı olun."</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 3c693d8..42ac191 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -218,6 +218,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Параметри телеф."</string>
<string name="global_action_lock" msgid="2844945191792119712">"Заблок. екран"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Вимкнути"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Звіт про помилки"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Звіт про помилку"</string>
<string name="bugreport_message" msgid="398447048750350456">"Інформація про поточний стан вашого пристрою буде зібрана й надіслана електронною поштою. Підготовка звіту триватиме певний час."</string>
diff --git a/core/res/res/values-ur-rPK/strings.xml b/core/res/res/values-ur-rPK/strings.xml
index 5c3ecfc..e351ec0 100644
--- a/core/res/res/values-ur-rPK/strings.xml
+++ b/core/res/res/values-ur-rPK/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"فون کے اختیارات"</string>
<string name="global_action_lock" msgid="2844945191792119712">"اسکرین لاک"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"پاور آف"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"بگ کی اطلاع"</string>
<string name="bugreport_title" msgid="2667494803742548533">"بگ کی اطلاع لیں"</string>
<string name="bugreport_message" msgid="398447048750350456">"ایک ای میل پیغام کے بطور بھیجنے کیلئے، یہ آپ کے موجودہ آلہ کی حالت کے بارے میں معلومات جمع کرے گا۔ بگ کی اطلاع شروع کرنے سے لے کر بھیجنے کیلئے تیار ہونے تک اس میں تھوڑا وقت لگے گا؛ براہ کرم تحمل سے کام لیں۔"</string>
diff --git a/core/res/res/values-uz-rUZ/strings.xml b/core/res/res/values-uz-rUZ/strings.xml
index 8fdb309..d75291b 100644
--- a/core/res/res/values-uz-rUZ/strings.xml
+++ b/core/res/res/values-uz-rUZ/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Telefon sozlamalari"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Ekran qulfi"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"O‘chirish"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Nosozlik haqida ma’lumot berish"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Xatoliklar hisoboti"</string>
<string name="bugreport_message" msgid="398447048750350456">"Qurilmangiz holati haqidagi ma’lumotlar to‘planib, e-pochta orqali yuboriladi. Hisobotni tayyorlash biroz vaqt olishi mumkin."</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index f802d55..058999b 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Tùy chọn điện thoại"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Khoá màn hình"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Tắt nguồn"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Báo cáo lỗi"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Nhận báo cáo lỗi"</string>
<string name="bugreport_message" msgid="398447048750350456">"Báo cáo này sẽ thu thập thông tin về tình trạng thiết bị hiện tại của bạn, để gửi dưới dạng thông báo qua email. Sẽ mất một chút thời gian kể từ khi bắt đầu báo cáo lỗi cho tới khi báo cáo sẵn sàng để gửi; xin vui lòng kiên nhẫn."</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 403021d6..5d7ddcb 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"手机选项"</string>
<string name="global_action_lock" msgid="2844945191792119712">"屏幕锁定"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"关机"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"错误报告"</string>
<string name="bugreport_title" msgid="2667494803742548533">"提交错误报告"</string>
<string name="bugreport_message" msgid="398447048750350456">"这会收集有关当前设备状态的信息,并以电子邮件的形式进行发送。从开始生成错误报告到准备好发送需要一点时间,请耐心等待。"</string>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index 3f40c75..25a0276 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"手機選項"</string>
<string name="global_action_lock" msgid="2844945191792119712">"螢幕鎖定"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"關閉"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"錯誤報告"</string>
<string name="bugreport_title" msgid="2667494803742548533">"取得錯誤報告"</string>
<string name="bugreport_message" msgid="398447048750350456">"這會收集您目前裝置狀態的相關資訊,並以電郵傳送給您。從開始建立錯誤報告到準備傳送需要一段時間,請耐心等候。"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 4e18d69..3b1296c 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"電話選項"</string>
<string name="global_action_lock" msgid="2844945191792119712">"螢幕鎖定"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"關機"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"錯誤報告"</string>
<string name="bugreport_title" msgid="2667494803742548533">"取得錯誤報告"</string>
<string name="bugreport_message" msgid="398447048750350456">"這會收集您目前裝置狀態的相關資訊,以便透過電子郵件傳送。從錯誤報告開始建立到準備傳送的這段過程可能需要一點時間,敬請耐心等候。"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index 733e676..b50e76c 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -214,6 +214,8 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Okukhethwa kukho kwefoni"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Ukuvala isikrini"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Vala amandla"</string>
+ <!-- no translation found for global_action_emergency (7112311161137421166) -->
+ <skip />
<string name="global_action_bug_report" msgid="7934010578922304799">"Umbiko wephutha"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Thatha umbiko wesiphazamiso"</string>
<string name="bugreport_message" msgid="398447048750350456">"Lokhu kuzoqoqa ulwazi mayelana nesimo samanje sedivayisi yakho, ukuthumela imilayezo ye-imeyili. Kuzothatha isikhathi esincane kusuka ekuqaleni umbiko wesiphazamiso uze ulungele ukuthunyelwa; sicela ubekezele."</string>
diff --git a/docs/html/_redirects.yaml b/docs/html/_redirects.yaml
index 0f117ae..8ddb982 100644
--- a/docs/html/_redirects.yaml
+++ b/docs/html/_redirects.yaml
@@ -817,8 +817,11 @@
to: https://code.google.com/p/android/issues/list?can=2&q=label%3ADevPreview-N
- from: /preview/bugreports/...
to: https://code.google.com/p/android/issues/list?can=2&q=label%3ADevPreview-N
+- from: /preview/setup-sdk.html
+ to: /studio/index.html
- from: /2016/03/first-preview-of-android-n-developer.html
to: http://android-developers.blogspot.com/2016/03/first-preview-of-android-n-developer.html
+
- from: /reference/org/apache/http/...
to: /about/versions/marshmallow/android-6.0-changes.html#behavior-apache-http-client
- from: /shareables/...
@@ -1280,4 +1283,4 @@
- from: /preview/features/background-optimization.html
to: /topic/performance/background-optimization.html
- from: /preview/features/data-saver.html
- to: /training/basics/network-ops/data-saver.html
\ No newline at end of file
+ to: /training/basics/network-ops/data-saver.html
diff --git a/docs/html/about/versions/nougat/android-7.0.jd b/docs/html/about/versions/nougat/android-7.0.jd
index 1ca540c..8ef8bd6 100644
--- a/docs/html/about/versions/nougat/android-7.0.jd
+++ b/docs/html/about/versions/nougat/android-7.0.jd
@@ -44,7 +44,7 @@
<li><a href="#vr">VR Support</a></li>
<li><a href="#print_svc">Print Service Enhancements</a></li>
<li><a href="#virtual_files">Virtual Files</a></li>
- <li><a href="#framemetrics_api">FrameMetricsListener API</a></li>
+ <li><a href="#framemetrics_api">Frame Metrics API</a></li>
</ol>
</div>
</div>
@@ -434,9 +434,8 @@
</p>
<p>
- For information about creating an app tile, see the documentation for
- <code>android.service.quicksettings.Tile</code> in the downloadable <a href=
- "{@docRoot}preview/setup-sdk.html#docs-dl">API Reference</a>.
+ For information about creating an app tile, see the reference documentation
+ for {@link android.service.quicksettings.Tile Tile}.
</p>
@@ -465,9 +464,8 @@
through any medium, such as a VOIP endpoint or forwarding phones.</p>
<p>
- For more information, see <code>android.provider.BlockedNumberContract</code>
- in the downloadable <a href="{@docRoot}preview/setup-sdk.html#docs-dl">API
- Reference</a>.
+ For more information, see the reference documentation for
+ {@link android.provider.BlockedNumberContract BlockedNumberContract}.
</p>
<h2 id="call_screening">Call Screening</h2>
@@ -486,9 +484,8 @@
</ul>
<p>
- For more information, see <code>android.telecom.CallScreeningService</code>
- in the downloadable <a href="{@docRoot}preview/setup-sdk.html#docs-dl">API
- Reference</a>.
+ For more information, see the reference documentation for
+ {@link android.telecom.CallScreeningService CallScreeningService}.
</p>
@@ -780,8 +777,9 @@
features such as face-tracking, eye-tracking, point scanning, and so on, to
meet the needs of those users.</p>
-<p>For more information, see <code>android.accessibilityservice.GestureDescription</code>
- in the downloadable <a href="{@docRoot}preview/setup-sdk.html#docs-dl">API Reference</a>.</p>
+<p>For more information, see the reference documentation for
+{@link android.accessibilityservice.GestureDescription GestureDescription}.
+</p>
<h2 id="direct_boot">Direct Boot</h2>
@@ -972,9 +970,8 @@
from the system and from the app in focus. The system retrieves these
shortcuts automatically from the app’s menu if the shortcuts exist. You can
also provide your own fine-tuned shortcuts lists for the screen. You can do
- this by overriding the new <code>Activity.onProvideKeyboardShortcuts()</code>
- method, described in the downloadable <a href=
- "{@docRoot}preview/setup-sdk.html#docs-dl">API Reference</a>.
+ this by overriding the {@link android.view.Window.Callback#onProvideKeyboardShortcuts
+ onProvideKeyboardShortcuts()} method.
</p>
<p class="note">
@@ -986,7 +983,8 @@
<p>
To trigger Keyboard Shortcuts Helper from anywhere in your app, call
- {@code Activity.requestKeyboardShortcutsHelper()} for the relevant activity.
+ {@link android.app.Activity#requestShowKeyboardShortcuts requestShowKeyboardShortcuts()}
+ from the relevant activity.
</p>
<h2 id="custom_pointer_api">
@@ -1062,37 +1060,32 @@
<ul>
<li>You can set an icon from a resource ID by calling
- <code>PrinterInfo.Builder.setResourceIconId()</code>
+ {@link android.print.PrinterInfo.Builder#setIconResourceId setIconResourceId()}.
</li>
<li>You can show an icon from the network by calling
- <code>PrinterInfo.Builder.setHasCustomPrinterIcon()</code>, and setting a
- callback for when the icon is requested using
- <code>android.printservice.PrinterDiscoverySession.onRequestCustomPrinterIcon()</code>
+ {@link android.print.PrinterInfo.Builder#setHasCustomPrinterIcon setHasCustomPrinterIcon()},
+ and setting a callback for when the icon is requested using
+ {@link android.printservice.PrinterDiscoverySession#onRequestCustomPrinterIcon onRequestCustomPrinterIcon()}.
</li>
</ul>
<p>
In addition, you can provide a per-printer activity to display additional
- information by calling <code>PrinterInfo.Builder.setInfoIntent()</code>.
+ information by calling {@link android.print.PrinterInfo.Builder#setInfoIntent setInfoIntent()}.
</p>
<p>
You can indicate the progress and status of print jobs in the print job
notification by calling
- <code>android.printservice.PrintJob.setProgress()</code> and
- <code>android.printservice.PrintJob.setStatus()</code>, respectively.
+ {@link android.printservice.PrintJob#setProgress setProgress()} and
+ {@link android.printservice.PrintJob#setStatus setStatus()}, respectively.
</p>
-<p>
- For more information about these methods, see the downloadable <a href=
- "{@docRoot}preview/setup-sdk.html#docs-dl">API Reference</a>.
-</p>
-
-<h2 id="framemetrics_api">FrameMetricsListener API</h2>
+<h2 id="framemetrics_api">Frame Metrics API</h2>
<p>
-The FrameMetricsListener API allows an app to monitor its UI rendering
+The Frame Metrics API allows an app to monitor its UI rendering
performance. The API provides this capability by exposing a streaming Pub/Sub API to transfer frame
timing info for the app's current window. The data returned is
equivalent to that which <code><a href="{@docRoot}tools/help/shell.html#shellcommands">adb shell</a>
@@ -1100,7 +1093,7 @@
</p>
<p>
-You can use FrameMetricsListener to measure interaction-level UI
+You can use the Frame Metrics API to measure interaction-level UI
performance in production, without a USB connection. This API
allows collection of data at a much higher granularity than does
{@code adb shell dumpsys gfxinfo}. This higher granularity is possible because
@@ -1112,16 +1105,15 @@
</p>
<p>
-To monitor a window, implement the <code>FrameMetricsListener.onMetricsAvailable()</code>
-callback method and register it on that window. For more information, refer to
-the {@code FrameMetricsListener} class documentation in
-the downloadable <a href="{@docRoot}preview/setup-sdk.html#docs-dl">API Reference</a>.
+To monitor a window, implement the
+{@link android.view.Window.OnFrameMetricsAvailableListener#onFrameMetricsAvailable OnFrameMetricsAvailableListener.onFrameMetricsAvailable()}
+callback method and register it on that window.
</p>
<p>
-The API provides a {@code FrameMetrics} object, which contains timing data that
-the rendering subsystem reports for various milestones in a frame lifecycle.
-The supported metrics are: {@code UNKNOWN_DELAY_DURATION},
+The API provides a {@link android.view.FrameMetrics FrameMetrics} object, which
+contains timing data that the rendering subsystem reports for various milestones
+in a frame lifecycle. The supported metrics are: {@code UNKNOWN_DELAY_DURATION},
{@code INPUT_HANDLING_DURATION}, {@code ANIMATION_DURATION},
{@code LAYOUT_MEASURE_DURATION}, {@code DRAW_DURATION}, {@code SYNC_DURATION},
{@code COMMAND_ISSUE_DURATION}, {@code SWAP_BUFFERS_DURATION},
diff --git a/docs/html/guide/_book.yaml b/docs/html/guide/_book.yaml
index 20ee483..13c948c 100644
--- a/docs/html/guide/_book.yaml
+++ b/docs/html/guide/_book.yaml
@@ -399,11 +399,6 @@
- title: App Install Location
path: /guide/topics/data/install-location.html
-- title: Libraries
- path: /topic/libraries/index.html
- section:
- - include: /topic/libraries/_book.yaml
-
- title: Administration
path: /guide/topics/admin/index.html
section:
diff --git a/docs/html/guide/topics/manifest/receiver-element.jd b/docs/html/guide/topics/manifest/receiver-element.jd
index 800ee8a..c866047 100644
--- a/docs/html/guide/topics/manifest/receiver-element.jd
+++ b/docs/html/guide/topics/manifest/receiver-element.jd
@@ -33,8 +33,18 @@
declare it in the manifest file with this element. The other is to create
the receiver dynamically in code and register it with the <code>{@link
android.content.Context#registerReceiver Context.registerReceiver()}</code>
-method. See the {@link android.content.BroadcastReceiver} class description
-for more on dynamically created receivers.
+method. For more information about how to dynamically create receivers, see the
+{@link android.content.BroadcastReceiver} class description.
+</p>
+
+<p class="warning">
+ <strong>Warning:</strong> Limit how many broadcast
+ receivers you set in your app. Having too many broadcast receivers can
+ affect your app's performance and the battery life of users' devices.
+ For more information about APIs you can use instead of the
+ {@link android.content.BroadcastReceiver} class for scheduling background
+ work, see
+ <a href="/topic/performance/background-optimization.html">Background Optimizations</a>.
</p></dd>
<dt>attributes:</dt>
diff --git a/docs/html/training/articles/perf-anr.jd b/docs/html/training/articles/perf-anr.jd
index 2eda4fa..58db3e2 100644
--- a/docs/html/training/articles/perf-anr.jd
+++ b/docs/html/training/articles/perf-anr.jd
@@ -14,6 +14,14 @@
<li><a href="#Reinforcing">Reinforcing Responsiveness</a></li>
</ol>
+<h2>You should also read</h2>
+<ul>
+ <li><a href="/topic/performance/background-optimization.html">Background Optimizations</a>
+ <li><a href="/topic/performance/scheduling.html">Intelligent Job-Scheduling</a>
+ <li><a href="/training/monitoring-device-state/manifest-receivers.html">Manipulating Broadcast Receivers On Demand</a>
+ <li><a href="/guide/components/intents-filters.html">Intents and Intent Filters</a>
+</ul>
+
</div>
</div>
@@ -165,6 +173,16 @@
potentially long running action needs to be taken in response to an intent
broadcast.</p>
+<p>
+ Another common issue with {@link android.content.BroadcastReceiver} objects
+ occurs when they execute too frequently. Frequent background execution can
+ reduce the amount of memory available to other apps.
+ For more information about how to enable and disable
+ {@link android.content.BroadcastReceiver} objects efficiently, see
+ <a href="/training/monitoring-device-state/manifest-receivers.html">Manipulating
+ Broadcast Receivers on Demand</a>.
+</p>
+
<p class="note"><strong>Tip:</strong>
You can use {@link android.os.StrictMode} to help find potentially
long running operations such as network or database operations that
diff --git a/docs/html/training/monitoring-device-state/manifest-receivers.jd b/docs/html/training/monitoring-device-state/manifest-receivers.jd
index 3e36dba..5efa2fa 100644
--- a/docs/html/training/monitoring-device-state/manifest-receivers.jd
+++ b/docs/html/training/monitoring-device-state/manifest-receivers.jd
@@ -21,7 +21,10 @@
<h2>You should also read</h2>
<ul>
- <li><a href="{@docRoot}guide/components/intents-filters.html">Intents and Intent Filters</a>
+ <li><a href="/topic/performance/background-optimization.html">Background Optimizations</a>
+ <li><a href="/topic/performance/scheduling.html">Intelligent Job-Scheduling</a>
+ <li><a href="/training/articles/perf-anr.html">Keeping Your App Responsive</a>
+ <li><a href="/guide/components/intents-filters.html">Intents and Intent Filters</a>
</ul>
</div>
@@ -32,13 +35,22 @@
your application manifest. Then within each of these receivers you simply reschedule your recurring
alarms based on the current device state.</p>
-<p>A side-effect of this approach is that your app will wake the device each time any of these
-receivers is triggered—potentially much more frequently than required.</p>
-
<p>A better approach is to disable or enable the broadcast receivers at runtime. That way you can
use the receivers you declared in the manifest as passive alarms that are triggered by system events
only when necessary.</p>
+<p class="warning">
+ <strong>Warning:</strong> Limit how many broadcast
+ receivers you set in your app. Instead of using broadcast receivers,
+ consider using other APIs for
+ performing background work. For example, in Android 5.0 (API level 21) and
+ higher, you can use the {@link android.app.job.JobScheduler} class for
+ assigning work to be completed in the background.
+ For more information about APIs you can use instead of the
+ {@link android.content.BroadcastReceiver} class for scheduling background
+ work, see
+ <a href="{@docRoot}topic/performance/background-optimization.html">Background Optimizations</a>.
+</p>
<h2 id="ToggleReceivers">Toggle and Cascade State Change Receivers to Improve Efficiency </h2>
diff --git a/docs/html/training/testing/ui-testing/espresso-testing.jd b/docs/html/training/testing/ui-testing/espresso-testing.jd
index d3d31de..3d2bca7 100644
--- a/docs/html/training/testing/ui-testing/espresso-testing.jd
+++ b/docs/html/training/testing/ui-testing/espresso-testing.jd
@@ -24,17 +24,11 @@
</h2>
<ol>
- <li>
- <a href="#setup">Set Up Espresso</a>
- </li>
+ <li><a href="#setup">Set Up Espresso</a></li>
- <li>
- <a href="#build">Create an Espresso Test Class</a>
- </li>
+ <li><a href="#build">Create an Espresso Test Class</a></li>
- <li>
- <a href="#run">Run Espresso Tests on a Device or Emulator</a>
- </li>
+ <li><a href="#run">Run Espresso Tests on a Device or Emulator</a></li>
</ol>
<h2>
@@ -59,31 +53,40 @@
class="external-link">Android Testing Codelab</a></li>
</ul>
</div>
- </div>
+</div>
<p>
Testing user interactions
within a single app helps to ensure that users do not
- encounter unexpected results or have a poor experience when interacting with your app.
- You should get into the habit of creating user interface (UI) tests if you need to verify
+ encounter unexpected results or have a poor
+ experience when interacting with your app.
+ You should get into the habit of creating
+ user interface (UI) tests if you need to verify
that the UI of your app is functioning correctly.
</p>
<p>
The Espresso testing framework, provided by the
<a href="{@docRoot}tools/testing-support-library/index.html">Android Testing Support Library</a>,
- provides APIs for writing UI tests to simulate user interactions within a
- single target app. Espresso tests can run on devices running Android 2.2 (API level 8) and
- higher. A key benefit of using Espresso is that it provides automatic synchronization of test
- actions with the UI of the app you are testing. Espresso detects when the main thread is idle,
- so it is able to run your test commands at the appropriate time, improving the reliability of
- your tests. This capability also relieves you from having to adding any timing workarounds,
- such as a sleep period, in your test code.
+ provides APIs for writing UI tests to simulate
+ user interactions within a
+ single target app. Espresso tests can run on
+ devices running Android 2.3.3 (API level 10) and
+ higher. A key benefit of using Espresso is
+ that it provides automatic synchronization of test
+ actions with the UI of the app you are testing.
+ Espresso detects when the main thread is idle,
+ so it is able to run your test commands
+ at the appropriate time, improving the reliability of
+ your tests. This capability also relieves you
+ from having to add any timing workarounds,
+ such as {@link java.lang.Thread#sleep(long) Thread.sleep()}
+ in your test code.
</p>
<p>
- The Espresso testing framework is an instrumentation-based API and works
- with the
+ The Espresso testing framework is
+ an instrumentation-based API and works with the
<a href="{@docRoot}reference/android/support/test/runner/AndroidJUnitRunner.html">{@code
AndroidJUnitRunner}</a> test runner.
</p>
@@ -92,105 +95,139 @@
Set Up Espresso
</h2>
-<p>Before building your UI test with Espresso, make sure to configure your test source code
-location and project dependencies, as described in
-<a href="{@docRoot}training/testing/start/index.html#config-instrumented-tests">
-Getting Started with Testing</a>.</p>
+<p>
+ Before building your UI test with Espresso,
+ make sure to configure your test source code
+ location and project dependencies, as described in
+ <a href="{@docRoot}training/testing/start/index.html#config-instrumented-tests">Getting Started with Testing</a>.
+</p>
-<p>In the {@code build.gradle} file of your Android app module, you must set a dependency
- reference to the Espresso library:</p>
+<p>
+ In the {@code build.gradle} file of your Android app
+ module, you must set a dependency
+ reference to the Espresso library:
+</p>
<pre>
dependencies {
- ...
- androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.1'
+ // Other dependencies ...
+ androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2'
}
</pre>
-<p>Turn off animations on your test device — leaving system animations turned on in the test
-device might cause unexpected results or may lead your test to fail. Turn off animations from
-<em>Settings</em> by opening <em>Developing Options</em> and turning all the following options off:
+<p>
+ Turn off animations on your test device —
+ leaving system animations turned on in the test
+ device might cause unexpected results or may
+ lead your test to fail. Turn off animations from
+ <em>Settings</em> by opening <em>Developer options</em>
+ and turning all the following options off:
</p>
- <ul>
- <li>
- <strong>Window animation scale</strong>
- </li>
- <li>
- <strong>Transition animation scale</strong>
- </li>
+<p>
+ <ul>
+ <li>
+ <strong>Window animation scale</strong>
+ </li>
- <li>
- <strong>Animator duration scale</strong>
- </li>
- </ul>
- </li>
- </ul>
-<p>If you want to set up your project to use Espresso features other than what the core API
+ <li>
+ <strong>Transition animation scale</strong>
+ </li>
+
+ <li>
+ <strong>Animator duration scale</strong>
+ </li>
+ </ul>
+</p>
+
+<p>
+ If you want to set up your project to use Espresso
+ features other than what the core API
provides, see this
<a href="https://google.github.io/android-testing-support-library/docs/espresso/index.html"
class="external-link">resource</a>.</p>
- <h2 id="build">
- Create an Espresso Test Class
- </h2>
+<!-- Section 2 -->
- <p>
- To create an Espresso test, create a Java class that follows this programming model:
- </p>
+<h2 id="build">
+ Create an Espresso Test Class
+</h2>
- <ol>
- <li>Find the UI component you want to test in an {@link android.app.Activity} (for example, a
- sign-in button in the app) by calling the
- <a href="{@docRoot}reference/android/support/test/espresso/Espresso.html#onView(org.hamcrest.Matcher<android.view.View>)">
- {@code onView()}</a> method, or the
- <a href="{@docRoot}reference/android/support/test/espresso/Espresso.html#onData(org.hamcrest.Matcher<java.lang.Object>)">
- {@code onData()}</a> method for {@link android.widget.AdapterView} controls.
- </li>
+<p>
+ To create an Espresso test, create a Java
+ class that follows this programming model:
+</p>
- <li>Simulate a specific user interaction to perform on that UI component, by calling the
- <a href="{@docRoot}reference/android/support/test/espresso/ViewInteraction.html#perform(android.support.test.espresso.ViewAction...)">{@code ViewInteraction.perform()}</a>
- or
- <a href="{@docRoot}reference/android/support/test/espresso/DataInteraction.html#perform(android.support.test.espresso.ViewAction...)">{@code DataInteraction.perform()}</a>
- method and passing in the user action (for example, click on the sign-in button). To sequence
- multiple actions on the same UI component, chain them using a comma-separated list in your
- method argument.
- </li>
+<ol>
+ <li>
+ Find the UI component you want to test in
+ an {@link android.app.Activity} (for example, a
+ sign-in button in the app) by calling the
+ <a href="{@docRoot}reference/android/support/test/espresso/Espresso.html#onView(org.hamcrest.Matcher<android.view.View>)">
+ {@code onView()}</a> method, or the
+ <a href="{@docRoot}reference/android/support/test/espresso/Espresso.html#onData(org.hamcrest.Matcher<java.lang.Object>)">
+ {@code onData()}</a> method for {@link android.widget.AdapterView} controls.
+ </li>
- <li>Repeat the steps above as necessary, to simulate a user flow across multiple
- activities in the target app.
- </li>
+ <li>
+ Simulate a specific user interaction to
+ perform on that UI component, by calling the
+ <a href="{@docRoot}reference/android/support/test/espresso/ViewInteraction.html#perform(android.support.test.espresso.ViewAction...)">{@code ViewInteraction.perform()}</a>
+ or
+ <a href="{@docRoot}reference/android/support/test/espresso/DataInteraction.html#perform(android.support.test.espresso.ViewAction...)">{@code DataInteraction.perform()}</a>
+ method and passing in the user action
+ (for example, click on the sign-in button). To sequence
+ multiple actions on the same UI component, chain them using a comma-separated list in your
+ method argument.
+ </li>
- <li>Use the
+ <li>
+ Repeat the steps above as necessary, to simulate a user flow across multiple
+ activities in the target app.
+ </li>
+
+ <li>
+ Use the
<a href="{@docRoot}reference/android/support/test/espresso/assertion/ViewAssertions.html">{@code ViewAssertions}</a>
- methods to check that the UI reflects the expected
- state or behavior, after these user interactions are performed.
- </li>
- </ol>
+ methods to check that the UI reflects the expected
+ state or behavior, after these user interactions are performed.
+ </li>
+</ol>
- <p>
- These steps are covered in more detail in the sections below.
- </p>
+<p>
+ These steps are covered in more detail in the sections below.
+</p>
- <p>
- The following code snippet shows how your test class might invoke this basic workflow:
- </p>
+<p>
+ The following code snippet shows how your test
+ class might invoke this basic workflow:
+</p>
<pre>
onView(withId(R.id.my_view)) // withId(R.id.my_view) is a ViewMatcher
.perform(click()) // click() is a ViewAction
.check(matches(isDisplayed())); // matches(isDisplayed()) is a ViewAssertion
</pre>
-<h3 id="espresso-atr">Using Espresso with ActivityTestRule</h3>
+
+<!-- Section 2.1 -->
+
+<h3 id="espresso-atr">
+ Using Espresso with ActivityTestRule
+</h3>
+
<p>
-The following section describes how to create a new Espresso test in the JUnit 4 style and use
-<a href="{@docRoot}reference/android/support/test/rule/ActivityTestRule.html">
-{@code ActivityTestRule}</a> to reduce the amount of boilerplate code you need to write. By using
-<a href="{@docRoot}reference/android/support/test/rule/ActivityTestRule.html">
-{@code ActivityTestRule}</a>, the testing framework launches the activity under test
-before each test method annotated with <code>@Test</code> and before any method annotated with
-<code>@Before</code>. The framework handles shutting down the activity after the test finishes
-and all methods annotated with <code>@After</code> are run.</p>
+ The following section describes how to create a
+ new Espresso test in the JUnit 4 style and use
+ <a href="{@docRoot}reference/android/support/test/rule/ActivityTestRule.html">{@code ActivityTestRule}</a>
+ to reduce the amount of boilerplate code you need to write. By using
+ <a href="{@docRoot}reference/android/support/test/rule/ActivityTestRule.html">{@code ActivityTestRule}</a>,
+ the testing framework launches the activity under test
+ before each test method annotated with
+ <code>@Test</code> and before any method annotated with
+ <code>@Before</code>. The framework handles
+ shutting down the activity after the test finishes
+ and all methods annotated with <code>@After</code> are run.
+</p>
<pre>
package com.example.android.testing.espresso.BasicSample;
@@ -234,103 +271,57 @@
}
</pre>
- <h3 id="espresso-aitc2">
- Using Espresso with ActivityInstrumentationTestCase2
- </h3>
-<p>The following section describes how to migrate to Espresso if you have existing test classes
-subclassed from {@link android.test.ActivityInstrumentationTestCase2} and you don't want to rewrite
-them to use JUnit4.</p>
-<p class="note"><strong>Note:</strong> For new UI tests, we strongly recommend that you write your
-test in the JUnit 4 style and use the
-<a href="{@docRoot}reference/android/support/test/rule/ActivityTestRule.html">
-{@code ActivityTestRule}</a> class, instead of
-{@link android.test.ActivityInstrumentationTestCase2}.</p>
- <p>
- If you are subclassing {@link android.test.ActivityInstrumentationTestCase2}
- to create your Espresso test class, you must inject an
- {@link android.app.Instrumentation} instance into your test class. This step is required in
- order for your Espresso test to run with the
- <a href="{@docRoot}reference/android/support/test/runner/AndroidJUnitRunner.html">{@code AndroidJUnitRunner}</a>
- test runner.
- </p>
+<!-- Section 2.2 -->
- <p>
- To do this, call the
- {@link android.test.InstrumentationTestCase#injectInstrumentation(android.app.Instrumentation) injectInstrumentation()}
- method and pass in the result of
- <a href="{@docRoot}reference/android/support/test/InstrumentationRegistry.html#getInstrumentation()">
- {@code InstrumentationRegistry.getInstrumentation()}</a>, as shown in the following code
- example:
- </p>
+<h3 id="accessing-ui-components">
+ Accessing UI Components
+</h3>
-<pre>
-import android.support.test.InstrumentationRegistry;
+<p>
+ Before Espresso can interact with the app
+ under test, you must first specify the UI component
+ or <em>view</em>. Espresso supports the use of
+ <a href="http://hamcrest.org/" class="external-link">Hamcrest matchers</a>
+ for specifying views and adapters in your app.
+</p>
-public class MyEspressoTest
- extends ActivityInstrumentationTestCase2<MyActivity> {
+<p>
+ To find the view, call the
+ <a href="{@docRoot}reference/android/support/test/espresso/Espresso.html#onView(org.hamcrest.Matcher<android.view.View>)">{@code onView()}</a>
+ method and pass in a view matcher that
+ specifies the view that you are targeting. This is
+ described in more detail in
+ <a href="#specifying-view-matcher">Specifying a View Matcher</a>.
+ The <a href="{@docRoot}reference/android/support/test/espresso/Espresso.html#onView(org.hamcrest.Matcher<android.view.View>)">{@code onView()}</a>
+ method returns a
+ <a href="{@docRoot}reference/android/support/test/espresso/ViewInteraction.html">{@code ViewInteraction}</a>
+ object that allows your test to interact with the view.
+ However, calling the
+ <a href="{@docRoot}reference/android/support/test/espresso/Espresso.html#onView(org.hamcrest.Matcher<android.view.View>)">
+ {@code onView()}</a>
+ method may not work if you want to locate a view in
+ an {@link android.support.v7.widget.RecyclerView} layout.
+ In this case, follow the instructions in
+ <a href="#locating-adpeterview-view">Locating a view in an AdapterView</a>
+ instead.
+</p>
- private MyActivity mActivity;
+<p class="note">
+ <strong>Note</strong>:
+ The <a href="{@docRoot}reference/android/support/test/espresso/Espresso.html#onView(org.hamcrest.Matcher<android.view.View>)">{@code onView()}</a>
+ method does not check if the view you specified is
+ valid. Instead, Espresso searches only the
+ current view hierarchy, using the matcher provided.
+ If no match is found, the method throws a
+ <a href="{@docRoot}reference/android/support/test/espresso/NoMatchingViewException.html">{@code NoMatchingViewException}</a>.
+</p>
- public MyEspressoTest() {
- super(MyActivity.class);
- }
-
- @Before
- public void setUp() throws Exception {
- super.setUp();
- injectInstrumentation(InstrumentationRegistry.getInstrumentation());
- mActivity = getActivity();
- }
-
- ...
-}
-</pre>
-
-<p class="note"><strong>Note:</strong> Previously, {@link android.test.InstrumentationTestRunner}
-would inject the {@link android.app.Instrumentation} instance, but this test runner is being
-deprecated.</p>
-
- <h3 id="accessing-ui-components">
- Accessing UI Components
- </h3>
-
- <p>
- Before Espresso can interact with the app under test, you must first specify the UI component
- or <em>view</em>. Espresso supports the use of
-<a href="http://hamcrest.org/" class="external-link">Hamcrest matchers</a>
- for specifying views and adapters in your app.
- </p>
-
- <p>
- To find the view, call the <a href="{@docRoot}reference/android/support/test/espresso/Espresso.html#onView(org.hamcrest.Matcher<android.view.View>)">
- {@code onView()}</a>
- method and pass in a view matcher that specifies the view that you are targeting. This is
- described in more detail in <a href="#specifying-view-matcher">Specifying a View Matcher</a>.
- The <a href="{@docRoot}reference/android/support/test/espresso/Espresso.html#onView(org.hamcrest.Matcher<android.view.View>)">
- {@code onView()}</a> method returns a
- <a href="{@docRoot}reference/android/support/test/espresso/ViewInteraction.html">
- {@code ViewInteraction}</a>
- object that allows your test to interact with the view.
- However, calling the <a href="{@docRoot}reference/android/support/test/espresso/Espresso.html#onView(org.hamcrest.Matcher<android.view.View>)">
- {@code onView()}</a> method may not work if you want to locate a view in
- an {@link android.widget.AdapterView} layout. In this case, follow the instructions in
- <a href="#locating-adpeterview-view">Locating a view in an AdapterView</a> instead.
- </p>
-
- <p class="note">
- <strong>Note</strong>: The <a href="{@docRoot}reference/android/support/test/espresso/Espresso.html#onView(org.hamcrest.Matcher<android.view.View>)">
- {@code onView()}</a> method does not check if the view you specified is
- valid. Instead, Espresso searches only the current view hierarchy, using the matcher provided.
- If no match is found, the method throws a
- <a href="{@docRoot}reference/android/support/test/espresso/NoMatchingViewException.html">
- {@code NoMatchingViewException}</a>.
- </p>
-
- <p>
- The following code snippet shows how you might write a test that accesses an
- {@link android.widget.EditText} field, enters a string of text, closes the virtual keyboard,
- and then performs a button click.
- </p>
+<p>
+ The following code snippet shows how you might write a test that accesses an
+ {@link android.widget.EditText} field,
+ enters a string of text, closes the virtual keyboard,
+ and then performs a button click.
+</p>
<pre>
public void testChangeText_sameActivity() {
@@ -344,231 +335,464 @@
}
</pre>
- <h4 id="specifying-view-matcher">
- Specifying a View Matcher
- </h4>
+<!-- Section 2.2.1 -->
+<h4 id="specifying-view-matcher">
+ Specifying a View Matcher
+</h4>
- <p>
- You can specify a view matcher by using these approaches:
- </p>
+<p>
+ You can specify a view matcher by using these approaches:
+</p>
- <ul>
- <li>Calling methods in the
- <a href="{@docRoot}reference/android/support/test/espresso/matcher/ViewMatchers.html">
- {@code ViewMatchers}</a> class. For example, to find a view by looking for a text string it
- displays, you can call a method like this:
- <pre>
+<ul>
+ <li>Calling methods in the
+ <a href="{@docRoot}reference/android/support/test/espresso/matcher/ViewMatchers.html">{@code ViewMatchers}</a>
+ class. For example, to find a view by looking for a text string it
+ displays, you can call a method like this:
+<pre>
onView(withText("Sign-in"));
</pre>
-<p>Similarly you can call
-<a href="{@docRoot}reference/android/support/test/espresso/matcher/ViewMatchers.html#withId(int)">
-{@code withId()}</a> and providing the resource ID ({@code R.id}) of the view, as shown in the
-following example:</p>
+ <p>
+ Similarly you can call
+ <a href="{@docRoot}reference/android/support/test/espresso/matcher/ViewMatchers.html#withId(int)">{@code withId()}</a>
+ and providing the resource ID ({@code R.id}) of the view,
+ as shown in the
+ following example:
+ </p>
<pre>
onView(withId(R.id.button_signin));
</pre>
<p>
- Android resource IDs are not guaranteed to be unique. If your test attempts to match to a
+ Android resource IDs are not guaranteed to be unique.
+ If your test attempts to match to a
resource ID used by more than one view, Espresso throws an
-<a href="{@docRoot}reference/android/support/test/espresso/AmbiguousViewMatcherException.html">
- {@code AmbiguousViewMatcherException}</a>.
+ <a href="{@docRoot}reference/android/support/test/espresso/AmbiguousViewMatcherException.html">{@code AmbiguousViewMatcherException}</a>.
</p>
- </li>
- <li>Using the Hamcrest
- <a href="http://hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/Matchers.html"
- class="external-link">{@code Matchers}</a> class. You can use the
- {@code allOf()} methods to combine multiple matchers, such as
- {@code containsString()} and {@code instanceOf()}. This approach allows you to
- filter the match results more narrowly, as shown in the following example:
+ </li>
+
+ <li>
+ Using the Hamcrest
+ <a href="http://hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/Matchers.html"
+ class="external-link">{@code Matchers}</a> class. You can use the
+ {@code allOf()} methods to combine multiple matchers, such as
+ {@code containsString()} and {@code instanceOf()}.
+ This approach allows you to
+ filter the match results more narrowly, as shown in the following example:
+
<pre>
onView(allOf(withId(R.id.button_signin), withText("Sign-in")));
</pre>
-<p>You can use the {@code not} keyword to filter for views that don't correspond to the matcher, as
-shown in the following example:</p>
+
+ <p>
+ You can use the {@code not} keyword to filter
+ for views that don't correspond to the matcher, as
+ shown in the following example:
+ </p>
+
<pre>
onView(allOf(withId(R.id.button_signin), not(withText("Sign-out"))));
</pre>
-<p>To use these methods in your test, import the {@code org.hamcrest.Matchers} package. To
-learn more about Hamcrest matching, see the
-<a href="http://hamcrest.org/" class="external-link">Hamcrest site</a>.
+
+ <p>
+ To use these methods in your test,
+ import the {@code org.hamcrest.Matchers} package. To
+ learn more about Hamcrest matching, see the
+ <a href="http://hamcrest.org/" class="external-link">Hamcrest site</a>.
+ </p>
+ </li>
+</ul>
+
+<p>
+ To improve the performance of your Espresso tests,
+ specify the minimum matching information
+ needed to find your target view. For example,
+ if a view is uniquely identifiable by its
+ descriptive text, you do not need to specify
+ that it is also assignable from the
+ {@link android.widget.TextView} instance.
</p>
- </li>
- </ul>
- <p>
- To improve the performance of your Espresso tests, specify the minimum matching information
- needed to find your target view. For example, if a view is uniquely identifiable by its
- descriptive text, you do not need to specify that it is also assignable from the
- {@link android.widget.TextView} instance.
- </p>
+<!-- Section 2.2.2 -->
- <h4 id="#locating-adpeterview-view">
- Locating a view in an AdapterView
- </h4>
+<h4 id="#locating-adpeterview-view">
+ Locating a view in an AdapterView
+</h4>
- <p>
- In an {@link android.widget.AdapterView} widget, the view is dynamically populated with child
- views at runtime. If the target view you want to test is inside an
- {@link android.widget.AdapterView}
- (such as a {@link android.widget.ListView}, {@link android.widget.GridView}, or
- {@link android.widget.Spinner}), the
-<a href="{@docRoot}reference/android/support/test/espresso/Espresso.html#onView(org.hamcrest.Matcher<android.view.View>)">
- {@code onView()}</a> method might not work because only a
- subset of the views may be loaded in the current view hierarchy.
- </p>
+<p>
+ In an {@link android.widget.AdapterView} widget,
+ the view is dynamically populated with child
+ views at runtime. If the target view you want to test is inside an
+ {@link android.widget.AdapterView}
+ (such as a {@link android.widget.ListView},
+ {@link android.widget.GridView}, or
+ {@link android.widget.Spinner}), the
+ <a href="{@docRoot}reference/android/support/test/espresso/Espresso.html#onView(org.hamcrest.Matcher<android.view.View>)">{@code onView()}</a>
+ method might not work because only a
+ subset of the views may be loaded in the current view hierarchy.
+</p>
- <p>
- Instead, call the <a href="{@docRoot}reference/android/support/test/espresso/Espresso.html#onData(org.hamcrest.Matcher<java.lang.Object>)">{@code onData()}</a>
- method to obtain a
- <a href="{@docRoot}reference/android/support/test/espresso/DataInteraction.html">
- {@code DataInteraction}</a>
- object to access the target view element. Espresso handles loading the target view element
- into the current view hierarchy. Espresso also takes care of scrolling to the target element,
- and putting the element into focus.
- </p>
-
- <p class="note">
- <strong>Note</strong>: The
+<p>
+ Instead, call the
<a href="{@docRoot}reference/android/support/test/espresso/Espresso.html#onData(org.hamcrest.Matcher<java.lang.Object>)">{@code onData()}</a>
- method does not check if if the item you specified corresponds with a view. Espresso searches
- only the current view hierarchy. If no match is found, the method throws a
- <a href="{@docRoot}reference/android/support/test/espresso/NoMatchingViewException.html">
- {@code NoMatchingViewException}</a>.
- </p>
+ method to obtain a
+ <a href="{@docRoot}reference/android/support/test/espresso/DataInteraction.html">{@code DataInteraction}</a>
+ object to access the target view element.
+ Espresso handles loading the target view element
+ into the current view hierarchy. Espresso
+ also takes care of scrolling to the target element,
+ and putting the element into focus.
+</p>
- <p>
- The following code snippet shows how you can use the
- <a href="{@docRoot}reference/android/support/test/espresso/Espresso.html#onData(org.hamcrest.Matcher<java.lang.Object>)">{@code onData()}</a>
- method together
- with Hamcrest matching to search for a specific row in a list that contains a given string.
- In this example, the {@code LongListActivity} class contains a list of strings exposed
- through a {@link android.widget.SimpleAdapter}.
- </p>
+<p class="note">
+ <strong>Note</strong>: The
+ <a href="{@docRoot}reference/android/support/test/espresso/Espresso.html#onData(org.hamcrest.Matcher<java.lang.Object>)">{@code onData()}</a>
+ method does not check if the item you
+ specified corresponds with a view. Espresso searches
+ only the current view hierarchy. If no match is found, the method throws a
+ <a href="{@docRoot}reference/android/support/test/espresso/NoMatchingViewException.html">{@code NoMatchingViewException}</a>.
+</p>
+
+<p>
+ The following code snippet shows how you can use the
+ <a href="{@docRoot}reference/android/support/test/espresso/Espresso.html#onData(org.hamcrest.Matcher<java.lang.Object>)">{@code onData()}</a>
+ method together
+ with Hamcrest matching to search for a specific
+ row in a list that contains a given string.
+ In this example, the {@code LongListActivity} class
+ contains a list of strings exposed
+ through a {@link android.widget.SimpleAdapter}.
+</p>
<pre>
onData(allOf(is(instanceOf(Map.class)),
- hasEntry(equalTo(LongListActivity.ROW_TEXT), is(str))));
+ hasEntry(equalTo(LongListActivity.ROW_TEXT), is("test input")));
</pre>
- <h3 id="perform-actions">
- Performing Actions
- </h3>
+<!-- Section 2.3 -->
- <p>
- Call the <a href="{@docRoot}reference/android/support/test/espresso/ViewInteraction.html#perform(android.support.test.espresso.ViewAction...)">{@code ViewInteraction.perform()}</a>
- or
- <a href="{@docRoot}reference/android/support/test/espresso/DataInteraction.html#perform(android.support.test.espresso.ViewAction...)">{@code DataInteraction.perform()}</a>
- methods to
- simulate user interactions on the UI component. You must pass in one or more
- <a href="{@docRoot}reference/android/support/test/espresso/ViewAction.html">{@code ViewAction}</a>
- objects as arguments. Espresso fires each action in sequence according to
- the given order, and executes them in the main thread.
- </p>
+<h3 id="perform-actions">Performing Actions</h3>
- <p>
- The
- <a href="{@docRoot}reference/android/support/test/espresso/action/ViewActions.html">{@code ViewActions}</a>
- class provides a list of helper methods for specifying common actions.
- You can use these methods as convenient shortcuts instead of creating and configuring
- individual <a href="{@docRoot}reference/android/support/test/espresso/ViewAction.html">{@code ViewAction}</a>
- objects. You can specify such actions as:
- </p>
+<p>
+ Call the
+ <a href="{@docRoot}reference/android/support/test/espresso/ViewInteraction.html#perform(android.support.test.espresso.ViewAction...)">{@code ViewInteraction.perform()}</a>
+ or
+ <a href="{@docRoot}reference/android/support/test/espresso/DataInteraction.html#perform(android.support.test.espresso.ViewAction...)">{@code DataInteraction.perform()}</a>
+ methods to
+ simulate user interactions on the UI component. You must pass in one or more
+ <a href="{@docRoot}reference/android/support/test/espresso/ViewAction.html">{@code ViewAction}</a>
+ objects as arguments. Espresso fires each action in sequence according to
+ the given order, and executes them in the main thread.
+</p>
- <ul>
- <li>
- <a href="{@docRoot}reference/android/support/test/espresso/action/ViewActions.html#click()">{@code ViewActions.click()}</a>:
- Clicks on the view.
- </li>
+<p>
+ The
+ <a href="{@docRoot}reference/android/support/test/espresso/action/ViewActions.html">{@code ViewActions}</a>
+ class provides a list of helper methods for specifying common actions.
+ You can use these methods as convenient shortcuts
+ instead of creating and configuring individual
+ <a href="{@docRoot}reference/android/support/test/espresso/ViewAction.html">{@code ViewAction}</a>
+ objects. You can specify such actions as:
+</p>
- <li>
- <a href="{@docRoot}reference/android/support/test/espresso/action/ViewActions.html#typeText(java.lang.String)">{@code ViewActions.typeText()}</a>:
- Clicks on a view and enters a specified string.
- </li>
+<ul>
+ <li>
+ <a href="{@docRoot}reference/android/support/test/espresso/action/ViewActions.html#click()">{@code ViewActions.click()}</a>:
+ Clicks on the view.
+ </li>
- <li>
- <a href="{@docRoot}reference/android/support/test/espresso/action/ViewActions.html#scrollTo()">{@code ViewActions.scrollTo()}</a>:
- Scrolls to the view. The
- target view must be subclassed from {@link android.widget.ScrollView}
- and the value of its
- <a href="http://developer.android.com/reference/android/view/View.html#attr_android:visibility">{@code android:visibility}</a>
- property must be {@link android.view.View#VISIBLE}. For views that extend
- {@link android.widget.AdapterView} (for example,
- {@link android.widget.ListView}),
- the
- <a href="{@docRoot}reference/android/support/test/espresso/Espresso.html#onData(org.hamcrest.Matcher<java.lang.Object>)">{@code onData()}</a>
- method takes care of scrolling for you.
- </li>
+ <li>
+ <a href="{@docRoot}reference/android/support/test/espresso/action/ViewActions.html#typeText(java.lang.String)">{@code ViewActions.typeText()}</a>:
+ Clicks on a view and enters a specified string.
+ </li>
- <li>
- <a href="{@docRoot}reference/android/support/test/espresso/action/ViewActions.html#pressKey(int)">{@code ViewActions.pressKey()}</a>:
- Performs a key press using a specified keycode.
- </li>
+ <li>
+ <a href="{@docRoot}reference/android/support/test/espresso/action/ViewActions.html#scrollTo()">{@code ViewActions.scrollTo()}</a>:
+ Scrolls to the view. The
+ target view must be subclassed from {@link android.widget.ScrollView}
+ and the value of its
+ <a href="http://developer.android.com/reference/android/view/View.html#attr_android:visibility">{@code android:visibility}</a>
+ property must be {@link android.view.View#VISIBLE}. For views that extend
+ {@link android.widget.AdapterView} (for example,
+ {@link android.widget.ListView}), the
+ <a href="{@docRoot}reference/android/support/test/espresso/Espresso.html#onData(org.hamcrest.Matcher<java.lang.Object>)">{@code onData()}</a>
+ method takes care of scrolling for you.
+ </li>
- <li>
- <a href="{@docRoot}reference/android/support/test/espresso/action/ViewActions.html#clearText()">{@code ViewActions.clearText()}</a>:
- Clears the text in the target view.
- </li>
- </ul>
+ <li>
+ <a href="{@docRoot}reference/android/support/test/espresso/action/ViewActions.html#pressKey(int)">{@code ViewActions.pressKey()}</a>:
+ Performs a key press using a specified keycode.
+ </li>
- <p>
- If the target view is inside a {@link android.widget.ScrollView}, perform the
- <a href="{@docRoot}reference/android/support/test/espresso/action/ViewActions.html#scrollTo()">{@code ViewActions.scrollTo()}</a>
- action first to display the view in the screen before other proceeding
- with other actions. The
- <a href="{@docRoot}reference/android/support/test/espresso/action/ViewActions.html#scrollTo()">{@code ViewActions.scrollTo()}</a>
- action will have no effect if the view is already displayed.
- </p>
+ <li>
+ <a href="{@docRoot}reference/android/support/test/espresso/action/ViewActions.html#clearText()">{@code ViewActions.clearText()}</a>:
+ Clears the text in the target view.
+ </li>
+</ul>
- <h3 id="verify-results">
- Verifying Results
- </h3>
+<p>
+ If the target view is inside a {@link android.widget.ScrollView},
+ perform the
+ <a href="{@docRoot}reference/android/support/test/espresso/action/ViewActions.html#scrollTo()">{@code ViewActions.scrollTo()}</a>
+ action first to display the view in the screen before other proceeding
+ with other actions. The
+ <a href="{@docRoot}reference/android/support/test/espresso/action/ViewActions.html#scrollTo()">{@code ViewActions.scrollTo()}</a>
+ action will have no effect if the view is already displayed.
+</p>
- <p>
- Call the
- <a href="{@docRoot}reference/android/support/test/espresso/ViewInteraction.html#check(android.support.test.espresso.ViewAssertion)">{@code ViewInteraction.check()}</a>
- or
- <a href="{@docRoot}reference/android/support/test/espresso/DataInteraction.html#check(android.support.test.espresso.ViewAssertion)">{@code DataInteraction.check()}</a>
- method to assert
- that the view in the UI matches some expected state. You must pass in a
- <a href="{@docRoot}reference/android/support/test/espresso/ViewAssertion.html">
- {@code ViewAssertion}</a> object as the argument. If the assertion fails, Espresso throws
- an {@link junit.framework.AssertionFailedError}.
- </p>
+<!-- Section 2.4 -->
- <p>
- The
+<h3 id="intents">
+ Test your activities in isolation with Espresso Intents
+</h3>
+
+<p>
+ <a href="https://google.github.io/android-testing-support-library/docs/espresso/intents/index.html" class="external-link">Espresso Intents</a>
+ enables validation and stubbing of intents sent out by an app.
+ With Espresso Intents, you can test an app, activity, or service in isolation
+ by intercepting outgoing intents, stubbing the result, and sending it back to
+ the component under test.
+</p>
+
+<p>
+ To begin testing with Espresso Intents, you need
+ to add the following line to your app's build.gradle file:
+</p>
+
+<pre>
+dependencies {
+ // Other dependencies ...
+ androidTestCompile 'com.android.support.test.espresso:espresso-intents:2.2.2'
+}
+</pre>
+
+<p>
+ To test an intent, you need to create an instance of the
+ <a href="{@docRoot}reference/android/support/test/espresso/intent/rule/IntentsTestRule.html">IntentsTestRule</a>
+ class, which is very similar to the
+ <a href="{@docRoot}reference/android/support/test/rule/ActivityTestRule.html">ActivityTestRule</a>
+ class.
+ The
+ <a href="{@docRoot}reference/android/support/test/espresso/intent/rule/IntentsTestRule.html">IntentsTestRule</a>
+ class initializes Espresso Intents before each test,
+ terminates the host activity,
+ and releases Espresso Intents after each test.
+</p>
+
+<p>
+ The test class shown in the following codes snippet provides a simple
+ test for an explicit intent. It tests the activities and intents created in the
+ <a href="{@docRoot}training/basics/firstapp/index.html">Building Your First App</a>
+ tutorial.
+</p>
+
+<pre>
+@Large
+@RunWith(AndroidJUnit4.class)
+public class SimpleIntentTest {
+
+ private static final String MESSAGE = "This is a test";
+ private static final String PACKAGE_NAME = "com.example.myfirstapp";
+
+ /* Instantiate an IntentsTestRule object. */
+ @Rule
+ public IntentsTestRule≶MainActivity> mIntentsRule =
+ new IntentsTestRule≶>(MainActivity.class);
+
+ @Test
+ public void verifyMessageSentToMessageActivity() {
+
+ // Types a message into a EditText element.
+ onView(withId(R.id.edit_message))
+ .perform(typeText(MESSAGE), closeSoftKeyboard());
+
+ // Clicks a button to send the message to another
+ // activity through an explicit intent.
+ onView(withId(R.id.send_message)).perform(click());
+
+ // Verifies that the DisplayMessageActivity received an intent
+ // with the correct package name and message.
+ intended(allOf(
+ hasComponent(hasShortClassName(".DisplayMessageActivity")),
+ toPackage(PACKAGE_NAME),
+ hasExtra(MainActivity.EXTRA_MESSAGE, MESSAGE)));
+
+ }
+}
+</pre>
+
+<p>
+ For more information about Espresso Intents, see the
+ <a href="https://google.github.io/android-testing-support-library/docs/espresso/intents/index.html"
+ class="external-link">Espresso Intents
+ documentation on the Android Testing Support Library site</a>.
+ You can also download the
+ <a href="https://github.com/googlesamples/android-testing/tree/master/ui/espresso/IntentsBasicSample"
+ class="external-link">IntentsBasicSample</a> and
+ <a href="https://github.com/googlesamples/android-testing/tree/master/ui/espresso/IntentsAdvancedSample"
+ class="external-link">IntentsAdvancedSample</a>
+ code samples.
+</p>
+
+<!-- Section 2.5 -->
+
+<h3 id="webviews">
+ Testing WebViews with Espresso Web
+</h3>
+
+<p>
+ Espresso Web allows you to test {@link android.webkit.WebView} components
+ contained within an activity. It uses the
+ <a href="http://docs.seleniumhq.org/docs/03_webdriver.jsp"
+ class="external-link">WebDriver API</a> to inspect and control the
+ behavior of a {@link android.webkit.WebView}.
+</p>
+
+<p>
+ To begin testing with Espresso Web, you need
+ to add the following line to your app's build.gradle file:
+</p>
+
+<pre>
+dependencies {
+ // Other dependencies ...
+ androidTestCompile 'com.android.support.test.espresso:espresso-web:2.2.2'
+}
+</pre>
+
+<p>
+ When creating a test using Espresso Web, you need to enable
+ JavaScript on the {@link android.webkit.WebView} when you instantiate the
+ <a href="{@docRoot}reference/android/support/test/rule/ActivityTestRule.html">ActivityTestRule</a>
+ object to test the activity. In the tests, you can select
+ HTML elements displayed in the
+ {@link android.webkit.WebView} and simulate user interactions, like
+ entering text into a text box and then clicking a button. After the actions
+ are completed, you can then verify that the results on the
+ Web page match the results that you expect.
+</p>
+
+<p>
+ In the following code snippet, the class tests
+ a {@link android.webkit.WebView} component with the id value 'webview'
+ in the activity being tested.
+ The <code>verifyValidInputYieldsSuccesfulSubmission()</code> test selects an
+ <code><input></code> element on the
+ Web page, enters some text, and checks text that appears in
+ another element.
+</p>
+
+<pre>
+@LargeTest
+@RunWith(AndroidJUnit4.class)
+public class WebViewActivityTest {
+
+ private static final String MACCHIATO = "Macchiato";
+ private static final String DOPPIO = "Doppio";
+
+ @Rule
+ public ActivityTestRule<WebViewActivity> mActivityRule =
+ new ActivityTestRule<WebViewActivity>(WebViewActivity.class,
+ false /* Initial touch mode */, false /* launch activity */) {
+
+ @Override
+ protected void afterActivityLaunched() {
+ // Enable JavaScript.
+ onWebView().forceJavascriptEnabled();
+ }
+ }
+
+ @Test
+ public void typeTextInInput_clickButton_SubmitsForm() {
+ // Lazily launch the Activity with a custom start Intent per test
+ mActivityRule.launchActivity(withWebFormIntent());
+
+ // Selects the WebView in your layout.
+ // If you have multiple WebViews you can also use a
+ // matcher to select a given WebView, onWebView(withId(R.id.web_view)).
+ onWebView()
+ // Find the input element by ID
+ .withElement(findElement(Locator.ID, "text_input"))
+ // Clear previous input
+ .perform(clearElement())
+ // Enter text into the input element
+ .perform(DriverAtoms.webKeys(MACCHIATO))
+ // Find the submit button
+ .withElement(findElement(Locator.ID, "submitBtn"))
+ // Simulate a click via JavaScript
+ .perform(webClick())
+ // Find the response element by ID
+ .withElement(findElement(Locator.ID, "response"))
+ // Verify that the response page contains the entered text
+ .check(webMatches(getText(), containsString(MACCHIATO)));
+ }
+}
+</pre>
+
+<p>
+ For more information about Espresso Web, see the
+ <a href="https://google.github.io/android-testing-support-library/docs/espresso/web/index.html"
+ class="external-link">Espresso
+ Web documentation on the Android Testing Support Library site.</a>.
+ You can also download this code snippet as part of the
+ <a href="https://github.com/googlesamples/android-testing/tree/master/ui/espresso/WebBasicSample"
+ class="external-link">Espresso Web code sample</a>.
+</p>
+
+<!-- Section 2.6 -->
+
+<h3 id="verify-results">
+ Verifying Results
+</h3>
+
+<p>
+ Call the
+ <a href="{@docRoot}reference/android/support/test/espresso/ViewInteraction.html#check(android.support.test.espresso.ViewAssertion)">{@code ViewInteraction.check()}</a>
+ or
+ <a href="{@docRoot}reference/android/support/test/espresso/DataInteraction.html#check(android.support.test.espresso.ViewAssertion)">{@code DataInteraction.check()}</a>
+ method to assert
+ that the view in the UI matches some expected state. You must pass in a
+ <a href="{@docRoot}reference/android/support/test/espresso/ViewAssertion.html">{@code ViewAssertion}</a>
+ object as the argument. If the assertion fails, Espresso throws
+ an {@link junit.framework.AssertionFailedError}.
+</p>
+
+<p>
+ The
<a href="{@docRoot}reference/android/support/test/espresso/assertion/ViewAssertions.html">{@code ViewAssertions}</a>
- class provides a list of helper methods for specifying common
- assertions. The assertions you can use include:
- </p>
+ class provides a list of helper methods for specifying common
+ assertions. The assertions you can use include:
+</p>
- <ul>
- <li>
- <a href="{@docRoot}reference/android/support/test/espresso/assertion/ViewAssertions.html#doesNotExist()">{@code doesNotExist}</a>:
-Asserts that there is no view matching the specified criteria in the current view hierarchy.
- </li>
+<ul>
+ <li>
+ <a href="{@docRoot}reference/android/support/test/espresso/assertion/ViewAssertions.html#doesNotExist()">{@code doesNotExist}</a>:
+ Asserts that there is no view matching the specified
+ criteria in the current view hierarchy.
+ </li>
- <li>
- <a href="{@docRoot}reference/android/support/test/espresso/assertion/ViewAssertions.html#matches(org.hamcrest.Matcher<? super android.view.View>)">{@code matches}</a>:
- Asserts that the specified view exists in the current view hierarchy
- and its state matches some given Hamcrest matcher.
- </li>
+ <li>
+ <a href="{@docRoot}reference/android/support/test/espresso/assertion/ViewAssertions.html#matches(org.hamcrest.Matcher<? super android.view.View>)">{@code matches}</a>:
+ Asserts that the specified view exists in the current view hierarchy
+ and its state matches some given Hamcrest matcher.
+ </li>
- <li>
- <a href="{@docRoot}reference/android/support/test/espresso/assertion/ViewAssertions.html#selectedDescendantsMatch(org.hamcrest.Matcher<android.view.View>, org.hamcrest.Matcher<android.view.View>)">{@code selectedDescendentsMatch}</a>
- : Asserts that the specified children views for a
- parent view exist, and their state matches some given Hamcrest matcher.
- </li>
- </ul>
+ <li>
+ <a href="{@docRoot}reference/android/support/test/espresso/assertion/ViewAssertions.html#selectedDescendantsMatch(org.hamcrest.Matcher<android.view.View>, org.hamcrest.Matcher<android.view.View>)">{@code selectedDescendentsMatch}</a>:
+ Asserts that the specified children views for a
+ parent view exist, and their state matches some given Hamcrest matcher.
+ </li>
+</ul>
- <p>
- The following code snippet shows how you might check that the text displayed in the UI has
- the same value as the text previously entered in the
- {@link android.widget.EditText} field.
- </p>
+<p>
+ The following code snippet shows how you might
+ check that the text displayed in the UI has
+ the same value as the text previously entered in the
+ {@link android.widget.EditText} field.
+</p>
+
<pre>
public void testChangeText_sameActivity() {
// Type text and then press the button.
@@ -580,14 +804,22 @@
}
</pre>
-<h2 id="run">Run Espresso Tests on a Device or Emulator</h2>
+<!-- Section 3 -->
+
+<h2 id="run">
+ Run Espresso Tests on a Device or Emulator
+</h2>
+
<p>
-You can run Espresso tests from <a href="{@docRoot}studio/index.html">Android Studio</a> or
-from the command-line. Make sure to specify
-<a href="{@docRoot}reference/android/support/test/runner/AndroidJUnitRunner.html">
- {@code AndroidJUnitRunner}</a> as the default instrumentation runner in your project.
+ You can run Espresso tests from
+ <a href="{@docRoot}studio/index.html">Android Studio</a> or
+ from the command-line. Make sure to specify
+ <a href="{@docRoot}reference/android/support/test/runner/AndroidJUnitRunner.html">{@code AndroidJUnitRunner}</a>
+ as the default instrumentation runner in your project.
</p>
+
<p>
-To run your Espresso test, follow the steps for running instrumented tests
-described in <a href="{@docRoot}training/testing/start/index.html#run-instrumented-tests">
-Getting Started with Testing</a>.</p>
+ To run your Espresso test, follow the steps for running instrumented tests
+ described in
+ <a href="{@docRoot}training/testing/start/index.html#run-instrumented-tests">Getting Started with Testing</a>.
+</p>
diff --git a/docs/source.properties b/docs/source.properties
new file mode 100644
index 0000000..77a760b
--- /dev/null
+++ b/docs/source.properties
@@ -0,0 +1,3 @@
+Pkg.Revision=24.0
+Pkg.Desc=Android offline API reference
+Pkg.Path=docs
\ No newline at end of file
diff --git a/media/java/android/media/ExifInterface.java b/media/java/android/media/ExifInterface.java
index 0c7fa8e..69710d6 100644
--- a/media/java/android/media/ExifInterface.java
+++ b/media/java/android/media/ExifInterface.java
@@ -1761,6 +1761,11 @@
* copying all the data from one file to another and deleting the old file and renaming the
* other. It's best to use {@link #setAttribute(String,String)} to set all attributes to write
* and make a single call rather than multiple calls for each attribute.
+ * <p>
+ * This method is only supported for JPEG files.
+ * </p>
+ *
+ * @throws UnsupportedOperationException If this method is called with unsupported files.
*/
public void saveAttributes() throws IOException {
if (!mIsSupportedFile || mMimeType != IMAGE_TYPE_JPEG) {
diff --git a/native/android/Android.bp b/native/android/Android.bp
new file mode 100644
index 0000000..33c9655
--- /dev/null
+++ b/native/android/Android.bp
@@ -0,0 +1,20 @@
+// Copyright (C) 2016 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// The headers module is in frameworks/native/Android.bp.
+ndk_library {
+ name: "libandroid.ndk",
+ symbol_file: "libandroid.map.txt",
+ first_version: "9",
+}
diff --git a/native/android/libandroid.map.txt b/native/android/libandroid.map.txt
new file mode 100644
index 0000000..5758a3c
--- /dev/null
+++ b/native/android/libandroid.map.txt
@@ -0,0 +1,194 @@
+LIBANDROID {
+ global:
+ AAssetDir_close;
+ AAssetDir_getNextFileName;
+ AAssetDir_rewind;
+ AAssetManager_fromJava;
+ AAssetManager_open;
+ AAssetManager_openDir;
+ AAsset_close;
+ AAsset_getBuffer;
+ AAsset_getLength;
+ AAsset_getLength64; # introduced-arm=13 introduced-arm64=21 introduced-mips=13 introduced-mips64=21 introduced-x86=13 introduced-x86_64=21
+ AAsset_getRemainingLength;
+ AAsset_getRemainingLength64; # introduced-arm=13 introduced-arm64=21 introduced-mips=13 introduced-mips64=21 introduced-x86=13 introduced-x86_64=21
+ AAsset_isAllocated;
+ AAsset_openFileDescriptor;
+ AAsset_openFileDescriptor64; # introduced-arm=13 introduced-arm64=21 introduced-mips=13 introduced-mips64=21 introduced-x86=13 introduced-x86_64=21
+ AAsset_read;
+ AAsset_seek;
+ AAsset_seek64; # introduced-arm=13 introduced-arm64=21 introduced-mips=13 introduced-mips64=21 introduced-x86=13 introduced-x86_64=21
+ AChoreographer_getInstance; # introduced=24
+ AChoreographer_postFrameCallback; # introduced=24
+ AChoreographer_postFrameCallbackDelayed; # introduced=24
+ AConfiguration_copy;
+ AConfiguration_delete;
+ AConfiguration_diff;
+ AConfiguration_fromAssetManager;
+ AConfiguration_getCountry;
+ AConfiguration_getDensity;
+ AConfiguration_getKeyboard;
+ AConfiguration_getKeysHidden;
+ AConfiguration_getLanguage;
+ AConfiguration_getLayoutDirection; # introduced-arm=17 introduced-arm64=21 introduced-mips=17 introduced-mips64=21 introduced-x86=17 introduced-x86_64=21
+ AConfiguration_getMcc;
+ AConfiguration_getMnc;
+ AConfiguration_getNavHidden;
+ AConfiguration_getNavigation;
+ AConfiguration_getOrientation;
+ AConfiguration_getScreenHeightDp; # introduced-arm=13 introduced-arm64=21 introduced-mips=13 introduced-mips64=21 introduced-x86=13 introduced-x86_64=21
+ AConfiguration_getScreenLong;
+ AConfiguration_getScreenSize;
+ AConfiguration_getScreenWidthDp; # introduced-arm=13 introduced-arm64=21 introduced-mips=13 introduced-mips64=21 introduced-x86=13 introduced-x86_64=21
+ AConfiguration_getSdkVersion;
+ AConfiguration_getSmallestScreenWidthDp; # introduced-arm=13 introduced-arm64=21 introduced-mips=13 introduced-mips64=21 introduced-x86=13 introduced-x86_64=21
+ AConfiguration_getTouchscreen;
+ AConfiguration_getUiModeNight;
+ AConfiguration_getUiModeType;
+ AConfiguration_isBetterThan;
+ AConfiguration_match;
+ AConfiguration_new;
+ AConfiguration_setCountry;
+ AConfiguration_setDensity;
+ AConfiguration_setKeyboard;
+ AConfiguration_setKeysHidden;
+ AConfiguration_setLanguage;
+ AConfiguration_setLayoutDirection; # introduced-arm=17 introduced-arm64=21 introduced-mips=17 introduced-mips64=21 introduced-x86=17 introduced-x86_64=21
+ AConfiguration_setMcc;
+ AConfiguration_setMnc;
+ AConfiguration_setNavHidden;
+ AConfiguration_setNavigation;
+ AConfiguration_setOrientation;
+ AConfiguration_setScreenHeightDp; # introduced-arm=13 introduced-arm64=21 introduced-mips=13 introduced-mips64=21 introduced-x86=13 introduced-x86_64=21
+ AConfiguration_setScreenLong;
+ AConfiguration_setScreenSize;
+ AConfiguration_setScreenWidthDp; # introduced-arm=13 introduced-arm64=21 introduced-mips=13 introduced-mips64=21 introduced-x86=13 introduced-x86_64=21
+ AConfiguration_setSdkVersion;
+ AConfiguration_setSmallestScreenWidthDp; # introduced-arm=13 introduced-arm64=21 introduced-mips=13 introduced-mips64=21 introduced-x86=13 introduced-x86_64=21
+ AConfiguration_setTouchscreen;
+ AConfiguration_setUiModeNight;
+ AConfiguration_setUiModeType;
+ AInputEvent_getDeviceId;
+ AInputEvent_getSource;
+ AInputEvent_getType;
+ AInputQueue_attachLooper;
+ AInputQueue_detachLooper;
+ AInputQueue_finishEvent;
+ AInputQueue_getEvent;
+ AInputQueue_hasEvents;
+ AInputQueue_preDispatchEvent;
+ AKeyEvent_getAction;
+ AKeyEvent_getDownTime;
+ AKeyEvent_getEventTime;
+ AKeyEvent_getFlags;
+ AKeyEvent_getKeyCode;
+ AKeyEvent_getMetaState;
+ AKeyEvent_getRepeatCount;
+ AKeyEvent_getScanCode;
+ ALooper_acquire;
+ ALooper_addFd;
+ ALooper_forThread;
+ ALooper_pollAll;
+ ALooper_pollOnce;
+ ALooper_prepare;
+ ALooper_release;
+ ALooper_removeFd;
+ ALooper_wake;
+ AMotionEvent_getAction;
+ AMotionEvent_getAxisValue; # introduced-arm=13 introduced-arm64=21 introduced-mips=13 introduced-mips64=21 introduced-x86=13 introduced-x86_64=21
+ AMotionEvent_getButtonState; # introduced-arm=14 introduced-arm64=21 introduced-mips=14 introduced-mips64=21 introduced-x86=14 introduced-x86_64=21
+ AMotionEvent_getDownTime;
+ AMotionEvent_getEdgeFlags;
+ AMotionEvent_getEventTime;
+ AMotionEvent_getFlags;
+ AMotionEvent_getHistoricalAxisValue; # introduced-arm=13 introduced-arm64=21 introduced-mips=13 introduced-mips64=21 introduced-x86=13 introduced-x86_64=21
+ AMotionEvent_getHistoricalEventTime;
+ AMotionEvent_getHistoricalOrientation;
+ AMotionEvent_getHistoricalPressure;
+ AMotionEvent_getHistoricalRawX;
+ AMotionEvent_getHistoricalRawY;
+ AMotionEvent_getHistoricalSize;
+ AMotionEvent_getHistoricalToolMajor;
+ AMotionEvent_getHistoricalToolMinor;
+ AMotionEvent_getHistoricalTouchMajor;
+ AMotionEvent_getHistoricalTouchMinor;
+ AMotionEvent_getHistoricalX;
+ AMotionEvent_getHistoricalY;
+ AMotionEvent_getHistorySize;
+ AMotionEvent_getMetaState;
+ AMotionEvent_getOrientation;
+ AMotionEvent_getPointerCount;
+ AMotionEvent_getPointerId;
+ AMotionEvent_getPressure;
+ AMotionEvent_getRawX;
+ AMotionEvent_getRawY;
+ AMotionEvent_getSize;
+ AMotionEvent_getToolMajor;
+ AMotionEvent_getToolMinor;
+ AMotionEvent_getToolType; # introduced-arm=14 introduced-arm64=21 introduced-mips=14 introduced-mips64=21 introduced-x86=14 introduced-x86_64=21
+ AMotionEvent_getTouchMajor;
+ AMotionEvent_getTouchMinor;
+ AMotionEvent_getX;
+ AMotionEvent_getXOffset;
+ AMotionEvent_getXPrecision;
+ AMotionEvent_getY;
+ AMotionEvent_getYOffset;
+ AMotionEvent_getYPrecision;
+ ANativeActivity_finish;
+ ANativeActivity_hideSoftInput;
+ ANativeActivity_setWindowFlags;
+ ANativeActivity_setWindowFormat;
+ ANativeActivity_showSoftInput;
+ ANativeWindow_acquire;
+ ANativeWindow_fromSurface;
+ ANativeWindow_fromSurfaceTexture; # introduced-arm=13 introduced-mips=13 introduced-x86=13
+ ANativeWindow_getFormat;
+ ANativeWindow_getHeight;
+ ANativeWindow_getWidth;
+ ANativeWindow_lock;
+ ANativeWindow_release;
+ ANativeWindow_setBuffersGeometry;
+ ANativeWindow_unlockAndPost;
+ AObbInfo_delete;
+ AObbInfo_getFlags;
+ AObbInfo_getPackageName;
+ AObbInfo_getVersion;
+ AObbScanner_getObbInfo;
+ ASensorEventQueue_disableSensor;
+ ASensorEventQueue_enableSensor;
+ ASensorEventQueue_getEvents;
+ ASensorEventQueue_hasEvents;
+ ASensorEventQueue_setEventRate;
+ ASensorManager_createEventQueue;
+ ASensorManager_destroyEventQueue;
+ ASensorManager_getDefaultSensor;
+ ASensorManager_getDefaultSensorEx; # introduced=21
+ ASensorManager_getInstance;
+ ASensorManager_getSensorList;
+ ASensor_getFifoMaxEventCount; # introduced=21
+ ASensor_getFifoReservedEventCount; # introduced=21
+ ASensor_getMinDelay;
+ ASensor_getName;
+ ASensor_getReportingMode; # introduced=21
+ ASensor_getResolution;
+ ASensor_getStringType; # introduced=21
+ ASensor_getType;
+ ASensor_getVendor;
+ ASensor_isWakeUpSensor; # introduced=21
+ AStorageManager_delete;
+ AStorageManager_getMountedObbPath;
+ AStorageManager_isObbMounted;
+ AStorageManager_mountObb;
+ AStorageManager_new;
+ AStorageManager_unmountObb;
+ ATrace_beginSection; # introduced=23
+ ATrace_endSection; # introduced=23
+ ATrace_isEnabled; # introduced=23
+ android_getTtsEngine; # introduced-arm=13 introduced-arm64=21 introduced-mips=13 introduced-mips64=21 introduced-x86=13 introduced-x86_64=21
+ android_getaddrinfofornetwork; # introduced=23
+ android_setprocnetwork; # introduced=23
+ android_setsocknetwork; # introduced=23
+ getTtsEngine; # introduced-arm=13 introduced-arm64=21 introduced-mips=13 introduced-mips64=21 introduced-x86=13 introduced-x86_64=21
+ local:
+ *;
+};
diff --git a/native/graphics/jni/Android.bp b/native/graphics/jni/Android.bp
new file mode 100644
index 0000000..e09b0b4
--- /dev/null
+++ b/native/graphics/jni/Android.bp
@@ -0,0 +1,20 @@
+// Copyright (C) 2016 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// The headers module is in frameworks/native/Android.bp.
+ndk_library {
+ name: "libjnigraphics.ndk",
+ symbol_file: "libjnigraphics.map.txt",
+ first_version: "9",
+}
diff --git a/native/graphics/jni/libjnigraphics.map.txt b/native/graphics/jni/libjnigraphics.map.txt
new file mode 100644
index 0000000..a601d8a
--- /dev/null
+++ b/native/graphics/jni/libjnigraphics.map.txt
@@ -0,0 +1,8 @@
+LIBJNIGRAPHICS {
+ global:
+ AndroidBitmap_getInfo;
+ AndroidBitmap_lockPixels;
+ AndroidBitmap_unlockPixels;
+ local:
+ *;
+};
diff --git a/packages/Keyguard/res/values-sv/strings.xml b/packages/Keyguard/res/values-sv/strings.xml
index 527c8e6..4a1d67b 100644
--- a/packages/Keyguard/res/values-sv/strings.xml
+++ b/packages/Keyguard/res/values-sv/strings.xml
@@ -34,7 +34,7 @@
<string name="keyguard_plugged_in_charging_fast" msgid="6671162730167305479">"Laddas snabbt"</string>
<string name="keyguard_plugged_in_charging_slowly" msgid="1964714661071163229">"Laddas långsamt"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Anslut din laddare."</string>
- <string name="keyguard_instructions_when_pattern_disabled" msgid="1332288268600329841">"Tryck på Meny om du vill låsa upp."</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="1332288268600329841">"Tryck på Meny för att låsa upp."</string>
<string name="keyguard_network_locked_message" msgid="9169717779058037168">"Nätverk låst"</string>
<string name="keyguard_missing_sim_message_short" msgid="494980561304211931">"Inget SIM-kort"</string>
<string name="keyguard_missing_sim_message" product="tablet" msgid="1445849005909260039">"Inget SIM-kort i surfplattan."</string>
diff --git a/packages/SettingsLib/src/com/android/settingslib/deviceinfo/PrivateStorageInfo.java b/packages/SettingsLib/src/com/android/settingslib/deviceinfo/PrivateStorageInfo.java
new file mode 100644
index 0000000..ca8edf5
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/deviceinfo/PrivateStorageInfo.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settingslib.deviceinfo;
+
+import android.os.storage.StorageManager;
+import android.os.storage.VolumeInfo;
+import android.util.Log;
+
+import java.io.File;
+import java.util.Objects;
+
+/**
+ * PrivateStorageInfo provides information about the total and free storage on the device.
+ */
+public class PrivateStorageInfo {
+ private static final String TAG = "PrivateStorageInfo";
+ public final long freeBytes;
+ public final long totalBytes;
+
+ private PrivateStorageInfo(long freeBytes, long totalBytes) {
+ this.freeBytes = freeBytes;
+ this.totalBytes = totalBytes;
+ }
+
+ public static PrivateStorageInfo getPrivateStorageInfo(StorageVolumeProvider sm) {
+ long totalInternalStorage = sm.getPrimaryStorageSize();
+ long privateFreeBytes = 0;
+ long privateTotalBytes = 0;
+ for (VolumeInfo info : sm.getVolumes()) {
+ final File path = info.getPath();
+ if (info.getType() != VolumeInfo.TYPE_PRIVATE || path == null) {
+ continue;
+ }
+ privateTotalBytes += getTotalSize(info, totalInternalStorage);
+ privateFreeBytes += path.getFreeSpace();
+ }
+ return new PrivateStorageInfo(privateFreeBytes, privateTotalBytes);
+ }
+
+ /**
+ * Returns the total size in bytes for a given volume info.
+ * @param info Info of the volume to check.
+ * @param totalInternalStorage Total number of bytes in the internal storage to use if the
+ * volume is the internal disk.
+ */
+ public static long getTotalSize(VolumeInfo info, long totalInternalStorage) {
+ // Device could have more than one primary storage, which could be located in the
+ // internal flash (UUID_PRIVATE_INTERNAL) or in an external disk.
+ // If it's internal, try to get its total size from StorageManager first
+ // (totalInternalStorage), because that size is more precise because it accounts for
+ // the system partition.
+ if (info.getType() == VolumeInfo.TYPE_PRIVATE
+ && Objects.equals(info.getFsUuid(), StorageManager.UUID_PRIVATE_INTERNAL)
+ && totalInternalStorage > 0) {
+ return totalInternalStorage;
+ } else {
+ final File path = info.getPath();
+ if (path == null) {
+ // Should not happen, caller should have checked.
+ Log.e(TAG, "info's path is null on getTotalSize(): " + info);
+ return 0;
+ }
+ return path.getTotalSpace();
+ }
+ }
+
+}
diff --git a/packages/SettingsLib/src/com/android/settingslib/deviceinfo/StorageManagerVolumeProvider.java b/packages/SettingsLib/src/com/android/settingslib/deviceinfo/StorageManagerVolumeProvider.java
new file mode 100644
index 0000000..de76279
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/deviceinfo/StorageManagerVolumeProvider.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settingslib.deviceinfo;
+
+import android.os.storage.StorageManager;
+import android.os.storage.VolumeInfo;
+
+import java.util.List;
+
+/**
+ * StorageManagerVolumeProvider is a thin wrapper around the StorageManager to provide insight into
+ * the storage volumes on a device.
+ */
+public class StorageManagerVolumeProvider implements StorageVolumeProvider {
+ private StorageManager mStorageManager;
+
+ public StorageManagerVolumeProvider(StorageManager sm) {
+ mStorageManager = sm;
+ }
+
+ @Override
+ public long getPrimaryStorageSize() {
+ return mStorageManager.getPrimaryStorageSize();
+ }
+
+ @Override
+ public List<VolumeInfo> getVolumes() {
+ return mStorageManager.getVolumes();
+ }
+}
diff --git a/packages/SettingsLib/src/com/android/settingslib/deviceinfo/StorageVolumeProvider.java b/packages/SettingsLib/src/com/android/settingslib/deviceinfo/StorageVolumeProvider.java
new file mode 100644
index 0000000..95bb18d
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/deviceinfo/StorageVolumeProvider.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settingslib.deviceinfo;
+
+import android.os.storage.VolumeInfo;
+
+import java.util.List;
+
+/**
+ * StorageVolumeProvider provides access to the storage volumes on a device for free space
+ * calculations.
+ */
+public interface StorageVolumeProvider {
+ /**
+ * Returns the number of bytes of total storage on the primary storage.
+ */
+ long getPrimaryStorageSize();
+
+ /**
+ * Returns a list of VolumeInfos for the device.
+ */
+ List<VolumeInfo> getVolumes();
+}
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSContainer.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSContainer.java
new file mode 100644
index 0000000..3270587
--- /dev/null
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSContainer.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+package com.android.systemui.plugins.qs;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.app.PendingIntent;
+import android.content.Context;
+import android.content.Intent;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+import android.widget.RelativeLayout;
+
+public abstract class QSContainer extends FrameLayout {
+
+ public static final String ACTION = "com.android.systemui.action.PLUGIN_QS";
+
+ // This should be incremented any time this class or ActivityStarter or BaseStatusBarHeader
+ // change in incompatible ways.
+ public static final int VERSION = 1;
+
+ public QSContainer(@NonNull Context context, @Nullable AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public abstract void setPanelView(HeightListener notificationPanelView);
+ public abstract BaseStatusBarHeader getHeader();
+
+ public abstract int getQsMinExpansionHeight();
+ public abstract int getDesiredHeight();
+ public abstract void setHeightOverride(int desiredHeight);
+ public abstract void setHeaderClickable(boolean qsExpansionEnabled);
+ public abstract boolean isCustomizing();
+ public abstract void setOverscrolling(boolean overscrolling);
+ public abstract void setExpanded(boolean qsExpanded);
+ public abstract void setListening(boolean listening);
+ public abstract boolean isShowingDetail();
+ public abstract void closeDetail();
+ public abstract void setKeyguardShowing(boolean keyguardShowing);
+ public abstract void animateHeaderSlidingIn(long delay);
+ public abstract void animateHeaderSlidingOut();
+ public abstract void setQsExpansion(float qsExpansionFraction, float headerTranslation);
+ public abstract void setHeaderListening(boolean listening);
+ public abstract void notifyCustomizeChanged();
+
+ public abstract void setContainer(ViewGroup container);
+
+ public interface HeightListener {
+ void onQsHeightChanged();
+ }
+
+ public interface Callback {
+ void onShowingDetail(DetailAdapter detail, int x, int y);
+ void onToggleStateChanged(boolean state);
+ void onScanStateChanged(boolean state);
+ }
+
+ public interface DetailAdapter {
+ CharSequence getTitle();
+ Boolean getToggleState();
+ default boolean getToggleEnabled() {
+ return true;
+ }
+ View createDetailView(Context context, View convertView, ViewGroup parent);
+ Intent getSettingsIntent();
+ void setToggleState(boolean state);
+ int getMetricsCategory();
+
+ /**
+ * Indicates whether the detail view wants to have its header (back button, title and
+ * toggle) shown.
+ */
+ default boolean hasHeader() { return true; }
+ }
+
+ public abstract static class BaseStatusBarHeader extends RelativeLayout {
+
+ public BaseStatusBarHeader(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public abstract int getCollapsedHeight();
+ public abstract int getExpandedHeight();
+
+ public abstract void setExpanded(boolean b);
+ public abstract void setExpansion(float headerExpansionFraction);
+ public abstract void setListening(boolean listening);
+ public abstract void updateEverything();
+ public abstract void setActivityStarter(ActivityStarter activityStarter);
+ public abstract void setCallback(Callback qsPanelCallback);
+ public abstract View getExpandView();
+ }
+
+ /**
+ * An interface to start activities. This is used to as a callback from the views to
+ * {@link PhoneStatusBar} to allow custom handling for starting the activity, i.e. dismissing the
+ * Keyguard.
+ */
+ public static interface ActivityStarter {
+
+ void startPendingIntentDismissingKeyguard(PendingIntent intent);
+ void startActivity(Intent intent, boolean dismissShade);
+ void startActivity(Intent intent, boolean dismissShade, Callback callback);
+ void preventNextAnimation();
+
+ interface Callback {
+ void onActivityStarted(int resultCode);
+ }
+ }
+}
diff --git a/packages/SystemUI/res/layout/qs_panel.xml b/packages/SystemUI/res/layout/qs_panel.xml
index 26c7339..9e0a6fe 100644
--- a/packages/SystemUI/res/layout/qs_panel.xml
+++ b/packages/SystemUI/res/layout/qs_panel.xml
@@ -13,7 +13,7 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<com.android.systemui.qs.QSContainer
+<com.android.systemui.qs.QSContainerImpl
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/quick_settings_container"
android:layout_width="match_parent"
@@ -38,4 +38,4 @@
<include android:id="@+id/qs_customize" layout="@layout/qs_customize_panel"
android:visibility="gone" />
-</com.android.systemui.qs.QSContainer>
+</com.android.systemui.qs.QSContainerImpl>
diff --git a/packages/SystemUI/res/layout/status_bar_expanded.xml b/packages/SystemUI/res/layout/status_bar_expanded.xml
index 3d70969..0339e03 100644
--- a/packages/SystemUI/res/layout/status_bar_expanded.xml
+++ b/packages/SystemUI/res/layout/status_bar_expanded.xml
@@ -19,7 +19,7 @@
<com.android.systemui.statusbar.phone.NotificationPanelView
xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:systemui="http://schemas.android.com/apk/res/com.android.systemui"
+ xmlns:systemui="http://schemas.android.com/apk/res-auto"
android:id="@+id/notification_panel"
android:layout_width="match_parent"
android:layout_height="match_parent"
@@ -39,14 +39,15 @@
android:clipToPadding="false"
android:clipChildren="false">
- <com.android.systemui.AutoReinflateContainer
+ <com.android.systemui.PluginInflateContainer
android:id="@+id/qs_auto_reinflate_container"
android:layout="@layout/qs_panel"
android:layout_width="@dimen/notification_panel_width"
android:layout_height="match_parent"
android:layout_gravity="@integer/notification_panel_layout_gravity"
android:clipToPadding="false"
- android:clipChildren="false" />
+ android:clipChildren="false"
+ systemui:viewType="com.android.systemui.plugins.qs.QSContainer" />
<com.android.systemui.statusbar.stack.NotificationStackScrollLayout
android:id="@+id/notification_stack_scroller"
diff --git a/packages/SystemUI/res/values-kn-rIN/strings.xml b/packages/SystemUI/res/values-kn-rIN/strings.xml
index 0e5fd38..69e3bdb 100644
--- a/packages/SystemUI/res/values-kn-rIN/strings.xml
+++ b/packages/SystemUI/res/values-kn-rIN/strings.xml
@@ -592,8 +592,8 @@
<string name="add_button" msgid="4134946063432258161">"ಬಟನ್ ಸೇರಿಸು"</string>
<string name="save" msgid="2311877285724540644">"ಉಳಿಸು"</string>
<string name="reset" msgid="2448168080964209908">"ಮರುಹೊಂದಿಸು"</string>
- <string name="no_home_title" msgid="1563808595146071549">"ಯಾವುದೇ ಹೋಮ್ ಬಟನ್ ಕಂಡುಬಂದಿಲ್ಲ"</string>
- <string name="no_home_message" msgid="5408485011659260911">"ಈ ಸಾಧನವನ್ನು ನ್ಯಾವಿಗೇಟ್ ಮಾಡಲು ಹೋಮ್ ಬಟನ್ ಅಗತ್ಯವಿರುತ್ತದೆ. ಉಳಿಸುವ ಮೊದಲು ದಯವಿಟ್ಟು ಹೋಮ್ ಬಟನ್ ಸೇರಿಸಿ."</string>
+ <string name="no_home_title" msgid="1563808595146071549">"ಯಾವುದೇ ಮುಖಪುಟ ಬಟನ್ ಕಂಡುಬಂದಿಲ್ಲ"</string>
+ <string name="no_home_message" msgid="5408485011659260911">"ಈ ಸಾಧನವನ್ನು ನ್ಯಾವಿಗೇಟ್ ಮಾಡಲು ಮುಖಪುಟ ಬಟನ್ ಅಗತ್ಯವಿರುತ್ತದೆ. ಉಳಿಸುವ ಮೊದಲು ದಯವಿಟ್ಟು ಮುಖಪುಟ ಬಟನ್ ಸೇರಿಸಿ."</string>
<string name="adjust_button_width" msgid="6138616087197632947">"ಬಟನ್ ಅಳತೆ ಹೊಂದಿಸು"</string>
<string name="clipboard" msgid="1313879395099896312">"ಕ್ಲಿಪ್ಬೋರ್ಡ್"</string>
<string name="clipboard_description" msgid="3819919243940546364">"ಐಟಂಗಳನ್ನು ನೇರವಾಗಿ ಕ್ಲಿಪ್ಬೋರ್ಡ್ಗೆ ಡ್ರ್ಯಾಗ್ ಮಾಡಲು ಕ್ಲಿಪ್ಬೋರ್ಡ್ ಅನುಮತಿಸುತ್ತದೆ. ಐಟಂಗಳು ಅಸ್ತಿತ್ವದಲ್ಲಿರುವಾಗ ಅವುಗಳನ್ನು ಕ್ಲಿಪ್ಬೋರ್ಡ್ನಿಂದ ನೇರವಾಗಿ ಹೊರಗೆ ಹಾಕಬಹುದಾಗಿರುತ್ತದೆ."</string>
diff --git a/packages/SystemUI/res/values-kn-rIN/strings_tv.xml b/packages/SystemUI/res/values-kn-rIN/strings_tv.xml
index 5afb322..edaa8e6 100644
--- a/packages/SystemUI/res/values-kn-rIN/strings_tv.xml
+++ b/packages/SystemUI/res/values-kn-rIN/strings_tv.xml
@@ -25,7 +25,7 @@
<string name="pip_pause" msgid="8412075640017218862">"ವಿರಾಮ"</string>
<string name="pip_hold_home" msgid="340086535668778109">"PIP ನಿಯಂತ್ರಿಸಲು "<b>"HOME"</b>" ಕೀಯನ್ನು ಹಿಡಿದುಕೊಳ್ಳಿ"</string>
<string name="pip_onboarding_title" msgid="7850436557670253991">"ಚಿತ್ರದಲ್ಲಿ ಚಿತ್ರ"</string>
- <string name="pip_onboarding_description" msgid="4028124563309465267">"ನೀವು ಮತ್ತೊಂದನ್ನು ಪ್ಲೇ ಮಾಡುವ ತನಕ ಇದು ನಿಮ್ಮ ವೀಡಿಯೋವನ್ನು ವೀಕ್ಷಣೆಯಲ್ಲಿರಿಸುತ್ತದೆ. ಅದನ್ನು ನಿಯಂತ್ರಿಸಲು "<b>"ಹೋಮ್"</b>" ಅನ್ನು ಒತ್ತಿ ಹಿಡಿಯಿರಿ."</string>
+ <string name="pip_onboarding_description" msgid="4028124563309465267">"ನೀವು ಮತ್ತೊಂದನ್ನು ಪ್ಲೇ ಮಾಡುವ ತನಕ ಇದು ನಿಮ್ಮ ವೀಡಿಯೋವನ್ನು ವೀಕ್ಷಣೆಯಲ್ಲಿರಿಸುತ್ತದೆ. ಅದನ್ನು ನಿಯಂತ್ರಿಸಲು "<b>"ಮುಖಪುಟ"</b>" ಅನ್ನು ಒತ್ತಿ ಹಿಡಿಯಿರಿ."</string>
<string name="pip_onboarding_button" msgid="3957426748484904611">"ಅರ್ಥವಾಯಿತು"</string>
<string name="recents_tv_dismiss" msgid="3555093879593377731">"ವಜಾಗೊಳಿಸಿ"</string>
<string-array name="recents_tv_blacklist_array">
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index d5d0631..8a0f956b 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -274,10 +274,10 @@
<string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"„Bluetooth“ išjungta"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="4910015762433302860">"Nėra pasiekiamų susietų įrenginių"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Šviesumas"</string>
- <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Automatinis kaitaliojimas"</string>
+ <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Automatinis pasukimas"</string>
<string name="accessibility_quick_settings_rotation" msgid="4231661040698488779">"Automatiškai sukti ekraną"</string>
<string name="accessibility_quick_settings_rotation_value" msgid="1428962304214992318">"Nustatyti kaip <xliff:g id="ID_1">%s</xliff:g>"</string>
- <string name="quick_settings_rotation_locked_label" msgid="6359205706154282377">"Kaitaliojimas užrakintas"</string>
+ <string name="quick_settings_rotation_locked_label" msgid="6359205706154282377">"Pasukimas užrakintas"</string>
<string name="quick_settings_rotation_locked_portrait_label" msgid="5102691921442135053">"Stačias"</string>
<string name="quick_settings_rotation_locked_landscape_label" msgid="8553157770061178719">"Gulsčias"</string>
<string name="quick_settings_ime_label" msgid="7073463064369468429">"Įvesties metodas"</string>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index e7b5df1..b574e90 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -351,7 +351,7 @@
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
<string name="speed_bump_explanation" msgid="1288875699658819755">"Mindre brådskande aviseringar nedan"</string>
<string name="notification_tap_again" msgid="7590196980943943842">"Tryck igen för att öppna"</string>
- <string name="keyguard_unlock" msgid="8043466894212841998">"Svep uppåt om du vill låsa upp"</string>
+ <string name="keyguard_unlock" msgid="8043466894212841998">"Svep uppåt för att låsa upp"</string>
<string name="phone_hint" msgid="4872890986869209950">"Svep från ikonen och öppna telefonen"</string>
<string name="voice_hint" msgid="8939888732119726665">"Svep från ikonen och öppna röstassistenten"</string>
<string name="camera_hint" msgid="7939688436797157483">"Svep från ikonen och öppna kameran"</string>
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index 71f40f1..eb1a1eb 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -240,6 +240,9 @@
-->
<string name="doze_pickup_subtype_performs_proximity_check"></string>
+ <!-- Type of the double tap sensor. Empty if double tap is not supported. -->
+ <string name="doze_double_tap_sensor_type" translatable="false"></string>
+
<!-- Doze: pulse parameter - how long does it take to fade in? -->
<integer name="doze_pulse_duration_in">900</integer>
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java b/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java
index 874021a..b3038b9 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java
@@ -35,12 +35,13 @@
private static final int SIZE = Build.IS_DEBUGGABLE ? 400 : 50;
static final SimpleDateFormat FORMAT = new SimpleDateFormat("MM-dd HH:mm:ss.SSS");
- private static final int PULSE_REASONS = 4;
+ private static final int PULSE_REASONS = 5;
public static final int PULSE_REASON_INTENT = 0;
public static final int PULSE_REASON_NOTIFICATION = 1;
public static final int PULSE_REASON_SENSOR_SIGMOTION = 2;
public static final int PULSE_REASON_SENSOR_PICKUP = 3;
+ public static final int PULSE_REASON_SENSOR_DOUBLE_TAP = 4;
private static long[] sTimes;
private static String[] sMessages;
@@ -167,6 +168,7 @@
case PULSE_REASON_NOTIFICATION: return "notification";
case PULSE_REASON_SENSOR_SIGMOTION: return "sigmotion";
case PULSE_REASON_SENSOR_PICKUP: return "pickup";
+ case PULSE_REASON_SENSOR_DOUBLE_TAP: return "doubletap";
default: throw new IllegalArgumentException("bad reason: " + pulseReason);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeService.java b/packages/SystemUI/src/com/android/systemui/doze/DozeService.java
index 4edcb4b..261d241 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeService.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeService.java
@@ -16,12 +16,14 @@
package com.android.systemui.doze;
+import android.app.ActivityManager;
import android.app.UiModeManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.Configuration;
+import android.database.ContentObserver;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
@@ -29,11 +31,15 @@
import android.hardware.TriggerEvent;
import android.hardware.TriggerEventListener;
import android.media.AudioAttributes;
+import android.net.Uri;
import android.os.Handler;
import android.os.PowerManager;
import android.os.SystemClock;
+import android.os.UserHandle;
import android.os.Vibrator;
+import android.provider.Settings;
import android.service.dreams.DreamService;
+import android.text.TextUtils;
import android.util.Log;
import android.view.Display;
@@ -45,6 +51,7 @@
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.Date;
+import java.util.List;
public class DozeService extends DreamService {
private static final String TAG = "DozeService";
@@ -59,8 +66,8 @@
private final Handler mHandler = new Handler();
private DozeHost mHost;
- private SensorManager mSensors;
- private TriggerSensor mSigMotionSensor;
+ private SensorManager mSensorManager;
+ private TriggerSensor[] mSensors;
private TriggerSensor mPickupSensor;
private PowerManager mPowerManager;
private PowerManager.WakeLock mWakeLock;
@@ -86,8 +93,10 @@
pw.print(" mWakeLock: held="); pw.println(mWakeLock.isHeld());
pw.print(" mHost: "); pw.println(mHost);
pw.print(" mBroadcastReceiverRegistered: "); pw.println(mBroadcastReceiverRegistered);
- pw.print(" mSigMotionSensor: "); pw.println(mSigMotionSensor);
- pw.print(" mPickupSensor:"); pw.println(mPickupSensor);
+ for (TriggerSensor s : mSensors) {
+ pw.print(" sensor: ");
+ pw.println(s);
+ }
pw.print(" mDisplayStateSupported: "); pw.println(mDisplayStateSupported);
pw.print(" mPowerSaveActive: "); pw.println(mPowerSaveActive);
pw.print(" mCarMode: "); pw.println(mCarMode);
@@ -110,13 +119,25 @@
setWindowless(true);
- mSensors = (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE);
- mSigMotionSensor = new TriggerSensor(Sensor.TYPE_SIGNIFICANT_MOTION,
- mDozeParameters.getPulseOnSigMotion(), mDozeParameters.getVibrateOnSigMotion(),
- DozeLog.PULSE_REASON_SENSOR_SIGMOTION);
- mPickupSensor = new TriggerSensor(Sensor.TYPE_PICK_UP_GESTURE,
- mDozeParameters.getPulseOnPickup(), mDozeParameters.getVibrateOnPickup(),
- DozeLog.PULSE_REASON_SENSOR_PICKUP);
+ mSensorManager = (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE);
+ mSensors = new TriggerSensor[] {
+ new TriggerSensor(
+ mSensorManager.getDefaultSensor(Sensor.TYPE_SIGNIFICANT_MOTION),
+ null /* setting */,
+ mDozeParameters.getPulseOnSigMotion(),
+ mDozeParameters.getVibrateOnSigMotion(),
+ DozeLog.PULSE_REASON_SENSOR_SIGMOTION),
+ mPickupSensor = new TriggerSensor(
+ mSensorManager.getDefaultSensor(Sensor.TYPE_PICK_UP_GESTURE),
+ Settings.Secure.DOZE_PULSE_ON_PICK_UP,
+ mDozeParameters.getPulseOnPickup(), mDozeParameters.getVibrateOnPickup(),
+ DozeLog.PULSE_REASON_SENSOR_PICKUP),
+ new TriggerSensor(
+ findSensorWithType(mDozeParameters.getDoubleTapSensorType()),
+ Settings.Secure.DOZE_PULSE_ON_DOUBLE_TAP,
+ mDozeParameters.getPulseOnPickup(), mDozeParameters.getVibrateOnPickup(),
+ DozeLog.PULSE_REASON_SENSOR_DOUBLE_TAP)
+ };
mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
mWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
mWakeLock.setReferenceCounted(true);
@@ -280,8 +301,9 @@
private void listenForPulseSignals(boolean listen) {
if (DEBUG) Log.d(mTag, "listenForPulseSignals: " + listen);
- mSigMotionSensor.setListening(listen);
- mPickupSensor.setListening(listen);
+ for (TriggerSensor s : mSensors) {
+ s.setListening(listen);
+ }
listenForBroadcasts(listen);
listenForNotifications(listen);
}
@@ -290,11 +312,21 @@
if (listen) {
final IntentFilter filter = new IntentFilter(PULSE_ACTION);
filter.addAction(UiModeManager.ACTION_ENTER_CAR_MODE);
+ filter.addAction(Intent.ACTION_USER_SWITCHED);
mContext.registerReceiver(mBroadcastReceiver, filter);
+
+ for (TriggerSensor s : mSensors) {
+ if (s.mConfigured && !TextUtils.isEmpty(s.mSetting)) {
+ mContext.getContentResolver().registerContentObserver(
+ Settings.Secure.getUriFor(s.mSetting), false /* descendants */,
+ mSettingsObserver, UserHandle.USER_ALL);
+ }
+ }
mBroadcastReceiverRegistered = true;
} else {
if (mBroadcastReceiverRegistered) {
mContext.unregisterReceiver(mBroadcastReceiver);
+ mContext.getContentResolver().unregisterContentObserver(mSettingsObserver);
}
mBroadcastReceiverRegistered = false;
}
@@ -341,6 +373,23 @@
finishForCarMode();
}
}
+ if (Intent.ACTION_USER_SWITCHED.equals(intent.getAction())) {
+ for (TriggerSensor s : mSensors) {
+ s.updateListener();
+ }
+ }
+ }
+ };
+
+ private final ContentObserver mSettingsObserver = new ContentObserver(mHandler) {
+ @Override
+ public void onChange(boolean selfChange, Uri uri, int userId) {
+ if (userId != ActivityManager.getCurrentUser()) {
+ return;
+ }
+ for (TriggerSensor s : mSensors) {
+ s.updateListener();
+ }
}
};
@@ -372,18 +421,34 @@
}
};
+ private Sensor findSensorWithType(String type) {
+ if (TextUtils.isEmpty(type)) {
+ return null;
+ }
+ List<Sensor> sensorList = mSensorManager.getSensorList(Sensor.TYPE_ALL);
+ for (Sensor s : sensorList) {
+ if (type.equals(s.getStringType())) {
+ return s;
+ }
+ }
+ return null;
+ }
+
private class TriggerSensor extends TriggerEventListener {
- private final Sensor mSensor;
- private final boolean mConfigured;
- private final boolean mDebugVibrate;
- private final int mPulseReason;
+ final Sensor mSensor;
+ final boolean mConfigured;
+ final boolean mDebugVibrate;
+ final int mPulseReason;
+ final String mSetting;
private boolean mRequested;
private boolean mRegistered;
private boolean mDisabled;
- public TriggerSensor(int type, boolean configured, boolean debugVibrate, int pulseReason) {
- mSensor = mSensors.getDefaultSensor(type);
+ public TriggerSensor(Sensor sensor, String setting, boolean configured,
+ boolean debugVibrate, int pulseReason) {
+ mSensor = sensor;
+ mSetting = setting;
mConfigured = configured;
mDebugVibrate = debugVibrate;
mPulseReason = pulseReason;
@@ -401,18 +466,26 @@
updateListener();
}
- private void updateListener() {
+ public void updateListener() {
if (!mConfigured || mSensor == null) return;
- if (mRequested && !mDisabled && !mRegistered) {
- mRegistered = mSensors.requestTriggerSensor(this, mSensor);
+ if (mRequested && !mDisabled && enabledBySetting() && !mRegistered) {
+ mRegistered = mSensorManager.requestTriggerSensor(this, mSensor);
if (DEBUG) Log.d(mTag, "requestTriggerSensor " + mRegistered);
} else if (mRegistered) {
- final boolean rt = mSensors.cancelTriggerSensor(this, mSensor);
+ final boolean rt = mSensorManager.cancelTriggerSensor(this, mSensor);
if (DEBUG) Log.d(mTag, "cancelTriggerSensor " + rt);
mRegistered = false;
}
}
+ private boolean enabledBySetting() {
+ if (TextUtils.isEmpty(mSetting)) {
+ return true;
+ }
+ return Settings.Secure.getIntForUser(mContext.getContentResolver(), mSetting, 1,
+ UserHandle.USER_CURRENT) != 0;
+ }
+
@Override
public String toString() {
return new StringBuilder("{mRegistered=").append(mRegistered)
@@ -481,7 +554,7 @@
public void check() {
if (mFinished || mRegistered) return;
- final Sensor sensor = mSensors.getDefaultSensor(Sensor.TYPE_PROXIMITY);
+ final Sensor sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
if (sensor == null) {
if (DEBUG) Log.d(mTag, "No sensor found");
finishWithResult(RESULT_UNKNOWN);
@@ -491,7 +564,8 @@
mPickupSensor.setDisabled(true);
mMaxRange = sensor.getMaximumRange();
- mSensors.registerListener(this, sensor, SensorManager.SENSOR_DELAY_NORMAL, 0, mHandler);
+ mSensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_NORMAL, 0,
+ mHandler);
mHandler.postDelayed(this, TIMEOUT_DELAY_MS);
mRegistered = true;
}
@@ -518,7 +592,7 @@
if (mFinished) return;
if (mRegistered) {
mHandler.removeCallbacks(this);
- mSensors.unregisterListener(this);
+ mSensorManager.unregisterListener(this);
// we're done - reenable the pickup sensor
mPickupSensor.setDisabled(false);
mRegistered = false;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java
index d483e42..e1cd143 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java
@@ -14,13 +14,13 @@
package com.android.systemui.qs;
-import android.graphics.Path;
import android.util.Log;
import android.view.View;
import android.view.View.OnAttachStateChangeListener;
import android.view.View.OnLayoutChangeListener;
import android.widget.TextView;
+import com.android.systemui.plugins.qs.QSContainer;
import com.android.systemui.qs.PagedTileLayout.PageListener;
import com.android.systemui.qs.QSPanel.QSTileLayout;
import com.android.systemui.qs.QSTile.Host.Callback;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSContainer.java b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
similarity index 92%
rename from packages/SystemUI/src/com/android/systemui/qs/QSContainer.java
rename to packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
index 19a5d52..2173922 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSContainer.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
@@ -24,14 +24,16 @@
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
+import android.view.ViewGroup;
import android.view.ViewTreeObserver;
-import android.widget.FrameLayout;
+
import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.plugins.qs.QSContainer;
import com.android.systemui.qs.customize.QSCustomizer;
-import com.android.systemui.statusbar.phone.BaseStatusBarHeader;
-import com.android.systemui.statusbar.phone.NotificationPanelView;
+import com.android.systemui.statusbar.phone.NotificationsQuickSettingsContainer;
import com.android.systemui.statusbar.phone.QSTileHost;
+import com.android.systemui.statusbar.phone.QuickStatusBarHeader;
import com.android.systemui.statusbar.stack.StackStateAnimator;
/**
@@ -39,7 +41,7 @@
*
* Also manages animations for the QS Header and Panel.
*/
-public class QSContainer extends FrameLayout {
+public class QSContainerImpl extends QSContainer {
private static final String TAG = "QSContainer";
private static final boolean DEBUG = false;
@@ -49,7 +51,7 @@
private int mHeightOverride = -1;
protected QSPanel mQSPanel;
private QSDetail mQSDetail;
- protected BaseStatusBarHeader mHeader;
+ protected QuickStatusBarHeader mHeader;
protected float mQsExpansion;
private boolean mQsExpanded;
private boolean mHeaderAnimating;
@@ -59,10 +61,10 @@
private long mDelay;
private QSAnimator mQSAnimator;
private QSCustomizer mQSCustomizer;
- private NotificationPanelView mPanelView;
+ private HeightListener mPanelView;
private boolean mListening;
- public QSContainer(Context context, AttributeSet attrs) {
+ public QSContainerImpl(Context context, AttributeSet attrs) {
super(context, attrs);
}
@@ -71,7 +73,7 @@
super.onFinishInflate();
mQSPanel = (QSPanel) findViewById(R.id.quick_settings_panel);
mQSDetail = (QSDetail) findViewById(R.id.qs_detail);
- mHeader = (BaseStatusBarHeader) findViewById(R.id.header);
+ mHeader = (QuickStatusBarHeader) findViewById(R.id.header);
mQSDetail.setQsPanel(mQSPanel, mHeader);
mQSAnimator = new QSAnimator(this, (QuickQSPanel) mHeader.findViewById(R.id.quick_qs_panel),
mQSPanel);
@@ -92,7 +94,7 @@
mQSAnimator.setHost(qsh);
}
- public void setPanelView(NotificationPanelView panelView) {
+ public void setPanelView(HeightListener panelView) {
mPanelView = panelView;
}
@@ -137,6 +139,13 @@
updateBottom();
}
+ @Override
+ public void setContainer(ViewGroup container) {
+ if (container instanceof NotificationsQuickSettingsContainer) {
+ mQSCustomizer.setContainer((NotificationsQuickSettingsContainer) container);
+ }
+ }
+
/**
* The height this view wants to be. This is different from {@link #getMeasuredHeight} such that
* during closing the detail panel, this already returns the smaller height.
@@ -291,6 +300,11 @@
.start();
}
+ @Override
+ public void closeDetail() {
+ mQSPanel.closeDetail();
+ }
+
private final ViewTreeObserver.OnPreDrawListener mStartHeaderSlidingIn
= new ViewTreeObserver.OnPreDrawListener() {
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java b/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java
index 90b2e90..2b9320b 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java
@@ -35,8 +35,9 @@
import com.android.internal.logging.MetricsLogger;
import com.android.systemui.FontSizeUtils;
import com.android.systemui.R;
-import com.android.systemui.qs.QSTile.DetailAdapter;
-import com.android.systemui.statusbar.phone.BaseStatusBarHeader;
+import com.android.systemui.plugins.qs.QSContainer.BaseStatusBarHeader;
+import com.android.systemui.plugins.qs.QSContainer.Callback;
+import com.android.systemui.plugins.qs.QSContainer.DetailAdapter;
import com.android.systemui.statusbar.phone.QSTileHost;
public class QSDetail extends LinearLayout {
@@ -151,7 +152,7 @@
- public void handleShowingDetail(final QSTile.DetailAdapter adapter, int x, int y,
+ public void handleShowingDetail(final DetailAdapter adapter, int x, int y,
boolean toggleQs) {
final boolean showingDetail = adapter != null;
setClickable(showingDetail);
@@ -287,7 +288,7 @@
mDetailAdapter != null && mDetailAdapter.getToggleEnabled());
}
- protected QSPanel.Callback mQsPanelCallback = new QSPanel.Callback() {
+ protected Callback mQsPanelCallback = new Callback() {
@Override
public void onToggleStateChanged(final boolean state) {
post(new Runnable() {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
index ed0fc1f..e1db8c6 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
@@ -30,7 +30,8 @@
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.MetricsProto.MetricsEvent;
import com.android.systemui.R;
-import com.android.systemui.qs.QSTile.DetailAdapter;
+import com.android.systemui.plugins.qs.QSContainer;
+import com.android.systemui.plugins.qs.QSContainer.DetailAdapter;
import com.android.systemui.qs.QSTile.Host.Callback;
import com.android.systemui.qs.customize.QSCustomizer;
import com.android.systemui.qs.external.CustomTile;
@@ -59,7 +60,7 @@
protected boolean mExpanded;
protected boolean mListening;
- private Callback mCallback;
+ private QSContainer.Callback mCallback;
private BrightnessController mBrightnessController;
protected QSTileHost mHost;
@@ -170,7 +171,7 @@
return mBrightnessView;
}
- public void setCallback(Callback callback) {
+ public void setCallback(QSContainer.Callback callback) {
mCallback = callback;
}
@@ -542,12 +543,6 @@
public QSTile.Callback callback;
}
- public interface Callback {
- void onShowingDetail(DetailAdapter detail, int x, int y);
- void onToggleStateChanged(boolean state);
- void onScanStateChanged(boolean state);
- }
-
public interface QSTileLayout {
void addTile(TileRecord tile);
void removeTile(TileRecord tile);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTile.java b/packages/SystemUI/src/com/android/systemui/qs/QSTile.java
index 6657b62..39ce324 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSTile.java
@@ -27,12 +27,11 @@
import android.util.ArraySet;
import android.util.Log;
import android.util.SparseArray;
-import android.view.View;
-import android.view.ViewGroup;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.MetricsProto.MetricsEvent;
import com.android.settingslib.RestrictedLockUtils;
+import com.android.systemui.plugins.qs.QSContainer.DetailAdapter;
import com.android.systemui.qs.QSTile.State;
import com.android.systemui.qs.external.TileServices;
import com.android.systemui.statusbar.phone.ManagedProfileController;
@@ -42,7 +41,6 @@
import com.android.systemui.statusbar.policy.FlashlightController;
import com.android.systemui.statusbar.policy.HotspotController;
import com.android.systemui.statusbar.policy.KeyguardMonitor;
-import com.android.systemui.statusbar.policy.Listenable;
import com.android.systemui.statusbar.policy.LocationController;
import com.android.systemui.statusbar.policy.NetworkController;
import com.android.systemui.statusbar.policy.RotationLockController;
@@ -147,29 +145,6 @@
return true;
}
- public interface DetailAdapter {
- CharSequence getTitle();
- Boolean getToggleState();
- default boolean getToggleEnabled() {
- return true;
- }
- View createDetailView(Context context, View convertView, ViewGroup parent);
- Intent getSettingsIntent();
- void setToggleState(boolean state);
- int getMetricsCategory();
-
- /**
- * @return the height in px the content of the detail view should take.
- */
- default int getDetailViewHeight() { throw new UnsupportedOperationException(); };
-
- /**
- * Indicates whether the detail view wants to have its header (back button, title and
- * toggle) shown.
- */
- default boolean hasHeader() { return true; }
- }
-
// safe to call from any thread
public void addCallback(Callback callback) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java
index 0de1e30..3493d24 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java
@@ -33,10 +33,11 @@
import android.widget.LinearLayout;
import android.widget.Toolbar;
import android.widget.Toolbar.OnMenuItemClickListener;
+
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.MetricsProto;
import com.android.systemui.R;
-import com.android.systemui.qs.QSContainer;
+import com.android.systemui.plugins.qs.QSContainer;
import com.android.systemui.qs.QSDetailClipper;
import com.android.systemui.qs.QSTile;
import com.android.systemui.statusbar.phone.NotificationsQuickSettingsContainer;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/BatteryTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/BatteryTile.java
index 985bc9f..b61a81c 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/BatteryTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/BatteryTile.java
@@ -40,6 +40,7 @@
import com.android.settingslib.graph.UsageView;
import com.android.systemui.BatteryMeterDrawable;
import com.android.systemui.R;
+import com.android.systemui.plugins.qs.QSContainer.DetailAdapter;
import com.android.systemui.qs.QSTile;
import com.android.systemui.statusbar.policy.BatteryController;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java
index 8d8474a..18bde27 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java
@@ -32,6 +32,7 @@
import com.android.internal.logging.MetricsProto.MetricsEvent;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.systemui.R;
+import com.android.systemui.plugins.qs.QSContainer.DetailAdapter;
import com.android.systemui.qs.QSDetailItems;
import com.android.systemui.qs.QSDetailItems.Item;
import com.android.systemui.qs.QSTile;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java
index c3e9b6e..61bad77 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java
@@ -28,6 +28,7 @@
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.MetricsProto.MetricsEvent;
import com.android.systemui.R;
+import com.android.systemui.plugins.qs.QSContainer.DetailAdapter;
import com.android.systemui.qs.QSDetailItems;
import com.android.systemui.qs.QSDetailItems.Item;
import com.android.systemui.qs.QSTile;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java
index 0de5105..7de883e 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java
@@ -24,12 +24,12 @@
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
-import android.widget.Switch;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.MetricsProto.MetricsEvent;
import com.android.settingslib.net.DataUsageController;
import com.android.systemui.R;
+import com.android.systemui.plugins.qs.QSContainer.DetailAdapter;
import com.android.systemui.qs.QSIconView;
import com.android.systemui.qs.QSTile;
import com.android.systemui.qs.SignalTileView;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java
index 91821ba..89bb1d2 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java
@@ -37,6 +37,7 @@
import com.android.systemui.Prefs;
import com.android.systemui.R;
import com.android.systemui.SysUIToast;
+import com.android.systemui.plugins.qs.QSContainer.DetailAdapter;
import com.android.systemui.qs.QSTile;
import com.android.systemui.statusbar.policy.ZenModeController;
import com.android.systemui.volume.ZenModePanel;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/UserTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/UserTile.java
index cc875ac..b5fbfe0 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/UserTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/UserTile.java
@@ -22,6 +22,7 @@
import android.util.Pair;
import com.android.internal.logging.MetricsProto.MetricsEvent;
+import com.android.systemui.plugins.qs.QSContainer.DetailAdapter;
import com.android.systemui.qs.QSTile;
import com.android.systemui.statusbar.policy.UserInfoController;
import com.android.systemui.statusbar.policy.UserSwitcherController;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
index ba79a18..27306fc 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
@@ -31,6 +31,7 @@
import com.android.internal.logging.MetricsProto.MetricsEvent;
import com.android.settingslib.wifi.AccessPoint;
import com.android.systemui.R;
+import com.android.systemui.plugins.qs.QSContainer.DetailAdapter;
import com.android.systemui.qs.QSDetailItems;
import com.android.systemui.qs.QSDetailItems.Item;
import com.android.systemui.qs.QSIconView;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarNavigationBarController.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarNavigationBarController.java
index da57f7a..baff680 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarNavigationBarController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarNavigationBarController.java
@@ -15,17 +15,14 @@
*/
package com.android.systemui.statusbar.car;
-import android.app.ActivityManager;
import android.app.ActivityManager.StackId;
import android.content.Context;
import android.content.Intent;
-import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
-import android.os.Handler;
import android.support.v4.util.SimpleArrayMap;
import android.util.Log;
import android.util.SparseBooleanArray;
@@ -33,7 +30,7 @@
import android.widget.LinearLayout;
import com.android.systemui.R;
-import com.android.systemui.statusbar.phone.ActivityStarter;
+import com.android.systemui.plugins.qs.QSContainer.ActivityStarter;
import java.net.URISyntaxException;
import java.util.ArrayList;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ActivityStarter.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ActivityStarter.java
deleted file mode 100644
index 8f689c6..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ActivityStarter.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.systemui.statusbar.phone;
-
-import android.app.PendingIntent;
-import android.content.Intent;
-
-/**
- * An interface to start activities. This is used to as a callback from the views to
- * {@link PhoneStatusBar} to allow custom handling for starting the activity, i.e. dismissing the
- * Keyguard.
- */
-public interface ActivityStarter {
- void startPendingIntentDismissingKeyguard(PendingIntent intent);
- void startActivity(Intent intent, boolean dismissShade);
- void startActivity(Intent intent, boolean dismissShade, Callback callback);
- void preventNextAnimation();
-
- interface Callback {
- void onActivityStarted(int resultCode);
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BaseStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BaseStatusBarHeader.java
deleted file mode 100644
index 79eef43..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BaseStatusBarHeader.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.systemui.statusbar.phone;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.widget.RelativeLayout;
-import com.android.systemui.qs.QSPanel;
-import com.android.systemui.qs.QSPanel.Callback;
-import com.android.systemui.statusbar.policy.BatteryController;
-import com.android.systemui.statusbar.policy.NetworkControllerImpl;
-import com.android.systemui.statusbar.policy.NextAlarmController;
-import com.android.systemui.statusbar.policy.UserInfoController;
-
-public abstract class BaseStatusBarHeader extends RelativeLayout implements
- NetworkControllerImpl.EmergencyListener {
-
- public BaseStatusBarHeader(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- public abstract int getCollapsedHeight();
- public abstract int getExpandedHeight();
-
- public abstract void setExpanded(boolean b);
- public abstract void setExpansion(float headerExpansionFraction);
- public abstract void setListening(boolean listening);
- public abstract void updateEverything();
- public abstract void setActivityStarter(ActivityStarter activityStarter);
- public abstract void setQSPanel(QSPanel qSPanel);
- public abstract void setBatteryController(BatteryController batteryController);
- public abstract void setNextAlarmController(NextAlarmController nextAlarmController);
- public abstract void setUserInfoController(UserInfoController userInfoController);
- public abstract void setCallback(Callback qsPanelCallback);
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java
index efceed1..d5bf499 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java
@@ -84,8 +84,8 @@
return getPulseInDuration(pickup) + getPulseVisibleDuration() + getPulseOutDuration();
}
- public int getPulseInDuration(boolean pickup) {
- return pickup
+ public int getPulseInDuration(boolean pickupOrDoubleTap) {
+ return pickupOrDoubleTap
? getInt("doze.pulse.duration.in.pickup", R.integer.doze_pulse_duration_in_pickup)
: getInt("doze.pulse.duration.in", R.integer.doze_pulse_duration_in);
}
@@ -114,6 +114,10 @@
return SystemProperties.getBoolean("doze.vibrate.pickup", false);
}
+ public String getDoubleTapSensorType() {
+ return mContext.getString(R.string.doze_double_tap_sensor_type);
+ }
+
public boolean getProxCheckBeforePulse() {
return getBoolean("doze.pulse.proxcheck", R.bool.doze_proximity_check_before_pulse);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java
index 7d4515e..b44f5f7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java
@@ -109,10 +109,11 @@
public void onScreenTurnedOn() {
if (isPulsing()) {
- final boolean pickup = mPulseReason == DozeLog.PULSE_REASON_SENSOR_PICKUP;
+ final boolean pickupOrDoubleTap = mPulseReason == DozeLog.PULSE_REASON_SENSOR_PICKUP
+ || mPulseReason == DozeLog.PULSE_REASON_SENSOR_DOUBLE_TAP;
startScrimAnimation(true /* inFront */, 0f,
- mDozeParameters.getPulseInDuration(pickup),
- pickup ? Interpolators.LINEAR_OUT_SLOW_IN : Interpolators.ALPHA_OUT,
+ mDozeParameters.getPulseInDuration(pickupOrDoubleTap),
+ pickupOrDoubleTap ? Interpolators.LINEAR_OUT_SLOW_IN : Interpolators.ALPHA_OUT,
mPulseInFinished);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
index 8cabfb9..0a391eb 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
@@ -61,6 +61,7 @@
import com.android.systemui.Interpolators;
import com.android.systemui.R;
import com.android.systemui.assist.AssistManager;
+import com.android.systemui.plugins.qs.QSContainer.ActivityStarter;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.KeyguardAffordanceView;
import com.android.systemui.statusbar.KeyguardIndicationController;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitch.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitch.java
index 0de06c9..af9454c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitch.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitch.java
@@ -18,7 +18,6 @@
import android.content.Context;
import android.content.Intent;
-import android.os.UserHandle;
import android.os.UserManager;
import android.provider.ContactsContract;
import android.text.TextUtils;
@@ -31,8 +30,8 @@
import android.widget.FrameLayout;
import com.android.systemui.R;
+import com.android.systemui.plugins.qs.QSContainer.DetailAdapter;
import com.android.systemui.qs.QSPanel;
-import com.android.systemui.qs.QSTile;
import com.android.systemui.statusbar.policy.KeyguardUserSwitcher;
import com.android.systemui.statusbar.policy.UserSwitcherController;
@@ -183,7 +182,7 @@
return false;
}
- protected QSTile.DetailAdapter getUserDetailAdapter() {
+ protected DetailAdapter getUserDetailAdapter() {
return mUserSwitcherController.userDetailAdapter;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
index 812c5c1..5d1af2f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
@@ -50,7 +50,7 @@
import com.android.systemui.Interpolators;
import com.android.systemui.R;
import com.android.systemui.classifier.FalsingManager;
-import com.android.systemui.qs.QSContainer;
+import com.android.systemui.plugins.qs.QSContainer;
import com.android.systemui.statusbar.ExpandableNotificationRow;
import com.android.systemui.statusbar.ExpandableView;
import com.android.systemui.statusbar.FlingAnimationUtils;
@@ -70,7 +70,7 @@
ExpandableView.OnHeightChangedListener,
View.OnClickListener, NotificationStackScrollLayout.OnOverscrollTopChangedListener,
KeyguardAffordanceHelper.Callback, NotificationStackScrollLayout.OnEmptySpaceClickListener,
- HeadsUpManager.OnHeadsUpChangedListener {
+ HeadsUpManager.OnHeadsUpChangedListener, QSContainer.HeightListener {
private static final boolean DEBUG = false;
@@ -242,7 +242,7 @@
public void onInflated(View v) {
mQsContainer = (QSContainer) v.findViewById(R.id.quick_settings_container);
mQsContainer.setPanelView(NotificationPanelView.this);
- mQsContainer.getHeader().findViewById(R.id.expand_indicator)
+ mQsContainer.getHeader().getExpandView()
.setOnClickListener(NotificationPanelView.this);
// recompute internal state when qspanel height changes
@@ -2011,7 +2011,7 @@
}
public void closeQsDetail() {
- mQsContainer.getQsPanel().closeDetail();
+ mQsContainer.closeDetail();
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationsQuickSettingsContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationsQuickSettingsContainer.java
index 36e59db..8b1fcd6 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationsQuickSettingsContainer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationsQuickSettingsContainer.java
@@ -24,10 +24,10 @@
import android.view.ViewStub;
import android.view.WindowInsets;
import android.widget.FrameLayout;
+
import com.android.systemui.AutoReinflateContainer;
import com.android.systemui.R;
-import com.android.systemui.qs.QSContainer;
-import com.android.systemui.qs.customize.QSCustomizer;
+import com.android.systemui.plugins.qs.QSContainer;
/**
* The container with notification stack scroller and quick settings inside.
@@ -130,8 +130,8 @@
@Override
public void onInflated(View v) {
- QSCustomizer customizer = ((QSContainer) v).getCustomizer();
- customizer.setContainer(this);
+ QSContainer container = (QSContainer) v;
+ container.setContainer(this);
}
public void setQsExpanded(boolean expanded) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index 082fde4..40303c4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -141,7 +141,10 @@
import com.android.systemui.doze.DozeHost;
import com.android.systemui.doze.DozeLog;
import com.android.systemui.keyguard.KeyguardViewMediator;
-import com.android.systemui.qs.QSContainer;
+import com.android.systemui.plugins.qs.QSContainer.ActivityStarter;
+import com.android.systemui.plugins.qs.QSContainer.BaseStatusBarHeader;
+import com.android.systemui.plugins.qs.QSContainer;
+import com.android.systemui.qs.QSContainerImpl;
import com.android.systemui.qs.QSPanel;
import com.android.systemui.recents.ScreenPinningRequest;
import com.android.systemui.recents.events.EventBus;
@@ -933,10 +936,12 @@
public void onInflated(View v) {
QSContainer qsContainer = (QSContainer) v.findViewById(
R.id.quick_settings_container);
- qsContainer.setHost(qsh);
- mQSPanel = qsContainer.getQsPanel();
- mQSPanel.setBrightnessMirror(mBrightnessMirrorController);
- mKeyguardStatusBar.setQSPanel(mQSPanel);
+ if (qsContainer instanceof QSContainerImpl) {
+ ((QSContainerImpl) qsContainer).setHost(qsh);
+ mQSPanel = ((QSContainerImpl) qsContainer).getQsPanel();
+ mQSPanel.setBrightnessMirror(mBrightnessMirrorController);
+ mKeyguardStatusBar.setQSPanel(mQSPanel);
+ }
mHeader = qsContainer.getHeader();
initSignalCluster(mHeader);
mHeader.setActivityStarter(PhoneStatusBar.this);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStatusBarHeader.java
index 3ad09d1..b0b86be 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStatusBarHeader.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStatusBarHeader.java
@@ -37,12 +37,15 @@
import com.android.keyguard.KeyguardStatusView;
import com.android.systemui.FontSizeUtils;
import com.android.systemui.R;
+import com.android.systemui.plugins.qs.QSContainer.ActivityStarter;
+import com.android.systemui.plugins.qs.QSContainer.BaseStatusBarHeader;
import com.android.systemui.qs.QSPanel;
-import com.android.systemui.qs.QSPanel.Callback;
+import com.android.systemui.plugins.qs.QSContainer.Callback;
import com.android.systemui.qs.QuickQSPanel;
import com.android.systemui.qs.TouchAnimator;
import com.android.systemui.qs.TouchAnimator.Builder;
import com.android.systemui.statusbar.policy.BatteryController;
+import com.android.systemui.statusbar.policy.NetworkController.EmergencyListener;
import com.android.systemui.statusbar.policy.NextAlarmController;
import com.android.systemui.statusbar.policy.NextAlarmController.NextAlarmChangeCallback;
import com.android.systemui.statusbar.policy.UserInfoController;
@@ -50,7 +53,7 @@
import com.android.systemui.tuner.TunerService;
public class QuickStatusBarHeader extends BaseStatusBarHeader implements
- NextAlarmChangeCallback, OnClickListener, OnUserInfoChangedListener {
+ NextAlarmChangeCallback, OnClickListener, OnUserInfoChangedListener, EmergencyListener {
private static final String TAG = "QuickStatusBarHeader";
@@ -255,6 +258,11 @@
}
@Override
+ public View getExpandView() {
+ return findViewById(R.id.expand_indicator);
+ }
+
+ @Override
public void updateEverything() {
post(() -> {
updateVisibilities();
@@ -293,7 +301,6 @@
mActivityStarter = activityStarter;
}
- @Override
public void setQSPanel(final QSPanel qsPanel) {
mQsPanel = qsPanel;
setupHost(qsPanel.getHost());
@@ -354,17 +361,14 @@
true /* dismissShade */);
}
- @Override
public void setNextAlarmController(NextAlarmController nextAlarmController) {
mNextAlarmController = nextAlarmController;
}
- @Override
public void setBatteryController(BatteryController batteryController) {
// Don't care
}
- @Override
public void setUserInfoController(UserInfoController userInfoController) {
userInfoController.addListener(this);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
index c3becb0..30d1c54 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
@@ -50,15 +50,14 @@
import com.android.internal.logging.MetricsProto.MetricsEvent;
import com.android.internal.util.UserIcons;
-import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.settingslib.RestrictedLockUtils;
import com.android.systemui.GuestResumeSessionReceiver;
import com.android.systemui.R;
import com.android.systemui.SystemUI;
import com.android.systemui.SystemUISecondaryUserService;
-import com.android.systemui.qs.QSTile;
+import com.android.systemui.plugins.qs.QSContainer.DetailAdapter;
import com.android.systemui.qs.tiles.UserDetailView;
-import com.android.systemui.statusbar.phone.ActivityStarter;
+import com.android.systemui.plugins.qs.QSContainer.ActivityStarter;
import com.android.systemui.statusbar.phone.SystemUIDialog;
import java.io.FileDescriptor;
@@ -793,7 +792,7 @@
}
}
- public final QSTile.DetailAdapter userDetailAdapter = new QSTile.DetailAdapter() {
+ public final DetailAdapter userDetailAdapter = new DetailAdapter() {
private final Intent USER_SETTINGS_INTENT = new Intent(Settings.ACTION_USER_SETTINGS);
@Override
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index e7b5868..a2f3be7 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -816,7 +816,7 @@
mTestMode = SystemProperties.get("cm.test.mode").equals("true")
&& SystemProperties.get("ro.build.type").equals("eng");
- mTethering = new Tethering(mContext, mNetd, statsService);
+ mTethering = new Tethering(mContext, mNetd, statsService, mPolicyManager);
mPermissionMonitor = new PermissionMonitor(mContext, mNetd);
@@ -3049,12 +3049,6 @@
ConnectivityManager.enforceTetherChangePermission(mContext);
if (isTetheringSupported()) {
final int status = mTethering.tether(iface);
- if (status == ConnectivityManager.TETHER_ERROR_NO_ERROR) {
- try {
- mPolicyManager.onTetheringChanged(iface, true);
- } catch (RemoteException e) {
- }
- }
return status;
} else {
return ConnectivityManager.TETHER_ERROR_UNSUPPORTED;
@@ -3068,12 +3062,6 @@
if (isTetheringSupported()) {
final int status = mTethering.untether(iface);
- if (status == ConnectivityManager.TETHER_ERROR_NO_ERROR) {
- try {
- mPolicyManager.onTetheringChanged(iface, false);
- } catch (RemoteException e) {
- }
- }
return status;
} else {
return ConnectivityManager.TETHER_ERROR_UNSUPPORTED;
diff --git a/services/core/java/com/android/server/connectivity/Tethering.java b/services/core/java/com/android/server/connectivity/Tethering.java
index 927f8f9..50faf3b 100644
--- a/services/core/java/com/android/server/connectivity/Tethering.java
+++ b/services/core/java/com/android/server/connectivity/Tethering.java
@@ -33,6 +33,7 @@
import android.hardware.usb.UsbManager;
import android.net.ConnectivityManager;
import android.net.ConnectivityManager.NetworkCallback;
+import android.net.INetworkPolicyManager;
import android.net.INetworkStatsService;
import android.net.LinkProperties;
import android.net.Network;
@@ -49,6 +50,7 @@
import android.os.Looper;
import android.os.Message;
import android.os.Parcel;
+import android.os.RemoteException;
import android.os.ResultReceiver;
import android.os.SystemProperties;
import android.os.UserHandle;
@@ -123,6 +125,7 @@
private final INetworkManagementService mNMService;
private final INetworkStatsService mStatsService;
+ private final INetworkPolicyManager mPolicyManager;
private final Looper mLooper;
private static class TetherState {
@@ -177,10 +180,11 @@
private boolean mWifiTetherRequested;
public Tethering(Context context, INetworkManagementService nmService,
- INetworkStatsService statsService) {
+ INetworkStatsService statsService, INetworkPolicyManager policyManager) {
mContext = context;
mNMService = nmService;
mStatsService = statsService;
+ mPolicyManager = policyManager;
mPublicSync = new Object();
@@ -622,12 +626,9 @@
}
public void untetherAll() {
- synchronized (mPublicSync) {
- if (DBG) Log.d(TAG, "Untethering " + mTetherStates.keySet());
- for (int i = 0; i < mTetherStates.size(); i++) {
- untether(mTetherStates.keyAt(i));
- }
- }
+ stopTethering(ConnectivityManager.TETHERING_WIFI);
+ stopTethering(ConnectivityManager.TETHERING_USB);
+ stopTethering(ConnectivityManager.TETHERING_BLUETOOTH);
}
public int getLastTetherError(String iface) {
@@ -1908,6 +1909,15 @@
" with error " + error);
}
+ try {
+ // Notify that we're tethering (or not) this interface.
+ // This is how data saver for instance knows if the user explicitly
+ // turned on tethering (thus keeping us from being in data saver mode).
+ mPolicyManager.onTetheringChanged(iface, state == IControlsTethering.STATE_TETHERED);
+ } catch (RemoteException e) {
+ // Not really very much we can do here.
+ }
+
switch (state) {
case IControlsTethering.STATE_UNAVAILABLE:
case IControlsTethering.STATE_AVAILABLE:
diff --git a/services/core/java/com/android/server/job/JobServiceContext.java b/services/core/java/com/android/server/job/JobServiceContext.java
index 8303d5c..27f397d 100644
--- a/services/core/java/com/android/server/job/JobServiceContext.java
+++ b/services/core/java/com/android/server/job/JobServiceContext.java
@@ -307,10 +307,24 @@
this.service = IJobService.Stub.asInterface(service);
final PowerManager pm =
(PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
- mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, runningJob.getTag());
- mWakeLock.setWorkSource(new WorkSource(runningJob.getSourceUid()));
- mWakeLock.setReferenceCounted(false);
- mWakeLock.acquire();
+ PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
+ runningJob.getTag());
+ wl.setWorkSource(new WorkSource(runningJob.getSourceUid()));
+ wl.setReferenceCounted(false);
+ wl.acquire();
+ synchronized (mLock) {
+ // We use a new wakelock instance per job. In rare cases there is a race between
+ // teardown following job completion/cancellation and new job service spin-up
+ // such that if we simply assign mWakeLock to be the new instance, we orphan
+ // the currently-live lock instead of cleanly replacing it. Watch for this and
+ // explicitly fast-forward the release if we're in that situation.
+ if (mWakeLock != null) {
+ Slog.w(TAG, "Bound new job " + runningJob + " but live wakelock " + mWakeLock
+ + " tag=" + mWakeLock.getTag());
+ mWakeLock.release();
+ }
+ mWakeLock = wl;
+ }
mCallbackHandler.obtainMessage(MSG_SERVICE_BOUND).sendToTarget();
}
diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
index 2fd9fe1..6381aa7 100644
--- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
+++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
@@ -292,6 +292,7 @@
private static final int MSG_REMOVE_INTERFACE_QUOTA = 11;
private static final int MSG_POLICIES_CHANGED = 13;
private static final int MSG_SET_FIREWALL_RULES = 14;
+ private static final int MSG_RESET_FIREWALL_RULES_BY_UID = 15;
private final Context mContext;
private final IActivityManager mActivityManager;
@@ -737,7 +738,7 @@
// global background data policy
if (LOGV) Slog.v(TAG, "ACTION_PACKAGE_ADDED for uid=" + uid);
synchronized (mUidRulesFirstLock) {
- updateRestrictionRulesForUidUL(uid, false);
+ updateRestrictionRulesForUidUL(uid);
}
}
}
@@ -754,11 +755,7 @@
// remove any policy and update rules to clean up
if (LOGV) Slog.v(TAG, "ACTION_UID_REMOVED for uid=" + uid);
synchronized (mUidRulesFirstLock) {
- mUidRules.delete(uid);
- mUidPolicy.delete(uid);
- // TODO: rather than passing onUidDeleted=true, it would be clearner to have a
- // method that reset all firewall rules for an UID....
- updateRestrictionRulesForUidUL(uid, true);
+ onUidDeletedUL(uid);
synchronized (mNetworkPoliciesSecondLock) {
writePolicyAL();
}
@@ -2811,6 +2808,24 @@
}
/**
+ * Clears all state - internal and external - associated with an UID.
+ */
+ private void onUidDeletedUL(int uid) {
+ // First cleanup in-memory state synchronously...
+ mUidRules.delete(uid);
+ mUidPolicy.delete(uid);
+ mUidFirewallStandbyRules.delete(uid);
+ mUidFirewallDozableRules.delete(uid);
+ mUidFirewallPowerSaveRules.delete(uid);
+ mPowerSaveWhitelistExceptIdleAppIds.delete(uid);
+ mPowerSaveWhitelistAppIds.delete(uid);
+ mPowerSaveTempWhitelistAppIds.delete(uid);
+
+ // ...then update iptables asynchronously.
+ mHandler.obtainMessage(MSG_RESET_FIREWALL_RULES_BY_UID, uid, 0).sendToTarget();
+ }
+
+ /**
* Applies network rules to bandwidth and firewall controllers based on uid policy.
*
* <p>There are currently 4 types of restriction rules:
@@ -2823,7 +2838,7 @@
*
* <p>This method changes both the external firewall rules and the internal state.
*/
- private void updateRestrictionRulesForUidUL(int uid, boolean onUidDeleted) {
+ private void updateRestrictionRulesForUidUL(int uid) {
// Methods below only changes the firewall rules for the power-related modes.
updateRuleForDeviceIdleUL(uid);
updateRuleForAppIdleUL(uid);
@@ -2833,7 +2848,7 @@
updateRulesForPowerRestrictionsUL(uid);
// Update firewall and internal rules for Data Saver Mode.
- updateRulesForDataUsageRestrictionsUL(uid, onUidDeleted);
+ updateRulesForDataUsageRestrictionsUL(uid);
}
/**
@@ -2876,15 +2891,7 @@
*
*/
private void updateRulesForDataUsageRestrictionsUL(int uid) {
- updateRulesForDataUsageRestrictionsUL(uid, false);
- }
-
- /**
- * Overloaded version of {@link #updateRulesForDataUsageRestrictionsUL(int)} called when an
- * app is removed - it ignores the UID validity check.
- */
- private void updateRulesForDataUsageRestrictionsUL(int uid, boolean onUidDeleted) {
- if (!onUidDeleted && !isUidValidForWhitelistRules(uid)) {
+ if (!isUidValidForWhitelistRules(uid)) {
if (LOGD) Slog.d(TAG, "no need to update restrict data rules for uid " + uid);
return;
}
@@ -3265,6 +3272,10 @@
}
return true;
}
+ case MSG_RESET_FIREWALL_RULES_BY_UID: {
+ resetUidFirewallRules(msg.arg1);
+ return true;
+ }
default: {
return false;
}
@@ -3417,6 +3428,24 @@
}
}
+ /**
+ * Resets all firewall rules associated with an UID.
+ */
+ private void resetUidFirewallRules(int uid) {
+ try {
+ mNetworkManager.setFirewallUidRule(FIREWALL_CHAIN_DOZABLE, uid, FIREWALL_RULE_DEFAULT);
+ mNetworkManager.setFirewallUidRule(FIREWALL_CHAIN_STANDBY, uid, FIREWALL_RULE_DEFAULT);
+ mNetworkManager
+ .setFirewallUidRule(FIREWALL_CHAIN_POWERSAVE, uid, FIREWALL_RULE_DEFAULT);
+ mNetworkManager.setUidMeteredNetworkWhitelist(uid, false);
+ mNetworkManager.setUidMeteredNetworkBlacklist(uid, false);
+ } catch (IllegalStateException e) {
+ Log.wtf(TAG, "problem resetting firewall uid rules for " + uid, e);
+ } catch (RemoteException e) {
+ // ignored; service lives in system_server
+ }
+ }
+
private long getTotalBytes(NetworkTemplate template, long start, long end) {
try {
return mNetworkStats.getNetworkTotalBytes(template, start, end);
diff --git a/tools/aapt2/Android.mk b/tools/aapt2/Android.mk
index 9ec706f..60114fb 100644
--- a/tools/aapt2/Android.mk
+++ b/tools/aapt2/Android.mk
@@ -77,6 +77,8 @@
sources += Format.proto
+sourcesJni :=
+
testSources := \
compile/IdAssigner_test.cpp \
compile/InlineXmlFormatParser_test.cpp \
@@ -176,6 +178,25 @@
LOCAL_STATIC_LIBRARIES_windows := $(hostStaticLibs_windows)
include $(BUILD_HOST_STATIC_LIBRARY)
+
+# ==========================================================
+# Build the host shared library: libaapt2_jni
+# ==========================================================
+include $(CLEAR_VARS)
+LOCAL_MODULE := libaapt2_jni
+LOCAL_MODULE_CLASS := SHARED_LIBRARIES
+LOCAL_MODULE_HOST_OS := darwin linux windows
+LOCAL_CFLAGS := $(cFlags)
+LOCAL_CFLAGS_darwin := $(cFlags_darwin)
+LOCAL_CFLAGS_windows := $(cFlags_windows)
+LOCAL_CPPFLAGS := $(cppFlags)
+LOCAL_C_INCLUDES := $(protoIncludes)
+LOCAL_SRC_FILES := $(sourcesJni)
+LOCAL_STATIC_LIBRARIES := libaapt2 $(hostStaticLibs)
+LOCAL_STATIC_LIBRARIES_windows := $(hostStaticLibs_windows)
+include $(BUILD_HOST_SHARED_LIBRARY)
+
+
# ==========================================================
# Build the host tests: libaapt2_tests
# ==========================================================
diff --git a/wifi/java/android/net/wifi/nan/PublishConfig.java b/wifi/java/android/net/wifi/nan/PublishConfig.java
index 5ffd546..9151371 100644
--- a/wifi/java/android/net/wifi/nan/PublishConfig.java
+++ b/wifi/java/android/net/wifi/nan/PublishConfig.java
@@ -321,7 +321,7 @@
* will be broadcast. When the count is reached an event will be
* generated for {@link WifiNanDiscoverySessionCallback#onSessionTerminated(int)}
* with {@link WifiNanDiscoverySessionCallback#TERMINATE_REASON_DONE} [unless
- * {@link #setEnableTerminateNotification(boolean)} disables the callback].
+ * {@link #setTerminateNotificationEnabled(boolean)} disables the callback].
* <p>
* Optional. 0 by default - indicating the session doesn't terminate on its own.
* Session will be terminated when {@link WifiNanDiscoveryBaseSession#destroy()} is
@@ -347,7 +347,7 @@
* an event will be generated for
* {@link WifiNanDiscoverySessionCallback#onSessionTerminated(int)} with
* {@link WifiNanDiscoverySessionCallback#TERMINATE_REASON_DONE} [unless
- * {@link #setEnableTerminateNotification(boolean)} disables the callback].
+ * {@link #setTerminateNotificationEnabled(boolean)} disables the callback].
* <p>
* Optional. 0 by default - indicating the session doesn't terminate on its own.
* Session will be terminated when {@link WifiNanDiscoveryBaseSession#destroy()} is
@@ -377,7 +377,7 @@
* @return The builder to facilitate chaining
* {@code builder.setXXX(..).setXXX(..)}.
*/
- public Builder setEnableTerminateNotification(boolean enable) {
+ public Builder setTerminateNotificationEnabled(boolean enable) {
mEnableTerminateNotification = enable;
return this;
}
diff --git a/wifi/java/android/net/wifi/nan/SubscribeConfig.java b/wifi/java/android/net/wifi/nan/SubscribeConfig.java
index 28d5d91..b1dcd8f 100644
--- a/wifi/java/android/net/wifi/nan/SubscribeConfig.java
+++ b/wifi/java/android/net/wifi/nan/SubscribeConfig.java
@@ -429,7 +429,7 @@
* @return The builder to facilitate chaining
* {@code builder.setXXX(..).setXXX(..)}.
*/
- public Builder setEnableTerminateNotification(boolean enable) {
+ public Builder setTerminateNotificationEnabled(boolean enable) {
mEnableTerminateNotification = enable;
return this;
}
diff --git a/wifi/java/android/net/wifi/nan/WifiNanDiscoveryBaseSession.java b/wifi/java/android/net/wifi/nan/WifiNanDiscoveryBaseSession.java
index 5b84eb2..17e974b 100644
--- a/wifi/java/android/net/wifi/nan/WifiNanDiscoveryBaseSession.java
+++ b/wifi/java/android/net/wifi/nan/WifiNanDiscoveryBaseSession.java
@@ -16,6 +16,7 @@
package android.net.wifi.nan;
+import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.net.wifi.RttManager;
@@ -163,7 +164,7 @@
* (note: no retransmissions are attempted in other failure cases). A value of 0
* indicates no retries. Max permitted value is {@link #getMaxSendRetryCount()}.
*/
- public void sendMessage(Object peerHandle, int messageId, @Nullable byte[] message,
+ public void sendMessage(@NonNull Object peerHandle, int messageId, @Nullable byte[] message,
int retryCount) {
if (mTerminated) {
Log.w(TAG, "sendMessage: called on terminated session");
@@ -205,7 +206,7 @@
* can be arbitrary and non-unique.
* @param message The message to be transmitted.
*/
- public void sendMessage(Object peerHandle, int messageId, @Nullable byte[] message) {
+ public void sendMessage(@NonNull Object peerHandle, int messageId, @Nullable byte[] message) {
sendMessage(peerHandle, messageId, message, 0);
}
@@ -270,8 +271,8 @@
* {@link android.net.ConnectivityManager#requestNetwork(android.net.NetworkRequest,android.net.ConnectivityManager.NetworkCallback)}
* [or other varieties of that API].
*/
- public String createNetworkSpecifier(@WifiNanManager.DataPathRole int role, Object peerHandle,
- @Nullable byte[] token) {
+ public String createNetworkSpecifier(@WifiNanManager.DataPathRole int role,
+ @Nullable Object peerHandle, @Nullable byte[] token) {
if (mTerminated) {
Log.w(TAG, "createNetworkSpecifier: called on terminated session");
return null;
diff --git a/wifi/java/android/net/wifi/nan/WifiNanManager.java b/wifi/java/android/net/wifi/nan/WifiNanManager.java
index 815defb..705ba4a 100644
--- a/wifi/java/android/net/wifi/nan/WifiNanManager.java
+++ b/wifi/java/android/net/wifi/nan/WifiNanManager.java
@@ -459,15 +459,20 @@
/** @hide */
public void sendMessage(int clientId, int sessionId, Object peerHandle, byte[] message,
int messageId, int retryCount) {
+ if (peerHandle == null) {
+ throw new IllegalArgumentException(
+ "sendMessage: invalid peerHandle - must be non-null");
+ }
+
if (VDBG) {
Log.v(TAG, "sendMessage(): clientId=" + clientId + ", sessionId=" + sessionId
- + ", peerHandle=" + peerHandle + ", messageId=" + messageId + ", retryCount="
- + retryCount);
+ + ", peerHandle=" + ((OpaquePeerHandle) peerHandle).peerId + ", messageId="
+ + messageId + ", retryCount=" + retryCount);
}
try {
- mService.sendMessage(clientId, sessionId, (Integer) peerHandle, message, messageId,
- retryCount);
+ mService.sendMessage(clientId, sessionId, ((OpaquePeerHandle) peerHandle).peerId,
+ message, messageId, retryCount);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -499,7 +504,8 @@
byte[] token) {
if (VDBG) {
Log.v(TAG, "createNetworkSpecifier: role=" + role + ", sessionId=" + sessionId
- + ", peerHandle=" + peerHandle + ", token=" + token);
+ + ", peerHandle=" + ((peerHandle == null) ? peerHandle
+ : ((OpaquePeerHandle) peerHandle).peerId) + ", token=" + token);
}
int type;
@@ -539,7 +545,7 @@
json.put(NETWORK_SPECIFIER_KEY_CLIENT_ID, clientId);
json.put(NETWORK_SPECIFIER_KEY_SESSION_ID, sessionId);
if (peerHandle != null) {
- json.put(NETWORK_SPECIFIER_KEY_PEER_ID, (Integer) peerHandle);
+ json.put(NETWORK_SPECIFIER_KEY_PEER_ID, ((OpaquePeerHandle) peerHandle).peerId);
}
if (token != null) {
json.put(NETWORK_SPECIFIER_KEY_TOKEN,
@@ -844,7 +850,7 @@
break;
case CALLBACK_MATCH:
mOriginalCallback.onServiceDiscovered(
- Integer.valueOf(msg.arg1),
+ new OpaquePeerHandle(msg.arg1),
msg.getData().getByteArray(MESSAGE_BUNDLE_KEY_MESSAGE),
msg.getData().getByteArray(MESSAGE_BUNDLE_KEY_MESSAGE2));
break;
@@ -855,7 +861,7 @@
mOriginalCallback.onMessageSendFailed(msg.arg1);
break;
case CALLBACK_MESSAGE_RECEIVED:
- mOriginalCallback.onMessageReceived(Integer.valueOf(msg.arg1),
+ mOriginalCallback.onMessageReceived(new OpaquePeerHandle(msg.arg1),
(byte[]) msg.obj);
break;
}
@@ -986,4 +992,13 @@
mOriginalCallback.onSessionTerminated(reason);
}
}
+
+ /** @hide */
+ public static class OpaquePeerHandle {
+ public OpaquePeerHandle(int peerId) {
+ this.peerId = peerId;
+ }
+
+ public int peerId;
+ }
}