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 000000000..754b735d4 Binary files /dev/null and b/src/Android/Resources/drawable/accessibility_step1.png differ diff --git a/src/Android/Resources/drawable/accessibility_step2.png b/src/Android/Resources/drawable/accessibility_step2.png new file mode 100644 index 000000000..e8488672b Binary files /dev/null and b/src/Android/Resources/drawable/accessibility_step2.png differ diff --git a/src/Android/Services/AppInfoService.cs b/src/Android/Services/AppInfoService.cs index c6737da5c..85a87eb17 100644 --- a/src/Android/Services/AppInfoService.cs +++ b/src/Android/Services/AppInfoService.cs @@ -10,5 +10,7 @@ namespace Bit.Android.Services public string Build => 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; } }