/* * Copyright (C) 2016 Álinson Santos Xavier <isoron@gmail.com> * * This file is part of Loop Habit Tracker. * * Loop Habit Tracker is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by the * Free Software Foundation, either version 3 of the License, or (at your * option) any later version. * * Loop Habit Tracker is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.isoron.uhabits.widgets; import android.appwidget.*; import android.content.*; import android.os.*; import android.support.annotation.*; import android.widget.*; import org.isoron.uhabits.*; import org.isoron.uhabits.models.*; import org.isoron.uhabits.preferences.*; import static android.os.Build.VERSION.*; import static android.os.Build.VERSION_CODES.*; import static org.isoron.uhabits.utils.WidgetUtils.*; public abstract class BaseWidgetProvider extends AppWidgetProvider { private HabitList habits; private WidgetPreferences widgetPrefs; @Override public void onAppWidgetOptionsChanged(@Nullable Context context, @Nullable AppWidgetManager manager, int widgetId, @Nullable Bundle options) { try { if (context == null) throw new RuntimeException("context is null"); if (manager == null) throw new RuntimeException("manager is null"); if (options == null) throw new RuntimeException("options is null"); context.setTheme(R.style.TransparentWidgetTheme); updateDependencies(context); BaseWidget widget = getWidgetFromId(context, widgetId); WidgetDimensions dims = getDimensionsFromOptions(context, options); widget.setDimensions(dims); updateAppWidget(manager, widget); } catch (RuntimeException e) { drawErrorWidget(context, manager, widgetId, e); e.printStackTrace(); } } @Override public void onDeleted(@Nullable Context context, @Nullable int[] ids) { if (context == null) throw new RuntimeException("context is null"); if (ids == null) throw new RuntimeException("ids is null"); updateDependencies(context); for (int id : ids) { BaseWidget widget = getWidgetFromId(context, id); widget.delete(); } } @Override public void onUpdate(@Nullable Context context, @Nullable AppWidgetManager manager, @Nullable int[] widgetIds) { if (context == null) throw new RuntimeException("context is null"); if (manager == null) throw new RuntimeException("manager is null"); if (widgetIds == null) throw new RuntimeException("widgetIds is null"); context.setTheme(R.style.TransparentWidgetTheme); updateDependencies(context); new Thread(() -> { Looper.prepare(); for (int id : widgetIds) update(context, manager, id); }).start(); } @NonNull protected Habit getHabitFromWidgetId(int widgetId) { long habitId = widgetPrefs.getHabitIdFromWidgetId(widgetId); Habit habit = habits.getById(habitId); if (habit == null) throw new HabitNotFoundException(); return habit; } @NonNull protected abstract BaseWidget getWidgetFromId(@NonNull Context context, int id); private void drawErrorWidget(Context context, AppWidgetManager manager, int widgetId, RuntimeException e) { RemoteViews errorView = new RemoteViews(context.getPackageName(), R.layout.widget_error); if(e instanceof HabitNotFoundException) { errorView.setCharSequence(R.id.label, "setText", context.getString(R.string.habit_not_found)); } manager.updateAppWidget(widgetId, errorView); } private void update(@NonNull Context context, @NonNull AppWidgetManager manager, int widgetId) { try { BaseWidget widget = getWidgetFromId(context, widgetId); if (SDK_INT > JELLY_BEAN) { Bundle options = manager.getAppWidgetOptions(widgetId); widget.setDimensions( getDimensionsFromOptions(context, options)); } updateAppWidget(manager, widget); } catch (RuntimeException e) { drawErrorWidget(context, manager, widgetId, e); e.printStackTrace(); } } private void updateDependencies(Context context) { HabitsApplication app = (HabitsApplication) context.getApplicationContext(); habits = app.getComponent().getHabitList(); widgetPrefs = app.getComponent().getWidgetPreferences(); } }