public static Task ChangeChannel(this ServerEventsClient client, string channel, ChatCommandHandler cmdReceiver)
        {
            if (cmdReceiver.FullHistory.ContainsKey(channel) && client.Channels.Contains(channel))
            {
                cmdReceiver.ChangeChannel(channel);
                cmdReceiver.SyncAdapter();
                return(Task.CompletedTask);
            }

            return(client.SubscribeToChannelsAsync(channel)
                   .Then(t =>
            {
                cmdReceiver.CurrentChannel = channel;
                return client.UpdateChatHistory(cmdReceiver);
            }));
        }
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);

            LogManager.LogFactory = new GenericLogFactory(Console.WriteLine);

            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.Main);
            // Get our button from the layout resource,
            // and attach an event to it
            Button sendButton = FindViewById <Button>(Resource.Id.sendMessageButton);

            messageBox = FindViewById <EditText>(Resource.Id.message);
            SupportToolbar toolbar = FindViewById <SupportToolbar>(Resource.Id.toolbar);

            drawerLayout   = FindViewById <DrawerLayout>(Resource.Id.drawer_layout);
            navigationView = FindViewById <NavigationView>(Resource.Id.nav_view);
            rightDrawer    = FindViewById <ListView>(Resource.Id.right_drawer);
            var messageHistoryList = FindViewById <ListView>(Resource.Id.messageHistory);
            var chatBackground     = FindViewById <ImageView>(Resource.Id.chat_background);

            InitDefaultBackground(chatBackground);

            navigationView.Tag = 0;
            rightDrawer.Tag    = 1;

            var messageHistoryAdapter = new MessageListViewAdapter(this, new List <ChatMessage>(), () => this.subscriberList);

            messageHistoryList.Adapter = messageHistoryAdapter;

            var channels = new[] { "home" };

            cmdReceiver = new ChatCommandHandler(this, messageHistoryAdapter, "home");
            var activity = this;

            client = new ServerEventsClient(BaseUrl, channels)
            {
                OnConnect = connectMsg =>
                {
                    client.UpdateChatHistory(cmdReceiver)
                    .ContinueWith(t =>
                                  connectMsg.UpdateUserProfile(activity));
                },
                OnCommand = command =>
                {
                    if (command is ServerEventJoin)
                    {
                        client.GetChannelSubscribersAsync()
                        .ContinueWith(t => {
                            subscriberList = t.Result;
                            Application.SynchronizationContext.Post(_ => {
                                // Refresh profile icons when users join
                                messageHistoryAdapter.NotifyDataSetChanged();
                            }, null);
                        });
                    }
                },
                OnException = error => {
                    Application.SynchronizationContext.Post(
                        _ => { Toast.MakeText(this, "Error : " + error.Message, ToastLength.Long); }, null);
                },
                //ServiceClient = new JsonHttpClient(BaseUrl),
                Resolver = new MessageResolver(cmdReceiver)
            };
            client.RegisterNamedReceiver <ChatReceiver>("cmd");
            client.RegisterNamedReceiver <TvReciever>("tv");
            client.RegisterNamedReceiver <CssReceiver>("css");

            SetSupportActionBar(toolbar);

            var rightDataSet = new List <string>(commands.Keys);
            var rightAdapter = new ActionListViewAdapter(this, rightDataSet);

            rightDrawer.Adapter    = rightAdapter;
            rightDrawer.ItemClick += (sender, args) =>
            {
                Application.SynchronizationContext.Post(_ =>
                {
                    messageBox.Text = commands[rightDataSet[args.Position]];
                    drawerLayout.CloseDrawer(rightDrawer);
                }, null);
            };

            drawerToggle = new ChatActionBarDrawerToggle(
                this,                          //Host Activity
                drawerLayout,                  //DrawerLayout
                toolbar,                       // Instance of toolbar, if you use other ctor, the hamburger icon/arrow animation won't work..
                Resource.String.openDrawer,    //Opened Message
                Resource.String.closeDrawer    //Closed Message
                );

            SupportActionBar.SetHomeButtonEnabled(true);
            SupportActionBar.SetDisplayShowTitleEnabled(true);

            drawerLayout.SetDrawerListener(drawerToggle);
            drawerToggle.SyncState();

            navigationView.NavigationItemSelected += OnChannelClick;
            sendButton.Click += async(e, args) => { await OnSendClick(e, args); };
        }