コード例 #1
0
        protected override async void OnHandleIntent(Intent intent)
        {
            AppWidgetManager manager = AppWidgetManager.GetInstance(this);

            int[] allWidgetIds = intent
                                 .GetIntArrayExtra(AppWidgetManager.ExtraAppwidgetIds);
            var layoutId = intent.GetIntExtra("ResourceId", Resource.Layout.CalendarWidgetLight);
            var views    = new List <Tuple <RemoteViews, int> >();

            try
            {
                ResourceLocator.RegisterBase();
                ResourceLocator.RegisterAppDataServiceAdapter(new ApplicationDataServiceService());
                ResourceLocator.RegisterPasswordVaultAdapter(new PasswordVaultProvider());
                ResourceLocator.RegisterMessageDialogAdapter(new MessageDialogProvider());
                ResourceLocator.RegisterDataCacheAdapter(new Adapters.DataCache(null));
                Credentials.Init();
            }
            catch (Exception e)
            {
            }
            bool running = ResourceLocator.AnimeLibraryDataStorage.AllLoadedAuthAnimeItems?.Any() ?? false;

            foreach (var widgetId in allWidgetIds)
            {
                var view = new RemoteViews(PackageName, layoutId);
                views.Add(new Tuple <RemoteViews, int>(view, widgetId));

                manager.UpdateAppWidget(widgetId, view);
            }

            CalendarPivotPage shows = null;

            if (Credentials.Authenticated)
            {
                if (!running)
                {
                    ViewModelLocator.AnimeList.ListSource = Credentials.UserName;
                    await ViewModelLocator.AnimeList.FetchData(true, AnimeListWorkModes.Anime);
                }

                await ViewModelLocator.CalendarPage.Init(true);

                shows =
                    ViewModelLocator.CalendarPage.CalendarData.FirstOrDefault(
                        page => page.DayOfWeek == DateTime.Now.DayOfWeek);
            }

            if (shows != null && shows.Items.Any())
            {
                foreach (var view in views)
                {
                    view.Item1.SetViewVisibility(Resource.Id.LoadingSpinner, ViewStates.Gone);
                    view.Item1.SetViewVisibility(Resource.Id.EmptyNotice, ViewStates.Gone);
                    view.Item1.SetViewVisibility(Resource.Id.GridView, ViewStates.Visible);
                    view.Item1.SetRemoteAdapter(Resource.Id.GridView, new Intent(ApplicationContext, typeof(CalendarWidgetRemoteViewsService)));

                    var intentTemplate = new Intent(ApplicationContext, typeof(MainActivity));
                    view.Item1.SetPendingIntentTemplate(Resource.Id.GridView, PendingIntent.GetActivity(ApplicationContext, 0, intentTemplate, 0));

                    manager.UpdateAppWidget(view.Item2, view.Item1);
                }
            }
            else
            {
                foreach (var view in views)
                {
                    view.Item1.SetViewVisibility(Resource.Id.LoadingSpinner, ViewStates.Gone);
                    view.Item1.SetViewVisibility(Resource.Id.EmptyNotice, ViewStates.Visible);
                    view.Item1.SetViewVisibility(Resource.Id.GridView, ViewStates.Gone);
                    manager.UpdateAppWidget(view.Item2, view.Item1);
                }
            }
        }
