├── .gitignore
├── Core
├── App.xaml
├── App.xaml.cs
├── Controls
│ ├── AlwaysScrollView.cs
│ ├── Badge.cs
│ ├── CarouselView.cs
│ ├── ChartView.cs
│ ├── HVScrollGridView.cs
│ ├── HorizontalViewNative.cs
│ ├── ListView.cs
│ ├── ParallaxScrollView.cs
│ ├── WhatsAppImage.cs
│ └── WhatsAppViewCell.cs
├── Converters
│ ├── BooleanInverterConverter.cs
│ ├── NubankDateTimeConverter.cs
│ ├── NubankPriceToDollarConverter.cs
│ ├── NubankPriceToLocalConverter.cs
│ ├── NubankTagsToStringConverter.cs
│ └── WhatsAppDateTimeConverter.cs
├── Core.csproj
├── CorePage.xaml
├── CorePage.xaml.cs
├── Effects
│ └── TwoLinesLabelEffect.cs
├── Enums
│ └── WhatsAppChatListMessageStatusEnum.cs
├── Externsions
│ ├── DateTimeOffsetExtension.cs
│ └── MovieExtension.cs
├── Interfaces
│ ├── IMobileApp.cs
│ ├── INetflix.cs
│ ├── INubank.cs
│ ├── ITwitch.cs
│ └── IWhatsApp.cs
├── Models
│ ├── MobileAppModel.cs
│ ├── Netflix
│ │ └── MovieModel.cs
│ ├── Nubank
│ │ ├── NubankHeaderInvoiceModel.cs
│ │ ├── NubankHeaderModel.cs
│ │ └── NubankHeaderSummaryModel.cs
│ ├── NubankTimelineModel.cs
│ ├── Twitch
│ │ └── TwitchChannelModel.cs
│ ├── WhatsApp
│ │ ├── ChatModel.cs
│ │ └── GroupChatModel.cs
│ └── WhatsAppInfoModel.cs
├── Services
│ ├── MobileAppService.cs
│ ├── NetflixService.cs
│ ├── NubankService.cs
│ ├── TwitchService.cs
│ └── WhatsAppService.cs
├── Templates
│ ├── Nubank
│ │ ├── HeaderInvoice.xaml
│ │ ├── HeaderInvoice.xaml.cs
│ │ ├── HeaderSummary.xaml
│ │ └── HeaderSummary.xaml.cs
│ ├── NubankHeaderTemplate.cs
│ ├── WhatsAppChatList
│ │ ├── GroupMessage.xaml
│ │ ├── GroupMessage.xaml.cs
│ │ ├── SingleMessage.xaml
│ │ └── SingleMessage.xaml.cs
│ └── WhatsAppChatListTemplate.cs
├── ViewModels
│ ├── BaseViewModel.cs
│ ├── MobileAppViewModel.cs
│ ├── NetflixHomeViewModel.cs
│ ├── NubankTimelineViewModel.cs
│ ├── TwitchHomeViewModel.cs
│ ├── WhatsAppChatListViewModel.cs
│ └── WhatsAppInfoViewModel.cs
└── Views
│ ├── FacebookLoginView.xaml
│ ├── FacebookLoginView.xaml.cs
│ ├── MobileAppView.xaml
│ ├── MobileAppView.xaml.cs
│ ├── NetflixHomeView.xaml
│ ├── NetflixHomeView.xaml.cs
│ ├── NubankTimelineView.xaml
│ ├── NubankTimelineView.xaml.cs
│ ├── TwitchHomeView.xaml
│ ├── TwitchHomeView.xaml.cs
│ ├── WhatsAppChatListView.xaml
│ ├── WhatsAppChatListView.xaml.cs
│ ├── WhatsAppInfoView.xaml
│ └── WhatsAppInfoView.xaml.cs
├── Droid
├── Assets
│ ├── AboutAssets.txt
│ ├── Gotham-Bold.ttf
│ └── Gotham-Light.ttf
├── Core.Droid.csproj
├── Effects
│ └── TwoLinesLabelEffect.cs
├── MainActivity.cs
├── Properties
│ ├── AndroidManifest.xml
│ └── AssemblyInfo.cs
├── Resources
│ ├── AboutResources.txt
│ ├── drawable-hdpi
│ │ └── icon.png
│ ├── drawable-xhdpi
│ │ └── icon.png
│ ├── drawable-xxhdpi
│ │ └── icon.png
│ ├── drawable
│ │ ├── icon.png
│ │ ├── nubank_cat_bullet_green.png
│ │ ├── nubank_cat_bullet_red.png
│ │ ├── nubank_cat_card.png
│ │ ├── nubank_cat_eletronics.png
│ │ ├── nubank_cat_play.png
│ │ ├── nubank_cat_recreation.png
│ │ ├── nubank_cat_restaurant.png
│ │ ├── nubank_cat_services.png
│ │ ├── nubank_cat_star.png
│ │ ├── nubank_cat_transport.png
│ │ ├── twitch_thumbnail.png
│ │ ├── whatsapp_mute.png
│ │ └── whatsapp_read.png
│ ├── layout
│ │ ├── Tabbar.axml
│ │ └── Toolbar.axml
│ └── values
│ │ └── styles.xml
└── packages.config
├── Interfaces.sln
├── LICENSE
├── README.md
├── art
├── nubank-timeline-android.png
├── nubank-timeline-ios.png
├── whatsapp-chat-list-android.png
└── whatsapp-chat-list-ios.png
└── iOS
├── AppDelegate.cs
├── Assets.xcassets
├── AppIcon.appiconset
│ └── Contents.json
└── Contents.json
├── Core.iOS.csproj
├── Effects
└── TwoLinesLabelEffect.cs
├── Entitlements.plist
├── Info.plist
├── LaunchScreen.storyboard
├── Main.cs
├── Renderers
├── AlwaysScrollViewRenderer.cs
├── WhatsAppViewCellRenderer.cs
└── iOSHorizontalViewRenderer.cs
├── Resources
├── Gotham-Bold.otf
├── Gotham-Light.otf
├── nubank_cat_bullet_green.png
├── nubank_cat_bullet_red.png
├── nubank_cat_card.png
├── nubank_cat_eletronics.png
├── nubank_cat_play.png
├── nubank_cat_recreation.png
├── nubank_cat_restaurant.png
├── nubank_cat_services.png
├── nubank_cat_star.png
├── nubank_cat_transport.png
├── twitch_thumbnail.png
├── whatsapp_mute.png
└── whatsapp_read.png
└── packages.config
/.gitignore:
--------------------------------------------------------------------------------
1 | # Autosave files
2 | *~
3 |
4 | # build
5 | [Oo]bj/
6 | [Bb]in/
7 | packages/
8 | TestResults/
9 |
10 | # globs
11 | Makefile.in
12 | *.DS_Store
13 | *.sln.cache
14 | *.suo
15 | *.cache
16 | *.pidb
17 | *.userprefs
18 | *.usertasks
19 | config.log
20 | config.make
21 | config.status
22 | aclocal.m4
23 | install-sh
24 | autom4te.cache/
25 | *.user
26 | *.tar.gz
27 | tarballs/
28 | test-results/
29 | Thumbs.db
30 | .vs/
31 |
32 | # Mac bundle stuff
33 | *.dmg
34 | *.app
35 |
36 | # resharper
37 | *_Resharper.*
38 | *.Resharper
39 |
40 | # dotCover
41 | *.dotCover
42 |
43 | # MFractor
44 | .mfractor
45 |
46 | # Project
47 | Droid/Resources/Resource.designer.cs
48 |
--------------------------------------------------------------------------------
/Core/App.xaml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
10 |
11 |
17 |
18 |
19 |
20 |
26 |
27 |
33 |
34 | #f7f7f7
35 | #808080
36 | #d5d5d5
37 | #00c0cd
38 |
39 |
45 |
46 |
50 |
51 |
52 |
53 |
--------------------------------------------------------------------------------
/Core/App.xaml.cs:
--------------------------------------------------------------------------------
1 | using Core.Interfaces;
2 | using Core.Services;
3 | using Core.ViewModels;
4 | using Core.Views;
5 | using Prism;
6 | using Prism.DryIoc;
7 | using Prism.Ioc;
8 | using Xamarin.Forms;
9 |
10 | namespace Core
11 | {
12 | public partial class App : PrismApplication
13 | {
14 | public App() : base(null) {}
15 | public App(IPlatformInitializer platformInitializer) : base(platformInitializer) {}
16 |
17 | protected override async void OnInitialized()
18 | {
19 | InitializeComponent();
20 |
21 | Device.SetFlags(new string[] { "MediaElement_Experimental", "Shapes_Experimental" });
22 |
23 | await NavigationService.NavigateAsync("NavigationPage/MobileAppView");
24 | }
25 |
26 | protected override void RegisterTypes(IContainerRegistry containerRegistry)
27 | {
28 | containerRegistry.RegisterForNavigation();
29 | containerRegistry.RegisterForNavigation();
30 | containerRegistry.RegisterForNavigation();
31 | containerRegistry.RegisterForNavigation();
32 | containerRegistry.RegisterForNavigation();
33 | containerRegistry.RegisterForNavigation();
34 | containerRegistry.RegisterForNavigation();
35 | containerRegistry.RegisterForNavigation();
36 |
37 | containerRegistry.RegisterSingleton();
38 | containerRegistry.RegisterSingleton();
39 | containerRegistry.RegisterSingleton();
40 | containerRegistry.RegisterSingleton();
41 | containerRegistry.RegisterSingleton();
42 | }
43 |
44 | protected override void OnStart()
45 | {
46 | // Handle when your app starts
47 | }
48 |
49 | protected override void OnSleep()
50 | {
51 | // Handle when your app sleeps
52 | }
53 |
54 | protected override void OnResume()
55 | {
56 | // Handle when your app resumes
57 | }
58 | }
59 | }
60 |
--------------------------------------------------------------------------------
/Core/Controls/AlwaysScrollView.cs:
--------------------------------------------------------------------------------
1 | using Xamarin.Forms;
2 |
3 | namespace Core.Controls
4 | {
5 | public class AlwaysScrollView : ScrollView
6 | {
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/Core/Controls/Badge.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using Xamarin.Forms;
3 |
4 | namespace Core.Controls
5 | {
6 | public class Badge : AbsoluteLayout
7 | {
8 | protected Label Label;
9 | protected BoxView Box;
10 |
11 | public static readonly BindableProperty TextProperty =
12 | BindableProperty.Create(
13 | "Text",
14 | typeof(String),
15 | typeof(Badge),
16 | ""
17 | );
18 |
19 | //Box color property
20 | public static readonly BindableProperty BoxColorProperty =
21 | BindableProperty.Create(
22 | "BoxColor",
23 | typeof(Color),
24 | typeof(Badge),
25 | Color.Default
26 | );
27 |
28 |
29 | public Badge()
30 | {
31 | var size = 20;
32 | var fontSize = 14;
33 |
34 | HeightRequest = size;
35 | WidthRequest = size;
36 |
37 | // Box
38 | Box = new BoxView
39 | {
40 | CornerRadius = HeightRequest / 2
41 | };
42 |
43 | Box.SetBinding(BackgroundColorProperty, new Binding("BoxColor", source: this));
44 | Children.Add(Box, new Rectangle(0, 0, 1.0, 1.0), AbsoluteLayoutFlags.All);
45 |
46 | // Label
47 | Label = new Label
48 | {
49 | TextColor = Color.White,
50 | FontSize = fontSize,
51 | FontAttributes = FontAttributes.Bold,
52 | HorizontalTextAlignment = TextAlignment.Center,
53 | VerticalTextAlignment = TextAlignment.Center
54 | };
55 |
56 | Label.SetBinding(Label.TextProperty, new Binding("Text", BindingMode.OneWay, source: this));
57 |
58 | Children.Add(Label, new Rectangle(0, 0, 1.0, 1.0), AbsoluteLayoutFlags.All);
59 |
60 | // Auto width
61 | SetBinding(WidthRequestProperty, new Binding("Text", BindingMode.OneWay, new BadgeWidthConverter(WidthRequest), source: this));
62 |
63 | // If not value = hide
64 | SetBinding(IsVisibleProperty, new Binding("Text", BindingMode.OneWay, new BadgeVisibleValueConverter(), source: this));
65 |
66 | // Default color
67 | BoxColor = Color.Red;
68 | }
69 |
70 | // Text
71 | public string Text
72 | {
73 | get { return (string)GetValue(TextProperty); }
74 | set { SetValue(TextProperty, value); }
75 | }
76 |
77 | // Color of the box
78 | public Color BoxColor
79 | {
80 | get { return (Color)GetValue(BoxColorProperty); }
81 | set { SetValue(BoxColorProperty, value); }
82 | }
83 |
84 | }
85 |
86 | class BadgeWidthConverter : IValueConverter
87 | {
88 |
89 | // Width ratio.
90 | const double widthRatio = 0.33;
91 |
92 | //Width of the base.
93 | readonly double baseWidth;
94 |
95 | public BadgeWidthConverter(double baseWidth)
96 | {
97 | this.baseWidth = baseWidth;
98 | }
99 |
100 |
101 | public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
102 | {
103 | var text = value as string;
104 | if ((text != null) && (text.Length > 1))
105 | {
106 | return baseWidth * (1 + widthRatio * (text.Length - 1));
107 | }
108 | return baseWidth;
109 | }
110 |
111 | public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
112 | {
113 | throw new NotImplementedException();
114 | }
115 | }
116 |
117 | class BadgeVisibleValueConverter : IValueConverter
118 | {
119 |
120 | public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
121 | {
122 | var text = value as string;
123 |
124 | if (text == "0")
125 | return false;
126 |
127 | return !String.IsNullOrEmpty(text);
128 | }
129 |
130 | public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
131 | {
132 | throw new NotImplementedException();
133 | }
134 |
135 | }
136 | }
137 |
--------------------------------------------------------------------------------
/Core/Controls/CarouselView.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using CarouselView.FormsPlugin.Abstractions;
3 |
4 | namespace Core.Controls
5 | {
6 | public class CarouselView : CarouselViewControl
7 | {
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/Core/Controls/ChartView.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace Core.Controls
4 | {
5 | public class ChartView : Microcharts.Forms.ChartView
6 | {
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/Core/Controls/HVScrollGridView.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections;
3 | using System.Collections.Generic;
4 | using System.Windows.Input;
5 | using Xamarin.Forms;
6 |
7 | namespace Core.Controls
8 | {
9 | public class HVScrollGridView : Grid
10 | {
11 | private ICommand _innerSelectedCommand;
12 | private readonly ScrollView _scrollView;
13 | private readonly StackLayout _itemsStackLayout;
14 |
15 | public event EventHandler SelectedItemChanged;
16 |
17 | public StackOrientation ListOrientation { get; set; }
18 |
19 | public double Spacing { get; set; }
20 |
21 | public static readonly BindableProperty SelectedCommandProperty =
22 | BindableProperty.Create("SelectedCommand", typeof(ICommand), typeof(HVScrollGridView), null);
23 |
24 | public static readonly BindableProperty ItemsSourceProperty =
25 | BindableProperty.Create("ItemsSource", typeof(IEnumerable), typeof(HVScrollGridView), default(IEnumerable