From ae7869d3a2982382e19125ebed26e39b1a1ad142 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Mon, 29 Feb 2016 07:19:43 -0500 Subject: [PATCH] Implement multiple widget providers --- app/src/main/AndroidManifest.xml | 43 ++++++- .../java/org/isoron/uhabits/MainActivity.java | 18 ++- .../uhabits/fragments/ListHabitsFragment.java | 4 +- ...mallWidgetView.java => CheckmarkView.java} | 25 ++-- .../isoron/uhabits/views/HabitScoreView.java | 9 +- .../BaseWidgetProvider.java} | 113 ++++++++++-------- .../widgets/CheckmarkWidgetProvider.java | 69 +++++++++++ .../HabitPickerDialog.java} | 20 ++-- .../widgets/HistoryWidgetProvider.java | 69 +++++++++++ .../uhabits/widgets/ScoreWidgetProvider.java | 70 +++++++++++ .../uhabits/widgets/StreakWidgetProvider.java | 70 +++++++++++ app/src/main/res/layout/list_habits_item.xml | 2 +- .../main/res/layout/small_widget_preview.xml | 17 +++ ...{widget_small.xml => widget_checkmark.xml} | 0 app/src/main/res/layout/widget_graph.xml | 2 +- ...get_info.xml => widget_checkmark_info.xml} | 6 +- app/src/main/res/xml/widget_history_info.xml | 15 +++ app/src/main/res/xml/widget_score_info.xml | 15 +++ app/src/main/res/xml/widget_streak_info.xml | 15 +++ 19 files changed, 491 insertions(+), 91 deletions(-) rename app/src/main/java/org/isoron/uhabits/views/{SmallWidgetView.java => CheckmarkView.java} (90%) rename app/src/main/java/org/isoron/uhabits/{HabitWidgetProvider.java => widgets/BaseWidgetProvider.java} (54%) create mode 100644 app/src/main/java/org/isoron/uhabits/widgets/CheckmarkWidgetProvider.java rename app/src/main/java/org/isoron/uhabits/{HabitWidgetConfigure.java => widgets/HabitPickerDialog.java} (80%) create mode 100644 app/src/main/java/org/isoron/uhabits/widgets/HistoryWidgetProvider.java create mode 100644 app/src/main/java/org/isoron/uhabits/widgets/ScoreWidgetProvider.java create mode 100644 app/src/main/java/org/isoron/uhabits/widgets/StreakWidgetProvider.java create mode 100644 app/src/main/res/layout/small_widget_preview.xml rename app/src/main/res/layout/{widget_small.xml => widget_checkmark.xml} (100%) rename app/src/main/res/xml/{small_widget_info.xml => widget_checkmark_info.xml} (63%) create mode 100644 app/src/main/res/xml/widget_history_info.xml create mode 100644 app/src/main/res/xml/widget_score_info.xml create mode 100644 app/src/main/res/xml/widget_streak_info.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 358d18fab..276fb6be6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -64,18 +64,53 @@ android:label="" android:theme="@style/Theme.AppCompat.Light.NoActionBar"/> - + + + + + + + + + + + + + + + + + + + + + + + android:resource="@xml/widget_streak_info"/> + android:name=".widgets.HabitPickerDialog" + android:theme="@style/Theme.AppCompat.Light.Dialog"> diff --git a/app/src/main/java/org/isoron/uhabits/MainActivity.java b/app/src/main/java/org/isoron/uhabits/MainActivity.java index a65b7c8d0..6fd9dc729 100644 --- a/app/src/main/java/org/isoron/uhabits/MainActivity.java +++ b/app/src/main/java/org/isoron/uhabits/MainActivity.java @@ -36,6 +36,11 @@ import org.isoron.helpers.ReplayableActivity; import org.isoron.uhabits.fragments.ListHabitsFragment; import org.isoron.uhabits.helpers.ReminderHelper; import org.isoron.uhabits.models.Habit; +import org.isoron.uhabits.widgets.BaseWidgetProvider; +import org.isoron.uhabits.widgets.CheckmarkWidgetProvider; +import org.isoron.uhabits.widgets.HistoryWidgetProvider; +import org.isoron.uhabits.widgets.ScoreWidgetProvider; +import org.isoron.uhabits.widgets.StreakWidgetProvider; public class MainActivity extends ReplayableActivity implements ListHabitsFragment.OnHabitClickListener @@ -70,6 +75,7 @@ public class MainActivity extends ReplayableActivity ReminderHelper.createReminderAlarms(MainActivity.this); DialogHelper.incrementLaunchCount(this); showTutorial(); + updateWidgets(this); } private void showTutorial() @@ -127,12 +133,18 @@ public class MainActivity extends ReplayableActivity public static void updateWidgets(Context context) { - ComponentName provider = new ComponentName(context, HabitWidgetProvider.class); + updateWidgets(context, CheckmarkWidgetProvider.class); + updateWidgets(context, HistoryWidgetProvider.class); + updateWidgets(context, ScoreWidgetProvider.class); + updateWidgets(context, StreakWidgetProvider.class); + } - Intent intent = new Intent(context, HabitWidgetProvider.class); + private static void updateWidgets(Context context, Class providerClass) + { + ComponentName provider = new ComponentName(context, providerClass); + Intent intent = new Intent(context, providerClass); intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); int ids[] = AppWidgetManager.getInstance(context).getAppWidgetIds(provider); - intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids); context.sendBroadcast(intent); } diff --git a/app/src/main/java/org/isoron/uhabits/fragments/ListHabitsFragment.java b/app/src/main/java/org/isoron/uhabits/fragments/ListHabitsFragment.java index 699d3320b..3fbd068dc 100644 --- a/app/src/main/java/org/isoron/uhabits/fragments/ListHabitsFragment.java +++ b/app/src/main/java/org/isoron/uhabits/fragments/ListHabitsFragment.java @@ -660,7 +660,7 @@ public class ListHabitsFragment extends Fragment LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(tvNameWidth, LayoutParams.WRAP_CONTENT, 1); - view.findViewById(R.id.tvName).setLayoutParams(params); + view.findViewById(R.id.label).setLayoutParams(params); inflateCheckmarkButtons(view); @@ -668,7 +668,7 @@ public class ListHabitsFragment extends Fragment } TextView tvStar = ((TextView) view.findViewById(R.id.tvStar)); - TextView tvName = (TextView) view.findViewById(R.id.tvName); + TextView tvName = (TextView) view.findViewById(R.id.label); LinearLayout llInner = (LinearLayout) view.findViewById(R.id.llInner); LinearLayout llButtons = (LinearLayout) view.findViewById(R.id.llButtons); diff --git a/app/src/main/java/org/isoron/uhabits/views/SmallWidgetView.java b/app/src/main/java/org/isoron/uhabits/views/CheckmarkView.java similarity index 90% rename from app/src/main/java/org/isoron/uhabits/views/SmallWidgetView.java rename to app/src/main/java/org/isoron/uhabits/views/CheckmarkView.java index 18817c787..916952275 100644 --- a/app/src/main/java/org/isoron/uhabits/views/SmallWidgetView.java +++ b/app/src/main/java/org/isoron/uhabits/views/CheckmarkView.java @@ -1,5 +1,4 @@ -/* - * Copyright (C) 2016 Alinson Santos Xavier +/* Copyright (C) 2016 Alinson Santos Xavier * * This program 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 @@ -13,8 +12,6 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * - * */ package org.isoron.uhabits.views; @@ -25,6 +22,7 @@ import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.Typeface; +import android.os.Build; import android.text.Layout; import android.text.StaticLayout; import android.text.TextPaint; @@ -35,7 +33,7 @@ import org.isoron.helpers.ColorHelper; import org.isoron.uhabits.R; import org.isoron.uhabits.models.Habit; -public class SmallWidgetView extends View +public class CheckmarkView extends View { private Paint pCard; private Paint pIcon; @@ -65,13 +63,13 @@ public class SmallWidgetView extends View private TextPaint textPaint; private StaticLayout labelLayout; - public SmallWidgetView(Context context) + public CheckmarkView(Context context) { super(context); init(context); } - public SmallWidgetView(Context context, AttributeSet attrs) + public CheckmarkView(Context context, AttributeSet attrs) { super(context, attrs); init(context); @@ -135,8 +133,15 @@ public class SmallWidgetView extends View int color = (check_status == 2 ? primaryColor : darkGrey); pCard.setColor(color); - canvas.drawRoundRect(leftMargin, topMargin, width - leftMargin, height - topMargin, padding, - padding, pCard); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) + { + canvas.drawRoundRect(leftMargin, topMargin, width - leftMargin, height - topMargin, padding, + padding, pCard); + } + else + { + canvas.drawRect(leftMargin, topMargin, width - leftMargin, height - topMargin, pCard); + } } private void drawCheckmark(Canvas canvas) @@ -176,8 +181,6 @@ public class SmallWidgetView extends View { super.onMeasure(width, height); setMeasuredDimension(width, height); - updateSize(width, height); - updateLabel(); } @Override diff --git a/app/src/main/java/org/isoron/uhabits/views/HabitScoreView.java b/app/src/main/java/org/isoron/uhabits/views/HabitScoreView.java index 87ff35083..4f253fa6b 100644 --- a/app/src/main/java/org/isoron/uhabits/views/HabitScoreView.java +++ b/app/src/main/java/org/isoron/uhabits/views/HabitScoreView.java @@ -120,9 +120,12 @@ public class HabitScoreView extends ScrollableDataView int width = MeasureSpec.getSize(widthMeasureSpec); int height = MeasureSpec.getSize(heightMeasureSpec); - int b = height / 9; - height = b * 9; - width = (width / b) * b; + if(height > 0) + { + int b = height / 9; + height = b * 9; + width = (width / b) * b; + } setMeasuredDimension(width, height); } diff --git a/app/src/main/java/org/isoron/uhabits/HabitWidgetProvider.java b/app/src/main/java/org/isoron/uhabits/widgets/BaseWidgetProvider.java similarity index 54% rename from app/src/main/java/org/isoron/uhabits/HabitWidgetProvider.java rename to app/src/main/java/org/isoron/uhabits/widgets/BaseWidgetProvider.java index cc8ab43f1..970a82aaf 100644 --- a/app/src/main/java/org/isoron/uhabits/HabitWidgetProvider.java +++ b/app/src/main/java/org/isoron/uhabits/widgets/BaseWidgetProvider.java @@ -14,100 +14,107 @@ * along with this program. If not, see . */ -package org.isoron.uhabits; +package org.isoron.uhabits.widgets; +import android.app.PendingIntent; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProvider; import android.content.Context; import android.content.SharedPreferences; import android.graphics.Bitmap; +import android.os.Build; import android.os.Bundle; import android.preference.PreferenceManager; import android.util.Log; +import android.view.View; import android.widget.RemoteViews; import org.isoron.helpers.DialogHelper; +import org.isoron.uhabits.R; import org.isoron.uhabits.models.Habit; -import org.isoron.uhabits.views.HabitScoreView; -public class HabitWidgetProvider extends AppWidgetProvider +public abstract class BaseWidgetProvider extends AppWidgetProvider { + protected abstract int getDefaultHeight(); + + protected abstract int getDefaultWidth(); + + protected abstract PendingIntent getOnClickPendingIntent(Context context, Habit habit); + + protected abstract int getLayoutId(); + + protected abstract View buildCustomView(Context context, int max_height, int max_width, + Habit habit); + + public static String getHabitIdKey(long widgetId) + { + return String.format("widget-%06d-habit", widgetId); + } + + @Override + public void onDeleted(Context context, int[] appWidgetIds) + { + Context appContext = context.getApplicationContext(); + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(appContext); + + for(Integer id : appWidgetIds) + prefs.edit().remove(getHabitIdKey(id)); + } + + @Override + public void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, + int appWidgetId, Bundle newOptions) + { + updateWidget(context, appWidgetManager, appWidgetId, newOptions); + } + @Override public void onUpdate(Context context, AppWidgetManager manager, int[] appWidgetIds) { for(int id : appWidgetIds) { - Bundle options = manager.getAppWidgetOptions(id); + Bundle options = null; + + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) + options = manager.getAppWidgetOptions(id); + updateWidget(context, manager, id, options); } } private void updateWidget(Context context, AppWidgetManager manager, int widgetId, Bundle options) { - int max_height = (int) DialogHelper.dpToPixels(context, options.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT)); - int min_height = (int) DialogHelper.dpToPixels(context, options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT)); - int max_width = (int) DialogHelper.dpToPixels(context, options.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH)); - int min_width = (int) DialogHelper.dpToPixels(context, options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH)); + int maxWidth = getDefaultWidth(); + int maxHeight = getDefaultHeight(); - Log.d("HabitWidgetProvider", String.format("max_h=%d min_h=%d max_w=%d min_w=%d", - max_height, min_height, max_width, min_width)); + if (options != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) + { + maxWidth = (int) DialogHelper.dpToPixels(context, + options.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH)); + maxHeight = (int) DialogHelper.dpToPixels(context, + options.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT)); + } - RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_graph); Context appContext = context.getApplicationContext(); + RemoteViews remoteViews = new RemoteViews(context.getPackageName(), getLayoutId()); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(appContext); - Long habitId = prefs.getLong(getWidgetPrefKey(widgetId), -1L); + Long habitId = prefs.getLong(getHabitIdKey(widgetId), -1L); if(habitId < 0) return; Habit habit = Habit.get(habitId); - -// SmallWidgetView widgetView = new SmallWidgetView(context); -// HabitHistoryView widgetView = new HabitHistoryView(context, null); - HabitScoreView widgetView = new HabitScoreView(context, null); -// HabitStreakView widgetView = new HabitStreakView(context, null); - widgetView.setIsBackgroundTransparent(true); - widgetView.setHabit(habit); + View widgetView = buildCustomView(context, maxHeight, maxWidth, habit); widgetView.setDrawingCacheEnabled(true); - widgetView.measure(max_width, max_height); - widgetView.layout(0, 0, max_width, max_height); - - int width = widgetView.getMeasuredWidth(); - int height = widgetView.getMeasuredHeight(); - Log.d("SmallWidgetProvider", String.format("width=%d height=%d\n", width, height)); - - height -= DialogHelper.dpToPixels(context, 12f); - widgetView.measure(width, height); - widgetView.layout(0, 0, width, height); widgetView.buildDrawingCache(true); Bitmap drawingCache = widgetView.getDrawingCache(); - remoteViews.setTextViewText(R.id.tvName, habit.name); + remoteViews.setTextViewText(R.id.label, habit.name); remoteViews.setImageViewBitmap(R.id.imageView, drawingCache); - remoteViews.setOnClickPendingIntent(R.id.imageView, - HabitBroadcastReceiver.buildCheckIntent(context, habit, null)); - manager.updateAppWidget(widgetId, remoteViews); - } - public static String getWidgetPrefKey(long widgetId) - { - return String.format("widget-%03d", widgetId); - } + PendingIntent onClickIntent = getOnClickPendingIntent(context, habit); + if(onClickIntent != null) remoteViews.setOnClickPendingIntent(R.id.imageView, onClickIntent); - @Override - public void onDeleted(Context context, int[] appWidgetIds) - { - Context appContext = context.getApplicationContext(); - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(appContext); - - for(Integer id : appWidgetIds) - prefs.edit().remove(getWidgetPrefKey(id)); - } - - @Override - public void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, - int appWidgetId, Bundle newOptions) - { - updateWidget(context, appWidgetManager, appWidgetId, newOptions); + manager.updateAppWidget(widgetId, remoteViews); } } diff --git a/app/src/main/java/org/isoron/uhabits/widgets/CheckmarkWidgetProvider.java b/app/src/main/java/org/isoron/uhabits/widgets/CheckmarkWidgetProvider.java new file mode 100644 index 000000000..fb81d7133 --- /dev/null +++ b/app/src/main/java/org/isoron/uhabits/widgets/CheckmarkWidgetProvider.java @@ -0,0 +1,69 @@ +/* Copyright (C) 2016 Alinson Santos Xavier + * + * This program 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. + * + * This program 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 . + */ +package org.isoron.uhabits.widgets; + +import android.app.PendingIntent; +import android.content.Context; +import android.view.View; + +import org.isoron.uhabits.HabitBroadcastReceiver; +import org.isoron.uhabits.R; +import org.isoron.uhabits.models.Habit; +import org.isoron.uhabits.views.CheckmarkView; + +public class CheckmarkWidgetProvider extends BaseWidgetProvider +{ + @Override + protected View buildCustomView(Context context, int maxHeight, int maxWidth, Habit habit) + { + CheckmarkView widgetView = new CheckmarkView(context); + + widgetView.setHabit(habit); + widgetView.measure(maxWidth, maxHeight); + widgetView.layout(0, 0, maxWidth, maxHeight); + + int width = widgetView.getMeasuredWidth(); + int height = widgetView.getMeasuredHeight(); + widgetView.measure(width, height); + widgetView.layout(0, 0, width, height); + + return widgetView; + } + + @Override + protected PendingIntent getOnClickPendingIntent(Context context, Habit habit) + { + return HabitBroadcastReceiver.buildCheckIntent(context, habit, null); + } + + @Override + protected int getDefaultHeight() + { + return 200; + } + + @Override + protected int getDefaultWidth() + { + return 160; + } + + @Override + protected int getLayoutId() + { + return R.layout.widget_checkmark; + } +} diff --git a/app/src/main/java/org/isoron/uhabits/HabitWidgetConfigure.java b/app/src/main/java/org/isoron/uhabits/widgets/HabitPickerDialog.java similarity index 80% rename from app/src/main/java/org/isoron/uhabits/HabitWidgetConfigure.java rename to app/src/main/java/org/isoron/uhabits/widgets/HabitPickerDialog.java index 0a7275bdd..f44127cac 100644 --- a/app/src/main/java/org/isoron/uhabits/HabitWidgetConfigure.java +++ b/app/src/main/java/org/isoron/uhabits/widgets/HabitPickerDialog.java @@ -14,7 +14,7 @@ * along with this program. If not, see . */ -package org.isoron.uhabits; +package org.isoron.uhabits.widgets; import android.app.Activity; import android.appwidget.AppWidgetManager; @@ -27,20 +27,19 @@ import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ListView; +import org.isoron.uhabits.MainActivity; +import org.isoron.uhabits.R; import org.isoron.uhabits.models.Habit; +import org.isoron.uhabits.widgets.BaseWidgetProvider; import java.util.ArrayList; import java.util.List; -public class HabitWidgetConfigure extends Activity implements AdapterView.OnItemClickListener +public class HabitPickerDialog extends Activity implements AdapterView.OnItemClickListener { private Integer widgetId; - private ListView listView; - private ArrayList habitIds; - private ArrayList habitNames; - private ArrayAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) @@ -54,10 +53,10 @@ public class HabitWidgetConfigure extends Activity implements AdapterView.OnItem if (extras != null) widgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); - listView = (ListView) findViewById(R.id.listView); + ListView listView = (ListView) findViewById(R.id.listView); habitIds = new ArrayList<>(); - habitNames = new ArrayList<>(); + ArrayList habitNames = new ArrayList<>(); List habits = Habit.getAll(false); for(Habit h : habits) @@ -66,7 +65,8 @@ public class HabitWidgetConfigure extends Activity implements AdapterView.OnItem habitNames.add(h.name); } - adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, habitNames); + ArrayAdapter adapter = + new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, habitNames); listView.setAdapter(adapter); listView.setOnItemClickListener(this); } @@ -77,7 +77,7 @@ public class HabitWidgetConfigure extends Activity implements AdapterView.OnItem Long habitId = habitIds.get(position); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences( getApplicationContext()); - prefs.edit().putLong(HabitWidgetProvider.getWidgetPrefKey(widgetId), habitId).commit(); + prefs.edit().putLong(BaseWidgetProvider.getHabitIdKey(widgetId), habitId).commit(); MainActivity.updateWidgets(this); diff --git a/app/src/main/java/org/isoron/uhabits/widgets/HistoryWidgetProvider.java b/app/src/main/java/org/isoron/uhabits/widgets/HistoryWidgetProvider.java new file mode 100644 index 000000000..2a382ef01 --- /dev/null +++ b/app/src/main/java/org/isoron/uhabits/widgets/HistoryWidgetProvider.java @@ -0,0 +1,69 @@ +/* Copyright (C) 2016 Alinson Santos Xavier + * + * This program 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. + * + * This program 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 . + */ +package org.isoron.uhabits.widgets; + +import android.app.PendingIntent; +import android.content.Context; +import android.view.View; + +import org.isoron.helpers.DialogHelper; +import org.isoron.uhabits.R; +import org.isoron.uhabits.models.Habit; +import org.isoron.uhabits.views.HabitHistoryView; + +public class HistoryWidgetProvider extends BaseWidgetProvider +{ + @Override + protected View buildCustomView(Context context, int maxHeight, int maxWidth, Habit habit) + { + HabitHistoryView view = new HabitHistoryView(context, null); + view.setHabit(habit); + view.measure(maxWidth, maxHeight); + view.layout(0, 0, maxWidth, maxHeight); + + int width = view.getMeasuredWidth(); + int height = view.getMeasuredHeight(); + height -= DialogHelper.dpToPixels(context, 12); + view.measure(width, height); + view.layout(0, 0, width, height); + + return view; + } + + @Override + protected PendingIntent getOnClickPendingIntent(Context context, Habit habit) + { + return null; + } + + @Override + protected int getDefaultHeight() + { + return 200; + } + + @Override + protected int getDefaultWidth() + { + return 200; + } + + @Override + protected int getLayoutId() + { + return R.layout.widget_graph; + } +} diff --git a/app/src/main/java/org/isoron/uhabits/widgets/ScoreWidgetProvider.java b/app/src/main/java/org/isoron/uhabits/widgets/ScoreWidgetProvider.java new file mode 100644 index 000000000..6dd3ae246 --- /dev/null +++ b/app/src/main/java/org/isoron/uhabits/widgets/ScoreWidgetProvider.java @@ -0,0 +1,70 @@ +/* Copyright (C) 2016 Alinson Santos Xavier + * + * This program 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. + * + * This program 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 . + */ +package org.isoron.uhabits.widgets; + +import android.app.PendingIntent; +import android.content.Context; +import android.view.View; + +import org.isoron.helpers.DialogHelper; +import org.isoron.uhabits.R; +import org.isoron.uhabits.models.Habit; +import org.isoron.uhabits.views.HabitScoreView; + +public class ScoreWidgetProvider extends BaseWidgetProvider +{ + @Override + protected View buildCustomView(Context context, int maxHeight, int maxWidth, Habit habit) + { + HabitScoreView view = new HabitScoreView(context, null); + view.setIsBackgroundTransparent(true); + view.setHabit(habit); + view.measure(maxWidth, maxHeight); + view.layout(0, 0, maxWidth, maxHeight); + + int width = view.getMeasuredWidth(); + int height = view.getMeasuredHeight(); + height -= DialogHelper.dpToPixels(context, 12); + view.measure(width, height); + view.layout(0, 0, width, height); + + return view; + } + + @Override + protected PendingIntent getOnClickPendingIntent(Context context, Habit habit) + { + return null; + } + + @Override + protected int getDefaultHeight() + { + return 200; + } + + @Override + protected int getDefaultWidth() + { + return 200; + } + + @Override + protected int getLayoutId() + { + return R.layout.widget_graph; + } +} diff --git a/app/src/main/java/org/isoron/uhabits/widgets/StreakWidgetProvider.java b/app/src/main/java/org/isoron/uhabits/widgets/StreakWidgetProvider.java new file mode 100644 index 000000000..e7685748c --- /dev/null +++ b/app/src/main/java/org/isoron/uhabits/widgets/StreakWidgetProvider.java @@ -0,0 +1,70 @@ +/* Copyright (C) 2016 Alinson Santos Xavier + * + * This program 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. + * + * This program 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 . + */ +package org.isoron.uhabits.widgets; + +import android.app.PendingIntent; +import android.content.Context; +import android.view.View; + +import org.isoron.helpers.DialogHelper; +import org.isoron.uhabits.R; +import org.isoron.uhabits.models.Habit; +import org.isoron.uhabits.views.HabitScoreView; +import org.isoron.uhabits.views.HabitStreakView; + +public class StreakWidgetProvider extends BaseWidgetProvider +{ + @Override + protected View buildCustomView(Context context, int maxHeight, int maxWidth, Habit habit) + { + HabitStreakView view = new HabitStreakView(context, null); + view.setHabit(habit); + view.measure(maxWidth, maxHeight); + view.layout(0, 0, maxWidth, maxHeight); + + int width = view.getMeasuredWidth(); + int height = view.getMeasuredHeight(); + height -= DialogHelper.dpToPixels(context, 12); + view.measure(width, height); + view.layout(0, 0, width, height); + + return view; + } + + @Override + protected PendingIntent getOnClickPendingIntent(Context context, Habit habit) + { + return null; + } + + @Override + protected int getDefaultHeight() + { + return 200; + } + + @Override + protected int getDefaultWidth() + { + return 200; + } + + @Override + protected int getLayoutId() + { + return R.layout.widget_graph; + } +} diff --git a/app/src/main/res/layout/list_habits_item.xml b/app/src/main/res/layout/list_habits_item.xml index b1f07dc7a..2e4704952 100644 --- a/app/src/main/res/layout/list_habits_item.xml +++ b/app/src/main/res/layout/list_habits_item.xml @@ -12,7 +12,7 @@ style="@style/habitsListStarStyle" /> + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/widget_small.xml b/app/src/main/res/layout/widget_checkmark.xml similarity index 100% rename from app/src/main/res/layout/widget_small.xml rename to app/src/main/res/layout/widget_checkmark.xml diff --git a/app/src/main/res/layout/widget_graph.xml b/app/src/main/res/layout/widget_graph.xml index f0d1fca8c..4075bbe8d 100644 --- a/app/src/main/res/layout/widget_graph.xml +++ b/app/src/main/res/layout/widget_graph.xml @@ -11,7 +11,7 @@ android:paddingRight="0dp"> diff --git a/app/src/main/res/xml/widget_history_info.xml b/app/src/main/res/xml/widget_history_info.xml new file mode 100644 index 000000000..dd8068375 --- /dev/null +++ b/app/src/main/res/xml/widget_history_info.xml @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/widget_score_info.xml b/app/src/main/res/xml/widget_score_info.xml new file mode 100644 index 000000000..dd8068375 --- /dev/null +++ b/app/src/main/res/xml/widget_score_info.xml @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/widget_streak_info.xml b/app/src/main/res/xml/widget_streak_info.xml new file mode 100644 index 000000000..dd8068375 --- /dev/null +++ b/app/src/main/res/xml/widget_streak_info.xml @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file