diff --git a/apps/BuildWidget/src/com/android/buildwidget/BuildWidget.java b/apps/BuildWidget/src/com/android/buildwidget/BuildWidget.java index bd2db0bec..676531a30 100644 --- a/apps/BuildWidget/src/com/android/buildwidget/BuildWidget.java +++ b/apps/BuildWidget/src/com/android/buildwidget/BuildWidget.java @@ -27,7 +27,6 @@ import android.content.res.Resources; import android.net.Uri; import android.os.IBinder; import android.text.format.DateUtils; -import android.text.format.Time; import android.util.Log; import android.widget.RemoteViews; diff --git a/apps/Development/src/com/android/development/Connectivity.java b/apps/Development/src/com/android/development/Connectivity.java index 3e674b379..664961046 100644 --- a/apps/Development/src/com/android/development/Connectivity.java +++ b/apps/Development/src/com/android/development/Connectivity.java @@ -36,7 +36,6 @@ import android.net.NetworkRequest; import android.net.NetworkUtils; import android.net.RouteInfo; import android.net.wifi.ScanResult; -import android.net.wifi.WifiActivityEnergyInfo; import android.net.wifi.WifiManager; import android.os.RemoteException; import android.os.Handler; @@ -50,6 +49,7 @@ import android.os.ServiceManager; import android.os.SystemClock; import android.provider.Settings; import android.os.Bundle; +import android.os.connectivity.WifiActivityEnergyInfo; import android.text.TextUtils; import android.util.Log; import android.view.IWindowManager; @@ -699,13 +699,13 @@ public class Connectivity extends Activity { private void onLinkStats() { Log.e(TAG, "LINK STATS: "); try { - WifiActivityEnergyInfo info = - mWm.getControllerActivityEnergyInfo(); - if (info != null) { - mLinkStatsResults.setText(" power " + info.toString()); - } else { - mLinkStatsResults.setText(" null! "); - } + mWm.getWifiActivityEnergyInfoAsync(getMainExecutor(), info -> { + if (info != null) { + mLinkStatsResults.setText(" power " + info.toString()); + } else { + mLinkStatsResults.setText(" null! "); + } + }); } catch (Exception e) { mLinkStatsResults.setText(" failed! " + e.toString()); } diff --git a/apps/Fallback/res/values-af/strings.xml b/apps/Fallback/res/values-af/strings.xml index 8cf16a7fc..f349e9991 100644 --- a/apps/Fallback/res/values-af/strings.xml +++ b/apps/Fallback/res/values-af/strings.xml @@ -16,7 +16,7 @@ - "Terugval" - "Nie-ondersteunde handeling" - "Hierdie handeling word tans nie ondersteun nie." + "Terugval" + "Nie-ondersteunde handeling" + "Hierdie handeling word tans nie ondersteun nie." diff --git a/apps/Fallback/res/values-am/strings.xml b/apps/Fallback/res/values-am/strings.xml index 34a35649c..f897488da 100644 --- a/apps/Fallback/res/values-am/strings.xml +++ b/apps/Fallback/res/values-am/strings.xml @@ -16,7 +16,7 @@ - "Fallback" - "የማይደገፍ ድርጊት" - "ድርጊቱ በአሁኑ ጊዜ የማይደገፍ ነው።" + "Fallback" + "የማይደገፍ ድርጊት" + "ድርጊቱ በአሁኑ ጊዜ የማይደገፍ ነው።" diff --git a/apps/Fallback/res/values-ar/strings.xml b/apps/Fallback/res/values-ar/strings.xml index a695d8c85..9d56d8f47 100644 --- a/apps/Fallback/res/values-ar/strings.xml +++ b/apps/Fallback/res/values-ar/strings.xml @@ -16,7 +16,7 @@ - "Fallback" - "إجراء غير متاح" - "هذا الإجراء غير متاح حاليًا." + "Fallback" + "إجراء غير متاح" + "هذا الإجراء غير متاح حاليًا." diff --git a/apps/Fallback/res/values-as/strings.xml b/apps/Fallback/res/values-as/strings.xml index 42ef47e39..2a85410f6 100644 --- a/apps/Fallback/res/values-as/strings.xml +++ b/apps/Fallback/res/values-as/strings.xml @@ -16,7 +16,7 @@ - "ফলবেক" - "এই কাৰ্যটো কৰিব নোৱাৰি" - "বৰ্তমান সেই কাৰ্যটো কৰিব নোৱাৰি" + "ফলবেক" + "এই কাৰ্যটো কৰিব নোৱাৰি" + "বৰ্তমান সেই কাৰ্যটো কৰিব নোৱাৰি" diff --git a/apps/Fallback/res/values-az/strings.xml b/apps/Fallback/res/values-az/strings.xml index 8e1956a3c..11baf2166 100644 --- a/apps/Fallback/res/values-az/strings.xml +++ b/apps/Fallback/res/values-az/strings.xml @@ -16,7 +16,7 @@ - "Son çarə" - "Dəstəklənməyən fəaliyyət" - "Bu fəaliyyət hazırda dəstəklənmir." + "Son çarə" + "Dəstəklənməyən fəaliyyət" + "Bu fəaliyyət hazırda dəstəklənmir." diff --git a/apps/Fallback/res/values-b+sr+Latn/strings.xml b/apps/Fallback/res/values-b+sr+Latn/strings.xml index 04174bd80..fb4d63fc1 100644 --- a/apps/Fallback/res/values-b+sr+Latn/strings.xml +++ b/apps/Fallback/res/values-b+sr+Latn/strings.xml @@ -16,7 +16,7 @@ - "Zamenska aplikacija" - "Nepodržana radnja" - "Ta radnja trenutno nije podržana." + "Zamenska aplikacija" + "Nepodržana radnja" + "Ta radnja trenutno nije podržana." diff --git a/apps/Fallback/res/values-be/strings.xml b/apps/Fallback/res/values-be/strings.xml index d59ae53ef..7d34729ae 100644 --- a/apps/Fallback/res/values-be/strings.xml +++ b/apps/Fallback/res/values-be/strings.xml @@ -16,7 +16,7 @@ - "Дапаможны" - "Дзеянні, якія не падрымліваюцца" - "Гэтае дзеянне зараз не падтрымліваецца." + "Дапаможны" + "Дзеянні, якія не падрымліваюцца" + "Гэтае дзеянне зараз не падтрымліваецца." diff --git a/apps/Fallback/res/values-bg/strings.xml b/apps/Fallback/res/values-bg/strings.xml index 2aaded28a..b480794ba 100644 --- a/apps/Fallback/res/values-bg/strings.xml +++ b/apps/Fallback/res/values-bg/strings.xml @@ -16,7 +16,7 @@ - "Fallback" - "Неподдържано действие" - "Понастоящем това действие не се поддържа." + "Fallback" + "Неподдържано действие" + "Понастоящем това действие не се поддържа." diff --git a/apps/Fallback/res/values-bn/strings.xml b/apps/Fallback/res/values-bn/strings.xml index 67979add7..914277b06 100644 --- a/apps/Fallback/res/values-bn/strings.xml +++ b/apps/Fallback/res/values-bn/strings.xml @@ -16,7 +16,7 @@ - "ফলব্যাক" - "অসমর্থিত ক্রিয়া" - "এই ক্রিয়াটি বর্তমানে সমর্থিত নয়৷" + "ফলব্যাক" + "অসমর্থিত ক্রিয়া" + "এই ক্রিয়াটি বর্তমানে সমর্থিত নয়৷" diff --git a/apps/Fallback/res/values-bs/strings.xml b/apps/Fallback/res/values-bs/strings.xml index 69a7c09b7..4f4489dac 100644 --- a/apps/Fallback/res/values-bs/strings.xml +++ b/apps/Fallback/res/values-bs/strings.xml @@ -16,7 +16,7 @@ - "Rezerva" - "Nepodržana akcija" - "Ta akcija trenutno nije podržana." + "Rezerva" + "Nepodržana akcija" + "Ta akcija trenutno nije podržana." diff --git a/apps/Fallback/res/values-ca/strings.xml b/apps/Fallback/res/values-ca/strings.xml index c17ae77d0..56f662825 100644 --- a/apps/Fallback/res/values-ca/strings.xml +++ b/apps/Fallback/res/values-ca/strings.xml @@ -16,7 +16,7 @@ - "Fallback" - "Acció no compatible" - "Aquesta acció no és compatible actualment." + "Fallback" + "Acció no compatible" + "Aquesta acció no és compatible actualment." diff --git a/apps/Fallback/res/values-cs/strings.xml b/apps/Fallback/res/values-cs/strings.xml index 11abf1089..d5a9884e8 100644 --- a/apps/Fallback/res/values-cs/strings.xml +++ b/apps/Fallback/res/values-cs/strings.xml @@ -16,7 +16,7 @@ - "Záloha" - "Akce není podporována" - "Tato akce není momentálně podporována." + "Záloha" + "Akce není podporována" + "Tato akce není momentálně podporována." diff --git a/apps/Fallback/res/values-da/strings.xml b/apps/Fallback/res/values-da/strings.xml index a6fabeee9..73f7912d8 100644 --- a/apps/Fallback/res/values-da/strings.xml +++ b/apps/Fallback/res/values-da/strings.xml @@ -16,7 +16,7 @@ - "Reserve" - "Handlingen understøttes ikke" - "Handlingen understøttes ikke i øjeblikket." + "Reserve" + "Handlingen understøttes ikke" + "Handlingen understøttes ikke i øjeblikket." diff --git a/apps/Fallback/res/values-de/strings.xml b/apps/Fallback/res/values-de/strings.xml index 20fc4bde1..4b0e589e0 100644 --- a/apps/Fallback/res/values-de/strings.xml +++ b/apps/Fallback/res/values-de/strings.xml @@ -16,7 +16,7 @@ - "Fallback" - "Nicht unterstützte Aktion" - "Diese Aktion wird zurzeit nicht unterstützt." + "Fallback" + "Nicht unterstützte Aktion" + "Diese Aktion wird zurzeit nicht unterstützt." diff --git a/apps/Fallback/res/values-el/strings.xml b/apps/Fallback/res/values-el/strings.xml index 5c2d75462..f99d199a1 100644 --- a/apps/Fallback/res/values-el/strings.xml +++ b/apps/Fallback/res/values-el/strings.xml @@ -16,7 +16,7 @@ - "Εναλλακτική" - "Ενέργεια που δεν υποστηρίζεται" - "Αυτή η ενέργεια δεν υποστηρίζεται αυτήν τη στιγμή." + "Εναλλακτική" + "Ενέργεια που δεν υποστηρίζεται" + "Αυτή η ενέργεια δεν υποστηρίζεται αυτήν τη στιγμή." diff --git a/apps/Fallback/res/values-en-rAU/strings.xml b/apps/Fallback/res/values-en-rAU/strings.xml index a7c82cba2..1e75ac9c7 100644 --- a/apps/Fallback/res/values-en-rAU/strings.xml +++ b/apps/Fallback/res/values-en-rAU/strings.xml @@ -16,7 +16,7 @@ - "Fallback" - "Unsupported action" - "That action is not currently supported." + "Fallback" + "Unsupported action" + "That action is not currently supported." diff --git a/apps/Fallback/res/values-en-rCA/strings.xml b/apps/Fallback/res/values-en-rCA/strings.xml index a7c82cba2..1e75ac9c7 100644 --- a/apps/Fallback/res/values-en-rCA/strings.xml +++ b/apps/Fallback/res/values-en-rCA/strings.xml @@ -16,7 +16,7 @@ - "Fallback" - "Unsupported action" - "That action is not currently supported." + "Fallback" + "Unsupported action" + "That action is not currently supported." diff --git a/apps/Fallback/res/values-en-rGB/strings.xml b/apps/Fallback/res/values-en-rGB/strings.xml index a7c82cba2..1e75ac9c7 100644 --- a/apps/Fallback/res/values-en-rGB/strings.xml +++ b/apps/Fallback/res/values-en-rGB/strings.xml @@ -16,7 +16,7 @@ - "Fallback" - "Unsupported action" - "That action is not currently supported." + "Fallback" + "Unsupported action" + "That action is not currently supported." diff --git a/apps/Fallback/res/values-en-rIN/strings.xml b/apps/Fallback/res/values-en-rIN/strings.xml index a7c82cba2..1e75ac9c7 100644 --- a/apps/Fallback/res/values-en-rIN/strings.xml +++ b/apps/Fallback/res/values-en-rIN/strings.xml @@ -16,7 +16,7 @@ - "Fallback" - "Unsupported action" - "That action is not currently supported." + "Fallback" + "Unsupported action" + "That action is not currently supported." diff --git a/apps/Fallback/res/values-en-rXC/strings.xml b/apps/Fallback/res/values-en-rXC/strings.xml index 121fe541a..1d64859f4 100644 --- a/apps/Fallback/res/values-en-rXC/strings.xml +++ b/apps/Fallback/res/values-en-rXC/strings.xml @@ -16,7 +16,7 @@ - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‎‏‏‏‏‏‏‎‏‎‏‎‎‎‏‏‏‏‎‏‎‏‏‏‎‎‎‏‏‎‎‎‏‎‏‎‏‎‏‎‎‎‏‏‎‎‏‏‏‎‎‏‏‏‏‏‎‏‏‏‏‎‏‏‏‏‏‎‎Fallback‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‏‏‏‎‏‎‎‎‏‎‎‎‎‎‎‎‏‏‎‎‏‎‎‏‏‎‏‏‏‏‏‎‎‏‏‎‏‎‎‎‎‏‎‏‎‎‎‎‎Unsupported action‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‏‎‏‏‎‏‎‏‏‎‎‎‎‎‏‎‏‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‎‏‎‎‎‎‎‏‏‏‎‏‎‏‎‏‏‎‏‎‎‏‏‏‏‏‏‏‏‎‏‎That action is not currently supported.‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‎‎‏‏‏‎‎‎‏‎‎‏‎‏‏‏‏‏‏‏‏‎‏‏‏‎‏‎‏‎‏‎‎‏‎‏‎‏‎‏‎‎‎‏‎‎‎‏‎Fallback‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‏‎‎‎‏‏‎‎‏‎‏‏‎‏‏‎‎‏‏‎‎‎‏‎‎‎‏‏‏‎‏‏‏‎‎‎‎‎‎‎‎‎‎‎‎‏‏‎‎‎‎‎‏‏‏‎‎‎Unsupported action‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‏‎‏‎‎‏‏‎‏‎‎‏‏‏‎‏‎‎‎‎‎‏‎‏‏‎‏‏‏‎‎‎‏‎‎‏‏‏‏‎‏‎‎‎‎‏‏‏‎‏‏‏‏‎‏‎That action is not currently supported.‎‏‎‎‏‎" diff --git a/apps/Fallback/res/values-es-rUS/strings.xml b/apps/Fallback/res/values-es-rUS/strings.xml index 8aef2bbf8..a308caf3c 100644 --- a/apps/Fallback/res/values-es-rUS/strings.xml +++ b/apps/Fallback/res/values-es-rUS/strings.xml @@ -16,7 +16,7 @@ - "Fallback" - "Acción no admitida" - "Esa acción no se admite actualmente." + "Fallback" + "Acción no admitida" + "Esa acción no se admite actualmente." diff --git a/apps/Fallback/res/values-es/strings.xml b/apps/Fallback/res/values-es/strings.xml index 8aef2bbf8..a308caf3c 100644 --- a/apps/Fallback/res/values-es/strings.xml +++ b/apps/Fallback/res/values-es/strings.xml @@ -16,7 +16,7 @@ - "Fallback" - "Acción no admitida" - "Esa acción no se admite actualmente." + "Fallback" + "Acción no admitida" + "Esa acción no se admite actualmente." diff --git a/apps/Fallback/res/values-et/strings.xml b/apps/Fallback/res/values-et/strings.xml index 181b324ec..1388a5394 100644 --- a/apps/Fallback/res/values-et/strings.xml +++ b/apps/Fallback/res/values-et/strings.xml @@ -16,7 +16,7 @@ - "Taandepilt" - "Toetuseta toiming" - "Seda toimingut praegu ei toetata." + "Taandepilt" + "Toetuseta toiming" + "Seda toimingut praegu ei toetata." diff --git a/apps/Fallback/res/values-eu/strings.xml b/apps/Fallback/res/values-eu/strings.xml index 7cd09f41e..c4b7abc43 100644 --- a/apps/Fallback/res/values-eu/strings.xml +++ b/apps/Fallback/res/values-eu/strings.xml @@ -16,7 +16,7 @@ - "Ordezkoa" - "Ekintza onartezina" - "Une honetan ez da ekintza hori onartzen." + "Ordezkoa" + "Ekintza onartezina" + "Une honetan ez da ekintza hori onartzen." diff --git a/apps/Fallback/res/values-fa/strings.xml b/apps/Fallback/res/values-fa/strings.xml index 7c0256bea..cb744e78a 100644 --- a/apps/Fallback/res/values-fa/strings.xml +++ b/apps/Fallback/res/values-fa/strings.xml @@ -16,7 +16,7 @@ - "بازگشت" - "عملکرد پشتیبانی نشده" - "آن عملکرد در حال حاضر پشتیبانی نمی‌شود." + "بازگشت" + "عملکرد پشتیبانی نشده" + "آن عملکرد در حال حاضر پشتیبانی نمی‌شود." diff --git a/apps/Fallback/res/values-fi/strings.xml b/apps/Fallback/res/values-fi/strings.xml index 124eb737f..8fb57fea3 100644 --- a/apps/Fallback/res/values-fi/strings.xml +++ b/apps/Fallback/res/values-fi/strings.xml @@ -16,7 +16,7 @@ - "Fallback" - "Toiminto ei ole tuettu" - "Toiminto ei ole tuettu tällä hetkellä." + "Fallback" + "Toiminto ei ole tuettu" + "Toiminto ei ole tuettu tällä hetkellä." diff --git a/apps/Fallback/res/values-fr-rCA/strings.xml b/apps/Fallback/res/values-fr-rCA/strings.xml index a751b97ff..9ffad30cf 100644 --- a/apps/Fallback/res/values-fr-rCA/strings.xml +++ b/apps/Fallback/res/values-fr-rCA/strings.xml @@ -16,7 +16,7 @@ - "Application de secours" - "Action non prise en charge" - "Cette action n\'est actuellement pas prise en charge." + "Application de secours" + "Action non prise en charge" + "Cette action n\'est actuellement pas prise en charge." diff --git a/apps/Fallback/res/values-fr/strings.xml b/apps/Fallback/res/values-fr/strings.xml index a751b97ff..9ffad30cf 100644 --- a/apps/Fallback/res/values-fr/strings.xml +++ b/apps/Fallback/res/values-fr/strings.xml @@ -16,7 +16,7 @@ - "Application de secours" - "Action non prise en charge" - "Cette action n\'est actuellement pas prise en charge." + "Application de secours" + "Action non prise en charge" + "Cette action n\'est actuellement pas prise en charge." diff --git a/apps/Fallback/res/values-gl/strings.xml b/apps/Fallback/res/values-gl/strings.xml index 4887636a8..77e0fe8fa 100644 --- a/apps/Fallback/res/values-gl/strings.xml +++ b/apps/Fallback/res/values-gl/strings.xml @@ -16,7 +16,7 @@ - "Fallback" - "Acción non admitida" - "Actualmente non se admite esa acción." + "Fallback" + "Acción non admitida" + "Actualmente non se admite esa acción." diff --git a/apps/Fallback/res/values-gu/strings.xml b/apps/Fallback/res/values-gu/strings.xml index 486a94f43..0c385d9bd 100644 --- a/apps/Fallback/res/values-gu/strings.xml +++ b/apps/Fallback/res/values-gu/strings.xml @@ -16,7 +16,7 @@ - "Fallback" - "અસમર્થિત ક્રિયા" - "તે ક્રિયા વર્તમાનમાં સમર્થિત નથી." + "Fallback" + "અસમર્થિત ક્રિયા" + "તે ક્રિયા વર્તમાનમાં સમર્થિત નથી." diff --git a/apps/Fallback/res/values-hi/strings.xml b/apps/Fallback/res/values-hi/strings.xml index 6d93766fc..179299ea8 100644 --- a/apps/Fallback/res/values-hi/strings.xml +++ b/apps/Fallback/res/values-hi/strings.xml @@ -16,7 +16,7 @@ - "Fallback" - "यह कार्रवाई नहीं हो सकती" - "यह कार्रवाई अभी नहीं हो सकती" + "Fallback" + "यह कार्रवाई नहीं हो सकती" + "यह कार्रवाई अभी नहीं हो सकती" diff --git a/apps/Fallback/res/values-hr/strings.xml b/apps/Fallback/res/values-hr/strings.xml index 6b8fdc307..f73535658 100644 --- a/apps/Fallback/res/values-hr/strings.xml +++ b/apps/Fallback/res/values-hr/strings.xml @@ -16,7 +16,7 @@ - "Pričuvna aplikacija" - "Nepodržana radnja" - "Ova radnja trenutno nije podržana." + "Pričuvna aplikacija" + "Nepodržana radnja" + "Ova radnja trenutno nije podržana." diff --git a/apps/Fallback/res/values-hu/strings.xml b/apps/Fallback/res/values-hu/strings.xml index 4c9ede60a..1e53f05bd 100644 --- a/apps/Fallback/res/values-hu/strings.xml +++ b/apps/Fallback/res/values-hu/strings.xml @@ -16,7 +16,7 @@ - "Tartalék" - "Nem támogatott művelet" - "Ez a művelet jelenleg nem támogatott." + "Tartalék" + "Nem támogatott művelet" + "Ez a művelet jelenleg nem támogatott." diff --git a/apps/Fallback/res/values-hy/strings.xml b/apps/Fallback/res/values-hy/strings.xml index 1547741ec..fe6960fbc 100644 --- a/apps/Fallback/res/values-hy/strings.xml +++ b/apps/Fallback/res/values-hy/strings.xml @@ -16,7 +16,7 @@ - "Fallback" - "Չաջակցվող գործողություն" - "Այդ գործողությունն այժմ չի աջակցվում:" + "Fallback" + "Չաջակցվող գործողություն" + "Այդ գործողությունն այժմ չի աջակցվում:" diff --git a/apps/Fallback/res/values-in/strings.xml b/apps/Fallback/res/values-in/strings.xml index 0bfaf1657..08dc789df 100644 --- a/apps/Fallback/res/values-in/strings.xml +++ b/apps/Fallback/res/values-in/strings.xml @@ -16,7 +16,7 @@ - "Fallback" - "Tindakan yang tidak didukung" - "Saat ini tindakan tersebut tidak didukung." + "Pengganti" + "Tindakan yang tidak didukung" + "Saat ini tindakan tersebut tidak didukung." diff --git a/apps/Fallback/res/values-is/strings.xml b/apps/Fallback/res/values-is/strings.xml index 852d12af9..0dab1bea6 100644 --- a/apps/Fallback/res/values-is/strings.xml +++ b/apps/Fallback/res/values-is/strings.xml @@ -16,7 +16,7 @@ - "Fallback" - "Aðgerð ekki studd" - "Þessi aðgerð er ekki studd sem stendur." + "Fallback" + "Aðgerð ekki studd" + "Þessi aðgerð er ekki studd sem stendur." diff --git a/apps/Fallback/res/values-it/strings.xml b/apps/Fallback/res/values-it/strings.xml index 797151a82..56287305e 100644 --- a/apps/Fallback/res/values-it/strings.xml +++ b/apps/Fallback/res/values-it/strings.xml @@ -16,7 +16,7 @@ - "Fallback" - "Azione non supportata" - "L\'azione non è al momento supportata." + "Fallback" + "Azione non supportata" + "L\'azione non è al momento supportata." diff --git a/apps/Fallback/res/values-iw/strings.xml b/apps/Fallback/res/values-iw/strings.xml index cbf35ef89..6e21d6f9f 100644 --- a/apps/Fallback/res/values-iw/strings.xml +++ b/apps/Fallback/res/values-iw/strings.xml @@ -16,7 +16,7 @@ - "חלופי" - "פעולה לא נתמכת" - "הפעולה אינה נתמכת בשלב זה." + "חלופי" + "פעולה לא נתמכת" + "הפעולה אינה נתמכת בשלב זה." diff --git a/apps/Fallback/res/values-ja/strings.xml b/apps/Fallback/res/values-ja/strings.xml index 4275289b8..e167efdf0 100644 --- a/apps/Fallback/res/values-ja/strings.xml +++ b/apps/Fallback/res/values-ja/strings.xml @@ -16,7 +16,7 @@ - "Fallback" - "サポートされていない操作" - "現在サポートされていない操作です。" + "Fallback" + "サポートされていない操作" + "現在サポートされていない操作です。" diff --git a/apps/Fallback/res/values-ka/strings.xml b/apps/Fallback/res/values-ka/strings.xml index 469a13507..1debea185 100644 --- a/apps/Fallback/res/values-ka/strings.xml +++ b/apps/Fallback/res/values-ka/strings.xml @@ -16,7 +16,7 @@ - "შემოვლით რეჟიმში გადასვლა" - "მოქმედება მხარდაჭერილი არ არის" - "ეს მოქმედება ამჟამად მხარდაუჭერელია." + "შემოვლით რეჟიმში გადასვლა" + "მოქმედება მხარდაჭერილი არ არის" + "ეს მოქმედება ამჟამად მხარდაუჭერელია." diff --git a/apps/Fallback/res/values-kk/strings.xml b/apps/Fallback/res/values-kk/strings.xml index 156074166..7aed9f59c 100644 --- a/apps/Fallback/res/values-kk/strings.xml +++ b/apps/Fallback/res/values-kk/strings.xml @@ -16,7 +16,7 @@ - "Резервтік күй" - "Әрекетке қолдау көрсетілмейді" - "Бұл әрекетке қазірше қолдау көрсетілмейді." + "Резервтік күй" + "Әрекетке қолдау көрсетілмейді" + "Бұл әрекетке қазірше қолдау көрсетілмейді." diff --git a/apps/Fallback/res/values-km/strings.xml b/apps/Fallback/res/values-km/strings.xml index a44233598..e81bf4b3f 100644 --- a/apps/Fallback/res/values-km/strings.xml +++ b/apps/Fallback/res/values-km/strings.xml @@ -16,7 +16,7 @@ - "Fallback" - "សកម្មភាព​មិន​បាន​គាំទ្រ" - "បច្ចុប្បន្ន​សកម្មភាព​នោះ​មិន​ត្រូវ​បាន​គាំទ្រ​ទេ។" + "Fallback" + "សកម្មភាព​មិន​បាន​គាំទ្រ" + "បច្ចុប្បន្ន​សកម្មភាព​នោះ​មិន​ត្រូវ​បាន​គាំទ្រ​ទេ។" diff --git a/apps/Fallback/res/values-kn/strings.xml b/apps/Fallback/res/values-kn/strings.xml index f4f8e1c41..a36265575 100644 --- a/apps/Fallback/res/values-kn/strings.xml +++ b/apps/Fallback/res/values-kn/strings.xml @@ -16,7 +16,7 @@ - "Fallback" - "ಬೆಂಬಲವಿಲ್ಲದಿರುವ ಕ್ರಮ" - "ಆ ಕ್ರಮವನ್ನು ಪ್ರಸ್ತುತ ಬೆಂಬಲಿಸುತ್ತಿಲ್ಲ." + "Fallback" + "ಬೆಂಬಲವಿಲ್ಲದಿರುವ ಕ್ರಮ" + "ಆ ಕ್ರಮವನ್ನು ಪ್ರಸ್ತುತ ಬೆಂಬಲಿಸುತ್ತಿಲ್ಲ." diff --git a/apps/Fallback/res/values-ko/strings.xml b/apps/Fallback/res/values-ko/strings.xml index 83342cf75..ccaa0e274 100644 --- a/apps/Fallback/res/values-ko/strings.xml +++ b/apps/Fallback/res/values-ko/strings.xml @@ -16,7 +16,7 @@ - "폴백" - "지원되지 않는 작업" - "이 작업은 현재 지원되지 않습니다." + "폴백" + "지원되지 않는 작업" + "이 작업은 현재 지원되지 않습니다." diff --git a/apps/Fallback/res/values-ky/strings.xml b/apps/Fallback/res/values-ky/strings.xml index c65404ee9..ebf05e4e6 100644 --- a/apps/Fallback/res/values-ky/strings.xml +++ b/apps/Fallback/res/values-ky/strings.xml @@ -16,7 +16,7 @@ - "Fallback" - "Аракет колдоого алынбайт" - "Учурда мындай аракет колдоого алынбайт." + "Fallback" + "Аракет колдоого алынбайт" + "Учурда мындай аракет колдоого алынбайт." diff --git a/apps/Fallback/res/values-lo/strings.xml b/apps/Fallback/res/values-lo/strings.xml index 948b60f26..028ebcc6c 100644 --- a/apps/Fallback/res/values-lo/strings.xml +++ b/apps/Fallback/res/values-lo/strings.xml @@ -16,7 +16,7 @@ - "Fallback" - "ການເຮັດວຽກທີ່ບໍ່ຮອງຮັບ" - "ການເຮັດວຽກນັ້ນຍັງບໍ່ຮອງຮັບເທື່ອ" + "Fallback" + "ການເຮັດວຽກທີ່ບໍ່ຮອງຮັບ" + "ການເຮັດວຽກນັ້ນຍັງບໍ່ຮອງຮັບເທື່ອ" diff --git a/apps/Fallback/res/values-lt/strings.xml b/apps/Fallback/res/values-lt/strings.xml index c715f42a0..1ae4161f1 100644 --- a/apps/Fallback/res/values-lt/strings.xml +++ b/apps/Fallback/res/values-lt/strings.xml @@ -16,7 +16,7 @@ - "Fallback" - "Nepalaikomas veiksmas" - "Šis veiksmas šiuo metu nepalaikomas." + "Fallback" + "Nepalaikomas veiksmas" + "Šis veiksmas šiuo metu nepalaikomas." diff --git a/apps/Fallback/res/values-lv/strings.xml b/apps/Fallback/res/values-lv/strings.xml index 63b338471..ec084550a 100644 --- a/apps/Fallback/res/values-lv/strings.xml +++ b/apps/Fallback/res/values-lv/strings.xml @@ -16,7 +16,7 @@ - "Atkāpšanās" - "Darbība netiek atbalstīta" - "Šī darbība pašlaik netiek atbalstīta." + "Atkāpšanās" + "Darbība netiek atbalstīta" + "Šī darbība pašlaik netiek atbalstīta." diff --git a/apps/Fallback/res/values-mk/strings.xml b/apps/Fallback/res/values-mk/strings.xml index c8046b562..4ee511cf0 100644 --- a/apps/Fallback/res/values-mk/strings.xml +++ b/apps/Fallback/res/values-mk/strings.xml @@ -16,7 +16,7 @@ - "Резервен план" - "Неподдржано дејство" - "Тоа дејство не е поддржано во моментов." + "Резервен план" + "Неподдржано дејство" + "Тоа дејство не е поддржано во моментов." diff --git a/apps/Fallback/res/values-ml/strings.xml b/apps/Fallback/res/values-ml/strings.xml index 0161ee507..154ff71a6 100644 --- a/apps/Fallback/res/values-ml/strings.xml +++ b/apps/Fallback/res/values-ml/strings.xml @@ -16,7 +16,7 @@ - "ഫാൾബാക്ക്" - "പിന്തുണയ്‌ക്കാത്ത പ്രവർത്തനം" - "ആ പ്രവർത്തനം നിലവിൽ പിന്തുണയ്‌ക്കുന്നില്ല." + "ഫാൾബാക്ക്" + "പിന്തുണയ്‌ക്കാത്ത പ്രവർത്തനം" + "ആ പ്രവർത്തനം നിലവിൽ പിന്തുണയ്‌ക്കുന്നില്ല." diff --git a/apps/Fallback/res/values-mn/strings.xml b/apps/Fallback/res/values-mn/strings.xml index 8cb38705a..7c046ede1 100644 --- a/apps/Fallback/res/values-mn/strings.xml +++ b/apps/Fallback/res/values-mn/strings.xml @@ -16,7 +16,7 @@ - "Fallback" - "Дэмжигдээгүй үйлдэл" - "Энэ үйлдэл одоогоор дэмжигдээгүй." + "Fallback" + "Дэмжигдээгүй үйлдэл" + "Энэ үйлдэл одоогоор дэмжигдээгүй." diff --git a/apps/Fallback/res/values-mr/strings.xml b/apps/Fallback/res/values-mr/strings.xml index 525a71d69..6e3f811d4 100644 --- a/apps/Fallback/res/values-mr/strings.xml +++ b/apps/Fallback/res/values-mr/strings.xml @@ -16,7 +16,7 @@ - "फॉलबॅक" - "असमर्थित क्रिया" - "ती क्रिया सध्या समर्थित नाही." + "फॉलबॅक" + "असमर्थित क्रिया" + "ती क्रिया सध्या समर्थित नाही." diff --git a/apps/Fallback/res/values-ms/strings.xml b/apps/Fallback/res/values-ms/strings.xml index 930fe79f1..8ae4741c8 100644 --- a/apps/Fallback/res/values-ms/strings.xml +++ b/apps/Fallback/res/values-ms/strings.xml @@ -16,7 +16,7 @@ - "Jatuh balik" - "Tindakan tidak disokong" - "Tindakan tidak disokong pada masa ini." + "Jatuh balik" + "Tindakan tidak disokong" + "Tindakan tidak disokong pada masa ini." diff --git a/apps/Fallback/res/values-my/strings.xml b/apps/Fallback/res/values-my/strings.xml index ce22ef5f3..3e7057dd8 100644 --- a/apps/Fallback/res/values-my/strings.xml +++ b/apps/Fallback/res/values-my/strings.xml @@ -16,7 +16,7 @@ - "နောက်ပြန်ဆုတ်" - "ပံ့ပိုးမထားသော လုပ်ဆောင်ချက်" - "ထို လုပ်ဆောင်ချက်ကို ပံ့ပိုးမထား" + "နောက်ပြန်ဆုတ်" + "ပံ့ပိုးမထားသော လုပ်ဆောင်ချက်" + "ထို လုပ်ဆောင်ချက်ကို ပံ့ပိုးမထား" diff --git a/apps/Fallback/res/values-nb/strings.xml b/apps/Fallback/res/values-nb/strings.xml index e3dcfc0a5..03d33accb 100644 --- a/apps/Fallback/res/values-nb/strings.xml +++ b/apps/Fallback/res/values-nb/strings.xml @@ -16,7 +16,7 @@ - "Fallback" - "Ustøttet handling" - "Denne handlingen er ikke støttet nå." + "Fallback" + "Ustøttet handling" + "Denne handlingen er ikke støttet nå." diff --git a/apps/Fallback/res/values-ne/strings.xml b/apps/Fallback/res/values-ne/strings.xml index 7d27effa3..251ece19b 100644 --- a/apps/Fallback/res/values-ne/strings.xml +++ b/apps/Fallback/res/values-ne/strings.xml @@ -16,7 +16,7 @@ - "Fallback" - "असमर्थित कार्य" - "यस कारवाही हाल समर्थित छैन।" + "Fallback" + "असमर्थित कार्य" + "यस कारवाही हाल समर्थित छैन।" diff --git a/apps/Fallback/res/values-nl/strings.xml b/apps/Fallback/res/values-nl/strings.xml index 357aaaf90..e56cee852 100644 --- a/apps/Fallback/res/values-nl/strings.xml +++ b/apps/Fallback/res/values-nl/strings.xml @@ -16,7 +16,7 @@ - "Reserve" - "Niet-ondersteunde actie" - "Die actie wordt momenteel niet ondersteund." + "Reserve" + "Niet-ondersteunde actie" + "Die actie wordt momenteel niet ondersteund." diff --git a/apps/Fallback/res/values-or/strings.xml b/apps/Fallback/res/values-or/strings.xml index d528ac475..442b03204 100644 --- a/apps/Fallback/res/values-or/strings.xml +++ b/apps/Fallback/res/values-or/strings.xml @@ -16,7 +16,7 @@ - "ଫଲବ୍ୟାକ୍‌" - "ସପୋର୍ଟ ହେଉ ନଥିବା କାର୍ଯ୍ୟ" - "ବର୍ତ୍ତମାନରେ ଏହି କାର୍ଯ୍ୟଟି କରିହେବ ନାହିଁ।" + "ଫଲବ୍ୟାକ୍‌" + "ସପୋର୍ଟ ହେଉ ନଥିବା କାର୍ଯ୍ୟ" + "ବର୍ତ୍ତମାନରେ ଏହି କାର୍ଯ୍ୟଟି କରିହେବ ନାହିଁ।" diff --git a/apps/Fallback/res/values-pa/strings.xml b/apps/Fallback/res/values-pa/strings.xml index 8b6c2502e..6e94cf6f9 100644 --- a/apps/Fallback/res/values-pa/strings.xml +++ b/apps/Fallback/res/values-pa/strings.xml @@ -16,7 +16,7 @@ - "ਪਿੱਛੇ ਜਾਓ" - "ਅਸਮਰਥਿਤ ਕਾਰਵਾਈ" - "ਉਹ ਕਾਰਵਾਈ ਇਸ ਵੇਲੇ ਸਮਰਥਿਤ ਨਹੀਂ ਹੈ।" + "ਪਿੱਛੇ ਜਾਓ" + "ਅਸਮਰਥਿਤ ਕਾਰਵਾਈ" + "ਉਹ ਕਾਰਵਾਈ ਇਸ ਵੇਲੇ ਸਮਰਥਿਤ ਨਹੀਂ ਹੈ।" diff --git a/apps/Fallback/res/values-pl/strings.xml b/apps/Fallback/res/values-pl/strings.xml index f0c6d1175..c43b6f61e 100644 --- a/apps/Fallback/res/values-pl/strings.xml +++ b/apps/Fallback/res/values-pl/strings.xml @@ -16,7 +16,7 @@ - "Wycofanie" - "Nieobsługiwana czynność" - "Ta czynność nie jest aktualnie obsługiwana." + "Wycofanie" + "Nieobsługiwana czynność" + "Ta czynność nie jest aktualnie obsługiwana." diff --git a/apps/Fallback/res/values-pt-rPT/strings.xml b/apps/Fallback/res/values-pt-rPT/strings.xml index aefc13491..90435a01d 100644 --- a/apps/Fallback/res/values-pt-rPT/strings.xml +++ b/apps/Fallback/res/values-pt-rPT/strings.xml @@ -16,7 +16,7 @@ - "Fallback" - "Acção não suportada" - "Esta ação ainda não é suportada." + "Fallback" + "Acção não suportada" + "Esta ação ainda não é suportada." diff --git a/apps/Fallback/res/values-pt/strings.xml b/apps/Fallback/res/values-pt/strings.xml index 79c298325..c9dbb46e8 100644 --- a/apps/Fallback/res/values-pt/strings.xml +++ b/apps/Fallback/res/values-pt/strings.xml @@ -16,7 +16,7 @@ - "Fallback" - "Ação não suportada" - "Essa ação não é suportada no momento." + "Fallback" + "Ação não suportada" + "Essa ação não é suportada no momento." diff --git a/apps/Fallback/res/values-ro/strings.xml b/apps/Fallback/res/values-ro/strings.xml index 9530a5134..9a8f55b8b 100644 --- a/apps/Fallback/res/values-ro/strings.xml +++ b/apps/Fallback/res/values-ro/strings.xml @@ -16,7 +16,7 @@ - "Alternativă" - "Acțiune neacceptată" - "Această acțiune nu este acceptată în prezent." + "Alternativă" + "Acțiune neacceptată" + "Această acțiune nu este acceptată în prezent." diff --git a/apps/Fallback/res/values-ru/strings.xml b/apps/Fallback/res/values-ru/strings.xml index 454c137a4..92579023c 100644 --- a/apps/Fallback/res/values-ru/strings.xml +++ b/apps/Fallback/res/values-ru/strings.xml @@ -16,7 +16,7 @@ - "Переход в обходной режим" - "Неподдерживаемое действие" - "В настоящее время это действие не поддерживается." + "Переход в обходной режим" + "Неподдерживаемое действие" + "В настоящее время это действие не поддерживается." diff --git a/apps/Fallback/res/values-si/strings.xml b/apps/Fallback/res/values-si/strings.xml index 8a7e7a5ee..43c80da28 100644 --- a/apps/Fallback/res/values-si/strings.xml +++ b/apps/Fallback/res/values-si/strings.xml @@ -16,7 +16,7 @@ - "පසු බැසීම" - "සහය නොදක්වන ක්‍රියාව" - "එම ක්‍රියාවට දැන් සහය නොදක්වයි." + "පසු බැසීම" + "සහය නොදක්වන ක්‍රියාව" + "එම ක්‍රියාවට දැන් සහය නොදක්වයි." diff --git a/apps/Fallback/res/values-sk/strings.xml b/apps/Fallback/res/values-sk/strings.xml index 97ad356ad..6ffa5d013 100644 --- a/apps/Fallback/res/values-sk/strings.xml +++ b/apps/Fallback/res/values-sk/strings.xml @@ -16,7 +16,7 @@ - "Záloha" - "Akcia nie je podporovaná" - "Táto akcia momentálne nie je podporovaná." + "Záloha" + "Akcia nie je podporovaná" + "Táto akcia momentálne nie je podporovaná." diff --git a/apps/Fallback/res/values-sl/strings.xml b/apps/Fallback/res/values-sl/strings.xml index 16f30ab9d..c23c30350 100644 --- a/apps/Fallback/res/values-sl/strings.xml +++ b/apps/Fallback/res/values-sl/strings.xml @@ -16,7 +16,7 @@ - "Nadomestna aplikacija" - "Dejanje ni podprto." - "To dejanje trenutno še ni podprto." + "Nadomestna aplikacija" + "Dejanje ni podprto." + "To dejanje trenutno še ni podprto." diff --git a/apps/Fallback/res/values-sq/strings.xml b/apps/Fallback/res/values-sq/strings.xml index 88ad3dacc..34164c678 100644 --- a/apps/Fallback/res/values-sq/strings.xml +++ b/apps/Fallback/res/values-sq/strings.xml @@ -16,7 +16,7 @@ - "Alternativa" - "Veprimi nuk mbështetet" - "Ai veprim nuk mbështetet." + "Alternativa" + "Veprimi nuk mbështetet" + "Ai veprim nuk mbështetet." diff --git a/apps/Fallback/res/values-sr/strings.xml b/apps/Fallback/res/values-sr/strings.xml index c58ba4fe6..def2274ec 100644 --- a/apps/Fallback/res/values-sr/strings.xml +++ b/apps/Fallback/res/values-sr/strings.xml @@ -16,7 +16,7 @@ - "Заменска апликација" - "Неподржана радња" - "Та радња тренутно није подржана." + "Заменска апликација" + "Неподржана радња" + "Та радња тренутно није подржана." diff --git a/apps/Fallback/res/values-sv/strings.xml b/apps/Fallback/res/values-sv/strings.xml index 4c61f13f7..4a3958355 100644 --- a/apps/Fallback/res/values-sv/strings.xml +++ b/apps/Fallback/res/values-sv/strings.xml @@ -16,7 +16,7 @@ - "Reserv" - "Åtgärden stöds inte" - "Den här åtgärden stöds inte för närvarande." + "Reserv" + "Åtgärden stöds inte" + "Den här åtgärden stöds inte för närvarande." diff --git a/apps/Fallback/res/values-sw/strings.xml b/apps/Fallback/res/values-sw/strings.xml index 4b07acbaa..2e0d2f746 100644 --- a/apps/Fallback/res/values-sw/strings.xml +++ b/apps/Fallback/res/values-sw/strings.xml @@ -16,7 +16,7 @@ - "Kimbilio" - "Kitendo kisichohimiliwa" - "Kitendo hakihimili kwa sasa." + "Kimbilio" + "Kitendo kisichohimiliwa" + "Kitendo hakihimili kwa sasa." diff --git a/apps/Fallback/res/values-ta/strings.xml b/apps/Fallback/res/values-ta/strings.xml index f46c13b05..97710b47f 100644 --- a/apps/Fallback/res/values-ta/strings.xml +++ b/apps/Fallback/res/values-ta/strings.xml @@ -16,7 +16,7 @@ - "ஃபால்பேக்" - "ஆதரிக்கப்படாத செயல்" - "கோரப்பட்ட செயல் தற்போது ஆதரிக்கப்படவில்லை." + "ஃபால்பேக்" + "ஆதரிக்கப்படாத செயல்" + "கோரப்பட்ட செயல் தற்போது ஆதரிக்கப்படவில்லை." diff --git a/apps/Fallback/res/values-te/strings.xml b/apps/Fallback/res/values-te/strings.xml index 843bf8f6f..383a6b1d3 100644 --- a/apps/Fallback/res/values-te/strings.xml +++ b/apps/Fallback/res/values-te/strings.xml @@ -16,7 +16,7 @@ - "ఫాల్‌బ్యాక్" - "మద్దతు లేని చర్య" - "ఆ చర్యకు ప్రస్తుతం మద్దతు లేదు." + "ఫాల్‌బ్యాక్" + "మద్దతు లేని చర్య" + "ఆ చర్యకు ప్రస్తుతం మద్దతు లేదు." diff --git a/apps/Fallback/res/values-th/strings.xml b/apps/Fallback/res/values-th/strings.xml index 3c9cd8a65..c50252b7f 100644 --- a/apps/Fallback/res/values-th/strings.xml +++ b/apps/Fallback/res/values-th/strings.xml @@ -16,7 +16,7 @@ - "Fallback" - "การทำงานไม่ได้รับการสนับสนุน" - "การทำงานนี้ยังไม่ได้รับการสนับสนุนในปัจจุบัน" + "Fallback" + "การทำงานไม่ได้รับการสนับสนุน" + "การทำงานนี้ยังไม่ได้รับการสนับสนุนในปัจจุบัน" diff --git a/apps/Fallback/res/values-tl/strings.xml b/apps/Fallback/res/values-tl/strings.xml index c2f8b998c..adf8336e2 100644 --- a/apps/Fallback/res/values-tl/strings.xml +++ b/apps/Fallback/res/values-tl/strings.xml @@ -16,7 +16,7 @@ - "Fallback" - "Hindi suportadong pagkilos" - "Hindi kasalukuyang suportado ang pagkilos na iyon." + "Fallback" + "Hindi suportadong pagkilos" + "Hindi kasalukuyang suportado ang pagkilos na iyon." diff --git a/apps/Fallback/res/values-tr/strings.xml b/apps/Fallback/res/values-tr/strings.xml index 3872837ab..e39e9cfa5 100644 --- a/apps/Fallback/res/values-tr/strings.xml +++ b/apps/Fallback/res/values-tr/strings.xml @@ -16,7 +16,7 @@ - "Fallback" - "Desteklenmeyen işlem" - "Bu işlem şu an desteklenmiyor." + "Fallback" + "Desteklenmeyen işlem" + "Bu işlem şu an desteklenmiyor." diff --git a/apps/Fallback/res/values-uk/strings.xml b/apps/Fallback/res/values-uk/strings.xml index 62a722cd6..0e325c72d 100644 --- a/apps/Fallback/res/values-uk/strings.xml +++ b/apps/Fallback/res/values-uk/strings.xml @@ -16,7 +16,7 @@ - "Авар.режим" - "Непідтримувана дія" - "Дія наразі не підтримується." + "Авар.режим" + "Непідтримувана дія" + "Дія наразі не підтримується." diff --git a/apps/Fallback/res/values-ur/strings.xml b/apps/Fallback/res/values-ur/strings.xml index d193c94d2..1e19669f5 100644 --- a/apps/Fallback/res/values-ur/strings.xml +++ b/apps/Fallback/res/values-ur/strings.xml @@ -16,7 +16,7 @@ - "فال بیک" - "غیر تعاون یافتہ کارروائی" - "وہ کارروائی فی الحال تعاون یافتہ نہیں ہے۔" + "فال بیک" + "غیر تعاون یافتہ کارروائی" + "وہ کارروائی فی الحال تعاون یافتہ نہیں ہے۔" diff --git a/apps/Fallback/res/values-uz/strings.xml b/apps/Fallback/res/values-uz/strings.xml index 198acd89b..bfaea3336 100644 --- a/apps/Fallback/res/values-uz/strings.xml +++ b/apps/Fallback/res/values-uz/strings.xml @@ -16,7 +16,7 @@ - "Zaxiradagi rejim" - "Qo‘llab-quvvatlanmaydigan harakat" - "Ushbu harakat hozirda qo‘llab-quvvatlanmaydi." + "Zaxiradagi rejim" + "Qo‘llab-quvvatlanmaydigan harakat" + "Ushbu harakat hozirda qo‘llab-quvvatlanmaydi." diff --git a/apps/Fallback/res/values-vi/strings.xml b/apps/Fallback/res/values-vi/strings.xml index 56c21aec9..8f4f1ed39 100644 --- a/apps/Fallback/res/values-vi/strings.xml +++ b/apps/Fallback/res/values-vi/strings.xml @@ -16,7 +16,7 @@ - "Dự phòng" - "Tác vụ không được hỗ trợ" - "Tác vụ đó hiện không được hỗ trợ." + "Dự phòng" + "Tác vụ không được hỗ trợ" + "Tác vụ đó hiện không được hỗ trợ." diff --git a/apps/Fallback/res/values-zh-rCN/strings.xml b/apps/Fallback/res/values-zh-rCN/strings.xml index ab75f4d3c..83d53555d 100644 --- a/apps/Fallback/res/values-zh-rCN/strings.xml +++ b/apps/Fallback/res/values-zh-rCN/strings.xml @@ -16,7 +16,7 @@ - "后备" - "不支持此操作" - "目前不支持该操作。" + "后备" + "不支持此操作" + "目前不支持该操作。" diff --git a/apps/Fallback/res/values-zh-rHK/strings.xml b/apps/Fallback/res/values-zh-rHK/strings.xml index ce01c920b..2edf96ee3 100644 --- a/apps/Fallback/res/values-zh-rHK/strings.xml +++ b/apps/Fallback/res/values-zh-rHK/strings.xml @@ -16,7 +16,7 @@ - "後備" - "不支援的操作" - "目前不支援該操作。" + "後備" + "不支援的操作" + "目前不支援該操作。" diff --git a/apps/Fallback/res/values-zh-rTW/strings.xml b/apps/Fallback/res/values-zh-rTW/strings.xml index 8d0fc8cde..f906af263 100644 --- a/apps/Fallback/res/values-zh-rTW/strings.xml +++ b/apps/Fallback/res/values-zh-rTW/strings.xml @@ -16,7 +16,7 @@ - "備用" - "不支援的操作" - "目前不支援此操作。" + "備用" + "不支援的操作" + "目前不支援此操作。" diff --git a/apps/Fallback/res/values-zu/strings.xml b/apps/Fallback/res/values-zu/strings.xml index 2c85d28ee..28342b04e 100644 --- a/apps/Fallback/res/values-zu/strings.xml +++ b/apps/Fallback/res/values-zu/strings.xml @@ -16,7 +16,7 @@ - "Buyela emuva" - "Isenzo esingasekelwe" - "Leso senzo okwamanje asisekelwe." + "Buyela emuva" + "Isenzo esingasekelwe" + "Leso senzo okwamanje asisekelwe." diff --git a/apps/SdkSetup/AndroidManifest.xml b/apps/SdkSetup/AndroidManifest.xml index b57249c78..76ef9ff31 100644 --- a/apps/SdkSetup/AndroidManifest.xml +++ b/apps/SdkSetup/AndroidManifest.xml @@ -22,6 +22,7 @@ + diff --git a/apps/SdkSetup/com.android.sdksetup.xml b/apps/SdkSetup/com.android.sdksetup.xml index 0d81b9d50..0e58d46f2 100644 --- a/apps/SdkSetup/com.android.sdksetup.xml +++ b/apps/SdkSetup/com.android.sdksetup.xml @@ -25,6 +25,7 @@ It allows additional grants on top of privapp-permissions-platform.xml + diff --git a/apps/SdkSetup/src/com/android/sdksetup/DefaultActivity.java b/apps/SdkSetup/src/com/android/sdksetup/DefaultActivity.java index a6337732c..2c765c359 100644 --- a/apps/SdkSetup/src/com/android/sdksetup/DefaultActivity.java +++ b/apps/SdkSetup/src/com/android/sdksetup/DefaultActivity.java @@ -23,12 +23,13 @@ import android.content.pm.PackageManager; import android.hardware.input.InputManager; import android.hardware.input.KeyboardLayout; import android.location.LocationManager; +import android.provider.Settings; import android.os.Bundle; import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemProperties; import android.os.Build; -import android.provider.Settings; +import android.telephony.TelephonyManager; import android.view.InputDevice; /** @@ -71,6 +72,8 @@ public class DefaultActivity extends Activity { // Disable offload wifi tethering Settings.Global.putInt(getContentResolver(), Settings.Global.TETHER_OFFLOAD_DISABLED, 1); + TelephonyManager mTelephony = getApplicationContext().getSystemService(TelephonyManager.class); + mTelephony.setPreferredNetworkTypeBitmask(TelephonyManager.NETWORK_TYPE_BITMASK_NR); } // remove this activity from the package manager. diff --git a/build/product_sdk.mk b/build/product_sdk.mk index 63a3c91d8..9e4ce978b 100644 --- a/build/product_sdk.mk +++ b/build/product_sdk.mk @@ -39,7 +39,6 @@ PRODUCT_HOST_PACKAGES += \ dx \ etc1tool \ hprof-conv \ - layoutlib-legacy \ libaapt2_jni \ llvm-rs-cc \ sqlite3 \ diff --git a/build/sdk-darwin-x86.atree b/build/sdk-darwin-x86.atree index 605682cd8..ba93c02ef 100644 --- a/build/sdk-darwin-x86.atree +++ b/build/sdk-darwin-x86.atree @@ -35,8 +35,14 @@ lib64/libclang_android.dylib strip build-tools/${PLAT lib64/libc++.dylib strip build-tools/${PLATFORM_NAME}/lib64/libc++.dylib lib64/libaapt2_jni.dylib strip build-tools/${PLATFORM_NAME}/lib64/libaapt2_jni.dylib +prebuilts/sdk/tools/lld-dummy build-tools/${PLATFORM_NAME}/arm-linux-androideabi-ld +prebuilts/sdk/tools/lld-dummy build-tools/${PLATFORM_NAME}/aarch64-linux-android-ld +prebuilts/sdk/tools/lld-dummy build-tools/${PLATFORM_NAME}/i686-linux-android-ld +prebuilts/sdk/tools/lld-dummy build-tools/${PLATFORM_NAME}/x86_64-linux-android-ld +prebuilts/sdk/tools/lld-dummy build-tools/${PLATFORM_NAME}/mipsel-linux-android-ld + prebuilts/sdk/tools/lld build-tools/${PLATFORM_NAME}/lld -prebuilts/sdk/tools/darwin/bin/lld strip build-tools/${PLATFORM_NAME}/lld-bin/lld +prebuilts/sdk/tools/darwin/lld-bin/lld strip build-tools/${PLATFORM_NAME}/lld-bin/lld prebuilts/sdk/tools/darwin/lib64/libc++.1.dylib strip build-tools/${PLATFORM_NAME}/lib64/libc++.1.dylib prebuilts/sdk/tools/darwin/lib64/libc++abi.1.dylib strip build-tools/${PLATFORM_NAME}/lib64/libc++abi.1.dylib diff --git a/build/sdk-linux-x86.atree b/build/sdk-linux-x86.atree index 6b5714200..477f33452 100644 --- a/build/sdk-linux-x86.atree +++ b/build/sdk-linux-x86.atree @@ -35,8 +35,14 @@ lib64/libclang_android.so strip build-tools/${PLATF lib64/libc++.so strip build-tools/${PLATFORM_NAME}/lib64/libc++.so lib64/libaapt2_jni.so strip build-tools/${PLATFORM_NAME}/lib64/libaapt2_jni.so +prebuilts/sdk/tools/lld-dummy build-tools/${PLATFORM_NAME}/arm-linux-androideabi-ld +prebuilts/sdk/tools/lld-dummy build-tools/${PLATFORM_NAME}/aarch64-linux-android-ld +prebuilts/sdk/tools/lld-dummy build-tools/${PLATFORM_NAME}/i686-linux-android-ld +prebuilts/sdk/tools/lld-dummy build-tools/${PLATFORM_NAME}/x86_64-linux-android-ld +prebuilts/sdk/tools/lld-dummy build-tools/${PLATFORM_NAME}/mipsel-linux-android-ld + prebuilts/sdk/tools/lld build-tools/${PLATFORM_NAME}/lld -prebuilts/sdk/tools/linux/bin/lld strip build-tools/${PLATFORM_NAME}/lld-bin/lld +prebuilts/sdk/tools/linux/lld-bin/lld strip build-tools/${PLATFORM_NAME}/lld-bin/lld prebuilts/sdk/tools/linux/lib64/libc++.so.1 strip build-tools/${PLATFORM_NAME}/lib64/libc++.so.1 dalvik/dx/etc/mainDexClasses build-tools/${PLATFORM_NAME}/mainDexClasses diff --git a/build/sdk-windows-x86.atree b/build/sdk-windows-x86.atree index ba0813737..9013287de 100644 --- a/build/sdk-windows-x86.atree +++ b/build/sdk-windows-x86.atree @@ -125,6 +125,21 @@ lib/libbcinfo.dll strip build-tools/${PLATFORM_NAME}/libbc rm build-tools/${PLATFORM_NAME}/bcc_compat bin/bcc_compat.exe strip build-tools/${PLATFORM_NAME}/bcc_compat.exe +rm build-tools/${PLATFORM_NAME}/arm-linux-androideabi-ld +prebuilts/sdk/tools/lld-dummy build-tools/${PLATFORM_NAME}/arm-linux-androideabi-ld.exe + +rm build-tools/${PLATFORM_NAME}/aarch64-linux-android-ld +prebuilts/sdk/tools/lld-dummy build-tools/${PLATFORM_NAME}/aarch64-linux-android-ld.exe + +rm build-tools/${PLATFORM_NAME}/i686-linux-android-ld +prebuilts/sdk/tools/lld-dummy build-tools/${PLATFORM_NAME}/i686-linux-android-ld.exe + +rm build-tools/${PLATFORM_NAME}/x86_64-linux-android-ld +prebuilts/sdk/tools/lld-dummy build-tools/${PLATFORM_NAME}/x86_64-linux-android-ld.exe + +rm build-tools/${PLATFORM_NAME}/mipsel-linux-android-ld +prebuilts/sdk/tools/lld-dummy build-tools/${PLATFORM_NAME}/mipsel-linux-android-ld.exe + rm build-tools/${PLATFORM_NAME}/lib64/libc++.so.1 rm build-tools/${PLATFORM_NAME}/lld @@ -134,8 +149,8 @@ rm build-tools/${PLATFORM_NAME}/lld-bin/lld bin/lld.exe strip build-tools/${PLATFORM_NAME}/lld.exe # actual lld linker, and dependent library -prebuilts/sdk/tools/windows/bin/lld.exe strip build-tools/${PLATFORM_NAME}/lld-bin/lld.exe -prebuilts/sdk/tools/windows/bin/lib64/libwinpthread-1.dll strip build-tools/${PLATFORM_NAME}/lld-bin/libwinpthread-1.dll +prebuilts/sdk/tools/windows/lld-bin/lld.exe strip build-tools/${PLATFORM_NAME}/lld-bin/lld.exe +prebuilts/sdk/tools/windows/lld-bin/libwinpthread-1.dll strip build-tools/${PLATFORM_NAME}/lld-bin/libwinpthread-1.dll dalvik/dx/etc/mainDexClasses.bat build-tools/${PLATFORM_NAME}/mainDexClasses.bat diff --git a/build/sdk.atree b/build/sdk.atree index a2b996ea8..85f5100ae 100644 --- a/build/sdk.atree +++ b/build/sdk.atree @@ -216,7 +216,6 @@ prebuilts/sdk/sdk-annotations/annotations.zip platforms/${PLATFORM_NAME}/data/an ${OUT_DIR}/target/common/obj/PACKAGING/framework-doc-stubs_annotations.zip platforms/${PLATFORM_NAME}/data/annotations.zip # Eclipse Editors support -framework/layoutlib-legacy.jar platforms/${PLATFORM_NAME}/data/layoutlib.jar frameworks/base/core/res/res platforms/${PLATFORM_NAME}/data/res ${OUT_DIR}/target/common/obj/PACKAGING/framework-doc-stubs-metadata_intermediates/activity_actions.txt platforms/${PLATFORM_NAME}/data/activity_actions.txt ${OUT_DIR}/target/common/obj/PACKAGING/framework-doc-stubs-metadata_intermediates/broadcast_actions.txt platforms/${PLATFORM_NAME}/data/broadcast_actions.txt @@ -225,12 +224,6 @@ ${OUT_DIR}/target/common/obj/PACKAGING/framework-doc-stubs-metadata_intermediate ${OUT_DIR}/target/common/obj/PACKAGING/framework-doc-stubs-metadata_intermediates/widgets.txt platforms/${PLATFORM_NAME}/data/widgets.txt ${OUT_DIR}/target/common/obj/PACKAGING/framework-doc-stubs-metadata_intermediates/features.txt platforms/${PLATFORM_NAME}/data/features.txt -# fonts for layoutlib. -${FONT_OUT} platforms/${PLATFORM_NAME}/data/fonts - -# timezone data for layoutlib -system/timezone/output_data/iana/tzdata platforms/${PLATFORM_NAME}/data/tzdata - # NOTICE files are copied by build/core/Makefile from sdk.git development/sdk/sdk_files_NOTICE.txt platforms/${PLATFORM_NAME}/templates/NOTICE.txt development/sdk/sdk_files_NOTICE.txt platforms/${PLATFORM_NAME}/data/NOTICE.txt diff --git a/build/tools/sdk_clean.sh b/build/tools/sdk_clean.sh index c396fb0de..97e5a4d47 100755 --- a/build/tools/sdk_clean.sh +++ b/build/tools/sdk_clean.sh @@ -27,9 +27,12 @@ if [ $HOST_OS = windows ] ; then else ENDING_TYPE=unix fi + +# Using -n 500 for xargs to limit the max number of arguments per call to line_endings +# to 500. This avoids line_endings failing with "arguments too long". find $DIR -name "*.aidl" -o -name "*.css" -o -name "*.html" -o -name "*.java" \ -o -name "*.js" -o -name "*.prop" -o -name "*.template" \ -o -name "*.txt" -o -name "*.windows" -o -name "*.xml" \ - | xargs $HOST_OUT_EXECUTABLES/line_endings $ENDING_TYPE + | xargs -n 500 $HOST_OUT_EXECUTABLES/line_endings $ENDING_TYPE diff --git a/cmds/monkey/src/com/android/commands/monkey/MonkeyActivityEvent.java b/cmds/monkey/src/com/android/commands/monkey/MonkeyActivityEvent.java index 1e863830e..0e793a68b 100644 --- a/cmds/monkey/src/com/android/commands/monkey/MonkeyActivityEvent.java +++ b/cmds/monkey/src/com/android/commands/monkey/MonkeyActivityEvent.java @@ -20,8 +20,11 @@ import android.app.ActivityManager; import android.app.IActivityManager; import android.content.ComponentName; import android.content.Intent; +import android.content.pm.IPackageManager; +import android.os.Binder; import android.os.Bundle; import android.os.RemoteException; +import android.os.ServiceManager; import android.view.IWindowManager; /** @@ -67,8 +70,8 @@ public class MonkeyActivityEvent extends MonkeyEvent { } try { - iam.startActivityAsUser(null, null, intent, null, null, null, 0, - 0, null, null, ActivityManager.getCurrentUser()); + iam.startActivityAsUserWithFeature(null, getPackageName(), null, intent, null, null, + null, 0, 0, null, null, ActivityManager.getCurrentUser()); } catch (RemoteException e) { Logger.err.println("** Failed talking with activity manager!"); return MonkeyEvent.INJECT_ERROR_REMOTE_EXCEPTION; @@ -81,4 +84,24 @@ public class MonkeyActivityEvent extends MonkeyEvent { } return MonkeyEvent.INJECT_SUCCESS; } + + /** + * Obtain the package name of the current process using the current UID. The package name has to + * match the current UID in IActivityManager#startActivityAsUser to be allowed to start an + * activity. + */ + private static String getPackageName() { + try { + IPackageManager pm = IPackageManager.Stub.asInterface( + ServiceManager.getService("package")); + if (pm == null) { + return null; + } + String[] packages = pm.getPackagesForUid(Binder.getCallingUid()); + return packages != null ? packages[0] : null; + } catch (RemoteException e) { + Logger.err.println("** Failed talking with package manager!"); + return null; + } + } } diff --git a/cmds/monkey/src/com/android/commands/monkey/MonkeyNetworkMonitor.java b/cmds/monkey/src/com/android/commands/monkey/MonkeyNetworkMonitor.java index 07d0dbc2a..d612c345d 100644 --- a/cmds/monkey/src/com/android/commands/monkey/MonkeyNetworkMonitor.java +++ b/cmds/monkey/src/com/android/commands/monkey/MonkeyNetworkMonitor.java @@ -85,18 +85,19 @@ public class MonkeyNetworkMonitor extends IIntentReceiver.Stub { public void register(IActivityManager am) throws RemoteException { if (LDEBUG) Logger.out.println("registering Receiver"); - am.registerReceiver(null, null, this, filter, null, UserHandle.USER_ALL, 0); + am.registerReceiverWithFeature(null, null, null, this, filter, null, UserHandle.USER_ALL, + 0); } - + public void unregister(IActivityManager am) throws RemoteException { if (LDEBUG) Logger.out.println("unregistering Receiver"); am.unregisterReceiver(this); } - + public void stop() { updateNetworkStats(); } - + public void dump() { Logger.out.println("## Network stats: elapsed time=" + mElapsedTime + "ms (" + mMobileElapsedTime + "ms mobile, " diff --git a/cmds/monkey/src/com/android/commands/monkey/MonkeyPermissionEvent.java b/cmds/monkey/src/com/android/commands/monkey/MonkeyPermissionEvent.java index b86fd9317..c051835f8 100644 --- a/cmds/monkey/src/com/android/commands/monkey/MonkeyPermissionEvent.java +++ b/cmds/monkey/src/com/android/commands/monkey/MonkeyPermissionEvent.java @@ -17,12 +17,13 @@ package com.android.commands.monkey; import android.app.ActivityManager; +import android.app.AppGlobals; import android.app.IActivityManager; -import android.content.pm.IPackageManager; import android.content.pm.PackageManager; import android.content.pm.PermissionInfo; import android.os.RemoteException; import android.os.ServiceManager; +import android.permission.IPermissionManager; import android.view.IWindowManager; public class MonkeyPermissionEvent extends MonkeyEvent { @@ -37,19 +38,20 @@ public class MonkeyPermissionEvent extends MonkeyEvent { @Override public int injectEvent(IWindowManager iwm, IActivityManager iam, int verbose) { - IPackageManager pm = IPackageManager.Stub.asInterface(ServiceManager.getService("package")); - int currentUser = ActivityManager.getCurrentUser(); + final IPermissionManager permissionManager = AppGlobals.getPermissionManager(); + final int currentUser = ActivityManager.getCurrentUser(); try { // determine if we should grant or revoke permission - int perm = pm.checkPermission(mPermissionInfo.name, mPkg, currentUser); + int perm = permissionManager.checkPermission(mPermissionInfo.name, mPkg, currentUser); boolean grant = perm == PackageManager.PERMISSION_DENIED; // log before calling pm in case we hit an error Logger.out.println(String.format(":Permission %s %s to package %s", grant ? "grant" : "revoke", mPermissionInfo.name, mPkg)); if (grant) { - pm.grantRuntimePermission(mPkg, mPermissionInfo.name, currentUser); + permissionManager.grantRuntimePermission(mPkg, mPermissionInfo.name, currentUser); } else { - pm.revokeRuntimePermission(mPkg, mPermissionInfo.name, currentUser); + permissionManager.revokeRuntimePermission(mPkg, mPermissionInfo.name, currentUser, + null); } return MonkeyEvent.INJECT_SUCCESS; } catch (RemoteException re) { diff --git a/cmds/monkey/src/com/android/commands/monkey/MonkeyPermissionUtil.java b/cmds/monkey/src/com/android/commands/monkey/MonkeyPermissionUtil.java index 6f6366954..6df024413 100644 --- a/cmds/monkey/src/com/android/commands/monkey/MonkeyPermissionUtil.java +++ b/cmds/monkey/src/com/android/commands/monkey/MonkeyPermissionUtil.java @@ -26,6 +26,7 @@ import android.os.Build; import android.os.RemoteException; import android.os.ServiceManager; import android.os.UserHandle; +import android.permission.IPermissionManager; import java.util.ArrayList; import java.util.HashMap; @@ -69,12 +70,15 @@ public class MonkeyPermissionUtil { /** if we should target system packages regardless if they are listed */ private boolean mTargetSystemPackages; private IPackageManager mPm; + private final IPermissionManager mPermManager; /** keep track of runtime permissions requested for each package targeted */ private Map> mPermissionMap; public MonkeyPermissionUtil() { mPm = IPackageManager.Stub.asInterface(ServiceManager.getService("package")); + mPermManager = + IPermissionManager.Stub.asInterface(ServiceManager.getService("permissionmgr")); } public void setTargetSystemPackages(boolean targetSystemPackages) { @@ -102,7 +106,7 @@ public class MonkeyPermissionUtil { } private boolean shouldTargetPermission(String pkg, PermissionInfo pi) throws RemoteException { - int flags = mPm.getPermissionFlags(pi.name, pkg, UserHandle.myUserId()); + int flags = mPermManager.getPermissionFlags(pi.name, pkg, UserHandle.myUserId()); int fixedPermFlags = PackageManager.FLAG_PERMISSION_SYSTEM_FIXED | PackageManager.FLAG_PERMISSION_POLICY_FIXED; return pi.group != null && pi.protectionLevel == PermissionInfo.PROTECTION_DANGEROUS @@ -129,7 +133,7 @@ public class MonkeyPermissionUtil { continue; } for (String perm : info.requestedPermissions) { - PermissionInfo pi = mPm.getPermissionInfo(perm, "shell", 0); + PermissionInfo pi = mPermManager.getPermissionInfo(perm, "shell", 0); if (pi != null && shouldTargetPermission(info.packageName, pi)) { permissions.add(pi); } diff --git a/cmds/monkey/src/com/android/commands/monkey/MonkeySourceNetworkVars.java b/cmds/monkey/src/com/android/commands/monkey/MonkeySourceNetworkVars.java index 9abfe265b..67cce2298 100644 --- a/cmds/monkey/src/com/android/commands/monkey/MonkeySourceNetworkVars.java +++ b/cmds/monkey/src/com/android/commands/monkey/MonkeySourceNetworkVars.java @@ -77,7 +77,7 @@ public class MonkeySourceNetworkVars { VAR_MAP.put("build.cpu_abi", new StaticVarGetter(Build.CPU_ABI)); VAR_MAP.put("build.manufacturer", new StaticVarGetter(Build.MANUFACTURER)); VAR_MAP.put("build.version.incremental", new StaticVarGetter(Build.VERSION.INCREMENTAL)); - VAR_MAP.put("build.version.release", new StaticVarGetter(Build.VERSION.RELEASE)); + VAR_MAP.put("build.version.release", new StaticVarGetter(Build.VERSION.RELEASE_OR_CODENAME)); VAR_MAP.put("build.version.sdk", new StaticVarGetter(Integer.toString(Build.VERSION.SDK_INT))); VAR_MAP.put("build.version.codename", new StaticVarGetter(Build.VERSION.CODENAME)); diff --git a/ide/clion/frameworks/base/CMakeLists.txt b/ide/clion/frameworks/base/CMakeLists.txt new file mode 100644 index 000000000..70566c493 --- /dev/null +++ b/ide/clion/frameworks/base/CMakeLists.txt @@ -0,0 +1,12 @@ +cmake_minimum_required(VERSION 3.6) +project(frameworks_base) + +# HWUI +add_subdirectory(libs/hwui/libhwui-arm64-android) +add_subdirectory(libs/hwui/hwuimacro-arm64-android) +add_subdirectory(libs/hwui/hwuimicro-arm64-android) +add_subdirectory(libs/hwui/hwui_unit_tests-arm64-android) + +# JNI +add_subdirectory(core/jni/libandroid_runtime-arm64-android) +add_subdirectory(core/jni/libandroid_graphics-arm64-android) diff --git a/ide/clion/frameworks/base/libs/hwui/CMakeLists.txt b/ide/clion/frameworks/base/libs/hwui/CMakeLists.txt new file mode 100644 index 000000000..e80786708 --- /dev/null +++ b/ide/clion/frameworks/base/libs/hwui/CMakeLists.txt @@ -0,0 +1,19 @@ +cmake_minimum_required(VERSION 3.6) +project(hwui) + +set(ROOT ${CMAKE_CURRENT_LIST_DIR}/../../../../) +set(ROOT_OUT ${CMAKE_CURRENT_LIST_DIR}/cmake_out) + +# HWUI deps that we want source for +add_subdirectory(${ROOT}/frameworks/native/libs/gui/libgui-arm64-android ${ROOT_OUT}/libgui) +add_subdirectory(${ROOT}/frameworks/native/libs/ui/libui-arm64-android ${ROOT_OUT}/libui) +add_subdirectory(${ROOT}/external/skia/libskia-arm64-android ${ROOT_OUT}/libskia) + +# HWUI +add_subdirectory(${ROOT}/frameworks/base/libs/hwui/libhwui-arm64-android ${ROOT_OUT}/libhwui) +add_subdirectory(${ROOT}/frameworks/base/libs/hwui/hwuimacro-arm64-android ${ROOT_OUT}/hwuimacro) +add_subdirectory(${ROOT}/frameworks/base/libs/hwui/hwuimicro-arm64-android ${ROOT_OUT}/hwuimicro) +add_subdirectory(${ROOT}/frameworks/base/libs/hwui/hwui_unit_tests-arm64-android ${ROOT_OUT}/hwuiunit) + +# JNI +add_subdirectory(${ROOT}/frameworks/base/core/jni/libandroid_runtime-arm64-android ${ROOT_OUT}/jni) diff --git a/ide/clion/frameworks/ml/CMakeLists.txt b/ide/clion/frameworks/ml/CMakeLists.txt new file mode 100644 index 000000000..e60b9835f --- /dev/null +++ b/ide/clion/frameworks/ml/CMakeLists.txt @@ -0,0 +1,26 @@ +cmake_minimum_required(VERSION 3.6) +project(ml) + +add_subdirectory(nn/tools/ion_watcher/ion_watcher-arm-android) +add_subdirectory(nn/driver/sample/libSampleDriver-arm-android) +add_subdirectory(nn/driver/sample/android.hardware.neuralnetworks@1.2-service-sample-minimal-arm-android) +add_subdirectory(nn/driver/sample/android.hardware.neuralnetworks@1.2-service-sample-float-slow-arm-android) +add_subdirectory(nn/driver/sample/android.hardware.neuralnetworks@1.2-service-sample-all-arm-android) +add_subdirectory(nn/driver/sample/android.hardware.neuralnetworks@1.2-service-sample-float-fast-arm-android) +add_subdirectory(nn/driver/sample/android.hardware.neuralnetworks@1.2-service-sample-quant-arm-android) +add_subdirectory(nn/driver/cache/BlobCache/libBlobCache-arm-android) +add_subdirectory(nn/driver/cache/BlobCache/BlobCache_test-arm-android) +add_subdirectory(nn/driver/cache/nnCache/lib_nnCache-arm-android) +add_subdirectory(nn/driver/cache/nnCache/nnCache_test-arm-android) +add_subdirectory(nn/common/libneuralnetworks_utils-arm-android) +add_subdirectory(nn/common/random/philox_random-arm-android) +add_subdirectory(nn/common/NeuralNetworksTest_operations-arm-android) +add_subdirectory(nn/common/NeuralNetworksTest_utils-arm-android) +add_subdirectory(nn/common/libneuralnetworks_common-arm-android) +add_subdirectory(nn/runtime/test/NeuralNetworksTest_shared_partial-arm-android) +add_subdirectory(nn/runtime/test/NeuralNetworksTest_static-arm-android) +add_subdirectory(nn/runtime/test/NeuralNetworksTest_static_fuzzing-arm-android) +add_subdirectory(nn/runtime/test/NeuralNetworksTest_mt_static-arm-android) +add_subdirectory(nn/runtime/test/NeuralNetworksTest_static_asan-arm-android) +add_subdirectory(nn/runtime/test/NeuralNetworksTest_static_ubsan-arm-android) +add_subdirectory(nn/runtime/test/NeuralNetworksTest_mt_static_asan-arm-android) diff --git a/ide/clion/frameworks/native/CMakeLists.txt b/ide/clion/frameworks/native/CMakeLists.txt index cd6713d87..869910ff6 100644 --- a/ide/clion/frameworks/native/CMakeLists.txt +++ b/ide/clion/frameworks/native/CMakeLists.txt @@ -2,5 +2,19 @@ cmake_minimum_required(VERSION 3.6) project(native) add_subdirectory(libs/gui/libgui-arm64-android) add_subdirectory(libs/ui/libui-arm64-android) -add_subdirectory(services/surfaceflinger/libsurfaceflinger-arm64-android) add_subdirectory(services/surfaceflinger/surfaceflinger-arm64-android) +add_subdirectory(services/surfaceflinger/CompositionEngine/libcompositionengine_mocks-arm64-android) +add_subdirectory(services/surfaceflinger/CompositionEngine/libcompositionengine_test-arm64-android) +add_subdirectory(services/surfaceflinger/CompositionEngine/libcompositionengine-arm64-android) +add_subdirectory(services/surfaceflinger/TimeStats/timestatsproto/libtimestats_proto-arm64-android) +add_subdirectory(services/surfaceflinger/TimeStats/libtimestats-arm64-android) +add_subdirectory(services/surfaceflinger/libsurfaceflinger-arm64-android) +add_subdirectory(services/surfaceflinger/layerproto/liblayers_proto-arm64-android) +add_subdirectory(services/surfaceflinger/tests/IPC_test-arm64-android) +add_subdirectory(services/surfaceflinger/tests/fakehwc/sffakehwc_test-arm64-android) +add_subdirectory(services/surfaceflinger/tests/SurfaceFlinger_test-arm64-android) +add_subdirectory(services/surfaceflinger/tests/vsync/test-vsync-events-arm64-android) +add_subdirectory(services/surfaceflinger/tests/waitforvsync/test-waitforvsync-arm64-android) +add_subdirectory(services/surfaceflinger/tests/unittests/libsurfaceflinger_unittest-arm64-android) +add_subdirectory(services/surfaceflinger/libSurfaceFlingerProp-arm64-android) +add_subdirectory(services/surfaceflinger/sysprop/libSurfaceFlingerProperties-arm64-android) diff --git a/ide/clion/test/vts-testcase/CMakeLists.txt b/ide/clion/test/vts-testcase/CMakeLists.txt new file mode 100644 index 000000000..23e5e0948 --- /dev/null +++ b/ide/clion/test/vts-testcase/CMakeLists.txt @@ -0,0 +1,18 @@ +cmake_minimum_required(VERSION 3.6) +project(vts-testcase) + +add_subdirectory(kernel/api/tun/vts_kernel_tun_test-arm-android) +add_subdirectory(kernel/api/bpf_native_test/vts_test_binary_bpf_module-arm-android) +add_subdirectory(kernel/api/qtaguid/vts_test_binary_qtaguid_module-arm-android) +add_subdirectory(kernel/toolchain/vts_kernel_toolchain-arm-android) +add_subdirectory(kernel/bow/vts_test_binary_bow_module-arm-android) +add_subdirectory(kernel/loop/vts_kernel_loopconfig_test-arm-android) +add_subdirectory(security/selinux/policy/VtsSecuritySelinuxPolicyHostTest-x86_64-linux_glibc) +add_subdirectory(security/avb/VtsSecurityAvbTest-arm-android) +add_subdirectory(fuzz/iface_fuzzer/vts_proto_fuzzer-arm-android) +add_subdirectory(fuzz/iface_fuzzer/libvts_proto_fuzzer-arm-android) +add_subdirectory(hal/treble/vintf/vts_treble_vintf_test_all-arm-android) +add_subdirectory(hal/treble/vintf/vts_treble_vintf_vendor_test-arm-android) +add_subdirectory(hal/treble/vintf/vts_treble_vintf_framework_test-arm-android) +add_subdirectory(hal/treble/vintf/vts_treble_vintf_test_o_mr1-arm-android) +add_subdirectory(hal/thermal/V1_0/target_stress/thermal_hidl_stress_test-arm-android) diff --git a/samples/AutofillKeyboard/Android.bp b/samples/AutofillKeyboard/Android.bp new file mode 100644 index 000000000..57a4249be --- /dev/null +++ b/samples/AutofillKeyboard/Android.bp @@ -0,0 +1,12 @@ +android_app { + name: "AutofillKeyboard", + srcs: ["**/*.java"], + min_sdk_version: "29", + target_sdk_version: "30", + sdk_version: "current", + static_libs: [ + "androidx.annotation_annotation", + "androidx.autofill_autofill", + "android-support-annotations", + ], +} diff --git a/samples/AutofillKeyboard/AndroidManifest.xml b/samples/AutofillKeyboard/AndroidManifest.xml new file mode 100755 index 000000000..8dc06d5c9 --- /dev/null +++ b/samples/AutofillKeyboard/AndroidManifest.xml @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/samples/AutofillKeyboard/res/drawable-hdpi/chip_background.xml b/samples/AutofillKeyboard/res/drawable-hdpi/chip_background.xml new file mode 100644 index 000000000..c69ebf587 --- /dev/null +++ b/samples/AutofillKeyboard/res/drawable-hdpi/chip_background.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + diff --git a/samples/AutofillKeyboard/res/drawable-hdpi/ic_launcher.png b/samples/AutofillKeyboard/res/drawable-hdpi/ic_launcher.png new file mode 100644 index 000000000..8074c4c57 Binary files /dev/null and b/samples/AutofillKeyboard/res/drawable-hdpi/ic_launcher.png differ diff --git a/samples/AutofillKeyboard/res/font/just_another_hand.ttf b/samples/AutofillKeyboard/res/font/just_another_hand.ttf new file mode 100644 index 000000000..14cd5765e Binary files /dev/null and b/samples/AutofillKeyboard/res/font/just_another_hand.ttf differ diff --git a/samples/AutofillKeyboard/res/layout/input_view.xml b/samples/AutofillKeyboard/res/layout/input_view.xml new file mode 100644 index 000000000..680b32058 --- /dev/null +++ b/samples/AutofillKeyboard/res/layout/input_view.xml @@ -0,0 +1,25 @@ + + + + diff --git a/samples/AutofillKeyboard/res/layout/keyboard_10_9_9.xml b/samples/AutofillKeyboard/res/layout/keyboard_10_9_9.xml new file mode 100644 index 000000000..14f5bb4f4 --- /dev/null +++ b/samples/AutofillKeyboard/res/layout/keyboard_10_9_9.xml @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/samples/AutofillKeyboard/res/values-sw400dp/dimens.xml b/samples/AutofillKeyboard/res/values-sw400dp/dimens.xml new file mode 100644 index 000000000..b02e97e12 --- /dev/null +++ b/samples/AutofillKeyboard/res/values-sw400dp/dimens.xml @@ -0,0 +1,24 @@ + + + + + 42dp + 60dp + diff --git a/samples/AutofillKeyboard/res/values/colors.xml b/samples/AutofillKeyboard/res/values/colors.xml new file mode 100644 index 000000000..ace840cd7 --- /dev/null +++ b/samples/AutofillKeyboard/res/values/colors.xml @@ -0,0 +1,19 @@ + + + + + #FFEEEEEE + \ No newline at end of file diff --git a/samples/AutofillKeyboard/res/values/dimens.xml b/samples/AutofillKeyboard/res/values/dimens.xml new file mode 100644 index 000000000..e70ae9af7 --- /dev/null +++ b/samples/AutofillKeyboard/res/values/dimens.xml @@ -0,0 +1,27 @@ + + + + + 24dp + 14dp + + 48dp + 48dp + diff --git a/samples/AutofillKeyboard/res/values/strings.xml b/samples/AutofillKeyboard/res/values/strings.xml new file mode 100644 index 000000000..62b6ea038 --- /dev/null +++ b/samples/AutofillKeyboard/res/values/strings.xml @@ -0,0 +1,23 @@ + + + + + Autofill-Keyboard + diff --git a/samples/AutofillKeyboard/res/values/styles.xml b/samples/AutofillKeyboard/res/values/styles.xml new file mode 100644 index 000000000..7a62b2fcf --- /dev/null +++ b/samples/AutofillKeyboard/res/values/styles.xml @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/samples/AutofillKeyboard/res/xml/method.xml b/samples/AutofillKeyboard/res/xml/method.xml new file mode 100644 index 000000000..55daeb024 --- /dev/null +++ b/samples/AutofillKeyboard/res/xml/method.xml @@ -0,0 +1,27 @@ + + + + + + diff --git a/samples/AutofillKeyboard/src/com/example/android/autofillkeyboard/AutofillImeService.java b/samples/AutofillKeyboard/src/com/example/android/autofillkeyboard/AutofillImeService.java new file mode 100644 index 000000000..681601acb --- /dev/null +++ b/samples/AutofillKeyboard/src/com/example/android/autofillkeyboard/AutofillImeService.java @@ -0,0 +1,410 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.android.autofillkeyboard; + +import static android.util.TypedValue.COMPLEX_UNIT_DIP; + +import android.graphics.Color; +import android.graphics.drawable.Icon; +import android.inputmethodservice.InputMethodService; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.util.Log; +import android.util.Size; +import android.util.TypedValue; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.inputmethod.EditorInfo; +import android.widget.inline.InlineContentView; +import android.widget.inline.InlinePresentationSpec; +import android.view.inputmethod.InlineSuggestion; +import android.view.inputmethod.InlineSuggestionsRequest; +import android.view.inputmethod.InlineSuggestionsResponse; +import android.widget.Toast; + +import androidx.autofill.inline.UiVersions; +import androidx.autofill.inline.UiVersions.StylesBuilder; +import androidx.autofill.inline.common.ImageViewStyle; +import androidx.autofill.inline.common.TextViewStyle; +import androidx.autofill.inline.common.ViewStyle; +import androidx.autofill.inline.v1.InlineSuggestionUi; +import androidx.autofill.inline.v1.InlineSuggestionUi.Style; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +/** The {@link InputMethodService} implementation for Autofill keyboard. */ +public class AutofillImeService extends InputMethodService { + private static final boolean SHOWCASE_BG_FG_TRANSITION = false; + // To test this you need to change KeyboardArea style layout_height to 400dp + private static final boolean SHOWCASE_UP_DOWN_TRANSITION = false; + + private static final long MOVE_SUGGESTIONS_TO_BG_TIMEOUT = 5000; + private static final long MOVE_SUGGESTIONS_TO_FG_TIMEOUT = 15000; + + private static final long MOVE_SUGGESTIONS_UP_TIMEOUT = 5000; + private static final long MOVE_SUGGESTIONS_DOWN_TIMEOUT = 10000; + + private InputView mInputView; + private Keyboard mKeyboard; + private Decoder mDecoder; + + private ViewGroup mSuggestionStrip; + private ViewGroup mPinnedSuggestionsStart; + private ViewGroup mPinnedSuggestionsEnd; + private InlineContentClipView mScrollableSuggestionsClip; + private ViewGroup mScrollableSuggestions; + + private final Handler mHandler = new Handler(Looper.getMainLooper()); + + private final Runnable mMoveScrollableSuggestionsToBg = () -> { + mScrollableSuggestionsClip.setZOrderedOnTop(false); + Toast.makeText(AutofillImeService.this, "Chips moved to bg - not clickable", + Toast.LENGTH_SHORT).show(); + }; + + private final Runnable mMoveScrollableSuggestionsToFg = () -> { + mScrollableSuggestionsClip.setZOrderedOnTop(true); + Toast.makeText(AutofillImeService.this, "Chips moved to fg - clickable", + Toast.LENGTH_SHORT).show(); + }; + + private final Runnable mMoveScrollableSuggestionsUp = () -> { + mSuggestionStrip.animate().translationY(-50).setDuration(500).start(); + Toast.makeText(AutofillImeService.this, "Animating up", + Toast.LENGTH_SHORT).show(); + }; + + private final Runnable mMoveScrollableSuggestionsDown = () -> { + mSuggestionStrip.animate().translationY(0).setDuration(500).start(); + Toast.makeText(AutofillImeService.this, "Animating down", + Toast.LENGTH_SHORT).show(); + }; + + private ResponseState mResponseState = ResponseState.RESET; + private Runnable mDelayedDeletion; + private Runnable mPendingResponse; + + @Override + public View onCreateInputView() { + mInputView = (InputView) LayoutInflater.from(this).inflate(R.layout.input_view, null); + mKeyboard = Keyboard.qwerty(this); + mInputView.addView(mKeyboard.inflateKeyboardView(LayoutInflater.from(this), mInputView)); + mSuggestionStrip = mInputView.findViewById(R.id.suggestion_strip); + mPinnedSuggestionsStart = mInputView.findViewById(R.id.pinned_suggestions_start); + mPinnedSuggestionsEnd = mInputView.findViewById(R.id.pinned_suggestions_end); + mScrollableSuggestionsClip = mInputView.findViewById(R.id.scrollable_suggestions_clip); + mScrollableSuggestions = mInputView.findViewById(R.id.scrollable_suggestions); + return mInputView; + } + + @Override + public void onStartInput(EditorInfo attribute, boolean restarting) { + super.onStartInput(attribute, restarting); + mDecoder = new Decoder(getCurrentInputConnection()); + if(mKeyboard != null) { + mKeyboard.reset(); + } + if (mResponseState == ResponseState.RECEIVE_RESPONSE) { + mResponseState = ResponseState.START_INPUT; + } else { + mResponseState = ResponseState.RESET; + } + } + + @Override + public void onFinishInput() { + super.onFinishInput(); + } + + private void cancelPendingResponse() { + if (mPendingResponse != null) { + Log.d(TAG, "Canceling pending response"); + mHandler.removeCallbacks(mPendingResponse); + mPendingResponse = null; + } + } + + private void postPendingResponse(InlineSuggestionsResponse response) { + cancelPendingResponse(); + final List inlineSuggestions = response.getInlineSuggestions(); + mResponseState = ResponseState.RECEIVE_RESPONSE; + mPendingResponse = () -> { + mPendingResponse = null; + if (mResponseState == ResponseState.START_INPUT && inlineSuggestions.isEmpty()) { + scheduleDelayedDeletion(); + } else { + inflateThenShowSuggestions(inlineSuggestions); + } + mResponseState = ResponseState.RESET; + }; + mHandler.post(mPendingResponse); + } + + private void cancelDelayedDeletion(String msg) { + if(mDelayedDeletion != null) { + Log.d(TAG, msg + " canceling delayed deletion"); + mHandler.removeCallbacks(mDelayedDeletion); + mDelayedDeletion = null; + } + } + + private void scheduleDelayedDeletion() { + if (mInputView != null && mDelayedDeletion == null) { + // We delay the deletion of the suggestions from previous input connection, to avoid + // the flicker caused by deleting them and immediately showing new suggestions for + // the current input connection. + Log.d(TAG, "Scheduling a delayed deletion of inline suggestions"); + mDelayedDeletion = () -> { + Log.d(TAG, "Executing scheduled deleting inline suggestions"); + mDelayedDeletion = null; + clearInlineSuggestionStrip(); + }; + mHandler.postDelayed(mDelayedDeletion, 200); + } + } + + private void clearInlineSuggestionStrip() { + if (mInputView != null) { + updateInlineSuggestionStrip(Collections.emptyList()); + } + } + + @Override + public void onStartInputView(EditorInfo info, boolean restarting) { + super.onStartInputView(info, restarting); + } + + @Override + public void onFinishInputView(boolean finishingInput) { + super.onFinishInputView(finishingInput); + if (!finishingInput) { + // This runs when the IME is hide (but not finished). We need to clear the suggestions. + // Otherwise, they will stay on the screen for a bit after the IME window disappears. + // TODO: right now the framework resends the suggestions when onStartInputView is + // called. If the framework is changed to not resend, then we need to cache the + // inline suggestion views locally and re-attach them when the IME is shown again by + // onStartInputView. + clearInlineSuggestionStrip(); + } + } + + @Override + public void onComputeInsets(Insets outInsets) { + super.onComputeInsets(outInsets); + if (mInputView != null) { + outInsets.contentTopInsets += mInputView.getTopInsets(); + } + outInsets.touchableInsets = Insets.TOUCHABLE_INSETS_CONTENT; + } + + /***************** Inline Suggestions Demo Code *****************/ + + private static final String TAG = "AutofillImeService"; + + @Override + public InlineSuggestionsRequest onCreateInlineSuggestionsRequest(Bundle uiExtras) { + Log.d(TAG, "onCreateInlineSuggestionsRequest() called"); + StylesBuilder stylesBuilder = UiVersions.newStylesBuilder(); + Style style = InlineSuggestionUi.newStyleBuilder() + .setSingleIconChipStyle( + new ViewStyle.Builder() + .setBackground( + Icon.createWithResource(this, R.drawable.chip_background)) + .setPadding(0, 0, 0, 0) + .build()) + .setChipStyle( + new ViewStyle.Builder() + .setBackground( + Icon.createWithResource(this, R.drawable.chip_background)) + .setPadding(toPixel(5 + 8), 0, toPixel(5 + 8), 0) + .build()) + .setStartIconStyle(new ImageViewStyle.Builder().setLayoutMargin(0, 0, 0, 0).build()) + .setTitleStyle( + new TextViewStyle.Builder() + .setLayoutMargin(toPixel(4), 0, toPixel(4), 0) + .setTextColor(Color.parseColor("#FF202124")) + .setTextSize(16) + .build()) + .setSubtitleStyle( + new TextViewStyle.Builder() + .setLayoutMargin(0, 0, toPixel(4), 0) + .setTextColor(Color.parseColor("#99202124")) // 60% opacity + .setTextSize(14) + .build()) + .setEndIconStyle(new ImageViewStyle.Builder().setLayoutMargin(0, 0, 0, 0).build()) + .build(); + stylesBuilder.addStyle(style); + Bundle stylesBundle = stylesBuilder.build(); + + final ArrayList presentationSpecs = new ArrayList<>(); + presentationSpecs.add(new InlinePresentationSpec.Builder(new Size(100, getHeight()), + new Size(740, getHeight())).setStyle(stylesBundle).build()); + presentationSpecs.add(new InlinePresentationSpec.Builder(new Size(100, getHeight()), + new Size(740, getHeight())).setStyle(stylesBundle).build()); + + return new InlineSuggestionsRequest.Builder(presentationSpecs) + .setMaxSuggestionCount(6) + .build(); + } + + private int toPixel(int dp) { + return (int) TypedValue.applyDimension(COMPLEX_UNIT_DIP, dp, + getResources().getDisplayMetrics()); + } + + private int getHeight() { + return getResources().getDimensionPixelSize(R.dimen.keyboard_header_height); + } + + @Override + public boolean onInlineSuggestionsResponse(InlineSuggestionsResponse response) { + Log.d(TAG, + "onInlineSuggestionsResponse() called: " + response.getInlineSuggestions().size()); + cancelDelayedDeletion("onInlineSuggestionsResponse"); + postPendingResponse(response); + return true; + } + + private void updateInlineSuggestionStrip(List suggestionItems) { + Log.d(TAG, "Actually updating the suggestion strip: " + suggestionItems.size()); + mPinnedSuggestionsStart.removeAllViews(); + mScrollableSuggestions.removeAllViews(); + mPinnedSuggestionsEnd.removeAllViews(); + + if (suggestionItems.isEmpty()) { + return; + } + + // TODO: refactor me + mScrollableSuggestionsClip.setBackgroundColor( + getColor(R.color.suggestion_strip_background)); + mSuggestionStrip.setVisibility(View.VISIBLE); + + for (SuggestionItem suggestionItem : suggestionItems) { + if (suggestionItem == null) { + continue; + } + final InlineContentView suggestionView = suggestionItem.mView; + if (suggestionItem.mIsPinned) { + if (mPinnedSuggestionsStart.getChildCount() <= 0) { + mPinnedSuggestionsStart.addView(suggestionView); + } else { + mPinnedSuggestionsEnd.addView(suggestionView); + } + } else { + mScrollableSuggestions.addView(suggestionView); + } + } + + if (SHOWCASE_BG_FG_TRANSITION) { + rescheduleShowcaseBgFgTransitions(); + } + if (SHOWCASE_UP_DOWN_TRANSITION) { + rescheduleShowcaseUpDownTransitions(); + } + } + + private void rescheduleShowcaseBgFgTransitions() { + final Handler handler = mInputView.getHandler(); + handler.removeCallbacks(mMoveScrollableSuggestionsToBg); + handler.postDelayed(mMoveScrollableSuggestionsToBg, MOVE_SUGGESTIONS_TO_BG_TIMEOUT); + handler.removeCallbacks(mMoveScrollableSuggestionsToFg); + handler.postDelayed(mMoveScrollableSuggestionsToFg, MOVE_SUGGESTIONS_TO_FG_TIMEOUT); + } + + private void rescheduleShowcaseUpDownTransitions() { + final Handler handler = mInputView.getHandler(); + handler.removeCallbacks(mMoveScrollableSuggestionsUp); + handler.postDelayed(mMoveScrollableSuggestionsUp, MOVE_SUGGESTIONS_UP_TIMEOUT); + handler.removeCallbacks(mMoveScrollableSuggestionsDown); + handler.postDelayed(mMoveScrollableSuggestionsDown, MOVE_SUGGESTIONS_DOWN_TIMEOUT); + } + + private void inflateThenShowSuggestions( List inlineSuggestions) { + final int totalSuggestionsCount = inlineSuggestions.size(); + if (inlineSuggestions.isEmpty()) { + // clear the suggestions and then return + getMainExecutor().execute(() -> updateInlineSuggestionStrip(Collections.EMPTY_LIST)); + return; + } + + final Map suggestionMap = Collections.synchronizedMap(( + new TreeMap<>())); + final ExecutorService executor = Executors.newSingleThreadExecutor(); + + for (int i = 0; i < totalSuggestionsCount; i++) { + final int index = i; + final InlineSuggestion inlineSuggestion = inlineSuggestions.get(i); + final Size size = new Size(ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT); + + inlineSuggestion.inflate(this, size, executor, suggestionView -> { + Log.d(TAG, "new inline suggestion view ready"); + if(suggestionView != null) { + suggestionView.setOnClickListener((v) -> { + Log.d(TAG, "Received click on the suggestion"); + }); + suggestionView.setOnLongClickListener((v) -> { + Log.d(TAG, "Received long click on the suggestion"); + return true; + }); + final SuggestionItem suggestionItem = new SuggestionItem( + suggestionView, /*isAction*/ inlineSuggestion.getInfo().isPinned()); + suggestionMap.put(index, suggestionItem); + } else { + suggestionMap.put(index, null); + } + + // Update the UI once the last inflation completed + if (suggestionMap.size() >= totalSuggestionsCount) { + final ArrayList suggestionItems = new ArrayList<>( + suggestionMap.values()); + getMainExecutor().execute(() -> updateInlineSuggestionStrip(suggestionItems)); + } + }); + } + } + + void handle(String data) { + Log.d(TAG, "handle() called: [" + data + "]"); + mDecoder.decodeAndApply(data); + } + + static class SuggestionItem { + final InlineContentView mView; + final boolean mIsPinned; + + SuggestionItem(InlineContentView view, boolean isPinned) { + mView = view; + mIsPinned = isPinned; + } + } + + enum ResponseState { + RESET, + RECEIVE_RESPONSE, + START_INPUT, + } +} diff --git a/samples/AutofillKeyboard/src/com/example/android/autofillkeyboard/Decoder.java b/samples/AutofillKeyboard/src/com/example/android/autofillkeyboard/Decoder.java new file mode 100644 index 000000000..222d18163 --- /dev/null +++ b/samples/AutofillKeyboard/src/com/example/android/autofillkeyboard/Decoder.java @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.android.autofillkeyboard; + +import android.view.KeyEvent; +import android.view.inputmethod.InputConnection; + +/** Decodes key data and applies changes to {@link InputConnection}. */ +final class Decoder { + + private final InputConnection mInputConnection; + + Decoder(InputConnection inputConnection) { + this.mInputConnection = inputConnection; + } + + void decodeAndApply(String data) { + if ("DEL".equals(data)) { + mInputConnection.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL)); + } else if ("ENT".equals(data)) { + mInputConnection.sendKeyEvent( + new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER)); + } else if ("SPA".equals(data)) { + mInputConnection.sendKeyEvent( + new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_SPACE)); + } else { + mInputConnection.commitText(data, 1); + } + } + + boolean isEmpty() { + if (mInputConnection.getTextBeforeCursor(1, 0).length() == 0 + && mInputConnection.getTextAfterCursor(1, 0).length() == 0) { + return true; + } + return false; + } +} diff --git a/samples/AutofillKeyboard/src/com/example/android/autofillkeyboard/InlineContentClipView.java b/samples/AutofillKeyboard/src/com/example/android/autofillkeyboard/InlineContentClipView.java new file mode 100644 index 000000000..b4d2c546a --- /dev/null +++ b/samples/AutofillKeyboard/src/com/example/android/autofillkeyboard/InlineContentClipView.java @@ -0,0 +1,185 @@ +/* + * Copyright 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.android.autofillkeyboard; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.PixelFormat; +import android.graphics.Rect; +import android.os.Build; +import android.util.AttributeSet; +import android.view.Choreographer; +import android.view.Surface; +import android.view.SurfaceHolder; +import android.view.SurfaceView; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewTreeObserver; +import android.widget.inline.InlineContentView; +import android.widget.FrameLayout; + +import androidx.annotation.AttrRes; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; +import androidx.collection.ArraySet; + +/** + * This class is a container for showing {@link InlineContentView}s for cases + * where you want to ensure they appear only in a given area in your app. An + * example is having a scrollable list of items. Note that without this container + * the InlineContentViews' surfaces would cover parts of your app as these surfaces + * are owned by another process and always appearing on top of your app. + */ +@RequiresApi(api = Build.VERSION_CODES.R) +public class InlineContentClipView extends FrameLayout { + @NonNull + private final ArraySet mClippedDescendants = new ArraySet<>(); + + @NonNull + private final ViewTreeObserver.OnDrawListener mOnDrawListener = + this::clipDescendantInlineContentViews; + + @NonNull + private final Rect mParentBounds = new Rect(); + + @NonNull + private final Rect mContentBounds = new Rect(); + + @NonNull + private SurfaceView mBackgroundView; + + private int mBackgroundColor; + + public InlineContentClipView(@NonNull Context context) { + this(context, /*attrs*/ null); + } + + public InlineContentClipView(@NonNull Context context, @Nullable AttributeSet attrs) { + this(context, attrs, /*defStyleAttr*/ 0); + } + + public InlineContentClipView(@NonNull Context context, @Nullable AttributeSet attrs, + @AttrRes int defStyleAttr) { + super(context, attrs, defStyleAttr); + + mBackgroundView = new SurfaceView(context); + mBackgroundView.setZOrderOnTop(true); + mBackgroundView.getHolder().setFormat(PixelFormat.TRANSPARENT); + mBackgroundView.setLayoutParams(new ViewGroup.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT)); + mBackgroundView.getHolder().addCallback(new SurfaceHolder.Callback() { + @Override + public void surfaceCreated(@NonNull SurfaceHolder holder) { + drawBackgroundColorIfReady(); + } + + @Override + public void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, + int height) { /*do nothing*/ } + + @Override + public void surfaceDestroyed(@NonNull SurfaceHolder holder) { + /*do nothing*/ + } + }); + + addView(mBackgroundView); + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + getViewTreeObserver().addOnDrawListener(mOnDrawListener); + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + getViewTreeObserver().removeOnDrawListener(mOnDrawListener); + } + + @Override + public void setBackgroundColor(int color) { + mBackgroundColor = color; + Choreographer.getInstance().postFrameCallback((frameTimeNanos) -> + drawBackgroundColorIfReady()); + } + + private void drawBackgroundColorIfReady() { + final Surface surface = mBackgroundView.getHolder().getSurface(); + if (surface.isValid()) { + final Canvas canvas = surface.lockCanvas(null); + try { + canvas.drawColor(mBackgroundColor); + } finally { + surface.unlockCanvasAndPost(canvas); + } + } + } + + /** + * Sets whether the surfaces of the {@link InlineContentView}s wrapped by this view + * should appear on top or behind this view's window. Normally, they are placed on top + * of the window, to allow interaction ith the embedded UI. Via this method, you can + * place the surface below the window. This means that all of the contents of the window + * this view is in will be visible on top of the {@link InlineContentView}s' surfaces. + * + * @param onTop Whether to show the surface on top of this view's window. + * + * @see InlineContentView + * @see InlineContentView#setZOrderedOnTop(boolean) + */ + public void setZOrderedOnTop(boolean onTop) { + mBackgroundView.setZOrderOnTop(onTop); + for (InlineContentView inlineContentView : mClippedDescendants) { + inlineContentView.setZOrderedOnTop(onTop); + } + } + + private void clipDescendantInlineContentViews() { + mParentBounds.right = getWidth(); + mParentBounds.bottom = getHeight(); + mClippedDescendants.clear(); + clipDescendantInlineContentViews(this); + } + + private void clipDescendantInlineContentViews(@Nullable View root) { + if (root == null) { + return; + } + + if (root instanceof InlineContentView) { + final InlineContentView inlineContentView = (InlineContentView) root; + mContentBounds.set(mParentBounds); + offsetRectIntoDescendantCoords(inlineContentView, mContentBounds); + inlineContentView.setClipBounds(mContentBounds); + mClippedDescendants.add(inlineContentView); + return; + } + + if (root instanceof ViewGroup) { + final ViewGroup rootGroup = (ViewGroup) root; + final int childCount = rootGroup.getChildCount(); + for (int i = 0; i < childCount; i++) { + final View child = rootGroup.getChildAt(i); + clipDescendantInlineContentViews(child); + } + } + } +} \ No newline at end of file diff --git a/samples/AutofillKeyboard/src/com/example/android/autofillkeyboard/InputView.java b/samples/AutofillKeyboard/src/com/example/android/autofillkeyboard/InputView.java new file mode 100644 index 000000000..5f6717765 --- /dev/null +++ b/samples/AutofillKeyboard/src/com/example/android/autofillkeyboard/InputView.java @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.android.autofillkeyboard; + +import android.content.Context; +import android.util.AttributeSet; +import android.widget.FrameLayout; + +/** The root view for the Input Method. */ +public final class InputView extends FrameLayout { + + // If true, this InputView will simulate Gboard's InputView behavior, which expands its + // region to the entire window regardless of its content view's size. + private static final boolean EXPAND_TO_WINDOW = false; + + private int mRealHeight; + + public InputView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + mRealHeight = getMeasuredHeight(); + if (EXPAND_TO_WINDOW && MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.AT_MOST) { + setMeasuredDimension(getMeasuredWidth(), MeasureSpec.getSize(heightMeasureSpec)); + } + } + + int getTopInsets() { + return getMeasuredHeight() - mRealHeight; + } +} diff --git a/samples/AutofillKeyboard/src/com/example/android/autofillkeyboard/Keyboard.java b/samples/AutofillKeyboard/src/com/example/android/autofillkeyboard/Keyboard.java new file mode 100644 index 000000000..334cdf5dd --- /dev/null +++ b/samples/AutofillKeyboard/src/com/example/android/autofillkeyboard/Keyboard.java @@ -0,0 +1,134 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.android.autofillkeyboard; + +import android.util.SparseArray; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.TextView; + +/** Controls the visible virtual keyboard view. */ +final class Keyboard { + + private static final int NUM_STATES = 4; + private static final int STATE_SHIFT = 1; + private static final int STATE_SYMBOL = 2; + + private final AutofillImeService mAutofillImeService; + private final int mViewResId; + private final SparseArray mKeyMapping; + private View mKeyboardView; + private int mState; + + private Keyboard(AutofillImeService autofillImeService, int viewResId, + SparseArray keyMapping) { + this.mAutofillImeService = autofillImeService; + this.mViewResId = viewResId; + this.mKeyMapping = keyMapping; + this.mState = 0; + } + + private static String getLabel(String data) { + if ("SHI".equals(data)) { + return "↑"; + } else if ("DEL".equals(data)) { + return "←"; + } else if ("SYM".equals(data)) { + return "?123"; + } else if ("SPA".equals(data)) { + return "[ ]"; + } else if ("ENT".equals(data)) { + return "↩"; + } else { + return data; + } + } + + static Keyboard qwerty(AutofillImeService autofillImeService) { + SparseArray keyMapping = new SparseArray<>(); + keyMapping.put(R.id.key_pos_0_0, "qQ1\u007E"); + keyMapping.put(R.id.key_pos_0_1, "wW2\u0060"); + keyMapping.put(R.id.key_pos_0_2, "eE3\u007C"); + keyMapping.put(R.id.key_pos_0_3, "rR4\u2022"); + keyMapping.put(R.id.key_pos_0_4, "tT5\u221A"); + keyMapping.put(R.id.key_pos_0_5, "yY6\u03C0"); + keyMapping.put(R.id.key_pos_0_6, "uU7\u00F7"); + keyMapping.put(R.id.key_pos_0_7, "iI8\u00D7"); + keyMapping.put(R.id.key_pos_0_8, "oO9\u00B6"); + keyMapping.put(R.id.key_pos_0_9, "pP0\u2206"); + keyMapping.put(R.id.key_pos_1_0, "aA@\u00A3"); + keyMapping.put(R.id.key_pos_1_1, "sS#\u00A2"); + keyMapping.put(R.id.key_pos_1_2, "dD$\u20AC"); + keyMapping.put(R.id.key_pos_1_3, "fF_\u00A5"); + keyMapping.put(R.id.key_pos_1_4, "gG&\u005E"); + keyMapping.put(R.id.key_pos_1_5, "hH-="); + keyMapping.put(R.id.key_pos_1_6, "jJ+{"); + keyMapping.put(R.id.key_pos_1_7, "kK(}"); + keyMapping.put(R.id.key_pos_1_8, "lL)\\"); + keyMapping.put(R.id.key_pos_2_0, "zZ*%"); + keyMapping.put(R.id.key_pos_2_1, "xX\"\u00A9"); + keyMapping.put(R.id.key_pos_2_2, "cC'\u00AE"); + keyMapping.put(R.id.key_pos_2_3, "vV:\u2122"); + keyMapping.put(R.id.key_pos_2_4, "bB;\u2713"); + keyMapping.put(R.id.key_pos_2_5, "nN!["); + keyMapping.put(R.id.key_pos_2_6, "mM?]"); + keyMapping.put(R.id.key_pos_bottom_0, ",,,<"); + keyMapping.put(R.id.key_pos_bottom_1, "...>"); + keyMapping.put(R.id.key_pos_shift, "SHI"); + keyMapping.put(R.id.key_pos_del, "DEL"); + keyMapping.put(R.id.key_pos_symbol, "SYM"); + keyMapping.put(R.id.key_pos_space, "SPA"); + keyMapping.put(R.id.key_pos_enter, "ENT"); + return new Keyboard(autofillImeService, R.layout.keyboard_10_9_9, keyMapping); + } + + View inflateKeyboardView(LayoutInflater inflater, InputView inputView) { + mKeyboardView = inflater.inflate(mViewResId, inputView, false); + mapKeys(); + return mKeyboardView; + } + + void reset() { + mState = 0; + mapKeys(); + } + + private void mapKeys() { + for (int i = 0; i < mKeyMapping.size(); i++) { + TextView softkey = mKeyboardView.findViewById(mKeyMapping.keyAt(i)); + String rawData = mKeyMapping.valueAt(i); + String data = rawData.length() != NUM_STATES ? rawData : rawData.substring(mState, + mState + 1); + softkey.setText(getLabel(data)); + softkey.setOnClickListener(v -> handle(data)); + } + } + + private void handle(String data) { + if ("SHI".equals(data)) { + // Toggle STATE_SHIFT. + mState = mState ^ STATE_SHIFT; + mapKeys(); + } else if ("SYM".equals(data)) { + // Toggle STATE_SYMBOL and clear STATE_SHIFT. + mState = (mState ^ STATE_SYMBOL) & ~STATE_SHIFT; + mapKeys(); + } else { + mAutofillImeService.handle(data); + } + } +} diff --git a/samples/InlineFillService/Android.bp b/samples/InlineFillService/Android.bp new file mode 100644 index 000000000..f8d65d0c9 --- /dev/null +++ b/samples/InlineFillService/Android.bp @@ -0,0 +1,26 @@ +// Copyright (C) 2019 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +android_app { + name: "InlineFillService", + srcs: [ + "src/**/*.java", + ], + resource_dirs: ["res"], + sdk_version: "system_current", + static_libs: [ + "androidx.annotation_annotation", + "androidx.autofill_autofill" + ], +} \ No newline at end of file diff --git a/samples/InlineFillService/AndroidManifest.xml b/samples/InlineFillService/AndroidManifest.xml new file mode 100644 index 000000000..fa002f1ef --- /dev/null +++ b/samples/InlineFillService/AndroidManifest.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + diff --git a/samples/InlineFillService/res/drawable-hdpi/ic_launcher.png b/samples/InlineFillService/res/drawable-hdpi/ic_launcher.png new file mode 100644 index 000000000..a301d5795 Binary files /dev/null and b/samples/InlineFillService/res/drawable-hdpi/ic_launcher.png differ diff --git a/samples/InlineFillService/res/drawable-ldpi/ic_launcher.png b/samples/InlineFillService/res/drawable-ldpi/ic_launcher.png new file mode 100644 index 000000000..2c2a58b2f Binary files /dev/null and b/samples/InlineFillService/res/drawable-ldpi/ic_launcher.png differ diff --git a/samples/InlineFillService/res/drawable-mdpi/ic_launcher.png b/samples/InlineFillService/res/drawable-mdpi/ic_launcher.png new file mode 100644 index 000000000..f91f736fe Binary files /dev/null and b/samples/InlineFillService/res/drawable-mdpi/ic_launcher.png differ diff --git a/samples/InlineFillService/res/drawable-xhdpi/ic_launcher.png b/samples/InlineFillService/res/drawable-xhdpi/ic_launcher.png new file mode 100644 index 000000000..96095ec84 Binary files /dev/null and b/samples/InlineFillService/res/drawable-xhdpi/ic_launcher.png differ diff --git a/samples/InlineFillService/res/drawable/ic_settings.png b/samples/InlineFillService/res/drawable/ic_settings.png new file mode 100644 index 000000000..eaf1d4758 Binary files /dev/null and b/samples/InlineFillService/res/drawable/ic_settings.png differ diff --git a/samples/InlineFillService/res/layout/auth_activity.xml b/samples/InlineFillService/res/layout/auth_activity.xml new file mode 100644 index 000000000..98f6ff888 --- /dev/null +++ b/samples/InlineFillService/res/layout/auth_activity.xml @@ -0,0 +1,47 @@ + + + + + + + +