Restore all widgets

pull/145/head
Alinson S. Xavier 9 years ago
parent 52701666bc
commit 4ae813e6f9

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

@ -22,6 +22,7 @@ package org.isoron.uhabits;
import android.appwidget.*; import android.appwidget.*;
import android.content.*; import android.content.*;
import android.os.*; import android.os.*;
import android.support.annotation.*;
import android.support.test.*; import android.support.test.*;
import org.isoron.uhabits.commands.*; import org.isoron.uhabits.commands.*;
@ -63,6 +64,8 @@ public class BaseAndroidTest
protected HabitFixtures fixtures; protected HabitFixtures fixtures;
protected CountDownLatch latch;
@Before @Before
public void setUp() public void setUp()
{ {
@ -83,6 +86,27 @@ public class BaseAndroidTest
androidTestComponent.inject(this); androidTestComponent.inject(this);
fixtures = new HabitFixtures(habitList); fixtures = new HabitFixtures(habitList);
latch = new CountDownLatch(1);
}
protected void assertWidgetProviderIsInstalled(Class componentClass)
{
ComponentName provider =
new ComponentName(targetContext, componentClass);
AppWidgetManager manager = AppWidgetManager.getInstance(targetContext);
List<ComponentName> installedProviders = new LinkedList<>();
for (AppWidgetProviderInfo info : manager.getInstalledProviders())
installedProviders.add(info.provider);
assertThat(installedProviders, hasItems(provider));
}
protected void setTheme(@StyleRes int themeId)
{
InterfaceUtils.setFixedTheme(themeId);
targetContext.setTheme(themeId);
} }
protected void sleep(int time) protected void sleep(int time)
@ -108,19 +132,4 @@ public class BaseAndroidTest
BaseTask.waitForTasks(10000); BaseTask.waitForTasks(10000);
} }
protected void assertWidgetProviderIsInstalled(ComponentName desiredProvider)
{
AppWidgetManager manager = AppWidgetManager.getInstance(targetContext);
List<AppWidgetProviderInfo> providerInfoList;
List<ComponentName> installedProviders;
providerInfoList = manager.getInstalledProviders();
installedProviders = new LinkedList<>();
for (AppWidgetProviderInfo info : providerInfoList)
installedProviders.add(info.provider);
assertThat(installedProviders, hasItems(desiredProvider));
}
} }

@ -19,7 +19,6 @@
package org.isoron.uhabits.ui.widgets; package org.isoron.uhabits.ui.widgets;
import android.content.*;
import android.support.test.runner.*; import android.support.test.runner.*;
import android.test.suitebuilder.annotation.*; import android.test.suitebuilder.annotation.*;
import android.widget.*; import android.widget.*;
@ -70,16 +69,13 @@ public class CheckmarkWidgetTest extends BaseViewTest
button.performClick(); button.performClick();
sleep(1000); sleep(1000);
assertThat(checkmarks.getTodayValue(), equalTo(CHECKED_IMPLICITLY)); assertThat(checkmarks.getTodayValue(), equalTo(UNCHECKED));
} }
@Test @Test
public void testIsInstalled() public void testIsInstalled()
{ {
ComponentName provider = assertWidgetProviderIsInstalled(CheckmarkWidgetProvider.class);
new ComponentName(targetContext, CheckmarkWidgetProvider.class);
assertWidgetProviderIsInstalled(provider);
} }
@Test @Test