コード例 #2
0
        protected override async void OnHandleIntent(Intent intent)
        {
            var manager = AppWidgetManager.GetInstance(this);

            int[] allWidgetIds = intent
                                 .GetIntArrayExtra(AppWidgetManager.ExtraAppwidgetIds);
            var layoutId = intent.GetIntExtra("ResourceId", Resource.Layout.CalendarWidgetLight);

            _views = new List <Tuple <RemoteViews, int> >();

            try
            {
                ResourceLocator.RegisterBase();
                ResourceLocator.RegisterAppDataServiceAdapter(new ApplicationDataServiceService());
                ResourceLocator.RegisterPasswordVaultAdapter(new PasswordVaultProvider());
                ResourceLocator.RegisterMessageDialogAdapter(new MessageDialogProvider());
                ResourceLocator.RegisterDataCacheAdapter(new Adapters.DataCache(null));

                Credentials.Init();
            }
            catch (Exception e)
            {
            }
            bool running = ResourceLocator.AnimeLibraryDataStorage.AllLoadedAuthAnimeItems?.Any() ?? false;

            foreach (var widgetId in allWidgetIds)
            {
                var view = new RemoteViews(PackageName, layoutId);
                _views.Add(new Tuple <RemoteViews, int>(view, widgetId));

                view.SetViewVisibility(Resource.Id.LoadingSpinner, ViewStates.Visible);
                view.SetViewVisibility(Resource.Id.EmptyNotice, ViewStates.Gone);
                //view.SetViewVisibility(Resource.Id.RefreshButton, ViewStates.Gone);
                view.SetViewVisibility(Resource.Id.GridView, ViewStates.Gone);

                manager.UpdateAppWidget(widgetId, view);
            }

            CalendarPivotPage shows = null;

            try
            {
                if (Credentials.Authenticated)
                {
                    if (!running)
                    {
                        await ResourceLocator.AiringInfoProvider.Init(false);

                        ViewModelLocator.AnimeList.ListSource = Credentials.UserName;
                        await ViewModelLocator.AnimeList.FetchData(true, AnimeListWorkModes.Anime);
                    }
                    if (ResourceLocator.AiringInfoProvider.InitializationSuccess && (ResourceLocator.AnimeLibraryDataStorage.AllLoadedAuthAnimeItems?.Any() ?? false))
                    {
                        await ViewModelLocator.CalendarPage.Init(true);

                        shows =
                            ViewModelLocator.CalendarPage.CalendarData.FirstOrDefault(
                                page => page.DayOfWeek == DateTime.Now.DayOfWeek);
                    }
                }
            }
            catch (Exception e)
            {
                //we have failed very very badly
            }

            await Task.Delay(1000); // give visual feedback


            if (shows != null && shows.Items.Any())
            {
                foreach (var view in _views)
                {
                    view.Item1.SetViewVisibility(Resource.Id.LoadingSpinner, ViewStates.Gone);
                    view.Item1.SetViewVisibility(Resource.Id.EmptyNotice, ViewStates.Gone);
                    view.Item1.SetViewVisibility(Resource.Id.GridView, ViewStates.Visible);
                    view.Item1.SetRemoteAdapter(Resource.Id.GridView, new Intent(ApplicationContext, typeof(CalendarWidgetRemoteViewsService)));

                    var intentTemplate = new Intent(ApplicationContext, typeof(MainActivity));
                    view.Item1.SetPendingIntentTemplate(Resource.Id.GridView, PendingIntent.GetActivity(ApplicationContext, 0, intentTemplate, 0));

                    var refreshIntent = new Intent(ApplicationContext, typeof(CalendarWidgetUpdateService));
                    refreshIntent.PutExtra(AppWidgetManager.ExtraAppwidgetIds, new[] { view.Item2 });
                    refreshIntent.PutExtra("ResourceId", layoutId);
                    view.Item1.SetOnClickPendingIntent(Resource.Id.RefreshButton, PendingIntent.GetService(ApplicationContext, 0, refreshIntent, 0));

                    var preferences = PreferenceManager.GetDefaultSharedPreferences(ApplicationContext);
                    var ids         = preferences.GetStringSet("lastWidgetItems", new List <string>()).Select(int.Parse).ToList();
                    if (!ids.OrderBy(i => i).SequenceEqual(shows.Items.Select(model => model.Id).OrderBy(i => i)))
                    {
                        manager.NotifyAppWidgetViewDataChanged(view.Item2, Resource.Id.GridView);

                        var edit = preferences.Edit();
                        edit.PutStringSet("lastWidgetItems", shows.Items.Select(model => model.Id.ToString()).ToList());
                        edit.Commit();
                    }



                    manager.UpdateAppWidget(view.Item2, view.Item1);
                }
            }
            else
            {
                foreach (var view in _views)
                {
                    view.Item1.SetViewVisibility(Resource.Id.LoadingSpinner, ViewStates.Gone);
                    view.Item1.SetViewVisibility(Resource.Id.EmptyNotice, ViewStates.Visible);
                    view.Item1.SetViewVisibility(Resource.Id.GridView, ViewStates.Gone);


                    var refreshIntent = new Intent(ApplicationContext, typeof(CalendarWidgetUpdateService));
                    refreshIntent.PutExtra(AppWidgetManager.ExtraAppwidgetIds, new[] { view.Item2 });
                    refreshIntent.PutExtra("ResourceId", layoutId);
                    view.Item1.SetOnClickPendingIntent(Resource.Id.RefreshButton, PendingIntent.GetService(ApplicationContext, 0, refreshIntent, 0));


                    manager.UpdateAppWidget(view.Item2, view.Item1);
                }
            }

            await Task.Delay(6000); //let the widget update in peace...
        }