public override void OnReceive(Context context, Intent intent)
        {
            base.OnReceive(context, intent);

            string action = intent.Action;

            if (action == null)
            {
                return;
            }

            int appWidgetId = intent.GetIntExtra(AppWidgetManager.ExtraAppwidgetId, AppWidgetManager.InvalidAppwidgetId);

            if (appWidgetId == AppWidgetManager.InvalidAppwidgetId)
            {
                return;
            }

            Realm realm = Realm.GetInstance(DB.RealmConfiguration);
            WidgetLargeAltParams widgetLargeAltParams = realm.Find <WidgetLargeAltParams>(appWidgetId);

            if (action.Equals(MenuClick))
            {
                // Show Book list
                realm.Write(() => widgetLargeAltParams.OpenMenu = !widgetLargeAltParams.OpenMenu);
                Redraw(context, appWidgetId);
            }
            if (action.Equals(MenuOutsideClick))
            {
                // Hide Book list
                realm.Write(() => widgetLargeAltParams.OpenMenu = false);
                Redraw(context, appWidgetId);
            }
            if (action.Equals(ReverseClick))
            {
                // Reverse order
                realm.Write(() => widgetLargeAltParams.Descending = !widgetLargeAltParams.Descending);
                Redraw(context, appWidgetId);
            }
            if (action.Equals(RefreshClick))
            {
                // Refresh
                Update(context, appWidgetId);
            }
            if (action.Equals(RemoteBookAdapter.SelectBook))
            {
                int bookId = intent.GetIntExtra(RemoteBookAdapter.ExtraBookId, 0);
                realm.Write(() =>
                {
                    widgetLargeAltParams.Book     = bookId;
                    widgetLargeAltParams.OpenMenu = false;
                });
                Redraw(context, appWidgetId);
            }
            realm.Dispose();
        }
        private RemoteViews BuildRemoteView(Context context, int appWidgetId, WidgetLargeAltParams widgetLargeAltParams)
        {
            RemoteViews widgetView;
            int         layout = widgetLargeAltParams.IsRefreshing ? LayoutRefreshing : Layout;

            widgetView = new RemoteViews(context.PackageName, layout);

            SetView(context, appWidgetId, widgetView, widgetLargeAltParams);

            return(widgetView);
        }
        public override void OnRestored(Context context, int[] oldWidgetIds, int[] newWidgetIds)
        {
            base.OnRestored(context, oldWidgetIds, newWidgetIds);
            Realm realm = Realm.GetInstance(DB.RealmConfiguration);

            realm.Write(() =>
            {
                for (int i = 0; i < oldWidgetIds.Length; i++)
                {
                    WidgetLargeAltParams widgetLargeAltParams = realm.Find <WidgetLargeAltParams>(oldWidgetIds[i]);
                    widgetLargeAltParams.ID = newWidgetIds[i];
                }
            });

            realm.Dispose();
        }
        public override void OnDeleted(Context context, int[] appWidgetIds)
        {
            base.OnDeleted(context, appWidgetIds);
            Realm realm = Realm.GetInstance(DB.RealmConfiguration);

            realm.Write(() =>
            {
                foreach (int appWidgetId in appWidgetIds)
                {
                    WidgetLargeAltParams widgetParams = realm.Find <WidgetLargeAltParams>(appWidgetId);
                    realm.Remove(widgetParams);
                }
            });

            realm.Dispose();
        }
        public override void OnUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
        {
            Realm realm = Realm.GetInstance(DB.RealmConfiguration);

            foreach (int appWidgetId in appWidgetIds)
            {
                WidgetLargeAltParams widgetLargeAltParams = realm.Find <WidgetLargeAltParams>(appWidgetId);
                if (widgetLargeAltParams == null)
                {
                    // Widget created
                    realm.Write(() =>
                    {
                        widgetLargeAltParams = new WidgetLargeAltParams()
                        {
                            ID           = appWidgetId,
                            IsRefreshing = true,
                            Book         = 0,
                            Descending   = false,
                        };
                        realm.Add <WidgetLargeAltParams>(widgetLargeAltParams);
                    });
                }
                else if (widgetLargeAltParams.IsRefreshing)
                {
                    // Already updating
                    return;
                }
                else
                {
                    realm.Write(() => widgetLargeAltParams.IsRefreshing = true);
                }

                DBController.Instance.ParseBooks(context, false);

                ComponentName appWidgetComponentName = new ComponentName(context, Java.Lang.Class.FromType(typeof(WidgetLargeAlt)).Name);
                appWidgetManager.UpdateAppWidget(appWidgetComponentName, BuildRemoteView(context, appWidgetId, widgetLargeAltParams));
            }
            base.OnUpdate(context, appWidgetManager, appWidgetIds);
            realm.Dispose();
        }
        private void SetView(Context context, int appWidgetId, RemoteViews widgetView, WidgetLargeAltParams widgetLargeAltParams)
        {
            if (!widgetLargeAltParams.IsRefreshing)
            {
                Realm realm = Realm.GetInstance(DB.RealmConfiguration);

                // Bind the RemoteViewsService (adapter) for the Chapters list
                Intent intent = new Intent(context, typeof(RemoteChapterAdapter));
                intent.PutExtra(AppWidgetManager.ExtraAppwidgetId, appWidgetId);
                intent.PutExtra(RemoteChapterAdapter.ExtraBookId, widgetLargeAltParams.Book);
                intent.PutExtra(RemoteChapterAdapter.ExtraSortOrder, widgetLargeAltParams.Descending);
                intent.SetData(Uri.Parse(intent.ToUri(IntentUriType.Scheme)));
                widgetView.SetRemoteAdapter(Resource.Id.list_chapters, intent);

                // Set Chapter list click intent template
                Intent        chapterClickIntentTemplate        = new Intent(Intent.ActionView);
                PendingIntent chapterClickPendingIntentTemplate = TaskStackBuilder.Create(context)
                                                                  .AddNextIntentWithParentStack(chapterClickIntentTemplate)
                                                                  .GetPendingIntent(appWidgetId, PendingIntentFlags.UpdateCurrent);
                widgetView.SetPendingIntentTemplate(Resource.Id.list_chapters, chapterClickPendingIntentTemplate);

                // Bind the click intent for the refresh button on the widget
                Intent refreshIntent = new Intent(context, typeof(WidgetLargeAlt));
                refreshIntent.SetAction(RefreshClick);
                refreshIntent.PutExtra(AppWidgetManager.ExtraAppwidgetId, appWidgetId);
                PendingIntent refreshPendingIntent = PendingIntent.GetBroadcast(context, appWidgetId, refreshIntent, PendingIntentFlags.UpdateCurrent);
                widgetView.SetOnClickPendingIntent(Resource.Id.btn_refresh, refreshPendingIntent);

                realm.Dispose();
            }

            if (widgetLargeAltParams.OpenMenu)
            {
                widgetView.SetViewVisibility(Resource.Id.menu, Android.Views.ViewStates.Visible);

                // Bind the click intent for the reverse button on the widget
                Intent CloseIntent = new Intent(context, typeof(WidgetLargeAlt));
                CloseIntent.SetAction(MenuOutsideClick);
                CloseIntent.PutExtra(AppWidgetManager.ExtraAppwidgetId, appWidgetId);
                PendingIntent closePendingIntent = PendingIntent.GetBroadcast(context, appWidgetId, CloseIntent, PendingIntentFlags.UpdateCurrent);
                widgetView.SetOnClickPendingIntent(Resource.Id.menu_outside, closePendingIntent);

                if (!widgetLargeAltParams.IsRefreshing)
                {
                    // Bind the RemoteViewsService (adapter) for the Book list
                    Intent intent = new Intent(context, typeof(RemoteBookAdapter));
                    intent.PutExtra(AppWidgetManager.ExtraAppwidgetId, appWidgetId);
                    intent.PutExtra(RemoteBookAdapter.ExtraBookId, widgetLargeAltParams.Book);
                    intent.SetData(Uri.Parse(intent.ToUri(IntentUriType.Scheme)));
                    widgetView.SetRemoteAdapter(Resource.Id.list_books, intent);

                    // Set Book list click intent template
                    Intent        bookClickIntentTemplate        = new Intent(context, typeof(WidgetLargeAlt));
                    PendingIntent bookClickPendingIntentTemplate = PendingIntent.GetBroadcast(context, appWidgetId, bookClickIntentTemplate, PendingIntentFlags.UpdateCurrent);
                    widgetView.SetPendingIntentTemplate(Resource.Id.list_books, bookClickPendingIntentTemplate);
                }
            }
            else
            {
                widgetView.SetViewVisibility(Resource.Id.menu, Android.Views.ViewStates.Invisible);
            }

            // Bind the click intent for the menu button on the widget
            Intent menuIntent = new Intent(context, typeof(WidgetLargeAlt));

            menuIntent.SetAction(MenuClick);
            menuIntent.PutExtra(AppWidgetManager.ExtraAppwidgetId, appWidgetId);
            PendingIntent menuPendingIntent = PendingIntent.GetBroadcast(context, appWidgetId, menuIntent, PendingIntentFlags.UpdateCurrent);

            widgetView.SetOnClickPendingIntent(Resource.Id.btn_menu, menuPendingIntent);

            // Bind the click intent for the reverse button on the widget
            Intent reverseIntent = new Intent(context, typeof(WidgetLargeAlt));

            reverseIntent.SetAction(ReverseClick);
            reverseIntent.PutExtra(AppWidgetManager.ExtraAppwidgetId, appWidgetId);
            PendingIntent reversePendingIntent = PendingIntent.GetBroadcast(context, appWidgetId, reverseIntent, PendingIntentFlags.UpdateCurrent);

            widgetView.SetOnClickPendingIntent(Resource.Id.btn_reverse, reversePendingIntent);
        }