From 1fb3698ba291683cb7b5f8cfd80d6876d71f5deb Mon Sep 17 00:00:00 2001 From: Kyle Spearrin Date: Mon, 10 Feb 2020 14:07:06 -0500 Subject: [PATCH] support for appconfig settings (#727) --- src/Android/Android.csproj | 7 + src/Android/MainActivity.cs | 1 + src/Android/Properties/AndroidManifest.xml | 1 + .../Receivers/RestrictionsChangedReceiver.cs | 23 + src/Android/Resources/Resource.designer.cs | 493 +++++++++--------- src/Android/Resources/values/strings.xml | 6 + .../Resources/xml/app_restrictions.xml | 9 + src/Android/Utilities/AndroidHelpers.cs | 23 +- src/App/Utilities/AppHelpers.cs | 31 ++ src/iOS.Core/Utilities/iOSCoreHelpers.cs | 15 +- src/iOS/AppDelegate.cs | 17 +- 11 files changed, 377 insertions(+), 249 deletions(-) create mode 100644 src/Android/Receivers/RestrictionsChangedReceiver.cs create mode 100644 src/Android/Resources/xml/app_restrictions.xml diff --git a/src/Android/Android.csproj b/src/Android/Android.csproj index e22e527de..2c227c5b2 100644 --- a/src/Android/Android.csproj +++ b/src/Android/Android.csproj @@ -119,6 +119,7 @@ + @@ -553,5 +554,11 @@ + + + MSBuild:UpdateGeneratedFiles + Designer + + \ No newline at end of file diff --git a/src/Android/MainActivity.cs b/src/Android/MainActivity.cs index 74cd3ffdd..846991252 100644 --- a/src/Android/MainActivity.cs +++ b/src/Android/MainActivity.cs @@ -151,6 +151,7 @@ namespace Bit.Droid } catch { } } + var setRestrictions = AndroidHelpers.SetPreconfiguredRestrictionSettingsAsync(this); } protected override void OnNewIntent(Intent intent) diff --git a/src/Android/Properties/AndroidManifest.xml b/src/Android/Properties/AndroidManifest.xml index 751bb4568..7ccfaf68d 100644 --- a/src/Android/Properties/AndroidManifest.xml +++ b/src/Android/Properties/AndroidManifest.xml @@ -54,5 +54,6 @@ + diff --git a/src/Android/Receivers/RestrictionsChangedReceiver.cs b/src/Android/Receivers/RestrictionsChangedReceiver.cs new file mode 100644 index 000000000..156dc7c1f --- /dev/null +++ b/src/Android/Receivers/RestrictionsChangedReceiver.cs @@ -0,0 +1,23 @@ +using System.Collections.Generic; +using Android.App; +using Android.Content; +using Bit.App.Utilities; +using Bit.Core.Abstractions; +using Bit.Core.Utilities; +using Bit.Droid.Utilities; + +namespace Bit.Droid.Receivers +{ + [BroadcastReceiver(Name = "com.x8bit.bitwarden.RestrictionsChangedReceiver", Exported = false)] + [IntentFilter(new[] { Intent.ActionApplicationRestrictionsChanged })] + public class RestrictionsChangedReceiver : BroadcastReceiver + { + public async override void OnReceive(Context context, Intent intent) + { + if(intent.Action == Intent.ActionApplicationRestrictionsChanged) + { + await AndroidHelpers.SetPreconfiguredRestrictionSettingsAsync(context); + } + } + } +} diff --git a/src/Android/Resources/Resource.designer.cs b/src/Android/Resources/Resource.designer.cs index c2802365a..519d02459 100644 --- a/src/Android/Resources/Resource.designer.cs +++ b/src/Android/Resources/Resource.designer.cs @@ -10433,125 +10433,125 @@ namespace Bit.Droid public partial class String { - // aapt resource value: 0x7F0D0006 - public const int abc_action_bar_home_description = 2131558406; - - // aapt resource value: 0x7F0D0007 - public const int abc_action_bar_up_description = 2131558407; - // aapt resource value: 0x7F0D0008 - public const int abc_action_menu_overflow_description = 2131558408; + public const int abc_action_bar_home_description = 2131558408; // aapt resource value: 0x7F0D0009 - public const int abc_action_mode_done = 2131558409; - - // aapt resource value: 0x7F0D000B - public const int abc_activitychooserview_choose_application = 2131558411; + public const int abc_action_bar_up_description = 2131558409; // aapt resource value: 0x7F0D000A - public const int abc_activity_chooser_view_see_all = 2131558410; + public const int abc_action_menu_overflow_description = 2131558410; - // aapt resource value: 0x7F0D000C - public const int abc_capital_off = 2131558412; + // aapt resource value: 0x7F0D000B + public const int abc_action_mode_done = 2131558411; // aapt resource value: 0x7F0D000D - public const int abc_capital_on = 2131558413; + public const int abc_activitychooserview_choose_application = 2131558413; + + // aapt resource value: 0x7F0D000C + public const int abc_activity_chooser_view_see_all = 2131558412; // aapt resource value: 0x7F0D000E - public const int abc_font_family_body_1_material = 2131558414; + public const int abc_capital_off = 2131558414; // aapt resource value: 0x7F0D000F - public const int abc_font_family_body_2_material = 2131558415; + public const int abc_capital_on = 2131558415; // aapt resource value: 0x7F0D0010 - public const int abc_font_family_button_material = 2131558416; + public const int abc_font_family_body_1_material = 2131558416; // aapt resource value: 0x7F0D0011 - public const int abc_font_family_caption_material = 2131558417; + public const int abc_font_family_body_2_material = 2131558417; // aapt resource value: 0x7F0D0012 - public const int abc_font_family_display_1_material = 2131558418; + public const int abc_font_family_button_material = 2131558418; // aapt resource value: 0x7F0D0013 - public const int abc_font_family_display_2_material = 2131558419; + public const int abc_font_family_caption_material = 2131558419; // aapt resource value: 0x7F0D0014 - public const int abc_font_family_display_3_material = 2131558420; + public const int abc_font_family_display_1_material = 2131558420; // aapt resource value: 0x7F0D0015 - public const int abc_font_family_display_4_material = 2131558421; + public const int abc_font_family_display_2_material = 2131558421; // aapt resource value: 0x7F0D0016 - public const int abc_font_family_headline_material = 2131558422; + public const int abc_font_family_display_3_material = 2131558422; // aapt resource value: 0x7F0D0017 - public const int abc_font_family_menu_material = 2131558423; + public const int abc_font_family_display_4_material = 2131558423; // aapt resource value: 0x7F0D0018 - public const int abc_font_family_subhead_material = 2131558424; + public const int abc_font_family_headline_material = 2131558424; // aapt resource value: 0x7F0D0019 - public const int abc_font_family_title_material = 2131558425; + public const int abc_font_family_menu_material = 2131558425; // aapt resource value: 0x7F0D001A - public const int abc_menu_alt_shortcut_label = 2131558426; + public const int abc_font_family_subhead_material = 2131558426; // aapt resource value: 0x7F0D001B - public const int abc_menu_ctrl_shortcut_label = 2131558427; + public const int abc_font_family_title_material = 2131558427; // aapt resource value: 0x7F0D001C - public const int abc_menu_delete_shortcut_label = 2131558428; + public const int abc_menu_alt_shortcut_label = 2131558428; // aapt resource value: 0x7F0D001D - public const int abc_menu_enter_shortcut_label = 2131558429; + public const int abc_menu_ctrl_shortcut_label = 2131558429; // aapt resource value: 0x7F0D001E - public const int abc_menu_function_shortcut_label = 2131558430; + public const int abc_menu_delete_shortcut_label = 2131558430; // aapt resource value: 0x7F0D001F - public const int abc_menu_meta_shortcut_label = 2131558431; + public const int abc_menu_enter_shortcut_label = 2131558431; // aapt resource value: 0x7F0D0020 - public const int abc_menu_shift_shortcut_label = 2131558432; + public const int abc_menu_function_shortcut_label = 2131558432; // aapt resource value: 0x7F0D0021 - public const int abc_menu_space_shortcut_label = 2131558433; + public const int abc_menu_meta_shortcut_label = 2131558433; // aapt resource value: 0x7F0D0022 - public const int abc_menu_sym_shortcut_label = 2131558434; + public const int abc_menu_shift_shortcut_label = 2131558434; // aapt resource value: 0x7F0D0023 - public const int abc_prepend_shortcut_label = 2131558435; - - // aapt resource value: 0x7F0D0025 - public const int abc_searchview_description_clear = 2131558437; - - // aapt resource value: 0x7F0D0026 - public const int abc_searchview_description_query = 2131558438; - - // aapt resource value: 0x7F0D0027 - public const int abc_searchview_description_search = 2131558439; - - // aapt resource value: 0x7F0D0028 - public const int abc_searchview_description_submit = 2131558440; - - // aapt resource value: 0x7F0D0029 - public const int abc_searchview_description_voice = 2131558441; + public const int abc_menu_space_shortcut_label = 2131558435; // aapt resource value: 0x7F0D0024 - public const int abc_search_hint = 2131558436; + public const int abc_menu_sym_shortcut_label = 2131558436; + + // aapt resource value: 0x7F0D0025 + public const int abc_prepend_shortcut_label = 2131558437; + + // aapt resource value: 0x7F0D0027 + public const int abc_searchview_description_clear = 2131558439; + + // aapt resource value: 0x7F0D0028 + public const int abc_searchview_description_query = 2131558440; + + // aapt resource value: 0x7F0D0029 + public const int abc_searchview_description_search = 2131558441; // aapt resource value: 0x7F0D002A - public const int abc_shareactionprovider_share_with = 2131558442; + public const int abc_searchview_description_submit = 2131558442; // aapt resource value: 0x7F0D002B - public const int abc_shareactionprovider_share_with_application = 2131558443; + public const int abc_searchview_description_voice = 2131558443; + + // aapt resource value: 0x7F0D0026 + public const int abc_search_hint = 2131558438; // aapt resource value: 0x7F0D002C - public const int abc_toolbar_collapse_description = 2131558444; + public const int abc_shareactionprovider_share_with = 2131558444; // aapt resource value: 0x7F0D002D - public const int appbar_scrolling_view_behavior = 2131558445; + public const int abc_shareactionprovider_share_with_application = 2131558445; + + // aapt resource value: 0x7F0D002E + public const int abc_toolbar_collapse_description = 2131558446; + + // aapt resource value: 0x7F0D002F + public const int appbar_scrolling_view_behavior = 2131558447; // aapt resource value: 0x7F0D0000 public const int ApplicationName = 2131558400; @@ -10562,437 +10562,437 @@ namespace Bit.Droid // aapt resource value: 0x7F0D0002 public const int AutoFillServiceSummary = 2131558402; - // aapt resource value: 0x7F0D002E - public const int bottom_sheet_behavior = 2131558446; - - // aapt resource value: 0x7F0D002F - public const int character_counter_content_description = 2131558447; - // aapt resource value: 0x7F0D0030 - public const int character_counter_pattern = 2131558448; + public const int bottom_sheet_behavior = 2131558448; // aapt resource value: 0x7F0D0031 - public const int common_google_play_services_enable_button = 2131558449; + public const int character_counter_content_description = 2131558449; // aapt resource value: 0x7F0D0032 - public const int common_google_play_services_enable_text = 2131558450; + public const int character_counter_pattern = 2131558450; // aapt resource value: 0x7F0D0033 - public const int common_google_play_services_enable_title = 2131558451; + public const int common_google_play_services_enable_button = 2131558451; // aapt resource value: 0x7F0D0034 - public const int common_google_play_services_install_button = 2131558452; + public const int common_google_play_services_enable_text = 2131558452; // aapt resource value: 0x7F0D0035 - public const int common_google_play_services_install_text = 2131558453; + public const int common_google_play_services_enable_title = 2131558453; // aapt resource value: 0x7F0D0036 - public const int common_google_play_services_install_title = 2131558454; + public const int common_google_play_services_install_button = 2131558454; // aapt resource value: 0x7F0D0037 - public const int common_google_play_services_notification_ticker = 2131558455; + public const int common_google_play_services_install_text = 2131558455; // aapt resource value: 0x7F0D0038 - public const int common_google_play_services_unknown_issue = 2131558456; + public const int common_google_play_services_install_title = 2131558456; // aapt resource value: 0x7F0D0039 - public const int common_google_play_services_unsupported_text = 2131558457; + public const int common_google_play_services_notification_ticker = 2131558457; // aapt resource value: 0x7F0D003A - public const int common_google_play_services_update_button = 2131558458; + public const int common_google_play_services_unknown_issue = 2131558458; // aapt resource value: 0x7F0D003B - public const int common_google_play_services_update_text = 2131558459; + public const int common_google_play_services_unsupported_text = 2131558459; // aapt resource value: 0x7F0D003C - public const int common_google_play_services_update_title = 2131558460; + public const int common_google_play_services_update_button = 2131558460; // aapt resource value: 0x7F0D003D - public const int common_google_play_services_updating_text = 2131558461; + public const int common_google_play_services_update_text = 2131558461; // aapt resource value: 0x7F0D003E - public const int common_google_play_services_wear_update_text = 2131558462; + public const int common_google_play_services_update_title = 2131558462; // aapt resource value: 0x7F0D003F - public const int common_open_on_phone = 2131558463; + public const int common_google_play_services_updating_text = 2131558463; // aapt resource value: 0x7F0D0040 - public const int common_signin_button_text = 2131558464; + public const int common_google_play_services_wear_update_text = 2131558464; // aapt resource value: 0x7F0D0041 - public const int common_signin_button_text_long = 2131558465; + public const int common_open_on_phone = 2131558465; // aapt resource value: 0x7F0D0042 - public const int default_web_client_id = 2131558466; + public const int common_signin_button_text = 2131558466; // aapt resource value: 0x7F0D0043 - public const int fab_transformation_scrim_behavior = 2131558467; + public const int common_signin_button_text_long = 2131558467; // aapt resource value: 0x7F0D0044 - public const int fab_transformation_sheet_behavior = 2131558468; + public const int default_web_client_id = 2131558468; // aapt resource value: 0x7F0D0045 - public const int fcm_fallback_notification_channel_label = 2131558469; + public const int fab_transformation_scrim_behavior = 2131558469; // aapt resource value: 0x7F0D0046 - public const int firebase_database_url = 2131558470; + public const int fab_transformation_sheet_behavior = 2131558470; // aapt resource value: 0x7F0D0047 - public const int gcm_defaultSenderId = 2131558471; + public const int fcm_fallback_notification_channel_label = 2131558471; // aapt resource value: 0x7F0D0048 - public const int google_api_key = 2131558472; + public const int firebase_database_url = 2131558472; // aapt resource value: 0x7F0D0049 - public const int google_app_id = 2131558473; + public const int gcm_defaultSenderId = 2131558473; // aapt resource value: 0x7F0D004A - public const int google_crash_reporting_api_key = 2131558474; + public const int google_api_key = 2131558474; // aapt resource value: 0x7F0D004B - public const int google_storage_bucket = 2131558475; + public const int google_app_id = 2131558475; + + // aapt resource value: 0x7F0D004C + public const int google_crash_reporting_api_key = 2131558476; + + // aapt resource value: 0x7F0D004D + public const int google_storage_bucket = 2131558477; // aapt resource value: 0x7F0D0003 public const int Hello = 2131558403; - // aapt resource value: 0x7F0D004C - public const int hide_bottom_view_on_scroll_behavior = 2131558476; - - // aapt resource value: 0x7F0D004D - public const int hockeyapp_crash_dialog_app_name_fallback = 2131558477; - // aapt resource value: 0x7F0D004E - public const int hockeyapp_crash_dialog_message = 2131558478; + public const int hide_bottom_view_on_scroll_behavior = 2131558478; // aapt resource value: 0x7F0D004F - public const int hockeyapp_crash_dialog_negative_button = 2131558479; + public const int hockeyapp_crash_dialog_app_name_fallback = 2131558479; // aapt resource value: 0x7F0D0050 - public const int hockeyapp_crash_dialog_neutral_button = 2131558480; + public const int hockeyapp_crash_dialog_message = 2131558480; // aapt resource value: 0x7F0D0051 - public const int hockeyapp_crash_dialog_positive_button = 2131558481; + public const int hockeyapp_crash_dialog_negative_button = 2131558481; // aapt resource value: 0x7F0D0052 - public const int hockeyapp_crash_dialog_title = 2131558482; + public const int hockeyapp_crash_dialog_neutral_button = 2131558482; // aapt resource value: 0x7F0D0053 - public const int hockeyapp_dialog_error_message = 2131558483; + public const int hockeyapp_crash_dialog_positive_button = 2131558483; // aapt resource value: 0x7F0D0054 - public const int hockeyapp_dialog_error_title = 2131558484; + public const int hockeyapp_crash_dialog_title = 2131558484; // aapt resource value: 0x7F0D0055 - public const int hockeyapp_dialog_positive_button = 2131558485; + public const int hockeyapp_dialog_error_message = 2131558485; // aapt resource value: 0x7F0D0056 - public const int hockeyapp_download_failed_dialog_message = 2131558486; + public const int hockeyapp_dialog_error_title = 2131558486; // aapt resource value: 0x7F0D0057 - public const int hockeyapp_download_failed_dialog_negative_button = 2131558487; + public const int hockeyapp_dialog_positive_button = 2131558487; // aapt resource value: 0x7F0D0058 - public const int hockeyapp_download_failed_dialog_positive_button = 2131558488; + public const int hockeyapp_download_failed_dialog_message = 2131558488; // aapt resource value: 0x7F0D0059 - public const int hockeyapp_download_failed_dialog_title = 2131558489; + public const int hockeyapp_download_failed_dialog_negative_button = 2131558489; // aapt resource value: 0x7F0D005A - public const int hockeyapp_error_install_form_unknown_sources_disabled = 2131558490; + public const int hockeyapp_download_failed_dialog_positive_button = 2131558490; // aapt resource value: 0x7F0D005B - public const int hockeyapp_error_no_external_storage_permission = 2131558491; + public const int hockeyapp_download_failed_dialog_title = 2131558491; // aapt resource value: 0x7F0D005C - public const int hockeyapp_error_no_network_message = 2131558492; + public const int hockeyapp_error_install_form_unknown_sources_disabled = 2131558492; // aapt resource value: 0x7F0D005D - public const int hockeyapp_expiry_info_text = 2131558493; + public const int hockeyapp_error_no_external_storage_permission = 2131558493; // aapt resource value: 0x7F0D005E - public const int hockeyapp_expiry_info_title = 2131558494; - - // aapt resource value: 0x7F0D0061 - public const int hockeyapp_feedback_attachment_added = 2131558497; - - // aapt resource value: 0x7F0D0062 - public const int hockeyapp_feedback_attachment_button_text = 2131558498; - - // aapt resource value: 0x7F0D0063 - public const int hockeyapp_feedback_attachment_error = 2131558499; - - // aapt resource value: 0x7F0D0064 - public const int hockeyapp_feedback_attachment_loading = 2131558500; - - // aapt resource value: 0x7F0D0066 - public const int hockeyapp_feedback_attachment_removed = 2131558502; - - // aapt resource value: 0x7F0D0065 - public const int hockeyapp_feedback_attachment_remove_description = 2131558501; + public const int hockeyapp_error_no_network_message = 2131558494; // aapt resource value: 0x7F0D005F - public const int hockeyapp_feedback_attach_file = 2131558495; + public const int hockeyapp_expiry_info_text = 2131558495; // aapt resource value: 0x7F0D0060 - public const int hockeyapp_feedback_attach_picture = 2131558496; + public const int hockeyapp_expiry_info_title = 2131558496; - // aapt resource value: 0x7F0D0067 - public const int hockeyapp_feedback_email_hint = 2131558503; + // aapt resource value: 0x7F0D0063 + public const int hockeyapp_feedback_attachment_added = 2131558499; + + // aapt resource value: 0x7F0D0064 + public const int hockeyapp_feedback_attachment_button_text = 2131558500; + + // aapt resource value: 0x7F0D0065 + public const int hockeyapp_feedback_attachment_error = 2131558501; + + // aapt resource value: 0x7F0D0066 + public const int hockeyapp_feedback_attachment_loading = 2131558502; // aapt resource value: 0x7F0D0068 - public const int hockeyapp_feedback_email_hint_required = 2131558504; + public const int hockeyapp_feedback_attachment_removed = 2131558504; + + // aapt resource value: 0x7F0D0067 + public const int hockeyapp_feedback_attachment_remove_description = 2131558503; + + // aapt resource value: 0x7F0D0061 + public const int hockeyapp_feedback_attach_file = 2131558497; + + // aapt resource value: 0x7F0D0062 + public const int hockeyapp_feedback_attach_picture = 2131558498; // aapt resource value: 0x7F0D0069 - public const int hockeyapp_feedback_fetching_feedback_text = 2131558505; + public const int hockeyapp_feedback_email_hint = 2131558505; // aapt resource value: 0x7F0D006A - public const int hockeyapp_feedback_last_updated_text = 2131558506; + public const int hockeyapp_feedback_email_hint_required = 2131558506; // aapt resource value: 0x7F0D006B - public const int hockeyapp_feedback_max_attachments_allowed = 2131558507; + public const int hockeyapp_feedback_fetching_feedback_text = 2131558507; // aapt resource value: 0x7F0D006C - public const int hockeyapp_feedback_message_hint = 2131558508; + public const int hockeyapp_feedback_last_updated_text = 2131558508; // aapt resource value: 0x7F0D006D - public const int hockeyapp_feedback_message_hint_required = 2131558509; + public const int hockeyapp_feedback_max_attachments_allowed = 2131558509; // aapt resource value: 0x7F0D006E - public const int hockeyapp_feedback_name_hint = 2131558510; + public const int hockeyapp_feedback_message_hint = 2131558510; // aapt resource value: 0x7F0D006F - public const int hockeyapp_feedback_name_hint_required = 2131558511; + public const int hockeyapp_feedback_message_hint_required = 2131558511; // aapt resource value: 0x7F0D0070 - public const int hockeyapp_feedback_new_answer_notification_message = 2131558512; + public const int hockeyapp_feedback_name_hint = 2131558512; // aapt resource value: 0x7F0D0071 - public const int hockeyapp_feedback_notification_channel = 2131558513; + public const int hockeyapp_feedback_name_hint_required = 2131558513; // aapt resource value: 0x7F0D0072 - public const int hockeyapp_feedback_notification_title = 2131558514; + public const int hockeyapp_feedback_new_answer_notification_message = 2131558514; // aapt resource value: 0x7F0D0073 - public const int hockeyapp_feedback_refresh_button_text = 2131558515; + public const int hockeyapp_feedback_notification_channel = 2131558515; // aapt resource value: 0x7F0D0074 - public const int hockeyapp_feedback_response_button_text = 2131558516; + public const int hockeyapp_feedback_notification_title = 2131558516; // aapt resource value: 0x7F0D0075 - public const int hockeyapp_feedback_screenshot_fail = 2131558517; + public const int hockeyapp_feedback_refresh_button_text = 2131558517; // aapt resource value: 0x7F0D0076 - public const int hockeyapp_feedback_screenshot_notification_message = 2131558518; + public const int hockeyapp_feedback_response_button_text = 2131558518; // aapt resource value: 0x7F0D0077 - public const int hockeyapp_feedback_select_file = 2131558519; + public const int hockeyapp_feedback_screenshot_fail = 2131558519; // aapt resource value: 0x7F0D0078 - public const int hockeyapp_feedback_select_picture = 2131558520; - - // aapt resource value: 0x7F0D007C - public const int hockeyapp_feedback_sending_feedback_text = 2131558524; + public const int hockeyapp_feedback_screenshot_notification_message = 2131558520; // aapt resource value: 0x7F0D0079 - public const int hockeyapp_feedback_send_button_text = 2131558521; + public const int hockeyapp_feedback_select_file = 2131558521; // aapt resource value: 0x7F0D007A - public const int hockeyapp_feedback_send_generic_error = 2131558522; - - // aapt resource value: 0x7F0D007B - public const int hockeyapp_feedback_send_network_error = 2131558523; - - // aapt resource value: 0x7F0D007D - public const int hockeyapp_feedback_sent_toast = 2131558525; + public const int hockeyapp_feedback_select_picture = 2131558522; // aapt resource value: 0x7F0D007E - public const int hockeyapp_feedback_subject_hint = 2131558526; + public const int hockeyapp_feedback_sending_feedback_text = 2131558526; + + // aapt resource value: 0x7F0D007B + public const int hockeyapp_feedback_send_button_text = 2131558523; + + // aapt resource value: 0x7F0D007C + public const int hockeyapp_feedback_send_generic_error = 2131558524; + + // aapt resource value: 0x7F0D007D + public const int hockeyapp_feedback_send_network_error = 2131558525; // aapt resource value: 0x7F0D007F - public const int hockeyapp_feedback_subject_hint_required = 2131558527; + public const int hockeyapp_feedback_sent_toast = 2131558527; // aapt resource value: 0x7F0D0080 - public const int hockeyapp_feedback_title = 2131558528; + public const int hockeyapp_feedback_subject_hint = 2131558528; // aapt resource value: 0x7F0D0081 - public const int hockeyapp_feedback_validate_email_empty = 2131558529; + public const int hockeyapp_feedback_subject_hint_required = 2131558529; // aapt resource value: 0x7F0D0082 - public const int hockeyapp_feedback_validate_email_error = 2131558530; + public const int hockeyapp_feedback_title = 2131558530; // aapt resource value: 0x7F0D0083 - public const int hockeyapp_feedback_validate_name_error = 2131558531; + public const int hockeyapp_feedback_validate_email_empty = 2131558531; // aapt resource value: 0x7F0D0084 - public const int hockeyapp_feedback_validate_subject_error = 2131558532; + public const int hockeyapp_feedback_validate_email_error = 2131558532; // aapt resource value: 0x7F0D0085 - public const int hockeyapp_feedback_validate_text_error = 2131558533; + public const int hockeyapp_feedback_validate_name_error = 2131558533; // aapt resource value: 0x7F0D0086 - public const int hockeyapp_login_email_hint_required = 2131558534; + public const int hockeyapp_feedback_validate_subject_error = 2131558534; // aapt resource value: 0x7F0D0087 - public const int hockeyapp_login_headline_text = 2131558535; + public const int hockeyapp_feedback_validate_text_error = 2131558535; // aapt resource value: 0x7F0D0088 - public const int hockeyapp_login_headline_text_email_only = 2131558536; + public const int hockeyapp_login_email_hint_required = 2131558536; // aapt resource value: 0x7F0D0089 - public const int hockeyapp_login_login_button_text = 2131558537; + public const int hockeyapp_login_headline_text = 2131558537; // aapt resource value: 0x7F0D008A - public const int hockeyapp_login_missing_credentials_toast = 2131558538; + public const int hockeyapp_login_headline_text_email_only = 2131558538; // aapt resource value: 0x7F0D008B - public const int hockeyapp_login_password_hint_required = 2131558539; + public const int hockeyapp_login_login_button_text = 2131558539; // aapt resource value: 0x7F0D008C - public const int hockeyapp_paint_dialog_message = 2131558540; + public const int hockeyapp_login_missing_credentials_toast = 2131558540; // aapt resource value: 0x7F0D008D - public const int hockeyapp_paint_dialog_negative_button = 2131558541; + public const int hockeyapp_login_password_hint_required = 2131558541; // aapt resource value: 0x7F0D008E - public const int hockeyapp_paint_dialog_neutral_button = 2131558542; + public const int hockeyapp_paint_dialog_message = 2131558542; // aapt resource value: 0x7F0D008F - public const int hockeyapp_paint_dialog_positive_button = 2131558543; + public const int hockeyapp_paint_dialog_negative_button = 2131558543; // aapt resource value: 0x7F0D0090 - public const int hockeyapp_paint_indicator_toast = 2131558544; + public const int hockeyapp_paint_dialog_neutral_button = 2131558544; // aapt resource value: 0x7F0D0091 - public const int hockeyapp_paint_menu_clear = 2131558545; + public const int hockeyapp_paint_dialog_positive_button = 2131558545; // aapt resource value: 0x7F0D0092 - public const int hockeyapp_paint_menu_save = 2131558546; + public const int hockeyapp_paint_indicator_toast = 2131558546; // aapt resource value: 0x7F0D0093 - public const int hockeyapp_paint_menu_undo = 2131558547; + public const int hockeyapp_paint_menu_clear = 2131558547; // aapt resource value: 0x7F0D0094 - public const int hockeyapp_update_already_installed = 2131558548; + public const int hockeyapp_paint_menu_save = 2131558548; // aapt resource value: 0x7F0D0095 - public const int hockeyapp_update_button = 2131558549; + public const int hockeyapp_paint_menu_undo = 2131558549; // aapt resource value: 0x7F0D0096 - public const int hockeyapp_update_dialog_message = 2131558550; + public const int hockeyapp_update_already_installed = 2131558550; // aapt resource value: 0x7F0D0097 - public const int hockeyapp_update_dialog_negative_button = 2131558551; + public const int hockeyapp_update_button = 2131558551; // aapt resource value: 0x7F0D0098 - public const int hockeyapp_update_dialog_positive_button = 2131558552; + public const int hockeyapp_update_dialog_message = 2131558552; // aapt resource value: 0x7F0D0099 - public const int hockeyapp_update_dialog_title = 2131558553; + public const int hockeyapp_update_dialog_negative_button = 2131558553; // aapt resource value: 0x7F0D009A - public const int hockeyapp_update_loading = 2131558554; + public const int hockeyapp_update_dialog_positive_button = 2131558554; // aapt resource value: 0x7F0D009B - public const int hockeyapp_update_mandatory_toast = 2131558555; + public const int hockeyapp_update_dialog_title = 2131558555; // aapt resource value: 0x7F0D009C - public const int hockeyapp_update_newest_version = 2131558556; + public const int hockeyapp_update_loading = 2131558556; // aapt resource value: 0x7F0D009D - public const int hockeyapp_update_no_info = 2131558557; + public const int hockeyapp_update_mandatory_toast = 2131558557; // aapt resource value: 0x7F0D009E - public const int hockeyapp_update_restore = 2131558558; + public const int hockeyapp_update_newest_version = 2131558558; // aapt resource value: 0x7F0D009F - public const int hockeyapp_update_title = 2131558559; + public const int hockeyapp_update_no_info = 2131558559; // aapt resource value: 0x7F0D00A0 - public const int hockeyapp_update_unknown_size = 2131558560; + public const int hockeyapp_update_restore = 2131558560; // aapt resource value: 0x7F0D00A1 - public const int hockeyapp_update_version = 2131558561; + public const int hockeyapp_update_title = 2131558561; // aapt resource value: 0x7F0D00A2 - public const int hockeyapp_update_version_details_label = 2131558562; + public const int hockeyapp_update_unknown_size = 2131558562; // aapt resource value: 0x7F0D00A3 - public const int library_name = 2131558563; + public const int hockeyapp_update_version = 2131558563; // aapt resource value: 0x7F0D00A4 - public const int mr_button_content_description = 2131558564; + public const int hockeyapp_update_version_details_label = 2131558564; // aapt resource value: 0x7F0D00A5 - public const int mr_cast_button_connected = 2131558565; + public const int library_name = 2131558565; // aapt resource value: 0x7F0D00A6 - public const int mr_cast_button_connecting = 2131558566; + public const int mr_button_content_description = 2131558566; // aapt resource value: 0x7F0D00A7 - public const int mr_cast_button_disconnected = 2131558567; + public const int mr_cast_button_connected = 2131558567; // aapt resource value: 0x7F0D00A8 - public const int mr_cast_dialog_title_view_placeholder = 2131558568; + public const int mr_cast_button_connecting = 2131558568; // aapt resource value: 0x7F0D00A9 - public const int mr_chooser_searching = 2131558569; + public const int mr_cast_button_disconnected = 2131558569; // aapt resource value: 0x7F0D00AA - public const int mr_chooser_title = 2131558570; + public const int mr_cast_dialog_title_view_placeholder = 2131558570; // aapt resource value: 0x7F0D00AB - public const int mr_controller_album_art = 2131558571; + public const int mr_chooser_searching = 2131558571; // aapt resource value: 0x7F0D00AC - public const int mr_controller_casting_screen = 2131558572; + public const int mr_chooser_title = 2131558572; // aapt resource value: 0x7F0D00AD - public const int mr_controller_close_description = 2131558573; + public const int mr_controller_album_art = 2131558573; // aapt resource value: 0x7F0D00AE - public const int mr_controller_collapse_group = 2131558574; + public const int mr_controller_casting_screen = 2131558574; // aapt resource value: 0x7F0D00AF - public const int mr_controller_disconnect = 2131558575; + public const int mr_controller_close_description = 2131558575; // aapt resource value: 0x7F0D00B0 - public const int mr_controller_expand_group = 2131558576; + public const int mr_controller_collapse_group = 2131558576; // aapt resource value: 0x7F0D00B1 - public const int mr_controller_no_info_available = 2131558577; + public const int mr_controller_disconnect = 2131558577; // aapt resource value: 0x7F0D00B2 - public const int mr_controller_no_media_selected = 2131558578; + public const int mr_controller_expand_group = 2131558578; // aapt resource value: 0x7F0D00B3 - public const int mr_controller_pause = 2131558579; + public const int mr_controller_no_info_available = 2131558579; // aapt resource value: 0x7F0D00B4 - public const int mr_controller_play = 2131558580; + public const int mr_controller_no_media_selected = 2131558580; // aapt resource value: 0x7F0D00B5 - public const int mr_controller_stop = 2131558581; + public const int mr_controller_pause = 2131558581; // aapt resource value: 0x7F0D00B6 - public const int mr_controller_stop_casting = 2131558582; + public const int mr_controller_play = 2131558582; // aapt resource value: 0x7F0D00B7 - public const int mr_controller_volume_slider = 2131558583; + public const int mr_controller_stop = 2131558583; // aapt resource value: 0x7F0D00B8 - public const int mr_dialog_device_header = 2131558584; + public const int mr_controller_stop_casting = 2131558584; // aapt resource value: 0x7F0D00B9 - public const int mr_dialog_route_header = 2131558585; + public const int mr_controller_volume_slider = 2131558585; // aapt resource value: 0x7F0D00BA - public const int mr_system_route_name = 2131558586; + public const int mr_dialog_device_header = 2131558586; // aapt resource value: 0x7F0D00BB - public const int mr_user_route_category_name = 2131558587; + public const int mr_dialog_route_header = 2131558587; // aapt resource value: 0x7F0D00BC - public const int mtrl_chip_close_icon_content_description = 2131558588; + public const int mr_system_route_name = 2131558588; + + // aapt resource value: 0x7F0D00BD + public const int mr_user_route_category_name = 2131558589; + + // aapt resource value: 0x7F0D00BE + public const int mtrl_chip_close_icon_content_description = 2131558590; // aapt resource value: 0x7F0D0004 public const int MyVault = 2131558404; @@ -11000,26 +11000,32 @@ namespace Bit.Droid // aapt resource value: 0x7F0D0005 public const int PasswordGenerator = 2131558405; - // aapt resource value: 0x7F0D00BD - public const int password_toggle_content_description = 2131558589; - - // aapt resource value: 0x7F0D00BE - public const int path_password_eye = 2131558590; - // aapt resource value: 0x7F0D00BF - public const int path_password_eye_mask_strike_through = 2131558591; + public const int password_toggle_content_description = 2131558591; // aapt resource value: 0x7F0D00C0 - public const int path_password_eye_mask_visible = 2131558592; + public const int path_password_eye = 2131558592; // aapt resource value: 0x7F0D00C1 - public const int path_password_strike_through = 2131558593; + public const int path_password_eye_mask_strike_through = 2131558593; // aapt resource value: 0x7F0D00C2 - public const int search_menu_title = 2131558594; + public const int path_password_eye_mask_visible = 2131558594; // aapt resource value: 0x7F0D00C3 - public const int status_bar_notification_info_overflow = 2131558595; + public const int path_password_strike_through = 2131558595; + + // aapt resource value: 0x7F0D00C4 + public const int search_menu_title = 2131558596; + + // aapt resource value: 0x7F0D0006 + public const int SelfHostedServerUrl = 2131558406; + + // aapt resource value: 0x7F0D0007 + public const int ServerUrl = 2131558407; + + // aapt resource value: 0x7F0D00C5 + public const int status_bar_notification_info_overflow = 2131558597; static String() { @@ -15659,16 +15665,19 @@ namespace Bit.Droid public const int accessibilityservice = 2131755008; // aapt resource value: 0x7F100001 - public const int autofillservice = 2131755009; + public const int app_restrictions = 2131755009; // aapt resource value: 0x7F100002 - public const int filepaths = 2131755010; + public const int autofillservice = 2131755010; // aapt resource value: 0x7F100003 - public const int network_security_config = 2131755011; + public const int filepaths = 2131755011; // aapt resource value: 0x7F100004 - public const int xamarin_essentials_fileprovider_file_paths = 2131755012; + public const int network_security_config = 2131755012; + + // aapt resource value: 0x7F100005 + public const int xamarin_essentials_fileprovider_file_paths = 2131755013; static Xml() { diff --git a/src/Android/Resources/values/strings.xml b/src/Android/Resources/values/strings.xml index 6fb45f3c3..ec96d918f 100644 --- a/src/Android/Resources/values/strings.xml +++ b/src/Android/Resources/values/strings.xml @@ -16,4 +16,10 @@ Password Generator + + Self-hosted server URL + + + Server URL + diff --git a/src/Android/Resources/xml/app_restrictions.xml b/src/Android/Resources/xml/app_restrictions.xml new file mode 100644 index 000000000..e6f7a37c3 --- /dev/null +++ b/src/Android/Resources/xml/app_restrictions.xml @@ -0,0 +1,9 @@ + + + + diff --git a/src/Android/Utilities/AndroidHelpers.cs b/src/Android/Utilities/AndroidHelpers.cs index 5973ca5e8..a36869998 100644 --- a/src/Android/Utilities/AndroidHelpers.cs +++ b/src/Android/Utilities/AndroidHelpers.cs @@ -1,10 +1,15 @@ -using Android.Content; +using System.Collections.Generic; +using System.Threading.Tasks; +using Android.Content; using Android.Provider; +using Bit.App.Utilities; namespace Bit.Droid.Utilities { public static class AndroidHelpers { + private static string BaseEnvironmentUrlRestrictionKey = "baseEnvironmentUrl"; + public static string GetFileName(Context context, Android.Net.Uri uri) { string name = null; @@ -26,5 +31,21 @@ namespace Bit.Droid.Utilities } return name; } + + public static async Task SetPreconfiguredRestrictionSettingsAsync(Context context) + { + var restrictionsManager = (RestrictionsManager)context.GetSystemService(Context.RestrictionsService); + var restrictions = restrictionsManager.ApplicationRestrictions; + var dict = new Dictionary(); + if(restrictions.ContainsKey(BaseEnvironmentUrlRestrictionKey)) + { + dict.Add(BaseEnvironmentUrlRestrictionKey, restrictions.GetString(BaseEnvironmentUrlRestrictionKey)); + } + + if(dict.Count > 0) + { + await AppHelpers.SetPreconfiguredSettingsAsync(dict); + } + } } } diff --git a/src/App/Utilities/AppHelpers.cs b/src/App/Utilities/AppHelpers.cs index a08f63d91..82d75f96f 100644 --- a/src/App/Utilities/AppHelpers.cs +++ b/src/App/Utilities/AppHelpers.cs @@ -6,6 +6,7 @@ using Bit.Core.Abstractions; using Bit.Core.Models.View; using Bit.Core.Utilities; using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using Xamarin.Forms; @@ -145,5 +146,35 @@ namespace Bit.App.Utilities } return false; } + + public static async Task SetPreconfiguredSettingsAsync(IDictionary configSettings) + { + if(configSettings?.Any() ?? true) + { + return; + } + foreach(var setting in configSettings) + { + switch(setting.Key) + { + case "baseEnvironmentUrl": + var environmentService = ServiceContainer.Resolve("environmentService"); + if(environmentService.BaseUrl != setting.Value) + { + await environmentService.SetUrlsAsync(new Core.Models.Data.EnvironmentUrlData + { + Base = setting.Value, + Api = environmentService.ApiUrl, + Identity = environmentService.IdentityUrl, + WebVault = environmentService.WebVaultUrl, + Icons = environmentService.IconsUrl + }); + } + break; + default: + break; + } + } + } } } diff --git a/src/iOS.Core/Utilities/iOSCoreHelpers.cs b/src/iOS.Core/Utilities/iOSCoreHelpers.cs index db2320634..2a273c921 100644 --- a/src/iOS.Core/Utilities/iOSCoreHelpers.cs +++ b/src/iOS.Core/Utilities/iOSCoreHelpers.cs @@ -1,4 +1,5 @@ -using System.IO; +using System; +using System.IO; using System.Threading.Tasks; using Bit.App.Abstractions; using Bit.App.Services; @@ -64,12 +65,12 @@ namespace Bit.iOS.Core.Utilities ServiceContainer.Register("platformUtilsService", platformUtilsService); } - public static void Bootstrap() + public static void Bootstrap(Func postBootstrapFunc = null) { (ServiceContainer.Resolve("i18nService") as MobileI18nService).Init(); ServiceContainer.Resolve("authService").Init(); // Note: This is not awaited - var bootstrapTask = BootstrapAsync(); + var bootstrapTask = BootstrapAsync(postBootstrapFunc); } public static void AppearanceAdjustments(IDeviceActionService deviceActionService) @@ -79,13 +80,17 @@ namespace Bit.iOS.Core.Utilities UIApplication.SharedApplication.StatusBarStyle = UIStatusBarStyle.LightContent; } - private static async Task BootstrapAsync() + private static async Task BootstrapAsync(Func postBootstrapFunc = null) { var disableFavicon = await ServiceContainer.Resolve("storageService").GetAsync( Bit.Core.Constants.DisableFaviconKey); await ServiceContainer.Resolve("stateService").SaveAsync( Bit.Core.Constants.DisableFaviconKey, disableFavicon); await ServiceContainer.Resolve("environmentService").SetUrlsFromStorageAsync(); + if(postBootstrapFunc != null) + { + await postBootstrapFunc.Invoke(); + } } } -} \ No newline at end of file +} diff --git a/src/iOS/AppDelegate.cs b/src/iOS/AppDelegate.cs index 3b2a7da88..f808a46d4 100644 --- a/src/iOS/AppDelegate.cs +++ b/src/iOS/AppDelegate.cs @@ -282,7 +282,7 @@ namespace Bit.iOS _nfcDelegate = new NFCReaderDelegate((success, message) => _messagingService.Send("gotYubiKeyOTP", message)); - iOSCoreHelpers.Bootstrap(); + iOSCoreHelpers.Bootstrap(async () => await ApplyManagedSettingsAsync()); } private void RegisterPush() @@ -475,5 +475,20 @@ namespace Bit.iOS UIApplication.SharedApplication.EndBackgroundTask(_eventBackgroundTaskId); _eventBackgroundTaskId = 0; } + + private async Task ApplyManagedSettingsAsync() + { + var userDefaults = NSUserDefaults.StandardUserDefaults; + var managedSettings = userDefaults.DictionaryForKey("com.apple.configuration.managed"); + if(managedSettings != null && managedSettings.Count > 0) + { + var dict = new Dictionary(); + foreach(var setting in managedSettings) + { + dict.Add(setting.Key.ToString(), setting.Value?.ToString()); + } + await AppHelpers.SetPreconfiguredSettingsAsync(dict); + } + } } }