summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDivya Sharma <c_shard@codeaurora.org>2015-03-10 00:25:53 -0700
committerDivya Sharma <c_shard@codeaurora.org>2015-03-10 00:25:53 -0700
commitb05b08da5f11ec6789bfe76b88f714dbe23f5b0c (patch)
tree648b1d3d905516553b8a4d7062ab5a96d317d54b
parent4198826bbc75d79ab5bf545a3ef020139b193119 (diff)
parentd703f7888887fe2aa5669e0a2f2cbeba7a67e271 (diff)
downloadandroid_packages_apps_ManagedProvisioning-staging/cm-12.1.tar.gz
android_packages_apps_ManagedProvisioning-staging/cm-12.1.tar.bz2
android_packages_apps_ManagedProvisioning-staging/cm-12.1.zip
Android 5.1.0 release 1 * tag 'android-5.1.0_r1': (44 commits) Fix illegal argument exception in Device Provisioner. Fix wifi loop in device owner provisioning. Handle the case where there is no launcher in ManagedProvisioning. Migrate to new removeAccount method Forbid profile owners outside device owner package Block NFC provisioning if there is data in the FRP partition. Delete the migrated account only when the user can't reconsider Get rid of jank flash after hitting ok to set up profile. Persisting Account extra in the IntentStore DO NOT MERGE Do NOT delete com.android.server.telecom for Device Owners. Do NOT delete com.android.server.telecom for Device Owners. Starts the user prior to migrating the account Plumb in the flag that can be used to skip disabling of apps. On system update for device owner delete new system apps if required. Import translations. DO NOT MERGE Move account to new profile during provisioning on MDM request Import translations. DO NOT MERGE Refactor: Rename ManagedProvisioning to ProfileOwnerProvisioning. Allow rotation for profile owner provisioning. Import translations. DO NOT MERGE ... Change-Id: Ie0305b8ef8001f40cdf77a665d4740f97b5c80a5
-rw-r--r--AndroidManifest.xml41
-rw-r--r--res/layout-large-land/user_consent.xml15
-rw-r--r--res/layout/learn_more_dialog.xml42
-rw-r--r--res/layout/progress.xml4
-rw-r--r--res/layout/user_consent.xml14
-rw-r--r--res/values-af/strings.xml5
-rw-r--r--res/values-am/strings.xml5
-rw-r--r--res/values-ar/strings.xml5
-rw-r--r--res/values-bg/strings.xml5
-rw-r--r--res/values-bn-rBD/strings.xml5
-rw-r--r--res/values-ca/strings.xml5
-rw-r--r--res/values-cs/strings.xml5
-rw-r--r--res/values-da/strings.xml5
-rw-r--r--res/values-de/strings.xml5
-rw-r--r--res/values-el/strings.xml5
-rw-r--r--res/values-en-rGB/strings.xml5
-rw-r--r--res/values-en-rIN/strings.xml5
-rw-r--r--res/values-es-rUS/strings.xml5
-rw-r--r--res/values-es/strings.xml5
-rw-r--r--res/values-et-rEE/strings.xml5
-rw-r--r--res/values-eu-rES/strings.xml5
-rw-r--r--res/values-fa/strings.xml5
-rw-r--r--res/values-fi/strings.xml5
-rw-r--r--res/values-fr-rCA/strings.xml5
-rw-r--r--res/values-fr/strings.xml5
-rw-r--r--res/values-gl-rES/strings.xml5
-rw-r--r--res/values-hi/strings.xml5
-rw-r--r--res/values-hr/strings.xml5
-rw-r--r--res/values-hu/strings.xml5
-rw-r--r--res/values-hy-rAM/strings.xml5
-rw-r--r--res/values-in/strings.xml5
-rw-r--r--res/values-is-rIS/strings.xml5
-rw-r--r--res/values-it/strings.xml5
-rw-r--r--res/values-iw/strings.xml5
-rw-r--r--res/values-ja/strings.xml5
-rw-r--r--res/values-ka-rGE/strings.xml5
-rw-r--r--res/values-kk-rKZ/strings.xml5
-rw-r--r--res/values-km-rKH/strings.xml5
-rw-r--r--res/values-kn-rIN/strings.xml5
-rw-r--r--res/values-ko/strings.xml5
-rw-r--r--res/values-ky-rKG/strings.xml5
-rw-r--r--res/values-large/dimens.xml2
-rw-r--r--res/values-lo-rLA/strings.xml7
-rw-r--r--res/values-lt/strings.xml5
-rw-r--r--res/values-lv/strings.xml5
-rw-r--r--res/values-mk-rMK/strings.xml5
-rw-r--r--res/values-ml-rIN/strings.xml5
-rw-r--r--res/values-mn-rMN/strings.xml5
-rw-r--r--res/values-mr-rIN/strings.xml9
-rw-r--r--res/values-ms-rMY/strings.xml5
-rw-r--r--res/values-my-rMM/strings.xml39
-rw-r--r--res/values-nb/strings.xml5
-rw-r--r--res/values-ne-rNP/strings.xml5
-rw-r--r--res/values-nl/strings.xml5
-rw-r--r--res/values-pl/strings.xml5
-rw-r--r--res/values-pt-rPT/strings.xml5
-rw-r--r--res/values-pt/strings.xml5
-rw-r--r--res/values-ro/strings.xml5
-rw-r--r--res/values-ru/strings.xml5
-rw-r--r--res/values-si-rLK/strings.xml5
-rw-r--r--res/values-sk/strings.xml5
-rw-r--r--res/values-sl/strings.xml5
-rw-r--r--res/values-sr/strings.xml5
-rw-r--r--res/values-sv/strings.xml5
-rw-r--r--res/values-sw/strings.xml5
-rw-r--r--res/values-ta-rIN/strings.xml5
-rw-r--r--res/values-te-rIN/strings.xml5
-rw-r--r--res/values-th/strings.xml5
-rw-r--r--res/values-tl/strings.xml5
-rw-r--r--res/values-tr/strings.xml5
-rw-r--r--res/values-uk/strings.xml5
-rw-r--r--res/values-ur-rPK/strings.xml5
-rw-r--r--res/values-uz-rUZ/strings.xml5
-rw-r--r--res/values-vi/strings.xml5
-rw-r--r--res/values-zh-rCN/strings.xml5
-rw-r--r--res/values-zh-rHK/strings.xml5
-rw-r--r--res/values-zh-rTW/strings.xml5
-rw-r--r--res/values-zu/strings.xml5
-rw-r--r--res/values/dimens.xml11
-rw-r--r--res/values/strings.xml10
-rw-r--r--res/values/styles.xml19
-rw-r--r--src/com/android/managedprovisioning/BootReminder.java11
-rw-r--r--src/com/android/managedprovisioning/DeviceOwnerProvisioningActivity.java259
-rw-r--r--src/com/android/managedprovisioning/DeviceOwnerProvisioningService.java89
-rw-r--r--src/com/android/managedprovisioning/IntentStore.java86
-rw-r--r--src/com/android/managedprovisioning/ManagedProvisioningErrorDialog.java60
-rw-r--r--src/com/android/managedprovisioning/MessageParser.java15
-rw-r--r--src/com/android/managedprovisioning/PreBootListener.java93
-rw-r--r--src/com/android/managedprovisioning/ProfileOwnerPreProvisioningActivity.java (renamed from src/com/android/managedprovisioning/ManagedProvisioningActivity.java)185
-rw-r--r--src/com/android/managedprovisioning/ProfileOwnerProvisioningActivity.java328
-rw-r--r--src/com/android/managedprovisioning/ProfileOwnerProvisioningService.java (renamed from src/com/android/managedprovisioning/ManagedProvisioningService.java)248
-rw-r--r--src/com/android/managedprovisioning/ProvisioningParams.java5
-rw-r--r--src/com/android/managedprovisioning/UserConsentDialog.java87
-rw-r--r--src/com/android/managedprovisioning/WebActivity.java69
-rw-r--r--src/com/android/managedprovisioning/task/AddWifiNetworkTask.java100
-rw-r--r--src/com/android/managedprovisioning/task/DeleteNonRequiredAppsTask.java96
96 files changed, 1629 insertions, 660 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 4ff88cfd..bb4983b6 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:name="EncryptDeviceActivity"
android:immersive="true"
android:launchMode="singleTop"
- android:theme="@style/SetupWorkSpaceTheme"
- android:screenOrientation="locked">
+ android:theme="@style/SetupWorkSpaceTheme">
</activity>
+
<activity
- android:name="EncryptDeviceActivity"
+ android:name="WebActivity"
android:immersive="true"
android:launchMode="singleTop"
- android:theme="@style/SetupWorkSpaceTheme"
- android:screenOrientation="locked">
+ 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 ca568e13..b3d7c438 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 576edfa2..f8d56762 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 802bdab9..34d25e3e 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 2b09712b..2ccdfa57 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 6e95b87b..847317a6 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 b5eb4236..41a546cb 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 7938e03a..ff3c98a9 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 11f24769..7bbac2d4 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 7dc931fe..9c29940d 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 03240313..3a72f3ec 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 b99083d8..1a68889c 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 31f00855..157923f6 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 743e83ec..9eddaa9c 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 ee1080d3..8665b84f 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 c5519eba..fc3379f7 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 c5519eba..fc3379f7 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 abaf7a9f..07165163 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 51ac446b..c2491b17 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 be2e2ab7..720af3f0 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 1f2863c1..714f763b 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 4bcf447b..17b92a23 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 10ff0ffa..73cab789 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 49e779fa..e982065b 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 c935df75..bcab1e10 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 678a334c..b7a6a016 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 0f0d3c71..3456e6c9 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 66834a59..ef5cd86c 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 2724d68b..dfea90e9 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 43bfbacf..205a3a27 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 be5795ae..1b2879c9 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 9cc7f729..a645b23c 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 65dfccb8..d40b2a57 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 5aaf5fbf..37d73de3 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 9584d5b9..68ec04c8 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 5bdc265b..8e1daf67 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 f0fcce63..4486b12c 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 e2031514..09081ff4 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 b20a7c38..a05f044f 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 8dbe718b..44f6f475 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 9fe6713d..0d3fcefc 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 5389172c..5a6a7f7e 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 67a42b9e..3905c22e 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 db5dc105..959f8778 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 e2ec4c53..9af60374 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 e3c721e2..97f143a8 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 98f1b49e..34b4f9e4 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 58e0a27f..37de5734 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 400785a3..857e74ca 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 c105e514..4b251bc7 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 e1456ab2..396de3db 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 d39e24f2..cbc10746 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 f44bc954..b0dc284d 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 f216ff0b..49c753b7 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 c5bb1b45..6fb37c22 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 0bfc46e7..cdf77fc9 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 2f910e8e..a1aaf6ff 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 e2e20470..f9810bbc 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 ec17d2e7..8011fa53 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 85f99aef..5e57b16f 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 0025d98d..27cde1e4 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 fc7c081d..8fa209d0 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 f486d6ce..3cbb52ae 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 4425be5b..eea5d039 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 42944298..ec4bd239 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 1a4ad327..e6665685 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 778cf08d..45ef848e 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 a454f5ad..57e46762 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 d6ce612e..947cbcf8 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 a3d04551..b9368c46 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 76d47326..ded0c0d4 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 b4180964..87b2f9b9 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 97c28891..679b3cfb 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 6c3a6a0a..34ae3739 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 efe347bc..4446e92c 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 5c0710d7..55d64f4a 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 eef0a842..53b58c33 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 7ba41d1c..f21fc748 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 f6a4317f..6764c41f 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 5f821bd7..3133ef1e 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 26f4ea8a..fb8a8a8c 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 a7c7afdb..85c65110 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 @@ public class BootReminder extends BroadcastReceiver {
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 @@ public class BootReminder extends BroadcastReceiver {
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 f7f33e97..1b12252a 100644
--- a/src/com/android/managedprovisioning/DeviceOwnerProvisioningActivity.java
+++ b/src/com/android/managedprovisioning/DeviceOwnerProvisioningActivity.java
@@ -18,7 +18,6 @@ package com.android.managedprovisioning;
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.UserHandle;
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 android.widget.TextView;
import com.android.managedprovisioning.task.AddWifiNetworkTask;
-import java.util.Locale;
+import java.util.ArrayList;
/**
* This activity starts device owner provisioning:
@@ -63,32 +63,53 @@ import java.util.Locale;
* 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 @@ public class DeviceOwnerProvisioningActivity extends Activity {
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 @@ public class DeviceOwnerProvisioningActivity extends Activity {
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 @@ public class DeviceOwnerProvisioningActivity extends Activity {
// 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 @@ public class DeviceOwnerProvisioningActivity extends Activity {
} 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 @@ public class DeviceOwnerProvisioningActivity extends Activity {
@Override
public void onReceive(Context context, Intent intent)
{
- String action = intent.getAction();
- if (action.equals(DeviceOwnerProvisioningService.ACTION_PROVISIONING_SUCCESS)) {
- ProvisionLogger.logd("Successfully provisioned");
-
- 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;
- }
- }
+ if (mCancelDialogShown) {
+
+ // 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 @@ public class DeviceOwnerProvisioningActivity extends Activity {
@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,
+ .setPositiveButton(R.string.device_owner_error_reset,
+ 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);
+ intent.putExtra(Intent.EXTRA_REASON,
+ "DeviceOwnerProvisioningActivity.showCancelResetDialog()");
+ sendBroadcast(intent);
+ stopService(new Intent(DeviceOwnerProvisioningActivity.this,
DeviceOwnerProvisioningService.class));
- finish();
- }
- });
+ finish();
+ }
+ }).show();
+ }
- if (mDialog != null) {
- mDialog.dismiss();
+ 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 @@ public class DeviceOwnerProvisioningActivity extends Activity {
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 @@ public class DeviceOwnerProvisioningActivity extends Activity {
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 @@ public class DeviceOwnerProvisioningActivity extends Activity {
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 @@ public class DeviceOwnerProvisioningActivity extends Activity {
}
});
}
- 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 1a63b12e..109bb989 100644
--- a/src/com/android/managedprovisioning/DeviceOwnerProvisioningService.java
+++ b/src/com/android/managedprovisioning/DeviceOwnerProvisioningService.java
@@ -54,6 +54,8 @@ import java.util.Locale;
* </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 @@ public class DeviceOwnerProvisioningService extends Service {
@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 @@ public class DeviceOwnerProvisioningService extends Service {
}
} 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 @@ public class DeviceOwnerProvisioningService extends Service {
* 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 @@ public class DeviceOwnerProvisioningService extends Service {
new SetDevicePolicyTask.Callback() {
@Override
public void onSuccess() {
- mDeleteNonRequiredAppsTask.run();
+ if (params.mLeaveAllSystemAppsEnabled) {
+ onProvisioningSuccess(params.mDeviceAdminPackageName);
+ } else {
+ mDeleteNonRequiredAppsTask.run();
+ }
}
@Override
@@ -318,7 +328,7 @@ public class DeviceOwnerProvisioningService extends Service {
}
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 @@ public class DeviceOwnerProvisioningService extends Service {
}
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 @@ public class DeviceOwnerProvisioningService extends Service {
}
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 @@ public class DeviceOwnerProvisioningService extends Service {
}
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 @@ public class DeviceOwnerProvisioningService extends Service {
// 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 @@ public class DeviceOwnerProvisioningService extends Service {
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 @@ public class DeviceOwnerProvisioningService extends Service {
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 @@ public class DeviceOwnerProvisioningService extends Service {
@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 f239c49b..ae5839ac 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 @@ public class IntentStore {
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 @@ public class IntentStore {
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 @@ public class IntentStore {
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 @@ public class IntentStore {
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 @@ public class IntentStore {
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 ad123bd8..00000000
--- 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 dcca4459..1cb77d76 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_AD
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 @@ import java.util.Properties;
* 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 @@ public class MessageParser {
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 @@ public class MessageParser {
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 @@ public class MessageParser {
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 @@ public class MessageParser {
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 942e2026..151ef9a6 100644
--- a/src/com/android/managedprovisioning/PreBootListener.java
+++ b/src/com/android/managedprovisioning/PreBootListener.java
@@ -37,49 +37,64 @@ import java.util.List;
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 */);
}
- }
- /**
- * 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.");
+ // 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;
}
- 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 */,
+ // 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 */);
+ }
+ }
+
+ 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
index ea79cf2a..cd3ddb75 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.EXTRA_RESUME
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 android.widget.Button;
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 @@ public class ManagedProvisioningActivity extends Activity {
}
}
+ 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 @@ public class ManagedProvisioningActivity extends Activity {
}
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 @@ public class ManagedProvisioningActivity extends Activity {
}
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 @@ public class ManagedProvisioningActivity extends Activity {
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 @@ public class ManagedProvisioningActivity extends Activity {
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 @@ public class ManagedProvisioningActivity extends Activity {
*
* @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 @@ public class ManagedProvisioningActivity extends Activity {
// 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 @@ public class ManagedProvisioningActivity extends Activity {
// 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 @@ public class ManagedProvisioningActivity extends Activity {
}
}
+ @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 @@ public class ManagedProvisioningActivity extends Activity {
// 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 @@ public class ManagedProvisioningActivity extends Activity {
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 class ManagedProvisioningActivity extends Activity {
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 @@ public class ManagedProvisioningActivity extends Activity {
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
- ManagedProvisioningActivity.this.finish();
+ ProfileOwnerPreProvisioningActivity.this.finish();
}
};
@@ -462,17 +435,17 @@ public class ManagedProvisioningActivity extends Activity {
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 00000000..a785b091
--- /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
index f63a244e..44a60481 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.BroadcastReceiver;
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;
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 @@ public class ManagedProvisioningService extends Service {
// 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 class ManagedProvisioningService extends Service {
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 @@ public class ManagedProvisioningService extends Service {
@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 profile owner provisioning service");
- ProvisionLogger.logd("Starting managed 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 @@ public class ManagedProvisioningService extends Service {
* 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 @@ public class ManagedProvisioningService extends Service {
}
}
- /**
- * 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 @@ public class ManagedProvisioningService extends Service {
}
private void setMdmAsManagedProfileOwner() {
-
ProvisionLogger.logd("Setting package " + mMdmPackageName + " as managed profile owner.");
DevicePolicyManager dpm =
@@ -274,7 +379,6 @@ public class ManagedProvisioningService extends Service {
}
private void setMdmAsActiveAdmin() {
-
ProvisionLogger.logd("Setting package " + mMdmPackageName + " as active admin.");
DevicePolicyManager dpm =
@@ -283,55 +387,15 @@ public class ManagedProvisioningService extends Service {
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 @@ public class ManagedProvisioningService extends Service {
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 927ac124..ab919d2c 100644
--- a/src/com/android/managedprovisioning/ProvisioningParams.java
+++ b/src/com/android/managedprovisioning/ProvisioningParams.java
@@ -29,6 +29,7 @@ import java.util.Locale;
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 class ProvisioningParams implements Parcelable {
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 @@ public class ProvisioningParams implements Parcelable {
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 @@ public class ProvisioningParams implements Parcelable {
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 af792d70..47b390ba 100644
--- a/src/com/android/managedprovisioning/UserConsentDialog.java
+++ b/src/com/android/managedprovisioning/UserConsentDialog.java
@@ -19,7 +19,6 @@ package com.android.managedprovisioning;
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 class UserConsentDialog extends DialogFragment {
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,
+ Uri.parse(LEARN_MORE_URL_PROFILE_OWNER));
+ getActivity().startActivity(browserIntent);
+ }
+ });
+ } else if (ownerType == DEVICE_OWNER) {
linkText.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
- Intent browserIntent = new Intent(Intent.ACTION_VIEW, mLearnMoreUri);
- mContext.startActivity(browserIntent);
+ 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);
}
});
- } else {
- linkText.setVisibility(View.GONE);
}
Button positiveButton = (Button) dialog.findViewById(R.id.positive_button);
@@ -92,9 +104,7 @@ public class UserConsentDialog extends DialogFragment {
@Override
public void onClick(View v) {
dialog.dismiss();
- if (mOnUserConsentRunnable != null) {
- mOnUserConsentRunnable.run();
- }
+ ((ConsentCallback) getActivity()).onDialogConsent();
}
});
@@ -103,9 +113,7 @@ public class UserConsentDialog extends DialogFragment {
@Override
public void onClick(View v) {
dialog.dismiss();
- if (mOnCancelRunnable != null) {
- mOnCancelRunnable.run();
- }
+ ((ConsentCallback) getActivity()).onDialogCancel();
}
});
@@ -114,8 +122,11 @@ public class UserConsentDialog extends DialogFragment {
@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 00000000..81779dd3
--- /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 e5aec3b1..4d8d89f7 100644
--- a/src/com/android/managedprovisioning/task/AddWifiNetworkTask.java
+++ b/src/com/android/managedprovisioning/task/AddWifiNetworkTask.java
@@ -21,6 +21,9 @@ import android.content.Intent;
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 @@ public class AddWifiNetworkTask implements NetworkMonitor.Callback {
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 @@ public class AddWifiNetworkTask implements NetworkMonitor.Callback {
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 @@ public class AddWifiNetworkTask implements NetworkMonitor.Callback {
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 @@ public class AddWifiNetworkTask implements NetworkMonitor.Callback {
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 @@ public class AddWifiNetworkTask implements NetworkMonitor.Callback {
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 @@ public class AddWifiNetworkTask implements NetworkMonitor.Callback {
}
}
+ 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 07b9749b..924ff25f 100644
--- a/src/com/android/managedprovisioning/task/DeleteNonRequiredAppsTask.java
+++ b/src/com/android/managedprovisioning/task/DeleteNonRequiredAppsTask.java
@@ -53,7 +53,7 @@ import org.xmlpull.v1.XmlSerializer;
/**
* 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 @@ public class DeleteNonRequiredAppsTask {
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 class DeleteNonRequiredAppsTask {
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 @@ public class DeleteNonRequiredAppsTask {
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 @@ public class DeleteNonRequiredAppsTask {
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 @@ public class DeleteNonRequiredAppsTask {
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) {
+ 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);
- }
+ ProvisionLogger.loge("This should not happen.", neverThrown);
}
- } else {
- mCallback.onSuccess();
}
}
+ 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 @@ public class DeleteNonRequiredAppsTask {
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 @@ public class DeleteNonRequiredAppsTask {
}
}
- 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);