From 3f11fdaa828b0efb7001fb2ebb532db8ba8b70c5 Mon Sep 17 00:00:00 2001 From: Kyle Spearrin Date: Tue, 28 May 2019 12:01:55 -0400 Subject: [PATCH] push notification services --- src/Android/8bit.keystore.enc | Bin 0 -> 2288 bytes src/Android/Android.csproj | 11 + src/Android/MainApplication.cs | 14 + src/Android/Push/FirebaseInstanceIdService.cs | 25 + src/Android/Push/FirebaseMessagingService.cs | 42 + src/Android/Resources/Resource.designer.cs | 2538 +++++++++-------- .../AndroidPushNotificationService.cs | 50 + src/Android/ci-build-apks.ps1 | 87 + src/Android/google-services.json | 42 + src/Android/google-services.json.enc | Bin 0 -> 1520 bytes .../IPushNotificationListenerService.cs | 14 + .../Abstractions/IPushNotificationService.cs | 11 + .../Vault/GroupingsPage/GroupingsPage.xaml.cs | 32 +- .../NoopPushNotificationListenerService.cs | 32 + .../Services/NoopPushNotificationService.cs | 23 + .../PushNotificationListenerService.cs | 187 ++ src/Core/Abstractions/IApiService.cs | 1 + src/Core/Constants.cs | 4 + src/Core/Models/Request/DeviceTokenRequest.cs | 7 + .../Models/Response/NotificationResponse.cs | 4 +- src/Core/Services/ApiService.cs | 10 + .../Services/iOSPushNotificationHandler.cs | 66 + .../Services/iOSPushNotificationService.cs | 36 + src/iOS/iOS.csproj | 2 + 24 files changed, 1982 insertions(+), 1256 deletions(-) create mode 100644 src/Android/8bit.keystore.enc create mode 100644 src/Android/Push/FirebaseInstanceIdService.cs create mode 100644 src/Android/Push/FirebaseMessagingService.cs create mode 100644 src/Android/Services/AndroidPushNotificationService.cs create mode 100644 src/Android/ci-build-apks.ps1 create mode 100644 src/Android/google-services.json create mode 100644 src/Android/google-services.json.enc create mode 100644 src/App/Abstractions/IPushNotificationListenerService.cs create mode 100644 src/App/Abstractions/IPushNotificationService.cs create mode 100644 src/App/Services/NoopPushNotificationListenerService.cs create mode 100644 src/App/Services/NoopPushNotificationService.cs create mode 100644 src/App/Services/PushNotificationListenerService.cs create mode 100644 src/Core/Models/Request/DeviceTokenRequest.cs create mode 100644 src/iOS/Services/iOSPushNotificationHandler.cs create mode 100644 src/iOS/Services/iOSPushNotificationService.cs diff --git a/src/Android/8bit.keystore.enc b/src/Android/8bit.keystore.enc new file mode 100644 index 0000000000000000000000000000000000000000..0318720af208e0a45a7b28cf1f4098610f2c39e2 GIT binary patch literal 2288 zcmVYOBj?yZ+??f(}1gXXX#46)` zNW(ur80=YUQ)Xs~=!ik%#z4B6aa~jdpGc~Wt8V~YUTV-SPP5&~hl2*`7zhgTME|y9 zh|9NEEN6?*Frsf1VQ(;g70$tnV}xa#-C3nqExEIFq;$2f)s-T9e;7EB1y#wco#Z@I zWffAAS`K1)kIK$+=k+w~84ie^u3EgR#a}hX)e)B&_#sT)ivu{T}qiqG@P&kk~8ALf_&A<|ml3Vg+bDl$?$!AL|yh9yz2}v=V?fHg}QemTE>ii_&VrRjyrl1f=xcHF?|%og)S`Ai>kyeQSGudzr#rwse3G!u&FH64^_R61J;+YcPf zqL(qDF_T#E<*)j2Exs9*HN(R!zlPuijEOE<+%#Q@Wg91F4F{$`)@z}F4fhko+XIY= z>uI0U%mL;U)K1WY#lMk{w?mH|6;k@!w`8-XJ|SW&RGzu|DXHaX#Ji0f_9_23j;!mV zbh38Tji&Ly0Or$@)G?>TQ*y+(L7sCoJYF#|x-)+wG=~_Bc0Duf=k(Hvut$LQSSdTeiqCHtk{;D@TSAp zu1h4N&1PbfvCInAT#;fB^Q{MTrf1is=U3+0`IR9KO-Hd=MPFbl*c>&2M5s$+;IwH! zJ*@FO#X*?*x71%KL~{s>nl5jkCPyvtBIt%pX)qG1;%)B^rAHU&(C`;FSC}iQm3}NM zz=HmP5P>{!p%iZYR%M`Nm^VTct{cV$k^*0O7$gVi7=nFgz&ScUZF)AOLT)(XdZ|FZ z5*%_s?n1cn$Z_M?Y*TVA#LyWPxNp5{#uJ10X-5sHZNMygsKADjvQ#~sG$H)3I(erR z!pNys(WvSOdU3{ELqZlNHt6WS6R!-sAa=W6VH@ygt%4lHoZX67kIK(E*XQ^{My?8K zS`-lHqaM8w@)c+yw743#dzNMw?At|ZPSBZ23Cc|xSv4qg^GwpWNZ{5FFp5Uls-})F zr!!9ef@q6C;ick6#+g8uPNc|qtKFn@b}E0XKMEcWld7N2Ac61P06L{Eua<>=-U4-18WrF{ABk4{=FnUk#ivq*?%&a2bg@VpRO` zh4;mEa_{{cGvd?0>%_#r6*!m-PTX>ycjANul3o8-r+cspPPf>RlT zj>K?h`F);*6Fe2MS6=tCQE7fu{f6X?zyzA?vDx-*8k{ugz^qlJWUk}!fSi_Pwwx@QskSEwGISjNsCp33E`Y=R|tr0~qqHt!F;jAdP_el00 z`|%?ax9F#h6&`gStF=QmiuRVd$|AMmKGWKmuUY1!Ui$iUmFX@5$TxhU^F0--+MQ}@ zmx<(1vB&>&Pw-4Kp1M3QU;)9-CMGrxT2!~xH`}COO1ZvpM+~=h9m(!S!H3x*tAm&F zqGsyE$HPm*qgEbm=R14?O{ZLLBj<_BAY`+ z%vz0{e*`FZ$o^%{TW(5!*%^SQ@;7YqC-O`Q+s+f}pGX&5VD->Z-$2EJR@3V!mJu!D=OEpBKCuN zd=POv2S%Pp1Nlf$GePN0%GZ*Wrir$wZRo8No2YL2Fe4qIhNjHxRNiy(rO9lI{_Zr2 zOlA(y1J9AO1`j*v2OFl8l{JcRo|^YBzti5PH|vMNTRHLlX!UgSc~EZa4a`z|pGR&3 zUp>!0--D;mB!a-g<|?qY$9)P}R+86V-F<)3)jZI^VOJ)?DhH8?c2y&{doJXAV};tP z5X)&ECD0Ws`H$>7-e&-VkgRDLqPJYmZ)^0^srGm+I?YnOe!@^IH!60PzprfDb64D^ zFfFqOk?T>s1%@Gxu+Ne34IWaL7O2B9+he||kVOAxgG%$z0ewj!{b#6)w81(ob!OXd4@3#vw=MD28C5Mc%F?(YK(mbc0OTELlmoRHNHv-H%nSOl`~`8F)~UKt zGBP>TYX?UAir*Z}&$~hG>d?@3kY1l4QXyf;*-ba|o6P$dcAf@bj(pfm;GnXUlGOqs z+DEr(ytK$d?$JBIO@~(=U=vcY8XS_}8+$w%B%`?-Wh8+>&fZEaz{E=OF*audN`fav KIlQ^-3ger=1#qnZ literal 0 HcmV?d00001 diff --git a/src/Android/Android.csproj b/src/Android/Android.csproj index c5a1d6637..72d6f8793 100644 --- a/src/Android/Android.csproj +++ b/src/Android/Android.csproj @@ -30,6 +30,7 @@ prompt 4 None + true true @@ -59,6 +60,9 @@ 1.1.0 + + 60.1142.1 + @@ -80,6 +84,8 @@ + + @@ -89,6 +95,7 @@ + @@ -111,6 +118,10 @@ + + + + diff --git a/src/Android/MainApplication.cs b/src/Android/MainApplication.cs index ab0f5bd10..83b62208a 100644 --- a/src/Android/MainApplication.cs +++ b/src/Android/MainApplication.cs @@ -76,6 +76,20 @@ namespace Bit.Droid ServiceContainer.Register("secureStorageService", secureStorageService); ServiceContainer.Register("deviceActionService", deviceActionService); ServiceContainer.Register("platformUtilsService", platformUtilsService); + + // Push +#if FDROID + container.RegisterSingleton(); + container.RegisterSingleton(); +#else + var notificationListenerService = new PushNotificationListenerService(); + ServiceContainer.Register( + "pushNotificationListenerService", notificationListenerService); + var androidPushNotificationService = new AndroidPushNotificationService( + mobileStorageService, notificationListenerService); + ServiceContainer.Register( + "pushNotificationService", androidPushNotificationService); +#endif } private void Bootstrap() diff --git a/src/Android/Push/FirebaseInstanceIdService.cs b/src/Android/Push/FirebaseInstanceIdService.cs new file mode 100644 index 000000000..9a4f3d327 --- /dev/null +++ b/src/Android/Push/FirebaseInstanceIdService.cs @@ -0,0 +1,25 @@ +#if !FDROID +using Android.App; +using Android.Content; +using Bit.App.Abstractions; +using Bit.Core; +using Bit.Core.Abstractions; +using Bit.Core.Utilities; +using Firebase.Iid; + +namespace Bit.Droid.Push +{ + [Service] + [IntentFilter(new[] { "com.google.firebase.INSTANCE_ID_EVENT" })] + public class FirebaseInstanceIdService : Firebase.Iid.FirebaseInstanceIdService + { + public override void OnTokenRefresh() + { + var storageService = ServiceContainer.Resolve("storageService"); + var pushNotificationService = ServiceContainer.Resolve("pushNotificationService"); + storageService.SaveAsync(Constants.PushRegisteredTokenKey, FirebaseInstanceId.Instance.Token); + pushNotificationService.RegisterAsync(); + } + } +} +#endif diff --git a/src/Android/Push/FirebaseMessagingService.cs b/src/Android/Push/FirebaseMessagingService.cs new file mode 100644 index 000000000..a9331f2f5 --- /dev/null +++ b/src/Android/Push/FirebaseMessagingService.cs @@ -0,0 +1,42 @@ +#if !FDROID +using Android.App; +using Android.Content; +using Bit.App.Abstractions; +using Bit.Core.Utilities; +using Firebase.Messaging; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using Xamarin.Forms; + +namespace Bit.Droid.Push +{ + [Service] + [IntentFilter(new[] { "com.google.firebase.MESSAGING_EVENT" })] + public class FirebaseMessagingService : Firebase.Messaging.FirebaseMessagingService + { + public override void OnMessageReceived(RemoteMessage message) + { + if(message?.Data == null) + { + return; + } + var data = message.Data.ContainsKey("data") ? message.Data["data"] : null; + if(data == null) + { + return; + } + try + { + var obj = JObject.Parse(data); + var listener = ServiceContainer.Resolve( + "pushNotificationListenerService"); + listener.OnMessageAsync(obj, Device.Android); + } + catch(JsonReaderException ex) + { + System.Diagnostics.Debug.WriteLine(ex.ToString()); + } + } + } +} +#endif diff --git a/src/Android/Resources/Resource.designer.cs b/src/Android/Resources/Resource.designer.cs index 9e6b37d61..88c85d200 100644 --- a/src/Android/Resources/Resource.designer.cs +++ b/src/Android/Resources/Resource.designer.cs @@ -7024,701 +7024,701 @@ namespace Bit.Droid public partial class Dimension { - // aapt resource value: 0x7f0a001a - public const int abc_action_bar_content_inset_material = 2131361818; + // aapt resource value: 0x7f0b001a + public const int abc_action_bar_content_inset_material = 2131427354; - // aapt resource value: 0x7f0a001b - public const int abc_action_bar_content_inset_with_nav = 2131361819; + // aapt resource value: 0x7f0b001b + public const int abc_action_bar_content_inset_with_nav = 2131427355; - // aapt resource value: 0x7f0a0010 - public const int abc_action_bar_default_height_material = 2131361808; + // aapt resource value: 0x7f0b0010 + public const int abc_action_bar_default_height_material = 2131427344; - // aapt resource value: 0x7f0a001c - public const int abc_action_bar_default_padding_end_material = 2131361820; + // aapt resource value: 0x7f0b001c + public const int abc_action_bar_default_padding_end_material = 2131427356; - // aapt resource value: 0x7f0a001d - public const int abc_action_bar_default_padding_start_material = 2131361821; + // aapt resource value: 0x7f0b001d + public const int abc_action_bar_default_padding_start_material = 2131427357; - // aapt resource value: 0x7f0a001f - public const int abc_action_bar_elevation_material = 2131361823; + // aapt resource value: 0x7f0b001f + public const int abc_action_bar_elevation_material = 2131427359; - // aapt resource value: 0x7f0a0020 - public const int abc_action_bar_icon_vertical_padding_material = 2131361824; + // aapt resource value: 0x7f0b0020 + public const int abc_action_bar_icon_vertical_padding_material = 2131427360; - // aapt resource value: 0x7f0a0021 - public const int abc_action_bar_overflow_padding_end_material = 2131361825; + // aapt resource value: 0x7f0b0021 + public const int abc_action_bar_overflow_padding_end_material = 2131427361; - // aapt resource value: 0x7f0a0022 - public const int abc_action_bar_overflow_padding_start_material = 2131361826; + // aapt resource value: 0x7f0b0022 + public const int abc_action_bar_overflow_padding_start_material = 2131427362; - // aapt resource value: 0x7f0a0023 - public const int abc_action_bar_stacked_max_height = 2131361827; + // aapt resource value: 0x7f0b0023 + public const int abc_action_bar_stacked_max_height = 2131427363; - // aapt resource value: 0x7f0a0024 - public const int abc_action_bar_stacked_tab_max_width = 2131361828; + // aapt resource value: 0x7f0b0024 + public const int abc_action_bar_stacked_tab_max_width = 2131427364; - // aapt resource value: 0x7f0a0025 - public const int abc_action_bar_subtitle_bottom_margin_material = 2131361829; + // aapt resource value: 0x7f0b0025 + public const int abc_action_bar_subtitle_bottom_margin_material = 2131427365; - // aapt resource value: 0x7f0a0026 - public const int abc_action_bar_subtitle_top_margin_material = 2131361830; + // aapt resource value: 0x7f0b0026 + public const int abc_action_bar_subtitle_top_margin_material = 2131427366; - // aapt resource value: 0x7f0a0027 - public const int abc_action_button_min_height_material = 2131361831; + // aapt resource value: 0x7f0b0027 + public const int abc_action_button_min_height_material = 2131427367; - // aapt resource value: 0x7f0a0028 - public const int abc_action_button_min_width_material = 2131361832; + // aapt resource value: 0x7f0b0028 + public const int abc_action_button_min_width_material = 2131427368; - // aapt resource value: 0x7f0a0029 - public const int abc_action_button_min_width_overflow_material = 2131361833; + // aapt resource value: 0x7f0b0029 + public const int abc_action_button_min_width_overflow_material = 2131427369; - // aapt resource value: 0x7f0a000f - public const int abc_alert_dialog_button_bar_height = 2131361807; + // aapt resource value: 0x7f0b000f + public const int abc_alert_dialog_button_bar_height = 2131427343; - // aapt resource value: 0x7f0a002a - public const int abc_alert_dialog_button_dimen = 2131361834; + // aapt resource value: 0x7f0b002a + public const int abc_alert_dialog_button_dimen = 2131427370; - // aapt resource value: 0x7f0a002b - public const int abc_button_inset_horizontal_material = 2131361835; + // aapt resource value: 0x7f0b002b + public const int abc_button_inset_horizontal_material = 2131427371; - // aapt resource value: 0x7f0a002c - public const int abc_button_inset_vertical_material = 2131361836; + // aapt resource value: 0x7f0b002c + public const int abc_button_inset_vertical_material = 2131427372; - // aapt resource value: 0x7f0a002d - public const int abc_button_padding_horizontal_material = 2131361837; + // aapt resource value: 0x7f0b002d + public const int abc_button_padding_horizontal_material = 2131427373; - // aapt resource value: 0x7f0a002e - public const int abc_button_padding_vertical_material = 2131361838; + // aapt resource value: 0x7f0b002e + public const int abc_button_padding_vertical_material = 2131427374; - // aapt resource value: 0x7f0a002f - public const int abc_cascading_menus_min_smallest_width = 2131361839; + // aapt resource value: 0x7f0b002f + public const int abc_cascading_menus_min_smallest_width = 2131427375; - // aapt resource value: 0x7f0a0013 - public const int abc_config_prefDialogWidth = 2131361811; + // aapt resource value: 0x7f0b0013 + public const int abc_config_prefDialogWidth = 2131427347; - // aapt resource value: 0x7f0a0030 - public const int abc_control_corner_material = 2131361840; + // aapt resource value: 0x7f0b0030 + public const int abc_control_corner_material = 2131427376; - // aapt resource value: 0x7f0a0031 - public const int abc_control_inset_material = 2131361841; + // aapt resource value: 0x7f0b0031 + public const int abc_control_inset_material = 2131427377; - // aapt resource value: 0x7f0a0032 - public const int abc_control_padding_material = 2131361842; + // aapt resource value: 0x7f0b0032 + public const int abc_control_padding_material = 2131427378; - // aapt resource value: 0x7f0a0033 - public const int abc_dialog_corner_radius_material = 2131361843; + // aapt resource value: 0x7f0b0033 + public const int abc_dialog_corner_radius_material = 2131427379; - // aapt resource value: 0x7f0a0014 - public const int abc_dialog_fixed_height_major = 2131361812; + // aapt resource value: 0x7f0b0014 + public const int abc_dialog_fixed_height_major = 2131427348; - // aapt resource value: 0x7f0a0015 - public const int abc_dialog_fixed_height_minor = 2131361813; + // aapt resource value: 0x7f0b0015 + public const int abc_dialog_fixed_height_minor = 2131427349; - // aapt resource value: 0x7f0a0016 - public const int abc_dialog_fixed_width_major = 2131361814; + // aapt resource value: 0x7f0b0016 + public const int abc_dialog_fixed_width_major = 2131427350; - // aapt resource value: 0x7f0a0017 - public const int abc_dialog_fixed_width_minor = 2131361815; + // aapt resource value: 0x7f0b0017 + public const int abc_dialog_fixed_width_minor = 2131427351; - // aapt resource value: 0x7f0a0034 - public const int abc_dialog_list_padding_bottom_no_buttons = 2131361844; + // aapt resource value: 0x7f0b0034 + public const int abc_dialog_list_padding_bottom_no_buttons = 2131427380; - // aapt resource value: 0x7f0a0035 - public const int abc_dialog_list_padding_top_no_title = 2131361845; + // aapt resource value: 0x7f0b0035 + public const int abc_dialog_list_padding_top_no_title = 2131427381; - // aapt resource value: 0x7f0a0018 - public const int abc_dialog_min_width_major = 2131361816; + // aapt resource value: 0x7f0b0018 + public const int abc_dialog_min_width_major = 2131427352; - // aapt resource value: 0x7f0a0019 - public const int abc_dialog_min_width_minor = 2131361817; + // aapt resource value: 0x7f0b0019 + public const int abc_dialog_min_width_minor = 2131427353; - // aapt resource value: 0x7f0a0036 - public const int abc_dialog_padding_material = 2131361846; + // aapt resource value: 0x7f0b0036 + public const int abc_dialog_padding_material = 2131427382; - // aapt resource value: 0x7f0a0037 - public const int abc_dialog_padding_top_material = 2131361847; + // aapt resource value: 0x7f0b0037 + public const int abc_dialog_padding_top_material = 2131427383; - // aapt resource value: 0x7f0a0038 - public const int abc_dialog_title_divider_material = 2131361848; + // aapt resource value: 0x7f0b0038 + public const int abc_dialog_title_divider_material = 2131427384; - // aapt resource value: 0x7f0a0039 - public const int abc_disabled_alpha_material_dark = 2131361849; + // aapt resource value: 0x7f0b0039 + public const int abc_disabled_alpha_material_dark = 2131427385; - // aapt resource value: 0x7f0a003a - public const int abc_disabled_alpha_material_light = 2131361850; + // aapt resource value: 0x7f0b003a + public const int abc_disabled_alpha_material_light = 2131427386; - // aapt resource value: 0x7f0a003b - public const int abc_dropdownitem_icon_width = 2131361851; + // aapt resource value: 0x7f0b003b + public const int abc_dropdownitem_icon_width = 2131427387; - // aapt resource value: 0x7f0a003c - public const int abc_dropdownitem_text_padding_left = 2131361852; + // aapt resource value: 0x7f0b003c + public const int abc_dropdownitem_text_padding_left = 2131427388; - // aapt resource value: 0x7f0a003d - public const int abc_dropdownitem_text_padding_right = 2131361853; + // aapt resource value: 0x7f0b003d + public const int abc_dropdownitem_text_padding_right = 2131427389; - // aapt resource value: 0x7f0a003e - public const int abc_edit_text_inset_bottom_material = 2131361854; + // aapt resource value: 0x7f0b003e + public const int abc_edit_text_inset_bottom_material = 2131427390; - // aapt resource value: 0x7f0a003f - public const int abc_edit_text_inset_horizontal_material = 2131361855; + // aapt resource value: 0x7f0b003f + public const int abc_edit_text_inset_horizontal_material = 2131427391; - // aapt resource value: 0x7f0a0040 - public const int abc_edit_text_inset_top_material = 2131361856; + // aapt resource value: 0x7f0b0040 + public const int abc_edit_text_inset_top_material = 2131427392; - // aapt resource value: 0x7f0a0041 - public const int abc_floating_window_z = 2131361857; + // aapt resource value: 0x7f0b0041 + public const int abc_floating_window_z = 2131427393; - // aapt resource value: 0x7f0a0042 - public const int abc_list_item_padding_horizontal_material = 2131361858; + // aapt resource value: 0x7f0b0042 + public const int abc_list_item_padding_horizontal_material = 2131427394; - // aapt resource value: 0x7f0a0043 - public const int abc_panel_menu_list_width = 2131361859; + // aapt resource value: 0x7f0b0043 + public const int abc_panel_menu_list_width = 2131427395; - // aapt resource value: 0x7f0a0044 - public const int abc_progress_bar_height_material = 2131361860; + // aapt resource value: 0x7f0b0044 + public const int abc_progress_bar_height_material = 2131427396; - // aapt resource value: 0x7f0a0045 - public const int abc_search_view_preferred_height = 2131361861; + // aapt resource value: 0x7f0b0045 + public const int abc_search_view_preferred_height = 2131427397; - // aapt resource value: 0x7f0a0046 - public const int abc_search_view_preferred_width = 2131361862; + // aapt resource value: 0x7f0b0046 + public const int abc_search_view_preferred_width = 2131427398; - // aapt resource value: 0x7f0a0047 - public const int abc_seekbar_track_background_height_material = 2131361863; + // aapt resource value: 0x7f0b0047 + public const int abc_seekbar_track_background_height_material = 2131427399; - // aapt resource value: 0x7f0a0048 - public const int abc_seekbar_track_progress_height_material = 2131361864; + // aapt resource value: 0x7f0b0048 + public const int abc_seekbar_track_progress_height_material = 2131427400; - // aapt resource value: 0x7f0a0049 - public const int abc_select_dialog_padding_start_material = 2131361865; + // aapt resource value: 0x7f0b0049 + public const int abc_select_dialog_padding_start_material = 2131427401; - // aapt resource value: 0x7f0a001e - public const int abc_switch_padding = 2131361822; + // aapt resource value: 0x7f0b001e + public const int abc_switch_padding = 2131427358; - // aapt resource value: 0x7f0a004a - public const int abc_text_size_body_1_material = 2131361866; + // aapt resource value: 0x7f0b004a + public const int abc_text_size_body_1_material = 2131427402; - // aapt resource value: 0x7f0a004b - public const int abc_text_size_body_2_material = 2131361867; + // aapt resource value: 0x7f0b004b + public const int abc_text_size_body_2_material = 2131427403; - // aapt resource value: 0x7f0a004c - public const int abc_text_size_button_material = 2131361868; + // aapt resource value: 0x7f0b004c + public const int abc_text_size_button_material = 2131427404; - // aapt resource value: 0x7f0a004d - public const int abc_text_size_caption_material = 2131361869; + // aapt resource value: 0x7f0b004d + public const int abc_text_size_caption_material = 2131427405; - // aapt resource value: 0x7f0a004e - public const int abc_text_size_display_1_material = 2131361870; + // aapt resource value: 0x7f0b004e + public const int abc_text_size_display_1_material = 2131427406; - // aapt resource value: 0x7f0a004f - public const int abc_text_size_display_2_material = 2131361871; + // aapt resource value: 0x7f0b004f + public const int abc_text_size_display_2_material = 2131427407; - // aapt resource value: 0x7f0a0050 - public const int abc_text_size_display_3_material = 2131361872; + // aapt resource value: 0x7f0b0050 + public const int abc_text_size_display_3_material = 2131427408; - // aapt resource value: 0x7f0a0051 - public const int abc_text_size_display_4_material = 2131361873; + // aapt resource value: 0x7f0b0051 + public const int abc_text_size_display_4_material = 2131427409; - // aapt resource value: 0x7f0a0052 - public const int abc_text_size_headline_material = 2131361874; + // aapt resource value: 0x7f0b0052 + public const int abc_text_size_headline_material = 2131427410; - // aapt resource value: 0x7f0a0053 - public const int abc_text_size_large_material = 2131361875; + // aapt resource value: 0x7f0b0053 + public const int abc_text_size_large_material = 2131427411; - // aapt resource value: 0x7f0a0054 - public const int abc_text_size_medium_material = 2131361876; + // aapt resource value: 0x7f0b0054 + public const int abc_text_size_medium_material = 2131427412; - // aapt resource value: 0x7f0a0055 - public const int abc_text_size_menu_header_material = 2131361877; + // aapt resource value: 0x7f0b0055 + public const int abc_text_size_menu_header_material = 2131427413; - // aapt resource value: 0x7f0a0056 - public const int abc_text_size_menu_material = 2131361878; + // aapt resource value: 0x7f0b0056 + public const int abc_text_size_menu_material = 2131427414; - // aapt resource value: 0x7f0a0057 - public const int abc_text_size_small_material = 2131361879; + // aapt resource value: 0x7f0b0057 + public const int abc_text_size_small_material = 2131427415; - // aapt resource value: 0x7f0a0058 - public const int abc_text_size_subhead_material = 2131361880; + // aapt resource value: 0x7f0b0058 + public const int abc_text_size_subhead_material = 2131427416; - // aapt resource value: 0x7f0a0011 - public const int abc_text_size_subtitle_material_toolbar = 2131361809; + // aapt resource value: 0x7f0b0011 + public const int abc_text_size_subtitle_material_toolbar = 2131427345; - // aapt resource value: 0x7f0a0059 - public const int abc_text_size_title_material = 2131361881; + // aapt resource value: 0x7f0b0059 + public const int abc_text_size_title_material = 2131427417; - // aapt resource value: 0x7f0a0012 - public const int abc_text_size_title_material_toolbar = 2131361810; + // aapt resource value: 0x7f0b0012 + public const int abc_text_size_title_material_toolbar = 2131427346; - // aapt resource value: 0x7f0a00cb - public const int browser_actions_context_menu_max_width = 2131361995; + // aapt resource value: 0x7f0b00cb + public const int browser_actions_context_menu_max_width = 2131427531; - // aapt resource value: 0x7f0a00cc - public const int browser_actions_context_menu_min_padding = 2131361996; + // aapt resource value: 0x7f0b00cc + public const int browser_actions_context_menu_min_padding = 2131427532; - // aapt resource value: 0x7f0a000c - public const int cardview_compat_inset_shadow = 2131361804; + // aapt resource value: 0x7f0b000c + public const int cardview_compat_inset_shadow = 2131427340; - // aapt resource value: 0x7f0a000d - public const int cardview_default_elevation = 2131361805; + // aapt resource value: 0x7f0b000d + public const int cardview_default_elevation = 2131427341; - // aapt resource value: 0x7f0a000e - public const int cardview_default_radius = 2131361806; + // aapt resource value: 0x7f0b000e + public const int cardview_default_radius = 2131427342; - // aapt resource value: 0x7f0a00d1 - public const int compat_button_inset_horizontal_material = 2131362001; + // aapt resource value: 0x7f0b00d1 + public const int compat_button_inset_horizontal_material = 2131427537; - // aapt resource value: 0x7f0a00d2 - public const int compat_button_inset_vertical_material = 2131362002; + // aapt resource value: 0x7f0b00d2 + public const int compat_button_inset_vertical_material = 2131427538; - // aapt resource value: 0x7f0a00d3 - public const int compat_button_padding_horizontal_material = 2131362003; + // aapt resource value: 0x7f0b00d3 + public const int compat_button_padding_horizontal_material = 2131427539; - // aapt resource value: 0x7f0a00d4 - public const int compat_button_padding_vertical_material = 2131362004; + // aapt resource value: 0x7f0b00d4 + public const int compat_button_padding_vertical_material = 2131427540; - // aapt resource value: 0x7f0a00d5 - public const int compat_control_corner_material = 2131362005; + // aapt resource value: 0x7f0b00d5 + public const int compat_control_corner_material = 2131427541; - // aapt resource value: 0x7f0a00d6 - public const int compat_notification_large_icon_max_height = 2131362006; + // aapt resource value: 0x7f0b00d6 + public const int compat_notification_large_icon_max_height = 2131427542; - // aapt resource value: 0x7f0a00d7 - public const int compat_notification_large_icon_max_width = 2131362007; + // aapt resource value: 0x7f0b00d7 + public const int compat_notification_large_icon_max_width = 2131427543; - // aapt resource value: 0x7f0a0077 - public const int design_appbar_elevation = 2131361911; + // aapt resource value: 0x7f0b0077 + public const int design_appbar_elevation = 2131427447; - // aapt resource value: 0x7f0a0078 - public const int design_bottom_navigation_active_item_max_width = 2131361912; + // aapt resource value: 0x7f0b0078 + public const int design_bottom_navigation_active_item_max_width = 2131427448; - // aapt resource value: 0x7f0a0079 - public const int design_bottom_navigation_active_item_min_width = 2131361913; + // aapt resource value: 0x7f0b0079 + public const int design_bottom_navigation_active_item_min_width = 2131427449; - // aapt resource value: 0x7f0a007a - public const int design_bottom_navigation_active_text_size = 2131361914; + // aapt resource value: 0x7f0b007a + public const int design_bottom_navigation_active_text_size = 2131427450; - // aapt resource value: 0x7f0a007b - public const int design_bottom_navigation_elevation = 2131361915; + // aapt resource value: 0x7f0b007b + public const int design_bottom_navigation_elevation = 2131427451; - // aapt resource value: 0x7f0a007c - public const int design_bottom_navigation_height = 2131361916; + // aapt resource value: 0x7f0b007c + public const int design_bottom_navigation_height = 2131427452; - // aapt resource value: 0x7f0a007d - public const int design_bottom_navigation_icon_size = 2131361917; + // aapt resource value: 0x7f0b007d + public const int design_bottom_navigation_icon_size = 2131427453; - // aapt resource value: 0x7f0a007e - public const int design_bottom_navigation_item_max_width = 2131361918; + // aapt resource value: 0x7f0b007e + public const int design_bottom_navigation_item_max_width = 2131427454; - // aapt resource value: 0x7f0a007f - public const int design_bottom_navigation_item_min_width = 2131361919; + // aapt resource value: 0x7f0b007f + public const int design_bottom_navigation_item_min_width = 2131427455; - // aapt resource value: 0x7f0a0080 - public const int design_bottom_navigation_margin = 2131361920; + // aapt resource value: 0x7f0b0080 + public const int design_bottom_navigation_margin = 2131427456; - // aapt resource value: 0x7f0a0081 - public const int design_bottom_navigation_shadow_height = 2131361921; + // aapt resource value: 0x7f0b0081 + public const int design_bottom_navigation_shadow_height = 2131427457; - // aapt resource value: 0x7f0a0082 - public const int design_bottom_navigation_text_size = 2131361922; + // aapt resource value: 0x7f0b0082 + public const int design_bottom_navigation_text_size = 2131427458; - // aapt resource value: 0x7f0a0083 - public const int design_bottom_sheet_modal_elevation = 2131361923; + // aapt resource value: 0x7f0b0083 + public const int design_bottom_sheet_modal_elevation = 2131427459; - // aapt resource value: 0x7f0a0084 - public const int design_bottom_sheet_peek_height_min = 2131361924; + // aapt resource value: 0x7f0b0084 + public const int design_bottom_sheet_peek_height_min = 2131427460; - // aapt resource value: 0x7f0a0085 - public const int design_fab_border_width = 2131361925; + // aapt resource value: 0x7f0b0085 + public const int design_fab_border_width = 2131427461; - // aapt resource value: 0x7f0a0086 - public const int design_fab_elevation = 2131361926; + // aapt resource value: 0x7f0b0086 + public const int design_fab_elevation = 2131427462; - // aapt resource value: 0x7f0a0087 - public const int design_fab_image_size = 2131361927; + // aapt resource value: 0x7f0b0087 + public const int design_fab_image_size = 2131427463; - // aapt resource value: 0x7f0a0088 - public const int design_fab_size_mini = 2131361928; + // aapt resource value: 0x7f0b0088 + public const int design_fab_size_mini = 2131427464; - // aapt resource value: 0x7f0a0089 - public const int design_fab_size_normal = 2131361929; + // aapt resource value: 0x7f0b0089 + public const int design_fab_size_normal = 2131427465; - // aapt resource value: 0x7f0a008a - public const int design_fab_translation_z_hovered_focused = 2131361930; + // aapt resource value: 0x7f0b008a + public const int design_fab_translation_z_hovered_focused = 2131427466; - // aapt resource value: 0x7f0a008b - public const int design_fab_translation_z_pressed = 2131361931; + // aapt resource value: 0x7f0b008b + public const int design_fab_translation_z_pressed = 2131427467; - // aapt resource value: 0x7f0a008c - public const int design_navigation_elevation = 2131361932; + // aapt resource value: 0x7f0b008c + public const int design_navigation_elevation = 2131427468; - // aapt resource value: 0x7f0a008d - public const int design_navigation_icon_padding = 2131361933; + // aapt resource value: 0x7f0b008d + public const int design_navigation_icon_padding = 2131427469; - // aapt resource value: 0x7f0a008e - public const int design_navigation_icon_size = 2131361934; + // aapt resource value: 0x7f0b008e + public const int design_navigation_icon_size = 2131427470; - // aapt resource value: 0x7f0a008f - public const int design_navigation_item_horizontal_padding = 2131361935; + // aapt resource value: 0x7f0b008f + public const int design_navigation_item_horizontal_padding = 2131427471; - // aapt resource value: 0x7f0a0090 - public const int design_navigation_item_icon_padding = 2131361936; + // aapt resource value: 0x7f0b0090 + public const int design_navigation_item_icon_padding = 2131427472; - // aapt resource value: 0x7f0a006f - public const int design_navigation_max_width = 2131361903; + // aapt resource value: 0x7f0b006f + public const int design_navigation_max_width = 2131427439; - // aapt resource value: 0x7f0a0091 - public const int design_navigation_padding_bottom = 2131361937; + // aapt resource value: 0x7f0b0091 + public const int design_navigation_padding_bottom = 2131427473; - // aapt resource value: 0x7f0a0092 - public const int design_navigation_separator_vertical_padding = 2131361938; + // aapt resource value: 0x7f0b0092 + public const int design_navigation_separator_vertical_padding = 2131427474; - // aapt resource value: 0x7f0a0070 - public const int design_snackbar_action_inline_max_width = 2131361904; + // aapt resource value: 0x7f0b0070 + public const int design_snackbar_action_inline_max_width = 2131427440; - // aapt resource value: 0x7f0a0071 - public const int design_snackbar_background_corner_radius = 2131361905; + // aapt resource value: 0x7f0b0071 + public const int design_snackbar_background_corner_radius = 2131427441; - // aapt resource value: 0x7f0a0093 - public const int design_snackbar_elevation = 2131361939; + // aapt resource value: 0x7f0b0093 + public const int design_snackbar_elevation = 2131427475; - // aapt resource value: 0x7f0a0072 - public const int design_snackbar_extra_spacing_horizontal = 2131361906; + // aapt resource value: 0x7f0b0072 + public const int design_snackbar_extra_spacing_horizontal = 2131427442; - // aapt resource value: 0x7f0a0073 - public const int design_snackbar_max_width = 2131361907; + // aapt resource value: 0x7f0b0073 + public const int design_snackbar_max_width = 2131427443; - // aapt resource value: 0x7f0a0074 - public const int design_snackbar_min_width = 2131361908; + // aapt resource value: 0x7f0b0074 + public const int design_snackbar_min_width = 2131427444; - // aapt resource value: 0x7f0a0094 - public const int design_snackbar_padding_horizontal = 2131361940; + // aapt resource value: 0x7f0b0094 + public const int design_snackbar_padding_horizontal = 2131427476; - // aapt resource value: 0x7f0a0095 - public const int design_snackbar_padding_vertical = 2131361941; + // aapt resource value: 0x7f0b0095 + public const int design_snackbar_padding_vertical = 2131427477; - // aapt resource value: 0x7f0a0075 - public const int design_snackbar_padding_vertical_2lines = 2131361909; + // aapt resource value: 0x7f0b0075 + public const int design_snackbar_padding_vertical_2lines = 2131427445; - // aapt resource value: 0x7f0a0096 - public const int design_snackbar_text_size = 2131361942; + // aapt resource value: 0x7f0b0096 + public const int design_snackbar_text_size = 2131427478; - // aapt resource value: 0x7f0a0097 - public const int design_tab_max_width = 2131361943; + // aapt resource value: 0x7f0b0097 + public const int design_tab_max_width = 2131427479; - // aapt resource value: 0x7f0a0076 - public const int design_tab_scrollable_min_width = 2131361910; + // aapt resource value: 0x7f0b0076 + public const int design_tab_scrollable_min_width = 2131427446; - // aapt resource value: 0x7f0a0098 - public const int design_tab_text_size = 2131361944; + // aapt resource value: 0x7f0b0098 + public const int design_tab_text_size = 2131427480; - // aapt resource value: 0x7f0a0099 - public const int design_tab_text_size_2line = 2131361945; + // aapt resource value: 0x7f0b0099 + public const int design_tab_text_size_2line = 2131427481; - // aapt resource value: 0x7f0a009a - public const int design_textinput_caption_translate_y = 2131361946; + // aapt resource value: 0x7f0b009a + public const int design_textinput_caption_translate_y = 2131427482; - // aapt resource value: 0x7f0a005a - public const int disabled_alpha_material_dark = 2131361882; + // aapt resource value: 0x7f0b005a + public const int disabled_alpha_material_dark = 2131427418; - // aapt resource value: 0x7f0a005b - public const int disabled_alpha_material_light = 2131361883; + // aapt resource value: 0x7f0b005b + public const int disabled_alpha_material_light = 2131427419; - // aapt resource value: 0x7f0a00e7 - public const int fab_elevation_lollipop = 2131362023; + // aapt resource value: 0x7f0b00e7 + public const int fab_elevation_lollipop = 2131427559; - // aapt resource value: 0x7f0a00e6 - public const int fab_scroll_threshold = 2131362022; + // aapt resource value: 0x7f0b00e6 + public const int fab_scroll_threshold = 2131427558; - // aapt resource value: 0x7f0a00e5 - public const int fab_shadow_size = 2131362021; + // aapt resource value: 0x7f0b00e5 + public const int fab_shadow_size = 2131427557; - // aapt resource value: 0x7f0a00e4 - public const int fab_size_mini = 2131362020; + // aapt resource value: 0x7f0b00e4 + public const int fab_size_mini = 2131427556; - // aapt resource value: 0x7f0a00e3 - public const int fab_size_normal = 2131362019; + // aapt resource value: 0x7f0b00e3 + public const int fab_size_normal = 2131427555; - // aapt resource value: 0x7f0a0000 - public const int fastscroll_default_thickness = 2131361792; + // aapt resource value: 0x7f0b0000 + public const int fastscroll_default_thickness = 2131427328; - // aapt resource value: 0x7f0a0001 - public const int fastscroll_margin = 2131361793; + // aapt resource value: 0x7f0b0001 + public const int fastscroll_margin = 2131427329; - // aapt resource value: 0x7f0a0002 - public const int fastscroll_minimum_range = 2131361794; + // aapt resource value: 0x7f0b0002 + public const int fastscroll_minimum_range = 2131427330; - // aapt resource value: 0x7f0a005c - public const int highlight_alpha_material_colored = 2131361884; + // aapt resource value: 0x7f0b005c + public const int highlight_alpha_material_colored = 2131427420; - // aapt resource value: 0x7f0a005d - public const int highlight_alpha_material_dark = 2131361885; + // aapt resource value: 0x7f0b005d + public const int highlight_alpha_material_dark = 2131427421; - // aapt resource value: 0x7f0a005e - public const int highlight_alpha_material_light = 2131361886; + // aapt resource value: 0x7f0b005e + public const int highlight_alpha_material_light = 2131427422; - // aapt resource value: 0x7f0a005f - public const int hint_alpha_material_dark = 2131361887; + // aapt resource value: 0x7f0b005f + public const int hint_alpha_material_dark = 2131427423; - // aapt resource value: 0x7f0a0060 - public const int hint_alpha_material_light = 2131361888; + // aapt resource value: 0x7f0b0060 + public const int hint_alpha_material_light = 2131427424; - // aapt resource value: 0x7f0a0061 - public const int hint_pressed_alpha_material_dark = 2131361889; + // aapt resource value: 0x7f0b0061 + public const int hint_pressed_alpha_material_dark = 2131427425; - // aapt resource value: 0x7f0a0062 - public const int hint_pressed_alpha_material_light = 2131361890; + // aapt resource value: 0x7f0b0062 + public const int hint_pressed_alpha_material_light = 2131427426; - // aapt resource value: 0x7f0a0003 - public const int item_touch_helper_max_drag_scroll_per_frame = 2131361795; + // aapt resource value: 0x7f0b0003 + public const int item_touch_helper_max_drag_scroll_per_frame = 2131427331; - // aapt resource value: 0x7f0a0004 - public const int item_touch_helper_swipe_escape_max_velocity = 2131361796; + // aapt resource value: 0x7f0b0004 + public const int item_touch_helper_swipe_escape_max_velocity = 2131427332; - // aapt resource value: 0x7f0a0005 - public const int item_touch_helper_swipe_escape_velocity = 2131361797; + // aapt resource value: 0x7f0b0005 + public const int item_touch_helper_swipe_escape_velocity = 2131427333; - // aapt resource value: 0x7f0a0006 - public const int mr_controller_volume_group_list_item_height = 2131361798; + // aapt resource value: 0x7f0b0006 + public const int mr_controller_volume_group_list_item_height = 2131427334; - // aapt resource value: 0x7f0a0007 - public const int mr_controller_volume_group_list_item_icon_size = 2131361799; + // aapt resource value: 0x7f0b0007 + public const int mr_controller_volume_group_list_item_icon_size = 2131427335; - // aapt resource value: 0x7f0a0008 - public const int mr_controller_volume_group_list_max_height = 2131361800; + // aapt resource value: 0x7f0b0008 + public const int mr_controller_volume_group_list_max_height = 2131427336; - // aapt resource value: 0x7f0a000b - public const int mr_controller_volume_group_list_padding_top = 2131361803; + // aapt resource value: 0x7f0b000b + public const int mr_controller_volume_group_list_padding_top = 2131427339; - // aapt resource value: 0x7f0a0009 - public const int mr_dialog_fixed_width_major = 2131361801; + // aapt resource value: 0x7f0b0009 + public const int mr_dialog_fixed_width_major = 2131427337; - // aapt resource value: 0x7f0a000a - public const int mr_dialog_fixed_width_minor = 2131361802; + // aapt resource value: 0x7f0b000a + public const int mr_dialog_fixed_width_minor = 2131427338; - // aapt resource value: 0x7f0a009b - public const int mtrl_bottomappbar_fabOffsetEndMode = 2131361947; + // aapt resource value: 0x7f0b009b + public const int mtrl_bottomappbar_fabOffsetEndMode = 2131427483; - // aapt resource value: 0x7f0a009c - public const int mtrl_bottomappbar_fab_cradle_margin = 2131361948; + // aapt resource value: 0x7f0b009c + public const int mtrl_bottomappbar_fab_cradle_margin = 2131427484; - // aapt resource value: 0x7f0a009d - public const int mtrl_bottomappbar_fab_cradle_rounded_corner_radius = 2131361949; + // aapt resource value: 0x7f0b009d + public const int mtrl_bottomappbar_fab_cradle_rounded_corner_radius = 2131427485; - // aapt resource value: 0x7f0a009e - public const int mtrl_bottomappbar_fab_cradle_vertical_offset = 2131361950; + // aapt resource value: 0x7f0b009e + public const int mtrl_bottomappbar_fab_cradle_vertical_offset = 2131427486; - // aapt resource value: 0x7f0a009f - public const int mtrl_bottomappbar_height = 2131361951; + // aapt resource value: 0x7f0b009f + public const int mtrl_bottomappbar_height = 2131427487; - // aapt resource value: 0x7f0a00a0 - public const int mtrl_btn_corner_radius = 2131361952; + // aapt resource value: 0x7f0b00a0 + public const int mtrl_btn_corner_radius = 2131427488; - // aapt resource value: 0x7f0a00a1 - public const int mtrl_btn_dialog_btn_min_width = 2131361953; + // aapt resource value: 0x7f0b00a1 + public const int mtrl_btn_dialog_btn_min_width = 2131427489; - // aapt resource value: 0x7f0a00a2 - public const int mtrl_btn_disabled_elevation = 2131361954; + // aapt resource value: 0x7f0b00a2 + public const int mtrl_btn_disabled_elevation = 2131427490; - // aapt resource value: 0x7f0a00a3 - public const int mtrl_btn_disabled_z = 2131361955; + // aapt resource value: 0x7f0b00a3 + public const int mtrl_btn_disabled_z = 2131427491; - // aapt resource value: 0x7f0a00a4 - public const int mtrl_btn_elevation = 2131361956; + // aapt resource value: 0x7f0b00a4 + public const int mtrl_btn_elevation = 2131427492; - // aapt resource value: 0x7f0a00a5 - public const int mtrl_btn_focused_z = 2131361957; + // aapt resource value: 0x7f0b00a5 + public const int mtrl_btn_focused_z = 2131427493; - // aapt resource value: 0x7f0a00a6 - public const int mtrl_btn_hovered_z = 2131361958; + // aapt resource value: 0x7f0b00a6 + public const int mtrl_btn_hovered_z = 2131427494; - // aapt resource value: 0x7f0a00a7 - public const int mtrl_btn_icon_btn_padding_left = 2131361959; + // aapt resource value: 0x7f0b00a7 + public const int mtrl_btn_icon_btn_padding_left = 2131427495; - // aapt resource value: 0x7f0a00a8 - public const int mtrl_btn_icon_padding = 2131361960; + // aapt resource value: 0x7f0b00a8 + public const int mtrl_btn_icon_padding = 2131427496; - // aapt resource value: 0x7f0a00a9 - public const int mtrl_btn_inset = 2131361961; + // aapt resource value: 0x7f0b00a9 + public const int mtrl_btn_inset = 2131427497; - // aapt resource value: 0x7f0a00aa - public const int mtrl_btn_letter_spacing = 2131361962; + // aapt resource value: 0x7f0b00aa + public const int mtrl_btn_letter_spacing = 2131427498; - // aapt resource value: 0x7f0a00ab - public const int mtrl_btn_padding_bottom = 2131361963; + // aapt resource value: 0x7f0b00ab + public const int mtrl_btn_padding_bottom = 2131427499; - // aapt resource value: 0x7f0a00ac - public const int mtrl_btn_padding_left = 2131361964; + // aapt resource value: 0x7f0b00ac + public const int mtrl_btn_padding_left = 2131427500; - // aapt resource value: 0x7f0a00ad - public const int mtrl_btn_padding_right = 2131361965; + // aapt resource value: 0x7f0b00ad + public const int mtrl_btn_padding_right = 2131427501; - // aapt resource value: 0x7f0a00ae - public const int mtrl_btn_padding_top = 2131361966; + // aapt resource value: 0x7f0b00ae + public const int mtrl_btn_padding_top = 2131427502; - // aapt resource value: 0x7f0a00af - public const int mtrl_btn_pressed_z = 2131361967; + // aapt resource value: 0x7f0b00af + public const int mtrl_btn_pressed_z = 2131427503; - // aapt resource value: 0x7f0a00b0 - public const int mtrl_btn_stroke_size = 2131361968; + // aapt resource value: 0x7f0b00b0 + public const int mtrl_btn_stroke_size = 2131427504; - // aapt resource value: 0x7f0a00b1 - public const int mtrl_btn_text_btn_icon_padding = 2131361969; + // aapt resource value: 0x7f0b00b1 + public const int mtrl_btn_text_btn_icon_padding = 2131427505; - // aapt resource value: 0x7f0a00b2 - public const int mtrl_btn_text_btn_padding_left = 2131361970; + // aapt resource value: 0x7f0b00b2 + public const int mtrl_btn_text_btn_padding_left = 2131427506; - // aapt resource value: 0x7f0a00b3 - public const int mtrl_btn_text_btn_padding_right = 2131361971; + // aapt resource value: 0x7f0b00b3 + public const int mtrl_btn_text_btn_padding_right = 2131427507; - // aapt resource value: 0x7f0a00b4 - public const int mtrl_btn_text_size = 2131361972; + // aapt resource value: 0x7f0b00b4 + public const int mtrl_btn_text_size = 2131427508; - // aapt resource value: 0x7f0a00b5 - public const int mtrl_btn_z = 2131361973; + // aapt resource value: 0x7f0b00b5 + public const int mtrl_btn_z = 2131427509; - // aapt resource value: 0x7f0a00b6 - public const int mtrl_card_elevation = 2131361974; + // aapt resource value: 0x7f0b00b6 + public const int mtrl_card_elevation = 2131427510; - // aapt resource value: 0x7f0a00b7 - public const int mtrl_card_spacing = 2131361975; + // aapt resource value: 0x7f0b00b7 + public const int mtrl_card_spacing = 2131427511; - // aapt resource value: 0x7f0a00b8 - public const int mtrl_chip_pressed_translation_z = 2131361976; + // aapt resource value: 0x7f0b00b8 + public const int mtrl_chip_pressed_translation_z = 2131427512; - // aapt resource value: 0x7f0a00b9 - public const int mtrl_chip_text_size = 2131361977; + // aapt resource value: 0x7f0b00b9 + public const int mtrl_chip_text_size = 2131427513; - // aapt resource value: 0x7f0a00ba - public const int mtrl_fab_elevation = 2131361978; + // aapt resource value: 0x7f0b00ba + public const int mtrl_fab_elevation = 2131427514; - // aapt resource value: 0x7f0a00bb - public const int mtrl_fab_translation_z_hovered_focused = 2131361979; + // aapt resource value: 0x7f0b00bb + public const int mtrl_fab_translation_z_hovered_focused = 2131427515; - // aapt resource value: 0x7f0a00bc - public const int mtrl_fab_translation_z_pressed = 2131361980; + // aapt resource value: 0x7f0b00bc + public const int mtrl_fab_translation_z_pressed = 2131427516; - // aapt resource value: 0x7f0a00bd - public const int mtrl_navigation_elevation = 2131361981; + // aapt resource value: 0x7f0b00bd + public const int mtrl_navigation_elevation = 2131427517; - // aapt resource value: 0x7f0a00be - public const int mtrl_navigation_item_horizontal_padding = 2131361982; + // aapt resource value: 0x7f0b00be + public const int mtrl_navigation_item_horizontal_padding = 2131427518; - // aapt resource value: 0x7f0a00bf - public const int mtrl_navigation_item_icon_padding = 2131361983; + // aapt resource value: 0x7f0b00bf + public const int mtrl_navigation_item_icon_padding = 2131427519; - // aapt resource value: 0x7f0a00c0 - public const int mtrl_snackbar_background_corner_radius = 2131361984; + // aapt resource value: 0x7f0b00c0 + public const int mtrl_snackbar_background_corner_radius = 2131427520; - // aapt resource value: 0x7f0a00c1 - public const int mtrl_snackbar_margin = 2131361985; + // aapt resource value: 0x7f0b00c1 + public const int mtrl_snackbar_margin = 2131427521; - // aapt resource value: 0x7f0a00c2 - public const int mtrl_textinput_box_bottom_offset = 2131361986; + // aapt resource value: 0x7f0b00c2 + public const int mtrl_textinput_box_bottom_offset = 2131427522; - // aapt resource value: 0x7f0a00c3 - public const int mtrl_textinput_box_corner_radius_medium = 2131361987; + // aapt resource value: 0x7f0b00c3 + public const int mtrl_textinput_box_corner_radius_medium = 2131427523; - // aapt resource value: 0x7f0a00c4 - public const int mtrl_textinput_box_corner_radius_small = 2131361988; + // aapt resource value: 0x7f0b00c4 + public const int mtrl_textinput_box_corner_radius_small = 2131427524; - // aapt resource value: 0x7f0a00c5 - public const int mtrl_textinput_box_label_cutout_padding = 2131361989; + // aapt resource value: 0x7f0b00c5 + public const int mtrl_textinput_box_label_cutout_padding = 2131427525; - // aapt resource value: 0x7f0a00c6 - public const int mtrl_textinput_box_padding_end = 2131361990; + // aapt resource value: 0x7f0b00c6 + public const int mtrl_textinput_box_padding_end = 2131427526; - // aapt resource value: 0x7f0a00c7 - public const int mtrl_textinput_box_stroke_width_default = 2131361991; + // aapt resource value: 0x7f0b00c7 + public const int mtrl_textinput_box_stroke_width_default = 2131427527; - // aapt resource value: 0x7f0a00c8 - public const int mtrl_textinput_box_stroke_width_focused = 2131361992; + // aapt resource value: 0x7f0b00c8 + public const int mtrl_textinput_box_stroke_width_focused = 2131427528; - // aapt resource value: 0x7f0a00c9 - public const int mtrl_textinput_outline_box_expanded_padding = 2131361993; + // aapt resource value: 0x7f0b00c9 + public const int mtrl_textinput_outline_box_expanded_padding = 2131427529; - // aapt resource value: 0x7f0a00ca - public const int mtrl_toolbar_default_height = 2131361994; + // aapt resource value: 0x7f0b00ca + public const int mtrl_toolbar_default_height = 2131427530; - // aapt resource value: 0x7f0a00d8 - public const int notification_action_icon_size = 2131362008; + // aapt resource value: 0x7f0b00d8 + public const int notification_action_icon_size = 2131427544; - // aapt resource value: 0x7f0a00d9 - public const int notification_action_text_size = 2131362009; + // aapt resource value: 0x7f0b00d9 + public const int notification_action_text_size = 2131427545; - // aapt resource value: 0x7f0a00da - public const int notification_big_circle_margin = 2131362010; + // aapt resource value: 0x7f0b00da + public const int notification_big_circle_margin = 2131427546; - // aapt resource value: 0x7f0a00ce - public const int notification_content_margin_start = 2131361998; + // aapt resource value: 0x7f0b00ce + public const int notification_content_margin_start = 2131427534; - // aapt resource value: 0x7f0a00db - public const int notification_large_icon_height = 2131362011; + // aapt resource value: 0x7f0b00db + public const int notification_large_icon_height = 2131427547; - // aapt resource value: 0x7f0a00dc - public const int notification_large_icon_width = 2131362012; + // aapt resource value: 0x7f0b00dc + public const int notification_large_icon_width = 2131427548; - // aapt resource value: 0x7f0a00cf - public const int notification_main_column_padding_top = 2131361999; + // aapt resource value: 0x7f0b00cf + public const int notification_main_column_padding_top = 2131427535; - // aapt resource value: 0x7f0a00d0 - public const int notification_media_narrow_margin = 2131362000; + // aapt resource value: 0x7f0b00d0 + public const int notification_media_narrow_margin = 2131427536; - // aapt resource value: 0x7f0a00dd - public const int notification_right_icon_size = 2131362013; + // aapt resource value: 0x7f0b00dd + public const int notification_right_icon_size = 2131427549; - // aapt resource value: 0x7f0a00cd - public const int notification_right_side_padding_top = 2131361997; + // aapt resource value: 0x7f0b00cd + public const int notification_right_side_padding_top = 2131427533; - // aapt resource value: 0x7f0a00de - public const int notification_small_icon_background_padding = 2131362014; + // aapt resource value: 0x7f0b00de + public const int notification_small_icon_background_padding = 2131427550; - // aapt resource value: 0x7f0a00df - public const int notification_small_icon_size_as_large = 2131362015; + // aapt resource value: 0x7f0b00df + public const int notification_small_icon_size_as_large = 2131427551; - // aapt resource value: 0x7f0a00e0 - public const int notification_subtext_size = 2131362016; + // aapt resource value: 0x7f0b00e0 + public const int notification_subtext_size = 2131427552; - // aapt resource value: 0x7f0a00e1 - public const int notification_top_pad = 2131362017; + // aapt resource value: 0x7f0b00e1 + public const int notification_top_pad = 2131427553; - // aapt resource value: 0x7f0a00e2 - public const int notification_top_pad_large_text = 2131362018; + // aapt resource value: 0x7f0b00e2 + public const int notification_top_pad_large_text = 2131427554; - // aapt resource value: 0x7f0a006b - public const int subtitle_corner_radius = 2131361899; + // aapt resource value: 0x7f0b006b + public const int subtitle_corner_radius = 2131427435; - // aapt resource value: 0x7f0a006c - public const int subtitle_outline_width = 2131361900; + // aapt resource value: 0x7f0b006c + public const int subtitle_outline_width = 2131427436; - // aapt resource value: 0x7f0a006d - public const int subtitle_shadow_offset = 2131361901; + // aapt resource value: 0x7f0b006d + public const int subtitle_shadow_offset = 2131427437; - // aapt resource value: 0x7f0a006e - public const int subtitle_shadow_radius = 2131361902; + // aapt resource value: 0x7f0b006e + public const int subtitle_shadow_radius = 2131427438; - // aapt resource value: 0x7f0a0063 - public const int tooltip_corner_radius = 2131361891; + // aapt resource value: 0x7f0b0063 + public const int tooltip_corner_radius = 2131427427; - // aapt resource value: 0x7f0a0064 - public const int tooltip_horizontal_padding = 2131361892; + // aapt resource value: 0x7f0b0064 + public const int tooltip_horizontal_padding = 2131427428; - // aapt resource value: 0x7f0a0065 - public const int tooltip_margin = 2131361893; + // aapt resource value: 0x7f0b0065 + public const int tooltip_margin = 2131427429; - // aapt resource value: 0x7f0a0066 - public const int tooltip_precise_anchor_extra_offset = 2131361894; + // aapt resource value: 0x7f0b0066 + public const int tooltip_precise_anchor_extra_offset = 2131427430; - // aapt resource value: 0x7f0a0067 - public const int tooltip_precise_anchor_threshold = 2131361895; + // aapt resource value: 0x7f0b0067 + public const int tooltip_precise_anchor_threshold = 2131427431; - // aapt resource value: 0x7f0a0068 - public const int tooltip_vertical_padding = 2131361896; + // aapt resource value: 0x7f0b0068 + public const int tooltip_vertical_padding = 2131427432; - // aapt resource value: 0x7f0a0069 - public const int tooltip_y_offset_non_touch = 2131361897; + // aapt resource value: 0x7f0b0069 + public const int tooltip_y_offset_non_touch = 2131427433; - // aapt resource value: 0x7f0a006a - public const int tooltip_y_offset_touch = 2131361898; + // aapt resource value: 0x7f0b006a + public const int tooltip_y_offset_touch = 2131427434; static Dimension() { @@ -8766,830 +8766,830 @@ namespace Bit.Droid public partial class Id { - // aapt resource value: 0x7f0b0039 - public const int ALT = 2131427385; + // aapt resource value: 0x7f0c0039 + public const int ALT = 2131492921; - // aapt resource value: 0x7f0b003a - public const int CTRL = 2131427386; + // aapt resource value: 0x7f0c003a + public const int CTRL = 2131492922; - // aapt resource value: 0x7f0b00a9 - public const int CellAccessory = 2131427497; + // aapt resource value: 0x7f0c00a9 + public const int CellAccessory = 2131493033; - // aapt resource value: 0x7f0b00aa - public const int CellButton1 = 2131427498; + // aapt resource value: 0x7f0c00aa + public const int CellButton1 = 2131493034; - // aapt resource value: 0x7f0b00ab - public const int CellButton2 = 2131427499; + // aapt resource value: 0x7f0c00ab + public const int CellButton2 = 2131493035; - // aapt resource value: 0x7f0b00ac - public const int CellButton3 = 2131427500; + // aapt resource value: 0x7f0c00ac + public const int CellButton3 = 2131493036; - // aapt resource value: 0x7f0b00a6 - public const int CellButtonContent = 2131427494; + // aapt resource value: 0x7f0c00a6 + public const int CellButtonContent = 2131493030; - // aapt resource value: 0x7f0b00a5 - public const int CellContent = 2131427493; + // aapt resource value: 0x7f0c00a5 + public const int CellContent = 2131493029; - // aapt resource value: 0x7f0b00a8 - public const int CellTitle = 2131427496; + // aapt resource value: 0x7f0c00a8 + public const int CellTitle = 2131493032; - // aapt resource value: 0x7f0b00a7 - public const int CellTitleContent = 2131427495; + // aapt resource value: 0x7f0c00a7 + public const int CellTitleContent = 2131493031; - // aapt resource value: 0x7f0b00ad - public const int ContentCellBody = 2131427501; + // aapt resource value: 0x7f0c00ad + public const int ContentCellBody = 2131493037; - // aapt resource value: 0x7f0b00ae - public const int ContentCellBorder = 2131427502; + // aapt resource value: 0x7f0c00ae + public const int ContentCellBorder = 2131493038; - // aapt resource value: 0x7f0b003b - public const int FUNCTION = 2131427387; + // aapt resource value: 0x7f0c003b + public const int FUNCTION = 2131492923; - // aapt resource value: 0x7f0b00c2 - public const int FooterCellText = 2131427522; + // aapt resource value: 0x7f0c00c2 + public const int FooterCellText = 2131493058; - // aapt resource value: 0x7f0b00c4 - public const int HeaderCellBorder = 2131427524; + // aapt resource value: 0x7f0c00c4 + public const int HeaderCellBorder = 2131493060; - // aapt resource value: 0x7f0b00c3 - public const int HeaderCellText = 2131427523; + // aapt resource value: 0x7f0c00c3 + public const int HeaderCellText = 2131493059; - // aapt resource value: 0x7f0b003c - public const int META = 2131427388; + // aapt resource value: 0x7f0c003c + public const int META = 2131492924; - // aapt resource value: 0x7f0b003d - public const int SHIFT = 2131427389; + // aapt resource value: 0x7f0c003d + public const int SHIFT = 2131492925; - // aapt resource value: 0x7f0b003e - public const int SYM = 2131427390; + // aapt resource value: 0x7f0c003e + public const int SYM = 2131492926; - // aapt resource value: 0x7f0b00f7 - public const int action0 = 2131427575; + // aapt resource value: 0x7f0c00f7 + public const int action0 = 2131493111; - // aapt resource value: 0x7f0b008d - public const int action_bar = 2131427469; + // aapt resource value: 0x7f0c008d + public const int action_bar = 2131493005; - // aapt resource value: 0x7f0b0001 - public const int action_bar_activity_content = 2131427329; + // aapt resource value: 0x7f0c0001 + public const int action_bar_activity_content = 2131492865; - // aapt resource value: 0x7f0b008c - public const int action_bar_container = 2131427468; + // aapt resource value: 0x7f0c008c + public const int action_bar_container = 2131493004; - // aapt resource value: 0x7f0b0088 - public const int action_bar_root = 2131427464; + // aapt resource value: 0x7f0c0088 + public const int action_bar_root = 2131493000; - // aapt resource value: 0x7f0b0002 - public const int action_bar_spinner = 2131427330; + // aapt resource value: 0x7f0c0002 + public const int action_bar_spinner = 2131492866; - // aapt resource value: 0x7f0b006a - public const int action_bar_subtitle = 2131427434; + // aapt resource value: 0x7f0c006a + public const int action_bar_subtitle = 2131492970; - // aapt resource value: 0x7f0b0069 - public const int action_bar_title = 2131427433; + // aapt resource value: 0x7f0c0069 + public const int action_bar_title = 2131492969; - // aapt resource value: 0x7f0b00f4 - public const int action_container = 2131427572; + // aapt resource value: 0x7f0c00f4 + public const int action_container = 2131493108; - // aapt resource value: 0x7f0b008e - public const int action_context_bar = 2131427470; + // aapt resource value: 0x7f0c008e + public const int action_context_bar = 2131493006; - // aapt resource value: 0x7f0b00fb - public const int action_divider = 2131427579; + // aapt resource value: 0x7f0c00fb + public const int action_divider = 2131493115; - // aapt resource value: 0x7f0b00f5 - public const int action_image = 2131427573; + // aapt resource value: 0x7f0c00f5 + public const int action_image = 2131493109; - // aapt resource value: 0x7f0b0003 - public const int action_menu_divider = 2131427331; + // aapt resource value: 0x7f0c0003 + public const int action_menu_divider = 2131492867; - // aapt resource value: 0x7f0b0004 - public const int action_menu_presenter = 2131427332; + // aapt resource value: 0x7f0c0004 + public const int action_menu_presenter = 2131492868; - // aapt resource value: 0x7f0b008a - public const int action_mode_bar = 2131427466; + // aapt resource value: 0x7f0c008a + public const int action_mode_bar = 2131493002; - // aapt resource value: 0x7f0b0089 - public const int action_mode_bar_stub = 2131427465; + // aapt resource value: 0x7f0c0089 + public const int action_mode_bar_stub = 2131493001; - // aapt resource value: 0x7f0b006b - public const int action_mode_close_button = 2131427435; + // aapt resource value: 0x7f0c006b + public const int action_mode_close_button = 2131492971; - // aapt resource value: 0x7f0b00f6 - public const int action_text = 2131427574; + // aapt resource value: 0x7f0c00f6 + public const int action_text = 2131493110; - // aapt resource value: 0x7f0b0104 - public const int actions = 2131427588; + // aapt resource value: 0x7f0c0104 + public const int actions = 2131493124; - // aapt resource value: 0x7f0b006c - public const int activity_chooser_view_content = 2131427436; + // aapt resource value: 0x7f0c006c + public const int activity_chooser_view_content = 2131492972; - // aapt resource value: 0x7f0b002e - public const int add = 2131427374; + // aapt resource value: 0x7f0c002e + public const int add = 2131492910; - // aapt resource value: 0x7f0b007f - public const int alertTitle = 2131427455; + // aapt resource value: 0x7f0c007f + public const int alertTitle = 2131492991; - // aapt resource value: 0x7f0b0064 - public const int all = 2131427428; + // aapt resource value: 0x7f0c0064 + public const int all = 2131492964; - // aapt resource value: 0x7f0b003f - public const int always = 2131427391; + // aapt resource value: 0x7f0c003f + public const int always = 2131492927; - // aapt resource value: 0x7f0b0065 - public const int async = 2131427429; + // aapt resource value: 0x7f0c0065 + public const int async = 2131492965; - // aapt resource value: 0x7f0b004d - public const int auto = 2131427405; + // aapt resource value: 0x7f0c004d + public const int auto = 2131492941; - // aapt resource value: 0x7f0b0036 - public const int beginning = 2131427382; + // aapt resource value: 0x7f0c0036 + public const int beginning = 2131492918; - // aapt resource value: 0x7f0b0066 - public const int blocking = 2131427430; + // aapt resource value: 0x7f0c0066 + public const int blocking = 2131492966; - // aapt resource value: 0x7f0b0044 - public const int bottom = 2131427396; + // aapt resource value: 0x7f0c0044 + public const int bottom = 2131492932; - // aapt resource value: 0x7f0b009e - public const int bottomtab_navarea = 2131427486; + // aapt resource value: 0x7f0c009e + public const int bottomtab_navarea = 2131493022; - // aapt resource value: 0x7f0b009f - public const int bottomtab_tabbar = 2131427487; + // aapt resource value: 0x7f0c009f + public const int bottomtab_tabbar = 2131493023; - // aapt resource value: 0x7f0b00a1 - public const int browser_actions_header_text = 2131427489; + // aapt resource value: 0x7f0c00a1 + public const int browser_actions_header_text = 2131493025; - // aapt resource value: 0x7f0b00a3 - public const int browser_actions_menu_item_icon = 2131427491; + // aapt resource value: 0x7f0c00a3 + public const int browser_actions_menu_item_icon = 2131493027; - // aapt resource value: 0x7f0b00a4 - public const int browser_actions_menu_item_text = 2131427492; + // aapt resource value: 0x7f0c00a4 + public const int browser_actions_menu_item_text = 2131493028; - // aapt resource value: 0x7f0b00a2 - public const int browser_actions_menu_items = 2131427490; + // aapt resource value: 0x7f0c00a2 + public const int browser_actions_menu_items = 2131493026; - // aapt resource value: 0x7f0b00a0 - public const int browser_actions_menu_view = 2131427488; + // aapt resource value: 0x7f0c00a0 + public const int browser_actions_menu_view = 2131493024; - // aapt resource value: 0x7f0b0072 - public const int buttonPanel = 2131427442; + // aapt resource value: 0x7f0c0072 + public const int buttonPanel = 2131492978; - // aapt resource value: 0x7f0b00f8 - public const int cancel_action = 2131427576; + // aapt resource value: 0x7f0c00f8 + public const int cancel_action = 2131493112; - // aapt resource value: 0x7f0b004c - public const int center = 2131427404; + // aapt resource value: 0x7f0c004c + public const int center = 2131492940; - // aapt resource value: 0x7f0b0051 - public const int center_horizontal = 2131427409; + // aapt resource value: 0x7f0c0051 + public const int center_horizontal = 2131492945; - // aapt resource value: 0x7f0b0052 - public const int center_vertical = 2131427410; + // aapt resource value: 0x7f0c0052 + public const int center_vertical = 2131492946; - // aapt resource value: 0x7f0b0086 - public const int checkbox = 2131427462; + // aapt resource value: 0x7f0c0086 + public const int checkbox = 2131492998; - // aapt resource value: 0x7f0b0100 - public const int chronometer = 2131427584; + // aapt resource value: 0x7f0c0100 + public const int chronometer = 2131493120; - // aapt resource value: 0x7f0b0061 - public const int clip_horizontal = 2131427425; + // aapt resource value: 0x7f0c0061 + public const int clip_horizontal = 2131492961; - // aapt resource value: 0x7f0b0062 - public const int clip_vertical = 2131427426; + // aapt resource value: 0x7f0c0062 + public const int clip_vertical = 2131492962; - // aapt resource value: 0x7f0b0040 - public const int collapseActionView = 2131427392; + // aapt resource value: 0x7f0c0040 + public const int collapseActionView = 2131492928; - // aapt resource value: 0x7f0b00b1 - public const int container = 2131427505; + // aapt resource value: 0x7f0c00b1 + public const int container = 2131493041; - // aapt resource value: 0x7f0b0082 - public const int content = 2131427458; + // aapt resource value: 0x7f0c0082 + public const int content = 2131492994; - // aapt resource value: 0x7f0b0110 - public const int contentFrame = 2131427600; + // aapt resource value: 0x7f0c0110 + public const int contentFrame = 2131493136; - // aapt resource value: 0x7f0b0075 - public const int contentPanel = 2131427445; + // aapt resource value: 0x7f0c0075 + public const int contentPanel = 2131492981; - // aapt resource value: 0x7f0b00b2 - public const int coordinator = 2131427506; + // aapt resource value: 0x7f0c00b2 + public const int coordinator = 2131493042; - // aapt resource value: 0x7f0b007c - public const int custom = 2131427452; + // aapt resource value: 0x7f0c007c + public const int custom = 2131492988; - // aapt resource value: 0x7f0b007b - public const int customPanel = 2131427451; + // aapt resource value: 0x7f0c007b + public const int customPanel = 2131492987; - // aapt resource value: 0x7f0b008b - public const int decor_content_parent = 2131427467; + // aapt resource value: 0x7f0c008b + public const int decor_content_parent = 2131493003; - // aapt resource value: 0x7f0b006f - public const int default_activity_button = 2131427439; + // aapt resource value: 0x7f0c006f + public const int default_activity_button = 2131492975; - // aapt resource value: 0x7f0b00b4 - public const int design_bottom_sheet = 2131427508; + // aapt resource value: 0x7f0c00b4 + public const int design_bottom_sheet = 2131493044; - // aapt resource value: 0x7f0b00b9 - public const int design_menu_item_action_area = 2131427513; + // aapt resource value: 0x7f0c00b9 + public const int design_menu_item_action_area = 2131493049; - // aapt resource value: 0x7f0b00b8 - public const int design_menu_item_action_area_stub = 2131427512; + // aapt resource value: 0x7f0c00b8 + public const int design_menu_item_action_area_stub = 2131493048; - // aapt resource value: 0x7f0b00b7 - public const int design_menu_item_text = 2131427511; + // aapt resource value: 0x7f0c00b7 + public const int design_menu_item_text = 2131493047; - // aapt resource value: 0x7f0b00b6 - public const int design_navigation_view = 2131427510; + // aapt resource value: 0x7f0c00b6 + public const int design_navigation_view = 2131493046; - // aapt resource value: 0x7f0b0027 - public const int disableHome = 2131427367; + // aapt resource value: 0x7f0c0027 + public const int disableHome = 2131492903; - // aapt resource value: 0x7f0b008f - public const int edit_query = 2131427471; + // aapt resource value: 0x7f0c008f + public const int edit_query = 2131493007; - // aapt resource value: 0x7f0b0037 - public const int end = 2131427383; + // aapt resource value: 0x7f0c0037 + public const int end = 2131492919; - // aapt resource value: 0x7f0b0106 - public const int end_padder = 2131427590; + // aapt resource value: 0x7f0c0106 + public const int end_padder = 2131493126; - // aapt resource value: 0x7f0b0046 - public const int enterAlways = 2131427398; + // aapt resource value: 0x7f0c0046 + public const int enterAlways = 2131492934; - // aapt resource value: 0x7f0b0047 - public const int enterAlwaysCollapsed = 2131427399; + // aapt resource value: 0x7f0c0047 + public const int enterAlwaysCollapsed = 2131492935; - // aapt resource value: 0x7f0b0048 - public const int exitUntilCollapsed = 2131427400; + // aapt resource value: 0x7f0c0048 + public const int exitUntilCollapsed = 2131492936; - // aapt resource value: 0x7f0b006d - public const int expand_activities_button = 2131427437; + // aapt resource value: 0x7f0c006d + public const int expand_activities_button = 2131492973; - // aapt resource value: 0x7f0b0085 - public const int expanded_menu = 2131427461; + // aapt resource value: 0x7f0c0085 + public const int expanded_menu = 2131492997; - // aapt resource value: 0x7f0b005e - public const int fill = 2131427422; + // aapt resource value: 0x7f0c005e + public const int fill = 2131492958; - // aapt resource value: 0x7f0b0063 - public const int fill_horizontal = 2131427427; + // aapt resource value: 0x7f0c0063 + public const int fill_horizontal = 2131492963; - // aapt resource value: 0x7f0b0053 - public const int fill_vertical = 2131427411; + // aapt resource value: 0x7f0c0053 + public const int fill_vertical = 2131492947; - // aapt resource value: 0x7f0b005f - public const int filled = 2131427423; + // aapt resource value: 0x7f0c005f + public const int filled = 2131492959; - // aapt resource value: 0x7f0b00be - public const int fingerprint_btnCancel = 2131427518; + // aapt resource value: 0x7f0c00be + public const int fingerprint_btnCancel = 2131493054; - // aapt resource value: 0x7f0b00bf - public const int fingerprint_btnFallback = 2131427519; + // aapt resource value: 0x7f0c00bf + public const int fingerprint_btnFallback = 2131493055; - // aapt resource value: 0x7f0b00bb - public const int fingerprint_imgFingerprint = 2131427515; + // aapt resource value: 0x7f0c00bb + public const int fingerprint_imgFingerprint = 2131493051; - // aapt resource value: 0x7f0b00bc - public const int fingerprint_txtHelp = 2131427516; + // aapt resource value: 0x7f0c00bc + public const int fingerprint_txtHelp = 2131493052; - // aapt resource value: 0x7f0b00bd - public const int fingerprint_txtReason = 2131427517; + // aapt resource value: 0x7f0c00bd + public const int fingerprint_txtReason = 2131493053; - // aapt resource value: 0x7f0b005c - public const int @fixed = 2131427420; + // aapt resource value: 0x7f0c005c + public const int @fixed = 2131492956; - // aapt resource value: 0x7f0b00c0 - public const int flyoutcontent_appbar = 2131427520; + // aapt resource value: 0x7f0c00c0 + public const int flyoutcontent_appbar = 2131493056; - // aapt resource value: 0x7f0b00c1 - public const int flyoutcontent_recycler = 2131427521; + // aapt resource value: 0x7f0c00c1 + public const int flyoutcontent_recycler = 2131493057; - // aapt resource value: 0x7f0b0067 - public const int forever = 2131427431; + // aapt resource value: 0x7f0c0067 + public const int forever = 2131492967; - // aapt resource value: 0x7f0b000a - public const int ghost_view = 2131427338; + // aapt resource value: 0x7f0c000a + public const int ghost_view = 2131492874; - // aapt resource value: 0x7f0b0081 - public const int group_divider = 2131427457; + // aapt resource value: 0x7f0c0081 + public const int group_divider = 2131492993; - // aapt resource value: 0x7f0b0005 - public const int home = 2131427333; + // aapt resource value: 0x7f0c0005 + public const int home = 2131492869; - // aapt resource value: 0x7f0b0028 - public const int homeAsUp = 2131427368; + // aapt resource value: 0x7f0c0028 + public const int homeAsUp = 2131492904; - // aapt resource value: 0x7f0b0071 - public const int icon = 2131427441; + // aapt resource value: 0x7f0c0071 + public const int icon = 2131492977; - // aapt resource value: 0x7f0b0105 - public const int icon_group = 2131427589; + // aapt resource value: 0x7f0c0105 + public const int icon_group = 2131493125; - // aapt resource value: 0x7f0b0041 - public const int ifRoom = 2131427393; + // aapt resource value: 0x7f0c0041 + public const int ifRoom = 2131492929; - // aapt resource value: 0x7f0b006e - public const int image = 2131427438; + // aapt resource value: 0x7f0c006e + public const int image = 2131492974; - // aapt resource value: 0x7f0b0101 - public const int info = 2131427585; + // aapt resource value: 0x7f0c0101 + public const int info = 2131493121; - // aapt resource value: 0x7f0b0068 - public const int italic = 2131427432; + // aapt resource value: 0x7f0c0068 + public const int italic = 2131492968; - // aapt resource value: 0x7f0b0000 - public const int item_touch_helper_previous_elevation = 2131427328; + // aapt resource value: 0x7f0c0000 + public const int item_touch_helper_previous_elevation = 2131492864; - // aapt resource value: 0x7f0b004e - public const int labeled = 2131427406; + // aapt resource value: 0x7f0c004e + public const int labeled = 2131492942; - // aapt resource value: 0x7f0b00b0 - public const int largeLabel = 2131427504; + // aapt resource value: 0x7f0c00b0 + public const int largeLabel = 2131493040; - // aapt resource value: 0x7f0b0054 - public const int left = 2131427412; + // aapt resource value: 0x7f0c0054 + public const int left = 2131492948; - // aapt resource value: 0x7f0b001c - public const int line1 = 2131427356; + // aapt resource value: 0x7f0c001c + public const int line1 = 2131492892; - // aapt resource value: 0x7f0b001d - public const int line3 = 2131427357; + // aapt resource value: 0x7f0c001d + public const int line3 = 2131492893; - // aapt resource value: 0x7f0b0024 - public const int listMode = 2131427364; + // aapt resource value: 0x7f0c0024 + public const int listMode = 2131492900; - // aapt resource value: 0x7f0b0070 - public const int list_item = 2131427440; + // aapt resource value: 0x7f0c0070 + public const int list_item = 2131492976; - // aapt resource value: 0x7f0b0107 - public const int main_appbar = 2131427591; + // aapt resource value: 0x7f0c0107 + public const int main_appbar = 2131493127; - // aapt resource value: 0x7f0b010a - public const int main_scrollview = 2131427594; + // aapt resource value: 0x7f0c010a + public const int main_scrollview = 2131493130; - // aapt resource value: 0x7f0b0109 - public const int main_tablayout = 2131427593; + // aapt resource value: 0x7f0c0109 + public const int main_tablayout = 2131493129; - // aapt resource value: 0x7f0b0108 - public const int main_toolbar = 2131427592; + // aapt resource value: 0x7f0c0108 + public const int main_toolbar = 2131493128; - // aapt resource value: 0x7f0b0112 - public const int masked = 2131427602; + // aapt resource value: 0x7f0c0112 + public const int masked = 2131493138; - // aapt resource value: 0x7f0b00fa - public const int media_actions = 2131427578; + // aapt resource value: 0x7f0c00fa + public const int media_actions = 2131493114; - // aapt resource value: 0x7f0b009c - public const int message = 2131427484; + // aapt resource value: 0x7f0c009c + public const int message = 2131493020; - // aapt resource value: 0x7f0b0038 - public const int middle = 2131427384; + // aapt resource value: 0x7f0c0038 + public const int middle = 2131492920; - // aapt resource value: 0x7f0b0059 - public const int mini = 2131427417; + // aapt resource value: 0x7f0c0059 + public const int mini = 2131492953; - // aapt resource value: 0x7f0b00e1 - public const int mr_art = 2131427553; + // aapt resource value: 0x7f0c00e1 + public const int mr_art = 2131493089; - // aapt resource value: 0x7f0b00d2 - public const int mr_cast_checkbox = 2131427538; + // aapt resource value: 0x7f0c00d2 + public const int mr_cast_checkbox = 2131493074; - // aapt resource value: 0x7f0b00cb - public const int mr_cast_close_button = 2131427531; + // aapt resource value: 0x7f0c00cb + public const int mr_cast_close_button = 2131493067; - // aapt resource value: 0x7f0b00c6 - public const int mr_cast_group_icon = 2131427526; + // aapt resource value: 0x7f0c00c6 + public const int mr_cast_group_icon = 2131493062; - // aapt resource value: 0x7f0b00c7 - public const int mr_cast_group_name = 2131427527; + // aapt resource value: 0x7f0c00c7 + public const int mr_cast_group_name = 2131493063; - // aapt resource value: 0x7f0b00c5 - public const int mr_cast_list = 2131427525; + // aapt resource value: 0x7f0c00c5 + public const int mr_cast_list = 2131493061; - // aapt resource value: 0x7f0b00ca - public const int mr_cast_meta = 2131427530; + // aapt resource value: 0x7f0c00ca + public const int mr_cast_meta = 2131493066; - // aapt resource value: 0x7f0b00cc - public const int mr_cast_meta_art = 2131427532; + // aapt resource value: 0x7f0c00cc + public const int mr_cast_meta_art = 2131493068; - // aapt resource value: 0x7f0b00ce - public const int mr_cast_meta_subtitle = 2131427534; + // aapt resource value: 0x7f0c00ce + public const int mr_cast_meta_subtitle = 2131493070; - // aapt resource value: 0x7f0b00cd - public const int mr_cast_meta_title = 2131427533; + // aapt resource value: 0x7f0c00cd + public const int mr_cast_meta_title = 2131493069; - // aapt resource value: 0x7f0b00d0 - public const int mr_cast_route_icon = 2131427536; + // aapt resource value: 0x7f0c00d0 + public const int mr_cast_route_icon = 2131493072; - // aapt resource value: 0x7f0b00d1 - public const int mr_cast_route_name = 2131427537; + // aapt resource value: 0x7f0c00d1 + public const int mr_cast_route_name = 2131493073; - // aapt resource value: 0x7f0b00cf - public const int mr_cast_stop_button = 2131427535; + // aapt resource value: 0x7f0c00cf + public const int mr_cast_stop_button = 2131493071; - // aapt resource value: 0x7f0b00d3 - public const int mr_cast_volume_layout = 2131427539; + // aapt resource value: 0x7f0c00d3 + public const int mr_cast_volume_layout = 2131493075; - // aapt resource value: 0x7f0b00d4 - public const int mr_cast_volume_slider = 2131427540; + // aapt resource value: 0x7f0c00d4 + public const int mr_cast_volume_slider = 2131493076; - // aapt resource value: 0x7f0b00d6 - public const int mr_chooser_list = 2131427542; + // aapt resource value: 0x7f0c00d6 + public const int mr_chooser_list = 2131493078; - // aapt resource value: 0x7f0b00d9 - public const int mr_chooser_route_desc = 2131427545; + // aapt resource value: 0x7f0c00d9 + public const int mr_chooser_route_desc = 2131493081; - // aapt resource value: 0x7f0b00d7 - public const int mr_chooser_route_icon = 2131427543; + // aapt resource value: 0x7f0c00d7 + public const int mr_chooser_route_icon = 2131493079; - // aapt resource value: 0x7f0b00d8 - public const int mr_chooser_route_name = 2131427544; + // aapt resource value: 0x7f0c00d8 + public const int mr_chooser_route_name = 2131493080; - // aapt resource value: 0x7f0b00d5 - public const int mr_chooser_title = 2131427541; + // aapt resource value: 0x7f0c00d5 + public const int mr_chooser_title = 2131493077; - // aapt resource value: 0x7f0b00de - public const int mr_close = 2131427550; + // aapt resource value: 0x7f0c00de + public const int mr_close = 2131493086; - // aapt resource value: 0x7f0b00e4 - public const int mr_control_divider = 2131427556; + // aapt resource value: 0x7f0c00e4 + public const int mr_control_divider = 2131493092; - // aapt resource value: 0x7f0b00ef - public const int mr_control_playback_ctrl = 2131427567; + // aapt resource value: 0x7f0c00ef + public const int mr_control_playback_ctrl = 2131493103; - // aapt resource value: 0x7f0b00f2 - public const int mr_control_subtitle = 2131427570; + // aapt resource value: 0x7f0c00f2 + public const int mr_control_subtitle = 2131493106; - // aapt resource value: 0x7f0b00f1 - public const int mr_control_title = 2131427569; + // aapt resource value: 0x7f0c00f1 + public const int mr_control_title = 2131493105; - // aapt resource value: 0x7f0b00f0 - public const int mr_control_title_container = 2131427568; + // aapt resource value: 0x7f0c00f0 + public const int mr_control_title_container = 2131493104; - // aapt resource value: 0x7f0b00df - public const int mr_custom_control = 2131427551; + // aapt resource value: 0x7f0c00df + public const int mr_custom_control = 2131493087; - // aapt resource value: 0x7f0b00e0 - public const int mr_default_control = 2131427552; + // aapt resource value: 0x7f0c00e0 + public const int mr_default_control = 2131493088; - // aapt resource value: 0x7f0b00db - public const int mr_dialog_area = 2131427547; + // aapt resource value: 0x7f0c00db + public const int mr_dialog_area = 2131493083; - // aapt resource value: 0x7f0b00ea - public const int mr_dialog_header_name = 2131427562; + // aapt resource value: 0x7f0c00ea + public const int mr_dialog_header_name = 2131493098; - // aapt resource value: 0x7f0b00da - public const int mr_expandable_area = 2131427546; + // aapt resource value: 0x7f0c00da + public const int mr_expandable_area = 2131493082; - // aapt resource value: 0x7f0b00f3 - public const int mr_group_expand_collapse = 2131427571; + // aapt resource value: 0x7f0c00f3 + public const int mr_group_expand_collapse = 2131493107; - // aapt resource value: 0x7f0b00c8 - public const int mr_group_volume_route_name = 2131427528; + // aapt resource value: 0x7f0c00c8 + public const int mr_group_volume_route_name = 2131493064; - // aapt resource value: 0x7f0b00c9 - public const int mr_group_volume_slider = 2131427529; + // aapt resource value: 0x7f0c00c9 + public const int mr_group_volume_slider = 2131493065; - // aapt resource value: 0x7f0b00e2 - public const int mr_media_main_control = 2131427554; + // aapt resource value: 0x7f0c00e2 + public const int mr_media_main_control = 2131493090; - // aapt resource value: 0x7f0b00dd - public const int mr_name = 2131427549; + // aapt resource value: 0x7f0c00dd + public const int mr_name = 2131493085; - // aapt resource value: 0x7f0b00eb - public const int mr_picker_close_button = 2131427563; + // aapt resource value: 0x7f0c00eb + public const int mr_picker_close_button = 2131493099; - // aapt resource value: 0x7f0b00ec - public const int mr_picker_list = 2131427564; + // aapt resource value: 0x7f0c00ec + public const int mr_picker_list = 2131493100; - // aapt resource value: 0x7f0b00ed - public const int mr_picker_route_icon = 2131427565; + // aapt resource value: 0x7f0c00ed + public const int mr_picker_route_icon = 2131493101; - // aapt resource value: 0x7f0b00ee - public const int mr_picker_route_name = 2131427566; + // aapt resource value: 0x7f0c00ee + public const int mr_picker_route_name = 2131493102; - // aapt resource value: 0x7f0b00e3 - public const int mr_playback_control = 2131427555; + // aapt resource value: 0x7f0c00e3 + public const int mr_playback_control = 2131493091; - // aapt resource value: 0x7f0b00dc - public const int mr_title_bar = 2131427548; + // aapt resource value: 0x7f0c00dc + public const int mr_title_bar = 2131493084; - // aapt resource value: 0x7f0b00e5 - public const int mr_volume_control = 2131427557; + // aapt resource value: 0x7f0c00e5 + public const int mr_volume_control = 2131493093; - // aapt resource value: 0x7f0b00e6 - public const int mr_volume_group_list = 2131427558; + // aapt resource value: 0x7f0c00e6 + public const int mr_volume_group_list = 2131493094; - // aapt resource value: 0x7f0b00e8 - public const int mr_volume_item_icon = 2131427560; + // aapt resource value: 0x7f0c00e8 + public const int mr_volume_item_icon = 2131493096; - // aapt resource value: 0x7f0b00e9 - public const int mr_volume_slider = 2131427561; + // aapt resource value: 0x7f0c00e9 + public const int mr_volume_slider = 2131493097; - // aapt resource value: 0x7f0b0014 - public const int mtrl_child_content_container = 2131427348; + // aapt resource value: 0x7f0c0014 + public const int mtrl_child_content_container = 2131492884; - // aapt resource value: 0x7f0b0015 - public const int mtrl_internal_children_alpha_tag = 2131427349; + // aapt resource value: 0x7f0c0015 + public const int mtrl_internal_children_alpha_tag = 2131492885; - // aapt resource value: 0x7f0b002f - public const int multiply = 2131427375; + // aapt resource value: 0x7f0c002f + public const int multiply = 2131492911; - // aapt resource value: 0x7f0b00b5 - public const int navigation_header_container = 2131427509; + // aapt resource value: 0x7f0c00b5 + public const int navigation_header_container = 2131493045; - // aapt resource value: 0x7f0b0042 - public const int never = 2131427394; + // aapt resource value: 0x7f0c0042 + public const int never = 2131492930; - // aapt resource value: 0x7f0b0029 - public const int none = 2131427369; + // aapt resource value: 0x7f0c0029 + public const int none = 2131492905; - // aapt resource value: 0x7f0b0025 - public const int normal = 2131427365; + // aapt resource value: 0x7f0c0025 + public const int normal = 2131492901; - // aapt resource value: 0x7f0b0103 - public const int notification_background = 2131427587; + // aapt resource value: 0x7f0c0103 + public const int notification_background = 2131493123; - // aapt resource value: 0x7f0b00fd - public const int notification_main_column = 2131427581; + // aapt resource value: 0x7f0c00fd + public const int notification_main_column = 2131493117; - // aapt resource value: 0x7f0b00fc - public const int notification_main_column_container = 2131427580; + // aapt resource value: 0x7f0c00fc + public const int notification_main_column_container = 2131493116; - // aapt resource value: 0x7f0b0060 - public const int outline = 2131427424; + // aapt resource value: 0x7f0c0060 + public const int outline = 2131492960; - // aapt resource value: 0x7f0b0057 - public const int parallax = 2131427415; + // aapt resource value: 0x7f0c0057 + public const int parallax = 2131492951; - // aapt resource value: 0x7f0b0074 - public const int parentPanel = 2131427444; + // aapt resource value: 0x7f0c0074 + public const int parentPanel = 2131492980; - // aapt resource value: 0x7f0b000b - public const int parent_matrix = 2131427339; + // aapt resource value: 0x7f0c000b + public const int parent_matrix = 2131492875; - // aapt resource value: 0x7f0b0058 - public const int pin = 2131427416; + // aapt resource value: 0x7f0c0058 + public const int pin = 2131492952; - // aapt resource value: 0x7f0b0006 - public const int progress_circular = 2131427334; + // aapt resource value: 0x7f0c0006 + public const int progress_circular = 2131492870; - // aapt resource value: 0x7f0b0007 - public const int progress_horizontal = 2131427335; + // aapt resource value: 0x7f0c0007 + public const int progress_horizontal = 2131492871; - // aapt resource value: 0x7f0b0087 - public const int radio = 2131427463; + // aapt resource value: 0x7f0c0087 + public const int radio = 2131492999; - // aapt resource value: 0x7f0b0055 - public const int right = 2131427413; + // aapt resource value: 0x7f0c0055 + public const int right = 2131492949; - // aapt resource value: 0x7f0b0102 - public const int right_icon = 2131427586; + // aapt resource value: 0x7f0c0102 + public const int right_icon = 2131493122; - // aapt resource value: 0x7f0b00fe - public const int right_side = 2131427582; + // aapt resource value: 0x7f0c00fe + public const int right_side = 2131493118; - // aapt resource value: 0x7f0b000c - public const int save_image_matrix = 2131427340; + // aapt resource value: 0x7f0c000c + public const int save_image_matrix = 2131492876; - // aapt resource value: 0x7f0b000d - public const int save_non_transition_alpha = 2131427341; + // aapt resource value: 0x7f0c000d + public const int save_non_transition_alpha = 2131492877; - // aapt resource value: 0x7f0b000e - public const int save_scale_type = 2131427342; + // aapt resource value: 0x7f0c000e + public const int save_scale_type = 2131492878; - // aapt resource value: 0x7f0b0030 - public const int screen = 2131427376; + // aapt resource value: 0x7f0c0030 + public const int screen = 2131492912; - // aapt resource value: 0x7f0b0049 - public const int scroll = 2131427401; + // aapt resource value: 0x7f0c0049 + public const int scroll = 2131492937; - // aapt resource value: 0x7f0b007a - public const int scrollIndicatorDown = 2131427450; + // aapt resource value: 0x7f0c007a + public const int scrollIndicatorDown = 2131492986; - // aapt resource value: 0x7f0b0076 - public const int scrollIndicatorUp = 2131427446; + // aapt resource value: 0x7f0c0076 + public const int scrollIndicatorUp = 2131492982; - // aapt resource value: 0x7f0b0077 - public const int scrollView = 2131427447; + // aapt resource value: 0x7f0c0077 + public const int scrollView = 2131492983; - // aapt resource value: 0x7f0b005d - public const int scrollable = 2131427421; + // aapt resource value: 0x7f0c005d + public const int scrollable = 2131492957; - // aapt resource value: 0x7f0b0091 - public const int search_badge = 2131427473; + // aapt resource value: 0x7f0c0091 + public const int search_badge = 2131493009; - // aapt resource value: 0x7f0b0090 - public const int search_bar = 2131427472; + // aapt resource value: 0x7f0c0090 + public const int search_bar = 2131493008; - // aapt resource value: 0x7f0b0092 - public const int search_button = 2131427474; + // aapt resource value: 0x7f0c0092 + public const int search_button = 2131493010; - // aapt resource value: 0x7f0b0097 - public const int search_close_btn = 2131427479; + // aapt resource value: 0x7f0c0097 + public const int search_close_btn = 2131493015; - // aapt resource value: 0x7f0b0093 - public const int search_edit_frame = 2131427475; + // aapt resource value: 0x7f0c0093 + public const int search_edit_frame = 2131493011; - // aapt resource value: 0x7f0b0099 - public const int search_go_btn = 2131427481; + // aapt resource value: 0x7f0c0099 + public const int search_go_btn = 2131493017; - // aapt resource value: 0x7f0b0094 - public const int search_mag_icon = 2131427476; + // aapt resource value: 0x7f0c0094 + public const int search_mag_icon = 2131493012; - // aapt resource value: 0x7f0b0095 - public const int search_plate = 2131427477; + // aapt resource value: 0x7f0c0095 + public const int search_plate = 2131493013; - // aapt resource value: 0x7f0b0096 - public const int search_src_text = 2131427478; + // aapt resource value: 0x7f0c0096 + public const int search_src_text = 2131493014; - // aapt resource value: 0x7f0b009a - public const int search_voice_btn = 2131427482; + // aapt resource value: 0x7f0c009a + public const int search_voice_btn = 2131493018; - // aapt resource value: 0x7f0b009b - public const int select_dialog_listview = 2131427483; + // aapt resource value: 0x7f0c009b + public const int select_dialog_listview = 2131493019; - // aapt resource value: 0x7f0b004f - public const int selected = 2131427407; + // aapt resource value: 0x7f0c004f + public const int selected = 2131492943; - // aapt resource value: 0x7f0b010b - public const int shellcontent_appbar = 2131427595; + // aapt resource value: 0x7f0c010b + public const int shellcontent_appbar = 2131493131; - // aapt resource value: 0x7f0b010d - public const int shellcontent_scrollview = 2131427597; + // aapt resource value: 0x7f0c010d + public const int shellcontent_scrollview = 2131493133; - // aapt resource value: 0x7f0b010c - public const int shellcontent_toolbar = 2131427596; + // aapt resource value: 0x7f0c010c + public const int shellcontent_toolbar = 2131493132; - // aapt resource value: 0x7f0b0083 - public const int shortcut = 2131427459; + // aapt resource value: 0x7f0c0083 + public const int shortcut = 2131492995; - // aapt resource value: 0x7f0b002a - public const int showCustom = 2131427370; + // aapt resource value: 0x7f0c002a + public const int showCustom = 2131492906; - // aapt resource value: 0x7f0b002b - public const int showHome = 2131427371; + // aapt resource value: 0x7f0c002b + public const int showHome = 2131492907; - // aapt resource value: 0x7f0b002c - public const int showTitle = 2131427372; + // aapt resource value: 0x7f0c002c + public const int showTitle = 2131492908; - // aapt resource value: 0x7f0b010e - public const int sliding_tabs = 2131427598; + // aapt resource value: 0x7f0c010e + public const int sliding_tabs = 2131493134; - // aapt resource value: 0x7f0b00af - public const int smallLabel = 2131427503; + // aapt resource value: 0x7f0c00af + public const int smallLabel = 2131493039; - // aapt resource value: 0x7f0b0016 - public const int snackbar_action = 2131427350; + // aapt resource value: 0x7f0c0016 + public const int snackbar_action = 2131492886; - // aapt resource value: 0x7f0b0017 - public const int snackbar_text = 2131427351; + // aapt resource value: 0x7f0c0017 + public const int snackbar_text = 2131492887; - // aapt resource value: 0x7f0b004a - public const int snap = 2131427402; + // aapt resource value: 0x7f0c004a + public const int snap = 2131492938; - // aapt resource value: 0x7f0b004b - public const int snapMargins = 2131427403; + // aapt resource value: 0x7f0c004b + public const int snapMargins = 2131492939; - // aapt resource value: 0x7f0b0073 - public const int spacer = 2131427443; + // aapt resource value: 0x7f0c0073 + public const int spacer = 2131492979; - // aapt resource value: 0x7f0b0008 - public const int split_action_bar = 2131427336; + // aapt resource value: 0x7f0c0008 + public const int split_action_bar = 2131492872; - // aapt resource value: 0x7f0b0031 - public const int src_atop = 2131427377; + // aapt resource value: 0x7f0c0031 + public const int src_atop = 2131492913; - // aapt resource value: 0x7f0b0032 - public const int src_in = 2131427378; + // aapt resource value: 0x7f0c0032 + public const int src_in = 2131492914; - // aapt resource value: 0x7f0b0033 - public const int src_over = 2131427379; + // aapt resource value: 0x7f0c0033 + public const int src_over = 2131492915; - // aapt resource value: 0x7f0b0056 - public const int start = 2131427414; + // aapt resource value: 0x7f0c0056 + public const int start = 2131492950; - // aapt resource value: 0x7f0b00f9 - public const int status_bar_latest_event_content = 2131427577; + // aapt resource value: 0x7f0c00f9 + public const int status_bar_latest_event_content = 2131493113; - // aapt resource value: 0x7f0b005b - public const int stretch = 2131427419; + // aapt resource value: 0x7f0c005b + public const int stretch = 2131492955; - // aapt resource value: 0x7f0b0084 - public const int submenuarrow = 2131427460; + // aapt resource value: 0x7f0c0084 + public const int submenuarrow = 2131492996; - // aapt resource value: 0x7f0b0098 - public const int submit_area = 2131427480; + // aapt resource value: 0x7f0c0098 + public const int submit_area = 2131493016; - // aapt resource value: 0x7f0b0026 - public const int tabMode = 2131427366; + // aapt resource value: 0x7f0c0026 + public const int tabMode = 2131492902; - // aapt resource value: 0x7f0b001e - public const int tag_transition_group = 2131427358; + // aapt resource value: 0x7f0c001e + public const int tag_transition_group = 2131492894; - // aapt resource value: 0x7f0b001f - public const int tag_unhandled_key_event_manager = 2131427359; + // aapt resource value: 0x7f0c001f + public const int tag_unhandled_key_event_manager = 2131492895; - // aapt resource value: 0x7f0b0020 - public const int tag_unhandled_key_listeners = 2131427360; + // aapt resource value: 0x7f0c0020 + public const int tag_unhandled_key_listeners = 2131492896; - // aapt resource value: 0x7f0b0021 - public const int text = 2131427361; + // aapt resource value: 0x7f0c0021 + public const int text = 2131492897; - // aapt resource value: 0x7f0b009d - public const int text1 = 2131427485; + // aapt resource value: 0x7f0c009d + public const int text1 = 2131493021; - // aapt resource value: 0x7f0b0022 - public const int text2 = 2131427362; + // aapt resource value: 0x7f0c0022 + public const int text2 = 2131492898; - // aapt resource value: 0x7f0b0079 - public const int textSpacerNoButtons = 2131427449; + // aapt resource value: 0x7f0c0079 + public const int textSpacerNoButtons = 2131492985; - // aapt resource value: 0x7f0b0078 - public const int textSpacerNoTitle = 2131427448; + // aapt resource value: 0x7f0c0078 + public const int textSpacerNoTitle = 2131492984; - // aapt resource value: 0x7f0b005a - public const int textStart = 2131427418; + // aapt resource value: 0x7f0c005a + public const int textStart = 2131492954; - // aapt resource value: 0x7f0b00ba - public const int text_input_password_toggle = 2131427514; + // aapt resource value: 0x7f0c00ba + public const int text_input_password_toggle = 2131493050; - // aapt resource value: 0x7f0b0018 - public const int textinput_counter = 2131427352; + // aapt resource value: 0x7f0c0018 + public const int textinput_counter = 2131492888; - // aapt resource value: 0x7f0b0019 - public const int textinput_error = 2131427353; + // aapt resource value: 0x7f0c0019 + public const int textinput_error = 2131492889; - // aapt resource value: 0x7f0b001a - public const int textinput_helper_text = 2131427354; + // aapt resource value: 0x7f0c001a + public const int textinput_helper_text = 2131492890; - // aapt resource value: 0x7f0b00ff - public const int time = 2131427583; + // aapt resource value: 0x7f0c00ff + public const int time = 2131493119; - // aapt resource value: 0x7f0b0023 - public const int title = 2131427363; + // aapt resource value: 0x7f0c0023 + public const int title = 2131492899; - // aapt resource value: 0x7f0b0080 - public const int titleDividerNoCustom = 2131427456; + // aapt resource value: 0x7f0c0080 + public const int titleDividerNoCustom = 2131492992; - // aapt resource value: 0x7f0b007e - public const int title_template = 2131427454; + // aapt resource value: 0x7f0c007e + public const int title_template = 2131492990; - // aapt resource value: 0x7f0b010f - public const int toolbar = 2131427599; + // aapt resource value: 0x7f0c010f + public const int toolbar = 2131493135; - // aapt resource value: 0x7f0b0045 - public const int top = 2131427397; + // aapt resource value: 0x7f0c0045 + public const int top = 2131492933; - // aapt resource value: 0x7f0b007d - public const int topPanel = 2131427453; + // aapt resource value: 0x7f0c007d + public const int topPanel = 2131492989; - // aapt resource value: 0x7f0b00b3 - public const int touch_outside = 2131427507; + // aapt resource value: 0x7f0c00b3 + public const int touch_outside = 2131493043; - // aapt resource value: 0x7f0b000f - public const int transition_current_scene = 2131427343; + // aapt resource value: 0x7f0c000f + public const int transition_current_scene = 2131492879; - // aapt resource value: 0x7f0b0010 - public const int transition_layout_save = 2131427344; + // aapt resource value: 0x7f0c0010 + public const int transition_layout_save = 2131492880; - // aapt resource value: 0x7f0b0011 - public const int transition_position = 2131427345; + // aapt resource value: 0x7f0c0011 + public const int transition_position = 2131492881; - // aapt resource value: 0x7f0b0012 - public const int transition_scene_layoutid_cache = 2131427346; + // aapt resource value: 0x7f0c0012 + public const int transition_scene_layoutid_cache = 2131492882; - // aapt resource value: 0x7f0b0013 - public const int transition_transform = 2131427347; + // aapt resource value: 0x7f0c0013 + public const int transition_transform = 2131492883; - // aapt resource value: 0x7f0b0034 - public const int uniform = 2131427380; + // aapt resource value: 0x7f0c0034 + public const int uniform = 2131492916; - // aapt resource value: 0x7f0b0050 - public const int unlabeled = 2131427408; + // aapt resource value: 0x7f0c0050 + public const int unlabeled = 2131492944; - // aapt resource value: 0x7f0b0009 - public const int up = 2131427337; + // aapt resource value: 0x7f0c0009 + public const int up = 2131492873; - // aapt resource value: 0x7f0b002d - public const int useLogo = 2131427373; + // aapt resource value: 0x7f0c002d + public const int useLogo = 2131492909; - // aapt resource value: 0x7f0b001b - public const int view_offset_helper = 2131427355; + // aapt resource value: 0x7f0c001b + public const int view_offset_helper = 2131492891; - // aapt resource value: 0x7f0b0111 - public const int visible = 2131427601; + // aapt resource value: 0x7f0c0111 + public const int visible = 2131493137; - // aapt resource value: 0x7f0b00e7 - public const int volume_item_container = 2131427559; + // aapt resource value: 0x7f0c00e7 + public const int volume_item_container = 2131493095; - // aapt resource value: 0x7f0b0043 - public const int withText = 2131427395; + // aapt resource value: 0x7f0c0043 + public const int withText = 2131492931; - // aapt resource value: 0x7f0b0035 - public const int wrap_content = 2131427381; + // aapt resource value: 0x7f0c0035 + public const int wrap_content = 2131492917; static Id() { @@ -9604,62 +9604,65 @@ namespace Bit.Droid public partial class Integer { - // aapt resource value: 0x7f0c0004 - public const int abc_config_activityDefaultDur = 2131492868; + // aapt resource value: 0x7f0a0005 + public const int abc_config_activityDefaultDur = 2131361797; - // aapt resource value: 0x7f0c0005 - public const int abc_config_activityShortDur = 2131492869; + // aapt resource value: 0x7f0a0006 + public const int abc_config_activityShortDur = 2131361798; - // aapt resource value: 0x7f0c0009 - public const int app_bar_elevation_anim_duration = 2131492873; + // aapt resource value: 0x7f0a000a + public const int app_bar_elevation_anim_duration = 2131361802; - // aapt resource value: 0x7f0c000a - public const int bottom_sheet_slide_duration = 2131492874; + // aapt resource value: 0x7f0a000b + public const int bottom_sheet_slide_duration = 2131361803; - // aapt resource value: 0x7f0c0006 - public const int cancel_button_image_alpha = 2131492870; + // aapt resource value: 0x7f0a0007 + public const int cancel_button_image_alpha = 2131361799; - // aapt resource value: 0x7f0c0007 - public const int config_tooltipAnimTime = 2131492871; + // aapt resource value: 0x7f0a0008 + public const int config_tooltipAnimTime = 2131361800; - // aapt resource value: 0x7f0c0008 - public const int design_snackbar_text_max_lines = 2131492872; + // aapt resource value: 0x7f0a0009 + public const int design_snackbar_text_max_lines = 2131361801; - // aapt resource value: 0x7f0c000b - public const int design_tab_indicator_anim_duration_ms = 2131492875; + // aapt resource value: 0x7f0a000c + public const int design_tab_indicator_anim_duration_ms = 2131361804; - // aapt resource value: 0x7f0c000c - public const int hide_password_duration = 2131492876; + // aapt resource value: 0x7f0a0000 + public const int google_play_services_version = 2131361792; - // aapt resource value: 0x7f0c0000 - public const int mr_controller_volume_group_list_animation_duration_ms = 2131492864; + // aapt resource value: 0x7f0a000d + public const int hide_password_duration = 2131361805; - // aapt resource value: 0x7f0c0001 - public const int mr_controller_volume_group_list_fade_in_duration_ms = 2131492865; + // aapt resource value: 0x7f0a0001 + public const int mr_controller_volume_group_list_animation_duration_ms = 2131361793; - // aapt resource value: 0x7f0c0002 - public const int mr_controller_volume_group_list_fade_out_duration_ms = 2131492866; + // aapt resource value: 0x7f0a0002 + public const int mr_controller_volume_group_list_fade_in_duration_ms = 2131361794; - // aapt resource value: 0x7f0c0003 - public const int mr_update_routes_delay_ms = 2131492867; + // aapt resource value: 0x7f0a0003 + public const int mr_controller_volume_group_list_fade_out_duration_ms = 2131361795; - // aapt resource value: 0x7f0c000d - public const int mtrl_btn_anim_delay_ms = 2131492877; + // aapt resource value: 0x7f0a0004 + public const int mr_update_routes_delay_ms = 2131361796; - // aapt resource value: 0x7f0c000e - public const int mtrl_btn_anim_duration_ms = 2131492878; + // aapt resource value: 0x7f0a000e + public const int mtrl_btn_anim_delay_ms = 2131361806; - // aapt resource value: 0x7f0c000f - public const int mtrl_chip_anim_duration = 2131492879; + // aapt resource value: 0x7f0a000f + public const int mtrl_btn_anim_duration_ms = 2131361807; - // aapt resource value: 0x7f0c0010 - public const int mtrl_tab_indicator_anim_duration_ms = 2131492880; + // aapt resource value: 0x7f0a0010 + public const int mtrl_chip_anim_duration = 2131361808; - // aapt resource value: 0x7f0c0011 - public const int show_password_duration = 2131492881; + // aapt resource value: 0x7f0a0011 + public const int mtrl_tab_indicator_anim_duration_ms = 2131361809; - // aapt resource value: 0x7f0c0012 - public const int status_bar_notification_info_maxnum = 2131492882; + // aapt resource value: 0x7f0a0012 + public const int show_password_duration = 2131361810; + + // aapt resource value: 0x7f0a0013 + public const int status_bar_notification_info_maxnum = 2131361811; static Integer() { @@ -10019,257 +10022,284 @@ namespace Bit.Droid public partial class String { - // aapt resource value: 0x7f090050 - public const int ApplicationName = 2131296336; + // aapt resource value: 0x7f090059 + public const int ApplicationName = 2131296345; - // aapt resource value: 0x7f090052 - public const int AutoFillServiceDescription = 2131296338; + // aapt resource value: 0x7f09005b + public const int AutoFillServiceDescription = 2131296347; - // aapt resource value: 0x7f090051 - public const int AutoFillServiceSummary = 2131296337; + // aapt resource value: 0x7f09005a + public const int AutoFillServiceSummary = 2131296346; - // aapt resource value: 0x7f09004f - public const int Hello = 2131296335; + // aapt resource value: 0x7f090058 + public const int Hello = 2131296344; - // aapt resource value: 0x7f090053 - public const int MyVault = 2131296339; - - // aapt resource value: 0x7f090019 - public const int abc_action_bar_home_description = 2131296281; - - // aapt resource value: 0x7f09001a - public const int abc_action_bar_up_description = 2131296282; - - // aapt resource value: 0x7f09001b - public const int abc_action_menu_overflow_description = 2131296283; - - // aapt resource value: 0x7f09001c - public const int abc_action_mode_done = 2131296284; - - // aapt resource value: 0x7f09001d - public const int abc_activity_chooser_view_see_all = 2131296285; - - // aapt resource value: 0x7f09001e - public const int abc_activitychooserview_choose_application = 2131296286; - - // aapt resource value: 0x7f09001f - public const int abc_capital_off = 2131296287; - - // aapt resource value: 0x7f090020 - public const int abc_capital_on = 2131296288; - - // aapt resource value: 0x7f090035 - public const int abc_font_family_body_1_material = 2131296309; - - // aapt resource value: 0x7f090036 - public const int abc_font_family_body_2_material = 2131296310; - - // aapt resource value: 0x7f090037 - public const int abc_font_family_button_material = 2131296311; - - // aapt resource value: 0x7f090038 - public const int abc_font_family_caption_material = 2131296312; - - // aapt resource value: 0x7f090039 - public const int abc_font_family_display_1_material = 2131296313; - - // aapt resource value: 0x7f09003a - public const int abc_font_family_display_2_material = 2131296314; - - // aapt resource value: 0x7f09003b - public const int abc_font_family_display_3_material = 2131296315; - - // aapt resource value: 0x7f09003c - public const int abc_font_family_display_4_material = 2131296316; - - // aapt resource value: 0x7f09003d - public const int abc_font_family_headline_material = 2131296317; - - // aapt resource value: 0x7f09003e - public const int abc_font_family_menu_material = 2131296318; - - // aapt resource value: 0x7f09003f - public const int abc_font_family_subhead_material = 2131296319; - - // aapt resource value: 0x7f090040 - public const int abc_font_family_title_material = 2131296320; - - // aapt resource value: 0x7f090021 - public const int abc_menu_alt_shortcut_label = 2131296289; + // aapt resource value: 0x7f09005c + public const int MyVault = 2131296348; // aapt resource value: 0x7f090022 - public const int abc_menu_ctrl_shortcut_label = 2131296290; + public const int abc_action_bar_home_description = 2131296290; // aapt resource value: 0x7f090023 - public const int abc_menu_delete_shortcut_label = 2131296291; + public const int abc_action_bar_up_description = 2131296291; // aapt resource value: 0x7f090024 - public const int abc_menu_enter_shortcut_label = 2131296292; + public const int abc_action_menu_overflow_description = 2131296292; // aapt resource value: 0x7f090025 - public const int abc_menu_function_shortcut_label = 2131296293; + public const int abc_action_mode_done = 2131296293; // aapt resource value: 0x7f090026 - public const int abc_menu_meta_shortcut_label = 2131296294; + public const int abc_activity_chooser_view_see_all = 2131296294; // aapt resource value: 0x7f090027 - public const int abc_menu_shift_shortcut_label = 2131296295; + public const int abc_activitychooserview_choose_application = 2131296295; // aapt resource value: 0x7f090028 - public const int abc_menu_space_shortcut_label = 2131296296; + public const int abc_capital_off = 2131296296; // aapt resource value: 0x7f090029 - public const int abc_menu_sym_shortcut_label = 2131296297; + public const int abc_capital_on = 2131296297; - // aapt resource value: 0x7f09002a - public const int abc_prepend_shortcut_label = 2131296298; + // aapt resource value: 0x7f09003e + public const int abc_font_family_body_1_material = 2131296318; - // aapt resource value: 0x7f09002b - public const int abc_search_hint = 2131296299; + // aapt resource value: 0x7f09003f + public const int abc_font_family_body_2_material = 2131296319; - // aapt resource value: 0x7f09002c - public const int abc_searchview_description_clear = 2131296300; - - // aapt resource value: 0x7f09002d - public const int abc_searchview_description_query = 2131296301; - - // aapt resource value: 0x7f09002e - public const int abc_searchview_description_search = 2131296302; - - // aapt resource value: 0x7f09002f - public const int abc_searchview_description_submit = 2131296303; - - // aapt resource value: 0x7f090030 - public const int abc_searchview_description_voice = 2131296304; - - // aapt resource value: 0x7f090031 - public const int abc_shareactionprovider_share_with = 2131296305; - - // aapt resource value: 0x7f090032 - public const int abc_shareactionprovider_share_with_application = 2131296306; - - // aapt resource value: 0x7f090033 - public const int abc_toolbar_collapse_description = 2131296307; + // aapt resource value: 0x7f090040 + public const int abc_font_family_button_material = 2131296320; // aapt resource value: 0x7f090041 - public const int appbar_scrolling_view_behavior = 2131296321; + public const int abc_font_family_caption_material = 2131296321; // aapt resource value: 0x7f090042 - public const int bottom_sheet_behavior = 2131296322; + public const int abc_font_family_display_1_material = 2131296322; // aapt resource value: 0x7f090043 - public const int character_counter_content_description = 2131296323; + public const int abc_font_family_display_2_material = 2131296323; // aapt resource value: 0x7f090044 - public const int character_counter_pattern = 2131296324; + public const int abc_font_family_display_3_material = 2131296324; // aapt resource value: 0x7f090045 - public const int fab_transformation_scrim_behavior = 2131296325; + public const int abc_font_family_display_4_material = 2131296325; // aapt resource value: 0x7f090046 - public const int fab_transformation_sheet_behavior = 2131296326; + public const int abc_font_family_headline_material = 2131296326; // aapt resource value: 0x7f090047 - public const int hide_bottom_view_on_scroll_behavior = 2131296327; - - // aapt resource value: 0x7f090000 - public const int library_name = 2131296256; - - // aapt resource value: 0x7f090001 - public const int mr_button_content_description = 2131296257; - - // aapt resource value: 0x7f090002 - public const int mr_cast_button_connected = 2131296258; - - // aapt resource value: 0x7f090003 - public const int mr_cast_button_connecting = 2131296259; - - // aapt resource value: 0x7f090004 - public const int mr_cast_button_disconnected = 2131296260; - - // aapt resource value: 0x7f090016 - public const int mr_cast_dialog_title_view_placeholder = 2131296278; - - // aapt resource value: 0x7f090005 - public const int mr_chooser_searching = 2131296261; - - // aapt resource value: 0x7f090006 - public const int mr_chooser_title = 2131296262; - - // aapt resource value: 0x7f090007 - public const int mr_controller_album_art = 2131296263; - - // aapt resource value: 0x7f090008 - public const int mr_controller_casting_screen = 2131296264; - - // aapt resource value: 0x7f090009 - public const int mr_controller_close_description = 2131296265; - - // aapt resource value: 0x7f09000a - public const int mr_controller_collapse_group = 2131296266; - - // aapt resource value: 0x7f09000b - public const int mr_controller_disconnect = 2131296267; - - // aapt resource value: 0x7f09000c - public const int mr_controller_expand_group = 2131296268; - - // aapt resource value: 0x7f09000d - public const int mr_controller_no_info_available = 2131296269; - - // aapt resource value: 0x7f09000e - public const int mr_controller_no_media_selected = 2131296270; - - // aapt resource value: 0x7f09000f - public const int mr_controller_pause = 2131296271; - - // aapt resource value: 0x7f090010 - public const int mr_controller_play = 2131296272; - - // aapt resource value: 0x7f090011 - public const int mr_controller_stop = 2131296273; - - // aapt resource value: 0x7f090012 - public const int mr_controller_stop_casting = 2131296274; - - // aapt resource value: 0x7f090013 - public const int mr_controller_volume_slider = 2131296275; - - // aapt resource value: 0x7f090017 - public const int mr_dialog_device_header = 2131296279; - - // aapt resource value: 0x7f090018 - public const int mr_dialog_route_header = 2131296280; - - // aapt resource value: 0x7f090014 - public const int mr_system_route_name = 2131296276; - - // aapt resource value: 0x7f090015 - public const int mr_user_route_category_name = 2131296277; + public const int abc_font_family_menu_material = 2131296327; // aapt resource value: 0x7f090048 - public const int mtrl_chip_close_icon_content_description = 2131296328; + public const int abc_font_family_subhead_material = 2131296328; // aapt resource value: 0x7f090049 - public const int password_toggle_content_description = 2131296329; + public const int abc_font_family_title_material = 2131296329; - // aapt resource value: 0x7f09004a - public const int path_password_eye = 2131296330; + // aapt resource value: 0x7f09002a + public const int abc_menu_alt_shortcut_label = 2131296298; - // aapt resource value: 0x7f09004b - public const int path_password_eye_mask_strike_through = 2131296331; + // aapt resource value: 0x7f09002b + public const int abc_menu_ctrl_shortcut_label = 2131296299; - // aapt resource value: 0x7f09004c - public const int path_password_eye_mask_visible = 2131296332; + // aapt resource value: 0x7f09002c + public const int abc_menu_delete_shortcut_label = 2131296300; - // aapt resource value: 0x7f09004d - public const int path_password_strike_through = 2131296333; + // aapt resource value: 0x7f09002d + public const int abc_menu_enter_shortcut_label = 2131296301; + + // aapt resource value: 0x7f09002e + public const int abc_menu_function_shortcut_label = 2131296302; + + // aapt resource value: 0x7f09002f + public const int abc_menu_meta_shortcut_label = 2131296303; + + // aapt resource value: 0x7f090030 + public const int abc_menu_shift_shortcut_label = 2131296304; + + // aapt resource value: 0x7f090031 + public const int abc_menu_space_shortcut_label = 2131296305; + + // aapt resource value: 0x7f090032 + public const int abc_menu_sym_shortcut_label = 2131296306; + + // aapt resource value: 0x7f090033 + public const int abc_prepend_shortcut_label = 2131296307; // aapt resource value: 0x7f090034 - public const int search_menu_title = 2131296308; + public const int abc_search_hint = 2131296308; + + // aapt resource value: 0x7f090035 + public const int abc_searchview_description_clear = 2131296309; + + // aapt resource value: 0x7f090036 + public const int abc_searchview_description_query = 2131296310; + + // aapt resource value: 0x7f090037 + public const int abc_searchview_description_search = 2131296311; + + // aapt resource value: 0x7f090038 + public const int abc_searchview_description_submit = 2131296312; + + // aapt resource value: 0x7f090039 + public const int abc_searchview_description_voice = 2131296313; + + // aapt resource value: 0x7f09003a + public const int abc_shareactionprovider_share_with = 2131296314; + + // aapt resource value: 0x7f09003b + public const int abc_shareactionprovider_share_with_application = 2131296315; + + // aapt resource value: 0x7f09003c + public const int abc_toolbar_collapse_description = 2131296316; + + // aapt resource value: 0x7f09004a + public const int appbar_scrolling_view_behavior = 2131296330; + + // aapt resource value: 0x7f09004b + public const int bottom_sheet_behavior = 2131296331; + + // aapt resource value: 0x7f09004c + public const int character_counter_content_description = 2131296332; + + // aapt resource value: 0x7f09004d + public const int character_counter_pattern = 2131296333; + + // aapt resource value: 0x7f090008 + public const int common_google_play_services_unknown_issue = 2131296264; + + // aapt resource value: 0x7f090002 + public const int default_web_client_id = 2131296258; // aapt resource value: 0x7f09004e - public const int status_bar_notification_info_overflow = 2131296334; + public const int fab_transformation_scrim_behavior = 2131296334; + + // aapt resource value: 0x7f09004f + public const int fab_transformation_sheet_behavior = 2131296335; + + // aapt resource value: 0x7f090009 + public const int fcm_fallback_notification_channel_label = 2131296265; + + // aapt resource value: 0x7f090003 + public const int firebase_database_url = 2131296259; + + // aapt resource value: 0x7f090000 + public const int gcm_defaultSenderId = 2131296256; + + // aapt resource value: 0x7f090004 + public const int google_api_key = 2131296260; + + // aapt resource value: 0x7f090001 + public const int google_app_id = 2131296257; + + // aapt resource value: 0x7f090005 + public const int google_crash_reporting_api_key = 2131296261; + + // aapt resource value: 0x7f090006 + public const int google_storage_bucket = 2131296262; + + // aapt resource value: 0x7f090050 + public const int hide_bottom_view_on_scroll_behavior = 2131296336; + + // aapt resource value: 0x7f090007 + public const int library_name = 2131296263; + + // aapt resource value: 0x7f09000a + public const int mr_button_content_description = 2131296266; + + // aapt resource value: 0x7f09000b + public const int mr_cast_button_connected = 2131296267; + + // aapt resource value: 0x7f09000c + public const int mr_cast_button_connecting = 2131296268; + + // aapt resource value: 0x7f09000d + public const int mr_cast_button_disconnected = 2131296269; + + // aapt resource value: 0x7f09001f + public const int mr_cast_dialog_title_view_placeholder = 2131296287; + + // aapt resource value: 0x7f09000e + public const int mr_chooser_searching = 2131296270; + + // aapt resource value: 0x7f09000f + public const int mr_chooser_title = 2131296271; + + // aapt resource value: 0x7f090010 + public const int mr_controller_album_art = 2131296272; + + // aapt resource value: 0x7f090011 + public const int mr_controller_casting_screen = 2131296273; + + // aapt resource value: 0x7f090012 + public const int mr_controller_close_description = 2131296274; + + // aapt resource value: 0x7f090013 + public const int mr_controller_collapse_group = 2131296275; + + // aapt resource value: 0x7f090014 + public const int mr_controller_disconnect = 2131296276; + + // aapt resource value: 0x7f090015 + public const int mr_controller_expand_group = 2131296277; + + // aapt resource value: 0x7f090016 + public const int mr_controller_no_info_available = 2131296278; + + // aapt resource value: 0x7f090017 + public const int mr_controller_no_media_selected = 2131296279; + + // aapt resource value: 0x7f090018 + public const int mr_controller_pause = 2131296280; + + // aapt resource value: 0x7f090019 + public const int mr_controller_play = 2131296281; + + // aapt resource value: 0x7f09001a + public const int mr_controller_stop = 2131296282; + + // aapt resource value: 0x7f09001b + public const int mr_controller_stop_casting = 2131296283; + + // aapt resource value: 0x7f09001c + public const int mr_controller_volume_slider = 2131296284; + + // aapt resource value: 0x7f090020 + public const int mr_dialog_device_header = 2131296288; + + // aapt resource value: 0x7f090021 + public const int mr_dialog_route_header = 2131296289; + + // aapt resource value: 0x7f09001d + public const int mr_system_route_name = 2131296285; + + // aapt resource value: 0x7f09001e + public const int mr_user_route_category_name = 2131296286; + + // aapt resource value: 0x7f090051 + public const int mtrl_chip_close_icon_content_description = 2131296337; + + // aapt resource value: 0x7f090052 + public const int password_toggle_content_description = 2131296338; + + // aapt resource value: 0x7f090053 + public const int path_password_eye = 2131296339; + + // aapt resource value: 0x7f090054 + public const int path_password_eye_mask_strike_through = 2131296340; + + // aapt resource value: 0x7f090055 + public const int path_password_eye_mask_visible = 2131296341; + + // aapt resource value: 0x7f090056 + public const int path_password_strike_through = 2131296342; + + // aapt resource value: 0x7f09003d + public const int search_menu_title = 2131296317; + + // aapt resource value: 0x7f090057 + public const int status_bar_notification_info_overflow = 2131296343; static String() { diff --git a/src/Android/Services/AndroidPushNotificationService.cs b/src/Android/Services/AndroidPushNotificationService.cs new file mode 100644 index 000000000..5b536c5cd --- /dev/null +++ b/src/Android/Services/AndroidPushNotificationService.cs @@ -0,0 +1,50 @@ +#if !FDROID +using System; +using System.Threading.Tasks; +using Bit.App.Abstractions; +using Bit.Core; +using Bit.Core.Abstractions; +using Xamarin.Forms; + +namespace Bit.Droid.Services +{ + public class AndroidPushNotificationService : IPushNotificationService + { + private readonly IStorageService _storageService; + private readonly IPushNotificationListenerService _pushNotificationListenerService; + + public AndroidPushNotificationService( + IStorageService storageService, + IPushNotificationListenerService pushNotificationListenerService) + { + _storageService = storageService; + _pushNotificationListenerService = pushNotificationListenerService; + } + + public async Task GetTokenAsync() + { + return await _storageService.GetAsync(Constants.PushCurrentTokenKey); + } + + public async Task RegisterAsync() + { + var registeredToken = await _storageService.GetAsync(Constants.PushRegisteredTokenKey); + var currentToken = await GetTokenAsync(); + if(!string.IsNullOrWhiteSpace(registeredToken) && registeredToken != currentToken) + { + await _pushNotificationListenerService.OnRegisteredAsync(registeredToken, Device.Android); + } + else + { + await _storageService.SaveAsync(Constants.PushLastRegistrationDateKey, DateTime.UtcNow); + } + } + + public Task UnregisterAsync() + { + // Do we ever need to unregister? + return Task.FromResult(0); + } + } +} +#endif diff --git a/src/Android/ci-build-apks.ps1 b/src/Android/ci-build-apks.ps1 new file mode 100644 index 000000000..7c8057fb0 --- /dev/null +++ b/src/Android/ci-build-apks.ps1 @@ -0,0 +1,87 @@ +$rootPath = $env:APPVEYOR_BUILD_FOLDER; + +$androidPath = $($rootPath + "\src\Android\Android.csproj"); +$appPath = $($rootPath + "\src\App\App.csproj"); + +echo "##### Increment Version" + +$androidManifest = $($rootPath + "\src\Android\Properties\AndroidManifest.xml"); + +$xml=New-Object XML; +$xml.Load($androidManifest); + +$node=$xml.SelectNodes("/manifest"); +$node.SetAttribute("android:versionCode", $env:APPVEYOR_BUILD_NUMBER); + +$xml.Save($androidManifest); + +echo "##### Decrypt Keystore" + +$encKeystorePath = $($rootPath + "\src\Android\8bit.keystore.enc"); +$secureFilePath = $($rootPath + "\secure-file\tools\secure-file.exe"); + +Invoke-Expression "& `"$secureFilePath`" -decrypt $($encKeystorePath) -secret $($env:keystore_dec_secret)" + +echo "##### Sign Release Configuration" + +msbuild "$($androidPath)" "/t:SignAndroidPackage" "/p:Configuration=Release" "/p:AndroidKeyStore=true" "/p:AndroidSigningKeyAlias=bitwarden" "/p:AndroidSigningKeyPass=$($env:keystore_password)" "/p:AndroidSigningKeyStore=8bit.keystore" "/p:AndroidSigningStorePass=$($env:keystore_password)" "/v:quiet" + +echo "##### Copy Release apk to project root" + +$signedApkPath = $($rootPath + "\src\Android\bin\Release\com.x8bit.bitwarden-Signed.apk"); +$signedApkDestPath = $($rootPath + "\com.x8bit.bitwarden-" + $env:APPVEYOR_BUILD_NUMBER + ".apk"); + +Copy-Item $signedApkPath $signedApkDestPath + +echo "##### Clean Android and App" + +msbuild "$($androidPath)" "/t:Clean" "/p:Configuration=FDroid" +msbuild "$($appPath)" "/t:Clean" "/p:Configuration=FDroid" + +echo "##### Backup project files" + +Copy-Item $androidPath $($androidPath + ".original"); +Copy-Item $appPath $($appPath + ".original"); + +echo "##### Uninstall from Android.csproj" + +$xml=New-Object XML; +$xml.Load($androidPath); + +$ns=New-Object System.Xml.XmlNamespaceManager($xml.NameTable); +$ns.AddNamespace("ns", $xml.DocumentElement.NamespaceURI); + +$firebaseNode=$xml.SelectSingleNode("/ns:Project/ns:ItemGroup/ns:PackageReference[@Include='Xamarin.Firebase.Messaging']", $ns); +$firebaseNode.ParentNode.RemoveChild($firebaseNode); + +$xml.Save($androidPath); + +echo "##### Uninstall from App.csproj" + +$xml=New-Object XML; +$xml.Load($appPath); + +$hockeyNode=$xml.SelectSingleNode("/Project/ItemGroup/PackageReference[@Include='HockeySDK.Xamarin']"); +$hockeyNode.ParentNode.RemoveChild($hockeyNode); + +$xml.Save($appPath); + +echo "##### Restore NuGet" + +$nugetPath = $($rootPath + "\nuget.exe"); + +Invoke-Expression "& `"$nugetPath`" restore" + +echo "##### Build and Sign FDroid Configuration" + +msbuild "$($androidPath)" "/logger:C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" "/p:Configuration=FDroid" +msbuild "$($androidPath)" "/t:SignAndroidPackage" "/p:Configuration=FDroid" "/p:AndroidKeyStore=true" "/p:AndroidSigningKeyAlias=bitwarden" "/p:AndroidSigningKeyPass=$($env:keystore_password)" "/p:AndroidSigningKeyStore=8bit.keystore" "/p:AndroidSigningStorePass=$($env:keystore_password)" "/v:quiet" + +echo "##### Copy FDroid apk to project root" + +$signedApkPath = $($rootPath + "\src\Android\bin\FDroid\com.x8bit.bitwarden-Signed.apk"); +$signedApkDestPath = $($rootPath + "\com.x8bit.bitwarden-fdroid-" + $env:APPVEYOR_BUILD_NUMBER + ".apk"); + +Copy-Item $signedApkPath $signedApkDestPath + +echo "##### Done" diff --git a/src/Android/google-services.json b/src/Android/google-services.json new file mode 100644 index 000000000..5e12a62b9 --- /dev/null +++ b/src/Android/google-services.json @@ -0,0 +1,42 @@ +{ + "project_info": { + "project_number": "1093287226212", + "firebase_url": "https://bitwarden-dev.firebaseio.com", + "project_id": "bitwarden-dev", + "storage_bucket": "bitwarden-dev.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:1093287226212:android:f8d67b786db1b844", + "android_client_info": { + "package_name": "com.x8bit.bitwarden" + } + }, + "oauth_client": [ + { + "client_id": "1093287226212-m4mv8ho387tdgosc9lsltnmruul7ouo0.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyA4Xkn0do7Ky_OLff2L_7MXeNK6s-JVgXg" + } + ], + "services": { + "analytics_service": { + "status": 1 + }, + "appinvite_service": { + "status": 1, + "other_platform_oauth_client": [] + }, + "ads_service": { + "status": 2 + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/src/Android/google-services.json.enc b/src/Android/google-services.json.enc new file mode 100644 index 0000000000000000000000000000000000000000..1a4c873cb3eaa40e90d153557964bfc3d436dd06 GIT binary patch literal 1520 zcmVqq9V zs|a#u9+C{3696l+i**x*K7bm&yWC)q~WgeJ^i{hF`-*Og4Zd$};Y7Y>mx+un%fj$wv(k~?It`qu&8%rX>I)x8KsL z^Dw^Bag9CJ+SlNx^LFq{$7QH~`utl7rBi)^1ARRk4^NcND)NhQ8$DHw0uIv3?`kTt zfw-@lYgPdD-Is#}^M^)Yu;f#ll{}+h==*xPa9F;wN^0!Zb)*!~)No0D*z@l@q_W~c zi=t3WM($I_!uz*yxXK^&xK_kyzzKZ6l+lVhsrR0PC4M5JkBWy1_QjP|#&{!aW@a78 za;;72i&fh7sRTEtk)*V|Cr;)HK^M&$zu{8h)NDRfIV`Nx=tJO%z3UP-jm84j2nI>J z+Lq8ph5upI&k51#i*fWI>EgxbvEKMwHmKfT+OGjiIib~3c>hZhvu4j5^+?EwGNN7s z!!J0ieF}$u&`w}7QB&?p?ZO)q|5ow9feh=5z=puXjbXm3oRQB6U)6AmnAe@qH@CDC z8nJayYfiWe&XV~p?wJ$G%fwwFJ<7$BX?=+g8F|~|BtF|CCnMd~4HjTC-(1kjy6JW+ zNkEvJBFj1<+(@;S!7cJ6(&fx#W1psF2K*_}&uPVQ;(&Lc@Z0Los7bKKWqR^bN8MAt zZP&=1%e#Abg#j~LP1!?etUvn@Ma9z+fcP$zm3chuHDr)*JHuwk7S`h>UywC4Px<~N zIgfc^EMijOn4ytrZHGr%PHCk4T}tRf2kMjL0D@z{v>%7@fM=hvN74i2R7xAd zi!@0saIdoc<3Ea&7evMzoLS*r-<46;dl0vYoMlr@!kP`6)FI=@m&*H%hLlv|kf8`i zm%Vog9pjy5M4jKaMnGbLT)oUzg|P_}MGM5Xh#I6a^ZCe*2O_&c_`7EiZW*JFhtm3E zMb{J_BIBCPL=cx!(0eYIwWj^qne1f{&5EPV!J(t2_|llMy&D5h_k|cf z`-CrpX>Yra#P`V0ZQ(k)nPyfxyc9B|smQAnJ#K@5gk`9UAY(`c6Q+o9gv1kAu9p<4{JTR?%}iKJ zJVd^VMLQWfvvZ%nC90D1rf@=(f9_u;o0#DTD3M@M%|i`c2PbJ`;-$5vLbaEDW2DxC zC44RqCzY8w`*jJE2YhT|EHu~s>+T$}Qb5uN9YBYLd6^ocEhveWXBWnC9w+oR4!n#5 W%oTRMS0swMf}@jzO6)2#JjYK>R02H! literal 0 HcmV?d00001 diff --git a/src/App/Abstractions/IPushNotificationListenerService.cs b/src/App/Abstractions/IPushNotificationListenerService.cs new file mode 100644 index 000000000..65104a1c9 --- /dev/null +++ b/src/App/Abstractions/IPushNotificationListenerService.cs @@ -0,0 +1,14 @@ +using Newtonsoft.Json.Linq; +using System.Threading.Tasks; + +namespace Bit.App.Abstractions +{ + public interface IPushNotificationListenerService + { + Task OnMessageAsync(JObject values, string device); + Task OnRegisteredAsync(string token, string device); + void OnUnregistered(string device); + void OnError(string message, string device); + bool ShouldShowNotification(); + } +} diff --git a/src/App/Abstractions/IPushNotificationService.cs b/src/App/Abstractions/IPushNotificationService.cs new file mode 100644 index 000000000..ae227f292 --- /dev/null +++ b/src/App/Abstractions/IPushNotificationService.cs @@ -0,0 +1,11 @@ +using System.Threading.Tasks; + +namespace Bit.App.Abstractions +{ + public interface IPushNotificationService + { + Task GetTokenAsync(); + Task RegisterAsync(); + Task UnregisterAsync(); + } +} diff --git a/src/App/Pages/Vault/GroupingsPage/GroupingsPage.xaml.cs b/src/App/Pages/Vault/GroupingsPage/GroupingsPage.xaml.cs index 3df964d9e..9053f02f6 100644 --- a/src/App/Pages/Vault/GroupingsPage/GroupingsPage.xaml.cs +++ b/src/App/Pages/Vault/GroupingsPage/GroupingsPage.xaml.cs @@ -1,4 +1,6 @@ -using Bit.App.Resources; +using Bit.App.Abstractions; +using Bit.App.Resources; +using Bit.Core; using Bit.Core.Abstractions; using Bit.Core.Enums; using Bit.Core.Utilities; @@ -12,6 +14,8 @@ namespace Bit.App.Pages { private readonly IBroadcasterService _broadcasterService; private readonly ISyncService _syncService; + private readonly IPushNotificationService _pushNotificationService; + private readonly IStorageService _storageService; private readonly GroupingsPageViewModel _vm; private readonly string _pageName; @@ -23,6 +27,8 @@ namespace Bit.App.Pages SetActivityIndicator(_mainContent); _broadcasterService = ServiceContainer.Resolve("broadcasterService"); _syncService = ServiceContainer.Resolve("syncService"); + _pushNotificationService = ServiceContainer.Resolve("pushNotificationService"); + _storageService = ServiceContainer.Resolve("storageService"); _vm = BindingContext as GroupingsPageViewModel; _vm.Page = this; _vm.MainPage = mainPage; @@ -71,6 +77,30 @@ namespace Bit.App.Pages } } }, _mainContent); + + // Push registration + var lastPushRegistration = await _storageService.GetAsync(Constants.PushLastRegistrationDateKey); + lastPushRegistration = lastPushRegistration.GetValueOrDefault(DateTime.MinValue); + if(Device.RuntimePlatform == Device.iOS) + { + var pushPromptShow = await _storageService.GetAsync(Constants.PushInitialPromptShownKey); + if(!pushPromptShow.GetValueOrDefault(false)) + { + await _storageService.SaveAsync(Constants.PushInitialPromptShownKey, true); + await DisplayAlert(AppResources.EnableAutomaticSyncing, AppResources.PushNotificationAlert, + AppResources.OkGotIt); + } + if(!pushPromptShow.GetValueOrDefault(false) || + DateTime.UtcNow - lastPushRegistration > TimeSpan.FromDays(1)) + { + await _pushNotificationService.RegisterAsync(); + } + } + else if(Device.RuntimePlatform == Device.Android && + DateTime.UtcNow - lastPushRegistration > TimeSpan.FromDays(1)) + { + await _pushNotificationService.RegisterAsync(); + } } protected override void OnDisappearing() diff --git a/src/App/Services/NoopPushNotificationListenerService.cs b/src/App/Services/NoopPushNotificationListenerService.cs new file mode 100644 index 000000000..7bb42b424 --- /dev/null +++ b/src/App/Services/NoopPushNotificationListenerService.cs @@ -0,0 +1,32 @@ +using Newtonsoft.Json.Linq; +using Bit.App.Abstractions; +using System.Threading.Tasks; + +namespace Bit.App.Services +{ + public class NoopPushNotificationListenerService : IPushNotificationListenerService + { + public Task OnMessageAsync(JObject value, string deviceType) + { + return Task.FromResult(0); + } + + public Task OnRegisteredAsync(string token, string deviceType) + { + return Task.FromResult(0); + } + + public void OnUnregistered(string deviceType) + { + } + + public void OnError(string message, string deviceType) + { + } + + public bool ShouldShowNotification() + { + return false; + } + } +} diff --git a/src/App/Services/NoopPushNotificationService.cs b/src/App/Services/NoopPushNotificationService.cs new file mode 100644 index 000000000..edf501a73 --- /dev/null +++ b/src/App/Services/NoopPushNotificationService.cs @@ -0,0 +1,23 @@ +using System.Threading.Tasks; +using Bit.App.Abstractions; + +namespace Bit.App.Services +{ + public class NoopPushNotificationService : IPushNotificationService + { + public Task GetTokenAsync() + { + return Task.FromResult(null as string); + } + + public Task RegisterAsync() + { + return Task.FromResult(0); + } + + public Task UnregisterAsync() + { + return Task.FromResult(0); + } + } +} diff --git a/src/App/Services/PushNotificationListenerService.cs b/src/App/Services/PushNotificationListenerService.cs new file mode 100644 index 000000000..c06abc84e --- /dev/null +++ b/src/App/Services/PushNotificationListenerService.cs @@ -0,0 +1,187 @@ +#if !FDROID +using System.Diagnostics; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using Bit.App.Abstractions; +using System; +using Xamarin.Forms; +using Bit.Core.Abstractions; +using Bit.Core.Utilities; +using System.Threading.Tasks; +using Bit.Core.Enums; +using Bit.Core; +using Bit.Core.Models.Response; +using Bit.Core.Exceptions; + +namespace Bit.App.Services +{ + public class PushNotificationListenerService : IPushNotificationListenerService + { + private bool _showNotification; + private bool _resolved; + private IStorageService _storageService; + private ISyncService _syncService; + private IUserService _userService; + private IAppIdService _appIdService; + private IApiService _apiService; + private IMessagingService _messagingService; + + public async Task OnMessageAsync(JObject value, string deviceType) + { + Resolve(); + if(value == null) + { + return; + } + + _showNotification = false; + Debug.WriteLine("Message Arrived: {0}", JsonConvert.SerializeObject(value)); + + NotificationResponse notification = null; + if(deviceType == Device.Android) + { + notification = value.ToObject(); + } + else + { + if(!value.TryGetValue("data", StringComparison.OrdinalIgnoreCase, out JToken dataToken) || + dataToken == null) + { + return; + } + notification = dataToken.ToObject(); + } + + var appId = await _appIdService.GetAppIdAsync(); + if(notification?.Payload == null || notification.ContextId == appId) + { + return; + } + + var myUserId = await _userService.GetUserIdAsync(); + var isAuthenticated = await _userService.IsAuthenticatedAsync(); + switch(notification.Type) + { + case NotificationType.SyncCipherUpdate: + case NotificationType.SyncCipherCreate: + var cipherCreateUpdateMessage = JsonConvert.DeserializeObject( + notification.Payload); + if(isAuthenticated && cipherCreateUpdateMessage.UserId == myUserId) + { + await _syncService.SyncUpsertCipherAsync(cipherCreateUpdateMessage, + notification.Type == NotificationType.SyncCipherUpdate); + } + break; + case NotificationType.SyncFolderUpdate: + case NotificationType.SyncFolderCreate: + var folderCreateUpdateMessage = JsonConvert.DeserializeObject( + notification.Payload); + if(isAuthenticated && folderCreateUpdateMessage.UserId == myUserId) + { + await _syncService.SyncUpsertFolderAsync(folderCreateUpdateMessage, + notification.Type == NotificationType.SyncFolderUpdate); + } + break; + case NotificationType.SyncLoginDelete: + case NotificationType.SyncCipherDelete: + var loginDeleteMessage = JsonConvert.DeserializeObject( + notification.Payload); + if(isAuthenticated && loginDeleteMessage.UserId == myUserId) + { + await _syncService.SyncDeleteCipherAsync(loginDeleteMessage); + } + break; + case NotificationType.SyncFolderDelete: + var folderDeleteMessage = JsonConvert.DeserializeObject( + notification.Payload); + if(isAuthenticated && folderDeleteMessage.UserId == myUserId) + { + await _syncService.SyncDeleteFolderAsync(folderDeleteMessage); + } + break; + case NotificationType.SyncCiphers: + case NotificationType.SyncVault: + case NotificationType.SyncSettings: + if(isAuthenticated) + { + await _syncService.FullSyncAsync(false); + } + break; + case NotificationType.SyncOrgKeys: + if(isAuthenticated) + { + await _apiService.RefreshIdentityTokenAsync(); + await _syncService.FullSyncAsync(true); + } + break; + case NotificationType.LogOut: + if(isAuthenticated) + { + _messagingService.Send("logout"); + } + break; + default: + break; + } + } + + public async Task OnRegisteredAsync(string token, string deviceType) + { + Resolve(); + Debug.WriteLine(string.Format("Push Notification - Device Registered - Token : {0}", token)); + var isAuthenticated = await _userService.IsAuthenticatedAsync(); + if(!isAuthenticated) + { + return; + } + + var appId = await _appIdService.GetAppIdAsync(); + try + { + await _apiService.PutDeviceTokenAsync(appId, + new Core.Models.Request.DeviceTokenRequest { PushToken = token }); + Debug.WriteLine("Registered device with server."); + await _storageService.SaveAsync(Constants.PushLastRegistrationDateKey, DateTime.UtcNow); + if(deviceType == Device.Android) + { + await _storageService.SaveAsync(Constants.PushCurrentTokenKey, token); + } + } + catch(ApiException) + { + Debug.WriteLine("Failed to register device."); + } + } + + public void OnUnregistered(string deviceType) + { + Debug.WriteLine("Push Notification - Device Unnregistered"); + } + + public void OnError(string message, string deviceType) + { + Debug.WriteLine(string.Format("Push notification error - {0}", message)); + } + + public bool ShouldShowNotification() + { + return _showNotification; + } + + private void Resolve() + { + if(_resolved) + { + return; + } + _storageService = ServiceContainer.Resolve("storageService"); + _syncService = ServiceContainer.Resolve("syncService"); + _userService = ServiceContainer.Resolve("userService"); + _appIdService = ServiceContainer.Resolve("appIdService"); + _apiService = ServiceContainer.Resolve("apiService"); + _messagingService = ServiceContainer.Resolve("messagingService"); + _resolved = true; + } + } +} +#endif diff --git a/src/Core/Abstractions/IApiService.cs b/src/Core/Abstractions/IApiService.cs index e8dae133b..a44665afb 100644 --- a/src/Core/Abstractions/IApiService.cs +++ b/src/Core/Abstractions/IApiService.cs @@ -45,5 +45,6 @@ namespace Bit.Core.Abstractions string organizationId); Task> GetHibpBreachAsync(string username); Task PostTwoFactorEmailAsync(TwoFactorEmailRequest request); + Task PutDeviceTokenAsync(string identifier, DeviceTokenRequest request); } } diff --git a/src/Core/Constants.cs b/src/Core/Constants.cs index 33eb1fbd1..8211aad70 100644 --- a/src/Core/Constants.cs +++ b/src/Core/Constants.cs @@ -16,6 +16,10 @@ public static string AccessibilityAutofillPasswordFieldKey = "accessibilityAutofillPasswordField"; public static string AccessibilityAutofillPersistNotificationKey = "accessibilityAutofillPersistNotification"; public static string DisableFaviconKey = "disableFavicon"; + public static string PushRegisteredTokenKey = "pushRegisteredToken"; + public static string PushCurrentTokenKey = "pushCurrentToken"; + public static string PushLastRegistrationDateKey = "pushLastRegistrationDate"; + public static string PushInitialPromptShownKey = "pushInitialPromptShown"; public const int SelectFileRequestCode = 42; public const int SelectFilePermissionRequestCode = 43; } diff --git a/src/Core/Models/Request/DeviceTokenRequest.cs b/src/Core/Models/Request/DeviceTokenRequest.cs new file mode 100644 index 000000000..8806f3b0a --- /dev/null +++ b/src/Core/Models/Request/DeviceTokenRequest.cs @@ -0,0 +1,7 @@ +namespace Bit.Core.Models.Request +{ + public class DeviceTokenRequest + { + public string PushToken { get; set; } + } +} diff --git a/src/Core/Models/Response/NotificationResponse.cs b/src/Core/Models/Response/NotificationResponse.cs index 34ad01ddf..8e37b2673 100644 --- a/src/Core/Models/Response/NotificationResponse.cs +++ b/src/Core/Models/Response/NotificationResponse.cs @@ -4,10 +4,12 @@ using System.Collections.Generic; namespace Bit.Core.Models.Response { - public class PushNotificationResponse + public class NotificationResponse { + public string ContextId { get; set; } public NotificationType Type { get; set; } public string Payload { get; set; } + public object PayloadObject { get; set; } } public class SyncCipherNotification diff --git a/src/Core/Services/ApiService.cs b/src/Core/Services/ApiService.cs index cb44fc70a..600d1f11c 100644 --- a/src/Core/Services/ApiService.cs +++ b/src/Core/Services/ApiService.cs @@ -281,6 +281,16 @@ namespace Bit.Core.Services #endregion + #region Device APIs + + public Task PutDeviceTokenAsync(string identifier, DeviceTokenRequest request) + { + return SendAsync( + HttpMethod.Post, $"identifier/{identifier}/token", request, true, false); + } + + #endregion + #region HIBP APIs public Task> GetHibpBreachAsync(string username) diff --git a/src/iOS/Services/iOSPushNotificationHandler.cs b/src/iOS/Services/iOSPushNotificationHandler.cs new file mode 100644 index 000000000..85345c148 --- /dev/null +++ b/src/iOS/Services/iOSPushNotificationHandler.cs @@ -0,0 +1,66 @@ +using Foundation; +using Newtonsoft.Json.Linq; +using System; +using System.Diagnostics; +using Xamarin.Forms; + +namespace Bit.iOS.Services +{ + public class iOSPushNotificationHandler + { + private const string TokenSetting = "token"; + private const string DomainName = "iOSPushNotificationService"; + + private readonly IPushNotificationListener _pushNotificationListener; + + public iOSPushNotificationHandler( + IPushNotificationListener pushNotificationListener) + { + _pushNotificationListener = pushNotificationListener; + } + + public void OnMessageReceived(NSDictionary userInfo) + { + var json = DictionaryToJson(userInfo); + var values = JObject.Parse(json); + var keyAps = new NSString("aps"); + if(userInfo.ContainsKey(keyAps) && userInfo.ValueForKey(keyAps) is NSDictionary aps) + { + foreach(var apsKey in aps) + { + if(!values.TryGetValue(apsKey.Key.ToString(), out JToken temp)) + { + values.Add(apsKey.Key.ToString(), apsKey.Value.ToString()); + } + } + } + _pushNotificationListener.OnMessage(values, Device.iOS); + } + + public void OnErrorReceived(NSError error) + { + Debug.WriteLine("{0} - Registration Failed.", DomainName); + _pushNotificationListener.OnError(error.LocalizedDescription, Device.iOS); + } + + public void OnRegisteredSuccess(NSData token) + { + Debug.WriteLine("{0} - Successfully Registered.", DomainName); + var trimmedDeviceToken = token.Description; + if(!string.IsNullOrWhiteSpace(trimmedDeviceToken)) + { + trimmedDeviceToken = trimmedDeviceToken.Trim('<').Trim('>').Trim().Replace(" ", string.Empty); + } + Console.WriteLine("{0} - Token: {1}", DomainName, trimmedDeviceToken); + _pushNotificationListener.OnRegistered(trimmedDeviceToken, Device.iOS); + NSUserDefaults.StandardUserDefaults.SetString(trimmedDeviceToken, TokenSetting); + NSUserDefaults.StandardUserDefaults.Synchronize(); + } + + private static string DictionaryToJson(NSDictionary dictionary) + { + var json = NSJsonSerialization.Serialize(dictionary, NSJsonWritingOptions.PrettyPrinted, out NSError error); + return json.ToString(NSStringEncoding.UTF8); + } + } +} diff --git a/src/iOS/Services/iOSPushNotificationService.cs b/src/iOS/Services/iOSPushNotificationService.cs new file mode 100644 index 000000000..dedd715a5 --- /dev/null +++ b/src/iOS/Services/iOSPushNotificationService.cs @@ -0,0 +1,36 @@ +using System.Threading.Tasks; +using Bit.App.Abstractions; +using Foundation; +using UIKit; + +namespace Bit.iOS.Services +{ + public class iOSPushNotificationService : IPushNotificationService + { + private const string TokenSetting = "token"; + + public Task GetTokenAsync() + { + return Task.FromResult(NSUserDefaults.StandardUserDefaults.StringForKey(TokenSetting)); + } + + public Task RegisterAsync() + { + var userNotificationTypes = UIUserNotificationType.Alert | UIUserNotificationType.Badge | + UIUserNotificationType.Sound; + var settings = UIUserNotificationSettings.GetSettingsForTypes(userNotificationTypes, null); + UIApplication.SharedApplication.RegisterUserNotificationSettings(settings); + return Task.FromResult(0); + } + + public Task UnregisterAsync() + { + UIApplication.SharedApplication.UnregisterForRemoteNotifications(); + // TODO: unregister call + // _pushNotificationListener.OnUnregistered(Device.iOS); + NSUserDefaults.StandardUserDefaults.SetString(string.Empty, TokenSetting); + NSUserDefaults.StandardUserDefaults.Synchronize(); + return Task.FromResult(0); + } + } +} \ No newline at end of file diff --git a/src/iOS/iOS.csproj b/src/iOS/iOS.csproj index d0b42c801..58fcba9f6 100644 --- a/src/iOS/iOS.csproj +++ b/src/iOS/iOS.csproj @@ -94,6 +94,8 @@ + +