@ -0,0 +1,64 @@
/*
* 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.ui.widgets;
import android.support.test.runner.*;
import android.test.suitebuilder.annotation.*;
import android.widget.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.widgets.*;
import org.junit.*;
import org.junit.runner.*;
@RunWith(AndroidJUnit4.class)
@MediumTest
public class FrequencyWidgetTest extends BaseViewTest
{
private static final String PATH = "widgets/FrequencyWidget/";
private Habit habit;
private FrameLayout view;
@Override
public void setUp()
{
super.setUp();
setTheme(R.style.TransparentWidgetTheme);
habit = fixtures.createLongHabit();
FrequencyWidget widget = new FrequencyWidget(targetContext, 0, habit);
view = convertToView(widget, 400, 400);
}
@Test
public void testIsInstalled()
{
assertWidgetProviderIsInstalled(FrequencyWidgetProvider.class);
}
@Test
public void testRender() throws Exception
{
assertRenders(view, PATH + "render.png");
}
}

@ -0,0 +1,64 @@
/*
* 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.ui.widgets;
import android.support.test.runner.*;
import android.test.suitebuilder.annotation.*;
import android.widget.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.widgets.*;
import org.junit.*;
import org.junit.runner.*;
@RunWith(AndroidJUnit4.class)
@MediumTest
public class HistoryWidgetTest extends BaseViewTest
{
private static final String PATH = "widgets/HistoryWidget/";
private Habit habit;
private FrameLayout view;
@Override
public void setUp()
{
super.setUp();
setTheme(R.style.TransparentWidgetTheme);
habit = fixtures.createLongHabit();
HistoryWidget widget = new HistoryWidget(targetContext, 0, habit);
view = convertToView(widget, 400, 400);
}
@Test
public void testIsInstalled()
{
assertWidgetProviderIsInstalled(HistoryWidgetProvider.class);
}
@Test
public void testRender() throws Exception
{
assertRenders(view, PATH + "render.png");
}
}

@ -0,0 +1,64 @@
/*
* 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.ui.widgets;
import android.support.test.runner.*;
import android.test.suitebuilder.annotation.*;
import android.widget.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.widgets.*;
import org.junit.*;
import org.junit.runner.*;
@RunWith(AndroidJUnit4.class)
@MediumTest
public class ScoreWidgetTest extends BaseViewTest
{
private static final String PATH = "widgets/ScoreWidget/";
private Habit habit;
private FrameLayout view;
@Override
public void setUp()
{
super.setUp();
setTheme(R.style.TransparentWidgetTheme);
habit = fixtures.createLongHabit();
ScoreWidget widget = new ScoreWidget(targetContext, 0, habit);
view = convertToView(widget, 400, 400);
}
@Test
public void testIsInstalled()
{
assertWidgetProviderIsInstalled(ScoreWidgetProvider.class);
}
@Test
public void testRender() throws Exception
{
assertRenders(view, PATH + "render.png");
}
}

@ -0,0 +1,64 @@
/*
* 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.ui.widgets;
import android.support.test.runner.*;
import android.test.suitebuilder.annotation.*;
import android.widget.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.widgets.*;
import org.junit.*;
import org.junit.runner.*;
@RunWith(AndroidJUnit4.class)
@MediumTest
public class StreakWidgetTest extends BaseViewTest
{
private static final String PATH = "widgets/StreakWidget/";
private Habit habit;
private FrameLayout view;
@Override
public void setUp()
{
super.setUp();
setTheme(R.style.TransparentWidgetTheme);
habit = fixtures.createLongHabit();
StreakWidget widget = new StreakWidget(targetContext, 0, habit);
view = convertToView(widget, 400, 400);
}
@Test
public void testIsInstalled()
{
assertWidgetProviderIsInstalled(StreakWidgetProvider.class);
}
@Test
public void testRender() throws Exception
{
assertRenders(view, PATH + "render.png");
}
}

@ -108,53 +108,53 @@
android:resource="@xml/widget_checkmark_info"/> android:resource="@xml/widget_checkmark_info"/>
</receiver> </receiver>
<!--<receiver--> <receiver
<!--android:name=".widgets.HistoryWidgetProvider"--> android:name=".widgets.HistoryWidgetProvider"
<!--android:label="@string/history">--> android:label="@string/history">
<!--<intent-filter>--> <intent-filter>
<!--<action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>--> <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
<!--</intent-filter>--> </intent-filter>
<!--<meta-data--> <meta-data
<!--android:name="android.appwidget.provider"--> android:name="android.appwidget.provider"
<!--android:resource="@xml/widget_history_info"/>--> android:resource="@xml/widget_history_info"/>
<!--</receiver>--> </receiver>
<!--<receiver--> <receiver
<!--android:name=".widgets.ScoreWidgetProvider"--> android:name=".widgets.ScoreWidgetProvider"
<!--android:label="@string/habit_strength">--> android:label="@string/habit_strength">
<!--<intent-filter>--> <intent-filter>
<!--<action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>--> <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
<!--</intent-filter>--> </intent-filter>
<!--<meta-data--> <meta-data
<!--android:name="android.appwidget.provider"--> android:name="android.appwidget.provider"
<!--android:resource="@xml/widget_score_info"/>--> android:resource="@xml/widget_score_info"/>
<!--</receiver>--> </receiver>
<!--<receiver--> <receiver
<!--android:name=".widgets.StreakWidgetProvider"--> android:name=".widgets.StreakWidgetProvider"
<!--android:label="@string/streaks">--> android:label="@string/streaks">
<!--<intent-filter>--> <intent-filter>
<!--<action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>--> <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
<!--</intent-filter>--> </intent-filter>
<!--<meta-data--> <meta-data
<!--android:name="android.appwidget.provider"--> android:name="android.appwidget.provider"
<!--android:resource="@xml/widget_streak_info"/>--> android:resource="@xml/widget_streak_info"/>
<!--</receiver>--> </receiver>
<!--<receiver--> <receiver
<!--android:name=".widgets.FrequencyWidgetProvider"--> android:name=".widgets.FrequencyWidgetProvider"
<!--android:label="@string/frequency">--> android:label="@string/frequency">
<!--<intent-filter>--> <intent-filter>
<!--<action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>--> <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
<!--</intent-filter>--> </intent-filter>
<!--<meta-data--> <meta-data
<!--android:name="android.appwidget.provider"--> android:name="android.appwidget.provider"
<!--android:resource="@xml/widget_frequency_info"/>--> android:resource="@xml/widget_frequency_info"/>
<!--</receiver>--> </receiver>
<receiver android:name=".HabitBroadcastReceiver"> <receiver android:name=".HabitBroadcastReceiver">
<intent-filter> <intent-filter>

@ -26,12 +26,10 @@ import android.net.*;
import android.os.*; import android.os.*;
import android.preference.*; import android.preference.*;
import android.support.v4.app.*; import android.support.v4.app.*;
import android.support.v4.app.TaskStackBuilder;
import org.isoron.uhabits.commands.*; import org.isoron.uhabits.commands.*;
import org.isoron.uhabits.models.*; import org.isoron.uhabits.models.*;
import org.isoron.uhabits.tasks.*; import org.isoron.uhabits.tasks.*;
import org.isoron.uhabits.ui.habits.show.*;
import org.isoron.uhabits.utils.*; import org.isoron.uhabits.utils.*;
import java.util.*; import java.util.*;
@ -39,9 +37,9 @@ import java.util.*;
import javax.inject.*; import javax.inject.*;
/** /**
* The Android BroadacastReceiver for Loop Habit Tracker. * The Android BroadcastReceiver for Loop Habit Tracker.
* <p/> * <p/>
* Currently, all broadcast messages are received and processed by this class. * All broadcast messages are received and processed by this class.
*/ */
public class HabitBroadcastReceiver extends BroadcastReceiver public class HabitBroadcastReceiver extends BroadcastReceiver
{ {
@ -68,50 +66,6 @@ public class HabitBroadcastReceiver extends BroadcastReceiver
HabitsApplication.getComponent().inject(this); HabitsApplication.getComponent().inject(this);
} }
public static PendingIntent buildCheckIntent(Context context,
Habit habit,
Long timestamp)
{
Uri data = habit.getUri();
Intent checkIntent = new Intent(context, HabitBroadcastReceiver.class);
checkIntent.setData(data);
checkIntent.setAction(ACTION_CHECK);
if (timestamp != null) checkIntent.putExtra("timestamp", timestamp);
return PendingIntent.getBroadcast(context, 0, checkIntent,
PendingIntent.FLAG_CANCEL_CURRENT);
}
public static PendingIntent buildDismissIntent(Context context)
{
Intent deleteIntent = new Intent(context, HabitBroadcastReceiver.class);
deleteIntent.setAction(ACTION_DISMISS);
return PendingIntent.getBroadcast(context, 0, deleteIntent,
PendingIntent.FLAG_CANCEL_CURRENT);
}
public static PendingIntent buildSnoozeIntent(Context context, Habit habit)
{
Uri data = habit.getUri();
Intent snoozeIntent = new Intent(context, HabitBroadcastReceiver.class);
snoozeIntent.setData(data);
snoozeIntent.setAction(ACTION_SNOOZE);
return PendingIntent.getBroadcast(context, 0, snoozeIntent,
PendingIntent.FLAG_CANCEL_CURRENT);
}
public static PendingIntent buildViewHabitIntent(Context context,
Habit habit)
{
Intent intent = new Intent(context, ShowHabitActivity.class);
intent.setData(
Uri.parse("content://org.isoron.uhabits/habit/" + habit.getId()));
return TaskStackBuilder
.create(context.getApplicationContext())
.addNextIntentWithParentStack(intent)
.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
}
public static void dismissNotification(Context context, Habit habit) public static void dismissNotification(Context context, Habit habit)
{ {
NotificationManager notificationManager = NotificationManager notificationManager =
@ -153,8 +107,8 @@ public class HabitBroadcastReceiver extends BroadcastReceiver
private void checkHabit(Context context, Intent intent) private void checkHabit(Context context, Intent intent)
{ {
Uri data = intent.getData(); Uri data = intent.getData();
Long timestamp = long today = DateUtils.getStartOfToday();
intent.getLongExtra("timestamp", DateUtils.getStartOfToday()); Long timestamp = intent.getLongExtra("timestamp", today);
long habitId = ContentUris.parseId(data); long habitId = ContentUris.parseId(data);
Habit habit = habitList.getById(habitId); Habit habit = habitList.getById(habitId);
@ -217,12 +171,13 @@ public class HabitBroadcastReceiver extends BroadcastReceiver
PendingIntent.getActivity(context, 0, contentIntent, PendingIntent.getActivity(context, 0, contentIntent,
PendingIntent.FLAG_CANCEL_CURRENT); PendingIntent.FLAG_CANCEL_CURRENT);
PendingIntent dismissPendingIntent = PendingIntent dismissPendingIntent;
buildDismissIntent(context); dismissPendingIntent =
HabitPendingIntents.dismissNotification(context);
PendingIntent checkIntentPending = PendingIntent checkIntentPending =
buildCheckIntent(context, habit, timestamp); HabitPendingIntents.toggleCheckmark(context, habit, timestamp);
PendingIntent snoozeIntentPending = PendingIntent snoozeIntentPending =
buildSnoozeIntent(context, habit); HabitPendingIntents.snoozeNotification(context, habit);
Uri ringtoneUri = ReminderUtils.getRingtoneUri(context); Uri ringtoneUri = ReminderUtils.getRingtoneUri(context);

@ -0,0 +1,75 @@
/*
* 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;
import android.app.*;
import android.content.*;
import android.net.*;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.ui.habits.show.*;
public abstract class HabitPendingIntents
{
private static final String BASE_URL =
"content://org.isoron.uhabits/habit/";
public static PendingIntent dismissNotification(Context context)
{
Intent deleteIntent = new Intent(context, HabitBroadcastReceiver.class);
deleteIntent.setAction(HabitBroadcastReceiver.ACTION_DISMISS);
return PendingIntent.getBroadcast(context, 0, deleteIntent,
PendingIntent.FLAG_CANCEL_CURRENT);
}
public static PendingIntent snoozeNotification(Context context, Habit habit)
{
Uri data = habit.getUri();
Intent snoozeIntent = new Intent(context, HabitBroadcastReceiver.class);
snoozeIntent.setData(data);
snoozeIntent.setAction(HabitBroadcastReceiver.ACTION_SNOOZE);
return PendingIntent.getBroadcast(context, 0, snoozeIntent,
PendingIntent.FLAG_CANCEL_CURRENT);
}
public static PendingIntent toggleCheckmark(Context context,
Habit habit,
Long timestamp)
{
Uri data = habit.getUri();
Intent checkIntent = new Intent(context, HabitBroadcastReceiver.class);
checkIntent.setData(data);
checkIntent.setAction(HabitBroadcastReceiver.ACTION_CHECK);
if (timestamp != null) checkIntent.putExtra("timestamp", timestamp);
return PendingIntent.getBroadcast(context, 0, checkIntent,
PendingIntent.FLAG_CANCEL_CURRENT);
}
public static PendingIntent viewHabit(Context context, Habit habit)
{
Intent intent = new Intent(context, ShowHabitActivity.class);
intent.setData(Uri.parse(BASE_URL + habit.getId()));
return android.support.v4.app.TaskStackBuilder
.create(context.getApplicationContext())
.addNextIntentWithParentStack(intent)
.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
}
}

@ -106,31 +106,6 @@ abstract public class BaseActivity extends AppCompatActivity
screen.onResult(request, result, data); screen.onResult(request, result, data);
} }
// @Override
// public void onCommandExecuted(Command command, Long refreshKey)
// {
// window.showMessage(command.getExecuteStringId());
// new BaseTask()
// {
// @Override
// protected void doInBackground()
// {
// dismissNotifications(BaseActivity.this);
// BackupManager.dataChanged("org.isoron.uhabits");
// WidgetManager.updateWidgets(BaseActivity.this);
// }
// }.execute();
// }
// private void dismissNotifications(Context context)
// {
// for (Habit h : Habit.getHabitsWithReminder())
// {
// if (h.checkmarks.getTodayValue() != Checkmark.UNCHECKED)
// HabitBroadcastReceiver.dismissNotification(context, h);
// }
// }
@Override @Override
protected void onCreate(Bundle savedInstanceState) protected void onCreate(Bundle savedInstanceState)
{ {

@ -164,6 +164,7 @@ public class ListHabitsController
new Handler().postDelayed(() -> { new Handler().postDelayed(() -> {
system.scheduleReminders(); system.scheduleReminders();
HabitsApplication.getWidgetManager().updateWidgets();
}, 1000); }, 1000);
} }

@ -61,10 +61,25 @@ public class ScoreCard extends HabitCard
init(); init();
} }
@NonNull
public static DateUtils.TruncateField getTruncateField(int bucketSize)
{
if (bucketSize == 7) return DateUtils.TruncateField.WEEK_NUMBER;
if (bucketSize == 31) return DateUtils.TruncateField.MONTH;
if (bucketSize == 92) return DateUtils.TruncateField.QUARTER;
if (bucketSize == 365) return DateUtils.TruncateField.YEAR;
Log.e("ScoreCard",
String.format("Unknown bucket size: %d", bucketSize));
return DateUtils.TruncateField.MONTH;
}
@OnItemSelected(R.id.spinner) @OnItemSelected(R.id.spinner)
public void onItemSelected(int position) public void onItemSelected(int position)
{ {
setBucketSizeFromPosition(position); setBucketSizeFromPosition(position);
HabitsApplication.getWidgetManager().updateWidgets();
refreshData(); refreshData();
} }
@ -80,20 +95,6 @@ public class ScoreCard extends HabitCard
return InterfaceUtils.getDefaultScoreSpinnerPosition(getContext()); return InterfaceUtils.getDefaultScoreSpinnerPosition(getContext());
} }
@NonNull
private DateUtils.TruncateField getTruncateField()
{
if (bucketSize == 7) return DateUtils.TruncateField.WEEK_NUMBER;
if (bucketSize == 31) return DateUtils.TruncateField.MONTH;
if (bucketSize == 92) return DateUtils.TruncateField.QUARTER;
if (bucketSize == 365) return DateUtils.TruncateField.YEAR;
Log.e("ScoreCard",
String.format("Unknown bucket size: %d", bucketSize));
return DateUtils.TruncateField.MONTH;
}
private void init() private void init()
{ {
inflate(getContext(), R.layout.show_habit_score, this); inflate(getContext(), R.layout.show_habit_score, this);
@ -126,9 +127,10 @@ public class ScoreCard extends HabitCard
protected void doInBackground() protected void doInBackground()
{ {
List<Score> scores; List<Score> scores;
ScoreList scoreList = getHabit().getScores();
if (bucketSize == 1) scores = getHabit().getScores().getAll(); if (bucketSize == 1) scores = scoreList.getAll();
else scores = getHabit().getScores().groupBy(getTruncateField()); else scores = scoreList.groupBy(getTruncateField(bucketSize));
chart.setScores(scores); chart.setScores(scores);
chart.setBucketSize(bucketSize); chart.setBucketSize(bucketSize);

@ -79,8 +79,6 @@ public abstract class BaseWidget
dimensions.getLandscapeHeight()); dimensions.getLandscapeHeight());
} }
public abstract int getLayoutId();
public abstract PendingIntent getOnClickPendingIntent(Context context); public abstract PendingIntent getOnClickPendingIntent(Context context);
@NonNull @NonNull
@ -103,8 +101,6 @@ public abstract class BaseWidget
protected abstract int getDefaultWidth(); protected abstract int getDefaultWidth();
protected abstract String getTitle();
private void adjustRemoteViewsPadding(RemoteViews remoteViews, private void adjustRemoteViewsPadding(RemoteViews remoteViews,
View view, View view,
int width, int width,
@ -122,7 +118,6 @@ public abstract class BaseWidget
int height) int height)
{ {
Bitmap bitmap = getBitmapFromView(view); Bitmap bitmap = getBitmapFromView(view);
remoteViews.setTextViewText(R.id.label, getTitle());
remoteViews.setImageViewBitmap(R.id.imageView, bitmap); remoteViews.setImageViewBitmap(R.id.imageView, bitmap);
if (SDK_INT >= JELLY_BEAN) if (SDK_INT >= JELLY_BEAN)
@ -160,11 +155,10 @@ public abstract class BaseWidget
refreshData(view); refreshData(view);
if(view.isLayoutRequested()) if (view.isLayoutRequested()) measureView(view, width, height);
measureView(view, width, height);
RemoteViews remoteViews = RemoteViews remoteViews =
new RemoteViews(context.getPackageName(), getLayoutId()); new RemoteViews(context.getPackageName(), R.layout.widget_wrapper);
buildRemoteViews(view, remoteViews, width, height); buildRemoteViews(view, remoteViews, width, height);
@ -174,7 +168,7 @@ public abstract class BaseWidget
private void measureView(View view, int width, int height) private void measureView(View view, int width, int height)
{ {
LayoutInflater inflater = LayoutInflater.from(context); LayoutInflater inflater = LayoutInflater.from(context);
View entireView = inflater.inflate(getLayoutId(), null); View entireView = inflater.inflate(R.layout.widget_wrapper, null);
int specWidth = makeMeasureSpec(width, View.MeasureSpec.EXACTLY); int specWidth = makeMeasureSpec(width, View.MeasureSpec.EXACTLY);
int specHeight = makeMeasureSpec(height, View.MeasureSpec.EXACTLY); int specHeight = makeMeasureSpec(height, View.MeasureSpec.EXACTLY);

@ -42,16 +42,10 @@ public class CheckmarkWidget extends BaseWidget
this.habit = habit; this.habit = habit;
} }
@Override
public int getLayoutId()
{
return R.layout.widget_wrapper;
}
@Override @Override
public PendingIntent getOnClickPendingIntent(Context context) public PendingIntent getOnClickPendingIntent(Context context)
{ {
return HabitBroadcastReceiver.buildCheckIntent(context, habit, null); return HabitPendingIntents.toggleCheckmark(context, habit, null);
} }
@Override @Override
@ -87,10 +81,4 @@ public class CheckmarkWidget extends BaseWidget
{ {
return 125; return 125;
} }
@Override
protected String getTitle()
{
return habit.getName();
}
} }

@ -0,0 +1,84 @@
/*
* 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.ui.widgets;
import android.app.*;
import android.content.*;
import android.support.annotation.*;
import android.view.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.ui.common.views.*;
import org.isoron.uhabits.ui.widgets.views.*;
import org.isoron.uhabits.utils.*;
public class FrequencyWidget extends BaseWidget
{
@NonNull
private final Habit habit;
public FrequencyWidget(@NonNull Context context,
int widgetId,
@NonNull Habit habit)
{
super(context, widgetId);
this.habit = habit;
}
@Override
public PendingIntent getOnClickPendingIntent(Context context)
{
return HabitPendingIntents.viewHabit(context, habit);
}
@Override
public void refreshData(View v)
{
GraphWidgetView widgetView = (GraphWidgetView) v;
FrequencyChart chart = (FrequencyChart) widgetView.getDataView();
widgetView.setTitle(habit.getName());
int color = ColorUtils.getColor(getContext(), habit.getColor());
chart.setColor(color);
chart.setFrequency(habit.getRepetitions().getWeekdayFrequency());
}
@Override
protected View buildView()
{
FrequencyChart chart = new FrequencyChart(getContext());
return new GraphWidgetView(getContext(), chart);
}
@Override
protected int getDefaultHeight()
{
return 200;
}
@Override
protected int getDefaultWidth()
{
return 200;
}
}

@ -56,7 +56,7 @@ public class HabitPickerDialog extends Activity
{ {
Long habitId = habitIds.get(position); Long habitId = habitIds.get(position);
preferences.addWidget(widgetId, habitId); preferences.addWidget(widgetId, habitId);
HabitsApplication.getWidgetManager().updateWidgets(this); HabitsApplication.getWidgetManager().updateWidgets();
Intent resultValue = new Intent(); Intent resultValue = new Intent();
resultValue.putExtra(EXTRA_APPWIDGET_ID, widgetId); resultValue.putExtra(EXTRA_APPWIDGET_ID, widgetId);

@ -0,0 +1,84 @@
/*
* 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.ui.widgets;
import android.app.*;
import android.content.*;
import android.support.annotation.*;
import android.view.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.ui.common.views.*;
import org.isoron.uhabits.ui.widgets.views.*;
import org.isoron.uhabits.utils.*;
public class HistoryWidget extends BaseWidget
{
@NonNull
private Habit habit;
public HistoryWidget(@NonNull Context context, int id, @NonNull Habit habit)
{
super(context, id);
this.habit = habit;
}
@Override
public PendingIntent getOnClickPendingIntent(Context context)
{
return HabitPendingIntents.viewHabit(context, habit);
}
@Override
public void refreshData(View view)
{
GraphWidgetView widgetView = (GraphWidgetView) view;
HistoryChart chart = (HistoryChart) widgetView.getDataView();
int color = ColorUtils.getColor(getContext(), habit.getColor());
int[] values = habit.getCheckmarks().getAllValues();
chart.setColor(color);
chart.setCheckmarks(values);
}
@Override
protected View buildView()
{
HistoryChart dataView = new HistoryChart(getContext());
GraphWidgetView widgetView =
new GraphWidgetView(getContext(), dataView);
widgetView.setTitle(habit.getName());
return widgetView;
}
@Override
protected int getDefaultHeight()
{
return 250;
}
@Override
protected int getDefaultWidth()
{
return 250;
}
}

@ -0,0 +1,97 @@
/*
* 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.ui.widgets;
import android.app.*;
import android.content.*;
import android.support.annotation.*;
import android.view.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.ui.common.views.*;
import org.isoron.uhabits.ui.habits.show.views.*;
import org.isoron.uhabits.ui.widgets.views.*;
import org.isoron.uhabits.utils.*;
import java.util.*;
public class ScoreWidget extends BaseWidget
{
@NonNull
private Habit habit;
public ScoreWidget(@NonNull Context context, int id, @NonNull Habit habit)
{
super(context, id);
this.habit = habit;
}
@Override
public PendingIntent getOnClickPendingIntent(Context context)
{
return HabitPendingIntents.viewHabit(context, habit);
}
@Override
public void refreshData(View view)
{
int defaultScoreInterval =
InterfaceUtils.getDefaultScoreSpinnerPosition(getContext());
int size = ScoreCard.BUCKET_SIZES[defaultScoreInterval];
GraphWidgetView widgetView = (GraphWidgetView) view;
ScoreChart chart = (ScoreChart) widgetView.getDataView();
List<Score> scores;
ScoreList scoreList = habit.getScores();
if (size == 1) scores = scoreList.getAll();
else scores = scoreList.groupBy(ScoreCard.getTruncateField(size));
int color = ColorUtils.getColor(getContext(), habit.getColor());
chart.setIsTransparencyEnabled(true);
chart.setBucketSize(size);
chart.setColor(color);
chart.setScores(scores);
}
@Override
protected View buildView()
{
ScoreChart dataView = new ScoreChart(getContext());
GraphWidgetView view = new GraphWidgetView(getContext(), dataView);
view.setTitle(habit.getName());
return view;
}
@Override
protected int getDefaultHeight()
{
return 300;
}
@Override
protected int getDefaultWidth()
{
return 300;
}
}

@ -0,0 +1,87 @@
/*
* 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.ui.widgets;
import android.app.*;
import android.content.*;
import android.support.annotation.*;
import android.view.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.ui.common.views.*;
import org.isoron.uhabits.ui.widgets.views.*;
import org.isoron.uhabits.utils.*;
import java.util.*;
public class StreakWidget extends BaseWidget
{
@NonNull
private Habit habit;
public StreakWidget(@NonNull Context context, int id, @NonNull Habit habit)
{
super(context, id);
this.habit = habit;
}
@Override
public PendingIntent getOnClickPendingIntent(Context context)
{
return HabitPendingIntents.viewHabit(context, habit);
}
@Override
public void refreshData(View view)
{
GraphWidgetView widgetView = (GraphWidgetView) view;
StreakChart chart = (StreakChart) widgetView.getDataView();
int color = ColorUtils.getColor(getContext(), habit.getColor());
// TODO: make this dynamic
List<Streak> streaks = habit.getStreaks().getBest(10);
chart.setColor(color);
chart.setStreaks(streaks);
}
@Override
protected View buildView()
{
StreakChart dataView = new StreakChart(getContext());
GraphWidgetView view = new GraphWidgetView(getContext(), dataView);
view.setTitle(habit.getName());
return view;
}
@Override
protected int getDefaultHeight()
{
return 200;
}
@Override
protected int getDefaultWidth()
{
return 200;
}
}

@ -54,7 +54,7 @@ public class WidgetUpdater implements CommandRunner.Listener
public void onCommandExecuted(@NonNull Command command, public void onCommandExecuted(@NonNull Command command,
@Nullable Long refreshKey) @Nullable Long refreshKey)
{ {
updateWidgets(context); updateWidgets();
} }
/** /**
@ -76,16 +76,16 @@ public class WidgetUpdater implements CommandRunner.Listener
commandRunner.removeListener(this); commandRunner.removeListener(this);
} }
void updateWidgets(Context context) public void updateWidgets()
{ {
updateWidgets(context, CheckmarkWidgetProvider.class); updateWidgets(CheckmarkWidgetProvider.class);
updateWidgets(context, HistoryWidgetProvider.class); updateWidgets(HistoryWidgetProvider.class);
updateWidgets(context, ScoreWidgetProvider.class); updateWidgets(ScoreWidgetProvider.class);
updateWidgets(context, StreakWidgetProvider.class); updateWidgets(StreakWidgetProvider.class);
updateWidgets(context, FrequencyWidgetProvider.class); updateWidgets(FrequencyWidgetProvider.class);
} }
private void updateWidgets(Context context, Class providerClass) public void updateWidgets(Class providerClass)
{ {
ComponentName provider = new ComponentName(context, providerClass); ComponentName provider = new ComponentName(context, providerClass);
Intent intent = new Intent(context, providerClass); Intent intent = new Intent(context, providerClass);

@ -22,7 +22,7 @@ package org.isoron.uhabits.widgets;
import android.content.*; import android.content.*;
import android.support.annotation.*; import android.support.annotation.*;
import org.apache.commons.lang3.*; import org.isoron.uhabits.models.*;
import org.isoron.uhabits.ui.widgets.*; import org.isoron.uhabits.ui.widgets.*;
public class FrequencyWidgetProvider extends BaseWidgetProvider public class FrequencyWidgetProvider extends BaseWidgetProvider
@ -31,61 +31,7 @@ public class FrequencyWidgetProvider extends BaseWidgetProvider
@Override @Override
protected BaseWidget getWidgetFromId(@NonNull Context context, int id) protected BaseWidget getWidgetFromId(@NonNull Context context, int id)
{ {
throw new NotImplementedException(""); Habit habit = getHabitFromWidgetId(id);
return new FrequencyWidget(context, id, habit);
} }
// @NonNull
// @Override
// protected BaseWidget getWidgetFromId(int id)
// {
// throw new NotImplementedException("");
// }
//
// @Override
// protected View buildCustomView(Context context, Habit habit)
// {
// FrequencyChart chart = new FrequencyChart(context);
// GraphWidgetView view = new GraphWidgetView(context, chart);
// view.setTitle(habit.getName());
// return view;
// }
//
// @Override
// protected int getDefaultHeight()
// {
// return 200;
// }
//
// @Override
// protected int getDefaultWidth()
// {
// return 200;
// }
//
// @Override
// protected int getLayoutId()
// {
// return R.layout.widget_wrapper;
// }
//
// @Override
// protected PendingIntent getOnClickPendingIntent(Context context,
// Habit habit)
// {
// return HabitBroadcastReceiver.buildViewHabitIntent(context, habit);
// }
//
// @Override
// protected void refreshCustomViewData(Context context,
// View view,
// Habit habit)
// {
// GraphWidgetView widgetView = (GraphWidgetView) view;
// FrequencyChart chart = (FrequencyChart) widgetView.getDataView();
//
// int color = ColorUtils.getColor(context, habit.getColor());
//
// chart.setColor(color);
// chart.setFrequency(habit.getRepetitions().getWeekdayFrequency());
// }
} }

@ -21,7 +21,7 @@ package org.isoron.uhabits.widgets;
import android.content.*; import android.content.*;
import android.support.annotation.*; import android.support.annotation.*;
import org.apache.commons.lang3.*; import org.isoron.uhabits.models.*;
import org.isoron.uhabits.ui.widgets.*; import org.isoron.uhabits.ui.widgets.*;
public class HistoryWidgetProvider extends BaseWidgetProvider public class HistoryWidgetProvider extends BaseWidgetProvider
@ -30,62 +30,7 @@ public class HistoryWidgetProvider extends BaseWidgetProvider
@Override @Override
protected BaseWidget getWidgetFromId(@NonNull Context context, int id) protected BaseWidget getWidgetFromId(@NonNull Context context, int id)
{ {
throw new NotImplementedException(""); Habit habit = getHabitFromWidgetId(id);
return new HistoryWidget(context, id, habit);
} }
// @NonNull
// @Override
// protected BaseWidget getWidgetFromId(int id)
// {
// throw new NotImplementedException("");
// }
//
// @Override
// protected View buildCustomView(Context context, Habit habit)
// {
// HistoryChart dataView = new HistoryChart(context);
// GraphWidgetView widgetView = new GraphWidgetView(context, dataView);
// widgetView.setTitle(habit.getName());
// return widgetView;
// }
//
// @Override
// protected int getDefaultHeight()
// {
// return 250;
// }
//
// @Override
// protected int getDefaultWidth()
// {
// return 250;
// }
//
// @Override
// protected int getLayoutId()
// {
// return R.layout.widget_wrapper;
// }
//
// @Override
// protected PendingIntent getOnClickPendingIntent(Context context,
// Habit habit)
// {
// return HabitBroadcastReceiver.buildViewHabitIntent(context, habit);
// }
//
// @Override
// protected void refreshCustomViewData(Context context,
// View view,
// Habit habit)
// {
// GraphWidgetView widgetView = (GraphWidgetView) view;
// HistoryChart chart = (HistoryChart) widgetView.getDataView();
//
// int color = ColorUtils.getColor(context, habit.getColor());
// int[] values = habit.getCheckmarks().getAllValues();
//
// chart.setColor(color);
// chart.setCheckmarks(values);
// }
} }

@ -21,7 +21,7 @@ package org.isoron.uhabits.widgets;
import android.content.*; import android.content.*;
import android.support.annotation.*; import android.support.annotation.*;
import org.apache.commons.lang3.*; import org.isoron.uhabits.models.*;
import org.isoron.uhabits.ui.widgets.*; import org.isoron.uhabits.ui.widgets.*;
public class ScoreWidgetProvider extends BaseWidgetProvider public class ScoreWidgetProvider extends BaseWidgetProvider
@ -30,61 +30,7 @@ public class ScoreWidgetProvider extends BaseWidgetProvider
@Override @Override
protected BaseWidget getWidgetFromId(@NonNull Context context, int id) protected BaseWidget getWidgetFromId(@NonNull Context context, int id)
{ {
throw new NotImplementedException(""); Habit habit = getHabitFromWidgetId(id);
return new ScoreWidget(context, id, habit);
} }
// @Override
// protected View buildCustomView(Context context, Habit habit)
// {
// ScoreChart dataView = new ScoreChart(context);
// GraphWidgetView view = new GraphWidgetView(context, dataView);
// view.setTitle(habit.getName());
// return view;
// }
//
// @Override
// protected int getDefaultHeight()
// {
// return 300;
// }
//
// @Override
// protected int getDefaultWidth()
// {
// return 300;
// }
//
// @Override
// protected int getLayoutId()
// {
// return R.layout.widget_wrapper;
// }
//
// @Override
// protected PendingIntent getOnClickPendingIntent(Context context,
// Habit habit)
// {
// return HabitBroadcastReceiver.buildViewHabitIntent(context, habit);
// }
//
// @Override
// protected void refreshCustomViewData(Context context,
// View view,
// Habit habit)
// {
// int defaultScoreInterval =
// InterfaceUtils.getDefaultScoreSpinnerPosition(context);
// int size = ScoreCard.BUCKET_SIZES[defaultScoreInterval];
//
// GraphWidgetView widgetView = (GraphWidgetView) view;
// ScoreChart chart = (ScoreChart) widgetView.getDataView();
//
// int color = ColorUtils.getColor(context, habit.getColor());
// List<Score> scores = habit.getScores().getAll();
//
// chart.setIsTransparencyEnabled(true);
// chart.setBucketSize(size);
// chart.setColor(color);
// chart.setScores(scores);
// }
} }

@ -21,7 +21,7 @@ package org.isoron.uhabits.widgets;
import android.content.*; import android.content.*;
import android.support.annotation.*; import android.support.annotation.*;
import org.apache.commons.lang3.*; import org.isoron.uhabits.models.*;
import org.isoron.uhabits.ui.widgets.*; import org.isoron.uhabits.ui.widgets.*;
public class StreakWidgetProvider extends BaseWidgetProvider public class StreakWidgetProvider extends BaseWidgetProvider
@ -30,48 +30,10 @@ public class StreakWidgetProvider extends BaseWidgetProvider
@Override @Override
protected BaseWidget getWidgetFromId(@NonNull Context context, int id) protected BaseWidget getWidgetFromId(@NonNull Context context, int id)
{ {
throw new NotImplementedException(""); Habit habit = getHabitFromWidgetId(id);
return new StreakWidget(context, id, habit);
} }
// @Override
// protected View buildCustomView(Context context, Habit habit)
// {
// StreakChart dataView = new StreakChart(context);
// GraphWidgetView view = new GraphWidgetView(context, dataView);
// view.setTitle(habit.getName());
// return view;
// }
//
// @Override
// protected int getDefaultHeight()
// {
// return 200;
// }
//
// @Override
// protected int getDefaultWidth()
// {
// return 200;
// }
//
// @Override
// protected int getLayoutId()
// {
// return R.layout.widget_wrapper;
// }
//
// @Override
// protected PendingIntent getOnClickPendingIntent(Context context,
// Habit habit)
// {
// return HabitBroadcastReceiver.buildViewHabitIntent(context, habit);
// }
//
// @Override
// protected void refreshCustomViewData(Context context,
// View view,
// Habit habit)
// {
// GraphWidgetView widgetView = (GraphWidgetView) view; // GraphWidgetView widgetView = (GraphWidgetView) view;
// StreakChart chart = (StreakChart) widgetView.getDataView(); // StreakChart chart = (StreakChart) widgetView.getDataView();
// //

Loading…
Cancel
Save