From 27fb44277f05918d55c55bc326afed2f2f696ad6 Mon Sep 17 00:00:00 2001 From: Kyle Spearrin Date: Wed, 1 Feb 2017 00:38:35 -0500 Subject: [PATCH] Accessibility service setup pages --- src/Android/Android.csproj | 6 + src/Android/AutofillService.cs | 20 +- src/Android/MainActivity.cs | 11 + src/Android/Resources/Resource.Designer.cs | 334 +++++++++--------- .../drawable/accessibility_step1.png | Bin 0 -> 11319 bytes .../drawable/accessibility_step2.png | Bin 0 -> 7516 bytes src/Android/Services/AppInfoService.cs | 2 + .../Abstractions/Services/IAppInfoService.cs | 1 + .../Pages/Tools/ToolsAutofillServicePage.cs | 173 +++++++-- src/App/Resources/AppResources.Designer.cs | 72 ++++ src/App/Resources/AppResources.resx | 24 ++ src/iOS/Services/AppInfoService.cs | 1 + 12 files changed, 448 insertions(+), 196 deletions(-) create mode 100644 src/Android/Resources/drawable/accessibility_step1.png create mode 100644 src/Android/Resources/drawable/accessibility_step2.png diff --git a/src/Android/Android.csproj b/src/Android/Android.csproj index 7f25fab87..f5a45dc08 100644 --- a/src/Android/Android.csproj +++ b/src/Android/Android.csproj @@ -761,6 +761,12 @@ + + + + + + diff --git a/src/Android/AutofillService.cs b/src/Android/AutofillService.cs index 50b94c23a..cc0eba9f6 100644 --- a/src/Android/AutofillService.cs +++ b/src/Android/AutofillService.cs @@ -24,6 +24,8 @@ namespace Bit.Android private const string BitwardenPackage = "com.x8bit.bitwarden"; private const string BitwardenWebsite = "bitwarden.com"; + public static bool Enabled { get; set; } = false; + public override void OnAccessibilityEvent(AccessibilityEvent e) { var eventType = e.EventType; @@ -80,6 +82,18 @@ namespace Bit.Android } + protected override void OnServiceConnected() + { + base.OnServiceConnected(); + Enabled = true; + } + + public override void OnDestroy() + { + base.OnDestroy(); + Enabled = false; + } + private void CancelNotification() { var notificationManager = ((NotificationManager)GetSystemService(NotificationService)); @@ -176,9 +190,9 @@ namespace Bit.Android var builder = new Notification.Builder(this); builder.SetSmallIcon(Resource.Drawable.notification_sm) - .SetContentTitle("bitwarden Autofill Service") - .SetContentText("Tap this notification to autofill a login from your vault.") - .SetTicker("Tap this notification to autofill a login from your vault.") + .SetContentTitle(App.Resources.AppResources.BitwardenAutofillService) + .SetContentText(App.Resources.AppResources.BitwardenAutofillServiceNotificationContent) + .SetTicker(App.Resources.AppResources.BitwardenAutofillServiceNotificationContent) .SetWhen(Java.Lang.JavaSystem.CurrentTimeMillis()) .SetContentIntent(pendingIntent); diff --git a/src/Android/MainActivity.cs b/src/Android/MainActivity.cs index 2371dfc25..b4fac37e4 100644 --- a/src/Android/MainActivity.cs +++ b/src/Android/MainActivity.cs @@ -79,6 +79,11 @@ namespace Bit.Android RateApp(); }); + MessagingCenter.Subscribe(Xamarin.Forms.Application.Current, "Accessibility", (sender) => + { + OpenAccessibilitySettings(); + }); + MessagingCenter.Subscribe( Xamarin.Forms.Application.Current, "Autofill", (sender, args) => { @@ -180,5 +185,11 @@ namespace Bit.Android intent.AddFlags(flags); return intent; } + + private void OpenAccessibilitySettings() + { + var intent = new Intent(global::Android.Provider.Settings.ActionAccessibilitySettings); + StartActivity(intent); + } } } diff --git a/src/Android/Resources/Resource.Designer.cs b/src/Android/Resources/Resource.Designer.cs index 074cb2131..465b79105 100644 --- a/src/Android/Resources/Resource.Designer.cs +++ b/src/Android/Resources/Resource.Designer.cs @@ -2281,490 +2281,496 @@ namespace Bit.Android public const int abc_textfield_search_material = 2130837578; // aapt resource value: 0x7f02004b - public const int cloudup = 2130837579; + public const int accessibility_step1 = 2130837579; // aapt resource value: 0x7f02004c - public const int cogs = 2130837580; + public const int accessibility_step2 = 2130837580; // aapt resource value: 0x7f02004d - public const int cogs_selected = 2130837581; + public const int cloudup = 2130837581; // aapt resource value: 0x7f02004e - public const int common_full_open_on_phone = 2130837582; + public const int cogs = 2130837582; // aapt resource value: 0x7f02004f - public const int common_google_signin_btn_icon_dark = 2130837583; + public const int cogs_selected = 2130837583; // aapt resource value: 0x7f020050 - public const int common_google_signin_btn_icon_dark_disabled = 2130837584; + public const int common_full_open_on_phone = 2130837584; // aapt resource value: 0x7f020051 - public const int common_google_signin_btn_icon_dark_focused = 2130837585; + public const int common_google_signin_btn_icon_dark = 2130837585; // aapt resource value: 0x7f020052 - public const int common_google_signin_btn_icon_dark_normal = 2130837586; + public const int common_google_signin_btn_icon_dark_disabled = 2130837586; // aapt resource value: 0x7f020053 - public const int common_google_signin_btn_icon_dark_pressed = 2130837587; + public const int common_google_signin_btn_icon_dark_focused = 2130837587; // aapt resource value: 0x7f020054 - public const int common_google_signin_btn_icon_light = 2130837588; + public const int common_google_signin_btn_icon_dark_normal = 2130837588; // aapt resource value: 0x7f020055 - public const int common_google_signin_btn_icon_light_disabled = 2130837589; + public const int common_google_signin_btn_icon_dark_pressed = 2130837589; // aapt resource value: 0x7f020056 - public const int common_google_signin_btn_icon_light_focused = 2130837590; + public const int common_google_signin_btn_icon_light = 2130837590; // aapt resource value: 0x7f020057 - public const int common_google_signin_btn_icon_light_normal = 2130837591; + public const int common_google_signin_btn_icon_light_disabled = 2130837591; // aapt resource value: 0x7f020058 - public const int common_google_signin_btn_icon_light_pressed = 2130837592; + public const int common_google_signin_btn_icon_light_focused = 2130837592; // aapt resource value: 0x7f020059 - public const int common_google_signin_btn_text_dark = 2130837593; + public const int common_google_signin_btn_icon_light_normal = 2130837593; // aapt resource value: 0x7f02005a - public const int common_google_signin_btn_text_dark_disabled = 2130837594; + public const int common_google_signin_btn_icon_light_pressed = 2130837594; // aapt resource value: 0x7f02005b - public const int common_google_signin_btn_text_dark_focused = 2130837595; + public const int common_google_signin_btn_text_dark = 2130837595; // aapt resource value: 0x7f02005c - public const int common_google_signin_btn_text_dark_normal = 2130837596; + public const int common_google_signin_btn_text_dark_disabled = 2130837596; // aapt resource value: 0x7f02005d - public const int common_google_signin_btn_text_dark_pressed = 2130837597; + public const int common_google_signin_btn_text_dark_focused = 2130837597; // aapt resource value: 0x7f02005e - public const int common_google_signin_btn_text_light = 2130837598; + public const int common_google_signin_btn_text_dark_normal = 2130837598; // aapt resource value: 0x7f02005f - public const int common_google_signin_btn_text_light_disabled = 2130837599; + public const int common_google_signin_btn_text_dark_pressed = 2130837599; // aapt resource value: 0x7f020060 - public const int common_google_signin_btn_text_light_focused = 2130837600; + public const int common_google_signin_btn_text_light = 2130837600; // aapt resource value: 0x7f020061 - public const int common_google_signin_btn_text_light_normal = 2130837601; + public const int common_google_signin_btn_text_light_disabled = 2130837601; // aapt resource value: 0x7f020062 - public const int common_google_signin_btn_text_light_pressed = 2130837602; + public const int common_google_signin_btn_text_light_focused = 2130837602; // aapt resource value: 0x7f020063 - public const int common_ic_googleplayservices = 2130837603; + public const int common_google_signin_btn_text_light_normal = 2130837603; // aapt resource value: 0x7f020064 - public const int common_plus_signin_btn_icon_dark = 2130837604; + public const int common_google_signin_btn_text_light_pressed = 2130837604; // aapt resource value: 0x7f020065 - public const int common_plus_signin_btn_icon_dark_disabled = 2130837605; + public const int common_ic_googleplayservices = 2130837605; // aapt resource value: 0x7f020066 - public const int common_plus_signin_btn_icon_dark_focused = 2130837606; + public const int common_plus_signin_btn_icon_dark = 2130837606; // aapt resource value: 0x7f020067 - public const int common_plus_signin_btn_icon_dark_normal = 2130837607; + public const int common_plus_signin_btn_icon_dark_disabled = 2130837607; // aapt resource value: 0x7f020068 - public const int common_plus_signin_btn_icon_dark_pressed = 2130837608; + public const int common_plus_signin_btn_icon_dark_focused = 2130837608; // aapt resource value: 0x7f020069 - public const int common_plus_signin_btn_icon_light = 2130837609; + public const int common_plus_signin_btn_icon_dark_normal = 2130837609; // aapt resource value: 0x7f02006a - public const int common_plus_signin_btn_icon_light_disabled = 2130837610; + public const int common_plus_signin_btn_icon_dark_pressed = 2130837610; // aapt resource value: 0x7f02006b - public const int common_plus_signin_btn_icon_light_focused = 2130837611; + public const int common_plus_signin_btn_icon_light = 2130837611; // aapt resource value: 0x7f02006c - public const int common_plus_signin_btn_icon_light_normal = 2130837612; + public const int common_plus_signin_btn_icon_light_disabled = 2130837612; // aapt resource value: 0x7f02006d - public const int common_plus_signin_btn_icon_light_pressed = 2130837613; + public const int common_plus_signin_btn_icon_light_focused = 2130837613; // aapt resource value: 0x7f02006e - public const int common_plus_signin_btn_text_dark = 2130837614; + public const int common_plus_signin_btn_icon_light_normal = 2130837614; // aapt resource value: 0x7f02006f - public const int common_plus_signin_btn_text_dark_disabled = 2130837615; + public const int common_plus_signin_btn_icon_light_pressed = 2130837615; // aapt resource value: 0x7f020070 - public const int common_plus_signin_btn_text_dark_focused = 2130837616; + public const int common_plus_signin_btn_text_dark = 2130837616; // aapt resource value: 0x7f020071 - public const int common_plus_signin_btn_text_dark_normal = 2130837617; + public const int common_plus_signin_btn_text_dark_disabled = 2130837617; // aapt resource value: 0x7f020072 - public const int common_plus_signin_btn_text_dark_pressed = 2130837618; + public const int common_plus_signin_btn_text_dark_focused = 2130837618; // aapt resource value: 0x7f020073 - public const int common_plus_signin_btn_text_light = 2130837619; + public const int common_plus_signin_btn_text_dark_normal = 2130837619; // aapt resource value: 0x7f020074 - public const int common_plus_signin_btn_text_light_disabled = 2130837620; + public const int common_plus_signin_btn_text_dark_pressed = 2130837620; // aapt resource value: 0x7f020075 - public const int common_plus_signin_btn_text_light_focused = 2130837621; + public const int common_plus_signin_btn_text_light = 2130837621; // aapt resource value: 0x7f020076 - public const int common_plus_signin_btn_text_light_normal = 2130837622; + public const int common_plus_signin_btn_text_light_disabled = 2130837622; // aapt resource value: 0x7f020077 - public const int common_plus_signin_btn_text_light_pressed = 2130837623; + public const int common_plus_signin_btn_text_light_focused = 2130837623; // aapt resource value: 0x7f020078 - public const int design_fab_background = 2130837624; + public const int common_plus_signin_btn_text_light_normal = 2130837624; // aapt resource value: 0x7f020079 - public const int design_snackbar_background = 2130837625; + public const int common_plus_signin_btn_text_light_pressed = 2130837625; // aapt resource value: 0x7f02007a - public const int envelope = 2130837626; + public const int design_fab_background = 2130837626; // aapt resource value: 0x7f02007b - public const int eye = 2130837627; + public const int design_snackbar_background = 2130837627; // aapt resource value: 0x7f02007c - public const int eye_slash = 2130837628; + public const int envelope = 2130837628; // aapt resource value: 0x7f02007d - public const int fa_lock = 2130837629; + public const int eye = 2130837629; // aapt resource value: 0x7f02007e - public const int fa_lock_selected = 2130837630; + public const int eye_slash = 2130837630; // aapt resource value: 0x7f02007f - public const int fingerprint = 2130837631; + public const int fa_lock = 2130837631; // aapt resource value: 0x7f020080 - public const int fingerprint_white = 2130837632; + public const int fa_lock_selected = 2130837632; // aapt resource value: 0x7f020081 - public const int folder = 2130837633; + public const int fingerprint = 2130837633; // aapt resource value: 0x7f020082 - public const int globe = 2130837634; + public const int fingerprint_white = 2130837634; // aapt resource value: 0x7f020083 - public const int hockeyapp_btn_background = 2130837635; + public const int folder = 2130837635; // aapt resource value: 0x7f020084 - public const int ic_audiotrack = 2130837636; + public const int globe = 2130837636; // aapt resource value: 0x7f020085 - public const int ic_audiotrack_light = 2130837637; + public const int hockeyapp_btn_background = 2130837637; // aapt resource value: 0x7f020086 - public const int ic_bluetooth_grey = 2130837638; + public const int ic_audiotrack = 2130837638; // aapt resource value: 0x7f020087 - public const int ic_bluetooth_white = 2130837639; + public const int ic_audiotrack_light = 2130837639; // aapt resource value: 0x7f020088 - public const int ic_cast_dark = 2130837640; + public const int ic_bluetooth_grey = 2130837640; // aapt resource value: 0x7f020089 - public const int ic_cast_disabled_light = 2130837641; + public const int ic_bluetooth_white = 2130837641; // aapt resource value: 0x7f02008a - public const int ic_cast_grey = 2130837642; + public const int ic_cast_dark = 2130837642; // aapt resource value: 0x7f02008b - public const int ic_cast_light = 2130837643; + public const int ic_cast_disabled_light = 2130837643; // aapt resource value: 0x7f02008c - public const int ic_cast_off_light = 2130837644; + public const int ic_cast_grey = 2130837644; // aapt resource value: 0x7f02008d - public const int ic_cast_on_0_light = 2130837645; + public const int ic_cast_light = 2130837645; // aapt resource value: 0x7f02008e - public const int ic_cast_on_1_light = 2130837646; + public const int ic_cast_off_light = 2130837646; // aapt resource value: 0x7f02008f - public const int ic_cast_on_2_light = 2130837647; + public const int ic_cast_on_0_light = 2130837647; // aapt resource value: 0x7f020090 - public const int ic_cast_on_light = 2130837648; + public const int ic_cast_on_1_light = 2130837648; // aapt resource value: 0x7f020091 - public const int ic_cast_white = 2130837649; + public const int ic_cast_on_2_light = 2130837649; // aapt resource value: 0x7f020092 - public const int ic_close_dark = 2130837650; + public const int ic_cast_on_light = 2130837650; // aapt resource value: 0x7f020093 - public const int ic_close_light = 2130837651; + public const int ic_cast_white = 2130837651; // aapt resource value: 0x7f020094 - public const int ic_collapse = 2130837652; + public const int ic_close_dark = 2130837652; // aapt resource value: 0x7f020095 - public const int ic_collapse_00000 = 2130837653; + public const int ic_close_light = 2130837653; // aapt resource value: 0x7f020096 - public const int ic_collapse_00001 = 2130837654; + public const int ic_collapse = 2130837654; // aapt resource value: 0x7f020097 - public const int ic_collapse_00002 = 2130837655; + public const int ic_collapse_00000 = 2130837655; // aapt resource value: 0x7f020098 - public const int ic_collapse_00003 = 2130837656; + public const int ic_collapse_00001 = 2130837656; // aapt resource value: 0x7f020099 - public const int ic_collapse_00004 = 2130837657; + public const int ic_collapse_00002 = 2130837657; // aapt resource value: 0x7f02009a - public const int ic_collapse_00005 = 2130837658; + public const int ic_collapse_00003 = 2130837658; // aapt resource value: 0x7f02009b - public const int ic_collapse_00006 = 2130837659; + public const int ic_collapse_00004 = 2130837659; // aapt resource value: 0x7f02009c - public const int ic_collapse_00007 = 2130837660; + public const int ic_collapse_00005 = 2130837660; // aapt resource value: 0x7f02009d - public const int ic_collapse_00008 = 2130837661; + public const int ic_collapse_00006 = 2130837661; // aapt resource value: 0x7f02009e - public const int ic_collapse_00009 = 2130837662; + public const int ic_collapse_00007 = 2130837662; // aapt resource value: 0x7f02009f - public const int ic_collapse_00010 = 2130837663; + public const int ic_collapse_00008 = 2130837663; // aapt resource value: 0x7f0200a0 - public const int ic_collapse_00011 = 2130837664; + public const int ic_collapse_00009 = 2130837664; // aapt resource value: 0x7f0200a1 - public const int ic_collapse_00012 = 2130837665; + public const int ic_collapse_00010 = 2130837665; // aapt resource value: 0x7f0200a2 - public const int ic_collapse_00013 = 2130837666; + public const int ic_collapse_00011 = 2130837666; // aapt resource value: 0x7f0200a3 - public const int ic_collapse_00014 = 2130837667; + public const int ic_collapse_00012 = 2130837667; // aapt resource value: 0x7f0200a4 - public const int ic_collapse_00015 = 2130837668; + public const int ic_collapse_00013 = 2130837668; // aapt resource value: 0x7f0200a5 - public const int ic_errorstatus = 2130837669; + public const int ic_collapse_00014 = 2130837669; // aapt resource value: 0x7f0200a6 - public const int ic_expand = 2130837670; + public const int ic_collapse_00015 = 2130837670; // aapt resource value: 0x7f0200a7 - public const int ic_expand_00000 = 2130837671; + public const int ic_errorstatus = 2130837671; // aapt resource value: 0x7f0200a8 - public const int ic_expand_00001 = 2130837672; + public const int ic_expand = 2130837672; // aapt resource value: 0x7f0200a9 - public const int ic_expand_00002 = 2130837673; + public const int ic_expand_00000 = 2130837673; // aapt resource value: 0x7f0200aa - public const int ic_expand_00003 = 2130837674; + public const int ic_expand_00001 = 2130837674; // aapt resource value: 0x7f0200ab - public const int ic_expand_00004 = 2130837675; + public const int ic_expand_00002 = 2130837675; // aapt resource value: 0x7f0200ac - public const int ic_expand_00005 = 2130837676; + public const int ic_expand_00003 = 2130837676; // aapt resource value: 0x7f0200ad - public const int ic_expand_00006 = 2130837677; + public const int ic_expand_00004 = 2130837677; // aapt resource value: 0x7f0200ae - public const int ic_expand_00007 = 2130837678; + public const int ic_expand_00005 = 2130837678; // aapt resource value: 0x7f0200af - public const int ic_expand_00008 = 2130837679; + public const int ic_expand_00006 = 2130837679; // aapt resource value: 0x7f0200b0 - public const int ic_expand_00009 = 2130837680; + public const int ic_expand_00007 = 2130837680; // aapt resource value: 0x7f0200b1 - public const int ic_expand_00010 = 2130837681; + public const int ic_expand_00008 = 2130837681; // aapt resource value: 0x7f0200b2 - public const int ic_expand_00011 = 2130837682; + public const int ic_expand_00009 = 2130837682; // aapt resource value: 0x7f0200b3 - public const int ic_expand_00012 = 2130837683; + public const int ic_expand_00010 = 2130837683; // aapt resource value: 0x7f0200b4 - public const int ic_expand_00013 = 2130837684; + public const int ic_expand_00011 = 2130837684; // aapt resource value: 0x7f0200b5 - public const int ic_expand_00014 = 2130837685; + public const int ic_expand_00012 = 2130837685; // aapt resource value: 0x7f0200b6 - public const int ic_expand_00015 = 2130837686; + public const int ic_expand_00013 = 2130837686; // aapt resource value: 0x7f0200b7 - public const int ic_media_pause = 2130837687; + public const int ic_expand_00014 = 2130837687; // aapt resource value: 0x7f0200b8 - public const int ic_media_play = 2130837688; + public const int ic_expand_00015 = 2130837688; // aapt resource value: 0x7f0200b9 - public const int ic_media_route_disabled_mono_dark = 2130837689; + public const int ic_media_pause = 2130837689; // aapt resource value: 0x7f0200ba - public const int ic_media_route_off_mono_dark = 2130837690; + public const int ic_media_play = 2130837690; // aapt resource value: 0x7f0200bb - public const int ic_media_route_on_0_mono_dark = 2130837691; + public const int ic_media_route_disabled_mono_dark = 2130837691; // aapt resource value: 0x7f0200bc - public const int ic_media_route_on_1_mono_dark = 2130837692; + public const int ic_media_route_off_mono_dark = 2130837692; // aapt resource value: 0x7f0200bd - public const int ic_media_route_on_2_mono_dark = 2130837693; + public const int ic_media_route_on_0_mono_dark = 2130837693; // aapt resource value: 0x7f0200be - public const int ic_media_route_on_mono_dark = 2130837694; + public const int ic_media_route_on_1_mono_dark = 2130837694; // aapt resource value: 0x7f0200bf - public const int ic_pause_dark = 2130837695; + public const int ic_media_route_on_2_mono_dark = 2130837695; // aapt resource value: 0x7f0200c0 - public const int ic_pause_light = 2130837696; + public const int ic_media_route_on_mono_dark = 2130837696; // aapt resource value: 0x7f0200c1 - public const int ic_play_dark = 2130837697; + public const int ic_pause_dark = 2130837697; // aapt resource value: 0x7f0200c2 - public const int ic_play_light = 2130837698; + public const int ic_pause_light = 2130837698; // aapt resource value: 0x7f0200c3 - public const int ic_speaker_dark = 2130837699; + public const int ic_play_dark = 2130837699; // aapt resource value: 0x7f0200c4 - public const int ic_speaker_group_dark = 2130837700; + public const int ic_play_light = 2130837700; // aapt resource value: 0x7f0200c5 - public const int ic_speaker_group_light = 2130837701; + public const int ic_speaker_dark = 2130837701; // aapt resource value: 0x7f0200c6 - public const int ic_speaker_light = 2130837702; + public const int ic_speaker_group_dark = 2130837702; // aapt resource value: 0x7f0200c7 - public const int ic_successstatus = 2130837703; + public const int ic_speaker_group_light = 2130837703; // aapt resource value: 0x7f0200c8 - public const int ic_tv_dark = 2130837704; + public const int ic_speaker_light = 2130837704; // aapt resource value: 0x7f0200c9 - public const int ic_tv_light = 2130837705; + public const int ic_successstatus = 2130837705; // aapt resource value: 0x7f0200ca - public const int icon = 2130837706; + public const int ic_tv_dark = 2130837706; // aapt resource value: 0x7f0200cb - public const int ion_chevron_right = 2130837707; + public const int ic_tv_light = 2130837707; // aapt resource value: 0x7f0200cc - public const int lightbulb = 2130837708; + public const int icon = 2130837708; // aapt resource value: 0x7f0200cd - public const int list_selector = 2130837709; + public const int ion_chevron_right = 2130837709; // aapt resource value: 0x7f0200ce - public const int @lock = 2130837710; + public const int lightbulb = 2130837710; // aapt resource value: 0x7f0200cf - public const int logo = 2130837711; + public const int list_selector = 2130837711; // aapt resource value: 0x7f0200d0 - public const int more = 2130837712; + public const int @lock = 2130837712; // aapt resource value: 0x7f0200d1 - public const int mr_dialog_material_background_dark = 2130837713; + public const int logo = 2130837713; // aapt resource value: 0x7f0200d2 - public const int mr_dialog_material_background_light = 2130837714; + public const int more = 2130837714; // aapt resource value: 0x7f0200d3 - public const int mr_ic_audiotrack_light = 2130837715; + public const int mr_dialog_material_background_dark = 2130837715; // aapt resource value: 0x7f0200d4 - public const int mr_ic_cast_dark = 2130837716; + public const int mr_dialog_material_background_light = 2130837716; // aapt resource value: 0x7f0200d5 - public const int mr_ic_cast_light = 2130837717; + public const int mr_ic_audiotrack_light = 2130837717; // aapt resource value: 0x7f0200d6 - public const int mr_ic_close_dark = 2130837718; + public const int mr_ic_cast_dark = 2130837718; // aapt resource value: 0x7f0200d7 - public const int mr_ic_close_light = 2130837719; + public const int mr_ic_cast_light = 2130837719; // aapt resource value: 0x7f0200d8 - public const int mr_ic_media_route_connecting_mono_dark = 2130837720; + public const int mr_ic_close_dark = 2130837720; // aapt resource value: 0x7f0200d9 - public const int mr_ic_media_route_connecting_mono_light = 2130837721; + public const int mr_ic_close_light = 2130837721; // aapt resource value: 0x7f0200da - public const int mr_ic_media_route_mono_dark = 2130837722; + public const int mr_ic_media_route_connecting_mono_dark = 2130837722; // aapt resource value: 0x7f0200db - public const int mr_ic_media_route_mono_light = 2130837723; + public const int mr_ic_media_route_connecting_mono_light = 2130837723; // aapt resource value: 0x7f0200dc - public const int mr_ic_pause_dark = 2130837724; + public const int mr_ic_media_route_mono_dark = 2130837724; // aapt resource value: 0x7f0200dd - public const int mr_ic_pause_light = 2130837725; + public const int mr_ic_media_route_mono_light = 2130837725; // aapt resource value: 0x7f0200de - public const int mr_ic_play_dark = 2130837726; + public const int mr_ic_pause_dark = 2130837726; // aapt resource value: 0x7f0200df - public const int mr_ic_play_light = 2130837727; + public const int mr_ic_pause_light = 2130837727; // aapt resource value: 0x7f0200e0 - public const int notification_sm = 2130837728; - - // aapt resource value: 0x7f0200ec - public const int notification_template_icon_bg = 2130837740; + public const int mr_ic_play_dark = 2130837728; // aapt resource value: 0x7f0200e1 - public const int plus = 2130837729; + public const int mr_ic_play_light = 2130837729; // aapt resource value: 0x7f0200e2 - public const int refresh = 2130837730; + public const int notification_sm = 2130837730; + + // aapt resource value: 0x7f0200ee + public const int notification_template_icon_bg = 2130837742; // aapt resource value: 0x7f0200e3 - public const int roundedbg = 2130837731; + public const int plus = 2130837731; // aapt resource value: 0x7f0200e4 - public const int roundedbgdark = 2130837732; + public const int refresh = 2130837732; // aapt resource value: 0x7f0200e5 - public const int splash_screen = 2130837733; + public const int roundedbg = 2130837733; // aapt resource value: 0x7f0200e6 - public const int star = 2130837734; + public const int roundedbgdark = 2130837734; // aapt resource value: 0x7f0200e7 - public const int star_selected = 2130837735; + public const int splash_screen = 2130837735; // aapt resource value: 0x7f0200e8 - public const int tools = 2130837736; + public const int star = 2130837736; // aapt resource value: 0x7f0200e9 - public const int tools_selected = 2130837737; + public const int star_selected = 2130837737; // aapt resource value: 0x7f0200ea - public const int upload = 2130837738; + public const int tools = 2130837738; // aapt resource value: 0x7f0200eb - public const int user = 2130837739; + public const int tools_selected = 2130837739; + + // aapt resource value: 0x7f0200ec + public const int upload = 2130837740; + + // aapt resource value: 0x7f0200ed + public const int user = 2130837741; static Drawable() { diff --git a/src/Android/Resources/drawable/accessibility_step1.png b/src/Android/Resources/drawable/accessibility_step1.png new file mode 100644 index 0000000000000000000000000000000000000000..754b735d4013f924c39d8c79253a3edcb844bce8 GIT binary patch literal 11319 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 M#T9 literal 0 HcmV?d00001 diff --git a/src/Android/Resources/drawable/accessibility_step2.png b/src/Android/Resources/drawable/accessibility_step2.png new file mode 100644 index 0000000000000000000000000000000000000000..e8488672b6262e8f2a363e762eb2d5a963952e07 GIT binary patch literal 7516 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 m;t>!K;t>!KJR1DJ00RJ9dGE&x0JKv80000 AndroidApp.Context.ApplicationContext.PackageManager .GetPackageInfo(AndroidApp.Context.PackageName, 0).VersionCode.ToString(); + + public bool AutofillServiceEnabled => AutofillService.Enabled; } } diff --git a/src/App/Abstractions/Services/IAppInfoService.cs b/src/App/Abstractions/Services/IAppInfoService.cs index a83c999eb..11756ee50 100644 --- a/src/App/Abstractions/Services/IAppInfoService.cs +++ b/src/App/Abstractions/Services/IAppInfoService.cs @@ -4,5 +4,6 @@ { string Build { get; } string Version { get; } + bool AutofillServiceEnabled { get; } } } diff --git a/src/App/Pages/Tools/ToolsAutofillServicePage.cs b/src/App/Pages/Tools/ToolsAutofillServicePage.cs index c24854e63..dea9cd7f7 100644 --- a/src/App/Pages/Tools/ToolsAutofillServicePage.cs +++ b/src/App/Pages/Tools/ToolsAutofillServicePage.cs @@ -10,62 +10,177 @@ namespace Bit.App.Pages public class ToolsAutofillServicePage : ExtendedContentPage { private readonly IGoogleAnalyticsService _googleAnalyticsService; + private readonly IAppInfoService _appInfoService; public ToolsAutofillServicePage() { _googleAnalyticsService = Resolver.Resolve(); + _appInfoService = Resolver.Resolve(); Init(); } + public StackLayout EnabledStackLayout { get; set; } + public StackLayout DisabledStackLayout { get; set; } + public ScrollView ScrollView { get; set; } + public void Init() { - var serviceLabel = new Label + var enabledFs = new FormattedString(); + var statusSpan = new Span { Text = string.Concat(AppResources.Status, " ") }; + enabledFs.Spans.Add(statusSpan); + enabledFs.Spans.Add(new Span + { + Text = AppResources.Enabled, + ForegroundColor = Color.Green, + FontAttributes = FontAttributes.Bold, + FontSize = Device.GetNamedSize(NamedSize.Medium, typeof(Label)) + }); + + var statusEnabledLabel = new Label + { + FormattedText = enabledFs, + HorizontalTextAlignment = TextAlignment.Center, + LineBreakMode = LineBreakMode.WordWrap, + FontSize = Device.GetNamedSize(NamedSize.Medium, typeof(Label)), + TextColor = Color.Black + }; + + var disabledFs = new FormattedString(); + disabledFs.Spans.Add(statusSpan); + disabledFs.Spans.Add(new Span + { + Text = AppResources.Disabled, + ForegroundColor = Color.Red, + FontAttributes = FontAttributes.Bold, + FontSize = Device.GetNamedSize(NamedSize.Medium, typeof(Label)) + }); + + var statusDisabledLabel = new Label + { + FormattedText = disabledFs, + HorizontalTextAlignment = TextAlignment.Center, + LineBreakMode = LineBreakMode.WordWrap, + FontSize = Device.GetNamedSize(NamedSize.Medium, typeof(Label)), + TextColor = Color.Black + }; + + var step1Label = new Label + { + Text = AppResources.BitwardenAutofillServiceStep1, + HorizontalTextAlignment = TextAlignment.Center, + LineBreakMode = LineBreakMode.WordWrap, + FontSize = Device.GetNamedSize(NamedSize.Medium, typeof(Label)), + TextColor = Color.Black + }; + + var step1Image = new Image + { + Source = "accessibility_step1", + HorizontalOptions = LayoutOptions.Center, + Margin = new Thickness(0, 20, 0, 0) + }; + + var step2Label = new Label + { + Text = AppResources.BitwardenAutofillServiceStep2, + HorizontalTextAlignment = TextAlignment.Center, + LineBreakMode = LineBreakMode.WordWrap, + FontSize = Device.GetNamedSize(NamedSize.Medium, typeof(Label)), + TextColor = Color.Black + }; + + var step2Image = new Image + { + Source = "accessibility_step2", + HorizontalOptions = LayoutOptions.Center, + Margin = new Thickness(0, 20, 0, 0) + }; + + var stepsStackLayout = new StackLayout + { + Children = { statusDisabledLabel, step1Image, step1Label, step2Image, step2Label }, + Orientation = StackOrientation.Vertical, + Spacing = 10, + VerticalOptions = LayoutOptions.CenterAndExpand, + HorizontalOptions = LayoutOptions.Center + }; + + var notificationsLabel = new Label + { + Text = AppResources.BitwardenAutofillServiceNotification, + HorizontalTextAlignment = TextAlignment.Center, + LineBreakMode = LineBreakMode.WordWrap, + FontSize = Device.GetNamedSize(NamedSize.Medium, typeof(Label)), + TextColor = Color.Black + }; + + var notificationsStackLayout = new StackLayout + { + Children = { statusEnabledLabel, notificationsLabel }, + Orientation = StackOrientation.Vertical, + Spacing = 10, + VerticalOptions = LayoutOptions.CenterAndExpand, + HorizontalOptions = LayoutOptions.Center + }; + + DisabledStackLayout = new StackLayout + { + Children = { BuildServiceLabel(), stepsStackLayout, BuildGoButton() }, + Orientation = StackOrientation.Vertical, + Spacing = 20, + Padding = new Thickness(20, 30), + VerticalOptions = LayoutOptions.FillAndExpand + }; + + EnabledStackLayout = new StackLayout + { + Children = { BuildServiceLabel(), notificationsStackLayout, BuildGoButton() }, + Orientation = StackOrientation.Vertical, + Spacing = 20, + Padding = new Thickness(20, 30), + VerticalOptions = LayoutOptions.FillAndExpand + }; + + ScrollView = new ScrollView { Content = DisabledStackLayout }; + + Title = AppResources.AutofillService; + Content = ScrollView; + } + + protected override void OnAppearing() + { + base.OnAppearing(); + ScrollView.Content = _appInfoService.AutofillServiceEnabled ? EnabledStackLayout : DisabledStackLayout; + } + + private Label BuildServiceLabel() + { + return new Label { Text = AppResources.AutofillDescription, VerticalOptions = LayoutOptions.Start, - HorizontalOptions = LayoutOptions.Center, HorizontalTextAlignment = TextAlignment.Center, LineBreakMode = LineBreakMode.WordWrap, FontSize = Device.GetNamedSize(NamedSize.Medium, typeof(Label)) }; + } - var comingSoonLabel = new Label + private ExtendedButton BuildGoButton() + { + return new ExtendedButton { - Text = AppResources.ComingSoon, - VerticalOptions = LayoutOptions.CenterAndExpand, - HorizontalOptions = LayoutOptions.Center, - HorizontalTextAlignment = TextAlignment.Center, - LineBreakMode = LineBreakMode.WordWrap, - FontSize = Device.GetNamedSize(NamedSize.Large, typeof(Label)), - TextColor = Color.Black - }; - - var progressButton = new ExtendedButton - { - Text = AppResources.SeeDevProgress, + Text = AppResources.BitwardenAutofillServiceOpenSettings, Command = new Command(() => { - _googleAnalyticsService.TrackAppEvent("SeeAutofillProgress"); - Device.OpenUri(new Uri("https://github.com/bitwarden/mobile/issues/1")); + _googleAnalyticsService.TrackAppEvent("OpenAccessibilitySettings"); + MessagingCenter.Send(Application.Current, "Accessibility"); }), VerticalOptions = LayoutOptions.End, HorizontalOptions = LayoutOptions.Fill, Style = (Style)Application.Current.Resources["btn-primary"], FontSize = Device.GetNamedSize(NamedSize.Medium, typeof(Button)) }; - - var stackLayout = new StackLayout - { - Children = { serviceLabel, comingSoonLabel, progressButton }, - Orientation = StackOrientation.Vertical, - Spacing = 10, - Padding = new Thickness(20, 30), - VerticalOptions = LayoutOptions.FillAndExpand - }; - - Title = AppResources.AutofillService; - Content = new ScrollView { Content = stackLayout }; } } } diff --git a/src/App/Resources/AppResources.Designer.cs b/src/App/Resources/AppResources.Designer.cs index 077ee54f3..2e0919cbd 100644 --- a/src/App/Resources/AppResources.Designer.cs +++ b/src/App/Resources/AppResources.Designer.cs @@ -232,6 +232,51 @@ namespace Bit.App.Resources { } } + /// + /// Looks up a localized string similar to When you see a bitwarden auto-fill notification, you can touch it to launch the auto-fill service.. + /// + public static string BitwardenAutofillServiceNotification { + get { + return ResourceManager.GetString("BitwardenAutofillServiceNotification", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Tap this notification to auto-fill a login from your vault.. + /// + public static string BitwardenAutofillServiceNotificationContent { + get { + return ResourceManager.GetString("BitwardenAutofillServiceNotificationContent", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Open Accessibility Settings. + /// + public static string BitwardenAutofillServiceOpenSettings { + get { + return ResourceManager.GetString("BitwardenAutofillServiceOpenSettings", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 1. On the Android Accessibility Settings screen, touch "bitwarden" under the Services heading.. + /// + public static string BitwardenAutofillServiceStep1 { + get { + return ResourceManager.GetString("BitwardenAutofillServiceStep1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 2. Switch on the toggle and press OK to accept.. + /// + public static string BitwardenAutofillServiceStep2 { + get { + return ResourceManager.GetString("BitwardenAutofillServiceStep2", resourceCulture); + } + } + /// /// Looks up a localized string similar to Cancel. /// @@ -412,6 +457,15 @@ namespace Bit.App.Resources { } } + /// + /// Looks up a localized string similar to Disabled. + /// + public static string Disabled { + get { + return ResourceManager.GetString("Disabled", resourceCulture); + } + } + /// /// Looks up a localized string similar to Do you really want to delete? This cannot be undone.. /// @@ -493,6 +547,15 @@ namespace Bit.App.Resources { } } + /// + /// Looks up a localized string similar to Enabled. + /// + public static string Enabled { + get { + return ResourceManager.GetString("Enabled", resourceCulture); + } + } + /// /// Looks up a localized string similar to Enter your account email address to receive your master password hint.. /// @@ -1519,6 +1582,15 @@ namespace Bit.App.Resources { } } + /// + /// Looks up a localized string similar to Status. + /// + public static string Status { + get { + return ResourceManager.GetString("Status", resourceCulture); + } + } + /// /// Looks up a localized string similar to Submit. /// diff --git a/src/App/Resources/AppResources.resx b/src/App/Resources/AppResources.resx index 88fe9e26c..9dd7206cd 100644 --- a/src/App/Resources/AppResources.resx +++ b/src/App/Resources/AppResources.resx @@ -765,4 +765,28 @@ There are no logins in your vault for {0}. This is used for the autofill service. ex. "There are no logins in your vault for twitter.com". + + When you see a bitwarden auto-fill notification, you can touch it to launch the auto-fill service. + + + Tap this notification to auto-fill a login from your vault. + + + Open Accessibility Settings + + + 1. On the Android Accessibility Settings screen, touch "bitwarden" under the Services heading. + + + 2. Switch on the toggle and press OK to accept. + + + Disabled + + + Enabled + + + Status + \ No newline at end of file diff --git a/src/iOS/Services/AppInfoService.cs b/src/iOS/Services/AppInfoService.cs index 2742878fb..d382a4a26 100644 --- a/src/iOS/Services/AppInfoService.cs +++ b/src/iOS/Services/AppInfoService.cs @@ -8,5 +8,6 @@ namespace Bit.iOS.Services { public string Build => NSBundle.MainBundle.InfoDictionary["CFBundleVersion"].ToString(); public string Version => NSBundle.MainBundle.InfoDictionary["CFBundleShortVersionString"].ToString(); + public bool AutofillServiceEnabled => false; } }