Merge tag android-5.1.0_r1 into AOSP_5.1_MERGE
Change-Id: Id25e58facce91bd9c22ba5e6658db8ba93ac51c0
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 4ff88cf..bb4983b 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -21,6 +21,8 @@
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.MANAGE_USERS" />
+ <uses-permission android:name="android.permission.GET_ACCOUNTS" />
+ <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
<uses-permission android:name="android.permission.INSTALL_PACKAGES"/>
<uses-permission android:name="android.permission.DELETE_PACKAGES"/>
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS" />
@@ -48,6 +50,7 @@
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
<uses-permission android:name="android.permission.PERFORM_CDMA_PROVISIONING" />
+ <uses-permission android:name="android.permission.ACCESS_PDB_STATE" />
<application
android:allowClearUserData="false"
@@ -64,54 +67,58 @@
android:excludeFromRecents="true"
android:immersive="true"
android:launchMode="singleTop"
- android:theme="@style/SetupWorkSpaceTheme"
- android:screenOrientation="locked">
- <intent-filter>
+ android:theme="@style/SetupWorkSpaceTheme">
+ <intent-filter android:priority="10">
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="application/com.android.managedprovisioning" />
</intent-filter>
<!-- Do not change the following action. -->
- <intent-filter>
+ <intent-filter android:priority="10">
<action android:name="com.android.managedprovisioning.ACTION_PROVISION_MANAGED_DEVICE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
- android:name="ManagedProvisioningActivity"
+ android:name="ProfileOwnerPreProvisioningActivity"
android:excludeFromRecents="true"
android:immersive="true"
android:launchMode="singleTop"
- android:theme="@style/SetupWorkSpaceTheme"
- android:screenOrientation="locked">
- <intent-filter>
+ android:theme="@style/SetupWorkSpaceTheme">
+ <intent-filter android:priority="10">
<action android:name="android.app.action.PROVISION_MANAGED_PROFILE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
+ <activity
+ android:name="ProfileOwnerProvisioningActivity"
+ android:excludeFromRecents="true"
+ android:immersive="true"
+ android:launchMode="singleTop"
+ android:theme="@style/SetupWorkSpaceTheme">
+ </activity>
<activity-alias
- android:name="ManagedProvisioningActivityNoCallerCheck"
- android:targetActivity="ManagedProvisioningActivity"
+ android:name="ProfileOwnerProvisioningActivityNoCallerCheck"
+ android:targetActivity="ProfileOwnerPreProvisioningActivity"
android:permission="android.permission.MANAGE_USERS"
android:exported="true">
</activity-alias>
<activity
- android:name="UserConsentActivity"
- android:immersive="true"
- android:launchMode="singleTop"
- android:theme="@style/SetupWorkSpaceTheme"
- android:screenOrientation="locked">
- </activity>
- <activity
android:name="EncryptDeviceActivity"
android:immersive="true"
android:launchMode="singleTop"
- android:theme="@style/SetupWorkSpaceTheme"
- android:screenOrientation="locked">
+ android:theme="@style/SetupWorkSpaceTheme">
+ </activity>
+
+ <activity
+ android:name="WebActivity"
+ android:immersive="true"
+ android:launchMode="singleTop"
+ android:theme="@style/SetupWorkSpaceTheme">
</activity>
<service
- android:name="ManagedProvisioningService" >
+ android:name="ProfileOwnerProvisioningService" >
</service>
<service
android:name="DeviceOwnerProvisioningService" >
diff --git a/res/layout-large-land/user_consent.xml b/res/layout-large-land/user_consent.xml
index ca568e1..b3d7c43 100644
--- a/res/layout-large-land/user_consent.xml
+++ b/res/layout-large-land/user_consent.xml
@@ -29,21 +29,6 @@
android:layout_weight="6"
android:layout_width="0dp"
android:layout_height="fill_parent"/>
- <!-- Progress indicator that replaces main view during provisioning. -->
- <LinearLayout
- android:id="@+id/progress_container"
- android:layout_weight="8"
- android:layout_width="0dp"
- android:layout_height="fill_parent"
- android:visibility="gone"
- style="@style/MainTextContainer" >
- <TextView
- android:text="@string/setting_up_workspace"
- style="@style/MainText"/>
- <ProgressBar
- style="@style/ProgressBar"/>
- </LinearLayout>
- <!-- Main view -->
<include layout="@layout/user_consent_main_text"
android:layout_weight="8"
android:layout_width="0dp"
diff --git a/res/layout/learn_more_dialog.xml b/res/layout/learn_more_dialog.xml
index 576edfa..f8d5676 100644
--- a/res/layout/learn_more_dialog.xml
+++ b/res/layout/learn_more_dialog.xml
@@ -16,24 +16,38 @@
* limitations under the License.
*/
-->
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ style="@style/DialogFragmentTextContainer">
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- style="@style/MainTextContainer">
+ <ScrollView
+ android:layout_weight="1"
+ android:layout_height="0dp"
+ style="@style/ScrollView">
- <TextView
- android:id="@+id/learn_more_text1"
- style="@style/MainText"/>
+ <LinearLayout
+ android:layout_height="wrap_content"
+ android:layout_width="fill_parent"
+ android:orientation="vertical">
- <TextView
- android:id="@+id/learn_more_text2"
- android:text="@string/contact_your_admin_for_more_info"
- style="@style/MainText"/>
+ <TextView
+ android:id="@+id/learn_more_text1"
+ style="@style/MainText"/>
- <TextView
- android:id="@+id/learn_more_link"
- android:textColor="@color/colored_button"
- android:text="@string/learn_more_link"
- style="@style/MainText"/>
+ <TextView
+ android:id="@+id/learn_more_text2"
+ android:text="@string/contact_your_admin_for_more_info"
+ style="@style/MainText"/>
+
+ <TextView
+ android:id="@+id/learn_more_link"
+ android:textColor="@color/colored_button"
+ android:text="@string/learn_more_link"
+ style="@style/MainText"/>
+
+ </LinearLayout>
+
+ </ScrollView>
<RelativeLayout
android:layout_width="fill_parent"
diff --git a/res/layout/progress.xml b/res/layout/progress.xml
index 802bdab..34d25e3 100644
--- a/res/layout/progress.xml
+++ b/res/layout/progress.xml
@@ -18,9 +18,7 @@
-->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical">
+ style="@style/Container" >
<include layout="@layout/header_and_title"/>
<LinearLayout
style="@style/MainTextContainer">
diff --git a/res/layout/user_consent.xml b/res/layout/user_consent.xml
index 2b09712..2ccdfa5 100644
--- a/res/layout/user_consent.xml
+++ b/res/layout/user_consent.xml
@@ -20,19 +20,5 @@
xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/Container" >
<include layout="@layout/header_and_title"/>
-
- <!-- Progress indicator that replaces main view during provisioning. -->
- <LinearLayout
- android:id="@+id/progress_container"
- style="@style/MainTextContainer"
- android:visibility="gone" >
- <TextView
- android:text="@string/setting_up_workspace"
- style="@style/MainText"/>
- <ProgressBar
- style="@style/ProgressBar"/>
- </LinearLayout>
-
- <!-- Main view -->
<include layout="@layout/user_consent_main_text"/>
</LinearLayout>
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 6e95b87..847317a 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Kan nie die administrasieprogram gebruik nie. Komponente ontbreek of dit is korrup. Kontak jou IT-afdeling."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"Kon nie die administrasieprogram installeer nie"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Die administrasieprogram is nie op jou toestel geïnstalleer nie"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Hou op om op te stel?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Is jy seker jy wil ophou om op te stel?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Nee"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Ja"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"Kanselleer tans …"</string>
</resources>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index b5eb423..41a546c 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"የአስተዳዳሪ መተግበሪያውን መጠቀም አይቻልም። ክፍሎች ይጎድሉታል ወይም ተበላሽቷል። የአይቲ መምሪያዎን ያነጋግሩ።"</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"የአስተዳዳሪ መተግበሪያውን መጫን አልተቻለም"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"የአስተዳዳር መተግበሪያው በመሣሪያዎ ላይ አልተጫነም"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"ማዋቀር ይቁም?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"እርግጠኛ ነዎት ማዋቀር ማቆም ይፈልጋሉ?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"አይ"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"አዎ"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"በመሰረዝ ላይ..."</string>
</resources>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 7938e03..ff3c98a 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"يتعذر استخدام تطبيق المشرف. بعض المكونات مفقودة أو تالفة. يمكنك الاتصال بقسم تكنولوجيا المعلومات."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"يتعذر تثبيت التطبيق الإداري"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"لم يتم تثبيت التطبيق الإداري على جهازك"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"هل تريد إيقاف الإعداد؟"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"هل تريد بالتأكيد إيقاف الإعداد؟"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"لا"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"نعم"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"جارٍ الإلغاء..."</string>
</resources>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 11f2476..7bbac2d 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Приложението за администриране не може да се използва. В него липсват компоненти или то е повредено. Свържете се с отдела си за информационни технологии."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"Приложението за администриране не можа да се инсталира"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Приложението за администриране не е инсталирано на устройството ви"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Да се спре ли настройването?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Наистина ли искате да спрете настройването?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Не"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Да"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"Анулира се..."</string>
</resources>
diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml
index 7dc931f..9c29940 100644
--- a/res/values-bn-rBD/strings.xml
+++ b/res/values-bn-rBD/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"প্রশাসক অ্যাপ্লিকেশান ব্যবহার করা যাচ্ছে না। এতে কিছু উপাদান অনুপস্থিত আছে বা এটি ক্ষতিগ্রস্ত হয়েছে। আপনার IT বিভাগের সাথে যোগাযোগ করুন।"</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"প্রশাসক অ্যাপ্লিকেশান ইনস্টল করা যায়নি।"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"আপনার ডিভাইসে প্রশাসক অ্যাপ্লিকেশানটি ইনস্টল করা নেই"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"সেটআপ করা বন্ধ করবেন?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"আপনি কি সেটআপ প্রক্রিয়া বন্ধ করার বিষয়ে নিশ্চিত?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"না"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"হ্যাঁ"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"বাতিল হচ্ছে..."</string>
</resources>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 0324031..3a72f3e 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"No es pot fer servir l\'aplicació d\'administració perquè està malmesa o hi falten components. Contacta amb el departament de TI."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"No s\'ha pogut instal·lar l\'aplicació d\'administració."</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"L\'aplicació d\'administració no està instal·lada al dispositiu."</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Vols aturar la configuració?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Confirmes que vols aturar la configuració?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"No"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Sí"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"S\'està cancel·lant..."</string>
</resources>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index b99083d..1a68889 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Aplikaci pro správu nelze použít. Buď v ní chybí některé komponenty, nebo je poškozená. Obraťte se na oddělení IT."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"Instalace aplikace pro správu se nezdařila."</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Ve vašem zařízení není nainstalována aplikace pro správu."</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Zastavit nastavování?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Opravdu chcete nastavování zastavit?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Ne"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Ano"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"Rušení..."</string>
</resources>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 31f0085..157923f 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Administrationsappen kan ikke bruges. Den mangler komponenter eller er beskadiget. Kontakt din it-afdeling."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"Administrationsappen kunne ikke installeres"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Administrationsappen er ikke installeret på din enhed"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Vil du standse konfigurationen?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Er du sikker på, at du vil stoppe konfigurationen?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Nej"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Ja"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"Annullerer..."</string>
</resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 743e83e..9eddaa9 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Die Admin-App kann nicht genutzt werden. Sie wurde beschädigt oder es fehlen Komponenten. Bitte wenden Sie sich an Ihre IT-Abteilung."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"Die Admin-App konnte nicht installiert werden."</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Die Admin-App ist nicht auf Ihrem Gerät installiert."</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Einrichtung abbrechen?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Möchten Sie die Einrichtung wirklich beenden?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Nein"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Ja"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"Abbrechen..."</string>
</resources>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index ee1080d..8665b84 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Δεν ήταν δυνατή η χρήση της εφαρμογής διαχείρισης. Λείπουν στοιχεία ή είναι κατεστραμμένα. Επικοινωνήστε με το τμήμα πληροφορικής υποστήριξης."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"Δεν ήταν δυνατή η εγκατάσταση της εφαρμογής διαχείρισης"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Η εφαρμογή διαχείρισης δεν είναι εγκατεστημένη στη συσκευή σας"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Διακοπή ρύθμισης;"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Είστε βέβαιοι ότι θέλετε να διακόψετε τη ρύθμιση;"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Όχι"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Ναι"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"Γίνεται ακύρωση…"</string>
</resources>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index c5519eb..fc3379f 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Can\'t use the admin app. It\'s missing components or corrupted. Contact your IT department."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"Couldn\'t install the admin app"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"The admin app isn\'t installed on your device"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Stop setting up?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Are you sure that you want to stop setting up?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"No"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Yes"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"Cancelling ..."</string>
</resources>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index c5519eb..fc3379f 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Can\'t use the admin app. It\'s missing components or corrupted. Contact your IT department."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"Couldn\'t install the admin app"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"The admin app isn\'t installed on your device"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Stop setting up?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Are you sure that you want to stop setting up?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"No"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Yes"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"Cancelling ..."</string>
</resources>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index abaf7a9..0716516 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"No se puede usar la aplicación de administración. Hay componentes que faltan o que están dañados. Comunícate con el Departamento de TI."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"No se pudo instalar la aplicación de administración."</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"La aplicación de administración no está instalada en el dispositivo."</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"¿Detener la configuración?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"¿Confirmas que quieres detener la configuración?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"No"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Sí"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"Cancelando…"</string>
</resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 51ac446..c2491b1 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"No se puede utilizar la aplicación de administración porque faltan componentes o está dañada. Ponte en contacto con el administrador de TI."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"No se ha podido instalar la aplicación de administración"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"La aplicación de administración no está instalada en tu dispositivo"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"¿Detener configuración?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"¿Seguro que quieres detener la configuración?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"No"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Sí"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"Cancelando..."</string>
</resources>
diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml
index be2e2ab..720af3f 100644
--- a/res/values-et-rEE/strings.xml
+++ b/res/values-et-rEE/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Administraatori rakendust ei saa kasutada. See ei sisalda kõiki komponente või on rikutud. Võtke ühendust oma IT-osakonnaga."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"Administraatorirakendust ei õnnestunud installida"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Administraatorirakendus ei ole sellesse seadmesse installitud"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Kas peatada seadistamine?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Kas soovite kindlasti seadistamise peatada?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Ei"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Jah"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"Tühistamine …"</string>
</resources>
diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml
index 1f2863c..714f763 100644
--- a/res/values-eu-rES/strings.xml
+++ b/res/values-eu-rES/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Ezin da erabili administrazio-aplikazioa. Osagaiak falta zaizkio edo hondatuta dago. Jarri informatika-sailarekin harremanetan."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"Ezin izan da administrazio-aplikazioa instalatu"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Administrazio-aplikazioa ez dago gailuan instalatuta"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Konfiguratzeari utzi nahi diozu?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Ziur konfiguratzeari utzi nahi diozula?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Ez"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Bai"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"Bertan behera uzten…"</string>
</resources>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 4bcf447..17b92a2 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"برنامه سرپرست استفاده نمیشود. مؤلفههای آن وجود ندارند یا خراب هستند. با بخش فناوری اطلاعات مربوط به خودتان تماس بگیرید."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"برنامه سرپرستی نصب نشد"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"برنامه سرپرستی روی دستگاهتان نصب نشده است"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"راهاندازی متوقف شود؟"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"آیا مطمئنید که میخواهید راهاندازی را متوقف کنید؟"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"خیر"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"بله"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"در حال لغو..."</string>
</resources>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 10ff0ff..73cab78 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Hallintasovellusta ei voi käyttää. Sovellus on vioittunut tai siitä puuttuu komponentteja. Ota yhteyttä yrityksesi IT-osastoon."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"Hallintasovelluksen asentaminen epäonnistui"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Hallintasovellusta ei ole asennettu laitteeseen"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Keskeytetäänkö määrittäminen?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Haluatko varmasti keskeyttää määrittämisen?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Ei"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Kyllä"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"Peruutetaan..."</string>
</resources>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index 49e779f..e982065 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Impossible d\'utiliser l\'application d\'administration. Des composants sont manquants ou corrompus. Communiquez avec votre service informatique."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"Impossible d\'installer l\'application d\'administration"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"L\'application d\'administration n\'est pas installée sur votre appareil"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Arrêter la configuration?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Voulez-vous vraiment arrêter la configuration?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Non"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Oui"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"Annulation en cours…"</string>
</resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index c935df7..bcab1e1 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Impossible d\'utiliser l\'application d\'administration. Des composants sont manquants ou corrompus. Contactez votre service informatique."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"Impossible d\'installer l\'application d\'administration."</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"L\'application d\'administration n\'est pas installée sur votre appareil."</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Arrêter la configuration ?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Voulez-vous vraiment arrêter la configuration ?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Non"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Oui"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"Annulation en cours..."</string>
</resources>
diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml
index 678a334..b7a6a01 100644
--- a/res/values-gl-rES/strings.xml
+++ b/res/values-gl-rES/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Non se pode utilizar a aplicación de administración. Fáltanlle compoñentes ou está danada. Ponte en contacto co departamento de TI."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"Non se puido instalar a aplicación de administración"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"A aplicación de administración non está instalada no teu dispositivo"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Queres deter a configuración?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Estás seguro de que queres deter a configuración?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Non"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Si"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"Cancelando..."</string>
</resources>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 0f0d3c7..3456e6c 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"व्यवस्थापक ऐप्स का उपयोग नहीं किया जा सकता. उसमें घटक अनुपलब्ध हैं या वे दूषित हैं. अपने IT विभाग से संपर्क करें."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"व्यवस्थापक ऐप्स इंस्टॉल नहीं किया जा सका"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"व्यवस्थापक ऐप्स आपके डिवाइस पर इंस्टॉल नहीं है"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"सेट करना रोकें?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"क्या आप वाकई सेट किए जाने को रोकना चाहते हैं?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"नहीं"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"हां"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"रोका जा रहा है..."</string>
</resources>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 66834a5..ef5cd86 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Administratorska aplikacija ne može se upotrebljavati. Nedostaju joj neke komponente ili je oštećena. Obratite se IT odjelu."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"Instaliranje administratorske aplikacije nije uspjelo"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Na uređaju nije instalirana administratorska aplikacija"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Želite li prekinuti postavljanje?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Jeste li sigurni da želite prekinuti postavljanje?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Ne"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Da"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"Otkazivanje..."</string>
</resources>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 2724d68..dfea90e 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"A rendszergazda-alkalmazás nem használható, mivel egyes elemei hiányoznak vagy sérültek. Forduljon az informatikai részleghez."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"Nem lehetett telepíteni a rendszergazdai alkalmazást"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"A rendszergazdai alkalmazás nincs telepítve eszközén"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Megszakítja a beállítást?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Biztosan megszakítja a beállítást?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Nem"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Igen"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"Megszakítás…"</string>
</resources>
diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml
index 43bfbac..205a3a2 100644
--- a/res/values-hy-rAM/strings.xml
+++ b/res/values-hy-rAM/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Հնարավոր չէ օգտագործել ադմինիստրատորի ծրագիրը: Դրանում բացակայում են բաղադրիչներ կամ այն թերի է: Դիմեք ձեր տեխնիկական սպասարկման բաժին:"</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"Չհաջողվեց տեղադրել ադմինիստրատորի հավելվածը"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Ադմինիստրատորի հավելվածը տեղադրված չէ ձեր սարքում"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Դադարեցնե՞լ կարգավորումը:"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Դադարեցնե՞լ կարգավորումը:"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Ոչ"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Այո"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"Չեղարկում..."</string>
</resources>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index be5795a..1b2879c 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Tidak dapat menggunakan aplikasi admin. Komponen hilang atau rusak. Hubungi departemen TI Anda."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"Tidak dapat memasang aplikasi admin"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Aplikasi admin belum terpasang di perangkat Anda"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Berhenti menyiapkan?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Yakin ingin berhenti menyiapkan?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Tidak"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Ya"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"Membatalkan..."</string>
</resources>
diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml
index 9cc7f72..a645b23 100644
--- a/res/values-is-rIS/strings.xml
+++ b/res/values-is-rIS/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Ekki er hægt að nota stjórnforritið. Það skortir íhluti eða er skemmt. Hafðu samband við upplýsingatæknisvið."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"Ekki tókst að setja stjórnunarforritið upp"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Stjórnunarforritið er ekki uppsett á tækinu þínu"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Hætta uppsetningu?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Ertu viss um að þú viljir hætta uppsetningu?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Nei"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Já"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"Hættir við..."</string>
</resources>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 65dfccb..d40b2a5 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Impossibile utilizzare l\'app dell\'amministratore per componenti mancanti o danneggiati. Contatta il tuo reparto IT."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"Impossibile installare l\'app di amministrazione"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"L\'app di amministrazione non è stata installata sul tuo dispositivo"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Interrompere la configurazione?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Vuoi interrompere la configurazione?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"No"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Sì"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"Annullamento in corso..."</string>
</resources>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 5aaf5fb..37d73de 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"לא ניתן להשתמש באפליקציית הניהול. חסרים בה מרכיבים או שהיא פגומה. צור קשר עם מחלקת ה-IT שלך."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"לא ניתן להתקין את אפליקציית הניהול"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"אפליקציית הניהול לא מותקנת במכשיר שלך"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"האם להפסיק את תהליך ההגדרה?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"האם אתה בטוח שברצונך להפסיק את תהליך ההגדרה?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"לא"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"כן"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"מבטל..."</string>
</resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 9584d5b..68ec04c 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"管理アプリを使用できません。このアプリはコンポーネントがないか、破損しています。IT部門にお問い合わせください。"</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"管理アプリをインストールできませんでした"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"管理アプリが端末にインストールされていません"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"セットアップを中止しますか?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"セットアップを中止してもよろしいですか?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"いいえ"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"はい"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"キャンセル中..."</string>
</resources>
diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml
index 5bdc265..8e1daf6 100644
--- a/res/values-ka-rGE/strings.xml
+++ b/res/values-ka-rGE/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"ადმინისტრატორის აპის გამოყენება ვერ მოხერხდა. მას აკლია კომპონენტები, ან დაზიანებულია. დაუკავშირდით თქვენს IT განყოფილებას."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"ადმინისტრატორის აპი ვერ დაინსტალირდა."</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"ადმინისტრატორის აპი არ არის დაინსტალირებული თქვენს მოწყობილობაზე."</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"გსურთ, მომართვის შეჩერება?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"დარწმუნებული ხართ, რომ მომართვის შეწყვეტა გსურთ?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"არა"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"კი"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"უქმდება..."</string>
</resources>
diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml
index f0fcce6..4486b12 100644
--- a/res/values-kk-rKZ/strings.xml
+++ b/res/values-kk-rKZ/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Әкімші қолданбасын пайдалану мүмкін емес. Оның құрамдастары жетіспейді немесе ол бүлінген. АТ бөліміне хабарласыңыз."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"Әкімші қолданбасын орнату мүмкін болмады"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Құрылғыңызда әкімші қолданбасы орнатылмаған"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Реттеуді тоқтату керек пе?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Реттеуді тоқтату керек пе?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Жоқ"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Иә"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"Бас тартылуда…"</string>
</resources>
diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml
index e203151..09081ff 100644
--- a/res/values-km-rKH/strings.xml
+++ b/res/values-km-rKH/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"មិនអាចប្រើកម្មវិធីរបស់អ្នកគ្រប់គ្រង។ វាបាត់សមាសធាតុ ឬក៏ខូច។ ទាក់ទងផ្នែកបច្ចេកវិទ្យាព័ត៌មានរបស់អ្នក។"</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"មិនអាចដំឡើងកម្មវិធីគ្រប់គ្រង"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"កម្មវិធីគ្រប់គ្រងមិនត្រូវបានដំឡើងនៅលើឧបករណ៍របស់អ្នក"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"បញ្ឈប់ការរៀបចំ?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"តើអ្នកប្រាកដជាចង់បញ្ឈប់ការរៀបចំ?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"ទេ"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"បាទ/ចាស"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"កំពុងបោះបង់..."</string>
</resources>
diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml
index b20a7c3..a05f044 100644
--- a/res/values-kn-rIN/strings.xml
+++ b/res/values-kn-rIN/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"ನಿರ್ವಹಣೆ ಅಪ್ಲಿಕೇಶನ್ ಬಳಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಇದರಲ್ಲಿ ಕಾಂಪೊನೆಂಟ್ಗಳು ಕಾಣೆಯಾಗಿವೆ ಅಥವಾ ದೋಷಪೂರಿತವಾಗಿವೆ, ನಿಮ್ಮ IT ವಿಭಾಗವನ್ನು ಸಂಪರ್ಕಿಸಿ."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"ನಿರ್ವಹಣೆ ಅಪ್ಲಿಕೇಶನ್ ಸ್ಥಾಪಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"ನಿರ್ವಹಣೆ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಸ್ಥಾಪಿಸಲಾಗಿಲ್ಲ"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"ಹೊಂದಿಸುವುದನ್ನು ನಿಲ್ಲಿಸುವುದೇ?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"ಹೊಂದಿಸುವುದನ್ನು ನೀವು ನಿಲ್ಲಿಸಲು ಖಚಿತವಾಗಿ ಬಯಸುವಿರಾ?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"ಇಲ್ಲ"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"ಹೌದು"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"ರದ್ದುಗೊಳಿಸಲಾಗುತ್ತಿದೆ..."</string>
</resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 8dbe718..44f6f47 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"관리 앱을 사용할 수 없습니다. 구성요소가 없거나 손상되었습니다. IT 부서에 문의해 주시기 바랍니다."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"관리 앱을 설치할 수 없습니다."</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"기기에 관리 앱이 설치되어 있지 않습니다."</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"설정을 중지하시겠습니까?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"설정을 중지하시겠습니까?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"아니요"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"예"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"취소 중..."</string>
</resources>
diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml
index 9fe6713..0d3fcef 100644
--- a/res/values-ky-rKG/strings.xml
+++ b/res/values-ky-rKG/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Администратор колдонмосу иштебей жатат. Анын айрым курамдык бөлүктөрү жок же бузук. IT бөлүмүңүзгө кайрылыңыз."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"Администратор колдонмосу орнотулган жок"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Түзмөгүңүздө администратор колдонмосу орнотулган эмес"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Орнотуу токтотулсунбу?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Орнотуу чын эле токтотулсунбу?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Жок"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Ооба"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"Жокко чыгарылууда…"</string>
</resources>
diff --git a/res/values-large/dimens.xml b/res/values-large/dimens.xml
index 5389172..5a6a7f7 100644
--- a/res/values-large/dimens.xml
+++ b/res/values-large/dimens.xml
@@ -20,8 +20,8 @@
<!-- Main text -->
<dimen name="main_text_padding_left_right">40dp</dimen>
+ <dimen name="main_text_padding_top">16dp</dimen>
<dimen name="main_text_margins_left_right">64dp</dimen>
- <dimen name="main_text_container_padding_top">16dp</dimen>
<!-- Title -->
<dimen name="title_height">80dp</dimen>
diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml
index 67a42b9..3905c22 100644
--- a/res/values-lo-rLA/strings.xml
+++ b/res/values-lo-rLA/strings.xml
@@ -35,7 +35,7 @@
<string name="default_managed_profile_name" msgid="5370257687074907055">"ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກ"</string>
<string name="managed_profile_already_present" msgid="888277922880582498">"ທ່ານມີໂປຣໄຟລ໌ບ່ອນເຮັດວຽກໃນອຸປະກອນຂອງທ່ານຢູ່ແລ້ວ. ທ່ານຕ້ອງການລຶບອອກບໍ່?"</string>
<string name="sure_you_want_to_delete_profile" msgid="3612824117836349973">"ທ່ານແນ່ໃຈບໍ່ວ່າຕ້ອງການລຶບໂປຣໄຟລ໌ບ່ອນເຮັດວຽກນີ້ອອກ? ຂໍ້ມູນທັງໝົດຂອງມັນຈະຖືກລຶບອອກ."</string>
- <string name="delete_profile" msgid="7107020982626129151">"ລຶບ"</string>
+ <string name="delete_profile" msgid="7107020982626129151">"ລຶບ"</string>
<string name="cancel_delete_profile" msgid="5155447537894046036">"ຍົກເລີກ"</string>
<string name="encrypt_device_text" msgid="6762208577171389053">"ເພື່ອສືບຕໍ່ຕັ້ງຄ່າໂປຣໄຟລ໌ບ່ອນເຮັດວຽກຂອງທ່ານ, ທ່ານຈະຕ້ອງເຂົ້າລະຫັດອຸປະກອນຂອງທ່ານກ່ອນ. ຂັ້ນຕອນນີ້ຈະໃຊ້ເວລາໄລຍະນຶ່ງ."</string>
<string name="encrypt_device_cancel" msgid="5644516574936584926">"ຍົກເລີກ"</string>
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"ບໍ່ສາມາດໃຊ້ແອັບຯຜູ່ເບິ່ງແຍງລະບົບໄດ້. ມັນຂາດອົງປະກອບທີ່ຕ້ອງໃຊ້ ຫຼືໄຟລ໌ມີບັນຫາ. ໃຫ້ຕິດຕໍ່ພະແນກຂອງທ່ານ."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"ບໍ່ສາມາດຕິດຕັ້ງແອັບຯຜູ່ເບິ່ງແຍງລະບົບໄດ້"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"ບໍ່ມີແອັບຯຜູ່ເບິ່ງແຍງລະບົບຕິດຕັ້ງໃນອຸປະກອນຂອງທ່ານ"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"ຢຸດການຕິດຕັ້ງຫຼືບໍ່?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"ທ່ານແນ່ໃຈບໍ່ວ່າທ່ານຕ້ອງການຢຸດການຕິດຕັ້ງ?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"ບໍ່"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"ແມ່ນແລ້ວ"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"ກຳລັງຍົກເລີກ..."</string>
</resources>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index db5dc10..959f877 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Negalima naudoti administratoriaus programos. Trūksta jos komponentų arba ji sugadinta. Susisiekite su IT skyriumi."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"Nepavyko įdiegti administratoriaus programos"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Administratoriaus programa neįdiegta įrenginyje"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Stabdyti sąranką?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Ar tikrai norite sustabdyti sąranką?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Ne"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Taip"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"Atšaukiama..."</string>
</resources>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index e2ec4c5..9af6037 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Nevar izmantot administratora lietotni. Tajā trūkst komponentu, vai tā ir bojāta. Sazinieties ar IT nodaļu."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"Neizdevās instalēt administratora lietotni"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Administratora lietotne nav instalēta ierīcē"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Vai apturēt iestatīšanu?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Vai tiešām vēlaties apturēt iestatīšanu?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Nē"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Jā"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"Notiek atcelšana..."</string>
</resources>
diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml
index e3c721e..97f143a 100644
--- a/res/values-mk-rMK/strings.xml
+++ b/res/values-mk-rMK/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Не може да се користи администраторската апликација. Ѝ недостасуваат компоненти или е оштетена. Контактирајте со одделот за ИТ."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"Не можеше да се инсталира апликацијата за администратор"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Апликацијата за администратор не е инсталирана на уредот"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Да прекине поставувањето?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Дали сигурно сакате да го прекинете поставувањето?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Не"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Да"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"Се откажува..."</string>
</resources>
diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml
index 98f1b49..34b4f9e 100644
--- a/res/values-ml-rIN/strings.xml
+++ b/res/values-ml-rIN/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"അഡ്മിൻ അപ്ലിക്കേഷൻ ഉപയോഗിക്കാനാവില്ല. അതിന്റെ ഘടകഭാഗങ്ങൾ നഷ്ടപ്പെട്ടതോ കേടായതോ ആണ്. നിങ്ങളുടെ ഐടി വിഭാഗവുമായി ബന്ധപ്പെടുക."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"അഡ്മിൻ അപ്ലിക്കേഷൻ ഇൻസ്റ്റാളുചെയ്യാനായില്ല"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"നിങ്ങളുടെ ഉപകരണത്തിൽ അഡ്മിൻ അപ്ലിക്കേഷൻ ഇൻസ്റ്റാളുചെയ്തിട്ടില്ല"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"സജ്ജീകരിക്കൽ നിർത്തണോ?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"സജ്ജീകരിക്കൽ നിർത്തണമെന്ന് തീർച്ചയാണോ?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"അല്ല"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"അതെ"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"റദ്ദാക്കുന്നു..."</string>
</resources>
diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml
index 58e0a27..37de573 100644
--- a/res/values-mn-rMN/strings.xml
+++ b/res/values-mn-rMN/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Админ апп-г ашиглах боломжгүй. Бүрдэл дутагдсан эсхүл гэмтсэн байна. МТ хэлтэстэй холбогдоно уу."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"Админ апп-г суулгаж чадсангүй"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Таны төхөөрөмж дээр админ апп суугаагүй байна"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Тохируулгыг зогсоох уу?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Та тохируулгыг зогсоохдоо итгэлтэй байна уу?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Үгүй"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Тийм"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"Цуцлаж байна..."</string>
</resources>
diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml
index 400785a..857e74c 100644
--- a/res/values-mr-rIN/strings.xml
+++ b/res/values-mr-rIN/strings.xml
@@ -51,7 +51,7 @@
<string name="default_owned_device_username" msgid="3915120202811807955">"कार्य डिव्हाइसचा वापरकर्ता"</string>
<string name="setup_device" msgid="6725265673245816366">"आपले डिव्हाइस सेट करा"</string>
<string name="progress_data_process" msgid="7099462614425874283">"सेटअप डेटावर प्रक्रिया करत आहे..."</string>
- <string name="progress_connect_to_wifi" msgid="9214694010080838763">"Wi-Fi शी कनेक्ट करत आहे..."</string>
+ <string name="progress_connect_to_wifi" msgid="9214694010080838763">"वाय-फाय शी कनेक्ट करत आहे..."</string>
<string name="progress_download" msgid="4995057798189799156">"प्रशासन अॅप डाउनलोड करत आहे..."</string>
<string name="progress_install" msgid="9169411715762296097">"प्रशासन अॅप स्थापित करत आहे..."</string>
<string name="progress_set_owner" msgid="1292946927202510987">"डिव्हाइस मालक सेट करत आहे..."</string>
@@ -62,10 +62,15 @@
<string name="device_owner_error_reset" msgid="1609782972753569267">"रीसेट करा"</string>
<string name="device_owner_error_general" msgid="5962462955470123776">"आपले डिव्हाइस सेट करणे शक्य झाले नाही. आपल्या IT विभागाशी संपर्क साधा."</string>
<string name="device_owner_error_already_provisioned" msgid="1902305486832057049">"हे डिव्हाइस आधीपासून सेट केले आहे"</string>
- <string name="device_owner_error_wifi" msgid="4256310285761332378">"Wi-Fi ला कनेक्ट करू शकलो नाही"</string>
+ <string name="device_owner_error_wifi" msgid="4256310285761332378">"वाय-फाय ला कनेक्ट करू शकलो नाही"</string>
<string name="device_owner_error_hash_mismatch" msgid="184518450016295596">"एका checksum त्रुटीमुळे प्रशासन अॅप वापरणे शक्य झाले नाही. आपल्या IT विभागाशी संपर्क साधा."</string>
<string name="device_owner_error_download_failed" msgid="4520111971592657116">"प्रशासक अॅप डाउनलोड करणे शक्य झाले नाही"</string>
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"प्रशासन अॅप वापरणे शक्य नाही. ते गहाळ घटक किंवा दूषित आहेत. आपल्या IT विभागाशी संपर्क साधा."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"प्रशासक अॅप स्थापित करणे शक्य झाले नाही"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"आपल्या डिव्हाइसवर प्रशासक अॅप स्थापित केला नाही"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"सेट करणे थांबवायचे?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"आपल्याला खात्री आहे की आपण सेट करणे थांबवू इच्छिता?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"नाही"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"होय"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"रद्द करत आहे..."</string>
</resources>
diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml
index c105e51..4b251bc 100644
--- a/res/values-ms-rMY/strings.xml
+++ b/res/values-ms-rMY/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Tidak dapat menggunakan apl pentadbir. Apl ketiadaan komponen atau rosak. Hubungi jabatan IT anda."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"Tidak dapat memasang apl pentadbir"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Apl pentadbir tidak dipasang pada peranti anda"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Berhenti menyediakan?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Adakah anda pasti anda ingin menghentikan penyediaan?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Tidak"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Ya"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"Membatalkan..."</string>
</resources>
diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml
index e1456ab..396de3d 100644
--- a/res/values-my-rMM/strings.xml
+++ b/res/values-my-rMM/strings.xml
@@ -21,14 +21,14 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="4699090302771328296">"ကိရိယာကို စီမံဆောင်ရွက်ပေးသူ"</string>
<string name="provisioning_error_title" msgid="6320515739861578118">"အူးပ်စ်!"</string>
- <string name="setup_work_space" msgid="6539913744903244870">"သင်၏ ပရိုဖိုင်ကို စဖွင့်သတ်မှတ်ရန်"</string>
- <string name="company_controls_workspace" msgid="2808025277267917221">"သင်၏ အဖွဲ့အစည်းက ဒီပရိုဖိုင်ကို ထိန်းချုပ်လျက် လုံခြုံအောင် ထားရှိပါသည်။ သင်သည် သင့် ကိရိယာ ထဲက ကျန်အရာများကို ထိန်းချုပ်ပါသည်။"</string>
+ <string name="setup_work_space" msgid="6539913744903244870">"သင်၏ ပရိုဖိုင်ကို စဖွင့်သတ်မှတ်ရန်"</string>
+ <string name="company_controls_workspace" msgid="2808025277267917221">"သင်၏ အဖွဲ့အစည်းက ဒီပရိုဖိုင်ကို ထိန်းချုပ်လျက် လုံခြုံအောင် ထားရှိပါသည်။ သင်သည် သင့် ကိရိယာ ထဲက ကျန်အရာများကို ထိန်းချုပ်ပါသည်။"</string>
<string name="the_following_is_your_mdm" msgid="6613658218262376404">"အောက်ပါ appက ဒီပရိုဖိုင်ကို ရယူသုံးရန် လိုအပ်မည်:"</string>
- <string name="set_up" msgid="7012862095553564169">"စဖွင့်သတ်မှတ်ရန်"</string>
- <string name="setting_up_workspace" msgid="6116976629983614927">"သင်၏ အလုပ် ပရိုဖိုင်ကို စဖွင့်စီစဉ်နေ..."</string>
- <string name="admin_has_ability_to_monitor_profile" msgid="8782160676037188061">"သင်၏ စီမံအုပ်ချုပ်သူသည် ပရိုဖိုင်နှင့် ဆက်နွှယ်နေသည့် ဆက်တင်များ၊ လုပ်ငန်းဆိုင်ရာ ရယူသုံးမှုများ၊ appများ နှင့် ဒေတာများကို၊ ကွန်ရက် လှုပ်ရှားမှုများ နှင့် သင့် ကိရိယာ တည်နေရာ အချက်အလက်များ အပါအဝင်ကို၊ စောင့်ကြပ် စီမံကွပ်ကဲနိုင်စွမ်း ရှိပါသည်။"</string>
- <string name="admin_has_ability_to_monitor_device" msgid="4534011355086694158">"ဆက်တင်များ၊ လုပ်ငန်းဆိုင်ရာ အသုံးပြုမှုများ၊ appများ၊ ဒီကိရိယာနှင့် ဆက်စပ်နေသည့် ဒေတာကို၊ ကွန်ရက် လှုပ်ရှားမှု နှင့် သင့်ကိရိယာ၏ တည်နေရာ အချက်အလက်များအပါအဝင်ကို၊ သင်၏ စီမံအုပ်ချုပ်သူက စောင့်ကြည့်ပြီး စီမံကွပ်ကဲနိုင်သည်။"</string>
- <string name="contact_your_admin_for_more_info" msgid="6870084889394621288">"သင့်အဖွဲ့အစည်း၏ ကိုယ်ရေးမူဝါဒများ အပါအဝင်၊ တစ်ခြား အချက်အလက်များ အတွက် သင့်စီမံအုပ်ချုပ်သူကို ဆက်သွယ်ပါ။"</string>
+ <string name="set_up" msgid="7012862095553564169">"စဖွင့်သတ်မှတ်ရန်"</string>
+ <string name="setting_up_workspace" msgid="6116976629983614927">"သင်၏ အလုပ် ပရိုဖိုင်ကို စဖွင့်စီစဉ်နေ..."</string>
+ <string name="admin_has_ability_to_monitor_profile" msgid="8782160676037188061">"သင်၏ စီမံအုပ်ချုပ်သူသည် ပရိုဖိုင်နှင့် ဆက်နွှယ်နေသည့် ဆက်တင်များ၊ လုပ်ငန်းဆိုင်ရာ ရယူသုံးမှုများ၊ appများ နှင့် ဒေတာများကို၊ ကွန်ရက် လှုပ်ရှားမှုများ နှင့် သင့် ကိရိယာ တည်နေရာ အချက်အလက်များ အပါအဝင်ကို၊ စောင့်ကြပ် စီမံကွပ်ကဲနိုင်စွမ်း ရှိပါသည်။"</string>
+ <string name="admin_has_ability_to_monitor_device" msgid="4534011355086694158">"ဆက်တင်များ၊ လုပ်ငန်းဆိုင်ရာ အသုံးပြုမှုများ၊ appများ၊ ဒီကိရိယာနှင့် ဆက်စပ်နေသည့် ဒေတာကို၊ ကွန်ရက် လှုပ်ရှားမှု နှင့် သင့်ကိရိယာ၏ တည်နေရာ အချက်အလက်များအပါအဝင်ကို၊ သင်၏ စီမံအုပ်ချုပ်သူက စောင့်ကြည့်ပြီး စီမံကွပ်ကဲနိုင်သည်။"</string>
+ <string name="contact_your_admin_for_more_info" msgid="6870084889394621288">"သင့်အဖွဲ့အစည်း၏ ကိုယ်ရေးမူဝါဒများ အပါအဝင်၊ တစ်ခြား အချက်အလက်များ အတွက် သင့်စီမံအုပ်ချုပ်သူကို ဆက်သွယ်ပါ။"</string>
<string name="learn_more_link" msgid="3012495805919550043">"ပိုမိုသိလိုလျှင်"</string>
<string name="cancel_setup" msgid="2949928239276274745">"ထားတော့"</string>
<string name="ok_setup" msgid="5148111905838329307">"အိုကေ"</string>
@@ -41,31 +41,36 @@
<string name="encrypt_device_cancel" msgid="5644516574936584926">"ထားတော့"</string>
<string name="encrypt_device_launch_settings" msgid="826115154646195837">"လျှို့ဝှက်ကုဒ်သွင်း"</string>
<string name="continue_provisioning_notify_title" msgid="5191449100153186648">"လျှို့ဝှက်ကုဒ် သွင်းမှု ပြီးဆုံးသွားပြီ"</string>
- <string name="continue_provisioning_notify_text" msgid="3027317630111909095">"သင်၏ အလုပ် ပရိုဖိုင်ကို စဖွင့်သတ်မှတ်မှု ဆက်လုပ်ကိုင်ရန် ထိပါ"</string>
- <string name="managed_provisioning_error_text" msgid="7063621174570680890">"သင်၏ အလုပ် ပရိုဖိုင်ကို စဖွင့်စီစဉ် မရခဲ့ပါ။ သင်၏ IT ဌာနကို ဆက်သွယ်ပါ သို့မဟုတ် နောက်မှာ ထပ်စမ်းပါ။"</string>
- <string name="managed_provisioning_not_supported" msgid="6582227325719911795">"သင့်စက်က အလုပ်ပရိုဖိုင်များကို မပံ့ပိုးပါ။"</string>
+ <string name="continue_provisioning_notify_text" msgid="3027317630111909095">"သင်၏ အလုပ် ပရိုဖိုင်ကို စဖွင့်သတ်မှတ်မှု ဆက်လုပ်ကိုင်ရန် ထိပါ"</string>
+ <string name="managed_provisioning_error_text" msgid="7063621174570680890">"သင်၏ အလုပ် ပရိုဖိုင်ကို စဖွင့်စီစဉ် မရခဲ့ပါ။ သင်၏ IT ဌာနကို ဆက်သွယ်ပါ သို့မဟုတ် နောက်မှာ ထပ်စမ်းပါ။"</string>
+ <string name="managed_provisioning_not_supported" msgid="6582227325719911795">"သင့်စက်က အလုပ်ပရိုဖိုင်များကို မပံ့ပိုးပါ။"</string>
<string name="user_is_not_owner" msgid="4358772243716976929">"စက်ပိုင်ရှင်မှ အလုပ်ပရိုဖိုင်များကို စတင်သတ်မှတ်ရန်လိုသည်။"</string>
- <string name="managed_provisioning_not_supported_by_launcher" msgid="8710138269807942163">"သင့် အလုပ် ပရိုဖိုင်ကို ဒီဖွင့်တင်ရေး appမှ မပံ့ပိုးပါ။ သင်သည် လိုက်ဖက်သည့် ဖွင့်တင်ရေးစက်သို့ ပြောင်းရန် လိုသည်။"</string>
+ <string name="managed_provisioning_not_supported_by_launcher" msgid="8710138269807942163">"သင့် အလုပ် ပရိုဖိုင်ကို ဒီဖွင့်တင်ရေး appမှ မပံ့ပိုးပါ။ သင်သည် လိုက်ဖက်သည့် ဖွင့်တင်ရေးစက်သို့ ပြောင်းရန် လိုသည်။"</string>
<string name="cancel_provisioning" msgid="3408069559452653724">"ထားတော့"</string>
<string name="pick_launcher" msgid="4257084827403983845">"အိုကေ"</string>
<string name="default_owned_device_username" msgid="3915120202811807955">"အလုပ်စက်ပစ္စည်း အသုံးပြုသူ"</string>
- <string name="setup_device" msgid="6725265673245816366">"သင်၏ ကိရိယာကို စဖွင့်သတ်မှတ်ရန်"</string>
- <string name="progress_data_process" msgid="7099462614425874283">"စဖွင့်စီစဉ်ရေး ဒေတာကို စီမံဆောင်ရွက်နေ..."</string>
+ <string name="setup_device" msgid="6725265673245816366">"သင်၏ ကိရိယာကို စဖွင့်သတ်မှတ်ရန်"</string>
+ <string name="progress_data_process" msgid="7099462614425874283">"စဖွင့်စီစဉ်ရေး ဒေတာကို စီမံဆောင်ရွက်နေ..."</string>
<string name="progress_connect_to_wifi" msgid="9214694010080838763">"ကြိုးမဲ့သို့ ချိတ်ဆက်နေ..."</string>
<string name="progress_download" msgid="4995057798189799156">"စီမံအုပ်ချုပ်သူ appကို ဒေါင်းလုဒ် လုပ်နေ..."</string>
<string name="progress_install" msgid="9169411715762296097">"စီမံအုပ်ချုပ်သူ appကို တပ်ဆင်နေ..."</string>
- <string name="progress_set_owner" msgid="1292946927202510987">"ကိရိယာ ပိုင်ရှင်ကို စဖွင့်သတ်မှတ်နေ..."</string>
+ <string name="progress_set_owner" msgid="1292946927202510987">"ကိရိယာ ပိုင်ရှင်ကို စဖွင့်သတ်မှတ်နေ..."</string>
<string name="device_owner_cancel_title" msgid="7909285135975063120">"စဖွင့်သတ်မှတ်ခြင်း မလုပ်တော့ဘူးလား?"</string>
- <string name="device_owner_cancel_message" msgid="7928007377743469904">"သင်သည် စဖွင့်စီစဉ်မှုကို ရပ်စဲလိုက်ကာ သင့် ကိရိယာ၏ ဒေတာကို ဖျက်ပစ်လိုတာ သေချာသလား?"</string>
+ <string name="device_owner_cancel_message" msgid="7928007377743469904">"သင်သည် စဖွင့်စီစဉ်မှုကို ရပ်စဲလိုက်ကာ သင့် ကိရိယာ၏ ဒေတာကို ဖျက်ပစ်လိုတာ သေချာသလား?"</string>
<string name="device_owner_cancel_cancel" msgid="1052951540909389275">"ထားတော့"</string>
<string name="device_owner_error_ok" msgid="2556654993515978854">"အိုကေ"</string>
<string name="device_owner_error_reset" msgid="1609782972753569267">"ပြန်ညှိရန်"</string>
- <string name="device_owner_error_general" msgid="5962462955470123776">"သင်၏ ကိရိယာကို စဖွင့်စီစဉ် မပေးနိုင်ခဲ့ပါ။ သင်၏ IT ဌာနကို ဆက်သွယ်ပါ။"</string>
+ <string name="device_owner_error_general" msgid="5962462955470123776">"သင်၏ ကိရိယာကို စဖွင့်စီစဉ် မပေးနိုင်ခဲ့ပါ။ သင်၏ IT ဌာနကို ဆက်သွယ်ပါ။"</string>
<string name="device_owner_error_already_provisioned" msgid="1902305486832057049">"ဤစက်အား ပြင်ဆင်သတ်မှတ်ပြီး"</string>
<string name="device_owner_error_wifi" msgid="4256310285761332378">"ဝိုင်−ဖိုင်ကို ချိတ်ဆက်မရပါ"</string>
- <string name="device_owner_error_hash_mismatch" msgid="184518450016295596">"checksum အမှားကြောင့် စီမံအုပ်ချုပ်သူ appကို မသုံးနိုင်ခဲ့ပါ။ သင်၏ IT ဌာနကို ဆက်သွယ်ပါ။"</string>
+ <string name="device_owner_error_hash_mismatch" msgid="184518450016295596">"checksum အမှားကြောင့် စီမံအုပ်ချုပ်သူ appကို မသုံးနိုင်ခဲ့ပါ။ သင်၏ IT ဌာနကို ဆက်သွယ်ပါ။"</string>
<string name="device_owner_error_download_failed" msgid="4520111971592657116">"အက်ဒမင် appကို ဒေါင်းလုဒ် မလုပ်နိုင်ခဲ့ပါ။"</string>
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"စီမံအုပ်ချုပ်သူ appကို မသုံးနိုင်ခဲ့ပါ။ ၎င်းထဲက အစိတ်အပိုင်းများ ပျောက်နေ သို့မဟုတ် ပျက်စီးနေသည်။ သင်၏ IT ဌာနကို ဆက်သွယ်ပါ။"</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"အက်ဒမင် appကို မတပ်ဆင်နိုင်ပါ။"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"သင့်စက်တွင် အက်ဒမင် app မတပ်ဆင်ရသေးပါ။"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"စဖွင့်သတ်မှတ်ခြင်း ရပ်စဲမလား?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"သင်သည် စဖွင့်သတ်မှတ်မှုကို ရပ်စဲချင်တာ သေချာသလား?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"မလို"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"ဟုတ်"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"ဖျက်နေ..."</string>
</resources>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index d39e24f..cbc1074 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Kan ikke bruke admin-appen. Den mangler komponenter eller er korrupt. Ta kontakt med IT-avdelingen."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"Kan ikke installere administratorappen"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Administratorappen er ikke installert på enheten din"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Vil du stoppe konfigureringen?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Er du sikker på at du vil stoppe konfigureringen?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Nei"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Ja"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"Avbryter ..."</string>
</resources>
diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml
index f44bc95..b0dc284 100644
--- a/res/values-ne-rNP/strings.xml
+++ b/res/values-ne-rNP/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"प्रशासन अनुप्रयोग प्रयोग गर्न सकिएन। यो अवयवहरू हराइरहेका वा भ्रष्ट हुन्। तपाईँको आईटी विभागमा सम्पर्क गर्नुहोस्।"</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"प्रशासक अनुप्रयोग स्थापना गर्न सकिएन"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"प्रशासन अनुप्रयोग तपाईँको उपकरणमा स्थापना गरिएको छैन"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"सेट अप गर्न रोक्नुहुन्छ?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"तपाईँ सेटअप गर्न रोक्न निश्चित हुनुहुन्छ?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"होइन"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"हो"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"रद्द गरिँदै..."</string>
</resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index f216ff0..49c753b 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Kan de beheer-app niet gebruiken. Er ontbreken onderdelen of de app is beschadigd. Neem contact op met uw IT-afdeling."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"Kan de beheer-app niet installeren"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"De beheer-app is niet geïnstalleerd op uw apparaat"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Configureren stoppen?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Weet u zeker dat u het configureren wilt stoppen?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Nee"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Ja"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"Annuleren..."</string>
</resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index c5bb1b4..6fb37c2 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Nie można użyć aplikacji administratora. Brak elementów lub są one uszkodzone. Skontaktuj się z działem IT."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"Nie udało się zainstalować aplikacji administratora"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Aplikacja administratora nie jest zainstalowana na urządzeniu"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Przerwać konfigurację?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Czy na pewno chcesz przerwać konfigurację?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Nie"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Tak"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"Anuluję..."</string>
</resources>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 0bfc46e..cdf77fc 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Não é possível utilizar a aplicação de administração. Faltam componentes ou está danificada. Contacte o departamento de TI."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"Não foi possível instalar a aplicação de administração"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"A aplicação de administração não está instalada no dispositivo"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Pretende parar a configuração?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Tem a certeza de que pretende parar a configuração?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Não"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Sim"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"A cancelar..."</string>
</resources>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 2f910e8..a1aaf6f 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Não é possível usar o app para administrador. Alguns componentes estão ausentes ou corrompidos. Entre em contato com o departamento de TI."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"Não foi possível instalar o app para administrador"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"O app para administrador não foi instalado no dispositivo"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Interromper configuração?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Tem certeza de que deseja interromper a configuração?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Não"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Sim"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"Cancelando..."</string>
</resources>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index e2e2047..f9810bb 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Nu se poate utiliza aplicația de administrare. Este deteriorată sau lipsesc componente. Contactați departamentul IT."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"Eroare la instalarea aplicației de administrare"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Aplicația de administrare nu este instalată pe dispozitiv"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Opriți configurarea?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Sigur doriți să opriți configurarea?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Nu"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Da"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"Se anulează..."</string>
</resources>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index ec17d2e..8011fa5 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Нельзя использовать приложение для администрирования, так как в нем не хватает компонентов или они повреждены. Обратитесь в отдел технической поддержки вашей компании."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"Не удалось установить приложение для администрирования"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"На вашем устройстве не установлено приложение для администрирования"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Подтвердите действие"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Прервать настройку?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Нет"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Да"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"Отмена..."</string>
</resources>
diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml
index 85f99ae..5e57b16 100644
--- a/res/values-si-rLK/strings.xml
+++ b/res/values-si-rLK/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"පරිපාලක යෙදුම භාවිතා කළ නොහැක. එහි අංශ නැත හෝ විකෘති වී ඇත. ඔබගේ IT අංශය සම්බන්ධ කරගන්න."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"පරිපාලක යෙදුම ස්ථාපනය කළ නොහැක."</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"ඔබගේ උපාංගය මත පරිපාලක යෙදුම ස්ථාපනය කර නොමැත."</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"සැකසීම නැවත් වන්නද?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"සකස් කිරීම නැවත් වීමට ඔබට අවශ්ය බව ඔබට සහතිකද?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"නැත"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"ඔව්"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"අවලංගු කරමින්…"</string>
</resources>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index 0025d98..27cde1e 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Aplikácia na správu sa nedá použiť. Buď v nej chýbajú niektoré komponenty, alebo je poškodená. Kontaktujte oddelenie IT."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"Aplikáciu na správu sa nepodarilo nainštalovať"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Na vašom zariadení nie je nainštalovaná aplikácia na správu"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Zastaviť nastavovanie?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Naozaj chcete zrušiť nastavovanie?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Nie"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Áno"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"Ruší sa..."</string>
</resources>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index fc7c081..8fa209d 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Skrbniške aplikacije ni mogoče uporabljati. Manjkajo ji komponente ali pa je poškodovana. Obrnite se na oddelek za IT."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"Skrbniške aplikacije ni bilo mogoče namestiti"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Skrbniška aplikacija ni nameščena v napravi"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Želite ustaviti namestitev?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Ali res želite ustaviti namestitev?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Ne"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Da"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"Preklic ..."</string>
</resources>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index f486d6c..3cbb52a 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Није могуће користити апликацију за администраторе. Недостају јој компоненте или је оштећена. Контактирајте ИТ сектор."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"Инсталирање апликације за администраторе није успело"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Апликација за администраторе није инсталирана на уређају"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Желите ли да зауставите подешавање?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Желите ли стварно да зауставите подешавање?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Не"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Да"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"Отказује се..."</string>
</resources>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 4425be5..eea5d03 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Administrationsappen kan inte användas. Komponenter saknas eller appen har skadats. Kontakta IT-avdelningen."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"Det gick inte att installera administrationsappen"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Administrationsappen har inte installerats på enheten"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Vill du avsluta konfigurationen?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Vill du avsluta konfigurationen?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Nej"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Ja"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"Avslutar ..."</string>
</resources>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 4294429..ec4bd23 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Haiwezi kutumia programu ya msimamizi. Inakosa vipengele au ina hitilafu. Wasiliana na idara yako ya Teknolojia ya Habari."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"Haikuweza kusakinisha programu ya msimamizi"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Programu ya msimamizi haijasakinishwa kwenye kifaa chako"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Ungependa kuacha kusanidi?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Je, una uhakika unataka kuacha kusanidi?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Hapana"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Ndiyo"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"Inaghairi..."</string>
</resources>
diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml
index 1a4ad32..e666568 100644
--- a/res/values-ta-rIN/strings.xml
+++ b/res/values-ta-rIN/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"நிர்வாகப் பயன்பாட்டைப் பயன்படுத்த முடியவில்லை. இதில் கூறுகள் இல்லாமல் இருக்கலாம் அல்லது இது சேதமடைந்து இருக்கலாம். IT துறையைத் தொடர்புகொள்ளவும்."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"நிர்வாகிப் பயன்பாட்டை நிறுவ முடியவில்லை"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"சாதனத்தில் நிர்வாகிப் பயன்பாடு நிறுவப்படவில்லை"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"அமைப்பதை நிறுத்தவா?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"அமைப்பதை நிச்சயமாக நிறுத்தவா?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"வேண்டாம்"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"ஆம்"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"ரத்துசெய்கிறது..."</string>
</resources>
diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml
index 778cf08..45ef848 100644
--- a/res/values-te-rIN/strings.xml
+++ b/res/values-te-rIN/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"నిర్వాహక అనువర్తనాన్ని ఉపయోగించడం సాధ్యపడదు. ఇందులో కొన్ని భాగాలు లేవు లేదా పాడైంది. మీ IT విభాగాన్ని సంప్రదించండి."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"నిర్వాహక అనువర్తనాన్ని ఇన్స్టాల్ చేయడం సాధ్యపడలేదు"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"మీ పరికరంలో నిర్వాహక అనువర్తనం ఇన్స్టాల్ చేయబడలేదు"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"సెటప్ చేయడం ఆపివేయాలా?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"మీరు ఖచ్చితంగా సెటప్ చేయడాన్ని ఆపివేయాలనుకుంటున్నారా?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"కాదు"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"అవును"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"రద్దు చేస్తోంది..."</string>
</resources>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index a454f5a..57e4676 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"ไม่สามารถใช้แอปผู้ดูแลระบบได้เนื่องจากขาดองค์ประกอบหรือมีข้อขัดข้อง โปรดติดต่อฝ่ายไอทีของคุณ"</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"ไม่สามารถติดตั้งแอปผู้ดูแลระบบได้"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"อุปกรณ์ของคุณไม่ได้ติดตั้งแอปผู้ดูแลระบบ"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"หยุดการตั้งค่าใช่ไหม"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"คุณแน่ใจไหมว่าต้องการหยุดการตั้งค่า"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"ไม่"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"ใช่"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"กำลังยกเลิก..."</string>
</resources>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index d6ce612..947cbcf 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Hindi magamit ang admin app. May mga kulang itong bahagi o sira ito. Makipag-ugnayan sa iyong IT department."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"Hindi ma-install ang admin app"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Hindi naka-install ang admin app sa iyong device"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Ihinto ang pagse-set up?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Sigurado ka bang gusto mong ihinto ang pagse-set up?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Hindi"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Oo"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"Kinakansela..."</string>
</resources>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index a3d0455..b9368c4 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Yönetim uygulaması kullanılamıyor. Bileşenleri eksik veya bozuk. BT bölümünüze başvurun."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"Yönetici uygulaması yüklenemedi"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Yönetici uygulaması cihazınızda yüklü değil"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Kurulum durdurulsun mu?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Kurulumu durdurmak istediğinizden emin misiniz?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Hayır"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Evet"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"İptal ediliyor..."</string>
</resources>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 76d4732..ded0c0d 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Неможливо скористатися додатком адміністратора. У ньому немає певних компонентів або його пошкоджено. Зв’яжіться з ІТ-відділом."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"Не вдалося встановити додаток адміністратора"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Додаток адміністратора не встановлено на вашому пристрої"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Припинити налаштування?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Справді припинити налаштування?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Ні"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Так"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"Скасування…"</string>
</resources>
diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml
index b418096..87b2f9b 100644
--- a/res/values-ur-rPK/strings.xml
+++ b/res/values-ur-rPK/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"منتظم کی ایپ کا استعمال نہیں کر سکتے۔ اس میں چھوٹے ہوئے اجزاء ہیں یا یہ خراب ہوگئی ہے۔ اپنے IT ڈیپارٹمنٹ سے رابطہ کریں۔"</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"منتظم کی ایپ کو انسٹال نہیں کیا جا سکا"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"منتظم کی ایپ آپ کے آلہ پر انسٹال نہیں ہے"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"ترتیب دینا بند کریں؟"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"کیا آپ واقعی ترتیب دینا بند کرنا چاہتے ہیں؟"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"نہیں"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"ہاں"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"منسوخ کیا جا رہا ہے…"</string>
</resources>
diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml
index 97c2889..679b3cf 100644
--- a/res/values-uz-rUZ/strings.xml
+++ b/res/values-uz-rUZ/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Administrator ilovasidan foydalanib bo‘lmaydi. Unda ba’zi tarkibiy qismlar mavjud emas yoki buzilgan. IT bo‘limiga murojaat qiling."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"Administrator ilovasini o‘rnatib bo‘lmadi"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Qurilmangizga administrator ilovasi o‘rnatilmadi"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Sozlash to‘xtatilsinmi?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Haqiqatan ham sozlashni to‘xtatmoqchimisiz?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Yo‘q"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Ha"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"Bekor qilinmoqda…"</string>
</resources>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 6c3a6a0..34ae373 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Không thể sử dụng ứng dụng quản trị. Ứng dụng thiếu thành phần hoặc bị lỗi. Hãy liên hệ với bộ phận CNTT."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"Không thể cài đặt ứng dụng quản trị"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Ứng dụng quản trị chưa được cài đặt trên thiết bị của bạn"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Dừng thiết lập?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Bạn có chắc chắn muốn dừng thiết lập không?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Không"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Có"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"Đang hủy..."</string>
</resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index efe347b..4446e92 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"由于缺少组件或软件包已损坏,无法使用此管理应用。请与您公司的IT部门联系。"</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"无法安装管理应用"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"在您的设备上安装管理应用失败"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"要停止设置吗?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"确定要停止设置吗?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"否"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"是"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"正在取消…"</string>
</resources>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index 5c0710d..55d64f4 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"管理員應用程式因缺少部分元件或已損毀而無法使用,請與您的 IT 部門聯絡。"</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"無法安裝管理員應用程式"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"您的裝置尚未安裝管理員應用程式"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"要停止設定嗎?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"您確定要停止設定嗎?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"否"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"是"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"正在取消…"</string>
</resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index eef0a84..53b58c3 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"管理應用程式因缺少部分元件或已毀損而無法使用,請與您的 IT 部門聯絡。"</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"無法安裝管理應用程式"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"您的裝置尚未安裝管理應用程式"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"停止設定?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"您確定要停止設定嗎?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"否"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"是"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"取消中..."</string>
</resources>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 7ba41d1..f21fc74 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -68,4 +68,9 @@
<string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Ayikwazi ukusebenzisa uhlelo lokusebenza lomqondisi. Xhumana nomnyango wakho we-IT."</string>
<string name="device_owner_error_installation_failed" msgid="684566845601079360">"Ayikwazanga ukufaka uhlelo lokusebenza lomqondisi"</string>
<string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Uhlelo lokusebenza alufakiwe kudivayisi yakho"</string>
+ <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Misa ukusetha?"</string>
+ <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Ingabe uqinisekile ukuthi ufuna ukumisa ukusetha?"</string>
+ <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Cha"</string>
+ <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Yebo"</string>
+ <string name="profile_owner_cancelling" msgid="2007485854183176973">"Kuyakhanselwa..."</string>
</resources>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index f6a4317..6764c41 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -21,11 +21,16 @@
<!-- Main text -->
<dimen name="main_text_padding_left_right">16dp</dimen>
<dimen name="main_text_padding_bottom">24dp</dimen>
- <dimen name="main_text_padding_top">24dp</dimen>
+ <dimen name="main_text_padding_top">0dp</dimen>
+ <dimen name="main_text_padding_between_text">8dp</dimen>
<dimen name="main_text_margins_left_right">0dp</dimen>
- <dimen name="main_text_container_padding_top">0dp</dimen>
<dimen name="main_text_size">16sp</dimen>
+ <!-- Dialog Fragment text -->
+ <dimen name="dialog_text_padding_left_right">16dp</dimen>
+ <dimen name="dialog_text_padding_bottom">24dp</dimen>
+ <dimen name="dialog_text_padding_top">24dp</dimen>
+
<!-- Buttons -->
<dimen name="button_width">100dp</dimen>
@@ -39,6 +44,6 @@
<dimen name="title_padding">@dimen/main_text_padding_left_right</dimen>
<dimen name="row_height">72dp</dimen>
- <dimen name="row_padding_top">16dp</dimen>
+ <dimen name="row_padding_top">8dp</dimen>
<dimen name="icon_width_height">56dp</dimen>
</resources>
\ No newline at end of file
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 5f821bd..3133ef1 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -133,4 +133,14 @@
<string name="device_owner_error_installation_failed">Couldn\'t install the admin app</string>
<!-- Message of the error dialog when device admin package is not installed. [CHAR LIMIT=NONE] -->
<string name="device_owner_error_package_not_installed">The admin app isn\'t installed on your device</string>
+ <!-- Title of the cancel profile owner provisioning dialog. [CHAR LIMIT=45] -->
+ <string name="profile_owner_cancel_title">Stop setting up?</string>
+ <!-- Message of the cancel dialog. [CHAR LIMIT=NONE] -->
+ <string name="profile_owner_cancel_message">Are you sure you want to stop setting up?</string>
+ <!-- Cancel button text of the cancel dialog. [CHAR LIMIT=45] -->
+ <string name="profile_owner_cancel_cancel">No</string>
+ <!-- OK button text of the error dialog. [CHAR LIMIT=45] -->
+ <string name="profile_owner_cancel_ok">Yes</string>
+ <!-- Message of the cancel progress dialog. [CHAR LIMIT=45] -->
+ <string name="profile_owner_cancelling">Cancelling...</string>
</resources>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 26f4ea8..fb8a8a8 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -77,7 +77,7 @@
<item name="android:layout_width">fill_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:textColor">@color/text_black</item>
- <item name="android:paddingTop">@dimen/main_text_padding_top</item>
+ <item name="android:paddingTop">@dimen/main_text_padding_between_text</item>
<item name="android:textSize">@dimen/main_text_size</item>
</style>
@@ -119,10 +119,23 @@
<item name="android:layout_marginRight">@dimen/main_text_margins_left_right</item>
<item name="android:paddingLeft">@dimen/main_text_padding_left_right</item>
<item name="android:paddingRight">@dimen/main_text_padding_left_right</item>
- <item name="android:paddingTop">@dimen/main_text_container_padding_top</item>
+ <item name="android:paddingTop">@dimen/main_text_padding_top</item>
<item name="android:textSize">@dimen/main_text_size</item>
</style>
+ <style name="DialogFragmentTextContainer">
+ <item name="android:layout_width">fill_parent</item>
+ <item name="android:layout_height">fill_parent</item>
+ <item name="android:orientation">vertical</item>
+ <item name="android:background">@color/white</item>
+ <item name="android:paddingBottom">@dimen/dialog_text_padding_bottom</item>
+ <item name="android:paddingLeft">@dimen/dialog_text_padding_left_right</item>
+ <item name="android:paddingRight">@dimen/dialog_text_padding_left_right</item>
+ <item name="android:paddingTop">@dimen/dialog_text_padding_top</item>
+ <item name="android:textSize">@dimen/main_text_size</item>
+ </style>
+
+
<style name="ScrollView" parent="@android:style/Widget.Material.Light.ScrollView">
<item name="android:theme">@style/ControlOverlayTheme</item>
<item name="android:layout_width">fill_parent</item>
@@ -132,7 +145,7 @@
<style name="ProgressBar" parent="@android:Widget.Material.ProgressBar">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item>
- <item name="android:layout_marginTop">@dimen/main_text_padding_top</item>
+ <item name="android:layout_marginTop">@dimen/main_text_padding_between_text</item>
<item name="android:indeterminate">true</item>
</style>
diff --git a/src/com/android/managedprovisioning/BootReminder.java b/src/com/android/managedprovisioning/BootReminder.java
index a7c7afd..85c6511 100644
--- a/src/com/android/managedprovisioning/BootReminder.java
+++ b/src/com/android/managedprovisioning/BootReminder.java
@@ -15,6 +15,7 @@
*/
package com.android.managedprovisioning;
+import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE;
import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE;
import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME;
@@ -50,8 +51,13 @@
EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE
};
+ private static final String[] PROFILE_OWNER_ACCOUNT_EXTRAS = {
+ // Key for the account extras
+ EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE
+ };
+
private static final ComponentName PROFILE_OWNER_INTENT_TARGET =
- ManagedProvisioningActivity.ALIAS_NO_CHECK_CALLER;
+ ProfileOwnerPreProvisioningActivity.ALIAS_NO_CHECK_CALLER;
/*
* Device owner parameters that are stored in the IntentStore for resuming provisioning.
@@ -137,7 +143,8 @@
private static IntentStore getProfileOwnerIntentStore(Context context) {
return new IntentStore(context,PROFILE_OWNER_INTENT_TARGET, PROFILE_OWNER_PREFERENCES_NAME)
.setStringKeys(PROFILE_OWNER_STRING_EXTRAS)
- .setPersistableBundleKeys(PROFILE_OWNER_PERSISTABLE_BUNDLE_EXTRAS);
+ .setPersistableBundleKeys(PROFILE_OWNER_PERSISTABLE_BUNDLE_EXTRAS)
+ .setAccountKeys(PROFILE_OWNER_ACCOUNT_EXTRAS);
}
private static IntentStore getDeviceOwnerIntentStore(Context context) {
diff --git a/src/com/android/managedprovisioning/DeviceOwnerProvisioningActivity.java b/src/com/android/managedprovisioning/DeviceOwnerProvisioningActivity.java
index f7f33e9..1b12252 100644
--- a/src/com/android/managedprovisioning/DeviceOwnerProvisioningActivity.java
+++ b/src/com/android/managedprovisioning/DeviceOwnerProvisioningActivity.java
@@ -18,7 +18,6 @@
import android.app.Activity;
import android.app.AlertDialog;
-import android.app.Dialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
@@ -29,6 +28,7 @@
import android.os.SystemProperties;
import android.provider.Settings.Global;
import android.provider.Settings.Secure;
+import android.service.persistentdata.PersistentDataBlockManager;
import android.support.v4.content.LocalBroadcastManager;
import android.text.TextUtils;
import android.view.LayoutInflater;
@@ -37,7 +37,7 @@
import com.android.managedprovisioning.task.AddWifiNetworkTask;
-import java.util.Locale;
+import java.util.ArrayList;
/**
* This activity starts device owner provisioning:
@@ -63,32 +63,53 @@
* repeated. We made sure that all tasks can be done twice without causing any problems.
* </p>
*/
-public class DeviceOwnerProvisioningActivity extends Activity {
+public class DeviceOwnerProvisioningActivity extends Activity
+ implements UserConsentDialog.ConsentCallback {
+ private static final boolean DEBUG = false; // To control logging.
+
private static final String KEY_USER_CONSENTED = "user_consented";
+ private static final String KEY_CANCEL_DIALOG_SHOWN = "cancel_dialog_shown";
+ private static final String KEY_PENDING_INTENTS = "pending_intents";
private static final int ENCRYPT_DEVICE_REQUEST_CODE = 1;
private static final int WIFI_REQUEST_CODE = 2;
private BroadcastReceiver mServiceMessageReceiver;
private TextView mProgressTextView;
- private Dialog mDialog; // The cancel or error dialog that is currently shown.
- private boolean mDone; // Indicates whether the service has sent ACTION_PROVISIONING_SUCCESS.
-
- // Run when wifi picker activity reports success.
- private Runnable mOnWifiConnectedRunnable;
// Indicates whether user consented by clicking on positive button of interstitial.
private boolean mUserConsented = false;
+ // Params that will be used after user consent.
+ // Extracted from the starting intent.
+ private ProvisioningParams mParams;
+
+ // Indicates that the cancel dialog is shown.
+ private boolean mCancelDialogShown = false;
+
+ // List of intents received while cancel dialog is shown.
+ private ArrayList<Intent> mPendingProvisioningIntents = new ArrayList<Intent>();
+
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ if (DEBUG) ProvisionLogger.logd("Device owner provisioning activity ONCREATE");
if (savedInstanceState != null) {
mUserConsented = savedInstanceState.getBoolean(KEY_USER_CONSENTED, false);
+ mCancelDialogShown = savedInstanceState.getBoolean(KEY_CANCEL_DIALOG_SHOWN, false);
+ mPendingProvisioningIntents = savedInstanceState
+ .getParcelableArrayList(KEY_PENDING_INTENTS);
}
- ProvisionLogger.logd("Device owner provisioning activity ONCREATE");
+ // Setup the UI.
+ final LayoutInflater inflater = getLayoutInflater();
+ final View contentView = inflater.inflate(R.layout.progress, null);
+ setContentView(contentView);
+ mProgressTextView = (TextView) findViewById(R.id.prog_text);
+ TextView titleText = (TextView) findViewById(R.id.title);
+ if (titleText != null) titleText.setText(getString(R.string.setup_device));
+ if (mCancelDialogShown) showCancelResetDialog();
// Check whether we can provision.
if (Global.getInt(getContentResolver(), Global.DEVICE_PROVISIONED, 0 /* default */) != 0) {
@@ -103,13 +124,11 @@
return;
}
- // Setup the UI.
- final LayoutInflater inflater = getLayoutInflater();
- final View contentView = inflater.inflate(R.layout.progress, null);
- setContentView(contentView);
- mProgressTextView = (TextView) findViewById(R.id.prog_text);
- TextView titleText = (TextView) findViewById(R.id.title);
- if (titleText != null) titleText.setText(getString(R.string.setup_device));
+ if (factoryResetProtected()) {
+ ProvisionLogger.loge("Factory reset protection blocks provisioning.");
+ error(R.string.device_owner_error_already_provisioned, false /* no factory reset */);
+ return;
+ }
// Setup broadcast receiver for feedback from service.
mServiceMessageReceiver = new ServiceMessageReceiver();
@@ -120,15 +139,9 @@
LocalBroadcastManager.getInstance(this).registerReceiver(mServiceMessageReceiver, filter);
// Parse the incoming intent.
- final ProvisioningParams params;
MessageParser parser = new MessageParser();
try {
- params = parser.parseIntent(getIntent());
- mOnWifiConnectedRunnable = new Runnable() {
- public void run() {
- showInterstitialAndProvision(params);
- }
- };
+ mParams = parser.parseIntent(getIntent());
} catch (MessageParser.ParseException e) {
ProvisionLogger.loge("Could not read data from intent", e);
error(e.getErrorMessageId(), false /* no factory reset */);
@@ -138,20 +151,32 @@
// Ask to encrypt the device before proceeding
if (!(EncryptDeviceActivity.isDeviceEncrypted()
|| SystemProperties.getBoolean("persist.sys.no_req_encrypt", false))) {
- requestEncryption(parser, params);
+ requestEncryption(parser, mParams);
finish();
return;
// System will reboot. Bootreminder will restart this activity.
}
// Have the user pick a wifi network if necessary.
- if (!AddWifiNetworkTask.isConnectedToWifi(this) && TextUtils.isEmpty(params.mWifiSsid)) {
+ if (!AddWifiNetworkTask.isConnectedToWifi(this) && TextUtils.isEmpty(mParams.mWifiSsid)) {
requestWifiPick();
return;
// Wait for onActivityResult.
}
- showInterstitialAndProvision(params);
+ showInterstitialAndProvision(mParams);
+ }
+
+ private boolean factoryResetProtected() {
+ // Can't refer to type directly here and API is hidden, so
+ // get it via reflection.
+ PersistentDataBlockManager pdbManager = (PersistentDataBlockManager)
+ getSystemService(Context.PERSISTENT_DATA_BLOCK_SERVICE);
+ if (pdbManager == null) {
+ ProvisionLogger.loge("Unable to get persistent data block service");
+ return false;
+ }
+ return pdbManager.getDataBlockSize() > 0;
}
private void showInterstitialAndProvision(final ProvisioningParams params) {
@@ -160,22 +185,22 @@
} else {
// Notify the user that the admin will have full control over the device,
// then start provisioning.
- new UserConsentDialog(this, UserConsentDialog.DEVICE_OWNER, new Runnable() {
- @Override
- public void run() {
- mUserConsented = true;
- startDeviceOwnerProvisioningService(params);
- }
- } /* onUserConsented */ , new Runnable() {
- @Override
- public void run() {
- finish();
- }
- } /* onCancel */).show(getFragmentManager(),
- "UserConsentDialogFragment");
+ UserConsentDialog.newInstance(UserConsentDialog.DEVICE_OWNER)
+ .show(getFragmentManager(), "UserConsentDialogFragment");
}
}
+ @Override
+ public void onDialogConsent() {
+ mUserConsented = true;
+ startDeviceOwnerProvisioningService(mParams);
+ }
+
+ @Override
+ public void onDialogCancel() {
+ finish();
+ }
+
private void startDeviceOwnerProvisioningService(ProvisioningParams params) {
Intent intent = new Intent(this, DeviceOwnerProvisioningService.class);
intent.putExtra(DeviceOwnerProvisioningService.EXTRA_PROVISIONING_PARAMS, params);
@@ -188,40 +213,45 @@
@Override
public void onReceive(Context context, Intent intent)
{
- String action = intent.getAction();
- if (action.equals(DeviceOwnerProvisioningService.ACTION_PROVISIONING_SUCCESS)) {
- ProvisionLogger.logd("Successfully provisioned");
+ if (mCancelDialogShown) {
- synchronized(this) {
- if (mDialog == null) {
- onProvisioningSuccess();
- } else {
- // Postpone finishing this activity till the user has decided whether
- // he/she wants to reset or not.
- mDone = true;
- }
- }
+ // Postpone handling the intent.
+ mPendingProvisioningIntents.add(intent);
return;
- } else if (action.equals(DeviceOwnerProvisioningService.ACTION_PROVISIONING_ERROR)) {
- int errorMessageId = intent.getIntExtra(
- DeviceOwnerProvisioningService.EXTRA_USER_VISIBLE_ERROR_ID_KEY,
- R.string.device_owner_error_general);
+ }
+ handleProvisioningIntent(intent);
+ }
+ }
+ private void handleProvisioningIntent(Intent intent) {
+ String action = intent.getAction();
+ if (action.equals(DeviceOwnerProvisioningService.ACTION_PROVISIONING_SUCCESS)) {
+ if (DEBUG) ProvisionLogger.logd("Successfully provisioned");
+ onProvisioningSuccess();
+ } else if (action.equals(DeviceOwnerProvisioningService.ACTION_PROVISIONING_ERROR)) {
+ int errorMessageId = intent.getIntExtra(
+ DeviceOwnerProvisioningService.EXTRA_USER_VISIBLE_ERROR_ID_KEY,
+ R.string.device_owner_error_general);
+
+ if (DEBUG) {
ProvisionLogger.logd("Error reported with code "
+ getResources().getString(errorMessageId));
- error(errorMessageId, true /* always factory reset */);
- } else if (action.equals(DeviceOwnerProvisioningService.ACTION_PROGRESS_UPDATE)) {
- int progressMessage = intent.getIntExtra(
- DeviceOwnerProvisioningService.EXTRA_PROGRESS_MESSAGE_ID_KEY, -1);
+ }
+ error(errorMessageId, true /* always factory reset */);
+ } else if (action.equals(DeviceOwnerProvisioningService.ACTION_PROGRESS_UPDATE)) {
+ int progressMessage = intent.getIntExtra(
+ DeviceOwnerProvisioningService.EXTRA_PROGRESS_MESSAGE_ID_KEY, -1);
+ if (DEBUG) {
ProvisionLogger.logd("Progress update reported with code "
- + getResources().getString(progressMessage));
- if (progressMessage >= 0) {
- progressUpdate(progressMessage);
- }
+ + getResources().getString(progressMessage));
+ }
+ if (progressMessage >= 0) {
+ progressUpdate(progressMessage);
}
}
}
+
private void onProvisioningSuccess() {
// The Setup wizards listens to this flag and finishes itself when it is set.
// It then fires a home intent, which we catch in the HomeReceiverActivity before sending
@@ -254,49 +284,53 @@
@Override
public void onBackPressed() {
+ if (mCancelDialogShown) {
+ return;
+ }
+
+ mCancelDialogShown = true;
showCancelResetDialog();
}
private void showCancelResetDialog() {
- AlertDialog.Builder alertBuilder =
- new AlertDialog.Builder(DeviceOwnerProvisioningActivity.this)
- .setCancelable(false)
- .setTitle(R.string.device_owner_cancel_title)
- .setMessage(R.string.device_owner_cancel_message)
- .setNegativeButton(R.string.device_owner_cancel_cancel,
- new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog,int id) {
- dialog.dismiss();
- synchronized(this) {
- mDialog = null;
- if (mDone) {
- onProvisioningSuccess();
- }
- }
- }
+ new AlertDialog.Builder(DeviceOwnerProvisioningActivity.this)
+ .setCancelable(false)
+ .setTitle(R.string.device_owner_cancel_title)
+ .setMessage(R.string.device_owner_cancel_message)
+ .setNegativeButton(R.string.device_owner_cancel_cancel,
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog,int id) {
+ dialog.dismiss();
+ handlePendingIntents();
+ mCancelDialogShown = false;
+ }
})
- .setPositiveButton(R.string.device_owner_error_reset,
- new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog,int id) {
- // Factory reset the device.
- Intent intent = new Intent(Intent.ACTION_MASTER_CLEAR);
- intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
- intent.putExtra(Intent.EXTRA_REASON,
- "DeviceOwnerProvisioningActivity.showCancelResetDialog()");
- sendBroadcast(intent);
- stopService(new Intent(DeviceOwnerProvisioningActivity.this,
- DeviceOwnerProvisioningService.class));
- finish();
- }
- });
+ .setPositiveButton(R.string.device_owner_error_reset,
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog,int id) {
+ dialog.dismiss();
- if (mDialog != null) {
- mDialog.dismiss();
+ // Factory reset the device.
+ Intent intent = new Intent(Intent.ACTION_MASTER_CLEAR);
+ intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
+ intent.putExtra(Intent.EXTRA_REASON,
+ "DeviceOwnerProvisioningActivity.showCancelResetDialog()");
+ sendBroadcast(intent);
+ stopService(new Intent(DeviceOwnerProvisioningActivity.this,
+ DeviceOwnerProvisioningService.class));
+ finish();
+ }
+ }).show();
+ }
+
+ private void handlePendingIntents() {
+ for (Intent intent : mPendingProvisioningIntents) {
+ if (DEBUG) ProvisionLogger.logd("Handling pending intent " + intent.getAction());
+ handleProvisioningIntent(intent);
}
- mDialog = alertBuilder.create();
- mDialog.show();
+ mPendingProvisioningIntents.clear();
}
private void progressUpdate(int progressMessage) {
@@ -317,9 +351,9 @@
DeviceOwnerProvisioningService.class));
finish();
} else if (resultCode == RESULT_OK) {
- ProvisionLogger.logd("Wifi request result is OK");
+ if (DEBUG) ProvisionLogger.logd("Wifi request result is OK");
if (AddWifiNetworkTask.isConnectedToWifi(this)) {
- mOnWifiConnectedRunnable.run();
+ showInterstitialAndProvision(mParams);
} else {
requestWifiPick();
}
@@ -337,6 +371,8 @@
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,int id) {
+ dialog.dismiss();
+
// Factory reset the device.
Intent intent = new Intent(Intent.ACTION_MASTER_CLEAR);
intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
@@ -353,6 +389,8 @@
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,int id) {
+ dialog.dismiss();
+
// Close activity.
stopService(new Intent(DeviceOwnerProvisioningActivity.this,
DeviceOwnerProvisioningService.class));
@@ -360,50 +398,47 @@
}
});
}
- mDialog = alertBuilder.create();
- mDialog.show();
+ alertBuilder.show();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putBoolean(KEY_USER_CONSENTED, mUserConsented);
+ outState.putBoolean(KEY_CANCEL_DIALOG_SHOWN, mCancelDialogShown);
+ outState.putParcelableArrayList(KEY_PENDING_INTENTS, mPendingProvisioningIntents);
}
@Override
public void onDestroy() {
- ProvisionLogger.logd("Device owner provisioning activity ONDESTROY");
+ if (DEBUG) ProvisionLogger.logd("Device owner provisioning activity ONDESTROY");
if (mServiceMessageReceiver != null) {
LocalBroadcastManager.getInstance(this).unregisterReceiver(mServiceMessageReceiver);
mServiceMessageReceiver = null;
}
- if (mDialog != null) {
- mDialog.dismiss();
- mDialog = null;
- }
super.onDestroy();
}
@Override
protected void onRestart() {
- ProvisionLogger.logd("Device owner provisioning activity ONRESTART");
+ if (DEBUG) ProvisionLogger.logd("Device owner provisioning activity ONRESTART");
super.onRestart();
}
@Override
protected void onResume() {
- ProvisionLogger.logd("Device owner provisioning activity ONRESUME");
+ if (DEBUG) ProvisionLogger.logd("Device owner provisioning activity ONRESUME");
super.onResume();
}
@Override
protected void onPause() {
- ProvisionLogger.logd("Device owner provisioning activity ONPAUSE");
+ if (DEBUG) ProvisionLogger.logd("Device owner provisioning activity ONPAUSE");
super.onPause();
}
@Override
protected void onStop() {
- ProvisionLogger.logd("Device owner provisioning activity ONSTOP");
+ if (DEBUG) ProvisionLogger.logd("Device owner provisioning activity ONSTOP");
super.onStop();
}
}
diff --git a/src/com/android/managedprovisioning/DeviceOwnerProvisioningService.java b/src/com/android/managedprovisioning/DeviceOwnerProvisioningService.java
index 1a63b12..109bb98 100644
--- a/src/com/android/managedprovisioning/DeviceOwnerProvisioningService.java
+++ b/src/com/android/managedprovisioning/DeviceOwnerProvisioningService.java
@@ -54,6 +54,8 @@
* </p>
*/
public class DeviceOwnerProvisioningService extends Service {
+ private static final boolean DEBUG = false; // To control logging.
+
/**
* Intent action to activate the CDMA phone connection by OTASP.
* This is not necessary for a GSM phone connection, which is activated automatically.
@@ -110,11 +112,11 @@
@Override
public int onStartCommand(final Intent intent, int flags, int startId) {
- ProvisionLogger.logd("Device owner provisioning service ONSTARTCOMMAND.");
+ if (DEBUG) ProvisionLogger.logd("Device owner provisioning service ONSTARTCOMMAND.");
synchronized (this) { // Make operations on mProvisioningInFlight atomic.
if (mProvisioningInFlight) {
- ProvisionLogger.logd("Provisioning already in flight.");
+ if (DEBUG) ProvisionLogger.logd("Provisioning already in flight.");
sendProgressUpdateToActivity();
@@ -129,7 +131,7 @@
}
} else {
mProvisioningInFlight = true;
- ProvisionLogger.logd("First start of the service.");
+ if (DEBUG) ProvisionLogger.logd("First start of the service.");
progressUpdate(R.string.progress_data_process);
// Load the ProvisioningParams (from message in Intent).
@@ -192,32 +194,36 @@
* This is the core method of this class. It goes through every provisioning step.
*/
private void startDeviceOwnerProvisioning(final ProvisioningParams params) {
- ProvisionLogger.logd("Starting device owner provisioning");
+ if (DEBUG) ProvisionLogger.logd("Starting device owner provisioning");
// Construct Tasks. Do not start them yet.
- mAddWifiNetworkTask = new AddWifiNetworkTask(this, params.mWifiSsid,
- params.mWifiHidden, params.mWifiSecurityType, params.mWifiPassword,
- params.mWifiProxyHost, params.mWifiProxyPort, params.mWifiProxyBypassHosts,
- params.mWifiPacUrl, new AddWifiNetworkTask.Callback() {
- @Override
- public void onSuccess() {
- if (!TextUtils.isEmpty(params.mDeviceAdminPackageDownloadLocation)) {
- // Download, install, set as device owner, delete apps.
- progressUpdate(R.string.progress_download);
- mDownloadPackageTask.run();
- } else {
- // Device Admin will not be downloaded (but is already present):
- // Just set as device owner, delete apps.
- progressUpdate(R.string.progress_set_owner);
- mSetDevicePolicyTask.run();
+ if (TextUtils.isEmpty(params.mWifiSsid)) {
+ mAddWifiNetworkTask = null;
+ } else {
+ mAddWifiNetworkTask = new AddWifiNetworkTask(this, params.mWifiSsid,
+ params.mWifiHidden, params.mWifiSecurityType, params.mWifiPassword,
+ params.mWifiProxyHost, params.mWifiProxyPort, params.mWifiProxyBypassHosts,
+ params.mWifiPacUrl, new AddWifiNetworkTask.Callback() {
+ @Override
+ public void onSuccess() {
+ if (!TextUtils.isEmpty(params.mDeviceAdminPackageDownloadLocation)) {
+ // Download, install, set as device owner, delete apps.
+ progressUpdate(R.string.progress_download);
+ mDownloadPackageTask.run();
+ } else {
+ // Device Admin will not be downloaded (but is already present):
+ // Just set as device owner, delete apps.
+ progressUpdate(R.string.progress_set_owner);
+ mSetDevicePolicyTask.run();
+ }
}
- }
- @Override
- public void onError(){
- error(R.string.device_owner_error_wifi);
- }
- });
+ @Override
+ public void onError(){
+ error(R.string.device_owner_error_wifi);
+ }
+ });
+ }
mDownloadPackageTask = new DownloadPackageTask(this,
params.mDeviceAdminPackageDownloadLocation, params.mDeviceAdminPackageChecksum,
@@ -277,7 +283,11 @@
new SetDevicePolicyTask.Callback() {
@Override
public void onSuccess() {
- mDeleteNonRequiredAppsTask.run();
+ if (params.mLeaveAllSystemAppsEnabled) {
+ onProvisioningSuccess(params.mDeviceAdminPackageName);
+ } else {
+ mDeleteNonRequiredAppsTask.run();
+ }
}
@Override
@@ -318,7 +328,7 @@
}
private void startFirstTask(final ProvisioningParams params) {
- if (!TextUtils.isEmpty(params.mWifiSsid)) {
+ if (mAddWifiNetworkTask != null) {
// Connect to wifi.
progressUpdate(R.string.progress_connect_to_wifi);
@@ -344,7 +354,10 @@
}
private void sendError() {
- ProvisionLogger.logd("Reporting Error: " + getResources().getString(mLastErrorMessage));
+ if (DEBUG) {
+ ProvisionLogger.logd("Reporting Error: " + getResources()
+ .getString(mLastErrorMessage));
+ }
Intent intent = new Intent(ACTION_PROVISIONING_ERROR);
intent.setClass(this, DeviceOwnerProvisioningActivity.ServiceMessageReceiver.class);
intent.putExtra(EXTRA_USER_VISIBLE_ERROR_ID_KEY, mLastErrorMessage);
@@ -352,8 +365,10 @@
}
private void progressUpdate(int progressMessage) {
- ProvisionLogger.logd("Reporting progress update: "
- + getResources().getString(progressMessage));
+ if (DEBUG) {
+ ProvisionLogger.logd("Reporting progress update: " + getResources()
+ .getString(progressMessage));
+ }
mLastProgressMessage = progressMessage;
sendProgressUpdateToActivity();
}
@@ -366,7 +381,7 @@
}
private void onProvisioningSuccess(String deviceAdminPackage) {
- ProvisionLogger.logv("Reporting success.");
+ if (DEBUG) ProvisionLogger.logd("Reporting success.");
mDone = true;
// Enable the HomeReceiverActivity, since the DeviceOwnerProvisioningActivity will shutdown
@@ -390,7 +405,7 @@
// Start CDMA activation to enable phone calls.
final Intent intent = new Intent(ACTION_PERFORM_CDMA_PROVISIONING);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- ProvisionLogger.logv("Starting cdma activation activity");
+ if (DEBUG) ProvisionLogger.logd("Starting cdma activation activity");
startActivity(intent); // Activity will be a Nop if not a CDMA device.
}
@@ -398,11 +413,11 @@
try {
final AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
if (timeZone != null) {
- ProvisionLogger.logd("Setting time zone to " + timeZone);
+ if (DEBUG) ProvisionLogger.logd("Setting time zone to " + timeZone);
am.setTimeZone(timeZone);
}
if (localTime > 0) {
- ProvisionLogger.logd("Setting time to " + localTime);
+ if (DEBUG) ProvisionLogger.logd("Setting time to " + localTime);
am.setTime(localTime);
}
} catch (Exception e) {
@@ -416,7 +431,7 @@
return;
}
try {
- ProvisionLogger.logd("Setting locale to " + locale);
+ if (DEBUG) ProvisionLogger.logd("Setting locale to " + locale);
// If locale is different from current locale this results in a configuration change,
// which will trigger the restarting of the activity.
LocalePicker.updateLocale(locale);
@@ -428,12 +443,12 @@
@Override
public void onCreate () {
- ProvisionLogger.logd("Device owner provisioning service ONCREATE.");
+ if (DEBUG) ProvisionLogger.logd("Device owner provisioning service ONCREATE.");
}
@Override
public void onDestroy () {
- ProvisionLogger.logd("Device owner provisioning service ONDESTROY");
+ if (DEBUG) ProvisionLogger.logd("Device owner provisioning service ONDESTROY");
if (mAddWifiNetworkTask != null) {
mAddWifiNetworkTask.cleanUp();
}
diff --git a/src/com/android/managedprovisioning/IntentStore.java b/src/com/android/managedprovisioning/IntentStore.java
index f239c49..ae5839a 100644
--- a/src/com/android/managedprovisioning/IntentStore.java
+++ b/src/com/android/managedprovisioning/IntentStore.java
@@ -15,24 +15,24 @@
*/
package com.android.managedprovisioning;
+import android.accounts.Account;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
-
import android.os.Bundle;
import android.os.PersistableBundle;
import android.util.Xml;
-import java.io.IOException;
-import java.io.StringReader;
-import java.io.StringWriter;
-
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
import org.xmlpull.v1.XmlSerializer;
+import java.io.IOException;
+import java.io.StringReader;
+import java.io.StringWriter;
+
/**
* Helper class to load/save resume information from Intents into a SharedPreferences.
*/
@@ -48,8 +48,12 @@
private String[] mIntKeys = new String[0];
private String[] mBooleanKeys = new String[0];
private String[] mPersistableBundleKeys = new String[0];
+ private String[] mAccountKeys = new String[0];
private static final String TAG_PERSISTABLEBUNDLE = "persistable_bundle";
+ private static final String TAG_ACCOUNT = "account";
+ private static final String ATTRIBUTE_ACCOUNT_NAME = "name";
+ private static final String ATTRIBUTE_ACCOUNT_TYPE = "type";
private static final String IS_SET = "isSet";
@@ -80,6 +84,11 @@
return this;
}
+ public IntentStore setAccountKeys(String[] keys) {
+ mAccountKeys = (keys == null) ? new String[0] : keys;
+ return this;
+ }
+
public IntentStore setPersistableBundleKeys(String[] keys) {
mPersistableBundleKeys = (keys == null) ? new String[0] : keys;
return this;
@@ -105,6 +114,13 @@
for (String key : mBooleanKeys) {
editor.putBoolean(key, data.getBoolean(key));
}
+ for (String key : mAccountKeys) {
+ Account account = (Account) data.getParcelable(key);
+ String accountString = accountToString(account);
+ if (accountString != null) {
+ editor.putString(key, accountString);
+ }
+ }
for (String key : mPersistableBundleKeys) {
// Cast should be guaranteed to succeed by check in the provisioning activities.
@@ -147,6 +163,14 @@
result.putExtra(key, mPrefs.getBoolean(key, false));
}
}
+ for (String key : mAccountKeys) {
+ if (mPrefs.contains(key)) {
+ Account account = stringToAccount(mPrefs.getString(key, null));
+ if (account != null) {
+ result.putExtra(key, account);
+ }
+ }
+ }
for (String key : mPersistableBundleKeys) {
if (mPrefs.contains(key)) {
PersistableBundle bundle = stringToPersistableBundle(mPrefs.getString(key, null));
@@ -159,6 +183,58 @@
return result;
}
+ private String accountToString(Account account) {
+ if (account == null) {
+ return null;
+ }
+ StringWriter writer = new StringWriter();
+ XmlSerializer serializer = Xml.newSerializer();
+ try {
+ serializer.setOutput(writer);
+ serializer.startDocument(null, true);
+ serializer.startTag(null, TAG_ACCOUNT);
+ serializer.attribute(null /* namespace */, ATTRIBUTE_ACCOUNT_NAME, account.name);
+ serializer.attribute(null /* namespace */, ATTRIBUTE_ACCOUNT_TYPE, account.type);
+ serializer.endTag(null, TAG_ACCOUNT);
+ serializer.endDocument();
+ } catch (IOException e) {
+ ProvisionLogger.loge("Account could not be stored as string.", e);
+ return null;
+ }
+
+ return writer.toString();
+ }
+
+ private Account stringToAccount(String string) {
+ if (string == null) {
+ return null;
+ }
+ XmlPullParserFactory factory;
+ XmlPullParser parser;
+ try {
+ factory = XmlPullParserFactory.newInstance();
+
+ parser = factory.newPullParser();
+ parser.setInput(new StringReader(string));
+
+ if ((parser.next() == XmlPullParser.START_TAG)
+ && TAG_ACCOUNT.equals(parser.getName())) {
+ String name = parser.getAttributeValue(null /* namespace */,
+ ATTRIBUTE_ACCOUNT_NAME);
+ String type = parser.getAttributeValue(null /* namespace */,
+ ATTRIBUTE_ACCOUNT_TYPE);
+ if (name != null && type != null) {
+ return new Account(name, type);
+ }
+ }
+ } catch (IOException|XmlPullParserException e) {
+ ProvisionLogger.loge(e);
+ // Fall through.
+ }
+ ProvisionLogger.loge("Account could not be restored from string " + string);
+ return null;
+ }
+
private String persistableBundleToString(PersistableBundle bundle) {
if (bundle == null) {
return null;
diff --git a/src/com/android/managedprovisioning/ManagedProvisioningErrorDialog.java b/src/com/android/managedprovisioning/ManagedProvisioningErrorDialog.java
deleted file mode 100644
index ad123bd..0000000
--- a/src/com/android/managedprovisioning/ManagedProvisioningErrorDialog.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright 2014, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.managedprovisioning;
-
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.app.DialogFragment;
-import android.content.DialogInterface;
-import android.os.Bundle;
-
-/**
- * Dialog used to notify the user that the managed provisioning failed, and shutdown the current
- * activity.
- *
- * Note: You should not do any more work in your app after showing this dialog. See guidelines for
- * {@code Activity#finish()} method call.
- */
-public class ManagedProvisioningErrorDialog extends DialogFragment {
-
- private final String message;
-
- public ManagedProvisioningErrorDialog(String message) {
- super();
- this.message = message;
- }
-
- @Override
- public Dialog onCreateDialog(Bundle savedInstanceState) {
- // TODO: This disappears when you rotate, fix it when we refactor the app
-
- AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getActivity());
- // TODO: Get strings from PM.
- alertDialogBuilder.setTitle(R.string.provisioning_error_title)
- .setMessage(message)
- .setCancelable(false)
- .setPositiveButton("OK", new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog,int id) {
- // Close activity
- getActivity().setResult(Activity.RESULT_CANCELED);
- getActivity().finish();
- }});
- return alertDialogBuilder.create();
- }
-}
diff --git a/src/com/android/managedprovisioning/MessageParser.java b/src/com/android/managedprovisioning/MessageParser.java
index dcca445..1cb77d7 100644
--- a/src/com/android/managedprovisioning/MessageParser.java
+++ b/src/com/android/managedprovisioning/MessageParser.java
@@ -32,6 +32,7 @@
import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION;
import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER;
import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM;
+import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED;
import static android.app.admin.DevicePolicyManager.MIME_TYPE_PROVISIONING_NFC;
import static java.nio.charset.StandardCharsets.UTF_8;
@@ -78,6 +79,8 @@
* sum of the target file {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM}.
* Additional information to send through to the device admin may be specified in
* {@link #EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE}.
+ * The boolean {@link #EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED} indicates wheter system
+ * apps should not be disabled.
* Furthermore a wifi network may be specified in {@link #EXTRA_PROVISIONING_WIFI_SSID}, and if
* applicable {@link #EXTRA_PROVISIONING_WIFI_HIDDEN},
* {@link #EXTRA_PROVISIONING_WIFI_SECURITY_TYPE}, {@link #EXTRA_PROVISIONING_WIFI_PASSWORD},
@@ -120,7 +123,8 @@
protected static final String[] DEVICE_OWNER_BOOLEAN_EXTRAS = {
EXTRA_PROVISIONING_WIFI_HIDDEN,
- EXTRA_PROVISIONING_STARTED_BY_NFC
+ EXTRA_PROVISIONING_STARTED_BY_NFC,
+ EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED
};
protected static final String[] DEVICE_OWNER_PERSISTABLE_BUNDLE_EXTRAS = {
@@ -151,6 +155,8 @@
bundle.putBoolean(EXTRA_PROVISIONING_WIFI_HIDDEN, params.mWifiHidden);
bundle.putBoolean(EXTRA_PROVISIONING_STARTED_BY_NFC, params.mStartedByNfc);
+ bundle.putBoolean(EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED,
+ params.mLeaveAllSystemAppsEnabled);
bundle.putParcelable(EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE, params.mAdminExtrasBundle);
}
@@ -232,6 +238,10 @@
params.mWifiHidden = Boolean.parseBoolean(s);
}
+ if ((s = props.getProperty(EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED)) != null) {
+ params.mLeaveAllSystemAppsEnabled = Boolean.parseBoolean(s);
+ }
+
checkValidityOfProvisioningParams(params);
return params;
} catch (IOException e) {
@@ -283,6 +293,9 @@
ProvisioningParams.DEFAULT_WIFI_HIDDEN);
params.mStartedByNfc = intent.getBooleanExtra(EXTRA_PROVISIONING_STARTED_BY_NFC,
false);
+ params.mLeaveAllSystemAppsEnabled = intent.getBooleanExtra(
+ EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED,
+ ProvisioningParams.DEFAULT_LEAVE_ALL_SYSTEM_APPS_ENABLED);
try {
params.mAdminExtrasBundle = (PersistableBundle) intent.getParcelableExtra(
diff --git a/src/com/android/managedprovisioning/PreBootListener.java b/src/com/android/managedprovisioning/PreBootListener.java
index 942e202..151ef9a 100644
--- a/src/com/android/managedprovisioning/PreBootListener.java
+++ b/src/com/android/managedprovisioning/PreBootListener.java
@@ -37,49 +37,64 @@
public class PreBootListener extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
- int currentUserId = context.getUserId();
- if (currentUserId == UserHandle.USER_OWNER) {
- // Resetting the cross-profile intent filters for the managed profiles which have
- // this user as their parent.
- UserManager um = (UserManager) context.getSystemService(
- Context.USER_SERVICE);
- List<UserInfo> profiles = um.getProfiles(currentUserId);
- boolean hasClearedParent = false;
- if (profiles.size() > 1) {
- PackageManager pm = context.getPackageManager();
- for (UserInfo userInfo : profiles) {
- if (userInfo.isManagedProfile()) {
- if (!hasClearedParent) {
- // Removes filters from the parent to all the managed profiles.
- pm.clearCrossProfileIntentFilters(currentUserId);
- hasClearedParent = true;
- }
- pm.clearCrossProfileIntentFilters(userInfo.id);
- CrossProfileIntentFiltersHelper.setFilters(
- pm, currentUserId, userInfo.id);
- deleteNonRequiredApps(context, userInfo.id);
- }
- }
+ if (context.getUserId() != UserHandle.USER_OWNER) {
+ return;
+ }
+
+ DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService(
+ Context.DEVICE_POLICY_SERVICE);
+ PackageManager pm = context.getPackageManager();
+
+ // Check for device owner.
+ if (dpm.getDeviceOwner() != null && DeleteNonRequiredAppsTask
+ .shouldDeleteNonRequiredApps(context, UserHandle.USER_OWNER)) {
+
+ // Delete new apps.
+ deleteNonRequiredApps(context, dpm.getDeviceOwner(), UserHandle.USER_OWNER,
+ R.array.required_apps_managed_device,
+ R.array.vendor_required_apps_managed_device,
+ false /* Do not disable INSTALL_SHORTCUT listeners */);
+ }
+
+ // Check for managed profiles.
+ UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE);
+ List<UserInfo> profiles = um.getProfiles(UserHandle.USER_OWNER);
+ if (profiles.size() <= 1) {
+ return;
+ }
+
+ // Removes cross profile intent filters from the parent to all the managed profiles.
+ pm.clearCrossProfileIntentFilters(UserHandle.USER_OWNER);
+
+ // For each managed profile reset cross profile intent filters and delete new apps.
+ for (UserInfo userInfo : profiles) {
+ if (!userInfo.isManagedProfile()) {
+ continue;
}
+ pm.clearCrossProfileIntentFilters(userInfo.id);
+ CrossProfileIntentFiltersHelper.setFilters(
+ pm, UserHandle.USER_OWNER, userInfo.id);
+
+ ComponentName profileOwner = dpm.getProfileOwnerAsUser(userInfo.id);
+ if (profileOwner == null) {
+ // Shouldn't happen.
+ ProvisionLogger.loge("No profile owner on managed profile " + userInfo.id);
+ continue;
+ }
+ deleteNonRequiredApps(context, profileOwner.getPackageName(), userInfo.id,
+ R.array.required_apps_managed_profile,
+ R.array.vendor_required_apps_managed_profile,
+ true /* Disable INSTALL_SHORTCUT listeners */);
}
}
- /**
- * Deletes non-required apps that have been added to the system image during the system
- * update.
- */
- private void deleteNonRequiredApps(Context context, int userId) {
- DevicePolicyManager dpm = (DevicePolicyManager)
- context.getSystemService(Context.DEVICE_POLICY_SERVICE);
- ComponentName profileOwner = dpm.getProfileOwnerAsUser(userId);
- if (profileOwner == null) {
- ProvisionLogger.loge("There is no profile owner on a managed profile.");
- }
-
- new DeleteNonRequiredAppsTask(context, profileOwner.getPackageName(), userId,
- R.array.required_apps_managed_profile, R.array.vendor_required_apps_managed_profile,
- false /* We are not creating a new profile */,
- true /* Disable INSTALL_SHORTCUT listeners */,
+ private void deleteNonRequiredApps(Context context, String mdmPackageName, int userId,
+ int requiredAppsList, int vendorRequiredAppsList,
+ boolean disableInstallShortcutListeners) {
+ new DeleteNonRequiredAppsTask(context, mdmPackageName, userId,
+ requiredAppsList, vendorRequiredAppsList,
+ false /*we are not creating a new profile*/,
+ disableInstallShortcutListeners,
new DeleteNonRequiredAppsTask.Callback() {
@Override
diff --git a/src/com/android/managedprovisioning/ManagedProvisioningActivity.java b/src/com/android/managedprovisioning/ProfileOwnerPreProvisioningActivity.java
similarity index 72%
rename from src/com/android/managedprovisioning/ManagedProvisioningActivity.java
rename to src/com/android/managedprovisioning/ProfileOwnerPreProvisioningActivity.java
index ea79cf2..cd3ddb7 100644
--- a/src/com/android/managedprovisioning/ManagedProvisioningActivity.java
+++ b/src/com/android/managedprovisioning/ProfileOwnerPreProvisioningActivity.java
@@ -23,7 +23,9 @@
import static com.android.managedprovisioning.EncryptDeviceActivity.TARGET_PROFILE_OWNER;
import android.app.Activity;
+import android.app.admin.DevicePolicyManager;
import android.app.AlertDialog;
+import android.app.ProgressDialog;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
@@ -54,84 +56,63 @@
import java.util.List;
/**
- * Managed provisioning sets up a separate profile on a device whose primary user is already set up.
- * The typical example is setting up a corporate profile that is controlled by their employer on a
- * users personal device to keep personal and work data separate.
- *
- * The activity handles the input validation and UI for managed profile provisioning.
- * and starts the {@link ManagedProvisioningService}, which runs through the setup steps in an
- * async task.
+ * The activity sets up the environment in which the {@link ProfileOwnerProvisioningActivity} can be run.
+ * It makes sure the device is encrypted, the current launcher supports managed profiles, the
+ * provisioning intent extras are valid, and that the already present managed profile is removed.
*/
-// TODO: Proper error handling to report back to the user and potentially the mdm.
-public class ManagedProvisioningActivity extends Activity {
+public class ProfileOwnerPreProvisioningActivity extends Activity
+ implements UserConsentDialog.ConsentCallback {
private static final String MANAGE_USERS_PERMISSION = "android.permission.MANAGE_USERS";
// Note: must match the constant defined in HomeSettings
private static final String EXTRA_SUPPORT_MANAGED_PROFILES = "support_managed_profiles";
- protected static final String EXTRA_USER_HAS_CONSENTED_PROVISIONING =
- "com.android.managedprovisioning.EXTRA_USER_HAS_CONSENTED_PROVISIONING";
-
- // Aliases to start managed provisioning with and without MANAGE_USERS permission
+ // Aliases to start profile owner provisioning with and without MANAGE_USERS permission
protected static final ComponentName ALIAS_CHECK_CALLER =
new ComponentName("com.android.managedprovisioning",
- "com.android.managedprovisioning.ManagedProvisioningActivity");
+ "com.android.managedprovisioning.ProfileOwnerProvisioningActivity");
protected static final ComponentName ALIAS_NO_CHECK_CALLER =
new ComponentName("com.android.managedprovisioning",
- "com.android.managedprovisioning.ManagedProvisioningActivityNoCallerCheck");
+ "com.android.managedprovisioning.ProfileOwnerProvisioningActivityNoCallerCheck");
+ protected static final int PROVISIONING_REQUEST_CODE = 3;
protected static final int ENCRYPT_DEVICE_REQUEST_CODE = 2;
protected static final int CHANGE_LAUNCHER_REQUEST_CODE = 1;
private String mMdmPackageName;
- private BroadcastReceiver mServiceMessageReceiver;
-
- private View mContentView;
- private View mMainTextView;
- private View mProgressView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- ProvisionLogger.logd("Managed provisioning activity ONCREATE");
-
final LayoutInflater inflater = getLayoutInflater();
- mContentView = inflater.inflate(R.layout.user_consent, null);
- mMainTextView = mContentView.findViewById(R.id.main_text_container);
- mProgressView = mContentView.findViewById(R.id.progress_container);
- setContentView(mContentView);
+ View contentView = inflater.inflate(R.layout.user_consent, null);
+ setContentView(contentView);
// Check whether system has the required managed profile feature.
if (!systemHasManagedProfileFeature()) {
showErrorAndClose(R.string.managed_provisioning_not_supported,
- "Exiting managed provisioning, managed profiles feature is not available");
+ "Exiting managed profile provisioning, "
+ + "managed profiles feature is not available");
return;
}
if (Process.myUserHandle().getIdentifier() != UserHandle.USER_OWNER) {
showErrorAndClose(R.string.user_is_not_owner,
- "Exiting managed provisioning, calling user is not owner.");
+ "Exiting managed profile provisioning, calling user is not owner.");
return;
}
- // Setup broadcast receiver for feedback from service.
- mServiceMessageReceiver = new ServiceMessageReceiver();
- IntentFilter filter = new IntentFilter();
- filter.addAction(ManagedProvisioningService.ACTION_PROVISIONING_SUCCESS);
- filter.addAction(ManagedProvisioningService.ACTION_PROVISIONING_ERROR);
- LocalBroadcastManager.getInstance(this).registerReceiver(mServiceMessageReceiver, filter);
-
// Initialize member variables from the intent, stop if the intent wasn't valid.
try {
initialize(getIntent());
- } catch (ManagedProvisioningFailedException e) {
+ } catch (ProvisioningFailedException e) {
showErrorAndClose(R.string.managed_provisioning_error_text, e.getMessage());
return;
}
- setMdmIcon(mMdmPackageName, mContentView);
+ setMdmIcon(mMdmPackageName);
// If the caller started us via ALIAS_NO_CHECK_CALLER then they must have permission to
// MANAGE_USERS since it is a restricted intent. Otherwise, check the calling package.
@@ -154,6 +135,15 @@
}
}
+ DevicePolicyManager dpm =
+ (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
+ String deviceOwner = dpm.getDeviceOwner();
+ if (deviceOwner != null && !deviceOwner.equals(mMdmPackageName)) {
+ showErrorAndClose(R.string.managed_provisioning_error_text, "Permission denied, "
+ + "profile owner must be in the same package as device owner.");
+ return;
+ }
+
// If there is already a managed profile, allow the user to cancel or delete it.
int existingManagedProfileUserId = alreadyHasManagedProfile();
if (existingManagedProfileUserId != -1) {
@@ -164,7 +154,7 @@
}
private void showStartProvisioningScreen() {
- Button positiveButton = (Button) mContentView.findViewById(R.id.positive_button);
+ Button positiveButton = (Button) findViewById(R.id.positive_button);
positiveButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
@@ -174,13 +164,8 @@
}
private boolean packageHasManageUsersPermission(String pkg) {
- int packagePermission = this.getPackageManager()
+ return PackageManager.PERMISSION_GRANTED == getPackageManager()
.checkPermission(MANAGE_USERS_PERMISSION, pkg);
- if (packagePermission == PackageManager.PERMISSION_GRANTED) {
- return true;
- } else {
- return false;
- }
}
private boolean systemHasManagedProfileFeature() {
@@ -195,6 +180,9 @@
PackageManager pm = getPackageManager();
ResolveInfo launcherResolveInfo
= pm.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
+ if (launcherResolveInfo == null) {
+ return false;
+ }
try {
ApplicationInfo launcherAppInfo = getPackageManager().getApplicationInfo(
launcherResolveInfo.activityInfo.packageName, 0 /* default flags */);
@@ -208,39 +196,18 @@
return versionNumber >= Build.VERSION_CODES.LOLLIPOP;
}
- class ServiceMessageReceiver extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
- if (action.equals(ManagedProvisioningService.ACTION_PROVISIONING_SUCCESS)) {
- ProvisionLogger.logd("Successfully provisioned."
- + "Finishing ManagedProvisioningActivity");
- ManagedProvisioningActivity.this.setResult(Activity.RESULT_OK);
- ManagedProvisioningActivity.this.finish();
- return;
- } else if (action.equals(ManagedProvisioningService.ACTION_PROVISIONING_ERROR)) {
- String errorLogMessage = intent.getStringExtra(
- ManagedProvisioningService.EXTRA_LOG_MESSAGE_KEY);
- ProvisionLogger.logd("Error reported: " + errorLogMessage);
- showErrorAndClose(R.string.managed_provisioning_error_text, errorLogMessage);
- return;
- }
- }
- }
-
- private void setMdmIcon(String packageName, View contentView) {
+ private void setMdmIcon(String packageName) {
if (packageName != null) {
PackageManager pm = getPackageManager();
try {
ApplicationInfo ai = pm.getApplicationInfo(packageName, /* default flags */ 0);
if (ai != null) {
Drawable packageIcon = pm.getApplicationIcon(packageName);
- ImageView imageView = (ImageView) contentView.findViewById(R.id.mdm_icon_view);
+ ImageView imageView = (ImageView) findViewById(R.id.mdm_icon_view);
imageView.setImageDrawable(packageIcon);
String appLabel = pm.getApplicationLabel(ai).toString();
- TextView deviceManagerName = (TextView) contentView
- .findViewById(R.id.device_manager_name);
+ TextView deviceManagerName = (TextView) findViewById(R.id.device_manager_name);
deviceManagerName.setText(appLabel);
}
} catch (PackageManager.NameNotFoundException e) {
@@ -257,13 +224,13 @@
*
* @param intent The intent that started provisioning
*/
- private void initialize(Intent intent) throws ManagedProvisioningFailedException {
+ private void initialize(Intent intent) throws ProvisioningFailedException {
// Check if the admin extras bundle is of the right type.
try {
PersistableBundle bundle = (PersistableBundle) getIntent().getParcelableExtra(
EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE);
} catch (ClassCastException e) {
- throw new ManagedProvisioningFailedException("Extra "
+ throw new ProvisioningFailedException("Extra "
+ EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE
+ " must be of type PersistableBundle.", e);
}
@@ -271,29 +238,18 @@
// Validate package name and check if the package is installed
mMdmPackageName = intent.getStringExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME);
if (TextUtils.isEmpty(mMdmPackageName)) {
- throw new ManagedProvisioningFailedException("Missing intent extra: "
+ throw new ProvisioningFailedException("Missing intent extra: "
+ EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME);
} else {
try {
this.getPackageManager().getPackageInfo(mMdmPackageName, 0);
} catch (NameNotFoundException e) {
- throw new ManagedProvisioningFailedException("Mdm "+ mMdmPackageName
+ throw new ProvisioningFailedException("Mdm "+ mMdmPackageName
+ " is not installed. ", e);
}
}
}
- @Override
- public void onBackPressed() {
- // TODO: Handle this graciously by stopping the provisioning flow and cleaning up.
- }
-
- @Override
- public void onDestroy() {
- LocalBroadcastManager.getInstance(this).unregisterReceiver(mServiceMessageReceiver);
- super.onDestroy();
- }
-
/**
* If the device is encrypted start the service which does the provisioning, otherwise ask for
* user consent to encrypt the device.
@@ -304,13 +260,8 @@
// Notify the user once more that the admin will have full control over the profile,
// then start provisioning.
- new UserConsentDialog(this, UserConsentDialog.PROFILE_OWNER, new Runnable() {
- @Override
- public void run() {
- setupEnvironmentAndProvision();
- }
- } /* onUserConsented */ , null /* onCancel */).show(getFragmentManager(),
- "UserConsentDialogFragment");
+ UserConsentDialog.newInstance(UserConsentDialog.PROFILE_OWNER)
+ .show(getFragmentManager(), "UserConsentDialogFragment");
} else {
Bundle resumeExtras = getIntent().getExtras();
resumeExtras.putString(EXTRA_RESUME_TARGET, TARGET_PROFILE_OWNER);
@@ -321,18 +272,25 @@
}
}
+ @Override
+ public void onDialogConsent() {
+ setupEnvironmentAndProvision();
+ }
+
+ @Override
+ public void onDialogCancel() {
+ // Do nothing.
+ }
+
private void setupEnvironmentAndProvision() {
// Remove any pre-provisioning UI in favour of progress display
- BootReminder.cancelProvisioningReminder(
- ManagedProvisioningActivity.this);
- mProgressView.setVisibility(View.VISIBLE);
- mMainTextView.setVisibility(View.GONE);
+ BootReminder.cancelProvisioningReminder(this);
// Check whether the current launcher supports managed profiles.
if (!currentLauncherSupportsManagedProfiles()) {
showCurrentLauncherInvalid();
} else {
- startManagedProvisioningService();
+ startProfileOwnerProvisioning();
}
}
@@ -343,10 +301,10 @@
// Continue in onActivityResult.
}
- private void startManagedProvisioningService() {
- Intent intent = new Intent(this, ManagedProvisioningService.class);
+ private void startProfileOwnerProvisioning() {
+ Intent intent = new Intent(this, ProfileOwnerProvisioningActivity.class);
intent.putExtras(getIntent());
- startService(intent);
+ startActivityForResult(intent, PROVISIONING_REQUEST_CODE);
}
@Override
@@ -361,9 +319,13 @@
if (resultCode == RESULT_CANCELED) {
showCurrentLauncherInvalid();
} else if (resultCode == RESULT_OK) {
- startManagedProvisioningService();
+ startProfileOwnerProvisioning();
}
}
+ if (requestCode == PROVISIONING_REQUEST_CODE) {
+ setResult(resultCode);
+ finish();
+ }
}
private void showCurrentLauncherInvalid() {
@@ -390,8 +352,19 @@
public void showErrorAndClose(int resourceId, String logText) {
ProvisionLogger.loge(logText);
- new ManagedProvisioningErrorDialog(getString(resourceId))
- .show(getFragmentManager(), "ErrorDialogFragment");
+ new AlertDialog.Builder(this)
+ .setTitle(R.string.provisioning_error_title)
+ .setMessage(getString(resourceId))
+ .setCancelable(false)
+ .setPositiveButton(R.string.device_owner_error_ok, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog,int id) {
+ // Close activity
+ ProfileOwnerPreProvisioningActivity.this
+ .setResult(Activity.RESULT_CANCELED);
+ ProfileOwnerPreProvisioningActivity.this.finish();
+ }
+ }).show();
}
/**
@@ -449,7 +422,7 @@
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
- ManagedProvisioningActivity.this.finish();
+ ProfileOwnerPreProvisioningActivity.this.finish();
}
};
@@ -462,17 +435,17 @@
return builder.create();
}
/**
- * Exception thrown when the managed provisioning has failed completely.
+ * Exception thrown when the provisioning has failed completely.
*
* We're using a custom exception to avoid catching subsequent exceptions that might be
* significant.
*/
- private class ManagedProvisioningFailedException extends Exception {
- public ManagedProvisioningFailedException(String message) {
+ private class ProvisioningFailedException extends Exception {
+ public ProvisioningFailedException(String message) {
super(message);
}
- public ManagedProvisioningFailedException(String message, Throwable t) {
+ public ProvisioningFailedException(String message, Throwable t) {
super(message, t);
}
}
diff --git a/src/com/android/managedprovisioning/ProfileOwnerProvisioningActivity.java b/src/com/android/managedprovisioning/ProfileOwnerProvisioningActivity.java
new file mode 100644
index 0000000..a785b09
--- /dev/null
+++ b/src/com/android/managedprovisioning/ProfileOwnerProvisioningActivity.java
@@ -0,0 +1,328 @@
+/*
+ * Copyright 2014, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.managedprovisioning;
+
+import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE;
+
+import android.accounts.Account;
+import android.accounts.AccountManager;
+import android.accounts.AccountManagerFuture;
+import android.accounts.AuthenticatorException;
+import android.accounts.OperationCanceledException;
+import android.app.Activity;
+import android.app.ActivityManagerNative;
+import android.app.AlertDialog;
+import android.app.IActivityManager;
+import android.app.ProgressDialog;
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.RemoteException;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.provider.Settings;
+import android.support.v4.content.LocalBroadcastManager;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
+
+import java.io.IOException;
+
+/**
+ * Profile owner provisioning sets up a separate profile on a device whose primary user is already
+ * set up.
+ *
+ * <p>
+ * The typical example is setting up a corporate profile that is controlled by their employer on a
+ * users personal device to keep personal and work data separate.
+ *
+ * <p>
+ * The activity handles the UI for managed profile provisioning and starts the
+ * {@link ProfileOwnerProvisioningService}, which runs through the setup steps in an
+ * async task.
+ */
+public class ProfileOwnerProvisioningActivity extends Activity {
+ protected static final String ACTION_CANCEL_PROVISIONING =
+ "com.android.managedprovisioning.CANCEL_PROVISIONING";
+
+ private BroadcastReceiver mServiceMessageReceiver;
+
+ // Provisioning service started
+ private static final int CANCELSTATUS_PROVISIONING = 1;
+ // Back button pressed during provisioning, confirm dialog showing.
+ private static final int CANCELSTATUS_CONFIRMING = 2;
+ // Cancel confirmed, waiting for the provisioning service to complete.
+ private static final int CANCELSTATUS_CANCELLING = 3;
+ // Cancelling not possible anymore, provisioning already finished succesfully.
+ private static final int CANCELSTATUS_FINALIZING = 4;
+
+ private static final String KEY_CANCELSTATUS= "cancelstatus";
+ private static final String KEY_PENDING_INTENT = "pending_intent";
+
+ private int mCancelStatus = CANCELSTATUS_PROVISIONING;
+ private Intent mPendingProvisioningResult = null;
+ private ProgressDialog mCancelProgressDialog = null;
+ private AccountManager mAccountManager;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ ProvisionLogger.logd("Profile owner provisioning activity ONCREATE");
+ mAccountManager = (AccountManager) getSystemService(Context.ACCOUNT_SERVICE);
+
+ if (savedInstanceState != null) {
+ mCancelStatus = savedInstanceState.getInt(KEY_CANCELSTATUS, CANCELSTATUS_PROVISIONING);
+ mPendingProvisioningResult = savedInstanceState.getParcelable(KEY_PENDING_INTENT);
+ }
+
+ final LayoutInflater inflater = getLayoutInflater();
+ View contentView = inflater.inflate(R.layout.progress, null);
+ setContentView(contentView);
+ TextView textView = (TextView) findViewById(R.id.prog_text);
+ if (textView != null) textView.setText(getString(R.string.setting_up_workspace));
+
+
+ if (mCancelStatus == CANCELSTATUS_CONFIRMING) {
+ showCancelProvisioningDialog();
+ } else if (mCancelStatus == CANCELSTATUS_CANCELLING) {
+ showCancelProgressDialog();
+ }
+ }
+
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+
+ // Setup broadcast receiver for feedback from service.
+ mServiceMessageReceiver = new ServiceMessageReceiver();
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(ProfileOwnerProvisioningService.ACTION_PROVISIONING_SUCCESS);
+ filter.addAction(ProfileOwnerProvisioningService.ACTION_PROVISIONING_ERROR);
+ filter.addAction(ProfileOwnerProvisioningService.ACTION_PROVISIONING_CANCELLED);
+ LocalBroadcastManager.getInstance(this).registerReceiver(mServiceMessageReceiver, filter);
+
+ // Start service async to make sure the UI is loaded first.
+ final Handler handler = new Handler(getMainLooper());
+ handler.post(new Runnable() {
+ @Override
+ public void run() {
+ Intent intent = new Intent(ProfileOwnerProvisioningActivity.this,
+ ProfileOwnerProvisioningService.class);
+ intent.putExtras(getIntent());
+ startService(intent);
+ }
+ });
+ }
+
+ class ServiceMessageReceiver extends BroadcastReceiver {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (mCancelStatus == CANCELSTATUS_CONFIRMING) {
+ // Store the incoming intent and only process it after the user has responded to
+ // the cancel dialog
+ mPendingProvisioningResult = intent;
+ return;
+ }
+ handleProvisioningResult(intent);
+ }
+ }
+
+ private void handleProvisioningResult(Intent intent) {
+ String action = intent.getAction();
+ if (ProfileOwnerProvisioningService.ACTION_PROVISIONING_SUCCESS.equals(action)) {
+ if (mCancelStatus == CANCELSTATUS_CANCELLING) {
+ return;
+ }
+
+ ProvisionLogger.logd("Successfully provisioned."
+ + "Finishing ProfileOwnerProvisioningActivity");
+
+ Intent pendingIntent = (Intent) intent.getParcelableExtra(
+ ProfileOwnerProvisioningService.EXTRA_PENDING_SUCCESS_INTENT);
+ int serialNumber = intent.getIntExtra(
+ ProfileOwnerProvisioningService.EXTRA_PROFILE_USER_SERIAL_NUMBER, -1);
+
+ int userId = intent.getIntExtra(ProfileOwnerProvisioningService.EXTRA_PROFILE_USER_ID,
+ -1);
+ onProvisioningSuccess(pendingIntent, userId, serialNumber);
+ } else if (ProfileOwnerProvisioningService.ACTION_PROVISIONING_ERROR.equals(action)) {
+ if (mCancelStatus == CANCELSTATUS_CANCELLING){
+ return;
+ }
+ String errorLogMessage = intent.getStringExtra(
+ ProfileOwnerProvisioningService.EXTRA_LOG_MESSAGE_KEY);
+ ProvisionLogger.logd("Error reported: " + errorLogMessage);
+ error(R.string.managed_provisioning_error_text, errorLogMessage);
+ } if (ProfileOwnerProvisioningService.ACTION_PROVISIONING_CANCELLED.equals(action)) {
+ if (mCancelStatus != CANCELSTATUS_CANCELLING) {
+ return;
+ }
+ mCancelProgressDialog.dismiss();
+ ProfileOwnerProvisioningActivity.this.setResult(Activity.RESULT_CANCELED);
+ stopService(new Intent(ProfileOwnerProvisioningActivity.this,
+ ProfileOwnerProvisioningService.class));
+ ProfileOwnerProvisioningActivity.this.finish();
+ }
+ }
+
+ @Override
+ public void onBackPressed() {
+ if (mCancelStatus == CANCELSTATUS_PROVISIONING) {
+ showCancelProvisioningDialog();
+ }
+ }
+
+ private void showCancelProvisioningDialog() {
+ mCancelStatus = CANCELSTATUS_CONFIRMING;
+ AlertDialog alertDialog = new AlertDialog.Builder(this)
+ .setCancelable(false)
+ .setTitle(R.string.profile_owner_cancel_title)
+ .setMessage(R.string.profile_owner_cancel_message)
+ .setNegativeButton(R.string.profile_owner_cancel_cancel,
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog,int id) {
+ mCancelStatus = CANCELSTATUS_PROVISIONING;
+ if (mPendingProvisioningResult != null) {
+ handleProvisioningResult(mPendingProvisioningResult);
+ }
+ }
+ })
+ .setPositiveButton(R.string.profile_owner_cancel_ok,
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog,int id) {
+ confirmCancel();
+ }
+ })
+ .create();
+ alertDialog.show();
+ }
+
+ protected void showCancelProgressDialog() {
+ mCancelProgressDialog = new ProgressDialog(this);
+ mCancelProgressDialog.setMessage(getText(R.string.profile_owner_cancelling));
+ mCancelProgressDialog.setCancelable(false);
+ mCancelProgressDialog.setCanceledOnTouchOutside(false);
+ mCancelProgressDialog.show();
+ }
+
+ public void error(int resourceId, String logText) {
+ ProvisionLogger.loge(logText);
+ new AlertDialog.Builder(this)
+ .setTitle(R.string.provisioning_error_title)
+ .setMessage(getString(resourceId))
+ .setCancelable(false)
+ .setPositiveButton(R.string.device_owner_error_ok, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog,int id) {
+ confirmCancel();
+ }
+ }).show();
+ }
+
+ private void confirmCancel() {
+ mCancelStatus = CANCELSTATUS_CANCELLING;
+ Intent intent = new Intent(ProfileOwnerProvisioningActivity.this,
+ ProfileOwnerProvisioningService.class);
+ intent.setAction(ACTION_CANCEL_PROVISIONING);
+ startService(intent);
+ showCancelProgressDialog();
+ }
+
+ /**
+ * Notify the mdm that provisioning has completed. When the mdm has received the intent, stop
+ * the service and notify the {@link ProfileOwnerProvisioningActivity} so that it can finish itself.
+ */
+ private void onProvisioningSuccess(Intent pendingSuccessIntent, int userId, int serialNumber) {
+ mCancelStatus = CANCELSTATUS_FINALIZING;
+ Settings.Secure.putIntForUser(getContentResolver(), Settings.Secure.USER_SETUP_COMPLETE,
+ 1 /* true- > setup complete */, userId);
+
+ UserManager userManager = (UserManager) getSystemService(Context.USER_SERVICE);
+ UserHandle userHandle = userManager.getUserForSerialNumber(serialNumber);
+
+ // Use an ordered broadcast, so that we only finish when the mdm has received it.
+ // Avoids a lag in the transition between provisioning and the mdm.
+ BroadcastReceiver mdmReceivedSuccessReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ ProvisionLogger.logd("ACTION_PROFILE_PROVISIONING_COMPLETE broadcast received by"
+ + " mdm");
+ ProfileOwnerProvisioningActivity.this.setResult(Activity.RESULT_OK);
+
+ // Now cleanup the primary profile if necessary
+ if (getIntent().hasExtra(EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE)) {
+ ProvisionLogger.logd("Cleaning up account from the primary user.");
+ final Account account = (Account) getIntent().getParcelableExtra(
+ EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE);
+ new AsyncTask<Void, Void, Void>() {
+ @Override
+ protected Void doInBackground(Void... params) {
+ removeAccount(account);
+ return null;
+ }
+ }.execute();
+ }
+
+ ProfileOwnerProvisioningActivity.this.finish();
+ stopService(new Intent(ProfileOwnerProvisioningActivity.this,
+ ProfileOwnerProvisioningService.class));
+ }
+ };
+
+ sendOrderedBroadcastAsUser(pendingSuccessIntent, userHandle, null,
+ mdmReceivedSuccessReceiver, null, Activity.RESULT_OK, null, null);
+ ProvisionLogger.logd("Provisioning complete broadcast has been sent to user "
+ + userHandle.getIdentifier());
+ }
+
+ private void removeAccount(Account account) {
+ try {
+ AccountManagerFuture<Bundle> bundle = mAccountManager.removeAccount(account,
+ this, null /* callback */, null /* handler */);
+ if (bundle.getResult().getBoolean(AccountManager.KEY_BOOLEAN_RESULT, false)) {
+ ProvisionLogger.logw("Account removed from the primary user.");
+ } else {
+ ProvisionLogger.logw("Could not remove account from the primary user.");
+ }
+ } catch (OperationCanceledException | AuthenticatorException | IOException e) {
+ ProvisionLogger.logw("Exception removing account from the primary user.", e);
+ }
+ }
+
+ @Override
+ protected void onSaveInstanceState(Bundle outState) {
+ outState.putInt(KEY_CANCELSTATUS, mCancelStatus);
+ outState.putParcelable(KEY_PENDING_INTENT, mPendingProvisioningResult);
+ }
+
+ @Override
+ public void onPause() {
+ LocalBroadcastManager.getInstance(this).unregisterReceiver(mServiceMessageReceiver);
+ super.onPause();
+ }
+}
+
diff --git a/src/com/android/managedprovisioning/ManagedProvisioningService.java b/src/com/android/managedprovisioning/ProfileOwnerProvisioningService.java
similarity index 66%
rename from src/com/android/managedprovisioning/ManagedProvisioningService.java
rename to src/com/android/managedprovisioning/ProfileOwnerProvisioningService.java
index f63a244..44a6048 100644
--- a/src/com/android/managedprovisioning/ManagedProvisioningService.java
+++ b/src/com/android/managedprovisioning/ProfileOwnerProvisioningService.java
@@ -17,10 +17,15 @@
package com.android.managedprovisioning;
import static android.app.admin.DeviceAdminReceiver.ACTION_PROFILE_PROVISIONING_COMPLETE;
+import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE;
import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE;
import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME;
import static android.Manifest.permission.BIND_DEVICE_ADMIN;
+import android.accounts.Account;
+import android.accounts.AccountManager;
+import android.accounts.AuthenticatorException;
+import android.accounts.OperationCanceledException;
import android.app.Activity;
import android.app.ActivityManagerNative;
import android.app.IActivityManager;
@@ -30,7 +35,6 @@
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
-import android.content.IntentFilter;
import android.content.pm.ActivityInfo;
import android.content.pm.IPackageManager;
import android.content.pm.PackageInfo;
@@ -38,35 +42,45 @@
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.UserInfo;
import android.os.AsyncTask;
+import android.os.IBinder;
import android.os.Parcelable;
import android.os.PersistableBundle;
-import android.os.IBinder;
import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.MediaStore;
-import android.provider.Settings;
import android.support.v4.content.LocalBroadcastManager;
import android.text.TextUtils;
import com.android.managedprovisioning.CrossProfileIntentFiltersHelper;
import com.android.managedprovisioning.task.DeleteNonRequiredAppsTask;
+import java.io.IOException;
+
/**
- * Service that runs the managed provisioning.
+ * Service that runs the profile owner provisioning.
*
- * <p>This service is started from and sends updates to the {@link ManagedProvisioningActivity},
+ * <p>This service is started from and sends updates to the {@link ProfileOwnerProvisioningActivity},
* which contains the provisioning UI.
*/
-public class ManagedProvisioningService extends Service {
+public class ProfileOwnerProvisioningService extends Service {
+ // Extra keys for reporting back success to the activity.
+ public static final String EXTRA_PROFILE_USER_ID =
+ "com.android.managedprovisioning.extra.profile_user_id";
+ public static final String EXTRA_PROFILE_USER_SERIAL_NUMBER =
+ "com.android.managedprovisioning.extra.profile_user_serial_number";
+ public static final String EXTRA_PENDING_SUCCESS_INTENT =
+ "com.android.managedprovisioning.extra.pending_success_intent";
// Intent actions for communication with DeviceOwnerProvisioningService.
public static final String ACTION_PROVISIONING_SUCCESS =
"com.android.managedprovisioning.provisioning_success";
public static final String ACTION_PROVISIONING_ERROR =
"com.android.managedprovisioning.error";
+ public static final String ACTION_PROVISIONING_CANCELLED =
+ "com.android.managedprovisioning.cancelled";
public static final String EXTRA_LOG_MESSAGE_KEY = "ProvisioingErrorLogMessage";
private String mMdmPackageName;
@@ -75,15 +89,23 @@
// PersistableBundle extra received in starting intent.
// Should be passed through to device management application when provisioning is complete.
private PersistableBundle mAdminExtrasBundle;
+ private Account mAccountToMigrate;
private IPackageManager mIpm;
private UserInfo mManagedProfileUserInfo;
+ private AccountManager mAccountManager;
private UserManager mUserManager;
private int mStartIdProvisioning;
- private AsyncTask<Intent, Object, Void> runnerTask;
+ private AsyncTask<Intent, Void, Void> runnerTask;
- private class RunnerTask extends AsyncTask<Intent, Object, Void> {
+ // MessageId of the last error message.
+ private String mLastErrorMessage = null;
+
+ private boolean mDone = false;
+ private boolean mCancelInFuture = false;
+
+ private class RunnerTask extends AsyncTask<Intent, Void, Void> {
@Override
protected Void doInBackground(Intent ... intents) {
initialize(intents[0]);
@@ -96,9 +118,8 @@
public void onCreate() {
super.onCreate();
- ProvisionLogger.logd("Managed provisioning service ONCREATE");
-
mIpm = IPackageManager.Stub.asInterface(ServiceManager.getService("package"));
+ mAccountManager = (AccountManager) getSystemService(Context.ACCOUNT_SERVICE);
mUserManager = (UserManager) getSystemService(Context.USER_SERVICE);
runnerTask = new RunnerTask();
@@ -106,19 +127,54 @@
@Override
public int onStartCommand(final Intent intent, int flags, int startId) {
+ if (ProfileOwnerProvisioningActivity.ACTION_CANCEL_PROVISIONING.equals(intent.getAction())) {
+ ProvisionLogger.logd("Cancelling profile owner provisioning service");
+ cancelProvisioning();
+ return START_NOT_STICKY;
+ }
- ProvisionLogger.logd("Starting managed provisioning service");
+ ProvisionLogger.logd("Starting profile owner provisioning service");
+
try {
runnerTask.execute(intent);
- } catch (IllegalStateException ex) {
- ProvisionLogger.logd("ManagedProvisioningService: Provisioning already in progress, "
- + "second provisioning intent not being processed");
+ } catch (IllegalStateException e) {
+ // runnerTask is either in progress, or finished.
+ ProvisionLogger.logd(
+ "ProfileOwnerProvisioningService: Provisioning already started, "
+ + "second provisioning intent not being processed, only reporting status.");
+ reportStatus();
}
return START_NOT_STICKY;
}
+ private void reportStatus() {
+ if (mLastErrorMessage != null) {
+ sendError();
+ }
+ synchronized (this) {
+ if (mDone) {
+ notifyActivityOfSuccess();
+ }
+ }
+ }
+
+ private void cancelProvisioning() {
+ synchronized (this) {
+ if (!mDone) {
+ mCancelInFuture = true;
+ return;
+ }
+ cleanup();
+ }
+ }
+
private void initialize(Intent intent) {
mMdmPackageName = intent.getStringExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME);
+ mAccountToMigrate = (Account) intent.getParcelableExtra(
+ EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE);
+ if (mAccountToMigrate != null) {
+ ProvisionLogger.logi("Migrating account to managed profile");
+ }
// Cast is guaranteed by check in Activity.
mAdminExtrasBundle = (PersistableBundle) intent.getParcelableExtra(
@@ -186,13 +242,83 @@
* apps not needed have been deleted).
*/
private void setUpProfileAndFinish() {
- installMdmOnManagedProfile();
- setMdmAsActiveAdmin();
- setMdmAsManagedProfileOwner();
- startManagedProfile();
- CrossProfileIntentFiltersHelper.setFilters(
- getPackageManager(), getUserId(), mManagedProfileUserInfo.id);
- onProvisioningSuccess(mActiveAdminComponentName);
+ installMdmOnManagedProfile();
+ setMdmAsActiveAdmin();
+ setMdmAsManagedProfileOwner();
+ CrossProfileIntentFiltersHelper.setFilters(
+ getPackageManager(), getUserId(), mManagedProfileUserInfo.id);
+
+ if (!startManagedProfile(mManagedProfileUserInfo.id)) {
+ error("Could not start user in background");
+ return;
+ }
+ copyAccount(mAccountToMigrate);
+ synchronized (this) {
+ mDone = true;
+ if (mCancelInFuture) {
+ cleanup();
+ } else {
+ // Notify activity of success.
+ notifyActivityOfSuccess();
+ }
+ }
+ }
+
+ /**
+ * Initialize the user that underlies the managed profile.
+ * This is required so that the provisioning complete broadcast can be sent across to the
+ * profile and apps can run on it.
+ */
+ private boolean startManagedProfile(int userId) {
+ ProvisionLogger.logd("Starting user in background");
+ IActivityManager iActivityManager = ActivityManagerNative.getDefault();
+ try {
+ return iActivityManager.startUserInBackground(userId);
+ } catch (RemoteException neverThrown) {
+ // Never thrown, as we are making local calls.
+ ProvisionLogger.loge("This should not happen.", neverThrown);
+ }
+ return false;
+ }
+
+ private void notifyActivityOfSuccess() {
+ // Compose the intent that will be fired by the activity.
+ Intent completeIntent = new Intent(ACTION_PROFILE_PROVISIONING_COMPLETE);
+ completeIntent.setComponent(mActiveAdminComponentName);
+ completeIntent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES |
+ Intent.FLAG_RECEIVER_FOREGROUND);
+ if (mAdminExtrasBundle != null) {
+ completeIntent.putExtra(EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE,
+ mAdminExtrasBundle);
+ }
+
+ Intent successIntent = new Intent(ACTION_PROVISIONING_SUCCESS);
+ successIntent.putExtra(EXTRA_PROFILE_USER_ID, mManagedProfileUserInfo.id);
+ successIntent.putExtra(EXTRA_PENDING_SUCCESS_INTENT, completeIntent);
+ successIntent.putExtra(EXTRA_PROFILE_USER_SERIAL_NUMBER,
+ mManagedProfileUserInfo.serialNumber);
+ LocalBroadcastManager.getInstance(ProfileOwnerProvisioningService.this)
+ .sendBroadcast(successIntent);
+ }
+
+ private void copyAccount(Account account) {
+ if (account == null) {
+ ProvisionLogger.logd("No account to migrate to the managed profile.");
+ return;
+ }
+ ProvisionLogger.logd("Attempting to copy account to user " + mManagedProfileUserInfo.id);
+ try {
+ if (mAccountManager.copyAccountToUser(account, mManagedProfileUserInfo.getUserHandle(),
+ /* callback= */ null, /* handler= */ null).getResult()) {
+ ProvisionLogger.logi("Copied account to user " + mManagedProfileUserInfo.id);
+ } else {
+ ProvisionLogger.loge("Could not copy account to user "
+ + mManagedProfileUserInfo.id);
+ }
+ } catch (OperationCanceledException | AuthenticatorException | IOException e) {
+ ProvisionLogger.logw("Exception copying account to user " + mManagedProfileUserInfo.id,
+ e);
+ }
}
private void createProfile(String profileName) {
@@ -212,27 +338,7 @@
}
}
- /**
- * Initializes the user that underlies the managed profile.
- * This is required so that the provisioning complete broadcast can be sent across to the
- * profile and apps can run on it.
- */
- private void startManagedProfile() {
- ProvisionLogger.logd("Starting user in background");
- IActivityManager iActivityManager = ActivityManagerNative.getDefault();
- try {
- boolean success = iActivityManager.startUserInBackground(mManagedProfileUserInfo.id);
- if (!success) {
- error("Could not start user in background");
- }
- } catch (RemoteException neverThrown) {
- // Never thrown, as we are making local calls.
- ProvisionLogger.loge("This should not happen.", neverThrown);
- }
- }
-
private void installMdmOnManagedProfile() {
-
ProvisionLogger.logd("Installing mobile device management app " + mMdmPackageName +
" on managed profile");
@@ -261,7 +367,6 @@
}
private void setMdmAsManagedProfileOwner() {
-
ProvisionLogger.logd("Setting package " + mMdmPackageName + " as managed profile owner.");
DevicePolicyManager dpm =
@@ -274,7 +379,6 @@
}
private void setMdmAsActiveAdmin() {
-
ProvisionLogger.logd("Setting package " + mMdmPackageName + " as active admin.");
DevicePolicyManager dpm =
@@ -283,55 +387,15 @@
mManagedProfileUserInfo.id);
}
- /**
- * Notify the mdm that provisioning has completed. When the mdm has received the intent, stop
- * the service and notify the {@link ManagedProvisioningActivity} so that it can finish itself.
- *
- * @param deviceAdminComponent The component of the mdm that will be notified.
- */
- private void onProvisioningSuccess(ComponentName deviceAdminComponent) {
- Settings.Secure.putIntForUser(getContentResolver(), Settings.Secure.USER_SETUP_COMPLETE,
- 1 /* true- > setup complete */, mManagedProfileUserInfo.id);
-
- UserManager userManager = (UserManager) getSystemService(Context.USER_SERVICE);
- UserHandle userHandle = userManager.getUserForSerialNumber(
- mManagedProfileUserInfo.serialNumber);
-
- Intent completeIntent = new Intent(ACTION_PROFILE_PROVISIONING_COMPLETE);
- completeIntent.setComponent(mActiveAdminComponentName);
- completeIntent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES |
- Intent.FLAG_RECEIVER_FOREGROUND);
- if (mAdminExtrasBundle != null) {
- completeIntent.putExtra(EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE, mAdminExtrasBundle);
- }
-
- // Use an ordered broadcast, so that we only finish when the mdm has received it.
- // Avoids a lag in the transition between provisioning and the mdm.
- BroadcastReceiver mdmReceivedSuccessReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- ProvisionLogger.logd("ACTION_PROFILE_PROVISIONING_COMPLETE broadcast received by"
- + " mdm");
- Intent successIntent = new Intent(ACTION_PROVISIONING_SUCCESS);
- LocalBroadcastManager.getInstance(ManagedProvisioningService.this)
- .sendBroadcast(successIntent);
- stopSelf();
- }
-
- };
- sendOrderedBroadcastAsUser(completeIntent, userHandle, null,
- mdmReceivedSuccessReceiver, null, Activity.RESULT_OK, null, null);
-
- ProvisionLogger.logd("Provisioning complete broadcast has been sent to user "
- + userHandle.getIdentifier());
+ private void error(String dialogMessage) {
+ mLastErrorMessage = dialogMessage;
+ sendError();
}
- private void error(String logMessage) {
+ private void sendError() {
Intent intent = new Intent(ACTION_PROVISIONING_ERROR);
- intent.putExtra(EXTRA_LOG_MESSAGE_KEY, logMessage);
+ intent.putExtra(EXTRA_LOG_MESSAGE_KEY, mLastErrorMessage);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
- cleanup();
- stopSelf();
}
/**
@@ -343,15 +407,13 @@
ProvisionLogger.logd("Removing managed profile");
mUserManager.removeUser(mManagedProfileUserInfo.id);
}
+ Intent cancelIntent = new Intent(ACTION_PROVISIONING_CANCELLED);
+ LocalBroadcastManager.getInstance(ProfileOwnerProvisioningService.this)
+ .sendBroadcast(cancelIntent);
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
-
- @Override
- public void onDestroy() {
- ProvisionLogger.logd("ManagedProvisioningService ONDESTROY");
- }
}
diff --git a/src/com/android/managedprovisioning/ProvisioningParams.java b/src/com/android/managedprovisioning/ProvisioningParams.java
index 927ac12..ab919d2 100644
--- a/src/com/android/managedprovisioning/ProvisioningParams.java
+++ b/src/com/android/managedprovisioning/ProvisioningParams.java
@@ -29,6 +29,7 @@
public class ProvisioningParams implements Parcelable {
public static final long DEFAULT_LOCAL_TIME = -1;
public static final boolean DEFAULT_WIFI_HIDDEN = false;
+ public static final boolean DEFAULT_LEAVE_ALL_SYSTEM_APPS_ENABLED = false;
public static final int DEFAULT_WIFI_PROXY_PORT = 0;
public String mTimeZone;
@@ -54,6 +55,8 @@
public boolean mStartedByNfc; // True iff provisioning flow was started by Nfc bump.
+ public boolean mLeaveAllSystemAppsEnabled;
+
public String getLocaleAsString() {
if (mLocale != null) {
return mLocale.getLanguage() + "_" + mLocale.getCountry();
@@ -91,6 +94,7 @@
out.writeByteArray(mDeviceAdminPackageChecksum);
out.writeParcelable(mAdminExtrasBundle, 0 /* default */);
out.writeInt(mStartedByNfc ? 1 : 0);
+ out.writeInt(mLeaveAllSystemAppsEnabled ? 1 : 0);
}
public static final Parcelable.Creator<ProvisioningParams> CREATOR
@@ -116,6 +120,7 @@
in.readByteArray(params.mDeviceAdminPackageChecksum);
params.mAdminExtrasBundle = in.readParcelable(null /* use default classloader */);
params.mStartedByNfc = in.readInt() == 1;
+ params.mLeaveAllSystemAppsEnabled = in.readInt() == 1;
return params;
}
diff --git a/src/com/android/managedprovisioning/UserConsentDialog.java b/src/com/android/managedprovisioning/UserConsentDialog.java
index af792d7..47b390b 100644
--- a/src/com/android/managedprovisioning/UserConsentDialog.java
+++ b/src/com/android/managedprovisioning/UserConsentDialog.java
@@ -19,7 +19,6 @@
import android.app.Activity;
import android.app.Dialog;
import android.app.DialogFragment;
-import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
@@ -41,50 +40,63 @@
public static final String LEARN_MORE_URL_PROFILE_OWNER =
"https://support.google.com/android/work/answer/6090512";
+ // TODO: replace by the final device owner learn more link.
+ public static final String LEARN_MORE_URL_DEVICE_OWNER =
+ "https://support.google.com/android/work/answer/6090512";
- private final Context mContext;
- private final int mAdminMonitorsStringId;
- private final Uri mLearnMoreUri;
- private final Runnable mOnUserConsentRunnable;
- private final Runnable mOnCancelRunnable;
+ // Only urls starting with this base can be visisted in the device owner case.
+ public static final String LEARN_MORE_ALLOWED_BASE_URL =
+ "https://support.google.com/";
- public UserConsentDialog(final Context context, int ownerType,
- final Runnable onUserConsentRunnable, final Runnable onCancelRunnable) {
- super();
- mContext = context;
- if (ownerType == PROFILE_OWNER) {
- mAdminMonitorsStringId = R.string.admin_has_ability_to_monitor_profile;
- mLearnMoreUri = Uri.parse(LEARN_MORE_URL_PROFILE_OWNER);
- } else if (ownerType == DEVICE_OWNER) {
- mAdminMonitorsStringId = R.string.admin_has_ability_to_monitor_device;
- mLearnMoreUri = null;
- } else {
- throw new IllegalArgumentException("Illegal value for argument ownerType.");
- }
- mOnUserConsentRunnable = onUserConsentRunnable;
- mOnCancelRunnable = onCancelRunnable;
+ private static final String KEY_OWNER_TYPE = "owner_type";
+
+ public static UserConsentDialog newInstance(int ownerType) {
+ UserConsentDialog dialog = new UserConsentDialog();
+ Bundle args = new Bundle();
+ args.putInt(KEY_OWNER_TYPE, ownerType);
+ dialog.setArguments(args);
+ return dialog;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
- final Dialog dialog = new Dialog(mContext, R.style.ManagedProvisioningDialogTheme);
+ int ownerType = getArguments().getInt(KEY_OWNER_TYPE);
+ if (ownerType != PROFILE_OWNER && ownerType != DEVICE_OWNER) {
+ throw new IllegalArgumentException("Illegal value for argument ownerType.");
+ }
+
+ final Dialog dialog = new Dialog(getActivity(), R.style.ManagedProvisioningDialogTheme);
dialog.setContentView(R.layout.learn_more_dialog);
dialog.setCanceledOnTouchOutside(false);
TextView text1 = (TextView) dialog.findViewById(R.id.learn_more_text1);
- text1.setText(mAdminMonitorsStringId);
+ if (ownerType == PROFILE_OWNER) {
+ text1.setText(R.string.admin_has_ability_to_monitor_profile);
+ } else if (ownerType == DEVICE_OWNER) {
+ text1.setText(R.string.admin_has_ability_to_monitor_device);
+ }
- final TextView linkText = (TextView) dialog.findViewById(R.id.learn_more_link);
- if (mLearnMoreUri != null) {
+ TextView linkText = (TextView) dialog.findViewById(R.id.learn_more_link);
+ if (ownerType == PROFILE_OWNER) {
linkText.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
- Intent browserIntent = new Intent(Intent.ACTION_VIEW, mLearnMoreUri);
- mContext.startActivity(browserIntent);
+ Intent browserIntent = new Intent(Intent.ACTION_VIEW,
+ Uri.parse(LEARN_MORE_URL_PROFILE_OWNER));
+ getActivity().startActivity(browserIntent);
}
});
- } else {
- linkText.setVisibility(View.GONE);
+ } else if (ownerType == DEVICE_OWNER) {
+ linkText.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent webIntent = new Intent(getActivity(), WebActivity.class);
+ webIntent.putExtra(WebActivity.EXTRA_URL, LEARN_MORE_URL_DEVICE_OWNER);
+ webIntent.putExtra(WebActivity.EXTRA_ALLOWED_URL_BASE,
+ LEARN_MORE_ALLOWED_BASE_URL);
+ getActivity().startActivity(webIntent);
+ }
+ });
}
Button positiveButton = (Button) dialog.findViewById(R.id.positive_button);
@@ -92,9 +104,7 @@
@Override
public void onClick(View v) {
dialog.dismiss();
- if (mOnUserConsentRunnable != null) {
- mOnUserConsentRunnable.run();
- }
+ ((ConsentCallback) getActivity()).onDialogConsent();
}
});
@@ -103,9 +113,7 @@
@Override
public void onClick(View v) {
dialog.dismiss();
- if (mOnCancelRunnable != null) {
- mOnCancelRunnable.run();
- }
+ ((ConsentCallback) getActivity()).onDialogCancel();
}
});
@@ -114,8 +122,11 @@
@Override
public void onCancel(DialogInterface dialog) {
- if (mOnCancelRunnable != null) {
- mOnCancelRunnable.run();
- }
+ ((ConsentCallback) getActivity()).onDialogCancel();
+ }
+
+ public interface ConsentCallback {
+ public abstract void onDialogConsent();
+ public abstract void onDialogCancel();
}
}
\ No newline at end of file
diff --git a/src/com/android/managedprovisioning/WebActivity.java b/src/com/android/managedprovisioning/WebActivity.java
new file mode 100644
index 0000000..81779dd
--- /dev/null
+++ b/src/com/android/managedprovisioning/WebActivity.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2014, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.managedprovisioning;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.webkit.WebView;
+import android.webkit.WebViewClient;
+
+/**
+ * This activity shows a web view, which loads the {@link #EXTRA_URL} indicated in the starting
+ * intent. By default the user can click on links and load other urls. However, if the
+ * {@link EXTRA_ALLOWED_URL_BASE} is set in the starting intent, then only url starting with the
+ * allowed url base will be loaded.
+ *
+ * <p>
+ * This activity is currently used by the {@link UserConsentDialog} to display the google support
+ * web page about the Device Owner concept.
+ * </p>
+ */
+public class WebActivity extends Activity {
+ public static final String EXTRA_URL = "extra_url";
+
+ // Users can only browse urls starting with the base specified by the following extra.
+ // If this extra is not used, there are no restrictions on browsable urls.
+ public static final String EXTRA_ALLOWED_URL_BASE = "extra_allowed_url_base";
+
+ private WebView mWebView;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ mWebView = new WebView(this);
+ final String extraUrl = getIntent().getStringExtra(EXTRA_URL);
+ final String extraAllowedUrlBase = getIntent().getStringExtra(EXTRA_ALLOWED_URL_BASE);
+ if (extraUrl == null) {
+ ProvisionLogger.loge("No url provided to WebActivity.");
+ finish();
+ return;
+ }
+ mWebView.loadUrl(extraUrl);
+ mWebView.setWebViewClient(new WebViewClient() {
+ @Override
+ public boolean shouldOverrideUrlLoading(WebView view, String url) {
+ if (extraAllowedUrlBase != null && url.startsWith(extraAllowedUrlBase)) {
+ view.loadUrl(url);
+ }
+ return true;
+ }
+ });
+
+ this.setContentView(mWebView);
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/managedprovisioning/task/AddWifiNetworkTask.java b/src/com/android/managedprovisioning/task/AddWifiNetworkTask.java
index e5aec3b..4d8d89f 100644
--- a/src/com/android/managedprovisioning/task/AddWifiNetworkTask.java
+++ b/src/com/android/managedprovisioning/task/AddWifiNetworkTask.java
@@ -21,6 +21,9 @@
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.WifiManager;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Looper;
import android.text.TextUtils;
import java.lang.Thread;
@@ -36,6 +39,7 @@
private static final int RETRY_SLEEP_DURATION_BASE_MS = 500;
private static final int RETRY_SLEEP_MULTIPLIER = 2;
private static final int MAX_RETRIES = 6;
+ private static final int RECONNECT_TIMEOUT_MS = 30000;
private final Context mContext;
private final String mSsid;
@@ -52,14 +56,23 @@
private NetworkMonitor mNetworkMonitor;
private WifiConfig mWifiConfig;
+ private Handler mHandler;
+ private boolean mTaskDone = false;
+
private int mDurationNextSleep = RETRY_SLEEP_DURATION_BASE_MS;
private int mRetriesLeft = MAX_RETRIES;
+ /**
+ * @throws IllegalArgumentException if the {@code ssid} parameter is empty.
+ */
public AddWifiNetworkTask(Context context, String ssid, boolean hidden, String securityType,
String password, String proxyHost, int proxyPort, String proxyBypassHosts,
String pacUrl, Callback callback) {
mCallback = callback;
mContext = context;
+ if (TextUtils.isEmpty(ssid)) {
+ throw new IllegalArgumentException("The ssid must be non-empty.");
+ }
mSsid = ssid;
mHidden = hidden;
mSecurityType = securityType;
@@ -70,6 +83,12 @@
mPacUrl = pacUrl;
mWifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
mWifiConfig = new WifiConfig(mWifiManager);
+
+ HandlerThread thread = new HandlerThread("Timeout thread",
+ android.os.Process.THREAD_PRIORITY_BACKGROUND);
+ thread.start();
+ Looper looper = thread.getLooper();
+ mHandler = new Handler(looper);
}
public void run() {
@@ -79,20 +98,13 @@
return;
}
- mNetworkMonitor = new NetworkMonitor(mContext, this);
-
- if (!isConnectedToWifi(mContext)) {
- if (TextUtils.isEmpty(mSsid)) {
- ProvisionLogger.loge("Wifi is supposed to be setup in activity," +
- " or a valid wifi ssid has to be specified.");
- mCallback.onError();
- return;
- }
-
- connectToProvidedNetwork();
- } else {
+ if (isConnectedToSpecifiedWifi()) {
mCallback.onSuccess();
+ return;
}
+
+ mNetworkMonitor = new NetworkMonitor(mContext, this);
+ connectToProvidedNetwork();
}
private void connectToProvidedNetwork() {
@@ -118,43 +130,51 @@
mCallback.onError();
return;
}
- } else {
- if (!mWifiManager.reconnect()) {
- ProvisionLogger.loge("Unable to connect to wifi");
- mCallback.onError();
- return;
- }
+ }
+
+ // Network was successfully saved, now connect to it.
+ if (!mWifiManager.reconnect()) {
+ ProvisionLogger.loge("Unable to connect to wifi");
+ mCallback.onError();
+ return;
}
// NetworkMonitor will call onNetworkConnected when in Wifi mode.
+ // Post time out event in case the NetworkMonitor doesn't call back.
+ mHandler.postDelayed(new Runnable() {
+ public void run(){
+ synchronized(this) {
+ if (mTaskDone) return;
+ mTaskDone = true;
+ }
+ ProvisionLogger.loge("Setting up wifi connection timed out.");
+ mCallback.onError();
+ return;
+ }
+ }, RECONNECT_TIMEOUT_MS);
}
private boolean enableWifi() {
- if (mWifiManager != null) {
- int wifiState = mWifiManager.getWifiState();
- boolean wifiOn = wifiState == WifiManager.WIFI_STATE_ENABLED;
- if (!wifiOn) {
- if (!mWifiManager.setWifiEnabled(true)) {
- return false;
- } else {
- return true;
- }
- } else {
- return true;
- }
- } else {
- return false;
- }
+ return mWifiManager != null
+ && (mWifiManager.isWifiEnabled() || mWifiManager.setWifiEnabled(true));
}
@Override
public void onNetworkConnected() {
- if (NetworkMonitor.isConnectedToWifi(mContext) &&
- mWifiManager.getConnectionInfo().getSSID().equals(mSsid)) {
+ if (isConnectedToSpecifiedWifi()) {
+ synchronized(this) {
+ if (mTaskDone) return;
+ mTaskDone = true;
+ }
+
ProvisionLogger.logd("Connected to the correct network");
- mNetworkMonitor.close();
- mNetworkMonitor = null;
+
+ // Remove time out callback.
+ mHandler.removeCallbacksAndMessages(null);
+
+ cleanUp();
mCallback.onSuccess();
+ return;
}
}
@@ -170,6 +190,12 @@
}
}
+ private boolean isConnectedToSpecifiedWifi() {
+ return NetworkMonitor.isConnectedToWifi(mContext)
+ && mWifiManager.getConnectionInfo() != null
+ && mSsid.equals(mWifiManager.getConnectionInfo().getSSID());
+ }
+
public static boolean isConnectedToWifi(Context context) {
ConnectivityManager cm =
(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
diff --git a/src/com/android/managedprovisioning/task/DeleteNonRequiredAppsTask.java b/src/com/android/managedprovisioning/task/DeleteNonRequiredAppsTask.java
index 07b9749..924ff25 100644
--- a/src/com/android/managedprovisioning/task/DeleteNonRequiredAppsTask.java
+++ b/src/com/android/managedprovisioning/task/DeleteNonRequiredAppsTask.java
@@ -53,7 +53,7 @@
/**
* Removes all system apps with a launcher that are not required.
- * Also disables sharing via Bluetooth and Nfc, and components that listen to
+ * Also disables sharing via Bluetooth, and components that listen to
* ACTION_INSTALL_SHORTCUT.
* This class is called a first time when a user is created, but also after a system update.
* In this case, it checks if the system apps that have been added need to be disabled.
@@ -67,8 +67,8 @@
private final int mReqAppsList;
private final int mVendorReqAppsList;
private final int mUserId;
- private final boolean mNewProfile; // If we are provisioning a new profile.
- private final boolean mDisableInstallShortcutListeners;
+ private final boolean mNewProfile; // If we are provisioning a new managed profile/device.
+ private final boolean mDisableInstallShortcutListenersAndTelecom;
private static final String TAG_SYSTEM_APPS = "system-apps";
private static final String TAG_PACKAGE_LIST_ITEM = "item";
@@ -76,7 +76,7 @@
public DeleteNonRequiredAppsTask(Context context, String mdmPackageName, int userId,
int requiredAppsList, int vendorRequiredAppsList, boolean newProfile,
- boolean disableInstallShortcutListeners, Callback callback) {
+ boolean disableInstallShortcutListenersAndTelecom, Callback callback) {
mCallback = callback;
mContext = context;
mMdmPackageName = mdmPackageName;
@@ -86,19 +86,26 @@
mReqAppsList = requiredAppsList;
mVendorReqAppsList = vendorRequiredAppsList;
mNewProfile = newProfile;
- mDisableInstallShortcutListeners = disableInstallShortcutListeners;
+ mDisableInstallShortcutListenersAndTelecom = disableInstallShortcutListenersAndTelecom;
}
public void run() {
if (mNewProfile) {
- disableNfcBluetoothSharing();
+ disableBluetoothSharing();
}
deleteNonRequiredApps();
}
- private void disableNfcBluetoothSharing() {
- ProvisionLogger.logd("Disabling Nfc and Bluetooth sharing.");
- disableComponent(new ComponentName("com.android.nfc", "com.android.nfc.BeamShareActivity"));
+ /**
+ * Returns if this task should be run on OTA.
+ * This is indicated by the presence of the system apps file.
+ */
+ public static boolean shouldDeleteNonRequiredApps(Context context, int userId) {
+ return getSystemAppsFile(context, userId).exists();
+ }
+
+ private void disableBluetoothSharing() {
+ ProvisionLogger.logd("Disabling Bluetooth sharing.");
disableComponent(new ComponentName("com.android.bluetooth",
"com.android.bluetooth.opp.BluetoothOppLauncherActivity"));
}
@@ -106,32 +113,34 @@
private void deleteNonRequiredApps() {
ProvisionLogger.logd("Deleting non required apps.");
- File file = new File(mContext.getFilesDir() + File.separator + "system_apps"
- + File.separator + "user" + mUserId + ".xml");
- file.getParentFile().mkdirs(); // Creating the folder if it does not exist
+ File systemAppsFile = getSystemAppsFile(mContext, mUserId);
+ systemAppsFile.getParentFile().mkdirs(); // Creating the folder if it does not exist
Set<String> currentApps = getCurrentSystemApps();
Set<String> previousApps;
if (mNewProfile) {
+ // Provisioning case.
+
// If this userId was a managed profile before, file may exist. In this case, we ignore
// what is in this file.
previousApps = new HashSet<String>();
} else {
- if (file.exists()) {
- previousApps = readSystemApps(file);
- } else {
- // If for some reason, the system apps have not been written to file before, we will
- // not delete any system apps this time.
- writeSystemApps(currentApps, file);
- mCallback.onSuccess();
+ // OTA case.
+
+ if (!systemAppsFile.exists()) {
+ // Error, this task should not have been run.
+ ProvisionLogger.loge("No system apps list found for user " + mUserId);
+ mCallback.onError();
return;
}
+
+ previousApps = readSystemApps(systemAppsFile);
}
- writeSystemApps(currentApps, file);
+ writeSystemApps(currentApps, systemAppsFile);
Set<String> newApps = currentApps;
newApps.removeAll(previousApps);
- if (mDisableInstallShortcutListeners) {
+ if (mDisableInstallShortcutListenersAndTelecom) {
Intent actionShortcut = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");
if (previousApps.isEmpty()) {
// Here, all the apps are in newApps.
@@ -150,27 +159,34 @@
packagesToDelete.removeAll(getRequiredApps());
packagesToDelete.retainAll(getCurrentAppsWithLauncher());
// com.android.server.telecom should not handle CALL intents in the managed profile.
- if (mNewProfile) {
+ if (mDisableInstallShortcutListenersAndTelecom && mNewProfile) {
packagesToDelete.add("com.android.server.telecom");
}
- int size = packagesToDelete.size();
- if (size > 0) {
- PackageDeleteObserver packageDeleteObserver =
- new PackageDeleteObserver(packagesToDelete.size());
- for (String packageName : packagesToDelete) {
- try {
- mIpm.deletePackageAsUser(packageName, packageDeleteObserver, mUserId,
- PackageManager.DELETE_SYSTEM_APP);
- } catch (RemoteException neverThrown) {
- // Never thrown, as we are making local calls.
- ProvisionLogger.loge("This should not happen.", neverThrown);
- }
- }
- } else {
+ if (packagesToDelete.isEmpty()) {
mCallback.onSuccess();
+ return;
+ }
+ PackageDeleteObserver packageDeleteObserver =
+ new PackageDeleteObserver(packagesToDelete.size());
+ for (String packageName : packagesToDelete) {
+ try {
+ mIpm.deletePackageAsUser(packageName, packageDeleteObserver, mUserId,
+ PackageManager.DELETE_SYSTEM_APP);
+ } catch (RemoteException neverThrown) {
+ // Never thrown, as we are making local calls.
+ ProvisionLogger.loge("This should not happen.", neverThrown);
+ }
}
}
+ static File getSystemAppsFile(Context context, int userId) {
+ return new File(context.getFilesDir() + File.separator + "system_apps"
+ + File.separator + "user" + userId + ".xml");
+ }
+
+ /**
+ * Disable all components that can handle the specified broadcast intent.
+ */
private void disableReceivers(Intent intent) {
List<ResolveInfo> receivers = mPm.queryBroadcastReceivers(intent, 0, mUserId);
for (ResolveInfo ri : receivers) {
@@ -235,9 +251,9 @@
return apps;
}
- private void writeSystemApps(Set<String> packageNames, File file) {
+ private void writeSystemApps(Set<String> packageNames, File systemAppsFile) {
try {
- FileOutputStream stream = new FileOutputStream(file, false);
+ FileOutputStream stream = new FileOutputStream(systemAppsFile, false);
XmlSerializer serializer = new FastXmlSerializer();
serializer.setOutput(stream, "utf-8");
serializer.startDocument(null, true);
@@ -255,13 +271,13 @@
}
}
- private Set<String> readSystemApps(File file) {
+ private Set<String> readSystemApps(File systemAppsFile) {
Set<String> result = new HashSet<String>();
- if (!file.exists()) {
+ if (!systemAppsFile.exists()) {
return result;
}
try {
- FileInputStream stream = new FileInputStream(file);
+ FileInputStream stream = new FileInputStream(systemAppsFile);
XmlPullParser parser = Xml.newPullParser();
parser.setInput(stream, null);