From 637d75fd2e03a076ffad900c7090ccf741c955f7 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Thu, 25 Feb 2016 10:17:01 -0500 Subject: [PATCH 01/57] Update README.md --- README.md | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 59737a051..b0d3d146a 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,31 @@ # Loop Habit Tracker -Loop is a simple Android app that helps you create and maintain good habits. Detailed graphs and statistics show you how your habits improved over time. It is completely ad-free and open source, with no intrusive permissions. Join the open beta at [Google Play Store](https://play.google.com/apps/testing/org.isoron.uhabits). +Loop is a simple Android app that helps you create and maintain good habits, allowing you to achieve your long-term goals. Detailed graphs and statistics show you how your habits improved over time. It is completely ad-free and open source. + +Get it on Google Play ## Features -* Simple and beautiful interface, following the Material Design guidelines. -* Advanced algorithms for calculating the strength of your habits. Every repetition makes your habit stronger, and every missed day makes it weaker. A few missed days after a long streak, however, will not completely destroy your entire progress. -* Detailed graphs and statistics, showing how did you habits improve over time. Scroll back to see the complete history of your habit. -* Support for both daily habits and habits with more complex schedules, such as 3 times every week; one time every other week; or every other day. -* Habit reminders at a chosen hour of the day. -* Support for Android Wear. Reminders can be checked or dismissed from the watch. -* Completely ad-free and open source. There are absolutely no advertisements, annoying notifications or intrusive permissions in this app, and there will never be. The complete source code is available under the GPLv3. +Simple, beautiful and modern interface +Loop has a minimalistic interface that is easy to use and follows the material design guidelines. + +Habit score +In addition to showing your current streak, Loop has an advanced algorithm for calculating the strength of your habits. Every repetition makes your habit stronger, and every missed day makes it weaker. A few missed days after a long streak, however, will not completely destroy your entire progress. + +Detailed graphs and statistics +Clearly see how your habits improved over time with beautiful and detailed graphs. Scroll back to see the complete history of your habits. + +Flexible schedules +Supports both daily habits and habits with more complex schedules, such as 3 times every week; one time every other week; or every other day. + +Reminders +Create an individual reminder for each habit, at a chosen hour of the day. Easily check, dismiss or snooze your habit directly from the notification, without opening the app. + +Optimized for smartwatches +Reminders can be checked, snoozed or dismissed directly from your Android Wear watch. + +Completely ad-free and open source +There are absolutely no advertisements, annoying notifications or intrusive permissions in this app, and there will never be. The complete source code is available under the GPLv3. ## Screenshots From 0dcedb3c599b6f4dab21fb011862e9fbb8ffd465 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Thu, 25 Feb 2016 10:20:25 -0500 Subject: [PATCH 02/57] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b0d3d146a..7e52ad3ba 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Loop is a simple Android app that helps you create and maintain good habits, allowing you to achieve your long-term goals. Detailed graphs and statistics show you how your habits improved over time. It is completely ad-free and open source. -Get it on Google Play +Get it on Google Play ## Features From 02b3ea58cf77af983fffb9ebc2d545b4b7747138 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Wed, 24 Feb 2016 18:33:46 -0500 Subject: [PATCH 03/57] Update drag-sort-listview --- libs/drag-sort-listview | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/drag-sort-listview b/libs/drag-sort-listview index e8905e2c7..318d69cf6 160000 --- a/libs/drag-sort-listview +++ b/libs/drag-sort-listview @@ -1 +1 @@ -Subproject commit e8905e2c78d27bc064d03496abea3a0956e49b18 +Subproject commit 318d69cf6b2adc287cf8944bb847dd7139c60376 From af0ef90e4d7a3ad76473e2365cbad95b8f011a2c Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Thu, 25 Feb 2016 07:29:45 -0500 Subject: [PATCH 04/57] Export to CSV --- .../uhabits/fragments/ListHabitsFragment.java | 53 ++++- .../org/isoron/uhabits/io/CSVExporter.java | 184 ++++++++++++++++++ .../main/res/menu-v21/list_habits_context.xml | 5 + app/src/main/res/menu/list_habits_context.xml | 5 + app/src/main/res/values/strings.xml | 1 + 5 files changed, 247 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/org/isoron/uhabits/io/CSVExporter.java 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 9a9fcfc73..699d3320b 100644 --- a/app/src/main/java/org/isoron/uhabits/fragments/ListHabitsFragment.java +++ b/app/src/main/java/org/isoron/uhabits/fragments/ListHabitsFragment.java @@ -23,9 +23,12 @@ import android.app.AlertDialog; import android.app.Fragment; import android.content.Context; import android.content.DialogInterface; +import android.content.Intent; import android.content.SharedPreferences; import android.graphics.Color; import android.graphics.Typeface; +import android.net.Uri; +import android.os.AsyncTask; import android.os.Bundle; import android.preference.PreferenceManager; import android.util.DisplayMetrics; @@ -68,9 +71,11 @@ import org.isoron.uhabits.commands.ChangeHabitColorCommand; import org.isoron.uhabits.commands.DeleteHabitsCommand; import org.isoron.uhabits.commands.UnarchiveHabitsCommand; import org.isoron.uhabits.helpers.ReminderHelper; +import org.isoron.uhabits.io.CSVExporter; import org.isoron.uhabits.loaders.HabitListLoader; import org.isoron.uhabits.models.Habit; +import java.io.File; import java.util.Date; import java.util.GregorianCalendar; import java.util.LinkedList; @@ -199,6 +204,12 @@ public class ListHabitsFragment extends Fragment return true; } + + case R.id.action_export_csv: + { + onExportHabitsClick(selectedHabits); + return true; + } } return false; @@ -248,6 +259,7 @@ public class ListHabitsFragment extends Fragment private ActionMode actionMode; private List selectedPositions; private DragSortController dragSortController; + private ProgressBar progressBar; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, @@ -265,7 +277,7 @@ public class ListHabitsFragment extends Fragment View view = inflater.inflate(R.layout.list_habits_fragment, container, false); tvNameHeader = (TextView) view.findViewById(R.id.tvNameHeader); - ProgressBar progressBar = (ProgressBar) view.findViewById(R.id.progressBar); + progressBar = (ProgressBar) view.findViewById(R.id.progressBar); loader.setProgressBar(progressBar); adapter = new ListHabitsAdapter(getActivity()); @@ -782,4 +794,43 @@ public class ListHabitsFragment extends Fragment if (refreshKey == null) loader.updateAllHabits(true); else loader.updateHabit(refreshKey); } + + private void onExportHabitsClick(final LinkedList selectedHabits) + { + new AsyncTask() + { + String filename; + + @Override + protected void onPreExecute() + { + progressBar.setIndeterminate(true); + progressBar.setVisibility(View.VISIBLE); + } + + @Override + protected void onPostExecute(Void aVoid) + { + if(filename != null) + { + Intent intent = new Intent(); + intent.setAction(Intent.ACTION_SEND); + intent.setType("application/zip"); + intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(filename))); + + startActivity(intent); + } + + progressBar.setVisibility(View.GONE); + } + + @Override + protected Void doInBackground(Void... params) + { + CSVExporter exporter = new CSVExporter(activity, selectedHabits); + filename = exporter.writeArchive(); + return null; + } + }.execute(); + } } diff --git a/app/src/main/java/org/isoron/uhabits/io/CSVExporter.java b/app/src/main/java/org/isoron/uhabits/io/CSVExporter.java new file mode 100644 index 000000000..40eaf7d6d --- /dev/null +++ b/app/src/main/java/org/isoron/uhabits/io/CSVExporter.java @@ -0,0 +1,184 @@ +package org.isoron.uhabits.io; + +import android.content.Context; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; + +import com.activeandroid.Cache; + +import org.isoron.helpers.DateHelper; +import org.isoron.uhabits.models.Habit; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.FileWriter; +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.LinkedList; +import java.util.List; +import java.util.TimeZone; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +public class CSVExporter +{ + private List habits; + private Context context; + private java.text.DateFormat dateFormat; + + private List generateDirs; + private List generateFilenames; + + private String basePath; + + public CSVExporter(Context context, List habits) + { + this.habits = habits; + this.context = context; + generateDirs = new LinkedList<>(); + generateFilenames = new LinkedList<>(); + + basePath = String.format("%s/export/", context.getFilesDir()); + + dateFormat = new SimpleDateFormat("yyyy-MM-dd"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + } + + public String formatDate(long timestamp) + { + return dateFormat.format(new Date(timestamp)); + } + + public String formatScore(int score) + { + return String.format("%.2f", ((float) score) / Habit.MAX_SCORE); + } + + private void writeScores(String dirPath, Habit habit) throws IOException + { + String path = dirPath + "scores.csv"; + FileWriter out = new FileWriter(basePath + path); + generateFilenames.add(path); + + String query = "select timestamp, score from score where habit = ? order by timestamp"; + String params[] = { habit.getId().toString() }; + + SQLiteDatabase db = Cache.openDatabase(); + Cursor cursor = db.rawQuery(query, params); + + if(!cursor.moveToFirst()) return; + + do + { + String timestamp = formatDate(cursor.getLong(0)); + String score = formatScore(cursor.getInt(1)); + out.write(String.format("%s,%s\n", timestamp, score)); + + } while(cursor.moveToNext()); + + out.close(); + cursor.close(); + } + + private void writeCheckmarks(String dirPath, Habit habit) throws IOException + { + String path = dirPath + "checkmarks.csv"; + FileWriter out = new FileWriter(basePath + path); + generateFilenames.add(path); + + String query = "select timestamp, value from checkmarks where habit = ? order by timestamp"; + String params[] = { habit.getId().toString() }; + + SQLiteDatabase db = Cache.openDatabase(); + Cursor cursor = db.rawQuery(query, params); + + if(!cursor.moveToFirst()) return; + + do + { + String timestamp = formatDate(cursor.getLong(0)); + Integer value = cursor.getInt(1); + out.write(String.format("%s,%d\n", timestamp, value)); + + } while(cursor.moveToNext()); + + out.close(); + cursor.close(); + } + + private void writeFiles(Habit habit) throws IOException + { + boolean success; + + String path = String.format("%s/", habit.name); + new File(basePath + path).mkdirs(); + generateDirs.add(path); + + writeScores(path, habit); + writeCheckmarks(path, habit); + } + + private void writeZipFile(String zipFilename) throws IOException + { + FileOutputStream fos = new FileOutputStream(zipFilename); + ZipOutputStream zos = new ZipOutputStream(fos); + + for(String filename : generateFilenames) + addFileToZip(zos, filename); + + zos.close(); + fos.close(); + } + + private void addFileToZip(ZipOutputStream zos, String filename) throws IOException + { + FileInputStream fis = new FileInputStream(new File(basePath + filename)); + ZipEntry ze = new ZipEntry(filename); + zos.putNextEntry(ze); + + int length; + byte bytes[] = new byte[1024]; + while((length = fis.read(bytes)) >= 0) + zos.write(bytes, 0, length); + + zos.closeEntry(); + fis.close(); + } + + private void cleanup() + { + for(String filename : generateFilenames) + new File(basePath + filename).delete(); + + for(String filename : generateDirs) + new File(basePath + filename).delete(); + + new File(basePath).delete(); + } + + public String writeArchive() + { + String date = formatDate(DateHelper.getStartOfToday()); + String zipFilename = String.format("%s/habits-%s.zip", context.getExternalCacheDir(), date); + + try + { + for (Habit h : habits) + writeFiles(h); + + writeZipFile(zipFilename); + cleanup(); + } + catch (IOException e) + { + e.printStackTrace(); + return null; + } + + return zipFilename; + } + + +} diff --git a/app/src/main/res/menu-v21/list_habits_context.xml b/app/src/main/res/menu-v21/list_habits_context.xml index 1427d4ab5..1f1872977 100644 --- a/app/src/main/res/menu-v21/list_habits_context.xml +++ b/app/src/main/res/menu-v21/list_habits_context.xml @@ -21,6 +21,11 @@ android:title="@string/unarchive" android:icon="@drawable/ic_action_unarchive_dark"/> + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8795e7a86..21e79bef6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -111,6 +111,7 @@ Weekdays Any day Select days + Export to CSV @string/hint_drag From 5e21d877c5f41123357a4ad719679dc6d91284e7 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Thu, 25 Feb 2016 20:17:44 -0500 Subject: [PATCH 05/57] Fetch all the data with one call --- .../java/org/isoron/uhabits/models/Habit.java | 49 ++++++++++++++++--- .../uhabits/views/HabitHistoryView.java | 20 ++------ .../isoron/uhabits/views/HabitScoreView.java | 42 +++++++--------- .../isoron/uhabits/views/HabitStreakView.java | 3 +- .../uhabits/views/ScrollableDataView.java | 1 - 5 files changed, 66 insertions(+), 49 deletions(-) diff --git a/app/src/main/java/org/isoron/uhabits/models/Habit.java b/app/src/main/java/org/isoron/uhabits/models/Habit.java index ccd483458..2ddfadcf7 100644 --- a/app/src/main/java/org/isoron/uhabits/models/Habit.java +++ b/app/src/main/java/org/isoron/uhabits/models/Habit.java @@ -294,6 +294,16 @@ public class Habit extends Model return checks; } + public int[] getAllCheckmarks() + { + Repetition oldestRep = getOldestRep(); + if(oldestRep == null) return new int[0]; + + Long toTimestamp = DateHelper.getStartOfToday(); + Long fromTimestamp = oldestRep.timestamp; + return getCheckmarks(fromTimestamp, toTimestamp); + } + public void updateCheckmarks() { long beginning; @@ -512,13 +522,40 @@ public class Habit extends Model return lastScore; } - public List getScores(long fromTimestamp, long toTimestamp, int divisor, long offset) + public int[] getScores(Long fromTimestamp, Long toTimestamp, Integer divisor, Long offset) { - return new Select().from(Score.class) - .where("habit = ? and timestamp > ? and " + - "timestamp <= ? and (timestamp - ?) % ? = 0", getId(), fromTimestamp, - toTimestamp, offset, divisor) - .execute(); + String query = "select score from Score where habit = ? and timestamp > ? and " + + "timestamp <= ? and (timestamp - ?) % ? = 0 order by timestamp desc"; + + String params[] = {getId().toString(), fromTimestamp.toString(), toTimestamp.toString(), + offset.toString(), divisor.toString()}; + + SQLiteDatabase db = Cache.openDatabase(); + Cursor c = db.rawQuery(query, params); + + if(!c.moveToFirst()) return new int[0]; + + int k = 0; + int[] scores = new int[c.getCount()]; + + do + { + scores[k++] = c.getInt(0); + } + while (c.moveToNext()); + + return scores; + + } + + public int[] getAllScores(int divisor) + { + Repetition oldestRep = getOldestRep(); + if(oldestRep == null) return new int[0]; + + long fromTimestamp = oldestRep.timestamp; + long toTimestamp = DateHelper.getStartOfToday(); + return getScores(fromTimestamp, toTimestamp, divisor, toTimestamp); } public List getStreaks() diff --git a/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java b/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java index 3d0a25396..8255f489f 100644 --- a/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java +++ b/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java @@ -126,22 +126,7 @@ public class HabitHistoryView extends ScrollableDataView protected void fetchData() { - Calendar currentDate = new GregorianCalendar(); - currentDate.add(Calendar.DAY_OF_YEAR, -dataOffset * 7); - int dayOfWeek = currentDate.get(Calendar.DAY_OF_WEEK) % 7; - - long dateTo = DateHelper.getStartOfToday(); - for (int i = 0; i < 7 - dayOfWeek; i++) - dateTo += DateHelper.millisecondsInOneDay; - - for (int i = 0; i < dataOffset * 7; i++) - dateTo -= DateHelper.millisecondsInOneDay; - - long dateFrom = dateTo; - for (int i = 0; i < (nColumns - 1) * 7; i++) - dateFrom -= DateHelper.millisecondsInOneDay; - - checkmarks = habit.getCheckmarks(dateFrom, dateTo); + checkmarks = habit.getAllCheckmarks(); updateDate(); } @@ -160,6 +145,7 @@ public class HabitHistoryView extends ScrollableDataView previousYear = ""; justPrintedYear = false; + updateDate(); GregorianCalendar currentDate = (GregorianCalendar) baseDate.clone(); for (int column = 0; column < nColumns - 1; column++) @@ -180,7 +166,7 @@ public class HabitHistoryView extends ScrollableDataView { if (!(column == nColumns - 2 && dataOffset == 0 && j > todayWeekday)) { - int checkmarkOffset = nDays - 7 * column - j; + int checkmarkOffset = dataOffset * 7 + nDays - 7 * (column + 1) + todayWeekday - j; drawSquare(canvas, location, date, checkmarkOffset); } 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 6b4294f80..054aca4a6 100644 --- a/app/src/main/java/org/isoron/uhabits/views/HabitScoreView.java +++ b/app/src/main/java/org/isoron/uhabits/views/HabitScoreView.java @@ -25,10 +25,8 @@ import android.graphics.RectF; import org.isoron.helpers.ColorHelper; import org.isoron.helpers.DateHelper; import org.isoron.uhabits.models.Habit; -import org.isoron.uhabits.models.Score; import java.text.SimpleDateFormat; -import java.util.List; public class HabitScoreView extends ScrollableDataView { @@ -41,7 +39,7 @@ public class HabitScoreView extends ScrollableDataView private Paint pText, pGraph; private int[] colors; - private List scores; + private int[] scores; public HabitScoreView(Context context, Habit habit, int columnWidth) { @@ -82,17 +80,7 @@ public class HabitScoreView extends ScrollableDataView protected void fetchData() { - - long toTimestamp = DateHelper.getStartOfToday(); - for (int i = 0; i < dataOffset * BUCKET_SIZE; i++) - toTimestamp -= DateHelper.millisecondsInOneDay; - - long fromTimestamp = toTimestamp; - for (int i = 0; i < nColumns * BUCKET_SIZE; i++) - fromTimestamp -= DateHelper.millisecondsInOneDay; - - scores = habit.getScores(fromTimestamp, toTimestamp, - BUCKET_SIZE * DateHelper.millisecondsInOneDay, toTimestamp); + scores = habit.getAllScores(BUCKET_SIZE * DateHelper.millisecondsInOneDay); } @Override @@ -114,19 +102,25 @@ public class HabitScoreView extends ScrollableDataView pGraph.setColor(habit.color); RectF prevR = null; - for (int offset = nColumns - scores.size(); offset < nColumns; offset++) + long currentDate = DateHelper.getStartOfToday(); + + for(int k = 0; k < nColumns + dataOffset - 1; k++) + currentDate -= 7 * DateHelper.millisecondsInOneDay; + + for (int k = 0; k < nColumns; k++) { - Score score = scores.get(offset - nColumns + scores.size()); - String month = dfMonth.format(score.timestamp); - String day = dfDay.format(score.timestamp); + String month = dfMonth.format(currentDate); + String day = dfDay.format(currentDate); - long s = score.score; - double sRelative = ((double) s) / Habit.MAX_SCORE; + int score = 0; + int offset = nColumns - k - 1 + dataOffset; + if(offset < scores.length) score = scores[offset]; + double sRelative = ((double) score) / Habit.MAX_SCORE; int height = (int) (columnHeight * sRelative); RectF r = new RectF(0, 0, columnWidth, columnWidth); - r.offset(offset * columnWidth, + r.offset(k * columnWidth, headerHeight + columnHeight - height - columnWidth / 2); if (prevR != null) @@ -135,19 +129,19 @@ public class HabitScoreView extends ScrollableDataView drawMarker(canvas, prevR); } - if (offset == nColumns - 1) drawMarker(canvas, r); + if (k == nColumns - 1) drawMarker(canvas, r); prevR = r; r = new RectF(0, 0, columnWidth, columnHeight); - r.offset(offset * columnWidth, headerHeight); + r.offset(k * columnWidth, headerHeight); if (!month.equals(previousMonth)) canvas.drawText(month, r.centerX(), r.bottom + lineHeight * 1.2f, pText); else canvas.drawText(day, r.centerX(), r.bottom + lineHeight * 1.2f, pText); previousMonth = month; - + currentDate += 7 * DateHelper.millisecondsInOneDay; } } diff --git a/app/src/main/java/org/isoron/uhabits/views/HabitStreakView.java b/app/src/main/java/org/isoron/uhabits/views/HabitStreakView.java index cf3fb7569..a3a1eb31f 100644 --- a/app/src/main/java/org/isoron/uhabits/views/HabitStreakView.java +++ b/app/src/main/java/org/isoron/uhabits/views/HabitStreakView.java @@ -96,13 +96,14 @@ public class HabitStreakView extends ScrollableDataView float barHeaderOffset = lineHeight * 0.4f; int nStreaks = streaks.size(); - int start = Math.max(0, nStreaks - nColumns - dataOffset); + int start = nStreaks - nColumns - dataOffset; SimpleDateFormat dfMonth = new SimpleDateFormat("MMM"); String previousMonth = ""; for (int offset = 0; offset < nColumns && start + offset < nStreaks; offset++) { + if(start + offset < 0) continue; String month = dfMonth.format(streaks.get(start + offset).start); long l = streaks.get(offset + start).length; diff --git a/app/src/main/java/org/isoron/uhabits/views/ScrollableDataView.java b/app/src/main/java/org/isoron/uhabits/views/ScrollableDataView.java index 5368595a4..fbad9d127 100644 --- a/app/src/main/java/org/isoron/uhabits/views/ScrollableDataView.java +++ b/app/src/main/java/org/isoron/uhabits/views/ScrollableDataView.java @@ -49,7 +49,6 @@ public abstract class ScrollableDataView extends View if (newDataOffset != dataOffset) { dataOffset = newDataOffset; - fetchData(); invalidate(); return true; } From f9a9339042b3b1acc06857993619dd65191ecee6 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Thu, 25 Feb 2016 21:30:03 -0500 Subject: [PATCH 06/57] Use GestureDetector for scrolling --- .../uhabits/views/ScrollableDataView.java | 117 ++++++++++++------ 1 file changed, 76 insertions(+), 41 deletions(-) diff --git a/app/src/main/java/org/isoron/uhabits/views/ScrollableDataView.java b/app/src/main/java/org/isoron/uhabits/views/ScrollableDataView.java index fbad9d127..cdd7bf99e 100644 --- a/app/src/main/java/org/isoron/uhabits/views/ScrollableDataView.java +++ b/app/src/main/java/org/isoron/uhabits/views/ScrollableDataView.java @@ -19,12 +19,15 @@ package org.isoron.uhabits.views; +import android.animation.ValueAnimator; import android.content.Context; -import android.support.v4.view.MotionEventCompat; +import android.view.GestureDetector; import android.view.MotionEvent; import android.view.View; +import android.widget.Scroller; -public abstract class ScrollableDataView extends View +public abstract class ScrollableDataView extends View implements GestureDetector.OnGestureListener, + ValueAnimator.AnimatorUpdateListener { protected int dataOffset; @@ -32,73 +35,105 @@ public abstract class ScrollableDataView extends View protected int columnWidth, columnHeight; protected int headerHeight, footerHeight; - private float prevX, prevY; + private GestureDetector detector; + private Scroller scroller; + private ValueAnimator scrollAnimator; public ScrollableDataView(Context context) { super(context); + + detector = new GestureDetector(context, this); + scroller = new Scroller(context, null, true); + scrollAnimator = ValueAnimator.ofFloat(0, 1); + scrollAnimator.addUpdateListener(this); } protected abstract void fetchData(); - protected boolean move(float dx) + @Override + public boolean onTouchEvent(MotionEvent event) { - int newDataOffset = dataOffset + (int) (dx / columnWidth); - newDataOffset = Math.max(0, newDataOffset); + return detector.onTouchEvent(event); + } - if (newDataOffset != dataOffset) - { - dataOffset = newDataOffset; - invalidate(); - return true; - } - else return false; + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) + { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + setMeasuredDimension(getMeasuredWidth(), columnHeight + headerHeight + footerHeight); } @Override - public boolean onTouchEvent(MotionEvent event) + protected void onSizeChanged(int w, int h, int oldw, int oldh) { - int action = event.getAction(); + super.onSizeChanged(w, h, oldw, oldh); + nColumns = w / columnWidth; + fetchData(); + } - int pointerIndex = MotionEventCompat.getActionIndex(event); - final float x = MotionEventCompat.getX(event, pointerIndex); - final float y = MotionEventCompat.getY(event, pointerIndex); + @Override + public boolean onDown(MotionEvent e) + { + return true; + } - if (action == MotionEvent.ACTION_DOWN) - { - prevX = x; - prevY = y; - } + @Override + public void onShowPress(MotionEvent e) + { - if (action == MotionEvent.ACTION_MOVE) - { - float dx = x - prevX; - float dy = y - prevY; + } - if (Math.abs(dy) > Math.abs(dx)) return false; + @Override + public boolean onSingleTapUp(MotionEvent e) + { + return false; + } + + @Override + public boolean onScroll(MotionEvent e1, MotionEvent e2, float dx, float dy) + { + if(Math.abs(dx) > Math.abs(dy)) getParent().requestDisallowInterceptTouchEvent(true); - if (move(dx)) - { - prevX = x; - prevY = y; - } - } + scroller.startScroll(scroller.getCurrX(), scroller.getCurrY(), (int) -dx, (int) dy, 0); + scroller.computeScrollOffset(); + dataOffset = Math.max(0, scroller.getCurrX() / columnWidth); + postInvalidate(); return true; } @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) + public void onLongPress(MotionEvent e) { - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - setMeasuredDimension(getMeasuredWidth(), columnHeight + headerHeight + footerHeight); + } @Override - protected void onSizeChanged(int w, int h, int oldw, int oldh) + public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { - super.onSizeChanged(w, h, oldw, oldh); - nColumns = w / columnWidth; - fetchData(); + scroller.fling(scroller.getCurrX(), scroller.getCurrY(), (int) velocityX / 2, 0, 0, 100000, + 0, 0); + invalidate(); + + scrollAnimator.setDuration(scroller.getDuration()); + scrollAnimator.start(); + + return false; + } + + @Override + public void onAnimationUpdate(ValueAnimator animation) + { + if (!scroller.isFinished()) + { + scroller.computeScrollOffset(); + dataOffset = Math.max(0, scroller.getCurrX() / columnWidth); + postInvalidate(); + } + else + { + scrollAnimator.cancel(); + } } } From 456a9e49a907eec7599afc43fe15fdcdd45606fa Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Fri, 26 Feb 2016 04:52:55 -0500 Subject: [PATCH 07/57] Remove extra translations --- app/src/main/res/values-pt/strings.xml | 1 - app/src/main/res/values-zh/strings.xml | 4 ---- 2 files changed, 5 deletions(-) diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 5f84a5be7..1043ab613 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -58,7 +58,6 @@ Mais tarde Correntes Você não tem nenhum hábito ativo - Hábitos arquivados. Hábito modificado. Hábito restaurado. diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 7f3d15ab7..856e83fc3 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -26,11 +26,7 @@ 取消 选择小时 选择分钟 - Year list - Select month and day - Select year - 总览 习惯强度 历史 From f5ccd7d8c33f1d9f891898171b8f634ee394d744 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Fri, 26 Feb 2016 04:53:19 -0500 Subject: [PATCH 08/57] Move ripple backgrounds to drawable-v21 --- .../main/res/{drawable => drawable-v21}/ripple_transparent.xml | 0 app/src/main/res/{drawable => drawable-v21}/ripple_white.xml | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename app/src/main/res/{drawable => drawable-v21}/ripple_transparent.xml (100%) rename app/src/main/res/{drawable => drawable-v21}/ripple_white.xml (100%) diff --git a/app/src/main/res/drawable/ripple_transparent.xml b/app/src/main/res/drawable-v21/ripple_transparent.xml similarity index 100% rename from app/src/main/res/drawable/ripple_transparent.xml rename to app/src/main/res/drawable-v21/ripple_transparent.xml diff --git a/app/src/main/res/drawable/ripple_white.xml b/app/src/main/res/drawable-v21/ripple_white.xml similarity index 100% rename from app/src/main/res/drawable/ripple_white.xml rename to app/src/main/res/drawable-v21/ripple_white.xml From 917d1218aee46bec37364e2d1834c1cb958c9c77 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Fri, 26 Feb 2016 05:06:18 -0500 Subject: [PATCH 09/57] Update pt translation --- app/src/main/res/values-pt/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 1043ab613..8b43fe2c7 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -103,4 +103,5 @@ Segunda a sexta Qualquer dia Selecionar dias + Exportar dados \ No newline at end of file From acb26964f3290976f5e64bbfe8e480fc91642a13 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Fri, 26 Feb 2016 05:06:39 -0500 Subject: [PATCH 10/57] Mark as untranslatable --- app/src/main/res/values/dimens.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 74258a4ab..6e8b2f009 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -13,7 +13,7 @@ @string/interval_8_hour - + 15 30 60 From e9ce50f6867f97471d3cba3700de1a74c4e3406c Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Fri, 26 Feb 2016 05:07:04 -0500 Subject: [PATCH 11/57] Use correct XML namespace --- app/src/main/res/menu/list_habits_menu.xml | 18 ++++++++++-------- app/src/main/res/menu/list_habits_options.xml | 11 +++++++---- .../main/res/menu/show_habit_activity_menu.xml | 10 +++++----- .../main/res/menu/show_habit_fragment_menu.xml | 7 ++++--- 4 files changed, 26 insertions(+), 20 deletions(-) diff --git a/app/src/main/res/menu/list_habits_menu.xml b/app/src/main/res/menu/list_habits_menu.xml index 408bae45e..c87717e70 100644 --- a/app/src/main/res/menu/list_habits_menu.xml +++ b/app/src/main/res/menu/list_habits_menu.xml @@ -1,16 +1,18 @@ + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + tools:context="org.isoron.uhabits.MainActivity"> - + + android:title="@string/action_settings" + app:showAsAction="never"/> diff --git a/app/src/main/res/menu/list_habits_options.xml b/app/src/main/res/menu/list_habits_options.xml index c00cdabe0..f2b377ccd 100644 --- a/app/src/main/res/menu/list_habits_options.xml +++ b/app/src/main/res/menu/list_habits_options.xml @@ -1,9 +1,12 @@ - + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + tools:context="org.isoron.uhabits.MainActivity"> + + android:icon="@drawable/ic_action_add" + android:title="@string/add_habit" + app:showAsAction="always"/> diff --git a/app/src/main/res/menu/show_habit_activity_menu.xml b/app/src/main/res/menu/show_habit_activity_menu.xml index 923f4f112..7d2a0cf17 100644 --- a/app/src/main/res/menu/show_habit_activity_menu.xml +++ b/app/src/main/res/menu/show_habit_activity_menu.xml @@ -1,12 +1,12 @@ - + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + tools:context="org.isoron.uhabits.ShowHabitActivity"> + android:title="@string/action_settings" + app:showAsAction="never"/> diff --git a/app/src/main/res/menu/show_habit_fragment_menu.xml b/app/src/main/res/menu/show_habit_fragment_menu.xml index d77372b2c..af9863c3a 100644 --- a/app/src/main/res/menu/show_habit_fragment_menu.xml +++ b/app/src/main/res/menu/show_habit_fragment_menu.xml @@ -1,10 +1,11 @@ - + + android:title="@string/edit" + app:showAsAction="ifRoom"/> \ No newline at end of file From 4c3a72df81b25246a0976407cdb6795cc47699d0 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Fri, 26 Feb 2016 05:08:35 -0500 Subject: [PATCH 12/57] Delete duplicate resource --- .../main/res/drawable-hdpi/ic_action_edit.png | Bin 822 -> 0 bytes .../main/res/drawable-mdpi/ic_action_edit.png | Bin 554 -> 0 bytes .../main/res/drawable-xhdpi/ic_action_edit.png | Bin 1039 -> 0 bytes .../main/res/drawable-xxhdpi/ic_action_edit.png | Bin 1647 -> 0 bytes .../main/res/menu/show_habit_fragment_menu.xml | 2 +- 5 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 app/src/main/res/drawable-hdpi/ic_action_edit.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_action_edit.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_action_edit.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_action_edit.png diff --git a/app/src/main/res/drawable-hdpi/ic_action_edit.png b/app/src/main/res/drawable-hdpi/ic_action_edit.png deleted file mode 100644 index 5c8bcf8811c71b18f870ddd33dee186a8be0c6f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 822 zcmV-61Ihe}P)!wKaFA|D@!VRtONy7P@7~_*n=Qw#gc+_duZx^+xNja zFfF^+s|!1`aSsgl4ZrWqnKNhRdR}Oug%(=77Kudqvf1plTrT$}old{aWHJ?;k8}lm zGMU^9;ExcnZZ_OorI2#Dyu(@eVzGDx9{<(|-_YJc$S&vLqtWPYz*hnHYXbpnuklHb zE9^ZC8wFzgr&6hl5VPbb0zwN;zytQ4Kz#x91O@N`0QaEH`UseICEJt%{>cDaK#v^f za}HQsKWip{8Okbrp->nql}ZEJ6M#C4Ru>U}AY#lAG22AIlr{K#K7W+31jTU%FvsNn zK24$Ml{JJ{NmHwe6M;YZt~CMic>DlBZYmUE>CsB1vK=1pXLtzcii*QKSB&}Kj1_PI zoHjiNA%lQ6>KRnE}1;BTn6(Vinb4jHrW7`-jPFA0q2`xz=` z%EWiKtmJ=%Z%Bg-k8uS8TwF!q{I+~|Nv@yhVDC6QpeFq$B)~nW)oR~{KdYO}(wKSg}|)*a6_7uxZ>z%RlHqg@HlTyF(l zin4lF!mGt%v7KCi03zqNf@;y~$p43JrOP6KFC*n8F!>D2KpvHf(QSC=^Wn`yb?%y~E&tgl~vaP~n zMi(orD9v@Ob$EfA2rwzVmv_%8JkBFdY(xQOK4?uN>)5ZZz|*5AgXVZyE^=R|-Wq#*6Gx~g;@mGgwn#0j(G;7=ThG7_!ZG}6IGZTx&t^t3iz>qiSLOPx9 zQ4XiK0A5z%UV%}2_{6UaZdsNM??d@~z8k=07;;l<1fJ=t;1lrhSa@1VCX*x3LC9H+ z0XY=~Hy4k`4dxgC7tlM%71Kc@ypfO|0TJ#3qoP`;QL}Hj=z(vb>VYl4rL?lvPxRT=)Z8R!wG2aRd&(^rH z@EzgO+szaHtp>S%5UJQ#250d#x>AWF)l_=7qi6N{8%FKAt~;&#Qdv{!ykKOc9;H7O sAAm3Lwk%r9?`!7}7t3JhZ`HpVANR2l;ncPwyZ`_I07*qoM6N<$g7{JVy8r+H diff --git a/app/src/main/res/drawable-xhdpi/ic_action_edit.png b/app/src/main/res/drawable-xhdpi/ic_action_edit.png deleted file mode 100644 index 955a22d5187e24ce190cc9e120ea1fe3064246dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1039 zcmV+q1n~QbP)9?jq$7)Q|)~w1q&K9ph8TFBp9nP>MtDq!2=bgqEhR{t@z*ieaVb@ znRH>7BiWhGOD1ghAoF?i=3TpifE6oNtXQ$4r6iNdouN=@ce8N^)9G|)DwV2Y{G|a! z)Dnrref(`Te#HU$OoFQe*Oz0lSbwot++iGiHk&;N_*YKwiXvXq{l>t@gu~$jfa=4T_h1PfT6%hz{SZJWFiIGw z6=&E2xDl5Mc&i;fCOxczKp~?5Kf#rR`|h~d27k2M29Zc)KVtngOnzDobAawvl+|sV z0;JHyNf7{;kgHU35MgjfS;@R}?YEtpUIHaV6mQds*(n3Gzhfk`AG+&t(xa&HV#e0(Xu$ z?vcuoo?i#E@AX*8)esquFo$^#=YET8Kcp4l_Y+vcQ(uQWukbvS(JD6zb8@d^yPWbh zJSKf}J@9OdNXJNVU8cqKe|6aNJsX6Vm0%}RC^bKqSzcf^yjbmDaw`xxj<5Q?hj)Fm z;8oABgV}ds#a6aJ0TWFNFB2fY$NAz`!BeR$3m(6Qx{j@c=LwO8_gOvP-n8&is76OF zK1l5+s@f=KZ-T?CHENdlO@a=QAiGg`-@oRjtPCqXCHiyJ$IHs*rD$2bF&5tGWdv_d z5(Mt48woEIFx4Pmuk+GX^!X=U=K6J%wa0ZybuX;4isSt24C>{Ja(H$%c-iOEW%VDe zVans&5@d(h2zcTA7G3OTYIR3gPp_@Pec!Z#m&K09M#d29)nDn#8^zwF@Le$uNdqrcFm&sJ3DN9}2x%dzs; zT#?R?lz{mCkUm-tG?UP$Xz&3y)Z(UDBxs~lvtq@H6)RT$%Rj}{-DLT|9uWWl002ov JPDHLkV1h#_^^*Vq diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_edit.png b/app/src/main/res/drawable-xxhdpi/ic_action_edit.png deleted file mode 100644 index e2a84d81f797bd42f36a04e68bee51c5686031e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1647 zcmV-#29WuQP)r;Ai1c=@Pk}sFb?Zvn?The{pGP=@H+3d>^CYVwe8lmW~1oBpk%dk{m`m zAm=6{AI^3Y!qN|L-)dGPz{k9+%s=e;vl2-(279~Daq@arM~&xxqU@X00?7D=VPb-0 zJYaf3l8up(k>@iy>C?)-1(5g@QwK(Ve5C!3d-^@|h3g$k&@p9QHbfug!8aoC-aiOW z-;zc`hjR2@v?LD<3_K1Z$2i&YMI*Sr3-?^|kawSR1R+_sH%+pR8B_j-D9Ilj9DK|s z7G&IkA!cX{Pjobmd)7UEVMy>Phjbp`!PL~$6CmyS@tS zLBxKLw2&YZi;QmEbcDwUSKQe%u6^g+vx@erQolLJGYDdqJw~{})Ppb*?h0Y$VfVSV zyx}v|=z2M%-~|5gIS_C#X^oZ<3GVw+k|kXG%bf``0um%<#U3$~u%@B7a35nlf6^h8 z+J0VgvQ~a)Ldx$LBkXpcFWh&+zK1e~b~U!dTTvp%(&BXxbq?X^Gt!5R#M}}-w+tgZ zZADZ&aP3!j>CyHD9D%Nbj)MF&>$mLH3@@dJfVh{Wlmtf4yiKr~$h9ogD_gQql(n!GbKXShFtEBg1>iNgB=H{6Vm3ph`;j8ZAx-Bd84UR+pJUa53 zS?scGgv98hUC5O`Eez*00L&?v-wM07%Kg~?~>!jKtB|o4PIXNIMwtO00%|D3vaI49; z+Sx+PV2tfqUD~Qqa3|U_Lj2*Ay(GWcxOx^P`8|{!*8uOU?DS58=Aud~bH=${$Y)`0 zROFi_!R^xXzmJN1Rt;p?2AUW7QAIwc=dY>k^Z?_4%1&<$u#fec+aTn;81ufZqS^e$ zm8COy{g%soXn$-G`HQTYE+{sIqd_GhMlJqdgW1Jv>XT-rba6}1pjcU;>_OgVAo(;{-6@#m;j!3 z74814X562GsF{LLF39abU7lcamD`kJ4s2LLcsYecY`{*3qz9N<{zj*xfpd-6$!}I2 zucs}XwTquzm}004Y00-M*`fuv`*+xD*UgUdqVzm_8<5IQ8<-6Zw=+7<1#X-cqN$R~ zPWoAGrOW7ry9^t4X*kbqNZOC9veVjI7X!uc_B?@=%PYb?ze%BNv@p9(LgjR3ozQg7 z?fFW6m(I7{K^JyepzVm2d^zdX$K8V=^Ef2E`Ft7!2L4%PCnx9Y@dFo}@90E<1IW!XV}Ey{M$z5?&Qm4AL&i8>iC#@Ro0j0fy tId4tR##AU23WY+UP$(1%g+kE<{sUm4ZWBi@>}vo3002ovPDHLkV1jq+FrWYc diff --git a/app/src/main/res/menu/show_habit_fragment_menu.xml b/app/src/main/res/menu/show_habit_fragment_menu.xml index af9863c3a..a5104bcfb 100644 --- a/app/src/main/res/menu/show_habit_fragment_menu.xml +++ b/app/src/main/res/menu/show_habit_fragment_menu.xml @@ -4,7 +4,7 @@ From a18e0fbda07b6c711c4de7bce03a7fe80ce502ad Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Fri, 26 Feb 2016 05:09:56 -0500 Subject: [PATCH 13/57] Remove hardcoded string --- app/src/main/res/layout/edit_habit.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/res/layout/edit_habit.xml b/app/src/main/res/layout/edit_habit.xml index 64e55c64a..064bfefa0 100644 --- a/app/src/main/res/layout/edit_habit.xml +++ b/app/src/main/res/layout/edit_habit.xml @@ -77,7 +77,6 @@ From f1424e58209a46040561c2ae12216a14ffd0f7f1 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Fri, 26 Feb 2016 05:16:58 -0500 Subject: [PATCH 14/57] Add content description for images --- app/src/main/res/layout/edit_habit.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/layout/edit_habit.xml b/app/src/main/res/layout/edit_habit.xml index 064bfefa0..17881a36a 100644 --- a/app/src/main/res/layout/edit_habit.xml +++ b/app/src/main/res/layout/edit_habit.xml @@ -24,6 +24,7 @@ From 27220c9ab2b185b064d4281a13e667c42bd723b0 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Fri, 26 Feb 2016 05:17:33 -0500 Subject: [PATCH 15/57] Specify locale explicitly --- .../android/datetimepicker/time/TimePickerDialog.java | 2 ++ app/src/main/java/org/isoron/uhabits/io/CSVExporter.java | 3 ++- .../java/org/isoron/uhabits/views/HabitHistoryView.java | 5 +++-- .../java/org/isoron/uhabits/views/HabitScoreView.java | 9 ++++++--- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/android/datetimepicker/time/TimePickerDialog.java b/app/src/main/java/com/android/datetimepicker/time/TimePickerDialog.java index db3ed7890..e365005f4 100644 --- a/app/src/main/java/com/android/datetimepicker/time/TimePickerDialog.java +++ b/app/src/main/java/com/android/datetimepicker/time/TimePickerDialog.java @@ -23,6 +23,7 @@ import java.util.Locale; import org.isoron.uhabits.R; import android.animation.ObjectAnimator; +import android.annotation.SuppressLint; import android.app.ActionBar.LayoutParams; import android.app.DialogFragment; import android.content.Context; @@ -132,6 +133,7 @@ public class TimePickerDialog extends DialogFragment implements OnValueSelectedL // Empty constructor required for dialog fragment. } + @SuppressLint("Java") public TimePickerDialog(Context context, int theme, OnTimeSetListener callback, int hourOfDay, int minute, boolean is24HourMode) { // Empty constructor required for dialog fragment. diff --git a/app/src/main/java/org/isoron/uhabits/io/CSVExporter.java b/app/src/main/java/org/isoron/uhabits/io/CSVExporter.java index 40eaf7d6d..291d351d6 100644 --- a/app/src/main/java/org/isoron/uhabits/io/CSVExporter.java +++ b/app/src/main/java/org/isoron/uhabits/io/CSVExporter.java @@ -18,6 +18,7 @@ import java.text.SimpleDateFormat; import java.util.Date; import java.util.LinkedList; import java.util.List; +import java.util.Locale; import java.util.TimeZone; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; @@ -42,7 +43,7 @@ public class CSVExporter basePath = String.format("%s/export/", context.getFilesDir()); - dateFormat = new SimpleDateFormat("yyyy-MM-dd"); + dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.US); dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); } diff --git a/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java b/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java index 8255f489f..682b63c30 100644 --- a/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java +++ b/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java @@ -30,6 +30,7 @@ import org.isoron.uhabits.models.Habit; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.GregorianCalendar; +import java.util.Locale; public class HabitHistoryView extends ScrollableDataView { @@ -61,8 +62,8 @@ public class HabitHistoryView extends ScrollableDataView createColors(); wdays = DateHelper.getShortDayNames(); - dfMonth = new SimpleDateFormat("MMM"); - dfYear = new SimpleDateFormat("yyyy"); + dfMonth = new SimpleDateFormat("MMM", Locale.getDefault()); + dfYear = new SimpleDateFormat("yyyy", Locale.getDefault()); } private void updateDate() 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 054aca4a6..ce50310a7 100644 --- a/app/src/main/java/org/isoron/uhabits/views/HabitScoreView.java +++ b/app/src/main/java/org/isoron/uhabits/views/HabitScoreView.java @@ -27,6 +27,7 @@ import org.isoron.helpers.DateHelper; import org.isoron.uhabits.models.Habit; import java.text.SimpleDateFormat; +import java.util.Locale; public class HabitScoreView extends ScrollableDataView { @@ -35,6 +36,8 @@ public class HabitScoreView extends ScrollableDataView private final Paint pGrid; private final float em; private Habit habit; + private SimpleDateFormat dfMonth; + private SimpleDateFormat dfDay; private Paint pText, pGraph; @@ -76,6 +79,9 @@ public class HabitScoreView extends ScrollableDataView colors[3] = habit.color; colors[1] = ColorHelper.mixColors(colors[0], colors[3], 0.66f); colors[2] = ColorHelper.mixColors(colors[0], colors[3], 0.33f); + + dfMonth = new SimpleDateFormat("MMM", Locale.getDefault()); + dfDay = new SimpleDateFormat("d", Locale.getDefault()); } protected void fetchData() @@ -94,9 +100,6 @@ public class HabitScoreView extends ScrollableDataView rGrid.offset(0, headerHeight); drawGrid(canvas, rGrid); - SimpleDateFormat dfMonth = new SimpleDateFormat("MMM"); - SimpleDateFormat dfDay = new SimpleDateFormat("d"); - String previousMonth = ""; pGraph.setColor(habit.color); From b6e7e72f5ac74e5301ba40aebad094dd8ddd979c Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Fri, 26 Feb 2016 05:29:02 -0500 Subject: [PATCH 16/57] Remove object allocations during draw --- .../uhabits/views/HabitHistoryView.java | 11 +++--- .../isoron/uhabits/views/HabitScoreView.java | 34 +++++++++++-------- .../isoron/uhabits/views/HabitStreakView.java | 17 ++++++---- .../org/isoron/uhabits/views/RingView.java | 17 ++++++---- 4 files changed, 47 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java b/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java index 682b63c30..c64c1d73d 100644 --- a/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java +++ b/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java @@ -51,6 +51,7 @@ public class HabitHistoryView extends ScrollableDataView private int nDays; private int todayWeekday; private int colors[]; + private Rect baseLocation; public HabitHistoryView(Context context, Habit habit, int baseSize) { @@ -64,6 +65,8 @@ public class HabitHistoryView extends ScrollableDataView wdays = DateHelper.getShortDayNames(); dfMonth = new SimpleDateFormat("MMM", Locale.getDefault()); dfYear = new SimpleDateFormat("yyyy", Locale.getDefault()); + + baseLocation = new Rect(); } private void updateDate() @@ -140,7 +143,7 @@ public class HabitHistoryView extends ScrollableDataView { super.onDraw(canvas); - Rect location = new Rect(0, 0, columnWidth - squareSpacing, columnWidth - squareSpacing); + baseLocation.set(0, 0, columnWidth - squareSpacing, columnWidth - squareSpacing); previousMonth = ""; previousYear = ""; @@ -151,11 +154,11 @@ public class HabitHistoryView extends ScrollableDataView for (int column = 0; column < nColumns - 1; column++) { - drawColumn(canvas, location, currentDate, column); - location.offset(columnWidth, -columnHeight); + drawColumn(canvas, baseLocation, currentDate, column); + baseLocation.offset(columnWidth, -columnHeight); } - drawAxis(canvas, location); + drawAxis(canvas, baseLocation); } private void drawColumn(Canvas canvas, Rect location, GregorianCalendar date, int column) 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 ce50310a7..2be9c0698 100644 --- a/app/src/main/java/org/isoron/uhabits/views/HabitScoreView.java +++ b/app/src/main/java/org/isoron/uhabits/views/HabitScoreView.java @@ -40,6 +40,7 @@ public class HabitScoreView extends ScrollableDataView private SimpleDateFormat dfDay; private Paint pText, pGraph; + private RectF rect, prevRect; private int[] colors; private int[] scores; @@ -82,6 +83,9 @@ public class HabitScoreView extends ScrollableDataView dfMonth = new SimpleDateFormat("MMM", Locale.getDefault()); dfDay = new SimpleDateFormat("d", Locale.getDefault()); + + rect = new RectF(); + prevRect = new RectF(); } protected void fetchData() @@ -96,14 +100,14 @@ public class HabitScoreView extends ScrollableDataView float lineHeight = pText.getFontSpacing(); - RectF rGrid = new RectF(0, 0, nColumns * columnWidth, columnHeight); - rGrid.offset(0, headerHeight); - drawGrid(canvas, rGrid); + rect.set(0, 0, nColumns * columnWidth, columnHeight); + rect.offset(0, headerHeight); + drawGrid(canvas, rect); String previousMonth = ""; pGraph.setColor(habit.color); - RectF prevR = null; + prevRect.setEmpty(); long currentDate = DateHelper.getStartOfToday(); @@ -122,26 +126,26 @@ public class HabitScoreView extends ScrollableDataView double sRelative = ((double) score) / Habit.MAX_SCORE; int height = (int) (columnHeight * sRelative); - RectF r = new RectF(0, 0, columnWidth, columnWidth); - r.offset(k * columnWidth, + rect.set(0, 0, columnWidth, columnWidth); + rect.offset(k * columnWidth, headerHeight + columnHeight - height - columnWidth / 2); - if (prevR != null) + if (!prevRect.isEmpty()) { - drawLine(canvas, prevR, r); - drawMarker(canvas, prevR); + drawLine(canvas, prevRect, rect); + drawMarker(canvas, prevRect); } - if (k == nColumns - 1) drawMarker(canvas, r); + if (k == nColumns - 1) drawMarker(canvas, rect); - prevR = r; + prevRect.set(rect); - r = new RectF(0, 0, columnWidth, columnHeight); - r.offset(k * columnWidth, headerHeight); + rect.set(0, 0, columnWidth, columnHeight); + rect.offset(k * columnWidth, headerHeight); if (!month.equals(previousMonth)) - canvas.drawText(month, r.centerX(), r.bottom + lineHeight * 1.2f, pText); + canvas.drawText(month, rect.centerX(), rect.bottom + lineHeight * 1.2f, pText); else - canvas.drawText(day, r.centerX(), r.bottom + lineHeight * 1.2f, pText); + canvas.drawText(day, rect.centerX(), rect.bottom + lineHeight * 1.2f, pText); previousMonth = month; currentDate += 7 * DateHelper.millisecondsInOneDay; diff --git a/app/src/main/java/org/isoron/uhabits/views/HabitStreakView.java b/app/src/main/java/org/isoron/uhabits/views/HabitStreakView.java index a3a1eb31f..5aa58f4c0 100644 --- a/app/src/main/java/org/isoron/uhabits/views/HabitStreakView.java +++ b/app/src/main/java/org/isoron/uhabits/views/HabitStreakView.java @@ -28,6 +28,7 @@ import org.isoron.uhabits.models.Streak; import java.text.SimpleDateFormat; import java.util.List; +import java.util.Locale; public class HabitStreakView extends ScrollableDataView { @@ -36,6 +37,8 @@ public class HabitStreakView extends ScrollableDataView private List streaks; private long maxStreakLength; private int[] colors; + private SimpleDateFormat dfMonth; + private Rect rect; public HabitStreakView(Context context, Habit habit, int columnWidth) { @@ -45,6 +48,9 @@ public class HabitStreakView extends ScrollableDataView setDimensions(columnWidth); createPaints(); createColors(); + + dfMonth = new SimpleDateFormat("MMM", Locale.getDefault()); + rect = new Rect(); } private void setDimensions(int baseSize) @@ -97,7 +103,6 @@ public class HabitStreakView extends ScrollableDataView int nStreaks = streaks.size(); int start = nStreaks - nColumns - dataOffset; - SimpleDateFormat dfMonth = new SimpleDateFormat("MMM"); String previousMonth = ""; @@ -112,14 +117,14 @@ public class HabitStreakView extends ScrollableDataView pBar.setColor(colors[(int) Math.floor(lRelative * 3)]); int height = (int) (columnHeight * lRelative); - Rect r = new Rect(0, 0, columnWidth - 2, height); - r.offset(offset * columnWidth, headerHeight + columnHeight - height); + rect.set(0, 0, columnWidth - 2, height); + rect.offset(offset * columnWidth, headerHeight + columnHeight - height); - canvas.drawRect(r, pBar); - canvas.drawText(Long.toString(l), r.centerX(), r.top - barHeaderOffset, pBar); + canvas.drawRect(rect, pBar); + canvas.drawText(Long.toString(l), rect.centerX(), rect.top - barHeaderOffset, pBar); if (!month.equals(previousMonth)) - canvas.drawText(month, r.centerX(), r.bottom + lineHeight * 1.2f, pText); + canvas.drawText(month, rect.centerX(), rect.bottom + lineHeight * 1.2f, pText); previousMonth = month; } diff --git a/app/src/main/java/org/isoron/uhabits/views/RingView.java b/app/src/main/java/org/isoron/uhabits/views/RingView.java index 41722ef18..4b49f0ff8 100644 --- a/app/src/main/java/org/isoron/uhabits/views/RingView.java +++ b/app/src/main/java/org/isoron/uhabits/views/RingView.java @@ -32,6 +32,7 @@ public class RingView extends View private Paint pRing; private float lineHeight; private String label; + private RectF rect; public RingView(Context context, int size, int color, float perc, String label) { @@ -45,6 +46,8 @@ public class RingView extends View pRing.setAntiAlias(true); pRing.setTextAlign(Paint.Align.CENTER); + rect = new RectF(); + this.label = label; } @@ -62,21 +65,21 @@ public class RingView extends View float thickness = size * 0.15f; pRing.setColor(color); - RectF r = new RectF(0, 0, size, size); - canvas.drawArc(r, -90, 360 * perc, true, pRing); + rect.set(0, 0, size, size); + canvas.drawArc(rect, -90, 360 * perc, true, pRing); pRing.setColor(Color.rgb(230, 230, 230)); - canvas.drawArc(r, 360 * perc - 90 + 2, 360 * (1 - perc) - 4, true, pRing); + canvas.drawArc(rect, 360 * perc - 90 + 2, 360 * (1 - perc) - 4, true, pRing); pRing.setColor(Color.WHITE); - r.inset(thickness, thickness); - canvas.drawArc(r, -90, 360, true, pRing); + rect.inset(thickness, thickness); + canvas.drawArc(rect, -90, 360, true, pRing); pRing.setColor(Color.GRAY); pRing.setTextSize(size * 0.2f); lineHeight = pRing.getFontSpacing(); - canvas.drawText(String.format("%.0f%%", perc * 100), r.centerX(), - r.centerY() + lineHeight / 3, pRing); + canvas.drawText(String.format("%.0f%%", perc * 100), rect.centerX(), + rect.centerY() + lineHeight / 3, pRing); pRing.setTextSize(size * 0.15f); canvas.drawText(label, size / 2, size + lineHeight * 1.2f, pRing); From d5774e851196840adb991d810fa0b849f601e818 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Fri, 26 Feb 2016 05:31:17 -0500 Subject: [PATCH 17/57] Close cursors --- .../main/java/org/isoron/uhabits/models/Habit.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/isoron/uhabits/models/Habit.java b/app/src/main/java/org/isoron/uhabits/models/Habit.java index 2ddfadcf7..1d835612e 100644 --- a/app/src/main/java/org/isoron/uhabits/models/Habit.java +++ b/app/src/main/java/org/isoron/uhabits/models/Habit.java @@ -291,6 +291,7 @@ public class Habit extends Model } while (cursor.moveToNext()); } + cursor.close(); return checks; } @@ -531,19 +532,20 @@ public class Habit extends Model offset.toString(), divisor.toString()}; SQLiteDatabase db = Cache.openDatabase(); - Cursor c = db.rawQuery(query, params); + Cursor cursor = db.rawQuery(query, params); - if(!c.moveToFirst()) return new int[0]; + if(!cursor.moveToFirst()) return new int[0]; int k = 0; - int[] scores = new int[c.getCount()]; + int[] scores = new int[cursor.getCount()]; do { - scores[k++] = c.getInt(0); + scores[k++] = cursor.getInt(0); } - while (c.moveToNext()); + while (cursor.moveToNext()); + cursor.close(); return scores; } From f511ca20284d857d51cdeb17e869b75c6149d758 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Fri, 26 Feb 2016 05:31:26 -0500 Subject: [PATCH 18/57] Explicitly allow backups --- app/src/main/AndroidManifest.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d68cee904..79203bf14 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -13,6 +13,7 @@ android:icon="@mipmap/ic_launcher" android:label="@string/main_activity_title" android:theme="@style/AppBaseTheme" + android:allowBackup="true" android:backupAgent=".HabitsBackupAgent"> Date: Fri, 26 Feb 2016 07:44:34 -0500 Subject: [PATCH 19/57] Allow custom views to be rendered on the layout editor --- .../java/org/isoron/helpers/DialogHelper.java | 17 ++- .../uhabits/fragments/ShowHabitFragment.java | 31 ++--- .../uhabits/views/HabitHistoryView.java | 62 ++++++++-- .../isoron/uhabits/views/HabitScoreView.java | 116 +++++++++++++----- .../isoron/uhabits/views/HabitStreakView.java | 95 ++++++++++++-- .../org/isoron/uhabits/views/RingView.java | 48 ++++++-- .../uhabits/views/ScrollableDataView.java | 11 ++ app/src/main/res/layout/show_habit.xml | 23 ++++ .../main/res/layout/show_habit_activity.xml | 7 +- 9 files changed, 321 insertions(+), 89 deletions(-) diff --git a/app/src/main/java/org/isoron/helpers/DialogHelper.java b/app/src/main/java/org/isoron/helpers/DialogHelper.java index 04e99d65d..a8215f846 100644 --- a/app/src/main/java/org/isoron/helpers/DialogHelper.java +++ b/app/src/main/java/org/isoron/helpers/DialogHelper.java @@ -17,21 +17,18 @@ package org.isoron.helpers; import android.content.Context; -import android.content.DialogInterface; -import android.content.DialogInterface.OnClickListener; import android.content.SharedPreferences; import android.graphics.Typeface; import android.os.Vibrator; import android.preference.PreferenceManager; +import android.util.AttributeSet; import android.view.View; import android.view.inputmethod.InputMethodManager; -import android.widget.TextView; - -import org.isoron.uhabits.R; public abstract class DialogHelper { + public static final String ISORON_NAMESPACE = "http://isoron.org/android"; private static Typeface fontawesome; public interface OnSavedListener @@ -65,4 +62,14 @@ public abstract class DialogHelper SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); return prefs.getInt("launch_count", 0); } + + public static String getAttribute(Context context, AttributeSet attrs, String name) + { + int resId = attrs.getAttributeResourceValue(ISORON_NAMESPACE, name, 0); + + if(resId != 0) + return context.getResources().getString(resId); + else + return attrs.getAttributeValue(ISORON_NAMESPACE, name); + } } diff --git a/app/src/main/java/org/isoron/uhabits/fragments/ShowHabitFragment.java b/app/src/main/java/org/isoron/uhabits/fragments/ShowHabitFragment.java index 90b586163..de2cc311d 100644 --- a/app/src/main/java/org/isoron/uhabits/fragments/ShowHabitFragment.java +++ b/app/src/main/java/org/isoron/uhabits/fragments/ShowHabitFragment.java @@ -25,15 +25,14 @@ import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; -import android.widget.LinearLayout; import android.widget.TextView; import org.isoron.helpers.ColorHelper; import org.isoron.helpers.Command; import org.isoron.helpers.DialogHelper; import org.isoron.uhabits.R; -import org.isoron.uhabits.helpers.ReminderHelper; import org.isoron.uhabits.ShowHabitActivity; +import org.isoron.uhabits.helpers.ReminderHelper; import org.isoron.uhabits.models.Habit; import org.isoron.uhabits.views.HabitHistoryView; import org.isoron.uhabits.views.HabitScoreView; @@ -71,29 +70,21 @@ public class ShowHabitFragment extends Fragment implements DialogHelper.OnSavedL TextView tvOverview = (TextView) view.findViewById(R.id.tvOverview); TextView tvStrength = (TextView) view.findViewById(R.id.tvStrength); TextView tvStreaks = (TextView) view.findViewById(R.id.tvStreaks); + RingView scoreRing = (RingView) view.findViewById(R.id.scoreRing); + HabitStreakView streakView = (HabitStreakView) view.findViewById(R.id.streakView); + HabitScoreView scoreView = (HabitScoreView) view.findViewById(R.id.scoreView); + HabitHistoryView historyView = (HabitHistoryView) view.findViewById(R.id.historyView); + tvHistory.setTextColor(habit.color); tvOverview.setTextColor(habit.color); tvStrength.setTextColor(habit.color); tvStreaks.setTextColor(habit.color); - LinearLayout llOverview = (LinearLayout) view.findViewById(R.id.llOverview); - llOverview.addView(new RingView(activity, - (int) activity.getResources().getDimension(R.dimen.small_square_size) * 4, - habit.color, ((float) habit.getScore() / Habit.MAX_SCORE), activity.getString(R.string.habit_strength))); - - LinearLayout llStrength = (LinearLayout) view.findViewById(R.id.llStrength); - llStrength.addView(new HabitScoreView(activity, habit, - (int) activity.getResources().getDimension(R.dimen.small_square_size))); - - LinearLayout llHistory = (LinearLayout) view.findViewById(R.id.llHistory); - HabitHistoryView hhv = new HabitHistoryView(activity, habit, - (int) activity.getResources().getDimension(R.dimen.small_square_size)); - llHistory.addView(hhv); - - LinearLayout llStreaks = (LinearLayout) view.findViewById(R.id.llStreaks); - HabitStreakView hsv = new HabitStreakView(activity, habit, - (int) activity.getResources().getDimension(R.dimen.small_square_size)); - llStreaks.addView(hsv); + scoreRing.setColor(habit.color); + scoreRing.setPercentage((float) habit.getScore() / Habit.MAX_SCORE); + streakView.setHabit(habit); + scoreView.setHabit(habit); + historyView.setHabit(habit); setHasOptionsMenu(true); return view; diff --git a/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java b/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java index c64c1d73d..3bcbabe09 100644 --- a/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java +++ b/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java @@ -22,19 +22,21 @@ import android.graphics.Color; import android.graphics.Paint; import android.graphics.Paint.Align; import android.graphics.Rect; +import android.util.AttributeSet; import org.isoron.helpers.ColorHelper; import org.isoron.helpers.DateHelper; +import org.isoron.uhabits.R; import org.isoron.uhabits.models.Habit; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.Locale; +import java.util.Random; public class HabitHistoryView extends ScrollableDataView { - private Habit habit; private int[] checkmarks; private Paint pSquareBg, pSquareFg, pTextHeader; @@ -52,13 +54,29 @@ public class HabitHistoryView extends ScrollableDataView private int todayWeekday; private int colors[]; private Rect baseLocation; + private int baseSize; + private int primaryColor; + + public HabitHistoryView(Context context, AttributeSet attrs) + { + super(context, attrs); + this.primaryColor = ColorHelper.palette[7]; + this.baseSize = (int) context.getResources().getDimension(R.dimen.small_square_size); + init(); + } - public HabitHistoryView(Context context, Habit habit, int baseSize) + public void setHabit(Habit habit) { - super(context); this.habit = habit; + this.primaryColor = habit.color; + createColors(); + fetchData(); + postInvalidate(); + } - setDimensions(baseSize); + private void init() + { + setDimensions(this.baseSize); createPaints(); createColors(); @@ -90,7 +108,6 @@ public class HabitHistoryView extends ScrollableDataView private void createColors() { - int primaryColor = habit.color; int primaryColorBright = ColorHelper.mixColors(primaryColor, Color.WHITE, 0.5f); int grey = Color.rgb(230, 230, 230); @@ -116,7 +133,7 @@ public class HabitHistoryView extends ScrollableDataView pTextHeader.setAntiAlias(true); pSquareBg = new Paint(); - pSquareBg.setColor(habit.color); + pSquareBg.setColor(primaryColor); pSquareFg = new Paint(); pSquareFg.setColor(Color.WHITE); @@ -130,10 +147,41 @@ public class HabitHistoryView extends ScrollableDataView protected void fetchData() { - checkmarks = habit.getAllCheckmarks(); + if(isInEditMode()) + generateRandomData(); + else + { + if(habit == null) + { + checkmarks = new int[0]; + return; + } + + checkmarks = habit.getAllCheckmarks(); + } + updateDate(); } + private void generateRandomData() + { + Random random = new Random(); + checkmarks = new int[100]; + + for(int i = 0; i < 100; i++) + if(random.nextFloat() < 0.3) checkmarks[i] = 2; + + for(int i = 0; i < 100 - 7; i++) + { + int count = 0; + for (int j = 0; j < 7; j++) + if(checkmarks[i + j] != 0) + count++; + + if(count >= 3) checkmarks[i] = Math.max(checkmarks[i], 1); + } + } + private String previousMonth; private String previousYear; private boolean justPrintedYear; 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 2be9c0698..579cee894 100644 --- a/app/src/main/java/org/isoron/uhabits/views/HabitScoreView.java +++ b/app/src/main/java/org/isoron/uhabits/views/HabitScoreView.java @@ -21,76 +21,132 @@ import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.RectF; +import android.util.AttributeSet; import org.isoron.helpers.ColorHelper; import org.isoron.helpers.DateHelper; +import org.isoron.uhabits.R; import org.isoron.uhabits.models.Habit; import java.text.SimpleDateFormat; import java.util.Locale; +import java.util.Random; public class HabitScoreView extends ScrollableDataView { public static final int BUCKET_SIZE = 7; - private final Paint pGrid; - private final float em; + private Paint pGrid; + private float em; private Habit habit; private SimpleDateFormat dfMonth; private SimpleDateFormat dfDay; private Paint pText, pGraph; private RectF rect, prevRect; + private int baseSize; private int[] colors; private int[] scores; + private int primaryColor; - public HabitScoreView(Context context, Habit habit, int columnWidth) + public HabitScoreView(Context context, AttributeSet attrs) + { + super(context, attrs); + this.baseSize = (int) context.getResources().getDimension(R.dimen.small_square_size); + this.primaryColor = ColorHelper.palette[7]; + init(); + } + + public void setHabit(Habit habit) { - super(context); this.habit = habit; + this.primaryColor = habit.color; + fetchData(); + postInvalidate(); + } + + private void init() + { + createPaints(); + setDimensions(); + createColors(); + + dfMonth = new SimpleDateFormat("MMM", Locale.getDefault()); + dfDay = new SimpleDateFormat("d", Locale.getDefault()); + + rect = new RectF(); + prevRect = new RectF(); + } + + private void setDimensions() + { + this.columnWidth = baseSize; + columnHeight = 8 * baseSize; + headerHeight = baseSize; + footerHeight = baseSize; + em = pText.getFontSpacing(); + } + + private void createColors() + { + colors = new int[4]; + + colors[0] = Color.rgb(230, 230, 230); + colors[3] = primaryColor; + colors[1] = ColorHelper.mixColors(colors[0], colors[3], 0.66f); + colors[2] = ColorHelper.mixColors(colors[0], colors[3], 0.33f); + } + private void createPaints() + { pText = new Paint(); pText.setColor(Color.LTGRAY); pText.setTextAlign(Paint.Align.LEFT); - pText.setTextSize(columnWidth * 0.5f); + pText.setTextSize(baseSize * 0.5f); pText.setAntiAlias(true); pGraph = new Paint(); pGraph.setTextAlign(Paint.Align.CENTER); - pGraph.setTextSize(columnWidth * 0.5f); + pGraph.setTextSize(baseSize * 0.5f); pGraph.setAntiAlias(true); - pGraph.setStrokeWidth(columnWidth * 0.1f); + pGraph.setStrokeWidth(baseSize * 0.1f); pGrid = new Paint(); pGrid.setColor(Color.LTGRAY); pGrid.setAntiAlias(true); - pGrid.setStrokeWidth(columnWidth * 0.05f); - - this.columnWidth = columnWidth; - columnHeight = 8 * columnWidth; - headerHeight = columnWidth; - footerHeight = columnWidth; - - em = pText.getFontSpacing(); - - colors = new int[4]; + pGrid.setStrokeWidth(baseSize * 0.05f); + } - colors[0] = Color.rgb(230, 230, 230); - colors[3] = habit.color; - colors[1] = ColorHelper.mixColors(colors[0], colors[3], 0.66f); - colors[2] = ColorHelper.mixColors(colors[0], colors[3], 0.33f); + protected void fetchData() + { + if(isInEditMode()) + generateRandomData(); + else + { + if (habit == null) + { + scores = new int[0]; + return; + } - dfMonth = new SimpleDateFormat("MMM", Locale.getDefault()); - dfDay = new SimpleDateFormat("d", Locale.getDefault()); + scores = habit.getAllScores(BUCKET_SIZE * DateHelper.millisecondsInOneDay); + } - rect = new RectF(); - prevRect = new RectF(); } - protected void fetchData() + private void generateRandomData() { - scores = habit.getAllScores(BUCKET_SIZE * DateHelper.millisecondsInOneDay); + Random random = new Random(); + scores = new int[100]; + scores[0] = Habit.MAX_SCORE / 2; + + for(int i = 1; i < 100; i++) + { + int step = Habit.MAX_SCORE / 10; + scores[i] = scores[i - 1] + random.nextInt(step * 2) - step; + scores[i] = Math.max(0, Math.min(Habit.MAX_SCORE, scores[i])); + } } @Override @@ -106,7 +162,7 @@ public class HabitScoreView extends ScrollableDataView String previousMonth = ""; - pGraph.setColor(habit.color); + pGraph.setColor(primaryColor); prevRect.setEmpty(); long currentDate = DateHelper.getStartOfToday(); @@ -171,7 +227,7 @@ public class HabitScoreView extends ScrollableDataView private void drawLine(Canvas canvas, RectF rectFrom, RectF rectTo) { - pGraph.setColor(habit.color); + pGraph.setColor(primaryColor); canvas.drawLine(rectFrom.centerX(), rectFrom.centerY(), rectTo.centerX(), rectTo.centerY(), pGraph); } @@ -183,7 +239,7 @@ public class HabitScoreView extends ScrollableDataView canvas.drawOval(rect, pGraph); rect.inset(columnWidth * 0.1f, columnWidth * 0.1f); - pGraph.setColor(habit.color); + pGraph.setColor(primaryColor); canvas.drawOval(rect, pGraph); rect.inset(columnWidth * 0.1f, columnWidth * 0.1f); diff --git a/app/src/main/java/org/isoron/uhabits/views/HabitStreakView.java b/app/src/main/java/org/isoron/uhabits/views/HabitStreakView.java index 5aa58f4c0..6f8223f41 100644 --- a/app/src/main/java/org/isoron/uhabits/views/HabitStreakView.java +++ b/app/src/main/java/org/isoron/uhabits/views/HabitStreakView.java @@ -21,31 +21,55 @@ import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; +import android.util.AttributeSet; import org.isoron.helpers.ColorHelper; +import org.isoron.helpers.DateHelper; +import org.isoron.uhabits.R; import org.isoron.uhabits.models.Habit; import org.isoron.uhabits.models.Streak; import java.text.SimpleDateFormat; import java.util.List; import java.util.Locale; +import java.util.Random; public class HabitStreakView extends ScrollableDataView { private Habit habit; private Paint pText, pBar; - private List streaks; + + private long[] startTimes; + private long[] endTimes; + private long[] lengths; + private long maxStreakLength; private int[] colors; private SimpleDateFormat dfMonth; private Rect rect; + private int baseSize; + private int primaryColor; + + public HabitStreakView(Context context, AttributeSet attrs) + { + super(context, attrs); + this.baseSize = (int) context.getResources().getDimension(R.dimen.small_square_size); + this.primaryColor = ColorHelper.palette[7]; + init(); + } - public HabitStreakView(Context context, Habit habit, int columnWidth) + public void setHabit(Habit habit) { - super(context); this.habit = habit; + this.primaryColor = habit.color; + createColors(); + fetchData(); + postInvalidate(); + } - setDimensions(columnWidth); + private void init() + { + setDimensions(baseSize); createPaints(); createColors(); @@ -65,7 +89,7 @@ public class HabitStreakView extends ScrollableDataView { colors = new int[4]; colors[0] = Color.rgb(230, 230, 230); - colors[3] = habit.color; + colors[3] = primaryColor; colors[1] = ColorHelper.mixColors(colors[0], colors[3], 0.66f); colors[2] = ColorHelper.mixColors(colors[0], colors[3], 0.33f); } @@ -86,12 +110,59 @@ public class HabitStreakView extends ScrollableDataView protected void fetchData() { - streaks = habit.getStreaks(); - - for (Streak s : streaks) - maxStreakLength = Math.max(maxStreakLength, s.length); + if(isInEditMode()) + generateRandomData(); + else + { + if(habit == null) + { + startTimes = endTimes = lengths = new long[0]; + return; + } + + List streaks = habit.getStreaks(); + int size = streaks.size(); + + startTimes = new long[size]; + endTimes = new long[size]; + lengths = new long[size]; + + int k = 0; + for (Streak s : streaks) + { + startTimes[k] = s.start; + endTimes[k] = s.end; + lengths[k] = s.length; + k++; + + maxStreakLength = Math.max(maxStreakLength, s.length); + } + } } + private void generateRandomData() + { + int size = 30; + + startTimes = new long[size]; + endTimes = new long[size]; + lengths = new long[size]; + + Random random = new Random(); + Long date = DateHelper.getStartOfToday(); + + for(int i = 0; i < size; i++) + { + int l = (int) Math.pow(2, random.nextFloat() * 5 + 1); + + endTimes[i] = date; + date -= l * DateHelper.millisecondsInOneDay; + lengths[i] = (long) l; + startTimes[i] = date; + + maxStreakLength = Math.max(maxStreakLength, l); + } + } @Override protected void onDraw(Canvas canvas) @@ -101,7 +172,7 @@ public class HabitStreakView extends ScrollableDataView float lineHeight = pText.getFontSpacing(); float barHeaderOffset = lineHeight * 0.4f; - int nStreaks = streaks.size(); + int nStreaks = startTimes.length; int start = nStreaks - nColumns - dataOffset; String previousMonth = ""; @@ -109,9 +180,9 @@ public class HabitStreakView extends ScrollableDataView for (int offset = 0; offset < nColumns && start + offset < nStreaks; offset++) { if(start + offset < 0) continue; - String month = dfMonth.format(streaks.get(start + offset).start); + String month = dfMonth.format(startTimes[start + offset]); - long l = streaks.get(offset + start).length; + long l = lengths[offset + start]; double lRelative = ((double) l) / maxStreakLength; pBar.setColor(colors[(int) Math.floor(lRelative * 3)]); diff --git a/app/src/main/java/org/isoron/uhabits/views/RingView.java b/app/src/main/java/org/isoron/uhabits/views/RingView.java index 4b49f0ff8..e897fb5fb 100644 --- a/app/src/main/java/org/isoron/uhabits/views/RingView.java +++ b/app/src/main/java/org/isoron/uhabits/views/RingView.java @@ -21,34 +21,57 @@ import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.RectF; +import android.util.AttributeSet; import android.view.View; +import org.isoron.helpers.ColorHelper; +import org.isoron.helpers.DialogHelper; +import org.isoron.uhabits.R; + public class RingView extends View { private int size; private int color; - private float perc; + private float percentage; private Paint pRing; private float lineHeight; private String label; private RectF rect; - public RingView(Context context, int size, int color, float perc, String label) + public RingView(Context context, AttributeSet attrs) + { + super(context, attrs); + + this.size = (int) context.getResources().getDimension(R.dimen.small_square_size) * 4; + this.label = DialogHelper.getAttribute(context, attrs, "label"); + this.color = ColorHelper.palette[7]; + this.percentage = 0.75f; + init(); + } + + public void setColor(int color) { - super(context); - this.size = size; this.color = color; - this.perc = perc; + pRing.setColor(color); + postInvalidate(); + } + + public void setPercentage(float percentage) + { + this.percentage = percentage; + postInvalidate(); + } + private void init() + { pRing = new Paint(); - pRing.setColor(color); pRing.setAntiAlias(true); + pRing.setColor(color); pRing.setTextAlign(Paint.Align.CENTER); - + pRing.setTextSize(size * 0.2f); + lineHeight = pRing.getFontSpacing(); rect = new RectF(); - - this.label = label; } @Override @@ -66,10 +89,10 @@ public class RingView extends View pRing.setColor(color); rect.set(0, 0, size, size); - canvas.drawArc(rect, -90, 360 * perc, true, pRing); + canvas.drawArc(rect, -90, 360 * percentage, true, pRing); pRing.setColor(Color.rgb(230, 230, 230)); - canvas.drawArc(rect, 360 * perc - 90 + 2, 360 * (1 - perc) - 4, true, pRing); + canvas.drawArc(rect, 360 * percentage - 90 + 2, 360 * (1 - percentage) - 4, true, pRing); pRing.setColor(Color.WHITE); rect.inset(thickness, thickness); @@ -77,8 +100,7 @@ public class RingView extends View pRing.setColor(Color.GRAY); pRing.setTextSize(size * 0.2f); - lineHeight = pRing.getFontSpacing(); - canvas.drawText(String.format("%.0f%%", perc * 100), rect.centerX(), + canvas.drawText(String.format("%.0f%%", percentage * 100), rect.centerX(), rect.centerY() + lineHeight / 3, pRing); pRing.setTextSize(size * 0.15f); diff --git a/app/src/main/java/org/isoron/uhabits/views/ScrollableDataView.java b/app/src/main/java/org/isoron/uhabits/views/ScrollableDataView.java index cdd7bf99e..8c0ad9dab 100644 --- a/app/src/main/java/org/isoron/uhabits/views/ScrollableDataView.java +++ b/app/src/main/java/org/isoron/uhabits/views/ScrollableDataView.java @@ -21,6 +21,7 @@ package org.isoron.uhabits.views; import android.animation.ValueAnimator; import android.content.Context; +import android.util.AttributeSet; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.View; @@ -42,7 +43,17 @@ public abstract class ScrollableDataView extends View implements GestureDetector public ScrollableDataView(Context context) { super(context); + init(context); + } + public ScrollableDataView(Context context, AttributeSet attrs) + { + super(context, attrs); + init(context); + } + + private void init(Context context) + { detector = new GestureDetector(context, this); scroller = new Scroller(context, null, true); scrollAnimator = ValueAnimator.ofFloat(0, 1); diff --git a/app/src/main/res/layout/show_habit.xml b/app/src/main/res/layout/show_habit.xml index bca7927bf..820567e0b 100644 --- a/app/src/main/res/layout/show_habit.xml +++ b/app/src/main/res/layout/show_habit.xml @@ -1,5 +1,6 @@ + + + + @@ -45,6 +57,12 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"/> + + + @@ -59,6 +77,11 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"/> + + \ No newline at end of file diff --git a/app/src/main/res/layout/show_habit_activity.xml b/app/src/main/res/layout/show_habit_activity.xml index 281221efc..1c2bb74d2 100644 --- a/app/src/main/res/layout/show_habit_activity.xml +++ b/app/src/main/res/layout/show_habit_activity.xml @@ -4,12 +4,15 @@ android:layout_width="match_parent" android:layout_height="match_parent" tools:context="org.isoron.uhabits.ShowHabitActivity" - tools:ignore="MergeRootFrame" > + tools:ignore="MergeRootFrame" + tools:menu="show_habit_activity_menu,show_habit_fragment_menu"> + android:layout_height="match_parent" + tools:layout="@layout/show_habit" + android:layout_gravity="center"/> From 33d7ab52ca5d44a7bc9fb58b76a8974c79ad0b41 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Fri, 26 Feb 2016 08:11:43 -0500 Subject: [PATCH 20/57] Remove unused resources --- .../res/drawable-hdpi/ic_action_dismiss.png | Bin 244 -> 0 bytes .../drawable-hdpi/ic_action_pick_color.png | Bin 552 -> 0 bytes .../res/drawable-mdpi/ic_action_dismiss.png | Bin 192 -> 0 bytes .../drawable-mdpi/ic_action_pick_color.png | Bin 394 -> 0 bytes .../res/drawable-xhdpi/ic_action_dismiss.png | Bin 289 -> 0 bytes .../drawable-xhdpi/ic_action_pick_color.png | Bin 716 -> 0 bytes .../res/drawable-xxhdpi/ic_action_dismiss.png | Bin 439 -> 0 bytes .../drawable-xxhdpi/ic_action_pick_color.png | Bin 1069 -> 0 bytes app/src/main/res/drawable/habits_header.xml | 26 - .../main/res/drawable/habits_header_check.xml | 5 - app/src/main/res/drawable/habits_item.xml | 14 - .../main/res/drawable/habits_item_check.xml | 7 - app/src/main/res/values-pt/strings.xml | 2 - app/src/main/res/values-zh/strings.xml | 2 - app/src/main/res/values/colors.xml | 507 ++++++------ app/src/main/res/values/dimens.xml | 2 - app/src/main/res/values/fontawesome.xml | 729 +++++++++--------- app/src/main/res/values/strings.xml | 2 - 18 files changed, 616 insertions(+), 680 deletions(-) delete mode 100644 app/src/main/res/drawable-hdpi/ic_action_dismiss.png delete mode 100644 app/src/main/res/drawable-hdpi/ic_action_pick_color.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_action_dismiss.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_action_pick_color.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_action_dismiss.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_action_pick_color.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_action_dismiss.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_action_pick_color.png delete mode 100644 app/src/main/res/drawable/habits_header.xml delete mode 100644 app/src/main/res/drawable/habits_header_check.xml delete mode 100644 app/src/main/res/drawable/habits_item.xml delete mode 100644 app/src/main/res/drawable/habits_item_check.xml diff --git a/app/src/main/res/drawable-hdpi/ic_action_dismiss.png b/app/src/main/res/drawable-hdpi/ic_action_dismiss.png deleted file mode 100644 index ea21b1bf2d32c94ace88bc6ca0608f950bf0a8f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 244 zcmVxAF(T)`HvuDGVr0WPFgb)HmjIpnmU{E@&we83` zr#i-z(x4n7NKL6NJu(}hwMoJ+pYQEO+b$QLkpUGla6hgb+dqQDz2^@d=z;EY9%&0000^7m8@BU8rf&rp?mUDuSYj(3OG@EVyt}+=<2NN*5OD+kfl1G6Nx` zX_qHB7cLpnF21=r_c4=57&B(fm@#9dRw|W7^7;H;Hk)0I9lYZ>vw(kaUH1p;O03`k z?!jLL9?zR*v)LaP$qeRlxnltr$NJgxys=oo7mLLSK;LS3ME(<=ii>2{5$%?SSJB_3 z2N!Jv{t&R=et5jQq=(OBGNXX4`@vP@@6+k@FuP<@lAu9&yl*3Er`YRzMG`b5@**RL zx~l@R76kWg;D}i=GrFsG@H%a?f@ECXRl^*=JxM}SmPnCButWynKMIAy5~E~>;8zin z`E$T;(7{U$53BDXNqbH?jLG!a4IclwldnX#0l@9{5cwA1lXUR5ZI4G)8{MpEPgj6H z?ICHmDB%G%A5|`uAJBGMk&mkRZz16C_&Q}a<~})e;}o?b@V-;kqBJKT{Iz9SlT_pY znge9RpO}zPP0#RHpQyQKjkVIebkO*Po;s`5>HwwI{Wk_-C6f9ELEVzIqbd!)&@$}? z5aFF3Mua3KJQ8!dTl8gsV?B^8$f2W4P0Dr`Dn{u*Lx5H(bFxBOg qblQEnRlw$KTD==HX3Utee`UYYKr^sCc2w6xeNzzy_ndVC~qi7aV%1)#1hR8ycY%DBjq?FRlSK+_)oSLcW_FA5I zV@{ps?cF@*H|KZGOsCUE8~-K3Fx-mcc+Wc6ahx&0rxfrVMbWxdcn}2hKp!aJhXVGk z!hPT01o~0IFS+Vk0lTg{it1wlOLBfBC#=AeB$)$t-+;eM8?3-L2!L-jTucW%RtM*K zJ_4{;gBy9E4$rb|2GzHNaMWLyWjUk@Pt$Y>_{$)iyC;k|r9EOR&3-rXllw(gxaWD3 zyyCtAF6tBYzW-r3ffwp;Q)7P!vVZu z+fB=Y;e055(EggO8D{*%+7}JwR|d1)S%I@?R%M?X4A;|UccsTDeKn}RsLiO^cY&V? oj69bS~)ofXa1Y#`uzS+zAq z+bLWvWqYZ^LH)IB{p7yOy!d{nc=cK}PDY?|Ab6m)e#)gO#eMghbC;dn#&h*aa?g8J zkI1Go^HkS-GTR){rlq>(e$7q0IMp{#%Qr6%cquf;)_aBF=9vy>Pgb*Khuu?7`25MA z?XBCt&I5N(-k01H{nMId*YyAHDH1>9TiPb?S2A1k$GqwA>G@L?6zfBpdj3Rm3Vr&- z>T#dxl6}*q`sPdgPM7)*UD9{HwEplVZlz1!Nte18T{`{flC<)r=;Tkc7k|3_*zs?} ik+7yuf|3w7znIFuY4Jmm8~LFpKmwkwelF{r5}E+SyMQ|Y diff --git a/app/src/main/res/drawable-xhdpi/ic_action_pick_color.png b/app/src/main/res/drawable-xhdpi/ic_action_pick_color.png deleted file mode 100644 index cda4f1376a5b9a1f9301f77093d7b8167a655bb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 716 zcmV;-0yF)IP))16fLZ`m_)4;*C6buh+YV5?{dr zTx8*q`Oo-xQX0NoF5ddkH$aXtW^u^leB%mm#=0zgk|d9?xA(7t$HIK42T*l&G2qUIWd2mr?(&EO+-m-a%XRz6lTzmEKKnh>^!DinWv;AvVG&UFXLN%qlicDkb2G^7uv%ow zJ_O#ysswzRrnh-X83K>*f0Z#i%w!aEsf6h$xl@9PF#X>~fCr(;ja_i%to(DYs-n!MP^`G6!> z@_$hBOJjf3b-Uf`09wo2TUXZavVeHD=f3y8TCLuZC~v@g8L`LLvJ+sfR-2XC+<@!) zba!O?v0P_kX``Hf`5bY4i7B@L0DBQ&Z8zi=08m@L3xIC_K@EOBWVn&Cx17?j0EYqP z|AR-R%3S||XL-n2D{-C0x34(PUJdvy&alB|Gw%k+b(}5vfYbRQcJcR$%q3>u>hh;2 yuJOgr@28yJ5Dh*ju*^O;nM@{=$z(E_ilP5$@)Mx#4s^Ky0000V65|WaSW-r_4dx$+(Qlm4vF$X z?m^AGtUCnGEt$Ebp@dtwa6^F5(+LK~_uhL}yMF%7pjxG z=`)nCbyz0l$No9|@I#I5`{R#4KCX(hHc?FKiBNvlVO#Vf=Fj%%kM`$FSDl+WyI}U8 z&t}g~EQ}RSDm9;6U+swH2hmhH;P z{e8rW_tbvX8CP3QZG2mIs%-UKKF;@X)>FglB;JP1+4pcu@JfNhS<9Qa+OGRO3%TT% z)R>_jD7a;^#o8^CS18}|ydwBkz3w?gj)+2+XZ{N zvvL{k>HFiDZ1DC%;KP>oixc;+ymW4cRZ*y;k=|>MW2L671&P6P)pl&siFVg}%M1%S bAkF`rDOEH7qoT925J=S1)z4*}Q$iB}$~(T$ diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_pick_color.png b/app/src/main/res/drawable-xxhdpi/ic_action_pick_color.png deleted file mode 100644 index ec00751d804ee9cf3c76e249fe9b1ce7ef1c8a05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1069 zcmV+|1k(G7P)-K_)aRoIf8c-3i_}}_F z$uuFATV}iE<@Y7?K-%)~&GgJUXXZAQB7_h^2qAfaK$S0g~q$J? zag4V77gk3gcDk8-wdr1>E&n0sEaWe)CLiyqve@#QVs>EVkF6%YUTm?|;5WY642M=BcX1%D<~Cp2b#ct6COYYgN^<*h(PovE_<7 zr+sc1@9V|ZMH+MqIo*)|#YR3p_n5_&TT9`;vswfBpLnot3FK|S7_kvwFSevOqe(mY zyD;9_%9kNWjx=dk)%IZ1{NW-WVe2+cTBMkeH{9&tL^JfftW+xNsnY;;H|L>?cs0Ib z0=j6_fJ`Q{4bon_%E$lsgGo%&r~$=dai^q;9#+0=y60%rEWh8Ub7ZKw`X8{^G9V1Y z1E$TiCT)fZ*+Xb`4dmnh{F3{fw5my8U*C4D*l(Uz{u1_(kX8+Vv`0SVt8tx14Tz%X zxG(u~*=llfaviN|BC;UugQp3YlCuF?H2^vKpr^P$kM#8rjT#{Rcpq7hY`W}l+HJfy zJ;nVCv}w_5uszLckbi?V?NT4_Ho|GYZ?oyTiGWs~Iry7|hl8fG)o zjUg$DqQh}viZlVS{ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/habits_header_check.xml b/app/src/main/res/drawable/habits_header_check.xml deleted file mode 100644 index 101e22dcb..000000000 --- a/app/src/main/res/drawable/habits_header_check.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/habits_item.xml b/app/src/main/res/drawable/habits_item.xml deleted file mode 100644 index 4ba72d44f..000000000 --- a/app/src/main/res/drawable/habits_item.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/habits_item_check.xml b/app/src/main/res/drawable/habits_item_check.xml deleted file mode 100644 index e217a4e9c..000000000 --- a/app/src/main/res/drawable/habits_item_check.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 8b43fe2c7..1c98c7aac 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -30,7 +30,6 @@ Criar hábito dias Deletar - Descrição Pergunta (por ex., \"você meditou hoje?\") Cancelar Editar @@ -66,7 +65,6 @@ Hábitos restaurados. Nada para refazer. Nada para desfazer. - Marcado. Desarquivar Você pode ter no máximo uma repetição por dia. Nome não pode ficar em branco. diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 856e83fc3..e1a260566 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -17,7 +17,6 @@ Nothing to redo. 习惯修改了. 取消了修改. - Repetition toggled. 习惯存档成功. 习惯取消存档成功. @@ -31,7 +30,6 @@ 习惯强度 历史 取消 - 描叙 提醒问题(你xxx了吗) 重复 次每 diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index bd3296cf7..6748fdb6c 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -18,11 +18,9 @@ #37474f #263238 - #9a4000 #e6e6e6 #ffffff - #cccccc #f2f2f2 @@ -50,281 +48,278 @@ #404040 #363636 #808080 - #ffffff - #888888 - #bfbfbf - #FFEBEE - #FFCDD2 - #EF9A9A - #E57373 - #EF5350 - #F44336 - #E53935 - #D32F2F - #C62828 - #B71C1C - #FF8A80 - #FF5252 - #FF1744 - #D50000 + + + + + + + + + + + + + + - #EDE7F6 - #D1C4E9 - #B39DDB - #9575CD - #7E57C2 - #673AB7 - #5E35B1 - #512DA8 - #4527A0 - #311B92 - #B388FF - #7C4DFF - #651FFF - #6200EA + + + + + + + + + + + + + + - #E1F5FE - #B3E5FC - #81D4FA - #4FC3F7 - #29B6F6 - #03A9F4 - #039BE5 - #0288D1 - #0277BD - #01579B - #80D8FF - #40C4FF - #00B0FF - #0091EA + + + + + + + + + + + + + + - #E8F5E9 - #C8E6C9 - #A5D6A7 - #81C784 - #66BB6A - #4CAF50 - #43A047 - #388E3C - #2E7D32 - #1B5E20 - #B9F6CA - #69F0AE - #00E676 - #00C853 + + + + + + + + + + + + + + - #FFFDE7 - #FFF9C4 - #FFF59D - #FFF176 - #FFEE58 - #FFEB3B - #FDD835 - #FBC02D - #F9A825 - #F57F17 - #FFFF8D - #FFFF00 - #FFEA00 - #FFD600 + + + + + + + + + + + + + + - #FBE9E7 - #FFCCBC - #FFAB91 - #FF8A65 - #FF7043 - #FF5722 - #F4511E - #E64A19 - #D84315 - #BF360C - #FF9E80 - #FF6E40 - #FF3D00 - #DD2C00 + + + + + + + + + + + + + + - #ECEFF1 - #CFD8DC - #B0BEC5 - #90A4AE - #78909C - #607D8B - #546E7A - #455A64 - #37474F - #263238 + + + + + + + + + + - #FCE4EC - #F8BBD0 - #F48FB1 - #F06292 - #EC407A - #E91E63 - #D81B60 - #C2185B - #AD1457 - #880E4F - #FF80AB - #FF4081 - #F50057 - #C51162 + + + + + + + + + + + + + + - #E8EAF6 - #C5CAE9 - #9FA8DA - #7986CB - #5C6BC0 + + + + + #3F51B5 - #3949AB - #303F9F - #283593 - #1A237E - #8C9EFF - #536DFE - #3D5AFE - #304FFE + + + + + + + + - #E0F7FA - #B2EBF2 - #80DEEA - #4DD0E1 - #26C6DA - #00BCD4 - #00ACC1 - #0097A7 - #00838F - #006064 - #84FFFF - #18FFFF - #00E5FF - #00B8D4 + + + + + + + + + + + + + + - #F1F8E9 - #DCEDC8 - #C5E1A5 - #AED581 - #9CCC65 - #8BC34A - #7CB342 - #689F38 - #558B2F - #33691E - #CCFF90 - #B2FF59 - #76FF03 - #64DD17 + + + + + + + + + + + + + + - #FFF8E1 - #FFECB3 - #FFE082 - #FFD54F - #FFCA28 - #FFC107 - #FFB300 - #FFA000 - #FF8F00 - #FF6F00 - #FFE57F - #FFD740 - #FFC400 - #FFAB00 + + + + + + + + + + + + + + - #EFEBE9 - #D7CCC8 - #BCAAA4 - #A1887F - #8D6E63 - #795548 - #6D4C41 - #5D4037 - #4E342E - #3E2723 + + + + + + + + + + - #F3E5F5 - #E1BEE7 - #CE93D8 - #BA68C8 - #AB47BC - #9C27B0 - #8E24AA - #7B1FA2 - #6A1B9A - #4A148C - #EA80FC - #E040FB - #D500F9 - #AA00FF + + + + + + + + + + + + + + - #E3F2FD - #BBDEFB - #90CAF9 - #64B5F6 - #42A5F5 - #2196F3 - #1E88E5 - #1976D2 - #1565C0 - #0D47A1 - #82B1FF - #448AFF - #2979FF - #2962FF + + + + + + + + + + + + + + - #E0F2F1 - #B2DFDB - #80CBC4 - #4DB6AC - #26A69A - #009688 - #00897B - #00796B - #00695C - #004D40 - #A7FFEB - #64FFDA - #1DE9B6 - #00BFA5 + + + + + + + + + + + + + + - #F9FBE7 - #F0F4C3 - #E6EE9C - #DCE775 - #D4E157 - #CDDC39 - #C0CA33 - #AFB42B - #9E9D24 - #827717 - #F4FF81 - #EEFF41 - #C6FF00 - #AEEA00 + + + + + + + + + + + + + + - #FFF3E0 - #FFE0B2 - #FFCC80 - #FFB74D - #FFA726 - #FF9800 - #FB8C00 - #F57C00 - #EF6C00 - #E65100 - #FFD180 - #FFAB40 - #FF9100 - #FF6D00 + + + + + + + + + + + + + + - #FAFAFA + #F5F5F5 - #EEEEEE - #E0E0E0 - #BDBDBD + + + #9E9E9E - #757575 - #616161 - #424242 - #212121 + + + + \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 6e8b2f009..045683958 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -1,6 +1,4 @@ - 16dp - 16dp 20dp 42dp diff --git a/app/src/main/res/values/fontawesome.xml b/app/src/main/res/values/fontawesome.xml index 8b20b647d..d760dbfe0 100644 --- a/app/src/main/res/values/fontawesome.xml +++ b/app/src/main/res/values/fontawesome.xml @@ -1,372 +1,373 @@ - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 21e79bef6..ab899a754 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -18,7 +18,6 @@ Nothing to redo. Habit changed. Habit changed back. - Repetition toggled. Habits archived. Habits unarchived. @@ -49,7 +48,6 @@ Habit strength History Clear - Description Question (Did you … today?) Repeat times in From 6a1cb09ca287e39d60349ace87ec5241a523a1b4 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Fri, 26 Feb 2016 08:25:56 -0500 Subject: [PATCH 21/57] Remove unused imports and variables --- .../org/isoron/uhabits/commands/ChangeHabitColorCommand.java | 1 - app/src/main/java/org/isoron/uhabits/io/CSVExporter.java | 2 -- 2 files changed, 3 deletions(-) diff --git a/app/src/main/java/org/isoron/uhabits/commands/ChangeHabitColorCommand.java b/app/src/main/java/org/isoron/uhabits/commands/ChangeHabitColorCommand.java index f522f0bf5..547024b42 100644 --- a/app/src/main/java/org/isoron/uhabits/commands/ChangeHabitColorCommand.java +++ b/app/src/main/java/org/isoron/uhabits/commands/ChangeHabitColorCommand.java @@ -23,7 +23,6 @@ import org.isoron.uhabits.R; import org.isoron.uhabits.models.Habit; import java.util.ArrayList; -import java.util.LinkedList; import java.util.List; public class ChangeHabitColorCommand extends Command diff --git a/app/src/main/java/org/isoron/uhabits/io/CSVExporter.java b/app/src/main/java/org/isoron/uhabits/io/CSVExporter.java index 291d351d6..ee0bde879 100644 --- a/app/src/main/java/org/isoron/uhabits/io/CSVExporter.java +++ b/app/src/main/java/org/isoron/uhabits/io/CSVExporter.java @@ -111,8 +111,6 @@ public class CSVExporter private void writeFiles(Habit habit) throws IOException { - boolean success; - String path = String.format("%s/", habit.name); new File(basePath + path).mkdirs(); generateDirs.add(path); From 88455acc765850b1d4bb7490ddc3d577094e1142 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Sat, 27 Feb 2016 05:44:14 -0500 Subject: [PATCH 22/57] Fix check button for previous day reminders --- .../org/isoron/uhabits/ReminderAlarmReceiver.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/isoron/uhabits/ReminderAlarmReceiver.java b/app/src/main/java/org/isoron/uhabits/ReminderAlarmReceiver.java index e2769614f..556b586ac 100644 --- a/app/src/main/java/org/isoron/uhabits/ReminderAlarmReceiver.java +++ b/app/src/main/java/org/isoron/uhabits/ReminderAlarmReceiver.java @@ -97,10 +97,7 @@ public class ReminderAlarmReceiver extends BroadcastReceiver private void checkHabit(Context context, Intent intent) { Uri data = intent.getData(); - Long timestamp = DateHelper.getStartOfToday(); - String paramTimestamp = data.getQueryParameter("timestamp"); - - if(paramTimestamp != null) timestamp = Long.parseLong(paramTimestamp); + Long timestamp = intent.getLongExtra("timestamp", DateHelper.getStartOfToday()); Habit habit = Habit.get(ContentUris.parseId(data)); habit.toggleRepetition(timestamp); @@ -131,6 +128,8 @@ public class ReminderAlarmReceiver extends BroadcastReceiver { Uri data = intent.getData(); Habit habit = Habit.get(ContentUris.parseId(data)); + Long timestamp = intent.getLongExtra("timestamp", DateHelper.getStartOfToday()); + Long reminderTime = intent.getLongExtra("reminderTime", DateHelper.getStartOfToday()); if (habit.hasImplicitRepToday()) return; @@ -154,7 +153,9 @@ public class ReminderAlarmReceiver extends BroadcastReceiver Intent checkIntent = new Intent(context, ReminderAlarmReceiver.class); checkIntent.setData(data); checkIntent.setAction(ACTION_CHECK); - PendingIntent checkIntentPending = PendingIntent.getBroadcast(context, 0, checkIntent, 0); + checkIntent.putExtra("timestamp", timestamp); + PendingIntent checkIntentPending = + PendingIntent.getBroadcast(context, 0, checkIntent, PendingIntent.FLAG_ONE_SHOT); Intent snoozeIntent = new Intent(context, ReminderAlarmReceiver.class); snoozeIntent.setData(data); @@ -163,8 +164,6 @@ public class ReminderAlarmReceiver extends BroadcastReceiver Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); - Long reminderTime = intent.getLongExtra("reminderTime", DateHelper.getStartOfToday()); - NotificationCompat.WearableExtender wearableExtender = new NotificationCompat.WearableExtender().setBackground( BitmapFactory.decodeResource(context.getResources(), R.drawable.stripe)); From c1dae021bfea528818793e2ca6d0231ba1bf25f7 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Sat, 27 Feb 2016 11:52:46 -0500 Subject: [PATCH 23/57] Implement dummy widget --- app/src/main/AndroidManifest.xml | 10 +++ app/src/main/ic_small_widget_preview-web.png | Bin 0 -> 35716 bytes .../isoron/uhabits/SmallWidgetProvider.java | 66 ++++++++++++++++ .../isoron/uhabits/views/SmallWidgetView.java | 71 ++++++++++++++++++ app/src/main/res/layout/small_widget.xml | 25 ++++++ .../main/res/layout/small_widget_preview.xml | 7 ++ .../mipmap-hdpi/ic_small_widget_preview.png | Bin 0 -> 2774 bytes .../mipmap-mdpi/ic_small_widget_preview.png | Bin 0 -> 1652 bytes .../mipmap-xhdpi/ic_small_widget_preview.png | Bin 0 -> 3812 bytes .../mipmap-xxhdpi/ic_small_widget_preview.png | Bin 0 -> 6183 bytes .../ic_small_widget_preview.png | Bin 0 -> 8745 bytes app/src/main/res/xml/small_widget_info.xml | 12 +++ 12 files changed, 191 insertions(+) create mode 100644 app/src/main/ic_small_widget_preview-web.png create mode 100644 app/src/main/java/org/isoron/uhabits/SmallWidgetProvider.java create mode 100644 app/src/main/java/org/isoron/uhabits/views/SmallWidgetView.java create mode 100644 app/src/main/res/layout/small_widget.xml create mode 100644 app/src/main/res/layout/small_widget_preview.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_small_widget_preview.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_small_widget_preview.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_small_widget_preview.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_small_widget_preview.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_small_widget_preview.png create mode 100644 app/src/main/res/xml/small_widget_info.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 79203bf14..f1c20a8d3 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -62,6 +62,16 @@ + + + + + + + + diff --git a/app/src/main/ic_small_widget_preview-web.png b/app/src/main/ic_small_widget_preview-web.png new file mode 100644 index 0000000000000000000000000000000000000000..5d6fa2451e2c8f303241f180b27c23e9638dc66c GIT binary patch literal 35716 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 literal 0 HcmV?d00001 diff --git a/app/src/main/java/org/isoron/uhabits/SmallWidgetProvider.java b/app/src/main/java/org/isoron/uhabits/SmallWidgetProvider.java new file mode 100644 index 000000000..0ba2d196a --- /dev/null +++ b/app/src/main/java/org/isoron/uhabits/SmallWidgetProvider.java @@ -0,0 +1,66 @@ +/* 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; + +import android.appwidget.AppWidgetManager; +import android.appwidget.AppWidgetProvider; +import android.content.Context; +import android.graphics.Bitmap; +import android.util.Log; +import android.widget.RemoteViews; + +import org.isoron.uhabits.views.SmallWidgetView; + +import java.io.FileNotFoundException; +import java.io.FileOutputStream; + +public class SmallWidgetProvider extends AppWidgetProvider +{ + @Override + public void onUpdate(Context context, AppWidgetManager manager, int[] appWidgetIds) + { + for(int id : appWidgetIds) + updateWidget(context, manager, id); + } + + private void updateWidget(Context context, AppWidgetManager manager, int widgetId) + { + RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.small_widget); + + SmallWidgetView widgetView = new SmallWidgetView(context); + widgetView.setDrawingCacheEnabled(true); + widgetView.measure(200, 200); + widgetView.layout(0, 0, 200, 200); + widgetView.buildDrawingCache(true); + + Bitmap drawingCache = widgetView.getDrawingCache(); + + try + { + drawingCache.compress(Bitmap.CompressFormat.PNG, 100, + new FileOutputStream(context.getFilesDir() + "/widget.png")); + } + catch (FileNotFoundException e) + { + e.printStackTrace(); + } + + Log.d("SmallWidgetProvider", drawingCache.toString()); + remoteViews.setImageViewBitmap(R.id.imageView, drawingCache); + manager.updateAppWidget(widgetId, remoteViews); + } +} diff --git a/app/src/main/java/org/isoron/uhabits/views/SmallWidgetView.java b/app/src/main/java/org/isoron/uhabits/views/SmallWidgetView.java new file mode 100644 index 000000000..33c0105d4 --- /dev/null +++ b/app/src/main/java/org/isoron/uhabits/views/SmallWidgetView.java @@ -0,0 +1,71 @@ +/* + * 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.views; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.util.AttributeSet; +import android.view.View; + +import org.isoron.helpers.ColorHelper; + +public class SmallWidgetView extends View +{ + private Paint pCircle; + + public SmallWidgetView(Context context) + { + super(context); + init(context); + } + + public SmallWidgetView(Context context, AttributeSet attrs) + { + super(context, attrs); + init(context); + } + + private void init(Context context) + { + pCircle = new Paint(); + pCircle.setColor(ColorHelper.palette[7]); + } + + @Override + protected void onDraw(Canvas canvas) + { + super.onDraw(canvas); + canvas.drawOval(0, 0, getMeasuredWidth(), getMeasuredHeight(), pCircle); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) + { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + setMeasuredDimension(widthMeasureSpec, heightMeasureSpec); + } + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) + { + super.onSizeChanged(w, h, oldw, oldh); + } +} diff --git a/app/src/main/res/layout/small_widget.xml b/app/src/main/res/layout/small_widget.xml new file mode 100644 index 000000000..626b909f1 --- /dev/null +++ b/app/src/main/res/layout/small_widget.xml @@ -0,0 +1,25 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/small_widget_preview.xml b/app/src/main/res/layout/small_widget_preview.xml new file mode 100644 index 000000000..505bc619b --- /dev/null +++ b/app/src/main/res/layout/small_widget_preview.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_small_widget_preview.png b/app/src/main/res/mipmap-hdpi/ic_small_widget_preview.png new file mode 100644 index 0000000000000000000000000000000000000000..7ee617aa61f749c87ca2f68a1d2829f656143bdd GIT binary patch literal 2774 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/ic_small_widget_preview.png b/app/src/main/res/mipmap-mdpi/ic_small_widget_preview.png new file mode 100644 index 0000000000000000000000000000000000000000..ff862e25261759915d3f2310d71eeb63f96a132a GIT binary patch literal 1652 zcmV-)28;QLP)_FQKD%EbW_;WokJF2qp8 z+{J0wLVz(-fQxJZR;Dp$)^l*n3F9UN+~H}HMxpZt+`-Hpc}$M#p{Y~h_Mv_iF;uGD zK>Ql{+IoxFvm2L9jD=ysNPPGO-r^5<5wLR` zo?SR;0boq=XccgIK)J(u1aE8RE2l;Mzsri>4Jfv(M7IjKw(%|ei%#Kj6Motwx~A>e zY%QS72AfQsR!LztHq`lbU@6|iH|9YE>{5gXo`7ReeLjQqpD#z<+8wC3ZXfEsv=?=r--51}B%;=X z373Iosa+7epGI2`CCqo%Psb7=G>hT;OIXxdz@Uz=U=!5UI|(HL>04{Bq^736LR?5j zyBmkVL8ieQ5khm3Bz#9ci~8yh0HnpW>j}b8b#?Vt;F(5yJ_v&4-9S_C@HJ^8B1G`R zrGa(k`|3ZHriIjN>HJwzM?*uydb{(1TOtC}RMD~_wW68spt2J2+Sf(d1_vzm`Hu3n zF!N^V+5UAuGJTyS`McR{?#|B6zMq^A+;*klmIJd^`Qk8-XCDWw@!BP)v(KGcZ0&3Q z`;254yorTO%Z{V@-ZE5eAuzI!otEOw8u=` zF?8pe$eAFb&JzLH|E-(U_aBY+>y{FL9J{RGt2e>a->AJHBdsEpDOF0vA||YTA|k#s zpQ-Rzz{L!4a9%zEBIZcLUwA{5nyad+k~|R*KrRTE$pWH(+n=x-p!#WDsPmhRlEI0q zSE=i8Y&dRjnVFgMym?X)L{3JLyH-zs868?qSebn$~o_~WqEMz#r# zYfMZ`oI$&hxg#Wm+*D4M7mK-WwGMixpQe2i-mXl93coDYPI@tuOBtK zu_B>F%tSJn+|DMGk{EwKt+uu{1%tVQ$1_jh<$iwwVkgG-Rx;Sm?B7;m5LtS9x>Bdp z<$y~$rW*?mSnTsEm1+hNJudK`#E=}92f4Yq4{NpBG1v&Xh&wOPA9vfbL+UZ>9PmYcS9NXutx$1E{xbF)l& z$ZJ3mTT>IwN?bG{Wf8?BLUQ=H-y`xLQ2b&8e29>&w*MwGv=lN576uTPT&c4o+DcPr$}K{J$D z^8YHcmkF~Vg?kkFAKoeU58lRW~judQkF{fp*|iiF!9sb>ui>5{}9nam?3Z%2-z9U08I z#Q9@l;r>SvYjAT!62y?x{}~=g=}6#n3Mp&NjyFPZT)-~L%h5>Sz*jjU_%}(2s@uMh zCBcsbXm^Joq1WvUZi;Ee45|9Prvl>OvHTr^gd1tHNsi|8jcI#2Q}Rfh55psY?~d$8 zT2dl>9VOc_RqK+ZIi8-PFyfB9?2!a935<`E=CwU0WXD~ox; zUW+WNbzLarZ7csc8VBWIlA?OpMX|TPwJh5)o|c!4z8Hn@U1cDpTU_E*cLogp#bt)7DlXCc}sh0{%%PR5WM)B`6kb zc_rv6z#)xU}%SX76f5_Fx6*T?=H@Q{-Vd6cc{0x?|tw0(nL zWH$KP3I&`eO3<~=ZHh<*Jn)<&3F#*qLER12B{O5JFlmY&_zi{TgI~GRr0Te7yQ~Z# znF1=cRWKHJX31w+11$BCmyq_#K~~lIf3;G}w;lLoYK!u&@t(MUD9ToDNZg%idHSg? zTmspKhL?G0kow0J=AU!dRHSVfrN9C|YJB_&=Br{zc2c$9gJ3vW3I} z87~gF(j&mk0!&@__Q2rt-BICEhX5bz`A;Hu0WMQXIvPy6si_2Fc9DcRW4@|Ge}X4g zn^28vSi<@T|2De-AM54MBfkM$;z(6YH4x*I4L7IzS#$0S(^2Y=1WUoMv>y0auWXSX z1zc_ijRp19Gx3FtD} z1?{;9>ALDIBVpGRy8|ChFJS z-MG*CaY1wl=u|MtmbMyOkRTL%eSo_;Rj{+9`;^FAWSn zA9xOQ3~qZmgId!V)RM}e=It`v)r_vE^eX-vZ^OUgeek~cn6`ALQyS#*5FsF%3{O(+ z5goRBX{f(7=l-h>{K0A@2mxOocnl~8w-JDDNRpwtL@BD>CPg({K@+1O&u7@b@izP$ z-UsiCkEz@oc^WXek4FH%5~eaHfKTcQ5AlOFGl^aj8mWQLZ}pu3J_kH**%;8P0B-$` zhf&M%_fY4>Jfv!=L|Rn`(rHzY0jrRv>pD`_7o+yG>8SD0tEeVX#{;0# zc?9_I2(W&4G>-0Vsmy9?r*oE&&AXz$ePl^=}rk;Nsa3g0I(e z1GSfBqED90TL*Z|1ihOCVd^f34a60j!eeR7iZF)+?WHgK1;5YjK&!_A6nr+@>RDH^ zdmie!cG@zl(`r@4#l^c~VqzX4UD6U>7UV)>C5@Oc>kfXjghpYbIxtHx34*}SBH)9| z!2$JZA_UqKAF%GlTGG+cacSMUbx)A7;W4~L9CW&*aU5t$k-ko=x)eeJ3;s^y;CGUi z-wS>ex^XU>O6sf8XxjGd+4CHU1HQasj0y=ZpU)2pRA$jz4>k}9+Drct2EKw_r=FFM-WR`?CO)GGFdB(^9cwoC(o~qya8xQ== zya~GBK6}e~wHLBXI=-i;r$Q!^jiVWm`>f#fM-h*jGgL{V^|NUw@%>k~$xwIAG1JF? z!1wFV4^{1Z5Uilbr1KON6}?ETfJ$20X9d{IuB9*^+l%|bnGf!-smr_N*8kn} z2G5VDFPb7PEiHQin;>5I1eG3AYy}=Or+5dpXE4VHn*h%J;69$_{AGfIEz)!$UE2ku ztvQS|r62b@I~vCV?F9uJA9S6yy(=vTPD@*3V`Ibh+z_3@44c`OSAr)(3#=YY|BtI) z+-;1z8#>PKG7Nd^&yZ2ALFywfvaY3PXN=i%QgN!RE?9sxXa8-`Mdjq=%;Zg7ccoRB z4JRfx^6RBx_tQ>Ih53Ie>S-u3+%oHqT78^YweNS}yE=Yxtyg_xP| zckhJG>Q>0x2ZI1E{j7xmtm&xh-#t|AGg{CI27mvr3 zJF+FH>b;tedU7V427caLq*EFvxV*f4sV!I3^W%X#VLc#ntSG!TqMM6_v3z`Etda13_(AHC*3NOBXh&Sn4+N*-d z)hu4Tc&dRkl>Vy>43L0tVr-a?J5!Vpz5;-1pjC*qkwUEDt7n9-4bGcm+Klg?wi-RB zQmHI6FhFCw_eqFue(l1Iv;bdHnoI5+?=_`(L&OK*vukN|Mc@&zn#A#tiVB#Oty7yE zi1CbVV^UpRy@7UDgeig9m9zpM;uG-7tu2cC!5|ZS+XsT#^TINux>Y2qS~p(SP}^ z_x<^6!dBI6l^y~R8!d1Qoo&WD_5?(o#udywXDIN#0DQi zL?CfZc+D-tkpViHtVE0>>#?ShIr(>xS!vUG|MT@u(0hV{f*xvVX(=11TS9Ys0~A%) zg^d?n{~uVyBB+237Gb*5($aX*&9^JsMe85P8aN_2i|{2aCzy~CPAr2VuLOuDv(RG5 z0%^X+kl!Yf*~$~hwkZo1ESL?h$g=s50t8%7x~HdSsK}0A@;VR^ZX`x{@yPHem1HnU z>B5M+k`QvjiN%DIZR3cB5dy==c4=yA>f;)XrkNJ_cmO6kIyyph>$|2M;zJN(Ju+N* zWQ^buGK!EgnzS%~J@q5M`4Z*!_ah{RWMpK_1WTy0GWI&$@(K6>qMILpaJa8<=zlej zvkZ<9ck*B!#AS`pQ%|BEWM6lld-EcMj9Ij3(WJJvwtcy0{-RsI zzTwcHKoR#t$Z#GphSbof4f*bk&Ahz4yn+i03txb0^{iP<9`gLArY6OzRjZ~E_sD%` zK>yPxLq^0FDnIk$tRVm-{2FE1}&lAoXd4Cz=4A$5yC zIo4Zb_&a1y5twyx@xg}|umecY4kS8;Z1W@g_>g1xzz=tVZ(hd51$lQ~VD};|+ndA; zZ?cUG^zQut?*!jU85fsz@s-=o2i*xgh2U=J!_obHAleE1AY@!laf(x%;uNPi#VJm) ay8Iuu9@8s!prwBR0000_AItc$!KvDn7Ff-~X4vIU2R@C`3C@2G!Q4lC) zDQ)SZfU;;sabXux5kv$;meSI_O}DH~?*HE8zH<9`Nwd7X#PBIQPHk@5>|vGPZ4iSn|pMA-nn6}lFBo313S zQCq6K0v|u2DOP-`-lE8F-6CJql&^fGB3F9T?yP}*;QIy<&IZgHP}IBunu{x>(d|X@ zd$c8rY})mw#BAas&K6!5lzYgNd3@;9PkpIYhlhIYV2TR)(U2hoQ0N zdI-~j>J9SQYv%Ne?*=9ck`Ulj=gZ?YMQN|Vn^lfe3J{~iG*{cWS-Gt2wZwGzy+a9@ zC`dwpQJep#~M5qI5DLh@v{o~7}55wyd2R)i2rBR5?k*7#L1zs=}g@zL%?TKvZ zlkhsl6Df_Yi~JTM2A)<5i_Hp6e=<8|F1%j-pvMrp$gd#^&=e_drIE+}NOW{*%46`l zC18jm{TU)Cmw zq4I7&9G-C7AndWFDf8iV9e}H|KDbX5?28Zu)D_&&-(LnsJtnG)l+DZj8hbmuzR9>x z#7qn6?Ng}?jjY28Vhg?L{Ci!V{6KPCZza6UNznV^VGo}Y)dB66X&D{#hP%hVdwXCO zyv|4u^~dGC&*-6m>Sg`Hd~GJ7E3W@^3g|eo40N2%0fxiR0o{igF285{7DerY<0H}N z{Xi_L*?P!pqfmglNcj>42YDI!COssmy!e zsoJQB^Y#hwyutJHyTF>6+OD_^5!9HPe?1U0310V9=!sTRnO8+2G(}@Eg$Kd&U(lVI z+A1JK6J7eO%WGvH!t0)fQyEj*b5&*Hhv#ZeT3>Hlwc(UCB575>F-3No6`d*Ej4c40oqREvA`KcRzw>ncLtoUf$(&^kMv~g~|Vh z_vJ?DN<8t*nwSS6qq;m5la=G!}69o#YV9=G^YTiH5Hq2ByYSP$X#0ZfZIW z4Ez4>18Ivtc<|Vm?k^J~rx0l@nHV2q&lM6DpvKLqLwVf9+d4dlp0$9((K9g|ndj!n zvlPP9;U;)K;T0anH#`|X2i~8dL^T#q%oP%a4l?VXwj$+B_rvoHH#}~K2*LBV``{@@ z@MO5;nCRDy)_(pkzaU@dnY`|ProZI zh4*J9(Nq+j4zd7LtlS_tJS0SipXUjlx7-NNr*4G@dBr-}0eF8#VI8C(bP&^(76(AE zgm+5^+HlZ8cu0s2J?Gc(m^;#W^55Y78I5%iGh30}4-y4HKk^UH)6T)u1)^ug3D1Wa z9%(zY6ey}ALnPyHKZqRGh!RUf5q)q^Ezc9k^n30Bz@X-3L>qzV7(7edt9d*G4_@-4 z8ZHf&yS0}Uh{CQpVv$s9r{1G5@UCy1)m>8 z0;J;=p!%QOFuV;RI`EVgc;57>$U}Cc9~c{Xmsm@A2B1LrWz~HC;^rX(x6F}15IxBO zkJ0DgVV3$#A07H9Rw-y#t;rpNR$@&4hUTJ#XP10ERJZF+aFznUvM#sQG1G?2LpYb#W|<@UcQ5kq9Wvd3k3 zY=NR-xxG-Gc~83220)@I<9n(KLYn_<5 z0J@qZyTxPc;Y9?I1)dCEpkbhBFEWo|nZ1qiLY5PcG0$Z~h2DGf+=Q1o020-lATvPQ zUrCCE7f0_gfhYoq9F07-z+qs4Rg>9U3M}57Z*djNnV&PyV_w(R6(-~3cSJqN0!SvN zv9L~n(6j(piT&cyD#Kizo$xw%I-!BiK+^)fxxfNP(`E%)S&BAE0QJZ>$w3{5qsP#5 z8lj`tn87Nrycc>;_*h+1Y~URPK!aHTg^C3r6#jzRiWD0>UaATJkt6U}i#VO&U}zX% z5E!)^<)C_l935u>t|HHsfl8L6pP|RlbI^0qYtU=WK*9Gy?|JsU)PwN8+zLID0EnCy zEsBZtod7j#lKowfeg}f6;e-d_8RC4@!Qe2_rV&S&nvED32u8&^8Mv~35UBcKGN>(^ z4I1{p4w{ZG1FG-e1x??*0~!x40(DsVA{DLDF@z{ z+o0c!t1uEEQOyT3_kxbSHBctlSr{IG$av**hv8vsoE8Ecbdyo^V4$fgodlY`eH&;h z4gsUC#g1VX6EJmXfv)}xXg;|KRPUSx%5&2hm`wk;Gx8~TUr-90fTy))h#DZI=(Q!v ztMQk`SPBL(D1~1_7Z3I3e^BXbx^}b#S5YsjdlSd zW5pK`o}mu)dC0WY1)lX5t z=@#)o^t0RHVE`gEj|CnWc{U6N?dNxkV(3Mu(^alryB1AxWj35*q7b8n1YM!g6O$a$ zlCM}Nnhl{GfXEEbRvzHV!)a@Mx@h3(6xaqs<;s;SCrYkAUrf+L>bj({BmXgrX`Of= z8rLmE#)`cT!NX2nNcW&py#Wj6id;EpIk}O?JFf=DOS@cKt&2^o)t-CinP-McM0DP2 zmo$dLBGdsNit4a88=A;jc*y9}g8MwER7cfT!&m?0Rr8?p#>^{LPQAy=`?a>V?vcr4 z10`LL$`mw}byj1D=EF;q$BJ&#@$I86lj(I$kQxIpX=*{oFRSgYwyZ@TQum-fPgU`4 zz^GO6S4L^-fNtBU&OZd8ZRF)`&!0d4nxy;l=Y>gQs8Izgk$h2Zl(}sL(C?VwaMWQ( zAF}E~gP4}o1%H0|Ykn7zoXGCFZtm1de)?QSWAmz2t1>0mpZY9FZzzB*rnk;Z9HjNZ zbHliz4;tG-!xMF%J;7^}(4=jEk#iI)9p7Y$qC8krQ`1M1Yo{DWiY*F-!@tVceGMMA z_UVj1utxBbZGZ(md!7M^5z`?LObCyI70M63 z7=79Z?Stm$)RsNQZ_TZ3GV3H9F17aFQiU;2vQ=mWKm%{>H8=kTS4+Ox8!J|Kt(Cc{i@g0HIx>Bc zeIL|ut}M(1CWD4QdSG-xO;DSyi5)ispl{*jl49cW(>rkB!7O+S$##S_M{aXlFJD(^%_$_uV&$ zHAW^_HO3W%&=-o{_eS!c;EibWcKw4^KV0kmqya;7xgBY#*}VAzs-O%0*KT< z`Qv~IMUw7@vz*#BmdBlMAxyUH+_`hFNJLP(*N_s`5Nv3h!oJ~r8OVT zurEzi9dK&cgr7~jh67{Gw>H0Db#-+vtDG17P?i8IsVoZO9bdjSb(yzRW^4hC0Ad7m z-JU1y*BV#%IX#5p%FvCm`j90PYdJ47?(l}u&5ad_+#7bZz4&yl|44Ux!p1@^LI zf)(COw2hx<;28x>HAnfV!~{JmoJ?hm9zul2K&6&&es$_%u|vcK5HtSOu>Up3i!XRn zQDkuY9s+eg*!`W_+uM&wx}Ga0DuBpT)T60NuP%|Nb8jVee;TQ<52MC+Fhbxz5)qU}_^MjcUC#;TlISyD}64BK=9&&9&yz!TAhb`=$dHL~pU~2l+sqax&SC?-^ zME4L2Kx|RnIn;q6Lge=!JE(Wsr8TL!TA>#y+UNt3Wqf7fEiO-AHCJbRoHNo*scy?I zT)6P2*vfc&MKuXgEM75?Qub=n!>xsi%c5>1Zjgg3>u&%Z?KQ3egw9Rn1E7k%PJf5} z`}hAvY>h-mAtE&q`b7rbJtAz_#nq{K@aE~oI+SrGM+VfFzj4dNF^7+daB`xV$z;;L z_~MHr#59!Qh#umCCoil5<%!!J1X z`D(TL1jmBIUSbA_3nH?_kHBk|;<2!k_KlFFf1H*0cw?UIxY#PO%92Sgo%o~wWD-9j z`m?*8nv-2#UcMabAJJA|&Oj87!)afvi_khISwgsE@Q$pcIq_F${@}rb4|A-Q7i>17yHXlE8pY$BZBA;g3y09jk^+q6`cda7e}L`qfl{QRoa9kBHNQB|O*P!}m$wcTha^f-!W%?0wS z@O3ACTO}>q|K@--IZwpTn>s4=p77v6q#cl>t>h*rCnw*lQmHOERDtb#yel{`RT(dR zY?a)aw`(8yPh2=Jep(ri}@k^5V3Z2bRo=eR##AeIH*rJAO{~BYkHt{&U`hc7;VG`DGH~yI9yF65m8BjVM38IcqER3Vq!1j6nW#j< zlz=ZMaqjLz|!|YBb_!f6!1*sPS6BC)jF;I~hs6H5~7%ay75`eLtc`Oz? z^SVBS$FS08^1ONT#=vsVc6 z^7*}3-kT-rnd&e;BqSsmR%cJcXi)2+l%LGc#~%jpKkPh{9t(Ok6;*!3yMn zEXc~^fmYrp$V$HorM83x3l-qOC>q;JNJx<4s1uJrGm1knQ+V76l_Ty_ z_k8y3*%_x!oq7Rny^F-IBNKX16ho82(0m>U2CA0cZ3HZ58iy?-HI3zgMq7H?} zi(3mMNTEaB^Iwb@FL1IxPM5I%JrAuV# zrIsJhU+}&kPF&Z_hck1XGc)&nCSFfhjf9Ya5C8y>Xs9b2+^@+01_9pvZ1Beo9{_-& zHIx;M0v8V~@dK%6&aG2v2+C6xgWGUHP!XVlyk3M;-*KQR^E~<6=hTRBid8Bt{^#XG zRH;@V4R!r|*t^rpND)!iLU~2X$$gKumAmeYJTKv&ZUJJ#UxW)ndJaQ1o4@2OT;Be> zEc6}gHYs6MO{9Bj*AJ&)|GzdCvp+PrRe#n2mo2zewI^*nA2(4MkY{l0EXa2!4E`41 z4MnUIKZR3Jk)chp>y&B@XOvu@)go%N=6=?WOg9KRIJeVHw#F4BgdJa>5a%u0*;lqv zb}|Q(oC+y9T0ldWW;%%vJpFeUEwB7^%-w6Z5`Iu0^d@8&lUZ9)ES=1FuQIK!IFI3n-+i;wx!$9mY3fY;%mG#=P-pV1L)yF<&=GX` z^Fhb3DyQDC`*h^JI!V_r((&Id>U~_%GD76+$lilq{>0OorD}TDA^1!CXd#v82}||4 z{i*e^Coda|u={^<0|Rem`4v$VrMyDqt~JQ#k+5oY@zeudEs6E3$4sNyL`XA|7K-!Kh->-gt4 zIb+8%VKB28vOj2hH|FETgz`?b3a%p96F;0;+l?g8yHSyKW1LfUT(P@BQs-o}i0tci z-(f`ykuob6H!56M!P~^r{0|PgkLAR%X8n`MkMS2-A56yX)-GYrieLfU@ZrUOt7jG3 z^=Yu8-)Fmvb+okKW!DcI(M}W*0&1)rsgh_i4&KG$AIVRJ|49Nnlsp>Rb>hu=U;cKP#1K7ZlV{Wd-A0b#7OI$5_$;B zMi6MrF-s?@eYPe?n{k&4(rfs{Oj(^(6pgTuD1NNHw;WB@ln*ndYt)@#v=kLB6}Sn* zd2QDJfCSEQEP~-nx4$jfFyot=#jVjQ?J7g4$>8;FH*heh>m6rSyk;XY%YO_0P@1jf zdUy56v9__1Ejk%b+e2O*wdx=Slr44x8MJTUR_>2v-6cT`q9-O`HPox=@KmHFYObON z?<>A<6l|*AW7N9LJfBX1b5Ma_Ls=cwrujVhkDz^a8w@ZhY*`uOD!Ly#@CII@fy~sB zI^r0N27k?#SdT4e{-gqi7oB|--OCKqd%(u4l;c@ENt3%4GP(vf&V4fv%T7_DfbpMf#n2#-?q0~H2N$*wZZZ`Rh z!^(dNTn0sUenTjC6Cg~YnJB%C4hHoiH4~p- zJe+KuQV)p=?GiH1xc!UPjTeC^n$AEKK~+BrAGWgZ9N<7cI~X$?yC)OAZfsKmRl1jo zLV;vJm)X~m8d@!(d`jF~D!oJq_I!4Ns%;3UsV)ATgSQPQ>{HlWZix<;e7e7^-qB0~ zv~2Z6*%xdp0?BQIut;&RPO2d&E=0_RIl~3CUNG&mOp&@z(Wzv>cA40+pt2z9`WLb3 z!%q&6R<;L2L5Mm+Nny3|tSX`DwF*15EE)|rr~XPDNp3) zKVQwP()PqVBYcXAPV53_z>^C0luvh~HuZS0_}9CCAIfvpq3;3P>A|gKV)bk&>Ioew zRnYznzfBz27NR6iJHU;K z{w4$ge5NFU5-E6KioHQNb5ze45C3a)i{l!~G?hjEB>UvdJ6-Gcv686Ugd14vj0$G} z*mFAn;CG@;2q00DO9>{E^?Y1NHlLyRI2LgBYV7J@7@{XbjK!mLNKlHbH5#1>S(7^V zR3vPz=8<X4exvpHQ&0C)UhnlSPj4%&&ZFDogzq=;~`SulNw z2ePgVuykA;mTwfM4C*cEK+&dvEB2?W*l&KH+j9167bqvdL1)KRSb0g1d0(G3X|$+% zWQ!J<9hgsRdTTz!AxT)hYgIx+h0BA^@zmo=H?x+2Ayxq#eTUWrs*$cEnFXw*!3rts zJPE=6)WvGyqacuZNuM>IvS=MeZdj;t>i&%Tbfym7S_q<$2i1B4swbW1?iGW0y#j|- z3i-W`vYG1^;N5$h%!8VF0NulLnG&&AKjx#xAV9?p)SpM(IICb!>%Qn|ag(*XR;fD} zM`N~dyW#+`#0Q!ntIG%koBRSI6(AGslGRWoz355Ig!^f}OMZ?kIC_H!%ToDzF{7R& z1{4nQYB%$3g9NjLWU$Faf8I$NB^7qX%VmZ(rYTIvm{irqrMv5HK*EejMOi}i$3uoK zD;7z-BeuZ7lP%x0Q^==y_e6!@uS2kK*k^jwiZC#;moD(@2Z@)sQ+J7T<*z-K=32ga z!IQvJ!%ZebtbP;qN%V`>1gVy|cXBYDLnwOX4^d(PrOJZht4qET=a0nJLVpt;=cd&Y zmp;J^H17Zcze$1|P5P`i6wntG2g|xYlg!r+gy0LyH(>@?Kir#j8GP)`+tNsuAgs%b zEj%S`nLmo>(lDo?@G-AfU#f>J8r1YYPf6#bfUJk(>RW*OM(<`8yIcT`_iC~DBQjLF z!g;O2F&hl3^hM0wNZ$kaCkP0DN$a#FlWk=f!v9Vw_FX=eq<9D<0 z7bFm`%JXIpWcbblfcDJI^OX-cTV}mzGOjkxw!7iSZ8j z!G9zGwtJIz2tB7+gV17Zef!LyyA>JYu!|9-;Yq29{QJ}GTxueZQZaSr<0^g~-;^pU zo4CFeIM`4IfK?=mxPuM)6u;lp6oEd2{lZy0$W+?YfaQz0oaNy6$$ghVuXBhW=NBOF zIGT3NnK5ZO9Cc%g@BbXQ2gyfa=RBu>p7LYrEY$GX`c}h(1TaM8nCoDp{1+9qM8UDG z^vRpR&{1z8PWjk?yg{Vr2NzjQ9?Gsqq?qvFQkAIQ9$_QH+n?wsDdRzal~CAU%GDP| z{1N$N-TcIuhiRw>ps+N}5>GiAaiCUo2%6(-b3VB}fmaT6shbFei!Y}OqBC|N3oE}A zyU3a@U-_faC$OLqeYJmK z!q;=+AS~C7jlpydIbW2xW=W`wLNgm|S;oow4Age)`%f*8>Az#*;_r`vGWt5>-fB<~ z1ri{C;tu5lvOM@AmtJ?d=FK$?4*wxQHW@zvK|!%qrOk>GTEpo^Fb zP4KCf2WtdvWbe2zO3cCQ3m*daNdKt4hl%BUk+JxZ@ij|IiU>8NhZ98$*l3VkS*g*U z*ucAPqhD=(H9kp_Kgdbp(G3UBer1o0>g5H@N$e(5mU<-}i}Vlck%Ibzae+QBzMp6P zY#4`w=bllZ#el(2R(f}P+2qVP4wQA&(|0U}EYd*|jCBzk>hw>ym z6;JhlC`w|r58F5WrAD}Q`0twMn2#CMABY3gt9HTnJpEK&OD4n-L5_L@K6PuFD_=U_ zn;x)=k-+-i$hg@x4L1d9q6-2DSnmRyKP8eZWAKKvP!7tGTamrIsP*E(zF)A1T(y}d zZZ;MqKP28?%A5qhXB3C#_Tt~w-)#%lf`bKg00B~;-jEkdtDJOl?2ikvD#&22i9lfu z6GcR)#Pbx@BeQcMubUYTRt*pLr;BqpcbtA6PPpb>Jngq3=u0i337#;YIco@W|2N16 z&;^7lBnqekf*!{!gFm-fNT@dtvg>oq|Mf?0KRjDN_Trop{N3M=NQ7B}Z)eSST#a`8 z)bwDXqA6323XLjy00jV`DL9o0Xg-x+ zU+7U5@TI(JlT#T)c=HmE0EAWbiNnD-J5;I$Gn`)5dE#KVuCT?qN}UQ#ylnU_cR|2qPHzCdQdl3S`7lSEbP-7Q@y@V-|_fI&M;XtGb6ms@d=(<*idi z8H^YUi2A}9=d~sG{(|Rz;tlKL6MtVQUh8MmLm!kGmD>z?*=qbvD*p8*DQZ42H5sJz z8pMHC1}wOz{;sCJ8oa3nV~Vw#SrvZK+=p@JmcB90plW@@EGBc>7AIWixnAd?yA6!J zYt)WiRN@5}Swy0Z z2{+Rfj&mtgipiu+FY=aXeAisN&S4lDYOp9kYF%`Rs=Wj*(Br{Qnr zXtSO=NKaqiJM>2;?>94{Ap|?2dJ*`|ePM$m%A23mZ1GJq4J8Fc$~7%?%aBIMbqI{F z%nOXndKT*D$k-1guKG!2YQ!EHvR|sRnt?=yicb>k4>OE~_{kyBU^$ zk4GNdm}c#y>`qmYm6riBi2NKipk}E6Zux7JO-y50nPacT8zI54eQC&t_AmkqVO1TbWF%%*;%O0mZVH><-*9;;+V| zY5{VV`CGYe5R{F-x;pyd=W??8>j@6p+7sG4aol-+F0sTL8krlGBEWM@!K6i1!zKz&~u!dnY}@xz(jho%|2BEWVYdf&4!rP+?P z8}a317Xn{xC)bK5Sls)PldvTEsOc)ZZRS}b+9zFFhqTl`4IiYNP|Nc-WbSvt3Lr@4 z+lRHXt|1`%BZNoYRqnaW$lGqce+w=r{T_LrF9#lao(?#|Zv#tV(&@H-N536a&tu6t zq5(a-Kgh~%Cw9g-dMd7$eST{TwA#ekpL)VUPO`MO<{p1OKh0q$9O9xyW~>JIVfNB{ z&1G=HB3^((uaEKPu+9`$qoPM%r(*%XcRZKnCb0gV^sHAvs30MA5Be)ncVMafO9@rr z%G3BBsA$b1I~bD$K{i~A8HITrc=}H5q&PMoB>rdIMMtS2#TH2TBM(X)k@`uilqZo% z{T(wNOE4!;F8nxQ59{m{^HtQP_Pg1eGyFIHHA~*)tl`vjJXiFu@uF6><>diA{+hHB zT;Gy>fYd)c_*35Is6+q73j`b&AcD!7nzvc{zlKjdjZ?jgkVA5Y-BN|z86jYRR^o&27y4oIhQVg^H;J2Z4p8ugq7PlZ3TfSp zxzv3uzy{PRG{59Sa`eN8BXV+T#*a086K3z=fS((*OUH>C;w$gmTI5q{ab6xl zY`V`MGnVv%w-9$Y+Fuah%EMT~$yEWrT+HtO%6D=*-kIU3w~N?*SWa*59f?jz8a zOU%-VtFONii1VoX@WD;EUxUN-doDkvZCu5;T-;?1E8x665QKuDIk#zdUM7V522EME zOK7(}4zKqT7aQO8>-|V++a;kJ07j)N@_gLA`hiopUQCRssGtBe0yEk=XjeWI0d`90K@5gC37hH^)qmrTGSbcyaYb>PpA$C`ZZu2+ z?1!xzXy1+-4Ae)J<70{T-!~AJ#0V{Q`X~6?-Lb|nR_HmIui*B|K5L?7BnkJZ0rM2o z^!njf9*>OHg=W9PS)c8jl&IJ?sI99Q-@|7PWYwJrWSP+Q;R0Aa_{u%hISzf|Fxg%B z<(>yP^!x}mr4kq#Xlr|Sg8b}Wz1V{SwCVwyeY!`!2W6ny)wW_G>UV zL=S=Uo~mK0N;1xT>hF1X7I@zC!3eM`77%&~poQqIQ3bi_PEU9G(fLLn#6kp4c&A4N%VZZ#S?{&*`B(H-CPQUrLP zKxnFt%uEOp3$EY+o{9%eNuyxT^lRnZmJA0A4(C**Fed8SZwOW0sVY~^Zf{}US0F#isygS*kEaaclf*d)iF_9? zDrr#WE$?2p*)Kwd4mW&K#$1kVM{%gSmzqBut7sSbh38XP*1>n@{LLeV?$ps|<)S z?G3x7Q(0$Pb7%9nfs&PjLGu;rcTYL&_xC&-1xm<@LV%)yhN=C?EztOhl(KokW^vBmztB zBv|K`L&@!(c2(n&ThNwIzH|^EL(&fXSv-1gBlT@TQ@3+^;P0dd#c0=bi_=)oZ_3S- z77m+ZP>(ar2Pdf%tG!s1k8ZoosEX0;`DoEW0%|Zle#u_S(^QKuNPP>{28D7i#j6~= ztyX%f$C7sDBPn=5w;9N}gRUE0dMJYU2gur-h1+Go_yla!aHPfHm9O-1D2gwbXGXS{ zA0I|{=e1~eFeP^d6~T#b3f5;$qHMt9h9z^@uD_naU80nud)41K6$^o2)^D6j|+R&{H7|N={Fy90vw*JXJFv- zaRGwHY6MgyU+z3azBtOU9FBP;oh?VZXdMv$i(;I%WAP^Y`sQSe`;kMZOeZ%dg%pFI z?Qp4}x#5~}u@88M=TE5;{gwQo7*E4D^jHx|aKMFH8VlkYAyn^`v}fx7j*Bev(*P?m zT4&~UetNq99+64*qYK7M5tr{jOq43+o{e7|THY>76Exa#oL-ld-KkyM%XZoHMPAra zI}c1ZC56P8zIfyEQaO`FyoHRyWMm{M7q_bSTw8#D)qA zQvq|a^-m5rXFqsACv+Nb!){BmPP@?e;sYwms44sKMHAS20cct=nA~ubWeZCu&DkT$!9)aey^cm zSj4n^84s0NOd;9%AkSSvR&i^!7^k2n#}Ywd>o=Ip#M0@vJL!?LN~ZQt>U?|Qn%JK; zcAv`RnN3}%W?^2edGSNz$OiX-ijxz#YMFk<#LAg7EJusptp67o9h=}J&$|YORs9lt zJ|T`thn+!k(ACl>vhug&2T{1_kYchvf{3B}ud~nI&v(zR6z2%^{)~g2u67|VMBlb{ z{9a5HrR%CImT;z?Rp@R1Xs1c22tC`IDcg05GzoL?RxdIt1JY7-Hu*&BWlJmSD|~-P zEVHu%ql%0t7k^6Ug9;NHS?E1Xxowx*_x(4Z9z*byUqT`%c4m*kr~dMqw{d0sMWU4} zUsKjC@Sa1p9jJffI62~T{&ykIbS0czZ8I(r%SH($NFZDlp+^rDmzLq^!UGejA-R5< z{as`!>y5jkJ~u7s9i_BV_up+%WA7zeh(GU-3m%QWFfz)dVPL2=nwMirufK%=|E3o6 zvI$Cn3`LLES(SLQ1q3Icu@9hh2K^JiQlp@787HebrW5g>tslnRQXTa5_1|o7Z+o8L zotl`Ku!L@;sjclEO7th6Ld$y9m62tj0%FTuiuia^+f$yH3=nrLWda?s#^?XIkSo)l z_Tuj^|KgcFbDM7hzIyd4WRo~7_p~VV_H6Fjz7tV%CE~9r4TS-ey`qUNn>O;G%H*o= z^l0uqCJ6qx{c}I}BF1((X;b`&?saAGPD$LAv60c=G(L>eSdk1I`y@BON%g{4gGJ~n zK^`pq2%T0!g%7=XYJlpu8KOu`iyq6H6Fl617sNW^y%w{U5n?}>d=L|$m#wdBqtqN{ zwL>|q8BD+QygcP$Jc@vRJ{qafM;-;mS0Y#YLw53He%m{UHZjoh$n0NqG}zzDYT2YZ z#&iwUj*Nc8UU^xFD+h%Y3?o$tp7GMz`8iNTLm@eD>?BUCSfrBG%A_1S-iC&jCbP)N zes_CDt4?`IqxHSRciVAdhS}nT3atev2z5ZQft3i~(}_zk`rmXP{1rDTiWDGLgb^a- z!m+5@+DCq!MJjCb?X%O#n$-te{6y4W=LM`e*7)z)gA^_w_ z{~kVc>Q+g;+erUz$E&cE2WPDg#_6WU-Z0$UHlqDkEINEPd;hB)#NS@|O*hddMaU-N zV8W!!!d@C2K)JvWOes(o+;v38jUzmgIA*0*a*LVxsQg^^(m`7CJsTI7ss@gX=0qS@ zL0+q)JWI4j;S+w8Z_*X`reB#|A%unk6I}S&TnbG?9N?;2y>_nsOgM@Oo^)>6)IrLK zIml0yzSqpp3Kw5I-F9}x&%w8|8FXs)9)IHp#N123NqEW6ZWmnlQNCOLJ*2QAB8 + + + + \ No newline at end of file From 7f71f46367b24e862efe1248173a88baa7366402 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Sat, 27 Feb 2016 13:12:12 -0500 Subject: [PATCH 24/57] Remove useless widget preview --- app/src/main/res/layout/small_widget_preview.xml | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 app/src/main/res/layout/small_widget_preview.xml diff --git a/app/src/main/res/layout/small_widget_preview.xml b/app/src/main/res/layout/small_widget_preview.xml deleted file mode 100644 index 505bc619b..000000000 --- a/app/src/main/res/layout/small_widget_preview.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - \ No newline at end of file From 7234e072e6d25371bb2b065bfe4708a30151e418 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Sat, 27 Feb 2016 13:24:01 -0500 Subject: [PATCH 25/57] Implement widget with fixed data --- .../isoron/uhabits/views/SmallWidgetView.java | 92 ++++++++++++++++++- app/src/main/res/layout/small_widget.xml | 6 +- 2 files changed, 94 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/isoron/uhabits/views/SmallWidgetView.java b/app/src/main/java/org/isoron/uhabits/views/SmallWidgetView.java index 33c0105d4..b4edb6a65 100644 --- a/app/src/main/java/org/isoron/uhabits/views/SmallWidgetView.java +++ b/app/src/main/java/org/isoron/uhabits/views/SmallWidgetView.java @@ -21,15 +21,36 @@ package org.isoron.uhabits.views; import android.content.Context; import android.graphics.Canvas; +import android.graphics.Color; import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.Typeface; import android.util.AttributeSet; +import android.util.Log; import android.view.View; import org.isoron.helpers.ColorHelper; +import org.isoron.uhabits.R; public class SmallWidgetView extends View { private Paint pCircle; + private Paint pText; + + private int primaryColor; + private int grey; + private int size; + + private String fa_check; + private String fa_times; + private String fa_full_star; + private String fa_half_star; + private String fa_empty_star; + + private int check_status; + private int star_status; + + private Rect textBounds; public SmallWidgetView(Context context) { @@ -45,22 +66,87 @@ public class SmallWidgetView extends View private void init(Context context) { + Typeface fontawesome = + Typeface.createFromAsset(context.getAssets(), "fontawesome-webfont.ttf"); + pCircle = new Paint(); - pCircle.setColor(ColorHelper.palette[7]); + pCircle.setAntiAlias(true); + + pText = new Paint(); + pText.setAntiAlias(true); + pText.setTypeface(fontawesome); + pText.setTextAlign(Paint.Align.CENTER); + + fa_check = context.getString(R.string.fa_check); + fa_times = context.getString(R.string.fa_times); + fa_empty_star = context.getString(R.string.fa_star_o); + fa_half_star = context.getString(R.string.fa_star_half_o); + fa_full_star = context.getString(R.string.fa_star); + + primaryColor = ColorHelper.palette[10]; + grey = Color.rgb(150, 150, 150); + + textBounds = new Rect(); + + check_status = 2; + star_status = 2; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); - canvas.drawOval(0, 0, getMeasuredWidth(), getMeasuredHeight(), pCircle); + int s = size - (int) (size * 0.025); + pCircle.setShadowLayer(size * 0.025f, size * 0.01f, size * 0.01f, 0x60000000); + + drawBigCircle(canvas, s); + drawSmallCircle(canvas, s); + } + + private void drawSmallCircle(Canvas canvas, int s) + { + String text; + int color = (star_status == 2 ? primaryColor : grey); + + if(star_status == 0) + text = fa_empty_star; + else if(star_status == 1) + text = fa_half_star; + else + text = fa_full_star; + + int r2 = (int) (s * 0.20); + pCircle.setColor(Color.WHITE); + canvas.drawCircle(s - r2, s - r2, r2, pCircle); + + pText.setTextSize(s * 0.3f); + pText.setColor(color); + pText.getTextBounds(text, 0, text.length(), textBounds); + canvas.drawText(text, s - r2, s - r2 - textBounds.exactCenterY() - s / 90, pText); + } + + private void drawBigCircle(Canvas canvas, int s) + { + String text = (check_status == 0 ? fa_times : fa_check); + int color = (check_status == 2 ? primaryColor : grey); + + int r1 = (int) (s * 0.45); + pCircle.setColor(color); + canvas.drawCircle(r1, r1, r1, pCircle); + + pText.setTextSize(s * 0.7f); + pText.setColor(Color.WHITE); + pText.getTextBounds(text, 0, text.length(), textBounds); + canvas.drawText(text, r1, r1 - textBounds.exactCenterY(), pText); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); - setMeasuredDimension(widthMeasureSpec, heightMeasureSpec); + size = Math.min(widthMeasureSpec, heightMeasureSpec); + setMeasuredDimension(size, size); + Log.d("SmallWidgetView", "" + size); } @Override diff --git a/app/src/main/res/layout/small_widget.xml b/app/src/main/res/layout/small_widget.xml index 626b909f1..474d4c918 100644 --- a/app/src/main/res/layout/small_widget.xml +++ b/app/src/main/res/layout/small_widget.xml @@ -15,11 +15,15 @@ + android:textSize="12sp" + android:maxLines="1" + android:ellipsize="end" + android:text="Meditate"/> \ No newline at end of file From d748f5d6dee0be1a01617408fef4cb33756cfb24 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Sat, 27 Feb 2016 13:54:24 -0500 Subject: [PATCH 26/57] Assign habits to widgets; refresh on database change --- .../java/org/isoron/uhabits/MainActivity.java | 16 ++++++++++++++++ .../isoron/uhabits/ReminderAlarmReceiver.java | 2 ++ .../isoron/uhabits/SmallWidgetProvider.java | 9 ++++++--- .../java/org/isoron/uhabits/models/Habit.java | 18 ++++++++++++++++++ .../isoron/uhabits/views/SmallWidgetView.java | 13 ++++++++++--- app/src/main/res/layout/small_widget.xml | 1 + app/src/main/res/xml/small_widget_info.xml | 2 +- 7 files changed, 54 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/isoron/uhabits/MainActivity.java b/app/src/main/java/org/isoron/uhabits/MainActivity.java index 4b7656154..2f135f3b6 100644 --- a/app/src/main/java/org/isoron/uhabits/MainActivity.java +++ b/app/src/main/java/org/isoron/uhabits/MainActivity.java @@ -16,6 +16,9 @@ package org.isoron.uhabits; +import android.appwidget.AppWidgetManager; +import android.content.ComponentName; +import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.net.Uri; @@ -108,5 +111,18 @@ public class MainActivity extends ReplayableActivity public void onPostExecuteCommand(Long refreshKey) { listHabitsFragment.onPostExecuteCommand(refreshKey); + updateWidgets(this); + } + + public static void updateWidgets(Context context) + { + ComponentName provider = new ComponentName(context, SmallWidgetProvider.class); + + Intent intent = new Intent(context, SmallWidgetProvider.class); + 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/ReminderAlarmReceiver.java b/app/src/main/java/org/isoron/uhabits/ReminderAlarmReceiver.java index 556b586ac..8dac22b31 100644 --- a/app/src/main/java/org/isoron/uhabits/ReminderAlarmReceiver.java +++ b/app/src/main/java/org/isoron/uhabits/ReminderAlarmReceiver.java @@ -103,6 +103,8 @@ public class ReminderAlarmReceiver extends BroadcastReceiver habit.toggleRepetition(timestamp); habit.save(); dismissNotification(context, habit); + + MainActivity.updateWidgets(context); } private void dismissAllHabits() diff --git a/app/src/main/java/org/isoron/uhabits/SmallWidgetProvider.java b/app/src/main/java/org/isoron/uhabits/SmallWidgetProvider.java index 0ba2d196a..3a2466b8e 100644 --- a/app/src/main/java/org/isoron/uhabits/SmallWidgetProvider.java +++ b/app/src/main/java/org/isoron/uhabits/SmallWidgetProvider.java @@ -20,9 +20,9 @@ import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProvider; import android.content.Context; import android.graphics.Bitmap; -import android.util.Log; import android.widget.RemoteViews; +import org.isoron.uhabits.models.Habit; import org.isoron.uhabits.views.SmallWidgetView; import java.io.FileNotFoundException; @@ -41,11 +41,14 @@ public class SmallWidgetProvider extends AppWidgetProvider { RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.small_widget); + Habit habit = Habit.get((long) widgetId); + SmallWidgetView widgetView = new SmallWidgetView(context); widgetView.setDrawingCacheEnabled(true); widgetView.measure(200, 200); widgetView.layout(0, 0, 200, 200); widgetView.buildDrawingCache(true); + widgetView.setHabit(habit); Bitmap drawingCache = widgetView.getDrawingCache(); @@ -58,8 +61,8 @@ public class SmallWidgetProvider extends AppWidgetProvider { e.printStackTrace(); } - - Log.d("SmallWidgetProvider", drawingCache.toString()); +; + remoteViews.setTextViewText(R.id.tvName, habit.name); remoteViews.setImageViewBitmap(R.id.imageView, drawingCache); manager.updateAppWidget(widgetId, remoteViews); } diff --git a/app/src/main/java/org/isoron/uhabits/models/Habit.java b/app/src/main/java/org/isoron/uhabits/models/Habit.java index 1d835612e..9683b8b30 100644 --- a/app/src/main/java/org/isoron/uhabits/models/Habit.java +++ b/app/src/main/java/org/isoron/uhabits/models/Habit.java @@ -381,6 +381,24 @@ public class Habit extends Model .executeSingle(); } + public int getCurrentCheckmarkStatus() + { + updateCheckmarks(); + Checkmark c = getNewestCheckmark(); + + if(c != null) return c.value; + else return 0; + } + + public int getCurrentStarStatus() + { + int score = getScore(); + + if(score >= FULL_STAR_CUTOFF) return 2; + else if(score >= HALF_STAR_CUTOFF) return 1; + else return 0; + } + public int getRepsCount(int days) { long timeTo = DateHelper.getStartOfToday(); diff --git a/app/src/main/java/org/isoron/uhabits/views/SmallWidgetView.java b/app/src/main/java/org/isoron/uhabits/views/SmallWidgetView.java index b4edb6a65..c5640764d 100644 --- a/app/src/main/java/org/isoron/uhabits/views/SmallWidgetView.java +++ b/app/src/main/java/org/isoron/uhabits/views/SmallWidgetView.java @@ -31,6 +31,7 @@ import android.view.View; import org.isoron.helpers.ColorHelper; import org.isoron.uhabits.R; +import org.isoron.uhabits.models.Habit; public class SmallWidgetView extends View { @@ -84,12 +85,18 @@ public class SmallWidgetView extends View fa_full_star = context.getString(R.string.fa_star); primaryColor = ColorHelper.palette[10]; - grey = Color.rgb(150, 150, 150); + grey = Color.rgb(175, 175, 175); textBounds = new Rect(); + check_status = 0; + star_status = 0; + } - check_status = 2; - star_status = 2; + public void setHabit(Habit habit) + { + this.check_status = habit.getCurrentCheckmarkStatus(); + this.star_status = habit.getCurrentStarStatus(); + this.primaryColor = habit.color; } @Override diff --git a/app/src/main/res/layout/small_widget.xml b/app/src/main/res/layout/small_widget.xml index 474d4c918..c13e7e1a5 100644 --- a/app/src/main/res/layout/small_widget.xml +++ b/app/src/main/res/layout/small_widget.xml @@ -13,6 +13,7 @@ /> From 7f1553a4a1a19ba2543624da8954d5d1aae8c96f Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Sat, 27 Feb 2016 14:09:02 -0500 Subject: [PATCH 27/57] Toggle checkmarks from widget --- app/src/main/AndroidManifest.xml | 2 +- ...eiver.java => HabitBroadcastReceiver.java} | 53 ++++++++++++------- .../isoron/uhabits/SmallWidgetProvider.java | 3 ++ .../uhabits/helpers/ReminderHelper.java | 8 +-- .../java/org/isoron/uhabits/models/Habit.java | 6 +++ 5 files changed, 47 insertions(+), 25 deletions(-) rename app/src/main/java/org/isoron/uhabits/{ReminderAlarmReceiver.java => HabitBroadcastReceiver.java} (83%) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f1c20a8d3..e1191f8f5 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -39,7 +39,7 @@ + android:name=".HabitBroadcastReceiver" /> Date: Sat, 27 Feb 2016 16:31:48 -0500 Subject: [PATCH 28/57] Remove debug code --- .../org/isoron/uhabits/SmallWidgetProvider.java | 15 +-------------- .../org/isoron/uhabits/views/SmallWidgetView.java | 2 -- 2 files changed, 1 insertion(+), 16 deletions(-) diff --git a/app/src/main/java/org/isoron/uhabits/SmallWidgetProvider.java b/app/src/main/java/org/isoron/uhabits/SmallWidgetProvider.java index 0569bebfb..2c46b05b6 100644 --- a/app/src/main/java/org/isoron/uhabits/SmallWidgetProvider.java +++ b/app/src/main/java/org/isoron/uhabits/SmallWidgetProvider.java @@ -25,9 +25,6 @@ import android.widget.RemoteViews; import org.isoron.uhabits.models.Habit; import org.isoron.uhabits.views.SmallWidgetView; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; - public class SmallWidgetProvider extends AppWidgetProvider { @Override @@ -41,7 +38,7 @@ public class SmallWidgetProvider extends AppWidgetProvider { RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.small_widget); - Habit habit = Habit.get((long) widgetId); + Habit habit = Habit.get(1L); SmallWidgetView widgetView = new SmallWidgetView(context); widgetView.setDrawingCacheEnabled(true); @@ -52,16 +49,6 @@ public class SmallWidgetProvider extends AppWidgetProvider Bitmap drawingCache = widgetView.getDrawingCache(); - try - { - drawingCache.compress(Bitmap.CompressFormat.PNG, 100, - new FileOutputStream(context.getFilesDir() + "/widget.png")); - } - catch (FileNotFoundException e) - { - e.printStackTrace(); - } -; remoteViews.setTextViewText(R.id.tvName, habit.name); remoteViews.setImageViewBitmap(R.id.imageView, drawingCache); remoteViews.setOnClickPendingIntent(R.id.imageView, diff --git a/app/src/main/java/org/isoron/uhabits/views/SmallWidgetView.java b/app/src/main/java/org/isoron/uhabits/views/SmallWidgetView.java index c5640764d..c08ab026f 100644 --- a/app/src/main/java/org/isoron/uhabits/views/SmallWidgetView.java +++ b/app/src/main/java/org/isoron/uhabits/views/SmallWidgetView.java @@ -26,7 +26,6 @@ import android.graphics.Paint; import android.graphics.Rect; import android.graphics.Typeface; import android.util.AttributeSet; -import android.util.Log; import android.view.View; import org.isoron.helpers.ColorHelper; @@ -153,7 +152,6 @@ public class SmallWidgetView extends View super.onMeasure(widthMeasureSpec, heightMeasureSpec); size = Math.min(widthMeasureSpec, heightMeasureSpec); setMeasuredDimension(size, size); - Log.d("SmallWidgetView", "" + size); } @Override From 3a770e71e376fd4e844cfce9ae6f7aa7d57c29fa Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Sat, 27 Feb 2016 18:06:57 -0500 Subject: [PATCH 29/57] Add configuration activity for widgets --- app/src/main/AndroidManifest.xml | 31 +++++-- .../isoron/uhabits/HabitWidgetConfigure.java | 91 +++++++++++++++++++ .../isoron/uhabits/SmallWidgetProvider.java | 24 ++++- app/src/main/res/layout/small_widget.xml | 2 +- .../res/layout/widget_configure_activity.xml | 8 ++ app/src/main/res/xml/small_widget_info.xml | 3 +- 6 files changed, 146 insertions(+), 13 deletions(-) create mode 100644 app/src/main/java/org/isoron/uhabits/HabitWidgetConfigure.java create mode 100644 app/src/main/res/layout/widget_configure_activity.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e1191f8f5..00d4a5506 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,11 +10,11 @@ + android:theme="@style/AppBaseTheme"> + android:value="AEdPqrEAAAAI6aeWncbnMNo8E5GWeZ44dlc5cQ7tCROwFhOtiw"/> + android:name=".HabitBroadcastReceiver"/> - + - + + android:resource="@xml/small_widget_info"/> + + + + + + + + diff --git a/app/src/main/java/org/isoron/uhabits/HabitWidgetConfigure.java b/app/src/main/java/org/isoron/uhabits/HabitWidgetConfigure.java new file mode 100644 index 000000000..8aa15caed --- /dev/null +++ b/app/src/main/java/org/isoron/uhabits/HabitWidgetConfigure.java @@ -0,0 +1,91 @@ +/* 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; + +import android.app.Activity; +import android.appwidget.AppWidgetManager; +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.preference.PreferenceManager; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.ListView; + +import org.isoron.helpers.DialogHelper; +import org.isoron.uhabits.models.Habit; + +import java.util.ArrayList; +import java.util.List; + +public class HabitWidgetConfigure 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) + { + super.onCreate(savedInstanceState); + setContentView(R.layout.widget_configure_activity); + + Intent intent = getIntent(); + Bundle extras = intent.getExtras(); + + if (extras != null) widgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, + AppWidgetManager.INVALID_APPWIDGET_ID); + + listView = (ListView) findViewById(R.id.listView); + + habitIds = new ArrayList<>(); + habitNames = new ArrayList<>(); + + List habits = Habit.getAll(false); + for(Habit h : habits) + { + habitIds.add(h.getId()); + habitNames.add(h.name); + } + + adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, habitNames); + listView.setAdapter(adapter); + listView.setOnItemClickListener(this); + } + + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) + { + Long habitId = habitIds.get(position); + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences( + getApplicationContext()); + prefs.edit().putLong(SmallWidgetProvider.getWidgetPrefKey(widgetId), habitId).commit(); + + MainActivity.updateWidgets(this); + + Intent resultValue = new Intent(); + resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId); + setResult(RESULT_OK, resultValue); + finish(); + } + +} diff --git a/app/src/main/java/org/isoron/uhabits/SmallWidgetProvider.java b/app/src/main/java/org/isoron/uhabits/SmallWidgetProvider.java index 2c46b05b6..3f3b965f1 100644 --- a/app/src/main/java/org/isoron/uhabits/SmallWidgetProvider.java +++ b/app/src/main/java/org/isoron/uhabits/SmallWidgetProvider.java @@ -19,7 +19,9 @@ package org.isoron.uhabits; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProvider; import android.content.Context; +import android.content.SharedPreferences; import android.graphics.Bitmap; +import android.preference.PreferenceManager; import android.widget.RemoteViews; import org.isoron.uhabits.models.Habit; @@ -27,6 +29,7 @@ import org.isoron.uhabits.views.SmallWidgetView; public class SmallWidgetProvider extends AppWidgetProvider { + @Override public void onUpdate(Context context, AppWidgetManager manager, int[] appWidgetIds) { @@ -37,8 +40,13 @@ public class SmallWidgetProvider extends AppWidgetProvider private void updateWidget(Context context, AppWidgetManager manager, int widgetId) { RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.small_widget); + Context appContext = context.getApplicationContext(); + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(appContext); + + Long habitId = prefs.getLong(getWidgetPrefKey(widgetId), -1L); + if(habitId < 0) return; - Habit habit = Habit.get(1L); + Habit habit = Habit.get(habitId); SmallWidgetView widgetView = new SmallWidgetView(context); widgetView.setDrawingCacheEnabled(true); @@ -56,4 +64,18 @@ public class SmallWidgetProvider extends AppWidgetProvider manager.updateAppWidget(widgetId, remoteViews); } + public static String getWidgetPrefKey(long widgetId) + { + return String.format("widget-%03d", 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(getWidgetPrefKey(id)); + } } diff --git a/app/src/main/res/layout/small_widget.xml b/app/src/main/res/layout/small_widget.xml index c13e7e1a5..55fbb5c94 100644 --- a/app/src/main/res/layout/small_widget.xml +++ b/app/src/main/res/layout/small_widget.xml @@ -25,6 +25,6 @@ android:textSize="12sp" android:maxLines="1" android:ellipsize="end" - android:text="Meditate"/> + android:text="@string/main_activity_title"/> \ No newline at end of file diff --git a/app/src/main/res/layout/widget_configure_activity.xml b/app/src/main/res/layout/widget_configure_activity.xml new file mode 100644 index 000000000..8c653b697 --- /dev/null +++ b/app/src/main/res/layout/widget_configure_activity.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/small_widget_info.xml b/app/src/main/res/xml/small_widget_info.xml index a908abd06..4ffc0e993 100644 --- a/app/src/main/res/xml/small_widget_info.xml +++ b/app/src/main/res/xml/small_widget_info.xml @@ -5,7 +5,8 @@ android:initialLayout="@layout/small_widget" android:previewImage="@mipmap/ic_small_widget_preview" android:resizeMode="none" - android:updatePeriodMillis="60000" + android:updatePeriodMillis="3600000" + android:configure="org.isoron.uhabits.HabitWidgetConfigure" android:widgetCategory="home_screen"> From 031d684b3ec4f015065dc4b9b2b20cdd39bc416d Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Sat, 27 Feb 2016 18:26:25 -0500 Subject: [PATCH 30/57] Update main activity on notification/widget click --- .../uhabits/HabitBroadcastReceiver.java | 5 ++++ .../java/org/isoron/uhabits/MainActivity.java | 29 ++++++++++++++++++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/isoron/uhabits/HabitBroadcastReceiver.java b/app/src/main/java/org/isoron/uhabits/HabitBroadcastReceiver.java index bb08eadeb..846760e87 100644 --- a/app/src/main/java/org/isoron/uhabits/HabitBroadcastReceiver.java +++ b/app/src/main/java/org/isoron/uhabits/HabitBroadcastReceiver.java @@ -31,6 +31,7 @@ import android.net.Uri; import android.os.Handler; import android.preference.PreferenceManager; import android.support.v4.app.NotificationCompat; +import android.support.v4.content.LocalBroadcastManager; import org.isoron.helpers.DateHelper; import org.isoron.uhabits.helpers.ReminderHelper; @@ -103,6 +104,10 @@ public class HabitBroadcastReceiver extends BroadcastReceiver habit.save(); dismissNotification(context, habit); + LocalBroadcastManager manager = LocalBroadcastManager.getInstance(context); + Intent refreshIntent = new Intent(MainActivity.ACTION_REFRESH); + manager.sendBroadcast(refreshIntent); + MainActivity.updateWidgets(context); } diff --git a/app/src/main/java/org/isoron/uhabits/MainActivity.java b/app/src/main/java/org/isoron/uhabits/MainActivity.java index 2f135f3b6..b2a960d3c 100644 --- a/app/src/main/java/org/isoron/uhabits/MainActivity.java +++ b/app/src/main/java/org/isoron/uhabits/MainActivity.java @@ -17,13 +17,16 @@ package org.isoron.uhabits; import android.appwidget.AppWidgetManager; +import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.content.SharedPreferences; import android.net.Uri; import android.os.Bundle; import android.preference.PreferenceManager; +import android.support.v4.content.LocalBroadcastManager; import android.view.Menu; import android.view.MenuItem; @@ -38,7 +41,11 @@ public class MainActivity extends ReplayableActivity implements ListHabitsFragment.OnHabitClickListener { private ListHabitsFragment listHabitsFragment; - SharedPreferences prefs; + private SharedPreferences prefs; + private BroadcastReceiver receiver; + private LocalBroadcastManager localBroadcastManager; + + public static final String ACTION_REFRESH = "org.isoron.uhabits.ACTION_REFRESH"; @Override protected void onCreate(Bundle savedInstanceState) @@ -50,6 +57,10 @@ public class MainActivity extends ReplayableActivity listHabitsFragment = (ListHabitsFragment) getFragmentManager().findFragmentById(R.id.fragment1); + receiver = new Receiver(); + localBroadcastManager = LocalBroadcastManager.getInstance(this); + localBroadcastManager.registerReceiver(receiver, new IntentFilter(ACTION_REFRESH)); + onStartup(); } @@ -125,4 +136,20 @@ public class MainActivity extends ReplayableActivity intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids); context.sendBroadcast(intent); } + + @Override + protected void onDestroy() + { + localBroadcastManager.unregisterReceiver(receiver); + super.onDestroy(); + } + + class Receiver extends BroadcastReceiver + { + @Override + public void onReceive(Context context, Intent intent) + { + listHabitsFragment.onPostExecuteCommand(null); + } + } } From c1a846d42b8a4820f4b6ab5d4e390d92a8ea5828 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Sat, 27 Feb 2016 19:42:05 -0500 Subject: [PATCH 31/57] Minor style changes --- app/src/main/res/layout/small_widget.xml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/layout/small_widget.xml b/app/src/main/res/layout/small_widget.xml index 55fbb5c94..7e2271138 100644 --- a/app/src/main/res/layout/small_widget.xml +++ b/app/src/main/res/layout/small_widget.xml @@ -1,15 +1,16 @@ Date: Sun, 28 Feb 2016 11:37:50 -0500 Subject: [PATCH 32/57] Alternative design for widgets --- .../isoron/uhabits/SmallWidgetProvider.java | 4 +- .../isoron/uhabits/views/SmallWidgetView.java | 145 ++++++++++++------ app/src/main/res/layout/small_widget.xml | 26 +--- 3 files changed, 104 insertions(+), 71 deletions(-) diff --git a/app/src/main/java/org/isoron/uhabits/SmallWidgetProvider.java b/app/src/main/java/org/isoron/uhabits/SmallWidgetProvider.java index 3f3b965f1..ac5ebef41 100644 --- a/app/src/main/java/org/isoron/uhabits/SmallWidgetProvider.java +++ b/app/src/main/java/org/isoron/uhabits/SmallWidgetProvider.java @@ -50,8 +50,8 @@ public class SmallWidgetProvider extends AppWidgetProvider SmallWidgetView widgetView = new SmallWidgetView(context); widgetView.setDrawingCacheEnabled(true); - widgetView.measure(200, 200); - widgetView.layout(0, 0, 200, 200); + widgetView.measure(180, 200); + widgetView.layout(0, 0, 180, 200); widgetView.buildDrawingCache(true); widgetView.setHabit(habit); diff --git a/app/src/main/java/org/isoron/uhabits/views/SmallWidgetView.java b/app/src/main/java/org/isoron/uhabits/views/SmallWidgetView.java index c08ab026f..18817c787 100644 --- a/app/src/main/java/org/isoron/uhabits/views/SmallWidgetView.java +++ b/app/src/main/java/org/isoron/uhabits/views/SmallWidgetView.java @@ -25,6 +25,9 @@ import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.Typeface; +import android.text.Layout; +import android.text.StaticLayout; +import android.text.TextPaint; import android.util.AttributeSet; import android.view.View; @@ -34,12 +37,20 @@ import org.isoron.uhabits.models.Habit; public class SmallWidgetView extends View { - private Paint pCircle; - private Paint pText; + private Paint pCard; + private Paint pIcon; private int primaryColor; - private int grey; - private int size; + private int backgroundColor; + private int timesColor; + private int darkGrey; + + private int width; + private int height; + private int leftMargin; + private int topMargin; + private int padding; + private String label; private String fa_check; private String fa_times; @@ -50,7 +61,9 @@ public class SmallWidgetView extends View private int check_status; private int star_status; - private Rect textBounds; + private Rect rect; + private TextPaint textPaint; + private StaticLayout labelLayout; public SmallWidgetView(Context context) { @@ -69,13 +82,17 @@ public class SmallWidgetView extends View Typeface fontawesome = Typeface.createFromAsset(context.getAssets(), "fontawesome-webfont.ttf"); - pCircle = new Paint(); - pCircle.setAntiAlias(true); + pCard = new Paint(); + pCard.setAntiAlias(true); + + pIcon = new Paint(); + pIcon.setAntiAlias(true); + pIcon.setTypeface(fontawesome); + pIcon.setTextAlign(Paint.Align.CENTER); - pText = new Paint(); - pText.setAntiAlias(true); - pText.setTypeface(fontawesome); - pText.setTextAlign(Paint.Align.CENTER); + textPaint = new TextPaint(); + textPaint.setColor(Color.WHITE); + textPaint.setAntiAlias(true); fa_check = context.getString(R.string.fa_check); fa_times = context.getString(R.string.fa_times); @@ -84,79 +101,109 @@ public class SmallWidgetView extends View fa_full_star = context.getString(R.string.fa_star); primaryColor = ColorHelper.palette[10]; - grey = Color.rgb(175, 175, 175); + backgroundColor = Color.argb(255, 255, 255, 255); + timesColor = Color.argb(128, 255, 255, 255); + darkGrey = Color.argb(64, 0, 0, 0); - textBounds = new Rect(); - check_status = 0; + rect = new Rect(); + check_status = 2; star_status = 0; + label = "Wake up early"; } public void setHabit(Habit habit) { this.check_status = habit.getCurrentCheckmarkStatus(); this.star_status = habit.getCurrentStarStatus(); - this.primaryColor = habit.color; + this.primaryColor = Color.argb(230, Color.red(habit.color), Color.green(habit.color), Color.blue(habit.color)); + this.label = habit.name; + updateLabel(); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); - int s = size - (int) (size * 0.025); - pCircle.setShadowLayer(size * 0.025f, size * 0.01f, size * 0.01f, 0x60000000); - drawBigCircle(canvas, s); - drawSmallCircle(canvas, s); + drawBackground(canvas); + drawCheckmark(canvas); + drawLabel(canvas); } - private void drawSmallCircle(Canvas canvas, int s) + private void drawBackground(Canvas canvas) { - String text; - int color = (star_status == 2 ? primaryColor : grey); + int color = (check_status == 2 ? primaryColor : darkGrey); - if(star_status == 0) - text = fa_empty_star; - else if(star_status == 1) - text = fa_half_star; - else - text = fa_full_star; + pCard.setColor(color); + canvas.drawRoundRect(leftMargin, topMargin, width - leftMargin, height - topMargin, padding, + padding, pCard); + } + + private void drawCheckmark(Canvas canvas) + { + String text = (check_status == 0 ? fa_times : fa_check); + int color = (check_status == 2 ? Color.WHITE : timesColor); + + pIcon.setColor(color); + pIcon.setTextSize(width * 0.5f); + pIcon.getTextBounds(text, 0, 1, rect); - int r2 = (int) (s * 0.20); - pCircle.setColor(Color.WHITE); - canvas.drawCircle(s - r2, s - r2, r2, pCircle); +// canvas.drawLine(0, 0.67f * height, width, 0.67f * height, pIcon); - pText.setTextSize(s * 0.3f); - pText.setColor(color); - pText.getTextBounds(text, 0, text.length(), textBounds); - canvas.drawText(text, s - r2, s - r2 - textBounds.exactCenterY() - s / 90, pText); + int y = (int) ((0.67f * height - rect.bottom - rect.top) / 2); + canvas.drawText(text, width / 2, y, pIcon); } - private void drawBigCircle(Canvas canvas, int s) + private void drawLabel(Canvas canvas) { - String text = (check_status == 0 ? fa_times : fa_check); - int color = (check_status == 2 ? primaryColor : grey); + canvas.save(); + float y; + int nLines = labelLayout.getLineCount(); - int r1 = (int) (s * 0.45); - pCircle.setColor(color); - canvas.drawCircle(r1, r1, r1, pCircle); + if(nLines == 1) + y = height * 0.8f - padding; + else + y = height * 0.7f - padding; - pText.setTextSize(s * 0.7f); - pText.setColor(Color.WHITE); - pText.getTextBounds(text, 0, text.length(), textBounds); - canvas.drawText(text, r1, r1 - textBounds.exactCenterY(), pText); + canvas.translate(leftMargin + padding, y); + + labelLayout.draw(canvas); + canvas.restore(); } @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) + protected void onMeasure(int width, int height) { - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - size = Math.min(widthMeasureSpec, heightMeasureSpec); - setMeasuredDimension(size, size); + super.onMeasure(width, height); + setMeasuredDimension(width, height); + updateSize(width, height); + updateLabel(); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); + updateSize(w, h); + updateLabel(); + } + + private void updateSize(int width, int height) + { + this.width = width; + this.height = height; + + leftMargin = (int) (width * 0.015); + topMargin = (int) (height * 0.015); + padding = 8 * leftMargin; + textPaint.setTextSize(0.15f * width); } + + private void updateLabel() + { + textPaint.setColor(Color.WHITE); + labelLayout = new StaticLayout(label, textPaint, width - 2 * leftMargin - 2 * padding, + Layout.Alignment.ALIGN_CENTER, 1.0f, 0.0f, false); + } + } diff --git a/app/src/main/res/layout/small_widget.xml b/app/src/main/res/layout/small_widget.xml index 7e2271138..90ddbbb4d 100644 --- a/app/src/main/res/layout/small_widget.xml +++ b/app/src/main/res/layout/small_widget.xml @@ -1,31 +1,17 @@ + android:orientation="vertical" + android:padding="4dp"> - - \ No newline at end of file From f0d12e99257370f9f880641d052bb947eb10f107 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Sun, 28 Feb 2016 13:55:39 -0500 Subject: [PATCH 33/57] Widgets for HistoryView, ScoreView, etc --- app/src/main/AndroidManifest.xml | 2 +- .../java/org/isoron/helpers/DialogHelper.java | 9 ++++ .../isoron/uhabits/HabitWidgetConfigure.java | 3 +- ...Provider.java => HabitWidgetProvider.java} | 51 +++++++++++++++---- .../java/org/isoron/uhabits/MainActivity.java | 4 +- .../uhabits/views/HabitHistoryView.java | 49 ++++++++++-------- .../isoron/uhabits/views/HabitScoreView.java | 40 +++++++++------ .../isoron/uhabits/views/HabitStreakView.java | 10 ++-- .../uhabits/views/ScrollableDataView.java | 26 +++++++++- .../main/res/drawable/widget_background.xml | 7 +++ app/src/main/res/layout/show_habit.xml | 6 +-- app/src/main/res/layout/widget_graph.xml | 30 +++++++++++ .../{small_widget.xml => widget_small.xml} | 0 app/src/main/res/xml/small_widget_info.xml | 4 +- 14 files changed, 179 insertions(+), 62 deletions(-) rename app/src/main/java/org/isoron/uhabits/{SmallWidgetProvider.java => HabitWidgetProvider.java} (55%) create mode 100644 app/src/main/res/drawable/widget_background.xml create mode 100644 app/src/main/res/layout/widget_graph.xml rename app/src/main/res/layout/{small_widget.xml => widget_small.xml} (100%) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 00d4a5506..358d18fab 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -64,7 +64,7 @@ android:label="" android:theme="@style/Theme.AppCompat.Light.NoActionBar"/> - + diff --git a/app/src/main/java/org/isoron/helpers/DialogHelper.java b/app/src/main/java/org/isoron/helpers/DialogHelper.java index a8215f846..680ca04f2 100644 --- a/app/src/main/java/org/isoron/helpers/DialogHelper.java +++ b/app/src/main/java/org/isoron/helpers/DialogHelper.java @@ -18,10 +18,12 @@ package org.isoron.helpers; import android.content.Context; import android.content.SharedPreferences; +import android.content.res.Resources; import android.graphics.Typeface; import android.os.Vibrator; import android.preference.PreferenceManager; import android.util.AttributeSet; +import android.util.DisplayMetrics; import android.view.View; import android.view.inputmethod.InputMethodManager; @@ -72,4 +74,11 @@ public abstract class DialogHelper else return attrs.getAttributeValue(ISORON_NAMESPACE, name); } + + public static float dpToPixels(Context context, float dp) + { + Resources resources = context.getResources(); + DisplayMetrics metrics = resources.getDisplayMetrics(); + return dp * (metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT); + } } diff --git a/app/src/main/java/org/isoron/uhabits/HabitWidgetConfigure.java b/app/src/main/java/org/isoron/uhabits/HabitWidgetConfigure.java index 8aa15caed..0a7275bdd 100644 --- a/app/src/main/java/org/isoron/uhabits/HabitWidgetConfigure.java +++ b/app/src/main/java/org/isoron/uhabits/HabitWidgetConfigure.java @@ -27,7 +27,6 @@ import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ListView; -import org.isoron.helpers.DialogHelper; import org.isoron.uhabits.models.Habit; import java.util.ArrayList; @@ -78,7 +77,7 @@ public class HabitWidgetConfigure extends Activity implements AdapterView.OnItem Long habitId = habitIds.get(position); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences( getApplicationContext()); - prefs.edit().putLong(SmallWidgetProvider.getWidgetPrefKey(widgetId), habitId).commit(); + prefs.edit().putLong(HabitWidgetProvider.getWidgetPrefKey(widgetId), habitId).commit(); MainActivity.updateWidgets(this); diff --git a/app/src/main/java/org/isoron/uhabits/SmallWidgetProvider.java b/app/src/main/java/org/isoron/uhabits/HabitWidgetProvider.java similarity index 55% rename from app/src/main/java/org/isoron/uhabits/SmallWidgetProvider.java rename to app/src/main/java/org/isoron/uhabits/HabitWidgetProvider.java index ac5ebef41..d062f3b63 100644 --- a/app/src/main/java/org/isoron/uhabits/SmallWidgetProvider.java +++ b/app/src/main/java/org/isoron/uhabits/HabitWidgetProvider.java @@ -21,25 +21,39 @@ import android.appwidget.AppWidgetProvider; import android.content.Context; import android.content.SharedPreferences; import android.graphics.Bitmap; +import android.os.Bundle; import android.preference.PreferenceManager; +import android.util.Log; import android.widget.RemoteViews; +import org.isoron.helpers.DialogHelper; import org.isoron.uhabits.models.Habit; -import org.isoron.uhabits.views.SmallWidgetView; +import org.isoron.uhabits.views.HabitHistoryView; -public class SmallWidgetProvider extends AppWidgetProvider +public class HabitWidgetProvider extends AppWidgetProvider { @Override public void onUpdate(Context context, AppWidgetManager manager, int[] appWidgetIds) { for(int id : appWidgetIds) - updateWidget(context, manager, id); + { + Bundle options = manager.getAppWidgetOptions(id); + updateWidget(context, manager, id, options); + } } - private void updateWidget(Context context, AppWidgetManager manager, int widgetId) + private void updateWidget(Context context, AppWidgetManager manager, int widgetId, Bundle options) { - RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.small_widget); + 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)); + + 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)); + + RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_graph); Context appContext = context.getApplicationContext(); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(appContext); @@ -48,13 +62,23 @@ public class SmallWidgetProvider extends AppWidgetProvider Habit habit = Habit.get(habitId); - SmallWidgetView widgetView = new SmallWidgetView(context); - widgetView.setDrawingCacheEnabled(true); - widgetView.measure(180, 200); - widgetView.layout(0, 0, 180, 200); - widgetView.buildDrawingCache(true); +// SmallWidgetView widgetView = new SmallWidgetView(context); + HabitHistoryView widgetView = new HabitHistoryView(context, null); +// HabitScoreView widgetView = new HabitScoreView(context, null); +// HabitStreakView widgetView = new HabitStreakView(context, null); widgetView.setHabit(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); @@ -78,4 +102,11 @@ public class SmallWidgetProvider extends AppWidgetProvider 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); + } } diff --git a/app/src/main/java/org/isoron/uhabits/MainActivity.java b/app/src/main/java/org/isoron/uhabits/MainActivity.java index b2a960d3c..a65b7c8d0 100644 --- a/app/src/main/java/org/isoron/uhabits/MainActivity.java +++ b/app/src/main/java/org/isoron/uhabits/MainActivity.java @@ -127,9 +127,9 @@ public class MainActivity extends ReplayableActivity public static void updateWidgets(Context context) { - ComponentName provider = new ComponentName(context, SmallWidgetProvider.class); + ComponentName provider = new ComponentName(context, HabitWidgetProvider.class); - Intent intent = new Intent(context, SmallWidgetProvider.class); + Intent intent = new Intent(context, HabitWidgetProvider.class); intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); int ids[] = AppWidgetManager.getInstance(context).getAppWidgetIds(provider); diff --git a/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java b/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java index 3bcbabe09..e9b0a4f33 100644 --- a/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java +++ b/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java @@ -54,14 +54,12 @@ public class HabitHistoryView extends ScrollableDataView private int todayWeekday; private int colors[]; private Rect baseLocation; - private int baseSize; private int primaryColor; public HabitHistoryView(Context context, AttributeSet attrs) { super(context, attrs); this.primaryColor = ColorHelper.palette[7]; - this.baseSize = (int) context.getResources().getDimension(R.dimen.small_square_size); init(); } @@ -76,9 +74,9 @@ public class HabitHistoryView extends ScrollableDataView private void init() { - setDimensions(this.baseSize); createPaints(); createColors(); + updateDimensions(); wdays = DateHelper.getShortDayNames(); dfMonth = new SimpleDateFormat("MMM", Locale.getDefault()); @@ -108,8 +106,9 @@ public class HabitHistoryView extends ScrollableDataView private void createColors() { - int primaryColorBright = ColorHelper.mixColors(primaryColor, Color.WHITE, 0.5f); - int grey = Color.rgb(230, 230, 230); + int primaryColorBright = Color.argb(127, Color.red(primaryColor), Color.green(primaryColor), + Color.blue(primaryColor)); + int grey = Color.argb(25, 0, 0, 0); colors = new int[3]; colors[0] = grey; @@ -117,19 +116,20 @@ public class HabitHistoryView extends ScrollableDataView colors[2] = primaryColor; } - private void setDimensions(int baseSize) + protected void updateDimensions() { - columnWidth = baseSize; - columnHeight = 8 * baseSize; - squareSpacing = 2; + squareSpacing = columnWidth / 10; + pSquareFg.setTextSize(columnWidth * 0.5f); + pTextHeader.setTextSize(columnWidth * 0.5f); + squareTextOffset = pSquareFg.getFontSpacing() * 0.4f; + headerTextOffset = pTextHeader.getFontSpacing() * 0.3f; } - private void createPaints() + protected void createPaints() { pTextHeader = new Paint(); pTextHeader.setColor(Color.LTGRAY); pTextHeader.setTextAlign(Align.LEFT); - pTextHeader.setTextSize(columnWidth * 0.5f); pTextHeader.setAntiAlias(true); pSquareBg = new Paint(); @@ -138,11 +138,7 @@ public class HabitHistoryView extends ScrollableDataView pSquareFg = new Paint(); pSquareFg.setColor(Color.WHITE); pSquareFg.setAntiAlias(true); - pSquareFg.setTextSize(columnWidth * 0.5f); pSquareFg.setTextAlign(Align.CENTER); - - squareTextOffset = pSquareFg.getFontSpacing() * 0.4f; - headerTextOffset = pTextHeader.getFontSpacing() * 0.3f; } protected void fetchData() @@ -203,7 +199,7 @@ public class HabitHistoryView extends ScrollableDataView for (int column = 0; column < nColumns - 1; column++) { drawColumn(canvas, baseLocation, currentDate, column); - baseLocation.offset(columnWidth, -columnHeight); + baseLocation.offset(columnWidth, - columnHeight); } drawAxis(canvas, baseLocation); @@ -248,6 +244,8 @@ public class HabitHistoryView extends ScrollableDataView } } + private boolean justSkippedColumn = false; + private void drawColumnHeader(Canvas canvas, Rect location, GregorianCalendar date) { String month = dfMonth.format(date.getTime()); @@ -256,21 +254,32 @@ public class HabitHistoryView extends ScrollableDataView if (!month.equals(previousMonth)) { int offset = 0; - if (justPrintedYear) offset += columnWidth; + if (justPrintedYear) + { + offset += columnWidth; + justSkippedColumn = true; + } canvas.drawText(month, location.left + offset, location.bottom - headerTextOffset, pTextHeader); + previousMonth = month; justPrintedYear = false; } else if (!year.equals(previousYear)) { - canvas.drawText(year, location.left, location.bottom - headerTextOffset, pTextHeader); - previousYear = year; - justPrintedYear = true; + if(!justSkippedColumn) + { + canvas.drawText(year, location.left, location.bottom - headerTextOffset, pTextHeader); + previousYear = year; + justPrintedYear = true; + } + + justSkippedColumn = false; } else { + justSkippedColumn = false; justPrintedYear = false; } } 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 579cee894..ddab70d7a 100644 --- a/app/src/main/java/org/isoron/uhabits/views/HabitScoreView.java +++ b/app/src/main/java/org/isoron/uhabits/views/HabitScoreView.java @@ -20,6 +20,8 @@ import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffXfermode; import android.graphics.RectF; import android.util.AttributeSet; @@ -69,8 +71,8 @@ public class HabitScoreView extends ScrollableDataView private void init() { createPaints(); - setDimensions(); createColors(); + updateDimensions(); dfMonth = new SimpleDateFormat("MMM", Locale.getDefault()); dfDay = new SimpleDateFormat("d", Locale.getDefault()); @@ -79,15 +81,6 @@ public class HabitScoreView extends ScrollableDataView prevRect = new RectF(); } - private void setDimensions() - { - this.columnWidth = baseSize; - columnHeight = 8 * baseSize; - headerHeight = baseSize; - footerHeight = baseSize; - em = pText.getFontSpacing(); - } - private void createColors() { colors = new int[4]; @@ -98,23 +91,35 @@ public class HabitScoreView extends ScrollableDataView colors[2] = ColorHelper.mixColors(colors[0], colors[3], 0.33f); } - private void createPaints() + protected void createPaints() { pText = new Paint(); pText.setColor(Color.LTGRAY); pText.setTextAlign(Paint.Align.LEFT); - pText.setTextSize(baseSize * 0.5f); pText.setAntiAlias(true); pGraph = new Paint(); pGraph.setTextAlign(Paint.Align.CENTER); - pGraph.setTextSize(baseSize * 0.5f); pGraph.setAntiAlias(true); - pGraph.setStrokeWidth(baseSize * 0.1f); pGrid = new Paint(); pGrid.setColor(Color.LTGRAY); pGrid.setAntiAlias(true); + + } + + @Override + protected void updateDimensions() + { + this.columnWidth = baseSize; + columnHeight = 8 * baseSize; + headerHeight = baseSize; + footerHeight = baseSize; + em = pText.getFontSpacing(); + + pText.setTextSize(baseSize * 0.5f); + pGraph.setTextSize(baseSize * 0.5f); + pGraph.setStrokeWidth(baseSize * 0.1f); pGrid.setStrokeWidth(baseSize * 0.05f); } @@ -235,15 +240,18 @@ public class HabitScoreView extends ScrollableDataView private void drawMarker(Canvas canvas, RectF rect) { rect.inset(columnWidth * 0.15f, columnWidth * 0.15f); - pGraph.setColor(Color.WHITE); + pGraph.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); canvas.drawOval(rect, pGraph); rect.inset(columnWidth * 0.1f, columnWidth * 0.1f); pGraph.setColor(primaryColor); + pGraph.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC)); canvas.drawOval(rect, pGraph); rect.inset(columnWidth * 0.1f, columnWidth * 0.1f); - pGraph.setColor(Color.WHITE); + pGraph.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); canvas.drawOval(rect, pGraph); + + pGraph.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC)); } } diff --git a/app/src/main/java/org/isoron/uhabits/views/HabitStreakView.java b/app/src/main/java/org/isoron/uhabits/views/HabitStreakView.java index 6f8223f41..96f83fd04 100644 --- a/app/src/main/java/org/isoron/uhabits/views/HabitStreakView.java +++ b/app/src/main/java/org/isoron/uhabits/views/HabitStreakView.java @@ -88,13 +88,15 @@ public class HabitStreakView extends ScrollableDataView private void createColors() { colors = new int[4]; - colors[0] = Color.rgb(230, 230, 230); colors[3] = primaryColor; - colors[1] = ColorHelper.mixColors(colors[0], colors[3], 0.66f); - colors[2] = ColorHelper.mixColors(colors[0], colors[3], 0.33f); + colors[1] = Color.argb(80, Color.red(primaryColor), Color.green(primaryColor), Color.blue( + primaryColor)); + colors[2] = Color.argb(170, Color.red(primaryColor), Color.green(primaryColor), Color.blue( + primaryColor)); + colors[0] = Color.argb(30, 0, 0, 0); } - private void createPaints() + protected void createPaints() { pText = new Paint(); pText.setColor(Color.LTGRAY); diff --git a/app/src/main/java/org/isoron/uhabits/views/ScrollableDataView.java b/app/src/main/java/org/isoron/uhabits/views/ScrollableDataView.java index 8c0ad9dab..d9f28d1c8 100644 --- a/app/src/main/java/org/isoron/uhabits/views/ScrollableDataView.java +++ b/app/src/main/java/org/isoron/uhabits/views/ScrollableDataView.java @@ -22,17 +22,20 @@ package org.isoron.uhabits.views; import android.animation.ValueAnimator; import android.content.Context; import android.util.AttributeSet; +import android.util.Log; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.View; import android.widget.Scroller; +import org.isoron.uhabits.R; + public abstract class ScrollableDataView extends View implements GestureDetector.OnGestureListener, ValueAnimator.AnimatorUpdateListener { protected int dataOffset; - protected int nColumns; + protected int nColumns, nRows; protected int columnWidth, columnHeight; protected int headerHeight, footerHeight; @@ -54,6 +57,7 @@ public abstract class ScrollableDataView extends View implements GestureDetector private void init(Context context) { + this.columnWidth = (int) context.getResources().getDimension(R.dimen.small_square_size); detector = new GestureDetector(context, this); scroller = new Scroller(context, null, true); scrollAnimator = ValueAnimator.ofFloat(0, 1); @@ -72,7 +76,25 @@ public abstract class ScrollableDataView extends View implements GestureDetector protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); - setMeasuredDimension(getMeasuredWidth(), columnHeight + headerHeight + footerHeight); + + int width = MeasureSpec.getSize(widthMeasureSpec); + int height = MeasureSpec.getSize(heightMeasureSpec); + + Log.d("ScrollableDataView", String.format("onMeasure width=%d height=%d", width, height)); + + columnWidth = height / 8; + columnHeight = columnWidth * 8 + footerHeight + headerHeight; + + height = columnHeight; + width = (width / columnWidth) * columnWidth; + + setMeasuredDimension(width, height); + updateDimensions(); + } + + protected void updateDimensions() + { + } @Override diff --git a/app/src/main/res/drawable/widget_background.xml b/app/src/main/res/drawable/widget_background.xml new file mode 100644 index 000000000..5814c0b2f --- /dev/null +++ b/app/src/main/res/drawable/widget_background.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/show_habit.xml b/app/src/main/res/layout/show_habit.xml index 820567e0b..6ffb27fa5 100644 --- a/app/src/main/res/layout/show_habit.xml +++ b/app/src/main/res/layout/show_habit.xml @@ -41,7 +41,7 @@ + android:layout_height="180dp"/> @@ -61,7 +61,7 @@ + android:layout_height="180dp"/> @@ -81,7 +81,7 @@ + android:layout_height="180dp"/> \ No newline at end of file diff --git a/app/src/main/res/layout/widget_graph.xml b/app/src/main/res/layout/widget_graph.xml new file mode 100644 index 000000000..f0d1fca8c --- /dev/null +++ b/app/src/main/res/layout/widget_graph.xml @@ -0,0 +1,30 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/small_widget.xml b/app/src/main/res/layout/widget_small.xml similarity index 100% rename from app/src/main/res/layout/small_widget.xml rename to app/src/main/res/layout/widget_small.xml diff --git a/app/src/main/res/xml/small_widget_info.xml b/app/src/main/res/xml/small_widget_info.xml index 4ffc0e993..5a2f1585b 100644 --- a/app/src/main/res/xml/small_widget_info.xml +++ b/app/src/main/res/xml/small_widget_info.xml @@ -2,9 +2,9 @@ From 4def8f04091dfb8d7fb38370c200547ee279c9b8 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Sun, 28 Feb 2016 15:23:20 -0500 Subject: [PATCH 34/57] Perform additional checks to avoid negative lengths --- .../org/isoron/uhabits/fragments/ListHabitsFragment.java | 5 +++-- app/src/main/java/org/isoron/uhabits/models/Habit.java | 2 ++ 2 files changed, 5 insertions(+), 2 deletions(-) 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..208e07d96 100644 --- a/app/src/main/java/org/isoron/uhabits/fragments/ListHabitsFragment.java +++ b/app/src/main/java/org/isoron/uhabits/fragments/ListHabitsFragment.java @@ -267,7 +267,7 @@ public class ListHabitsFragment extends Fragment { DisplayMetrics dm = getResources().getDisplayMetrics(); int width = (int) (dm.widthPixels / dm.density); - buttonCount = (int) ((width - 160) / 42.0); + buttonCount = Math.max(0, (int) ((width - 160) / 42.0)); tvNameWidth = (int) ((width - 30 - buttonCount * 42) * dm.density); loader = new HabitListLoader(); @@ -719,7 +719,8 @@ public class ListHabitsFragment extends Fragment TextView tvCheck = (TextView) llButtons.getChildAt(i); tvCheck.setTag(R.string.habit_key, habitId); tvCheck.setTag(R.string.offset_key, i); - updateCheckmark(activeColor, tvCheck, isChecked[i]); + if(isChecked.length > i) + updateCheckmark(activeColor, tvCheck, isChecked[i]); } } diff --git a/app/src/main/java/org/isoron/uhabits/models/Habit.java b/app/src/main/java/org/isoron/uhabits/models/Habit.java index 1d835612e..5f44ae936 100644 --- a/app/src/main/java/org/isoron/uhabits/models/Habit.java +++ b/app/src/main/java/org/isoron/uhabits/models/Habit.java @@ -269,6 +269,8 @@ public class Habit extends Model { updateCheckmarks(); + if(fromTimestamp > toTimestamp) return new int[0]; + String query = "select value, timestamp from Checkmarks where " + "habit = ? and timestamp >= ? and timestamp <= ?"; From b8cacaffa9bfd1458d42fe97f5bbcc3f1bb13497 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Mon, 29 Feb 2016 05:50:27 -0500 Subject: [PATCH 35/57] Refactor custom views; fix rendering issues --- .../isoron/uhabits/HabitWidgetProvider.java | 7 +- .../uhabits/views/HabitHistoryView.java | 51 ++++++++----- .../isoron/uhabits/views/HabitScoreView.java | 72 +++++++++++++------ .../isoron/uhabits/views/HabitStreakView.java | 42 ++++++++--- .../uhabits/views/ScrollableDataView.java | 61 +++++----------- .../main/res/drawable/widget_background.xml | 2 +- app/src/main/res/layout/show_habit.xml | 10 +-- 7 files changed, 145 insertions(+), 100 deletions(-) diff --git a/app/src/main/java/org/isoron/uhabits/HabitWidgetProvider.java b/app/src/main/java/org/isoron/uhabits/HabitWidgetProvider.java index d062f3b63..cc8ab43f1 100644 --- a/app/src/main/java/org/isoron/uhabits/HabitWidgetProvider.java +++ b/app/src/main/java/org/isoron/uhabits/HabitWidgetProvider.java @@ -28,7 +28,7 @@ import android.widget.RemoteViews; import org.isoron.helpers.DialogHelper; import org.isoron.uhabits.models.Habit; -import org.isoron.uhabits.views.HabitHistoryView; +import org.isoron.uhabits.views.HabitScoreView; public class HabitWidgetProvider extends AppWidgetProvider { @@ -63,9 +63,10 @@ public class HabitWidgetProvider extends AppWidgetProvider Habit habit = Habit.get(habitId); // SmallWidgetView widgetView = new SmallWidgetView(context); - HabitHistoryView widgetView = new HabitHistoryView(context, null); -// HabitScoreView widgetView = new HabitScoreView(context, null); +// HabitHistoryView widgetView = new HabitHistoryView(context, null); + HabitScoreView widgetView = new HabitScoreView(context, null); // HabitStreakView widgetView = new HabitStreakView(context, null); + widgetView.setIsBackgroundTransparent(true); widgetView.setHabit(habit); widgetView.setDrawingCacheEnabled(true); widgetView.measure(max_width, max_height); diff --git a/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java b/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java index e9b0a4f33..40252b1ef 100644 --- a/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java +++ b/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java @@ -26,7 +26,6 @@ import android.util.AttributeSet; import org.isoron.helpers.ColorHelper; import org.isoron.helpers.DateHelper; -import org.isoron.uhabits.R; import org.isoron.uhabits.models.Habit; import java.text.SimpleDateFormat; @@ -45,6 +44,11 @@ public class HabitHistoryView extends ScrollableDataView private float squareTextOffset; private float headerTextOffset; + private int columnWidth; + private int columnHeight; + private int nColumns; + private int baseSize; + private String wdays[]; private SimpleDateFormat dfMonth; private SimpleDateFormat dfYear; @@ -76,7 +80,6 @@ public class HabitHistoryView extends ScrollableDataView { createPaints(); createColors(); - updateDimensions(); wdays = DateHelper.getShortDayNames(); dfMonth = new SimpleDateFormat("MMM", Locale.getDefault()); @@ -88,7 +91,7 @@ public class HabitHistoryView extends ScrollableDataView private void updateDate() { baseDate = new GregorianCalendar(); - baseDate.add(Calendar.DAY_OF_YEAR, -(dataOffset - 1) * 7); + baseDate.add(Calendar.DAY_OF_YEAR, -(getDataOffset() - 1) * 7); nDays = (nColumns - 1) * 7; todayWeekday = new GregorianCalendar().get(Calendar.DAY_OF_WEEK) % 7; @@ -98,9 +101,34 @@ public class HabitHistoryView extends ScrollableDataView } @Override - protected void onSizeChanged(int w, int h, int oldw, int oldh) + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - super.onSizeChanged(w, h, oldw, oldh); + int width = MeasureSpec.getSize(widthMeasureSpec); + int height = MeasureSpec.getSize(heightMeasureSpec); + + int b = height / 8; + height = b * 8; + width = (width / b) * b; + + setMeasuredDimension(width, height); + } + + @Override + protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight) + { + baseSize = height / 8; + setScrollerBucketSize(baseSize); + + columnWidth = baseSize; + columnHeight = 8 * baseSize; + nColumns = width / baseSize; + + squareSpacing = baseSize / 10; + pSquareFg.setTextSize(baseSize * 0.5f); + pTextHeader.setTextSize(baseSize * 0.5f); + squareTextOffset = pSquareFg.getFontSpacing() * 0.4f; + headerTextOffset = pTextHeader.getFontSpacing() * 0.3f; + updateDate(); } @@ -116,15 +144,6 @@ public class HabitHistoryView extends ScrollableDataView colors[2] = primaryColor; } - protected void updateDimensions() - { - squareSpacing = columnWidth / 10; - pSquareFg.setTextSize(columnWidth * 0.5f); - pTextHeader.setTextSize(columnWidth * 0.5f); - squareTextOffset = pSquareFg.getFontSpacing() * 0.4f; - headerTextOffset = pTextHeader.getFontSpacing() * 0.3f; - } - protected void createPaints() { pTextHeader = new Paint(); @@ -212,9 +231,9 @@ public class HabitHistoryView extends ScrollableDataView for (int j = 0; j < 7; j++) { - if (!(column == nColumns - 2 && dataOffset == 0 && j > todayWeekday)) + if (!(column == nColumns - 2 && getDataOffset() == 0 && j > todayWeekday)) { - int checkmarkOffset = dataOffset * 7 + nDays - 7 * (column + 1) + todayWeekday - j; + int checkmarkOffset = getDataOffset() * 7 + nDays - 7 * (column + 1) + todayWeekday - j; drawSquare(canvas, location, date, checkmarkOffset); } 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 ddab70d7a..87ff35083 100644 --- a/app/src/main/java/org/isoron/uhabits/views/HabitScoreView.java +++ b/app/src/main/java/org/isoron/uhabits/views/HabitScoreView.java @@ -27,7 +27,6 @@ import android.util.AttributeSet; import org.isoron.helpers.ColorHelper; import org.isoron.helpers.DateHelper; -import org.isoron.uhabits.R; import org.isoron.uhabits.models.Habit; import java.text.SimpleDateFormat; @@ -37,6 +36,10 @@ import java.util.Random; public class HabitScoreView extends ScrollableDataView { public static final int BUCKET_SIZE = 7; + public static final PorterDuffXfermode XFERMODE_CLEAR = + new PorterDuffXfermode(PorterDuff.Mode.CLEAR); + public static final PorterDuffXfermode XFERMODE_SRC = + new PorterDuffXfermode(PorterDuff.Mode.SRC); private Paint pGrid; private float em; @@ -48,14 +51,18 @@ public class HabitScoreView extends ScrollableDataView private RectF rect, prevRect; private int baseSize; + private int columnWidth; + private int columnHeight; + private int nColumns; + private int[] colors; private int[] scores; private int primaryColor; + private boolean isBackgroundTransparent; public HabitScoreView(Context context, AttributeSet attrs) { super(context, attrs); - this.baseSize = (int) context.getResources().getDimension(R.dimen.small_square_size); this.primaryColor = ColorHelper.palette[7]; init(); } @@ -72,7 +79,6 @@ public class HabitScoreView extends ScrollableDataView { createPaints(); createColors(); - updateDimensions(); dfMonth = new SimpleDateFormat("MMM", Locale.getDefault()); dfDay = new SimpleDateFormat("d", Locale.getDefault()); @@ -109,18 +115,33 @@ public class HabitScoreView extends ScrollableDataView } @Override - protected void updateDimensions() + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - this.columnWidth = baseSize; + int width = MeasureSpec.getSize(widthMeasureSpec); + int height = MeasureSpec.getSize(heightMeasureSpec); + + int b = height / 9; + height = b * 9; + width = (width / b) * b; + + setMeasuredDimension(width, height); + } + + @Override + protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight) + { + baseSize = height / 9; + setScrollerBucketSize(baseSize); + + columnWidth = baseSize; columnHeight = 8 * baseSize; - headerHeight = baseSize; - footerHeight = baseSize; - em = pText.getFontSpacing(); + nColumns = width / baseSize; pText.setTextSize(baseSize * 0.5f); pGraph.setTextSize(baseSize * 0.5f); pGraph.setStrokeWidth(baseSize * 0.1f); pGrid.setStrokeWidth(baseSize * 0.05f); + em = pText.getFontSpacing(); } protected void fetchData() @@ -162,7 +183,6 @@ public class HabitScoreView extends ScrollableDataView float lineHeight = pText.getFontSpacing(); rect.set(0, 0, nColumns * columnWidth, columnHeight); - rect.offset(0, headerHeight); drawGrid(canvas, rect); String previousMonth = ""; @@ -172,7 +192,7 @@ public class HabitScoreView extends ScrollableDataView long currentDate = DateHelper.getStartOfToday(); - for(int k = 0; k < nColumns + dataOffset - 1; k++) + for(int k = 0; k < nColumns + getDataOffset() - 1; k++) currentDate -= 7 * DateHelper.millisecondsInOneDay; for (int k = 0; k < nColumns; k++) @@ -181,15 +201,14 @@ public class HabitScoreView extends ScrollableDataView String day = dfDay.format(currentDate); int score = 0; - int offset = nColumns - k - 1 + dataOffset; + int offset = nColumns - k - 1 + getDataOffset(); if(offset < scores.length) score = scores[offset]; double sRelative = ((double) score) / Habit.MAX_SCORE; int height = (int) (columnHeight * sRelative); - rect.set(0, 0, columnWidth, columnWidth); - rect.offset(k * columnWidth, - headerHeight + columnHeight - height - columnWidth / 2); + rect.set(0, 0, baseSize, baseSize); + rect.offset(k * columnWidth, columnHeight - height - columnWidth / 2); if (!prevRect.isEmpty()) { @@ -202,7 +221,7 @@ public class HabitScoreView extends ScrollableDataView prevRect.set(rect); rect.set(0, 0, columnWidth, columnHeight); - rect.offset(k * columnWidth, headerHeight); + rect.offset(k * columnWidth, 0); if (!month.equals(previousMonth)) canvas.drawText(month, rect.centerX(), rect.bottom + lineHeight * 1.2f, pText); else @@ -240,18 +259,31 @@ public class HabitScoreView extends ScrollableDataView private void drawMarker(Canvas canvas, RectF rect) { rect.inset(columnWidth * 0.15f, columnWidth * 0.15f); - pGraph.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); + setModeOrColor(pGraph, XFERMODE_CLEAR, Color.WHITE); canvas.drawOval(rect, pGraph); rect.inset(columnWidth * 0.1f, columnWidth * 0.1f); - pGraph.setColor(primaryColor); - pGraph.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC)); + setModeOrColor(pGraph, XFERMODE_SRC, primaryColor); canvas.drawOval(rect, pGraph); rect.inset(columnWidth * 0.1f, columnWidth * 0.1f); - pGraph.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); + setModeOrColor(pGraph, XFERMODE_CLEAR, Color.WHITE); canvas.drawOval(rect, pGraph); - pGraph.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC)); + if(isBackgroundTransparent) + pGraph.setXfermode(XFERMODE_SRC); + } + + public void setIsBackgroundTransparent(boolean isBackgroundTransparent) + { + this.isBackgroundTransparent = isBackgroundTransparent; + } + + private void setModeOrColor(Paint p, PorterDuffXfermode mode, int color) + { + if(isBackgroundTransparent) + p.setXfermode(mode); + else + p.setColor(color); } } diff --git a/app/src/main/java/org/isoron/uhabits/views/HabitStreakView.java b/app/src/main/java/org/isoron/uhabits/views/HabitStreakView.java index 96f83fd04..453ac4879 100644 --- a/app/src/main/java/org/isoron/uhabits/views/HabitStreakView.java +++ b/app/src/main/java/org/isoron/uhabits/views/HabitStreakView.java @@ -43,6 +43,11 @@ public class HabitStreakView extends ScrollableDataView private long[] endTimes; private long[] lengths; + private int columnWidth; + private int columnHeight; + private int headerHeight; + private int nColumns; + private long maxStreakLength; private int[] colors; private SimpleDateFormat dfMonth; @@ -53,7 +58,6 @@ public class HabitStreakView extends ScrollableDataView public HabitStreakView(Context context, AttributeSet attrs) { super(context, attrs); - this.baseSize = (int) context.getResources().getDimension(R.dimen.small_square_size); this.primaryColor = ColorHelper.palette[7]; init(); } @@ -62,6 +66,7 @@ public class HabitStreakView extends ScrollableDataView { this.habit = habit; this.primaryColor = habit.color; + createColors(); fetchData(); postInvalidate(); @@ -69,7 +74,6 @@ public class HabitStreakView extends ScrollableDataView private void init() { - setDimensions(baseSize); createPaints(); createColors(); @@ -77,12 +81,32 @@ public class HabitStreakView extends ScrollableDataView rect = new Rect(); } - private void setDimensions(int baseSize) + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) + { + int width = MeasureSpec.getSize(widthMeasureSpec); + int height = MeasureSpec.getSize(heightMeasureSpec); + + int b = height / 10; + height = b * 10; + width = (width / b) * b; + + setMeasuredDimension(width, height); + } + + @Override + protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight) { - this.columnWidth = baseSize; + baseSize = height / 10; + setScrollerBucketSize(baseSize); + + columnWidth = baseSize; columnHeight = 8 * baseSize; headerHeight = baseSize; - footerHeight = baseSize; + nColumns = width / baseSize; + + pText.setTextSize(baseSize * 0.5f); + pBar.setTextSize(baseSize * 0.5f); } private void createColors() @@ -91,8 +115,8 @@ public class HabitStreakView extends ScrollableDataView colors[3] = primaryColor; colors[1] = Color.argb(80, Color.red(primaryColor), Color.green(primaryColor), Color.blue( primaryColor)); - colors[2] = Color.argb(170, Color.red(primaryColor), Color.green(primaryColor), Color.blue( - primaryColor)); + colors[2] = Color.argb(170, Color.red(primaryColor), Color.green(primaryColor), + Color.blue(primaryColor)); colors[0] = Color.argb(30, 0, 0, 0); } @@ -101,12 +125,10 @@ public class HabitStreakView extends ScrollableDataView pText = new Paint(); pText.setColor(Color.LTGRAY); pText.setTextAlign(Paint.Align.CENTER); - pText.setTextSize(columnWidth * 0.5f); pText.setAntiAlias(true); pBar = new Paint(); pBar.setTextAlign(Paint.Align.CENTER); - pBar.setTextSize(columnWidth * 0.5f); pBar.setAntiAlias(true); } @@ -175,7 +197,7 @@ public class HabitStreakView extends ScrollableDataView float barHeaderOffset = lineHeight * 0.4f; int nStreaks = startTimes.length; - int start = nStreaks - nColumns - dataOffset; + int start = nStreaks - nColumns - getDataOffset(); String previousMonth = ""; diff --git a/app/src/main/java/org/isoron/uhabits/views/ScrollableDataView.java b/app/src/main/java/org/isoron/uhabits/views/ScrollableDataView.java index d9f28d1c8..7360456da 100644 --- a/app/src/main/java/org/isoron/uhabits/views/ScrollableDataView.java +++ b/app/src/main/java/org/isoron/uhabits/views/ScrollableDataView.java @@ -22,22 +22,17 @@ package org.isoron.uhabits.views; import android.animation.ValueAnimator; import android.content.Context; import android.util.AttributeSet; -import android.util.Log; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.View; import android.widget.Scroller; -import org.isoron.uhabits.R; - public abstract class ScrollableDataView extends View implements GestureDetector.OnGestureListener, ValueAnimator.AnimatorUpdateListener { - protected int dataOffset; - protected int nColumns, nRows; - protected int columnWidth, columnHeight; - protected int headerHeight, footerHeight; + private int dataOffset; + private int scrollerBucketSize; private GestureDetector detector; private Scroller scroller; @@ -57,7 +52,6 @@ public abstract class ScrollableDataView extends View implements GestureDetector private void init(Context context) { - this.columnWidth = (int) context.getResources().getDimension(R.dimen.small_square_size); detector = new GestureDetector(context, this); scroller = new Scroller(context, null, true); scrollAnimator = ValueAnimator.ofFloat(0, 1); @@ -72,39 +66,6 @@ public abstract class ScrollableDataView extends View implements GestureDetector return detector.onTouchEvent(event); } - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) - { - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - - int width = MeasureSpec.getSize(widthMeasureSpec); - int height = MeasureSpec.getSize(heightMeasureSpec); - - Log.d("ScrollableDataView", String.format("onMeasure width=%d height=%d", width, height)); - - columnWidth = height / 8; - columnHeight = columnWidth * 8 + footerHeight + headerHeight; - - height = columnHeight; - width = (width / columnWidth) * columnWidth; - - setMeasuredDimension(width, height); - updateDimensions(); - } - - protected void updateDimensions() - { - - } - - @Override - protected void onSizeChanged(int w, int h, int oldw, int oldh) - { - super.onSizeChanged(w, h, oldw, oldh); - nColumns = w / columnWidth; - fetchData(); - } - @Override public boolean onDown(MotionEvent e) { @@ -126,13 +87,17 @@ public abstract class ScrollableDataView extends View implements GestureDetector @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float dx, float dy) { + if(scrollerBucketSize == 0) + return false; + if(Math.abs(dx) > Math.abs(dy)) getParent().requestDisallowInterceptTouchEvent(true); scroller.startScroll(scroller.getCurrX(), scroller.getCurrY(), (int) -dx, (int) dy, 0); scroller.computeScrollOffset(); - dataOffset = Math.max(0, scroller.getCurrX() / columnWidth); + dataOffset = Math.max(0, scroller.getCurrX() / scrollerBucketSize); postInvalidate(); + return true; } @@ -161,7 +126,7 @@ public abstract class ScrollableDataView extends View implements GestureDetector if (!scroller.isFinished()) { scroller.computeScrollOffset(); - dataOffset = Math.max(0, scroller.getCurrX() / columnWidth); + dataOffset = Math.max(0, scroller.getCurrX() / scrollerBucketSize); postInvalidate(); } else @@ -169,4 +134,14 @@ public abstract class ScrollableDataView extends View implements GestureDetector scrollAnimator.cancel(); } } + + public int getDataOffset() + { + return dataOffset; + } + + public void setScrollerBucketSize(int scrollerBucketSize) + { + this.scrollerBucketSize = scrollerBucketSize; + } } diff --git a/app/src/main/res/drawable/widget_background.xml b/app/src/main/res/drawable/widget_background.xml index 5814c0b2f..3fb27a0b0 100644 --- a/app/src/main/res/drawable/widget_background.xml +++ b/app/src/main/res/drawable/widget_background.xml @@ -2,6 +2,6 @@ - + \ No newline at end of file diff --git a/app/src/main/res/layout/show_habit.xml b/app/src/main/res/layout/show_habit.xml index 6ffb27fa5..aff070c78 100644 --- a/app/src/main/res/layout/show_habit.xml +++ b/app/src/main/res/layout/show_habit.xml @@ -11,7 +11,6 @@ tools:context="org.isoron.uhabits.ShowHabitActivity"> @@ -28,10 +27,7 @@ - + + android:layout_height="200dp"/> @@ -81,7 +77,7 @@ + android:layout_height="200dp"/> \ No newline at end of file From ae7869d3a2982382e19125ebed26e39b1a1ad142 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Mon, 29 Feb 2016 07:19:43 -0500 Subject: [PATCH 36/57] 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 From 48d446a243cfe4d568ea3b1c09239dd800919d8b Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Mon, 29 Feb 2016 07:44:59 -0500 Subject: [PATCH 37/57] Minor color changes --- .../java/org/isoron/uhabits/views/HabitHistoryView.java | 2 +- .../main/java/org/isoron/uhabits/views/HabitScoreView.java | 6 +++--- .../main/java/org/isoron/uhabits/views/HabitStreakView.java | 4 ++-- app/src/main/res/drawable/widget_background.xml | 2 +- app/src/main/res/layout/widget_graph.xml | 2 +- app/src/main/res/xml/widget_streak_info.xml | 1 - 6 files changed, 8 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java b/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java index 40252b1ef..55a2a249a 100644 --- a/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java +++ b/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java @@ -147,7 +147,7 @@ public class HabitHistoryView extends ScrollableDataView protected void createPaints() { pTextHeader = new Paint(); - pTextHeader.setColor(Color.LTGRAY); + pTextHeader.setColor(Color.argb(64, 0, 0, 0)); pTextHeader.setTextAlign(Align.LEFT); pTextHeader.setAntiAlias(true); 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 4f253fa6b..0397b78b2 100644 --- a/app/src/main/java/org/isoron/uhabits/views/HabitScoreView.java +++ b/app/src/main/java/org/isoron/uhabits/views/HabitScoreView.java @@ -100,7 +100,7 @@ public class HabitScoreView extends ScrollableDataView protected void createPaints() { pText = new Paint(); - pText.setColor(Color.LTGRAY); + pText.setColor(Color.argb(64, 0, 0, 0)); pText.setTextAlign(Paint.Align.LEFT); pText.setAntiAlias(true); @@ -109,7 +109,7 @@ public class HabitScoreView extends ScrollableDataView pGraph.setAntiAlias(true); pGrid = new Paint(); - pGrid.setColor(Color.LTGRAY); + pGrid.setColor(Color.argb(64, 0, 0, 0)); pGrid.setAntiAlias(true); } @@ -240,7 +240,7 @@ public class HabitScoreView extends ScrollableDataView int nRows = 5; float rowHeight = rGrid.height() / nRows; - pGrid.setColor(Color.rgb(240, 240, 240)); + pGrid.setColor(Color.argb(20, 0, 0, 0)); for (int i = 0; i < nRows; i++) { canvas.drawText(String.format("%d%%", (100 - i * 100 / nRows)), rGrid.left + 0.5f * em, diff --git a/app/src/main/java/org/isoron/uhabits/views/HabitStreakView.java b/app/src/main/java/org/isoron/uhabits/views/HabitStreakView.java index 453ac4879..d8691facb 100644 --- a/app/src/main/java/org/isoron/uhabits/views/HabitStreakView.java +++ b/app/src/main/java/org/isoron/uhabits/views/HabitStreakView.java @@ -103,7 +103,7 @@ public class HabitStreakView extends ScrollableDataView columnWidth = baseSize; columnHeight = 8 * baseSize; headerHeight = baseSize; - nColumns = width / baseSize; + nColumns = width / baseSize - 1; pText.setTextSize(baseSize * 0.5f); pBar.setTextSize(baseSize * 0.5f); @@ -123,7 +123,7 @@ public class HabitStreakView extends ScrollableDataView protected void createPaints() { pText = new Paint(); - pText.setColor(Color.LTGRAY); + pText.setColor(Color.argb(64, 0, 0, 0)); pText.setTextAlign(Paint.Align.CENTER); pText.setAntiAlias(true); diff --git a/app/src/main/res/drawable/widget_background.xml b/app/src/main/res/drawable/widget_background.xml index 3fb27a0b0..98fd95f07 100644 --- a/app/src/main/res/drawable/widget_background.xml +++ b/app/src/main/res/drawable/widget_background.xml @@ -2,6 +2,6 @@ - + \ No newline at end of file diff --git a/app/src/main/res/layout/widget_graph.xml b/app/src/main/res/layout/widget_graph.xml index 4075bbe8d..0c62235a9 100644 --- a/app/src/main/res/layout/widget_graph.xml +++ b/app/src/main/res/layout/widget_graph.xml @@ -16,7 +16,7 @@ android:layout_height="wrap_content" android:gravity="center" android:text="Wake up early" - android:textColor="@color/white"/> + android:textColor="#3f000000"/> - \ No newline at end of file From 542820954351597963213db017cb41a1251fb5b1 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Tue, 1 Mar 2016 08:33:16 -0500 Subject: [PATCH 38/57] Improve widget colors --- .../java/org/isoron/helpers/ColorHelper.java | 31 ++++++++++ .../uhabits/views/HabitHistoryView.java | 49 ++++++++++++---- .../isoron/uhabits/views/HabitScoreView.java | 34 +++++++++-- .../isoron/uhabits/views/HabitStreakView.java | 57 +++++++++++++++---- .../widgets/HistoryWidgetProvider.java | 1 + .../uhabits/widgets/StreakWidgetProvider.java | 2 +- .../main/res/drawable/widget_background.xml | 2 +- app/src/main/res/layout/widget_graph.xml | 4 +- 8 files changed, 149 insertions(+), 31 deletions(-) diff --git a/app/src/main/java/org/isoron/helpers/ColorHelper.java b/app/src/main/java/org/isoron/helpers/ColorHelper.java index adb4849c5..2a4a0a258 100644 --- a/app/src/main/java/org/isoron/helpers/ColorHelper.java +++ b/app/src/main/java/org/isoron/helpers/ColorHelper.java @@ -57,4 +57,35 @@ public class ColorHelper return a << ALPHA_CHANNEL | r << RED_CHANNEL | g << GREEN_CHANNEL | b << BLUE_CHANNEL; } + + public static int setHue(int color, float newHue) + { + return setHSVParameter(color, newHue, 0); + } + + public static int setSaturation(int color, float newSaturation) + { + return setHSVParameter(color, newSaturation, 1); + } + + public static int setValue(int color, float newValue) + { + return setHSVParameter(color, newValue, 2); + } + + public static int setMinValue(int color, float newValue) + { + float hsv[] = new float[3]; + Color.colorToHSV(color, hsv); + hsv[2] = Math.max(hsv[2], newValue); + return Color.HSVToColor(hsv); + } + + private static int setHSVParameter(int color, float newValue, int index) + { + float hsv[] = new float[3]; + Color.colorToHSV(color, hsv); + hsv[index] = newValue; + return Color.HSVToColor(hsv); + } } \ No newline at end of file diff --git a/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java b/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java index 55a2a249a..6f7175a65 100644 --- a/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java +++ b/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java @@ -60,6 +60,9 @@ public class HabitHistoryView extends ScrollableDataView private Rect baseLocation; private int primaryColor; + private boolean isBackgroundTransparent; + private int textColor; + public HabitHistoryView(Context context, AttributeSet attrs) { super(context, attrs); @@ -70,7 +73,6 @@ public class HabitHistoryView extends ScrollableDataView public void setHabit(Habit habit) { this.habit = habit; - this.primaryColor = habit.color; createColors(); fetchData(); postInvalidate(); @@ -134,20 +136,39 @@ public class HabitHistoryView extends ScrollableDataView private void createColors() { - int primaryColorBright = Color.argb(127, Color.red(primaryColor), Color.green(primaryColor), - Color.blue(primaryColor)); - int grey = Color.argb(25, 0, 0, 0); - - colors = new int[3]; - colors[0] = grey; - colors[1] = primaryColorBright; - colors[2] = primaryColor; + if(habit != null) + this.primaryColor = habit.color; + + if(isBackgroundTransparent) + { + primaryColor = ColorHelper.setMinValue(primaryColor, 0.75f); + } + + int red = Color.red(primaryColor); + int green = Color.green(primaryColor); + int blue = Color.blue(primaryColor); + + if(isBackgroundTransparent) + { + colors = new int[3]; + colors[0] = Color.argb(64, 0, 0, 0); + colors[1] = Color.argb(128, red, green, blue); + colors[2] = primaryColor; + textColor = Color.rgb(255, 255, 255); + } + else + { + colors = new int[3]; + colors[0] = Color.argb(25, 0, 0, 0); + colors[1] = Color.argb(127, red, green, blue); + colors[2] = primaryColor; + textColor = Color.argb(128, 0, 0, 0); + } } protected void createPaints() { pTextHeader = new Paint(); - pTextHeader.setColor(Color.argb(64, 0, 0, 0)); pTextHeader.setTextAlign(Align.LEFT); pTextHeader.setAntiAlias(true); @@ -212,6 +233,8 @@ public class HabitHistoryView extends ScrollableDataView previousYear = ""; justPrintedYear = false; + pTextHeader.setColor(textColor); + updateDate(); GregorianCalendar currentDate = (GregorianCalendar) baseDate.clone(); @@ -302,4 +325,10 @@ public class HabitHistoryView extends ScrollableDataView justPrintedYear = false; } } + + public void setIsBackgroundTransparent(boolean isBackgroundTransparent) + { + this.isBackgroundTransparent = isBackgroundTransparent; + createColors(); + } } 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 0397b78b2..a7950dbb9 100644 --- a/app/src/main/java/org/isoron/uhabits/views/HabitScoreView.java +++ b/app/src/main/java/org/isoron/uhabits/views/HabitScoreView.java @@ -55,6 +55,8 @@ public class HabitScoreView extends ScrollableDataView private int columnHeight; private int nColumns; + private int textColor; + private int dimmedTextColor; private int[] colors; private int[] scores; private int primaryColor; @@ -70,7 +72,7 @@ public class HabitScoreView extends ScrollableDataView public void setHabit(Habit habit) { this.habit = habit; - this.primaryColor = habit.color; + createColors(); fetchData(); postInvalidate(); } @@ -89,6 +91,26 @@ public class HabitScoreView extends ScrollableDataView private void createColors() { + if(habit != null) + this.primaryColor = habit.color; + + if(isBackgroundTransparent) + { + primaryColor = ColorHelper.setSaturation(primaryColor, 0.75f); + primaryColor = ColorHelper.setValue(primaryColor, 1.0f); + } + + if(isBackgroundTransparent) + { + textColor = Color.argb(192, 255, 255, 255); + dimmedTextColor = Color.argb(128, 255, 255, 255); + } + else + { + textColor = Color.argb(128, 0, 0, 0); + dimmedTextColor = Color.argb(32, 0, 0, 0); + } + colors = new int[4]; colors[0] = Color.rgb(230, 230, 230); @@ -100,18 +122,14 @@ public class HabitScoreView extends ScrollableDataView protected void createPaints() { pText = new Paint(); - pText.setColor(Color.argb(64, 0, 0, 0)); pText.setTextAlign(Paint.Align.LEFT); pText.setAntiAlias(true); pGraph = new Paint(); pGraph.setTextAlign(Paint.Align.CENTER); pGraph.setAntiAlias(true); - pGrid = new Paint(); - pGrid.setColor(Color.argb(64, 0, 0, 0)); pGrid.setAntiAlias(true); - } @Override @@ -186,10 +204,13 @@ public class HabitScoreView extends ScrollableDataView float lineHeight = pText.getFontSpacing(); rect.set(0, 0, nColumns * columnWidth, columnHeight); + rect.offset(0, 1f); + drawGrid(canvas, rect); String previousMonth = ""; + pText.setColor(textColor); pGraph.setColor(primaryColor); prevRect.setEmpty(); @@ -240,7 +261,7 @@ public class HabitScoreView extends ScrollableDataView int nRows = 5; float rowHeight = rGrid.height() / nRows; - pGrid.setColor(Color.argb(20, 0, 0, 0)); + pGrid.setColor(dimmedTextColor); for (int i = 0; i < nRows; i++) { canvas.drawText(String.format("%d%%", (100 - i * 100 / nRows)), rGrid.left + 0.5f * em, @@ -280,6 +301,7 @@ public class HabitScoreView extends ScrollableDataView public void setIsBackgroundTransparent(boolean isBackgroundTransparent) { this.isBackgroundTransparent = isBackgroundTransparent; + createColors(); } private void setModeOrColor(Paint p, PorterDuffXfermode mode, int color) diff --git a/app/src/main/java/org/isoron/uhabits/views/HabitStreakView.java b/app/src/main/java/org/isoron/uhabits/views/HabitStreakView.java index d8691facb..948cc24f6 100644 --- a/app/src/main/java/org/isoron/uhabits/views/HabitStreakView.java +++ b/app/src/main/java/org/isoron/uhabits/views/HabitStreakView.java @@ -25,7 +25,6 @@ import android.util.AttributeSet; import org.isoron.helpers.ColorHelper; import org.isoron.helpers.DateHelper; -import org.isoron.uhabits.R; import org.isoron.uhabits.models.Habit; import org.isoron.uhabits.models.Streak; @@ -55,6 +54,10 @@ public class HabitStreakView extends ScrollableDataView private int baseSize; private int primaryColor; + private boolean isBackgroundTransparent; + private int textColor; + private Paint pBarText; + public HabitStreakView(Context context, AttributeSet attrs) { super(context, attrs); @@ -65,7 +68,6 @@ public class HabitStreakView extends ScrollableDataView public void setHabit(Habit habit) { this.habit = habit; - this.primaryColor = habit.color; createColors(); fetchData(); @@ -111,19 +113,44 @@ public class HabitStreakView extends ScrollableDataView private void createColors() { - colors = new int[4]; - colors[3] = primaryColor; - colors[1] = Color.argb(80, Color.red(primaryColor), Color.green(primaryColor), Color.blue( - primaryColor)); - colors[2] = Color.argb(170, Color.red(primaryColor), Color.green(primaryColor), - Color.blue(primaryColor)); - colors[0] = Color.argb(30, 0, 0, 0); + if(habit != null) + this.primaryColor = habit.color; + + if(isBackgroundTransparent) + { + primaryColor = ColorHelper.setSaturation(primaryColor, 0.75f); + primaryColor = ColorHelper.setValue(primaryColor, 1.0f); + } + + int red = Color.red(primaryColor); + int green = Color.green(primaryColor); + int blue = Color.blue(primaryColor); + + if(isBackgroundTransparent) + { + colors = new int[4]; + colors[3] = primaryColor; + colors[2] = Color.argb(213, red, green, blue); + colors[1] = Color.argb(170, red, green, blue); + colors[0] = Color.argb(128, red, green, blue); + textColor = Color.rgb(255, 255, 255); + pBarText = pText; + } + else + { + colors = new int[4]; + colors[3] = primaryColor; + colors[2] = Color.argb(192, red, green, blue); + colors[1] = Color.argb(96, red, green, blue); + colors[0] = Color.argb(32, 0, 0, 0); + textColor = Color.argb(128, 0, 0, 0); + pBarText = pBar; + } } protected void createPaints() { pText = new Paint(); - pText.setColor(Color.argb(64, 0, 0, 0)); pText.setTextAlign(Paint.Align.CENTER); pText.setAntiAlias(true); @@ -199,6 +226,8 @@ public class HabitStreakView extends ScrollableDataView int nStreaks = startTimes.length; int start = nStreaks - nColumns - getDataOffset(); + pText.setColor(textColor); + String previousMonth = ""; for (int offset = 0; offset < nColumns && start + offset < nStreaks; offset++) @@ -216,7 +245,7 @@ public class HabitStreakView extends ScrollableDataView rect.offset(offset * columnWidth, headerHeight + columnHeight - height); canvas.drawRect(rect, pBar); - canvas.drawText(Long.toString(l), rect.centerX(), rect.top - barHeaderOffset, pBar); + canvas.drawText(Long.toString(l), rect.centerX(), rect.top - barHeaderOffset, pBarText); if (!month.equals(previousMonth)) canvas.drawText(month, rect.centerX(), rect.bottom + lineHeight * 1.2f, pText); @@ -224,4 +253,10 @@ public class HabitStreakView extends ScrollableDataView previousMonth = month; } } + + public void setIsBackgroundTransparent(boolean isBackgroundTransparent) + { + this.isBackgroundTransparent = isBackgroundTransparent; + createColors(); + } } diff --git a/app/src/main/java/org/isoron/uhabits/widgets/HistoryWidgetProvider.java b/app/src/main/java/org/isoron/uhabits/widgets/HistoryWidgetProvider.java index 2a382ef01..d72da4257 100644 --- a/app/src/main/java/org/isoron/uhabits/widgets/HistoryWidgetProvider.java +++ b/app/src/main/java/org/isoron/uhabits/widgets/HistoryWidgetProvider.java @@ -30,6 +30,7 @@ public class HistoryWidgetProvider extends BaseWidgetProvider protected View buildCustomView(Context context, int maxHeight, int maxWidth, Habit habit) { HabitHistoryView view = new HabitHistoryView(context, null); + view.setIsBackgroundTransparent(true); view.setHabit(habit); view.measure(maxWidth, maxHeight); view.layout(0, 0, maxWidth, maxHeight); diff --git a/app/src/main/java/org/isoron/uhabits/widgets/StreakWidgetProvider.java b/app/src/main/java/org/isoron/uhabits/widgets/StreakWidgetProvider.java index e7685748c..4a4bd84ca 100644 --- a/app/src/main/java/org/isoron/uhabits/widgets/StreakWidgetProvider.java +++ b/app/src/main/java/org/isoron/uhabits/widgets/StreakWidgetProvider.java @@ -22,7 +22,6 @@ 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 @@ -31,6 +30,7 @@ public class StreakWidgetProvider extends BaseWidgetProvider protected View buildCustomView(Context context, int maxHeight, int maxWidth, Habit habit) { HabitStreakView view = new HabitStreakView(context, null); + view.setIsBackgroundTransparent(true); view.setHabit(habit); view.measure(maxWidth, maxHeight); view.layout(0, 0, maxWidth, maxHeight); diff --git a/app/src/main/res/drawable/widget_background.xml b/app/src/main/res/drawable/widget_background.xml index 98fd95f07..97de8bee1 100644 --- a/app/src/main/res/drawable/widget_background.xml +++ b/app/src/main/res/drawable/widget_background.xml @@ -2,6 +2,6 @@ - + \ No newline at end of file diff --git a/app/src/main/res/layout/widget_graph.xml b/app/src/main/res/layout/widget_graph.xml index 0c62235a9..99ee6628d 100644 --- a/app/src/main/res/layout/widget_graph.xml +++ b/app/src/main/res/layout/widget_graph.xml @@ -15,8 +15,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" - android:text="Wake up early" - android:textColor="#3f000000"/> + android:text="Habit" + android:textColor="#ffffff"/> Date: Wed, 2 Mar 2016 09:52:32 -0500 Subject: [PATCH 39/57] Improve widget measuring --- .../isoron/uhabits/views/CheckmarkView.java | 26 +++---- .../uhabits/views/HabitHistoryView.java | 8 +-- .../isoron/uhabits/views/HabitScoreView.java | 10 +-- .../isoron/uhabits/views/HabitStreakView.java | 5 -- .../uhabits/widgets/BaseWidgetProvider.java | 67 +++++++++++++++---- .../widgets/CheckmarkWidgetProvider.java | 19 ++---- .../widgets/HistoryWidgetProvider.java | 14 +--- .../uhabits/widgets/ScoreWidgetProvider.java | 12 +--- .../uhabits/widgets/StreakWidgetProvider.java | 12 +--- app/src/main/res/layout/widget_checkmark.xml | 2 +- app/src/main/res/layout/widget_graph.xml | 5 +- 11 files changed, 80 insertions(+), 100 deletions(-) diff --git a/app/src/main/java/org/isoron/uhabits/views/CheckmarkView.java b/app/src/main/java/org/isoron/uhabits/views/CheckmarkView.java index 916952275..e44096bce 100644 --- a/app/src/main/java/org/isoron/uhabits/views/CheckmarkView.java +++ b/app/src/main/java/org/isoron/uhabits/views/CheckmarkView.java @@ -27,6 +27,7 @@ import android.text.Layout; import android.text.StaticLayout; import android.text.TextPaint; import android.util.AttributeSet; +import android.util.Log; import android.view.View; import org.isoron.helpers.ColorHelper; @@ -134,14 +135,10 @@ public class CheckmarkView extends View pCard.setColor(color); 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) @@ -177,29 +174,24 @@ public class CheckmarkView extends View } @Override - protected void onMeasure(int width, int height) + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - super.onMeasure(width, height); - setMeasuredDimension(width, height); + int width = MeasureSpec.getSize(widthMeasureSpec); + setMeasuredDimension(width, (int) (width * 1.25)); } @Override - protected void onSizeChanged(int w, int h, int oldw, int oldh) + protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight) { - super.onSizeChanged(w, h, oldw, oldh); - updateSize(w, h); - updateLabel(); - } - - private void updateSize(int width, int height) - { - this.width = width; - this.height = height; + this.width = getMeasuredWidth(); + this.height = getMeasuredHeight(); leftMargin = (int) (width * 0.015); topMargin = (int) (height * 0.015); padding = 8 * leftMargin; textPaint.setTextSize(0.15f * width); + + updateLabel(); } private void updateLabel() diff --git a/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java b/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java index 6f7175a65..a5f11b5e3 100644 --- a/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java +++ b/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java @@ -23,6 +23,7 @@ import android.graphics.Paint; import android.graphics.Paint.Align; import android.graphics.Rect; import android.util.AttributeSet; +import android.util.Log; import org.isoron.helpers.ColorHelper; import org.isoron.helpers.DateHelper; @@ -107,17 +108,14 @@ public class HabitHistoryView extends ScrollableDataView { int width = MeasureSpec.getSize(widthMeasureSpec); int height = MeasureSpec.getSize(heightMeasureSpec); - - int b = height / 8; - height = b * 8; - width = (width / b) * b; - setMeasuredDimension(width, height); } @Override protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight) { + if(height < 8) height = 200; + baseSize = height / 8; setScrollerBucketSize(baseSize); 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 a7950dbb9..d24e0061d 100644 --- a/app/src/main/java/org/isoron/uhabits/views/HabitScoreView.java +++ b/app/src/main/java/org/isoron/uhabits/views/HabitScoreView.java @@ -137,20 +137,14 @@ public class HabitScoreView extends ScrollableDataView { int width = MeasureSpec.getSize(widthMeasureSpec); int height = MeasureSpec.getSize(heightMeasureSpec); - - if(height > 0) - { - int b = height / 9; - height = b * 9; - width = (width / b) * b; - } - setMeasuredDimension(width, height); } @Override protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight) { + if(height < 9) height = 200; + baseSize = height / 9; setScrollerBucketSize(baseSize); diff --git a/app/src/main/java/org/isoron/uhabits/views/HabitStreakView.java b/app/src/main/java/org/isoron/uhabits/views/HabitStreakView.java index 948cc24f6..3869d268e 100644 --- a/app/src/main/java/org/isoron/uhabits/views/HabitStreakView.java +++ b/app/src/main/java/org/isoron/uhabits/views/HabitStreakView.java @@ -88,11 +88,6 @@ public class HabitStreakView extends ScrollableDataView { int width = MeasureSpec.getSize(widthMeasureSpec); int height = MeasureSpec.getSize(heightMeasureSpec); - - int b = height / 10; - height = b * 10; - width = (width / b) * b; - setMeasuredDimension(width, height); } diff --git a/app/src/main/java/org/isoron/uhabits/widgets/BaseWidgetProvider.java b/app/src/main/java/org/isoron/uhabits/widgets/BaseWidgetProvider.java index 970a82aaf..66d4f5057 100644 --- a/app/src/main/java/org/isoron/uhabits/widgets/BaseWidgetProvider.java +++ b/app/src/main/java/org/isoron/uhabits/widgets/BaseWidgetProvider.java @@ -21,11 +21,12 @@ import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProvider; import android.content.Context; import android.content.SharedPreferences; +import android.content.res.Configuration; import android.graphics.Bitmap; import android.os.Build; import android.os.Bundle; import android.preference.PreferenceManager; -import android.util.Log; +import android.view.LayoutInflater; import android.view.View; import android.widget.RemoteViews; @@ -36,6 +37,8 @@ import org.isoron.uhabits.models.Habit; public abstract class BaseWidgetProvider extends AppWidgetProvider { + private int width, height; + protected abstract int getDefaultHeight(); protected abstract int getDefaultWidth(); @@ -44,8 +47,7 @@ public abstract class BaseWidgetProvider extends AppWidgetProvider protected abstract int getLayoutId(); - protected abstract View buildCustomView(Context context, int max_height, int max_width, - Habit habit); + protected abstract View buildCustomView(Context context, Habit habit); public static String getHabitIdKey(long widgetId) { @@ -85,16 +87,7 @@ public abstract class BaseWidgetProvider extends AppWidgetProvider private void updateWidget(Context context, AppWidgetManager manager, int widgetId, Bundle options) { - int maxWidth = getDefaultWidth(); - int maxHeight = getDefaultHeight(); - - 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)); - } + updateWidgetSize(context, options); Context appContext = context.getApplicationContext(); RemoteViews remoteViews = new RemoteViews(context.getPackageName(), getLayoutId()); @@ -104,7 +97,9 @@ public abstract class BaseWidgetProvider extends AppWidgetProvider if(habitId < 0) return; Habit habit = Habit.get(habitId); - View widgetView = buildCustomView(context, maxHeight, maxWidth, habit); + View widgetView = buildCustomView(context, habit); + measureCustomView(context, width, height, widgetView); + widgetView.setDrawingCacheEnabled(true); widgetView.buildDrawingCache(true); Bitmap drawingCache = widgetView.getDrawingCache(); @@ -117,4 +112,48 @@ public abstract class BaseWidgetProvider extends AppWidgetProvider manager.updateAppWidget(widgetId, remoteViews); } + + private void updateWidgetSize(Context context, Bundle options) + { + int maxWidth = getDefaultWidth(); + int minWidth = getDefaultWidth(); + int maxHeight = getDefaultHeight(); + int minHeight = getDefaultHeight(); + + 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)); + minWidth = (int) DialogHelper.dpToPixels(context, + options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH)); + minHeight = (int) DialogHelper.dpToPixels(context, + options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT)); + } + + width = maxWidth; + height = maxHeight; + } + + private void measureCustomView(Context context, int w, int h, View customView) + { + LayoutInflater inflater = LayoutInflater.from(context); + View entireView = inflater.inflate(getLayoutId(), null); + + int specWidth = View.MeasureSpec.makeMeasureSpec(w, View.MeasureSpec.EXACTLY); + int specHeight = View.MeasureSpec.makeMeasureSpec(h, View.MeasureSpec.EXACTLY); + + entireView.measure(specWidth, specHeight); + entireView.layout(0, 0, entireView.getMeasuredWidth(), entireView.getMeasuredHeight()); + + View imageView = entireView.findViewById(R.id.imageView); + w = imageView.getMeasuredWidth(); + h = imageView.getMeasuredHeight(); + + specWidth = View.MeasureSpec.makeMeasureSpec(w, View.MeasureSpec.EXACTLY); + specHeight = View.MeasureSpec.makeMeasureSpec(h, View.MeasureSpec.EXACTLY); + customView.measure(specWidth, specHeight); + customView.layout(0, 0, customView.getMeasuredWidth(), customView.getMeasuredHeight()); + } } diff --git a/app/src/main/java/org/isoron/uhabits/widgets/CheckmarkWidgetProvider.java b/app/src/main/java/org/isoron/uhabits/widgets/CheckmarkWidgetProvider.java index fb81d7133..2710435f9 100644 --- a/app/src/main/java/org/isoron/uhabits/widgets/CheckmarkWidgetProvider.java +++ b/app/src/main/java/org/isoron/uhabits/widgets/CheckmarkWidgetProvider.java @@ -27,20 +27,11 @@ import org.isoron.uhabits.views.CheckmarkView; public class CheckmarkWidgetProvider extends BaseWidgetProvider { @Override - protected View buildCustomView(Context context, int maxHeight, int maxWidth, Habit habit) + protected View buildCustomView(Context context, 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; + CheckmarkView view = new CheckmarkView(context); + view.setHabit(habit); + return view; } @Override @@ -58,7 +49,7 @@ public class CheckmarkWidgetProvider extends BaseWidgetProvider @Override protected int getDefaultWidth() { - return 160; + return 200; } @Override diff --git a/app/src/main/java/org/isoron/uhabits/widgets/HistoryWidgetProvider.java b/app/src/main/java/org/isoron/uhabits/widgets/HistoryWidgetProvider.java index d72da4257..7f6b50aea 100644 --- a/app/src/main/java/org/isoron/uhabits/widgets/HistoryWidgetProvider.java +++ b/app/src/main/java/org/isoron/uhabits/widgets/HistoryWidgetProvider.java @@ -19,7 +19,6 @@ 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; @@ -27,20 +26,11 @@ import org.isoron.uhabits.views.HabitHistoryView; public class HistoryWidgetProvider extends BaseWidgetProvider { @Override - protected View buildCustomView(Context context, int maxHeight, int maxWidth, Habit habit) + protected View buildCustomView(Context context, Habit habit) { HabitHistoryView view = new HabitHistoryView(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); - + view.setIsBackgroundTransparent(true); return view; } diff --git a/app/src/main/java/org/isoron/uhabits/widgets/ScoreWidgetProvider.java b/app/src/main/java/org/isoron/uhabits/widgets/ScoreWidgetProvider.java index 6dd3ae246..3cede1dee 100644 --- a/app/src/main/java/org/isoron/uhabits/widgets/ScoreWidgetProvider.java +++ b/app/src/main/java/org/isoron/uhabits/widgets/ScoreWidgetProvider.java @@ -19,7 +19,6 @@ 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; @@ -27,20 +26,11 @@ import org.isoron.uhabits.views.HabitScoreView; public class ScoreWidgetProvider extends BaseWidgetProvider { @Override - protected View buildCustomView(Context context, int maxHeight, int maxWidth, Habit habit) + protected View buildCustomView(Context context, 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; } diff --git a/app/src/main/java/org/isoron/uhabits/widgets/StreakWidgetProvider.java b/app/src/main/java/org/isoron/uhabits/widgets/StreakWidgetProvider.java index 4a4bd84ca..c125654d2 100644 --- a/app/src/main/java/org/isoron/uhabits/widgets/StreakWidgetProvider.java +++ b/app/src/main/java/org/isoron/uhabits/widgets/StreakWidgetProvider.java @@ -19,7 +19,6 @@ 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.HabitStreakView; @@ -27,20 +26,11 @@ import org.isoron.uhabits.views.HabitStreakView; public class StreakWidgetProvider extends BaseWidgetProvider { @Override - protected View buildCustomView(Context context, int maxHeight, int maxWidth, Habit habit) + protected View buildCustomView(Context context, Habit habit) { HabitStreakView view = new HabitStreakView(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; } diff --git a/app/src/main/res/layout/widget_checkmark.xml b/app/src/main/res/layout/widget_checkmark.xml index 90ddbbb4d..40205476c 100644 --- a/app/src/main/res/layout/widget_checkmark.xml +++ b/app/src/main/res/layout/widget_checkmark.xml @@ -5,7 +5,7 @@ android:layout_height="match_parent" android:gravity="center" android:orientation="vertical" - android:padding="4dp"> + android:padding="0dp"> + android:paddingBottom="0dp" + android:paddingLeft="8dp" + android:paddingRight="8dp"> Date: Wed, 2 Mar 2016 10:39:13 -0500 Subject: [PATCH 40/57] Minor style changes --- .../isoron/uhabits/views/HabitHistoryView.java | 8 +++----- .../org/isoron/uhabits/views/HabitScoreView.java | 16 +++++++++------- .../isoron/uhabits/views/HabitStreakView.java | 2 +- app/src/main/res/drawable/widget_background.xml | 2 +- app/src/main/res/layout/show_habit.xml | 2 +- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java b/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java index a5f11b5e3..4d841b824 100644 --- a/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java +++ b/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java @@ -123,7 +123,7 @@ public class HabitHistoryView extends ScrollableDataView columnHeight = 8 * baseSize; nColumns = width / baseSize; - squareSpacing = baseSize / 10; + squareSpacing = (int) Math.floor(baseSize / 15.0); pSquareFg.setTextSize(baseSize * 0.5f); pTextHeader.setTextSize(baseSize * 0.5f); squareTextOffset = pSquareFg.getFontSpacing() * 0.4f; @@ -138,9 +138,7 @@ public class HabitHistoryView extends ScrollableDataView this.primaryColor = habit.color; if(isBackgroundTransparent) - { primaryColor = ColorHelper.setMinValue(primaryColor, 0.75f); - } int red = Color.red(primaryColor); int green = Color.green(primaryColor); @@ -149,7 +147,7 @@ public class HabitHistoryView extends ScrollableDataView if(isBackgroundTransparent) { colors = new int[3]; - colors[0] = Color.argb(64, 0, 0, 0); + colors[0] = Color.argb(16, 255, 255, 255); colors[1] = Color.argb(128, red, green, blue); colors[2] = primaryColor; textColor = Color.rgb(255, 255, 255); @@ -160,7 +158,7 @@ public class HabitHistoryView extends ScrollableDataView colors[0] = Color.argb(25, 0, 0, 0); colors[1] = Color.argb(127, red, green, blue); colors[2] = primaryColor; - textColor = Color.argb(128, 0, 0, 0); + textColor = Color.argb(64, 0, 0, 0); } } 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 d24e0061d..3405342aa 100644 --- a/app/src/main/java/org/isoron/uhabits/views/HabitScoreView.java +++ b/app/src/main/java/org/isoron/uhabits/views/HabitScoreView.java @@ -94,21 +94,18 @@ public class HabitScoreView extends ScrollableDataView if(habit != null) this.primaryColor = habit.color; - if(isBackgroundTransparent) + if (isBackgroundTransparent) { primaryColor = ColorHelper.setSaturation(primaryColor, 0.75f); primaryColor = ColorHelper.setValue(primaryColor, 1.0f); - } - if(isBackgroundTransparent) - { textColor = Color.argb(192, 255, 255, 255); dimmedTextColor = Color.argb(128, 255, 255, 255); } else { - textColor = Color.argb(128, 0, 0, 0); - dimmedTextColor = Color.argb(32, 0, 0, 0); + textColor = Color.argb(64, 0, 0, 0); + dimmedTextColor = Color.argb(16, 0, 0, 0); } colors = new int[4]; @@ -122,12 +119,12 @@ public class HabitScoreView extends ScrollableDataView protected void createPaints() { pText = new Paint(); - pText.setTextAlign(Paint.Align.LEFT); pText.setAntiAlias(true); pGraph = new Paint(); pGraph.setTextAlign(Paint.Align.CENTER); pGraph.setAntiAlias(true); + pGrid = new Paint(); pGrid.setAntiAlias(true); } @@ -204,6 +201,7 @@ public class HabitScoreView extends ScrollableDataView String previousMonth = ""; + pText.setTextAlign(Paint.Align.CENTER); pText.setColor(textColor); pGraph.setColor(primaryColor); prevRect.setEmpty(); @@ -240,6 +238,7 @@ public class HabitScoreView extends ScrollableDataView rect.set(0, 0, columnWidth, columnHeight); rect.offset(k * columnWidth, 0); + if (!month.equals(previousMonth)) canvas.drawText(month, rect.centerX(), rect.bottom + lineHeight * 1.2f, pText); else @@ -255,7 +254,10 @@ public class HabitScoreView extends ScrollableDataView int nRows = 5; float rowHeight = rGrid.height() / nRows; + pText.setTextAlign(Paint.Align.LEFT); + pText.setColor(textColor); pGrid.setColor(dimmedTextColor); + for (int i = 0; i < nRows; i++) { canvas.drawText(String.format("%d%%", (100 - i * 100 / nRows)), rGrid.left + 0.5f * em, diff --git a/app/src/main/java/org/isoron/uhabits/views/HabitStreakView.java b/app/src/main/java/org/isoron/uhabits/views/HabitStreakView.java index 3869d268e..646ead665 100644 --- a/app/src/main/java/org/isoron/uhabits/views/HabitStreakView.java +++ b/app/src/main/java/org/isoron/uhabits/views/HabitStreakView.java @@ -138,7 +138,7 @@ public class HabitStreakView extends ScrollableDataView colors[2] = Color.argb(192, red, green, blue); colors[1] = Color.argb(96, red, green, blue); colors[0] = Color.argb(32, 0, 0, 0); - textColor = Color.argb(128, 0, 0, 0); + textColor = Color.argb(64, 0, 0, 0); pBarText = pBar; } } diff --git a/app/src/main/res/drawable/widget_background.xml b/app/src/main/res/drawable/widget_background.xml index 97de8bee1..1c66dd34c 100644 --- a/app/src/main/res/drawable/widget_background.xml +++ b/app/src/main/res/drawable/widget_background.xml @@ -3,5 +3,5 @@ android:shape="rectangle"> - + \ No newline at end of file diff --git a/app/src/main/res/layout/show_habit.xml b/app/src/main/res/layout/show_habit.xml index aff070c78..2bb897c04 100644 --- a/app/src/main/res/layout/show_habit.xml +++ b/app/src/main/res/layout/show_habit.xml @@ -57,7 +57,7 @@ + android:layout_height="160dp"/> From 8acbc6391448a371ed248bc92751d26f88bf1fa2 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Thu, 3 Mar 2016 04:42:40 -0500 Subject: [PATCH 41/57] Move commands to their own files --- .../uhabits/commands/CreateHabitCommand.java | 66 ++++++++++ .../uhabits/commands/EditHabitCommand.java | 75 +++++++++++ .../commands/ToggleRepetitionCommand.java | 44 +++++++ .../uhabits/fragments/EditHabitFragment.java | 6 +- .../uhabits/fragments/ListHabitsFragment.java | 3 +- .../java/org/isoron/uhabits/models/Habit.java | 121 ------------------ 6 files changed, 191 insertions(+), 124 deletions(-) create mode 100644 app/src/main/java/org/isoron/uhabits/commands/CreateHabitCommand.java create mode 100644 app/src/main/java/org/isoron/uhabits/commands/EditHabitCommand.java create mode 100644 app/src/main/java/org/isoron/uhabits/commands/ToggleRepetitionCommand.java diff --git a/app/src/main/java/org/isoron/uhabits/commands/CreateHabitCommand.java b/app/src/main/java/org/isoron/uhabits/commands/CreateHabitCommand.java new file mode 100644 index 000000000..aa758cbb7 --- /dev/null +++ b/app/src/main/java/org/isoron/uhabits/commands/CreateHabitCommand.java @@ -0,0 +1,66 @@ +/* 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.commands; + +import org.isoron.helpers.Command; +import org.isoron.uhabits.R; +import org.isoron.uhabits.models.Habit; + +public class CreateHabitCommand extends Command +{ + private Habit model; + private Long savedId; + + public CreateHabitCommand(Habit model) + { + this.model = model; + } + + @Override + public void execute() + { + Habit savedHabit = new Habit(model); + if (savedId == null) + { + savedHabit.save(); + savedId = savedHabit.getId(); + } + else + { + savedHabit.save(savedId); + } + } + + @Override + public void undo() + { + Habit.get(savedId).delete(); + } + + @Override + public Integer getExecuteStringId() + { + return R.string.toast_habit_created; + } + + @Override + public Integer getUndoStringId() + { + return R.string.toast_habit_deleted; + } + +} \ No newline at end of file diff --git a/app/src/main/java/org/isoron/uhabits/commands/EditHabitCommand.java b/app/src/main/java/org/isoron/uhabits/commands/EditHabitCommand.java new file mode 100644 index 000000000..f70a841b4 --- /dev/null +++ b/app/src/main/java/org/isoron/uhabits/commands/EditHabitCommand.java @@ -0,0 +1,75 @@ +/* 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.commands; + +import org.isoron.helpers.Command; +import org.isoron.uhabits.R; +import org.isoron.uhabits.models.Habit; + +public class EditHabitCommand extends Command +{ + private Habit original; + private Habit modified; + private long savedId; + private boolean hasIntervalChanged; + + public EditHabitCommand(Habit original, Habit modified) + { + this.savedId = original.getId(); + this.modified = new Habit(modified); + this.original = new Habit(original); + + hasIntervalChanged = (this.original.freqDen != this.modified.freqDen || + this.original.freqNum != this.modified.freqNum); + } + + public void execute() + { + Habit habit = Habit.get(savedId); + habit.copyAttributes(modified); + habit.save(); + if (hasIntervalChanged) + { + habit.deleteCheckmarksNewerThan(0); + habit.deleteStreaksNewerThan(0); + habit.deleteScoresNewerThan(0); + } + } + + public void undo() + { + Habit habit = Habit.get(savedId); + habit.copyAttributes(original); + habit.save(); + if (hasIntervalChanged) + { + habit.deleteCheckmarksNewerThan(0); + habit.deleteStreaksNewerThan(0); + habit.deleteScoresNewerThan(0); + } + } + + public Integer getExecuteStringId() + { + return R.string.toast_habit_changed; + } + + public Integer getUndoStringId() + { + return R.string.toast_habit_changed_back; + } +} \ No newline at end of file diff --git a/app/src/main/java/org/isoron/uhabits/commands/ToggleRepetitionCommand.java b/app/src/main/java/org/isoron/uhabits/commands/ToggleRepetitionCommand.java new file mode 100644 index 000000000..53a95438d --- /dev/null +++ b/app/src/main/java/org/isoron/uhabits/commands/ToggleRepetitionCommand.java @@ -0,0 +1,44 @@ +/* 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.commands; + +import org.isoron.helpers.Command; +import org.isoron.uhabits.models.Habit; + +public class ToggleRepetitionCommand extends Command +{ + private Long offset; + private Habit habit; + + public ToggleRepetitionCommand(Habit habit, long offset) + { + this.offset = offset; + this.habit = habit; + } + + @Override + public void execute() + { + habit.toggleRepetition(offset); + } + + @Override + public void undo() + { + execute(); + } +} \ No newline at end of file diff --git a/app/src/main/java/org/isoron/uhabits/fragments/EditHabitFragment.java b/app/src/main/java/org/isoron/uhabits/fragments/EditHabitFragment.java index 7a6745ba4..82a32d37d 100644 --- a/app/src/main/java/org/isoron/uhabits/fragments/EditHabitFragment.java +++ b/app/src/main/java/org/isoron/uhabits/fragments/EditHabitFragment.java @@ -40,6 +40,8 @@ import org.isoron.helpers.Command; import org.isoron.helpers.DateHelper; import org.isoron.helpers.DialogHelper.OnSavedListener; import org.isoron.uhabits.R; +import org.isoron.uhabits.commands.CreateHabitCommand; +import org.isoron.uhabits.commands.EditHabitCommand; import org.isoron.uhabits.dialogs.WeekdayPickerDialog; import org.isoron.uhabits.models.Habit; @@ -241,11 +243,11 @@ public class EditHabitFragment extends DialogFragment if (mode == EDIT_MODE) { - command = originalHabit.new EditCommand(modifiedHabit); + command = new EditHabitCommand(originalHabit, modifiedHabit); savedHabit = originalHabit; } - if (mode == CREATE_MODE) command = new Habit.CreateCommand(modifiedHabit); + if (mode == CREATE_MODE) command = new CreateHabitCommand(modifiedHabit); if (onSavedListener != null) onSavedListener.onSaved(command, savedHabit); 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 d435c1404..2b1df0750 100644 --- a/app/src/main/java/org/isoron/uhabits/fragments/ListHabitsFragment.java +++ b/app/src/main/java/org/isoron/uhabits/fragments/ListHabitsFragment.java @@ -69,6 +69,7 @@ import org.isoron.uhabits.R; import org.isoron.uhabits.commands.ArchiveHabitsCommand; import org.isoron.uhabits.commands.ChangeHabitColorCommand; import org.isoron.uhabits.commands.DeleteHabitsCommand; +import org.isoron.uhabits.commands.ToggleRepetitionCommand; import org.isoron.uhabits.commands.UnarchiveHabitsCommand; import org.isoron.uhabits.helpers.ReminderHelper; import org.isoron.uhabits.io.CSVExporter; @@ -545,7 +546,7 @@ public class ListHabitsFragment extends Fragment if (v.getTag(R.string.toggle_key).equals(2)) updateCheckmark(habit.color, (TextView) v, 0); else updateCheckmark(habit.color, (TextView) v, 2); - executeCommand(habit.new ToggleRepetitionCommand(timestamp), habit.getId()); + executeCommand(new ToggleRepetitionCommand(habit, timestamp), habit.getId()); } private void executeCommand(Command c, Long refreshKey) diff --git a/app/src/main/java/org/isoron/uhabits/models/Habit.java b/app/src/main/java/org/isoron/uhabits/models/Habit.java index 967e9367d..23cc5296f 100644 --- a/app/src/main/java/org/isoron/uhabits/models/Habit.java +++ b/app/src/main/java/org/isoron/uhabits/models/Habit.java @@ -666,125 +666,4 @@ public class Habit extends Model ActiveAndroid.endTransaction(); } } - - public static class CreateCommand extends Command - { - private Habit model; - private Long savedId; - - public CreateCommand(Habit model) - { - this.model = model; - } - - @Override - public void execute() - { - Habit savedHabit = new Habit(model); - if (savedId == null) - { - savedHabit.save(); - savedId = savedHabit.getId(); - } - else - { - savedHabit.save(savedId); - } - } - - @Override - public void undo() - { - Habit.get(savedId).delete(); - } - - @Override - public Integer getExecuteStringId() - { - return R.string.toast_habit_created; - } - - @Override - public Integer getUndoStringId() - { - return R.string.toast_habit_deleted; - } - - } - - public class EditCommand extends Command - { - private Habit original; - private Habit modified; - private long savedId; - private boolean hasIntervalChanged; - - public EditCommand(Habit modified) - { - this.savedId = getId(); - this.modified = new Habit(modified); - this.original = new Habit(Habit.this); - - hasIntervalChanged = (this.original.freqDen != this.modified.freqDen || - this.original.freqNum != this.modified.freqNum); - } - - public void execute() - { - Habit habit = Habit.get(savedId); - habit.copyAttributes(modified); - habit.save(); - if (hasIntervalChanged) - { - habit.deleteCheckmarksNewerThan(0); - habit.deleteStreaksNewerThan(0); - habit.deleteScoresNewerThan(0); - } - } - - public void undo() - { - Habit habit = Habit.get(savedId); - habit.copyAttributes(original); - habit.save(); - if (hasIntervalChanged) - { - habit.deleteCheckmarksNewerThan(0); - habit.deleteStreaksNewerThan(0); - habit.deleteScoresNewerThan(0); - } - } - - public Integer getExecuteStringId() - { - return R.string.toast_habit_changed; - } - - public Integer getUndoStringId() - { - return R.string.toast_habit_changed_back; - } - } - - public class ToggleRepetitionCommand extends Command - { - private Long offset; - - public ToggleRepetitionCommand(long offset) - { - this.offset = offset; - } - - @Override - public void execute() - { - toggleRepetition(offset); - } - - @Override - public void undo() - { - execute(); - } - } } From 51d1b93d034dccacf92ac529b5a4a44735b78999 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Thu, 3 Mar 2016 05:22:19 -0500 Subject: [PATCH 42/57] Split Habit class into several smaller classes --- .../uhabits/HabitBroadcastReceiver.java | 4 +- .../uhabits/commands/EditHabitCommand.java | 12 +- .../commands/ToggleRepetitionCommand.java | 2 +- .../uhabits/fragments/ListHabitsFragment.java | 5 +- .../uhabits/fragments/ShowHabitFragment.java | 5 +- .../org/isoron/uhabits/io/CSVExporter.java | 3 +- .../uhabits/loaders/HabitListLoader.java | 8 +- .../isoron/uhabits/models/CheckmarkList.java | 175 +++++++ .../java/org/isoron/uhabits/models/Habit.java | 453 +----------------- .../isoron/uhabits/models/RepetitionList.java | 96 ++++ .../java/org/isoron/uhabits/models/Score.java | 4 + .../org/isoron/uhabits/models/ScoreList.java | 160 +++++++ .../org/isoron/uhabits/models/StreakList.java | 127 +++++ .../isoron/uhabits/views/CheckmarkView.java | 5 +- .../uhabits/views/HabitHistoryView.java | 3 +- .../isoron/uhabits/views/HabitScoreView.java | 11 +- .../isoron/uhabits/views/HabitStreakView.java | 2 +- 17 files changed, 612 insertions(+), 463 deletions(-) create mode 100644 app/src/main/java/org/isoron/uhabits/models/CheckmarkList.java create mode 100644 app/src/main/java/org/isoron/uhabits/models/RepetitionList.java create mode 100644 app/src/main/java/org/isoron/uhabits/models/ScoreList.java create mode 100644 app/src/main/java/org/isoron/uhabits/models/StreakList.java diff --git a/app/src/main/java/org/isoron/uhabits/HabitBroadcastReceiver.java b/app/src/main/java/org/isoron/uhabits/HabitBroadcastReceiver.java index 846760e87..3942f8e52 100644 --- a/app/src/main/java/org/isoron/uhabits/HabitBroadcastReceiver.java +++ b/app/src/main/java/org/isoron/uhabits/HabitBroadcastReceiver.java @@ -100,7 +100,7 @@ public class HabitBroadcastReceiver extends BroadcastReceiver Long timestamp = intent.getLongExtra("timestamp", DateHelper.getStartOfToday()); Habit habit = Habit.get(ContentUris.parseId(data)); - habit.toggleRepetition(timestamp); + habit.repetitions.toggle(timestamp); habit.save(); dismissNotification(context, habit); @@ -137,7 +137,7 @@ public class HabitBroadcastReceiver extends BroadcastReceiver Long timestamp = intent.getLongExtra("timestamp", DateHelper.getStartOfToday()); Long reminderTime = intent.getLongExtra("reminderTime", DateHelper.getStartOfToday()); - if (habit.hasImplicitRepToday()) return; + if (habit.repetitions.hasImplicitRepToday()) return; habit.highlight = 1; habit.save(); diff --git a/app/src/main/java/org/isoron/uhabits/commands/EditHabitCommand.java b/app/src/main/java/org/isoron/uhabits/commands/EditHabitCommand.java index f70a841b4..53b4bbf1b 100644 --- a/app/src/main/java/org/isoron/uhabits/commands/EditHabitCommand.java +++ b/app/src/main/java/org/isoron/uhabits/commands/EditHabitCommand.java @@ -44,9 +44,9 @@ public class EditHabitCommand extends Command habit.save(); if (hasIntervalChanged) { - habit.deleteCheckmarksNewerThan(0); - habit.deleteStreaksNewerThan(0); - habit.deleteScoresNewerThan(0); + habit.checkmarks.deleteNewerThan(0); + habit.streaks.deleteNewerThan(0); + habit.scores.deleteNewerThan(0); } } @@ -57,9 +57,9 @@ public class EditHabitCommand extends Command habit.save(); if (hasIntervalChanged) { - habit.deleteCheckmarksNewerThan(0); - habit.deleteStreaksNewerThan(0); - habit.deleteScoresNewerThan(0); + habit.checkmarks.deleteNewerThan(0); + habit.streaks.deleteNewerThan(0); + habit.scores.deleteNewerThan(0); } } diff --git a/app/src/main/java/org/isoron/uhabits/commands/ToggleRepetitionCommand.java b/app/src/main/java/org/isoron/uhabits/commands/ToggleRepetitionCommand.java index 53a95438d..c19ff5a5d 100644 --- a/app/src/main/java/org/isoron/uhabits/commands/ToggleRepetitionCommand.java +++ b/app/src/main/java/org/isoron/uhabits/commands/ToggleRepetitionCommand.java @@ -33,7 +33,7 @@ public class ToggleRepetitionCommand extends Command @Override public void execute() { - habit.toggleRepetition(offset); + habit.repetitions.toggle(offset); } @Override 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 2b1df0750..37c0e4e13 100644 --- a/app/src/main/java/org/isoron/uhabits/fragments/ListHabitsFragment.java +++ b/app/src/main/java/org/isoron/uhabits/fragments/ListHabitsFragment.java @@ -75,6 +75,7 @@ import org.isoron.uhabits.helpers.ReminderHelper; import org.isoron.uhabits.io.CSVExporter; import org.isoron.uhabits.loaders.HabitListLoader; import org.isoron.uhabits.models.Habit; +import org.isoron.uhabits.models.Score; import java.io.File; import java.util.Date; @@ -741,12 +742,12 @@ public class ListHabitsFragment extends Fragment { int score = loader.scores.get(habit.getId()); - if (score < Habit.HALF_STAR_CUTOFF) + if (score < Score.HALF_STAR_CUTOFF) { tvStar.setText(getString(R.string.fa_star_o)); tvStar.setTextColor(INACTIVE_COLOR); } - else if (score < Habit.FULL_STAR_CUTOFF) + else if (score < Score.FULL_STAR_CUTOFF) { tvStar.setText(getString(R.string.fa_star_half_o)); tvStar.setTextColor(INACTIVE_COLOR); diff --git a/app/src/main/java/org/isoron/uhabits/fragments/ShowHabitFragment.java b/app/src/main/java/org/isoron/uhabits/fragments/ShowHabitFragment.java index de2cc311d..812f832ef 100644 --- a/app/src/main/java/org/isoron/uhabits/fragments/ShowHabitFragment.java +++ b/app/src/main/java/org/isoron/uhabits/fragments/ShowHabitFragment.java @@ -34,6 +34,7 @@ import org.isoron.uhabits.R; import org.isoron.uhabits.ShowHabitActivity; import org.isoron.uhabits.helpers.ReminderHelper; import org.isoron.uhabits.models.Habit; +import org.isoron.uhabits.models.Score; import org.isoron.uhabits.views.HabitHistoryView; import org.isoron.uhabits.views.HabitScoreView; import org.isoron.uhabits.views.HabitStreakView; @@ -58,7 +59,7 @@ public class ShowHabitFragment extends Fragment implements DialogHelper.OnSavedL activity = (ShowHabitActivity) getActivity(); habit = activity.habit; - habit.updateCheckmarks(); + habit.checkmarks.rebuild(); if (android.os.Build.VERSION.SDK_INT >= 21) { @@ -81,7 +82,7 @@ public class ShowHabitFragment extends Fragment implements DialogHelper.OnSavedL tvStreaks.setTextColor(habit.color); scoreRing.setColor(habit.color); - scoreRing.setPercentage((float) habit.getScore() / Habit.MAX_SCORE); + scoreRing.setPercentage((float) habit.scores.getNewestValue() / Score.MAX_SCORE); streakView.setHabit(habit); scoreView.setHabit(habit); historyView.setHabit(habit); diff --git a/app/src/main/java/org/isoron/uhabits/io/CSVExporter.java b/app/src/main/java/org/isoron/uhabits/io/CSVExporter.java index ee0bde879..1feb81bb2 100644 --- a/app/src/main/java/org/isoron/uhabits/io/CSVExporter.java +++ b/app/src/main/java/org/isoron/uhabits/io/CSVExporter.java @@ -8,6 +8,7 @@ import com.activeandroid.Cache; import org.isoron.helpers.DateHelper; import org.isoron.uhabits.models.Habit; +import org.isoron.uhabits.models.Score; import java.io.File; import java.io.FileInputStream; @@ -54,7 +55,7 @@ public class CSVExporter public String formatScore(int score) { - return String.format("%.2f", ((float) score) / Habit.MAX_SCORE); + return String.format("%.2f", ((float) score) / Score.MAX_SCORE); } private void writeScores(String dirPath, Habit habit) throws IOException diff --git a/app/src/main/java/org/isoron/uhabits/loaders/HabitListLoader.java b/app/src/main/java/org/isoron/uhabits/loaders/HabitListLoader.java index bd7443626..204b5e243 100644 --- a/app/src/main/java/org/isoron/uhabits/loaders/HabitListLoader.java +++ b/app/src/main/java/org/isoron/uhabits/loaders/HabitListLoader.java @@ -144,8 +144,8 @@ public class HabitListLoader if (isCancelled()) return null; Long id = h.getId(); - newScores.put(id, h.getScore()); - newCheckmarks.put(id, h.getCheckmarks(dateFrom, dateTo)); + newScores.put(id, h.scores.getNewestValue()); + newCheckmarks.put(id, h.checkmarks.getValues(dateFrom, dateTo)); publishProgress(current++, newHabits.size()); } @@ -213,8 +213,8 @@ public class HabitListLoader Habit h = Habit.get(id); habits.put(id, h); - scores.put(id, h.getScore()); - checkmarks.put(id, h.getCheckmarks(dateFrom, dateTo)); + scores.put(id, h.scores.getNewestValue()); + checkmarks.put(id, h.checkmarks.getValues(dateFrom, dateTo)); return null; } diff --git a/app/src/main/java/org/isoron/uhabits/models/CheckmarkList.java b/app/src/main/java/org/isoron/uhabits/models/CheckmarkList.java new file mode 100644 index 000000000..61187ea30 --- /dev/null +++ b/app/src/main/java/org/isoron/uhabits/models/CheckmarkList.java @@ -0,0 +1,175 @@ +/* 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.models; + +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; + +import com.activeandroid.ActiveAndroid; +import com.activeandroid.Cache; +import com.activeandroid.query.Delete; +import com.activeandroid.query.Select; + +import org.isoron.helpers.DateHelper; + +import java.util.List; + +public class CheckmarkList +{ + private Habit habit; + + public CheckmarkList(Habit habit) + { + this.habit = habit; + } + + public void deleteNewerThan(long timestamp) + { + new Delete().from(Checkmark.class) + .where("habit = ?", habit.getId()) + .and("timestamp >= ?", timestamp) + .execute(); + } + + public int[] getValues(Long fromTimestamp, Long toTimestamp) + { + rebuild(); + + if(fromTimestamp > toTimestamp) return new int[0]; + + String query = "select value, timestamp from Checkmarks where " + + "habit = ? and timestamp >= ? and timestamp <= ?"; + + SQLiteDatabase db = Cache.openDatabase(); + String args[] = { habit.getId().toString(), fromTimestamp.toString(), + toTimestamp.toString() }; + Cursor cursor = db.rawQuery(query, args); + + long day = DateHelper.millisecondsInOneDay; + int nDays = (int) ((toTimestamp - fromTimestamp) / day) + 1; + int[] checks = new int[nDays]; + + if (cursor.moveToFirst()) + { + do + { + long timestamp = cursor.getLong(1); + int offset = (int) ((timestamp - fromTimestamp) / day); + checks[nDays - offset - 1] = cursor.getInt(0); + + } while (cursor.moveToNext()); + } + + cursor.close(); + return checks; + } + + public int[] getAllValues() + { + Repetition oldestRep = habit.repetitions.getOldest(); + if(oldestRep == null) return new int[0]; + + Long toTimestamp = DateHelper.getStartOfToday(); + Long fromTimestamp = oldestRep.timestamp; + return getValues(fromTimestamp, toTimestamp); + } + + public void rebuild() + { + long beginning; + long today = DateHelper.getStartOfToday(); + long day = DateHelper.millisecondsInOneDay; + + Checkmark newestCheckmark = getNewest(); + if (newestCheckmark == null) + { + Repetition oldestRep = habit.repetitions.getOldest(); + if (oldestRep == null) return; + + beginning = oldestRep.timestamp; + } + else + { + beginning = newestCheckmark.timestamp + day; + } + + if (beginning > today) return; + + long beginningExtended = beginning - (long) (habit.freqDen) * day; + List reps = habit.repetitions.selectFromTo(beginningExtended, today).execute(); + + int nDays = (int) ((today - beginning) / day) + 1; + int nDaysExtended = (int) ((today - beginningExtended) / day) + 1; + + int checks[] = new int[nDaysExtended]; + + // explicit checks + for (Repetition rep : reps) + { + int offset = (int) ((rep.timestamp - beginningExtended) / day); + checks[nDaysExtended - offset - 1] = 2; + } + + // implicit checks + for (int i = 0; i < nDays; i++) + { + int counter = 0; + + for (int j = 0; j < habit.freqDen; j++) + if (checks[i + j] == 2) counter++; + + if (counter >= habit.freqNum) checks[i] = Math.max(checks[i], 1); + } + + ActiveAndroid.beginTransaction(); + + try + { + for (int i = 0; i < nDays; i++) + { + Checkmark c = new Checkmark(); + c.habit = habit; + c.timestamp = today - i * day; + c.value = checks[i]; + c.save(); + } + + ActiveAndroid.setTransactionSuccessful(); + } finally + { + ActiveAndroid.endTransaction(); + } + } + + public Checkmark getNewest() + { + return new Select().from(Checkmark.class) + .where("habit = ?", habit.getId()) + .orderBy("timestamp desc") + .limit(1) + .executeSingle(); + } + + public int getCurrentValue() + { + rebuild(); + Checkmark c = getNewest(); + + if(c != null) return c.value; + else return 0; + } +} diff --git a/app/src/main/java/org/isoron/uhabits/models/Habit.java b/app/src/main/java/org/isoron/uhabits/models/Habit.java index 23cc5296f..5bcc696f5 100644 --- a/app/src/main/java/org/isoron/uhabits/models/Habit.java +++ b/app/src/main/java/org/isoron/uhabits/models/Habit.java @@ -17,12 +17,9 @@ package org.isoron.uhabits.models; import android.annotation.SuppressLint; -import android.database.Cursor; -import android.database.sqlite.SQLiteDatabase; import android.net.Uri; import com.activeandroid.ActiveAndroid; -import com.activeandroid.Cache; import com.activeandroid.Model; import com.activeandroid.annotation.Column; import com.activeandroid.annotation.Table; @@ -33,21 +30,12 @@ import com.activeandroid.query.Update; import com.activeandroid.util.SQLiteUtils; import org.isoron.helpers.ColorHelper; -import org.isoron.helpers.Command; -import org.isoron.helpers.DateHelper; -import org.isoron.uhabits.R; -import java.util.ArrayList; import java.util.List; @Table(name = "Habits") public class Habit extends Model { - - public static final int HALF_STAR_CUTOFF = 9629750; - public static final int FULL_STAR_CUTOFF = 15407600; - public static final int MAX_SCORE = 19259500; - @Column(name = "name") public String name; @@ -81,20 +69,35 @@ public class Habit extends Model @Column(name = "archived") public Integer archived; + public StreakList streaks; + public ScoreList scores; + public RepetitionList repetitions; + public CheckmarkList checkmarks; + public Habit(Habit model) { copyAttributes(model); + initializeLists(); } public Habit() { this.color = ColorHelper.palette[5]; - this.position = Habit.getCount(); + this.position = Habit.count(); this.highlight = 0; this.archived = 0; this.freqDen = 7; this.freqNum = 3; this.reminderDays = 127; + initializeLists(); + } + + private void initializeLists() + { + streaks = new StreakList(this); + scores = new ScoreList(this); + repetitions = new RepetitionList(this); + checkmarks = new CheckmarkList(this); } public static Habit get(Long id) @@ -124,7 +127,7 @@ public class Habit extends Model return new Select().from(Habit.class).orderBy("position"); } - public static int getCount() + public static int count() { return select().count(); } @@ -177,7 +180,8 @@ public class Habit extends Model } ActiveAndroid.setTransactionSuccessful(); - } finally + } + finally { ActiveAndroid.endTransaction(); } @@ -205,22 +209,6 @@ public class Habit extends Model Habit.updateId(getId(), id); } - protected From selectReps() - { - return new Select().from(Repetition.class).where("habit = ?", getId()).orderBy("timestamp"); - } - - protected From selectRepsFromTo(long timeFrom, long timeTo) - { - return selectReps().and("timestamp >= ?", timeFrom).and("timestamp <= ?", timeTo); - } - - public boolean hasRep(long timestamp) - { - int count = selectReps().where("timestamp = ?", timestamp).count(); - return (count > 0); - } - public void cascadeDelete() { Long id = getId(); @@ -242,209 +230,6 @@ public class Habit extends Model } } - public void deleteReps(long timestamp) - { - new Delete().from(Repetition.class) - .where("habit = ?", getId()) - .and("timestamp = ?", timestamp) - .execute(); - } - - public void deleteCheckmarksNewerThan(long timestamp) - { - new Delete().from(Checkmark.class) - .where("habit = ?", getId()) - .and("timestamp >= ?", timestamp) - .execute(); - } - - public void deleteStreaksNewerThan(long timestamp) - { - new Delete().from(Streak.class) - .where("habit = ?", getId()) - .and("end >= ?", timestamp - DateHelper.millisecondsInOneDay) - .execute(); - } - - public int[] getCheckmarks(Long fromTimestamp, Long toTimestamp) - { - updateCheckmarks(); - - if(fromTimestamp > toTimestamp) return new int[0]; - - String query = "select value, timestamp from Checkmarks where " + - "habit = ? and timestamp >= ? and timestamp <= ?"; - - SQLiteDatabase db = Cache.openDatabase(); - String args[] = {getId().toString(), fromTimestamp.toString(), toTimestamp.toString()}; - Cursor cursor = db.rawQuery(query, args); - - long day = DateHelper.millisecondsInOneDay; - int nDays = (int) ((toTimestamp - fromTimestamp) / day) + 1; - int[] checks = new int[nDays]; - - if (cursor.moveToFirst()) - { - do - { - long timestamp = cursor.getLong(1); - int offset = (int) ((timestamp - fromTimestamp) / day); - checks[nDays - offset - 1] = cursor.getInt(0); - - } while (cursor.moveToNext()); - } - - cursor.close(); - return checks; - } - - public int[] getAllCheckmarks() - { - Repetition oldestRep = getOldestRep(); - if(oldestRep == null) return new int[0]; - - Long toTimestamp = DateHelper.getStartOfToday(); - Long fromTimestamp = oldestRep.timestamp; - return getCheckmarks(fromTimestamp, toTimestamp); - } - - public void updateCheckmarks() - { - long beginning; - long today = DateHelper.getStartOfToday(); - long day = DateHelper.millisecondsInOneDay; - - Checkmark newestCheckmark = getNewestCheckmark(); - if (newestCheckmark == null) - { - Repetition oldestRep = getOldestRep(); - if (oldestRep == null) return; - - beginning = oldestRep.timestamp; - } - else - { - beginning = newestCheckmark.timestamp + day; - } - - if (beginning > today) return; - - long beginningExtended = beginning - (long) (freqDen) * day; - List reps = selectRepsFromTo(beginningExtended, today).execute(); - - int nDays = (int) ((today - beginning) / day) + 1; - int nDaysExtended = (int) ((today - beginningExtended) / day) + 1; - - int checks[] = new int[nDaysExtended]; - - // explicit checks - for (Repetition rep : reps) - { - int offset = (int) ((rep.timestamp - beginningExtended) / day); - checks[nDaysExtended - offset - 1] = 2; - } - - // implicit checks - for (int i = 0; i < nDays; i++) - { - int counter = 0; - - for (int j = 0; j < freqDen; j++) - if (checks[i + j] == 2) counter++; - - if (counter >= freqNum) checks[i] = Math.max(checks[i], 1); - } - - ActiveAndroid.beginTransaction(); - - try - { - for (int i = 0; i < nDays; i++) - { - Checkmark c = new Checkmark(); - c.habit = this; - c.timestamp = today - i * day; - c.value = checks[i]; - c.save(); - } - - ActiveAndroid.setTransactionSuccessful(); - } finally - { - ActiveAndroid.endTransaction(); - } - } - - public Checkmark getNewestCheckmark() - { - return new Select().from(Checkmark.class) - .where("habit = ?", getId()) - .orderBy("timestamp desc") - .limit(1) - .executeSingle(); - } - - public int getCurrentCheckmarkStatus() - { - updateCheckmarks(); - Checkmark c = getNewestCheckmark(); - - if(c != null) return c.value; - else return 0; - } - - public int getCurrentStarStatus() - { - int score = getScore(); - - if(score >= FULL_STAR_CUTOFF) return 2; - else if(score >= HALF_STAR_CUTOFF) return 1; - else return 0; - } - - public int getRepsCount(int days) - { - long timeTo = DateHelper.getStartOfToday(); - long timeFrom = timeTo - DateHelper.millisecondsInOneDay * days; - return selectRepsFromTo(timeFrom, timeTo).count(); - } - - public boolean hasImplicitRepToday() - { - long today = DateHelper.getStartOfToday(); - int reps[] = getCheckmarks(today - DateHelper.millisecondsInOneDay, today); - return (reps[0] > 0); - } - - public Repetition getOldestRep() - { - return (Repetition) selectReps().limit(1).executeSingle(); - } - - public Repetition getOldestRepNewerThan(long timestamp) - { - return selectReps().where("timestamp > ?", timestamp).limit(1).executeSingle(); - } - - public void toggleRepetition(long timestamp) - { - if (hasRep(timestamp)) - { - deleteReps(timestamp); - } - else - { - Repetition rep = new Repetition(); - rep.habit = this; - rep.timestamp = timestamp; - rep.save(); - } - - deleteScoresNewerThan(timestamp); - deleteCheckmarksNewerThan(timestamp); - deleteStreaksNewerThan(timestamp); - } - public Uri getUri() { return Uri.parse(String.format("content://org.isoron.uhabits/habit/%d", getId())); @@ -466,204 +251,4 @@ public class Habit extends Model { return archived != 0; } - - public void toggleRepetitionToday() - { - toggleRepetition(DateHelper.getStartOfToday()); - } - - public Score getNewestScore() - { - return new Select().from(Score.class) - .where("habit = ?", getId()) - .orderBy("timestamp desc") - .limit(1) - .executeSingle(); - } - - public void deleteScoresNewerThan(long timestamp) - { - new Delete().from(Score.class) - .where("habit = ?", getId()) - .and("timestamp >= ?", timestamp) - .execute(); - } - - public Integer getScore() - { - int beginningScore; - long beginningTime; - - long today = DateHelper.getStartOfDay(DateHelper.getLocalTime()); - long day = DateHelper.millisecondsInOneDay; - - double freq = ((double) freqNum) / freqDen; - double multiplier = Math.pow(0.5, 1.0 / (14.0 / freq - 1)); - - Score newestScore = getNewestScore(); - if (newestScore == null) - { - Repetition oldestRep = getOldestRep(); - if (oldestRep == null) return 0; - beginningTime = oldestRep.timestamp; - beginningScore = 0; - } - else - { - beginningTime = newestScore.timestamp + day; - beginningScore = newestScore.score; - } - - long nDays = (today - beginningTime) / day; - if (nDays < 0) return newestScore.score; - - int reps[] = getCheckmarks(beginningTime, today); - - ActiveAndroid.beginTransaction(); - int lastScore = beginningScore; - - try - { - for (int i = 0; i < reps.length; i++) - { - Score s = new Score(); - s.habit = this; - s.timestamp = beginningTime + day * i; - s.score = (int) (lastScore * multiplier); - if (reps[reps.length - i - 1] == 2) - { - s.score += 1000000; - s.score = Math.min(s.score, MAX_SCORE); - } - s.save(); - - lastScore = s.score; - } - - ActiveAndroid.setTransactionSuccessful(); - } finally - { - ActiveAndroid.endTransaction(); - } - - return lastScore; - } - - public int[] getScores(Long fromTimestamp, Long toTimestamp, Integer divisor, Long offset) - { - String query = "select score from Score where habit = ? and timestamp > ? and " + - "timestamp <= ? and (timestamp - ?) % ? = 0 order by timestamp desc"; - - String params[] = {getId().toString(), fromTimestamp.toString(), toTimestamp.toString(), - offset.toString(), divisor.toString()}; - - SQLiteDatabase db = Cache.openDatabase(); - Cursor cursor = db.rawQuery(query, params); - - if(!cursor.moveToFirst()) return new int[0]; - - int k = 0; - int[] scores = new int[cursor.getCount()]; - - do - { - scores[k++] = cursor.getInt(0); - } - while (cursor.moveToNext()); - - cursor.close(); - return scores; - - } - - public int[] getAllScores(int divisor) - { - Repetition oldestRep = getOldestRep(); - if(oldestRep == null) return new int[0]; - - long fromTimestamp = oldestRep.timestamp; - long toTimestamp = DateHelper.getStartOfToday(); - return getScores(fromTimestamp, toTimestamp, divisor, toTimestamp); - } - - public List getStreaks() - { - updateStreaks(); - - return new Select().from(Streak.class) - .where("habit = ?", getId()) - .orderBy("end asc") - .execute(); - } - - public Streak getNewestStreak() - { - return new Select().from(Streak.class) - .where("habit = ?", getId()) - .orderBy("end desc") - .limit(1) - .executeSingle(); - } - - public void updateStreaks() - { - long beginning; - long today = DateHelper.getStartOfToday(); - long day = DateHelper.millisecondsInOneDay; - - Streak newestStreak = getNewestStreak(); - if (newestStreak == null) - { - Repetition oldestRep = getOldestRep(); - if (oldestRep == null) return; - - beginning = oldestRep.timestamp; - } - else - { - Repetition oldestRep = getOldestRepNewerThan(newestStreak.end); - if (oldestRep == null) return; - - beginning = oldestRep.timestamp; - } - - if (beginning > today) return; - - int checks[] = getCheckmarks(beginning, today); - ArrayList list = new ArrayList<>(); - - long current = beginning; - list.add(current); - - for (int i = 1; i < checks.length; i++) - { - current += day; - int j = checks.length - i - 1; - - if ((checks[j + 1] == 0 && checks[j] > 0)) list.add(current); - if ((checks[j + 1] > 0 && checks[j] == 0)) list.add(current - day); - } - - if (list.size() % 2 == 1) list.add(current); - - ActiveAndroid.beginTransaction(); - - try - { - for (int i = 0; i < list.size(); i += 2) - { - Streak streak = new Streak(); - streak.habit = this; - streak.start = list.get(i); - streak.end = list.get(i + 1); - streak.length = (streak.end - streak.start) / day + 1; - streak.save(); - } - - ActiveAndroid.setTransactionSuccessful(); - } finally - { - ActiveAndroid.endTransaction(); - } - } } diff --git a/app/src/main/java/org/isoron/uhabits/models/RepetitionList.java b/app/src/main/java/org/isoron/uhabits/models/RepetitionList.java new file mode 100644 index 000000000..6828101ab --- /dev/null +++ b/app/src/main/java/org/isoron/uhabits/models/RepetitionList.java @@ -0,0 +1,96 @@ +/* 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.models; + +import com.activeandroid.query.Delete; +import com.activeandroid.query.From; +import com.activeandroid.query.Select; + +import org.isoron.helpers.DateHelper; + +public class RepetitionList +{ + + private Habit habit; + + public RepetitionList(Habit habit) + { + this.habit = habit; + } + + protected From select() + { + return new Select().from(Repetition.class) + .where("habit = ?", habit.getId()) + .orderBy("timestamp"); + } + + protected From selectFromTo(long timeFrom, long timeTo) + { + return select().and("timestamp >= ?", timeFrom).and("timestamp <= ?", timeTo); + } + + public boolean contains(long timestamp) + { + int count = select().where("timestamp = ?", timestamp).count(); + return (count > 0); + } + + public void delete(long timestamp) + { + new Delete().from(Repetition.class) + .where("habit = ?", habit.getId()) + .and("timestamp = ?", timestamp) + .execute(); + } + + public Repetition getOldestNewerThan(long timestamp) + { + return select().where("timestamp > ?", timestamp).limit(1).executeSingle(); + } + + public void toggle(long timestamp) + { + if (contains(timestamp)) + { + delete(timestamp); + } + else + { + Repetition rep = new Repetition(); + rep.habit = habit; + rep.timestamp = timestamp; + rep.save(); + } + + habit.scores.deleteNewerThan(timestamp); + habit.checkmarks.deleteNewerThan(timestamp); + habit.streaks.deleteNewerThan(timestamp); + } + + public Repetition getOldest() + { + return (Repetition) select().limit(1).executeSingle(); + } + + public boolean hasImplicitRepToday() + { + long today = DateHelper.getStartOfToday(); + int reps[] = habit.checkmarks.getValues(today - DateHelper.millisecondsInOneDay, today); + return (reps[0] > 0); + } +} diff --git a/app/src/main/java/org/isoron/uhabits/models/Score.java b/app/src/main/java/org/isoron/uhabits/models/Score.java index 33f1723cc..44af97588 100644 --- a/app/src/main/java/org/isoron/uhabits/models/Score.java +++ b/app/src/main/java/org/isoron/uhabits/models/Score.java @@ -23,6 +23,10 @@ import com.activeandroid.annotation.Table; @Table(name = "Score") public class Score extends Model { + public static final int HALF_STAR_CUTOFF = 9629750; + public static final int FULL_STAR_CUTOFF = 15407600; + public static final int MAX_SCORE = 19259500; + @Column(name = "habit") public Habit habit; diff --git a/app/src/main/java/org/isoron/uhabits/models/ScoreList.java b/app/src/main/java/org/isoron/uhabits/models/ScoreList.java new file mode 100644 index 000000000..95b3c72db --- /dev/null +++ b/app/src/main/java/org/isoron/uhabits/models/ScoreList.java @@ -0,0 +1,160 @@ +/* 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.models; + +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; + +import com.activeandroid.ActiveAndroid; +import com.activeandroid.Cache; +import com.activeandroid.query.Delete; +import com.activeandroid.query.Select; + +import org.isoron.helpers.DateHelper; + +public class ScoreList +{ + private Habit habit; + + public ScoreList(Habit habit) + { + this.habit = habit; + } + + public int getCurrentStarStatus() + { + int score = getNewestValue(); + + if(score >= Score.FULL_STAR_CUTOFF) return 2; + else if(score >= Score.HALF_STAR_CUTOFF) return 1; + else return 0; + } + + public Score getNewest() + { + return new Select().from(Score.class) + .where("habit = ?", habit.getId()) + .orderBy("timestamp desc") + .limit(1) + .executeSingle(); + } + + public void deleteNewerThan(long timestamp) + { + new Delete().from(Score.class) + .where("habit = ?", habit.getId()) + .and("timestamp >= ?", timestamp) + .execute(); + } + + public Integer getNewestValue() + { + int beginningScore; + long beginningTime; + + long today = DateHelper.getStartOfDay(DateHelper.getLocalTime()); + long day = DateHelper.millisecondsInOneDay; + + double freq = ((double) habit.freqNum) / habit.freqDen; + double multiplier = Math.pow(0.5, 1.0 / (14.0 / freq - 1)); + + Score newestScore = getNewest(); + if (newestScore == null) + { + Repetition oldestRep = habit.repetitions.getOldest(); + if (oldestRep == null) return 0; + beginningTime = oldestRep.timestamp; + beginningScore = 0; + } + else + { + beginningTime = newestScore.timestamp + day; + beginningScore = newestScore.score; + } + + long nDays = (today - beginningTime) / day; + if (nDays < 0) return newestScore.score; + + int reps[] = habit.checkmarks.getValues(beginningTime, today); + + ActiveAndroid.beginTransaction(); + int lastScore = beginningScore; + + try + { + for (int i = 0; i < reps.length; i++) + { + Score s = new Score(); + s.habit = habit; + s.timestamp = beginningTime + day * i; + s.score = (int) (lastScore * multiplier); + if (reps[reps.length - i - 1] == 2) + { + s.score += 1000000; + s.score = Math.min(s.score, Score.MAX_SCORE); + } + s.save(); + + lastScore = s.score; + } + + ActiveAndroid.setTransactionSuccessful(); + } finally + { + ActiveAndroid.endTransaction(); + } + + return lastScore; + } + + public int[] getAllValues(Long fromTimestamp, Long toTimestamp, Integer divisor, Long offset) + { + String query = "select score from Score where habit = ? and timestamp > ? and " + + "timestamp <= ? and (timestamp - ?) % ? = 0 order by timestamp desc"; + + String params[] = { habit.getId().toString(), fromTimestamp.toString(), + toTimestamp.toString(), offset.toString(), divisor.toString()}; + + SQLiteDatabase db = Cache.openDatabase(); + Cursor cursor = db.rawQuery(query, params); + + if(!cursor.moveToFirst()) return new int[0]; + + int k = 0; + int[] scores = new int[cursor.getCount()]; + + do + { + scores[k++] = cursor.getInt(0); + } + while (cursor.moveToNext()); + + cursor.close(); + return scores; + + } + + public int[] getAllValues(int divisor) + { + Repetition oldestRep = habit.repetitions.getOldest(); + if(oldestRep == null) return new int[0]; + + long fromTimestamp = oldestRep.timestamp; + long toTimestamp = DateHelper.getStartOfToday(); + return getAllValues(fromTimestamp, toTimestamp, divisor, toTimestamp); + } +} diff --git a/app/src/main/java/org/isoron/uhabits/models/StreakList.java b/app/src/main/java/org/isoron/uhabits/models/StreakList.java new file mode 100644 index 000000000..9459acab0 --- /dev/null +++ b/app/src/main/java/org/isoron/uhabits/models/StreakList.java @@ -0,0 +1,127 @@ +/* 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.models; + +import com.activeandroid.ActiveAndroid; +import com.activeandroid.query.Delete; +import com.activeandroid.query.Select; + +import org.isoron.helpers.DateHelper; + +import java.util.ArrayList; +import java.util.List; + +public class StreakList +{ + private Habit habit; + + public StreakList(Habit habit) + { + this.habit = habit; + } + + public List getAll() + { + rebuild(); + + return new Select().from(Streak.class) + .where("habit = ?", habit.getId()) + .orderBy("end asc") + .execute(); + } + + public Streak getNewest() + { + return new Select().from(Streak.class) + .where("habit = ?", habit.getId()) + .orderBy("end desc") + .limit(1) + .executeSingle(); + } + + public void rebuild() + { + long beginning; + long today = DateHelper.getStartOfToday(); + long day = DateHelper.millisecondsInOneDay; + + Streak newestStreak = getNewest(); + if (newestStreak == null) + { + Repetition oldestRep = habit.repetitions.getOldest(); + if (oldestRep == null) return; + + beginning = oldestRep.timestamp; + } + else + { + Repetition oldestRep = habit.repetitions.getOldestNewerThan(newestStreak.end); + if (oldestRep == null) return; + + beginning = oldestRep.timestamp; + } + + if (beginning > today) return; + + int checks[] = habit.checkmarks.getValues(beginning, today); + ArrayList list = new ArrayList<>(); + + long current = beginning; + list.add(current); + + for (int i = 1; i < checks.length; i++) + { + current += day; + int j = checks.length - i - 1; + + if ((checks[j + 1] == 0 && checks[j] > 0)) list.add(current); + if ((checks[j + 1] > 0 && checks[j] == 0)) list.add(current - day); + } + + if (list.size() % 2 == 1) list.add(current); + + ActiveAndroid.beginTransaction(); + + try + { + for (int i = 0; i < list.size(); i += 2) + { + Streak streak = new Streak(); + streak.habit = habit; + streak.start = list.get(i); + streak.end = list.get(i + 1); + streak.length = (streak.end - streak.start) / day + 1; + streak.save(); + } + + ActiveAndroid.setTransactionSuccessful(); + } + finally + { + ActiveAndroid.endTransaction(); + } + } + + + public void deleteNewerThan(long timestamp) + { + new Delete().from(Streak.class) + .where("habit = ?", habit.getId()) + .and("end >= ?", timestamp - DateHelper.millisecondsInOneDay) + .execute(); + } +} diff --git a/app/src/main/java/org/isoron/uhabits/views/CheckmarkView.java b/app/src/main/java/org/isoron/uhabits/views/CheckmarkView.java index e44096bce..223217aad 100644 --- a/app/src/main/java/org/isoron/uhabits/views/CheckmarkView.java +++ b/app/src/main/java/org/isoron/uhabits/views/CheckmarkView.java @@ -27,7 +27,6 @@ import android.text.Layout; import android.text.StaticLayout; import android.text.TextPaint; import android.util.AttributeSet; -import android.util.Log; import android.view.View; import org.isoron.helpers.ColorHelper; @@ -112,8 +111,8 @@ public class CheckmarkView extends View public void setHabit(Habit habit) { - this.check_status = habit.getCurrentCheckmarkStatus(); - this.star_status = habit.getCurrentStarStatus(); + this.check_status = habit.checkmarks.getCurrentValue(); + this.star_status = habit.scores.getCurrentStarStatus(); this.primaryColor = Color.argb(230, Color.red(habit.color), Color.green(habit.color), Color.blue(habit.color)); this.label = habit.name; updateLabel(); diff --git a/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java b/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java index 4d841b824..d99ba765b 100644 --- a/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java +++ b/app/src/main/java/org/isoron/uhabits/views/HabitHistoryView.java @@ -23,7 +23,6 @@ import android.graphics.Paint; import android.graphics.Paint.Align; import android.graphics.Rect; import android.util.AttributeSet; -import android.util.Log; import org.isoron.helpers.ColorHelper; import org.isoron.helpers.DateHelper; @@ -189,7 +188,7 @@ public class HabitHistoryView extends ScrollableDataView return; } - checkmarks = habit.getAllCheckmarks(); + checkmarks = habit.checkmarks.getAllValues(); } updateDate(); 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 3405342aa..248341059 100644 --- a/app/src/main/java/org/isoron/uhabits/views/HabitScoreView.java +++ b/app/src/main/java/org/isoron/uhabits/views/HabitScoreView.java @@ -28,6 +28,7 @@ import android.util.AttributeSet; import org.isoron.helpers.ColorHelper; import org.isoron.helpers.DateHelper; import org.isoron.uhabits.models.Habit; +import org.isoron.uhabits.models.Score; import java.text.SimpleDateFormat; import java.util.Locale; @@ -168,7 +169,7 @@ public class HabitScoreView extends ScrollableDataView return; } - scores = habit.getAllScores(BUCKET_SIZE * DateHelper.millisecondsInOneDay); + scores = habit.scores.getAllValues(BUCKET_SIZE * DateHelper.millisecondsInOneDay); } } @@ -177,13 +178,13 @@ public class HabitScoreView extends ScrollableDataView { Random random = new Random(); scores = new int[100]; - scores[0] = Habit.MAX_SCORE / 2; + scores[0] = Score.MAX_SCORE / 2; for(int i = 1; i < 100; i++) { - int step = Habit.MAX_SCORE / 10; + int step = Score.MAX_SCORE / 10; scores[i] = scores[i - 1] + random.nextInt(step * 2) - step; - scores[i] = Math.max(0, Math.min(Habit.MAX_SCORE, scores[i])); + scores[i] = Math.max(0, Math.min(Score.MAX_SCORE, scores[i])); } } @@ -220,7 +221,7 @@ public class HabitScoreView extends ScrollableDataView int offset = nColumns - k - 1 + getDataOffset(); if(offset < scores.length) score = scores[offset]; - double sRelative = ((double) score) / Habit.MAX_SCORE; + double sRelative = ((double) score) / Score.MAX_SCORE; int height = (int) (columnHeight * sRelative); rect.set(0, 0, baseSize, baseSize); diff --git a/app/src/main/java/org/isoron/uhabits/views/HabitStreakView.java b/app/src/main/java/org/isoron/uhabits/views/HabitStreakView.java index 646ead665..5872d96c9 100644 --- a/app/src/main/java/org/isoron/uhabits/views/HabitStreakView.java +++ b/app/src/main/java/org/isoron/uhabits/views/HabitStreakView.java @@ -166,7 +166,7 @@ public class HabitStreakView extends ScrollableDataView return; } - List streaks = habit.getStreaks(); + List streaks = habit.streaks.getAll(); int size = streaks.size(); startTimes = new long[size]; From 39e29dabb81df44400f1129e5fa96448a9f345f8 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Thu, 3 Mar 2016 06:35:37 -0500 Subject: [PATCH 43/57] Add code to save widget preview to file --- .../uhabits/widgets/BaseWidgetProvider.java | 41 ++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/isoron/uhabits/widgets/BaseWidgetProvider.java b/app/src/main/java/org/isoron/uhabits/widgets/BaseWidgetProvider.java index 66d4f5057..d890ea1b3 100644 --- a/app/src/main/java/org/isoron/uhabits/widgets/BaseWidgetProvider.java +++ b/app/src/main/java/org/isoron/uhabits/widgets/BaseWidgetProvider.java @@ -21,19 +21,25 @@ import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProvider; import android.content.Context; import android.content.SharedPreferences; -import android.content.res.Configuration; import android.graphics.Bitmap; +import android.media.Image; import android.os.Build; import android.os.Bundle; import android.preference.PreferenceManager; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; +import android.widget.ImageView; +import android.widget.LinearLayout; import android.widget.RemoteViews; import org.isoron.helpers.DialogHelper; import org.isoron.uhabits.R; import org.isoron.uhabits.models.Habit; +import java.io.FileOutputStream; +import java.io.IOException; + public abstract class BaseWidgetProvider extends AppWidgetProvider { @@ -107,12 +113,45 @@ public abstract class BaseWidgetProvider extends AppWidgetProvider remoteViews.setTextViewText(R.id.label, habit.name); remoteViews.setImageViewBitmap(R.id.imageView, drawingCache); + //savePreview(context, widgetId, drawingCache); + PendingIntent onClickIntent = getOnClickPendingIntent(context, habit); if(onClickIntent != null) remoteViews.setOnClickPendingIntent(R.id.imageView, onClickIntent); manager.updateAppWidget(widgetId, remoteViews); } + private void savePreview(Context context, int widgetId, Bitmap widgetCache) + { + try + { + LayoutInflater inflater = LayoutInflater.from(context); + View view = inflater.inflate(getLayoutId(), null); + + ImageView iv = (ImageView) view.findViewById(R.id.imageView); + iv.setImageBitmap(widgetCache); + + view.measure(width, height); + view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight()); + view.setDrawingCacheEnabled(true); + view.buildDrawingCache(); + Bitmap previewCache = view.getDrawingCache(); + + String filename = String.format("%s/%d.png", context.getExternalCacheDir(), widgetId); + Log.d("BaseWidgetProvider", String.format("Writing %s", filename)); + FileOutputStream out = new FileOutputStream(filename); + + if(previewCache != null) + previewCache.compress(Bitmap.CompressFormat.PNG, 100, out); + + out.close(); + } + catch (IOException e) + { + e.printStackTrace(); + } + } + private void updateWidgetSize(Context context, Bundle options) { int maxWidth = getDefaultWidth(); From cb2f3823cdbce0809d6c26330fabf092d4f0e647 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Thu, 3 Mar 2016 06:35:52 -0500 Subject: [PATCH 44/57] Update widget previews --- .../res/drawable/widget_preview_checkmark.png | Bin 0 -> 4952 bytes .../res/drawable/widget_preview_history.png | Bin 0 -> 33818 bytes .../main/res/drawable/widget_preview_score.png | Bin 0 -> 19691 bytes .../res/drawable/widget_preview_streaks.png | Bin 0 -> 6793 bytes app/src/main/res/xml/widget_checkmark_info.xml | 2 +- app/src/main/res/xml/widget_history_info.xml | 3 +-- app/src/main/res/xml/widget_score_info.xml | 3 +-- app/src/main/res/xml/widget_streak_info.xml | 2 +- 8 files changed, 4 insertions(+), 6 deletions(-) create mode 100644 app/src/main/res/drawable/widget_preview_checkmark.png create mode 100644 app/src/main/res/drawable/widget_preview_history.png create mode 100644 app/src/main/res/drawable/widget_preview_score.png create mode 100644 app/src/main/res/drawable/widget_preview_streaks.png diff --git a/app/src/main/res/drawable/widget_preview_checkmark.png b/app/src/main/res/drawable/widget_preview_checkmark.png new file mode 100644 index 0000000000000000000000000000000000000000..ceb7d6541502a24606b4b646c4e5e23948e46a5b GIT binary patch literal 4952 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/widget_preview_score.png b/app/src/main/res/drawable/widget_preview_score.png new file mode 100644 index 0000000000000000000000000000000000000000..101569dbcf13aa3775678aac143610e7aedbbdd7 GIT binary patch literal 19691 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/widget_preview_streaks.png b/app/src/main/res/drawable/widget_preview_streaks.png new file mode 100644 index 0000000000000000000000000000000000000000..9977ca6f030105914ec4b2aa1de1a0467bf32d5f GIT binary patch literal 6793 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 afqoaBX=xk!q91%)f^@YFQP~&nKKeJ&*Qcid literal 0 HcmV?d00001 diff --git a/app/src/main/res/xml/widget_checkmark_info.xml b/app/src/main/res/xml/widget_checkmark_info.xml index 0b16f1cef..bd169b0d6 100644 --- a/app/src/main/res/xml/widget_checkmark_info.xml +++ b/app/src/main/res/xml/widget_checkmark_info.xml @@ -3,7 +3,7 @@ android:minHeight="40dp" android:minWidth="40dp" android:initialLayout="@layout/widget_checkmark" - android:previewImage="@mipmap/ic_small_widget_preview" + android:previewImage="@drawable/widget_preview_checkmark" android:resizeMode="none" android:updatePeriodMillis="3600000" android:configure="org.isoron.uhabits.widgets.HabitPickerDialog" diff --git a/app/src/main/res/xml/widget_history_info.xml b/app/src/main/res/xml/widget_history_info.xml index dd8068375..b02ef8079 100644 --- a/app/src/main/res/xml/widget_history_info.xml +++ b/app/src/main/res/xml/widget_history_info.xml @@ -5,11 +5,10 @@ android:minResizeWidth="40dp" android:minResizeHeight="40dp" android:initialLayout="@layout/widget_graph" - android:previewImage="@mipmap/ic_small_widget_preview" + android:previewImage="@drawable/widget_preview_history" android:resizeMode="vertical|horizontal" android:updatePeriodMillis="3600000" android:configure="org.isoron.uhabits.widgets.HabitPickerDialog" android:widgetCategory="home_screen"> - \ 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 index dd8068375..22d3de7ff 100644 --- a/app/src/main/res/xml/widget_score_info.xml +++ b/app/src/main/res/xml/widget_score_info.xml @@ -5,11 +5,10 @@ android:minResizeWidth="40dp" android:minResizeHeight="40dp" android:initialLayout="@layout/widget_graph" - android:previewImage="@mipmap/ic_small_widget_preview" + android:previewImage="@drawable/widget_preview_score" android:resizeMode="vertical|horizontal" android:updatePeriodMillis="3600000" android:configure="org.isoron.uhabits.widgets.HabitPickerDialog" android:widgetCategory="home_screen"> - \ 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 index 28ae1a512..60d32c780 100644 --- a/app/src/main/res/xml/widget_streak_info.xml +++ b/app/src/main/res/xml/widget_streak_info.xml @@ -5,7 +5,7 @@ android:minResizeWidth="40dp" android:minResizeHeight="40dp" android:initialLayout="@layout/widget_graph" - android:previewImage="@mipmap/ic_small_widget_preview" + android:previewImage="@drawable/widget_preview_streaks" android:resizeMode="vertical|horizontal" android:updatePeriodMillis="3600000" android:configure="org.isoron.uhabits.widgets.HabitPickerDialog" From eb79113e4c4e745bceacdcd693c75baf50cb9d50 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Thu, 3 Mar 2016 06:49:46 -0500 Subject: [PATCH 45/57] Update screenshots to include widgets --- README.md | 3 +++ screenshots/original/uhabits5.png | Bin 0 -> 352878 bytes screenshots/thumbs/uhabits5.png | Bin 0 -> 87393 bytes 3 files changed, 3 insertions(+) create mode 100644 screenshots/original/uhabits5.png create mode 100644 screenshots/thumbs/uhabits5.png diff --git a/README.md b/README.md index 7e52ad3ba..065430702 100644 --- a/README.md +++ b/README.md @@ -33,12 +33,15 @@ There are absolutely no advertisements, annoying notifications or intrusive perm [![Edit habit][screen2th]][screen2] [![Habit strength][screen3th]][screen3] [![Habit history and streaks][screen4th]][screen4] +[![Widgets][screen5th]][screen5] [screen1]: screenshots/original/uhabits1.png [screen2]: screenshots/original/uhabits2.png [screen3]: screenshots/original/uhabits3.png [screen4]: screenshots/original/uhabits4.png +[screen5]: screenshots/original/uhabits5.png [screen1th]: screenshots/thumbs/uhabits1.png [screen2th]: screenshots/thumbs/uhabits2.png [screen3th]: screenshots/thumbs/uhabits3.png [screen4th]: screenshots/thumbs/uhabits4.png +[screen5th]: screenshots/thumbs/uhabits5.png diff --git a/screenshots/original/uhabits5.png b/screenshots/original/uhabits5.png new file mode 100644 index 0000000000000000000000000000000000000000..022a4bf86c5af9d5e699f3dd70e28cc0e4bd3d57 GIT binary patch literal 352878 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%0AvjNv_47nb>k(w}@9&eLj#{C+Co@OfL#{tx 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%0D!6_fU+ye>5vWP%*93H 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�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 z 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⪤aXA8nV!b4(`H1Wc}mGotwHN6HS$PP0^ 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%0D5pFTgHxvVQoPTTdt0QL) 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 literal 0 HcmV?d00001 diff --git a/screenshots/thumbs/uhabits5.png b/screenshots/thumbs/uhabits5.png new file mode 100644 index 0000000000000000000000000000000000000000..b9454844e3eaa37a69c57342a49ab680b39ff0dd GIT binary patch literal 87393 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�c>|E^5 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 Date: Thu, 3 Mar 2016 07:38:11 -0500 Subject: [PATCH 46/57] Minor string change --- app/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ab899a754..cd1e5b642 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -109,7 +109,7 @@ Weekdays Any day Select days - Export to CSV + Export data @string/hint_drag From 7493291ade5555dd9c28b575a81ed589b1b289de Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Thu, 3 Mar 2016 07:38:50 -0500 Subject: [PATCH 47/57] Use average of scores in the interval --- .../org/isoron/uhabits/models/ScoreList.java | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/isoron/uhabits/models/ScoreList.java b/app/src/main/java/org/isoron/uhabits/models/ScoreList.java index 95b3c72db..8312a15e2 100644 --- a/app/src/main/java/org/isoron/uhabits/models/ScoreList.java +++ b/app/src/main/java/org/isoron/uhabits/models/ScoreList.java @@ -121,13 +121,16 @@ public class ScoreList return lastScore; } - public int[] getAllValues(Long fromTimestamp, Long toTimestamp, Integer divisor, Long offset) + public int[] getAllValues(Long fromTimestamp, Long toTimestamp, Integer divisor) { - String query = "select score from Score where habit = ? and timestamp > ? and " + - "timestamp <= ? and (timestamp - ?) % ? = 0 order by timestamp desc"; + Long offset = toTimestamp - (divisor - 1) * DateHelper.millisecondsInOneDay; - String params[] = { habit.getId().toString(), fromTimestamp.toString(), - toTimestamp.toString(), offset.toString(), divisor.toString()}; + String query = "select ((timestamp - ?) / ?) as time, avg(score) from Score " + + "where habit = ? and timestamp > ? and timestamp <= ? " + + "group by time order by time desc"; + + String params[] = { offset.toString(), divisor.toString(), habit.getId().toString(), + fromTimestamp.toString(), toTimestamp.toString()}; SQLiteDatabase db = Cache.openDatabase(); Cursor cursor = db.rawQuery(query, params); @@ -139,7 +142,7 @@ public class ScoreList do { - scores[k++] = cursor.getInt(0); + scores[k++] = (int) cursor.getLong(1); } while (cursor.moveToNext()); @@ -155,6 +158,6 @@ public class ScoreList long fromTimestamp = oldestRep.timestamp; long toTimestamp = DateHelper.getStartOfToday(); - return getAllValues(fromTimestamp, toTimestamp, divisor, toTimestamp); + return getAllValues(fromTimestamp, toTimestamp, divisor); } } From 1fbd12a947289af899f269027e76396085dcd46e Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Fri, 4 Mar 2016 06:39:30 -0500 Subject: [PATCH 48/57] Fix incorrect streaks --- app/src/main/AndroidManifest.xml | 2 +- app/src/main/assets/migrations/12.sql | 3 +++ .../java/org/isoron/uhabits/models/StreakList.java | 11 +++++------ 3 files changed, 9 insertions(+), 7 deletions(-) create mode 100644 app/src/main/assets/migrations/12.sql diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 276fb6be6..22ca97b1e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -22,7 +22,7 @@ + android:value="12"/> Date: Fri, 4 Mar 2016 06:52:31 -0500 Subject: [PATCH 49/57] Update widgets and reminders on background; faster startup --- .../java/org/isoron/uhabits/MainActivity.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/isoron/uhabits/MainActivity.java b/app/src/main/java/org/isoron/uhabits/MainActivity.java index 6fd9dc729..e3477e900 100644 --- a/app/src/main/java/org/isoron/uhabits/MainActivity.java +++ b/app/src/main/java/org/isoron/uhabits/MainActivity.java @@ -24,6 +24,7 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; import android.net.Uri; +import android.os.AsyncTask; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.v4.content.LocalBroadcastManager; @@ -36,7 +37,6 @@ 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; @@ -72,10 +72,19 @@ public class MainActivity extends ReplayableActivity private void onStartup() { PreferenceManager.setDefaultValues(this, R.xml.preferences, false); - ReminderHelper.createReminderAlarms(MainActivity.this); DialogHelper.incrementLaunchCount(this); showTutorial(); - updateWidgets(this); + + new AsyncTask() { + @Override + protected Void doInBackground(Void... params) + { + ReminderHelper.createReminderAlarms(MainActivity.this); + updateWidgets(MainActivity.this); + return null; + } + }.execute(); + } private void showTutorial() From 58aa7f6687360725047162495cfafaf0b0be9d24 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Fri, 4 Mar 2016 07:03:05 -0500 Subject: [PATCH 50/57] Add padding to HabitScoreView --- .../java/org/isoron/uhabits/views/HabitScoreView.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) 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 248341059..68855e50a 100644 --- a/app/src/main/java/org/isoron/uhabits/views/HabitScoreView.java +++ b/app/src/main/java/org/isoron/uhabits/views/HabitScoreView.java @@ -51,6 +51,7 @@ public class HabitScoreView extends ScrollableDataView private Paint pText, pGraph; private RectF rect, prevRect; private int baseSize; + private int paddingTop; private int columnWidth; private int columnHeight; @@ -149,6 +150,7 @@ public class HabitScoreView extends ScrollableDataView columnWidth = baseSize; columnHeight = 8 * baseSize; nColumns = width / baseSize; + paddingTop = (int) (baseSize * 0.15f); pText.setTextSize(baseSize * 0.5f); pGraph.setTextSize(baseSize * 0.5f); @@ -196,7 +198,7 @@ public class HabitScoreView extends ScrollableDataView float lineHeight = pText.getFontSpacing(); rect.set(0, 0, nColumns * columnWidth, columnHeight); - rect.offset(0, 1f); + rect.offset(0, paddingTop); drawGrid(canvas, rect); @@ -225,7 +227,7 @@ public class HabitScoreView extends ScrollableDataView int height = (int) (columnHeight * sRelative); rect.set(0, 0, baseSize, baseSize); - rect.offset(k * columnWidth, columnHeight - height - columnWidth / 2); + rect.offset(k * columnWidth, paddingTop + columnHeight - height - columnWidth / 2); if (!prevRect.isEmpty()) { @@ -238,7 +240,7 @@ public class HabitScoreView extends ScrollableDataView prevRect.set(rect); rect.set(0, 0, columnWidth, columnHeight); - rect.offset(k * columnWidth, 0); + rect.offset(k * columnWidth, paddingTop); if (!month.equals(previousMonth)) canvas.drawText(month, rect.centerX(), rect.bottom + lineHeight * 1.2f, pText); From f41f877107174d6a27848b65a308335a03cf499b Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Fri, 4 Mar 2016 08:28:34 -0500 Subject: [PATCH 51/57] Fix data export on older devices --- app/src/main/AndroidManifest.xml | 4 ++++ .../main/java/org/isoron/uhabits/io/CSVExporter.java | 12 +++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 22ca97b1e..6cf90a811 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,6 +8,10 @@ + + Date: Fri, 4 Mar 2016 08:43:58 -0500 Subject: [PATCH 52/57] Save last app version on preferences --- app/src/main/java/org/isoron/helpers/DialogHelper.java | 8 ++++++++ app/src/main/java/org/isoron/uhabits/MainActivity.java | 1 + 2 files changed, 9 insertions(+) diff --git a/app/src/main/java/org/isoron/helpers/DialogHelper.java b/app/src/main/java/org/isoron/helpers/DialogHelper.java index 680ca04f2..48d2cad02 100644 --- a/app/src/main/java/org/isoron/helpers/DialogHelper.java +++ b/app/src/main/java/org/isoron/helpers/DialogHelper.java @@ -27,6 +27,8 @@ import android.util.DisplayMetrics; import android.view.View; import android.view.inputmethod.InputMethodManager; +import org.isoron.uhabits.BuildConfig; + public abstract class DialogHelper { @@ -59,6 +61,12 @@ public abstract class DialogHelper prefs.edit().putInt("launch_count", count + 1).apply(); } + public static void updateLastAppVersion(Context context) + { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + prefs.edit().putInt("last_version", BuildConfig.VERSION_CODE).apply(); + } + public static int getLaunchCount(Context context) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); diff --git a/app/src/main/java/org/isoron/uhabits/MainActivity.java b/app/src/main/java/org/isoron/uhabits/MainActivity.java index e3477e900..e9f07bd01 100644 --- a/app/src/main/java/org/isoron/uhabits/MainActivity.java +++ b/app/src/main/java/org/isoron/uhabits/MainActivity.java @@ -73,6 +73,7 @@ public class MainActivity extends ReplayableActivity { PreferenceManager.setDefaultValues(this, R.xml.preferences, false); DialogHelper.incrementLaunchCount(this); + DialogHelper.updateLastAppVersion(this); showTutorial(); new AsyncTask() { From 299c6a0c1ddea6644dfd6719fe119c82e32bb823 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Fri, 4 Mar 2016 11:29:45 -0500 Subject: [PATCH 53/57] Show action icons on pre-Lollipop --- app/src/main/res/menu/list_habits_options.xml | 3 +-- app/src/main/res/menu/show_habit_fragment_menu.xml | 5 ++--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/menu/list_habits_options.xml b/app/src/main/res/menu/list_habits_options.xml index f2b377ccd..a8397d437 100644 --- a/app/src/main/res/menu/list_habits_options.xml +++ b/app/src/main/res/menu/list_habits_options.xml @@ -1,5 +1,4 @@

@@ -7,6 +6,6 @@ android:id="@+id/action_add" android:icon="@drawable/ic_action_add" android:title="@string/add_habit" - app:showAsAction="always"/> + android:showAsAction="always"/> diff --git a/app/src/main/res/menu/show_habit_fragment_menu.xml b/app/src/main/res/menu/show_habit_fragment_menu.xml index a5104bcfb..90a54e0c7 100644 --- a/app/src/main/res/menu/show_habit_fragment_menu.xml +++ b/app/src/main/res/menu/show_habit_fragment_menu.xml @@ -1,11 +1,10 @@ - + + android:showAsAction="ifRoom"/> \ No newline at end of file From 616322cd35cba491fea2b04ccd15bf9f26f47f1d Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Fri, 4 Mar 2016 11:46:10 -0500 Subject: [PATCH 54/57] Fix card background (pre-Lollipop) --- .../java/org/isoron/uhabits/fragments/ListHabitsFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 37c0e4e13..278e54345 100644 --- a/app/src/main/java/org/isoron/uhabits/fragments/ListHabitsFragment.java +++ b/app/src/main/java/org/isoron/uhabits/fragments/ListHabitsFragment.java @@ -687,7 +687,7 @@ public class ListHabitsFragment extends Fragment if (android.os.Build.VERSION.SDK_INT >= 21) llInner.setBackgroundResource(R.drawable.ripple_white); else - llInner.setBackgroundColor(Color.WHITE); + llInner.setBackgroundResource(R.drawable.card_background); } return view; From 5e7636d7ff483cddd6982be412ecf275d1abee05 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Fri, 4 Mar 2016 12:07:01 -0500 Subject: [PATCH 55/57] Fix position for new habits --- app/src/main/java/org/isoron/uhabits/models/Habit.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/isoron/uhabits/models/Habit.java b/app/src/main/java/org/isoron/uhabits/models/Habit.java index 5bcc696f5..fc3163b21 100644 --- a/app/src/main/java/org/isoron/uhabits/models/Habit.java +++ b/app/src/main/java/org/isoron/uhabits/models/Habit.java @@ -83,7 +83,7 @@ public class Habit extends Model public Habit() { this.color = ColorHelper.palette[5]; - this.position = Habit.count(); + this.position = Habit.countWithArchived(); this.highlight = 0; this.archived = 0; this.freqDen = 7; @@ -132,6 +132,11 @@ public class Habit extends Model return select().count(); } + public static int countWithArchived() + { + return selectWithArchived().count(); + } + public static java.util.List getHighlightedHabits() { return select().where("highlight = 1") From e02f9c1d609444eabd331d37408ee2dfe15bd16b Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Fri, 4 Mar 2016 07:08:07 -0500 Subject: [PATCH 56/57] Bump version to 1.2.0 --- app/src/main/AndroidManifest.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6cf90a811..80f2bbd0d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,8 +2,8 @@ + android:versionCode="9" + android:versionName="1.2.0"> From 382a2fe6000da12e335fcefb328087385a70c094 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Fri, 4 Mar 2016 12:21:45 -0500 Subject: [PATCH 57/57] Update CHANGELOG.md --- CHANGELOG.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 000000000..31acf8f74 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,25 @@ +# Changelog + +### 1.2.0 (March 4, 2016) + +* Ability to export habit data as CSV +* Widgets (checkmark, history, score and streaks) +* More natural scrolling on data views (fling) +* Minor UI improvements on pre-Lollipop devices +* Fix crash on Samsung Galaxy TabS 8.4 +* Other minor bug fixes + +### 1.1.1 (February 24, 2016) + +* Show reminder only on chosen days of the week +* Rearrange habits by long-pressing then dragging +* Select and modify multiple habits simultaneously +* 12/24 hour format according to phone preferences +* Permanently delete habits +* Usage hints during startup +* Translation to Brazilian Portuguese and Chinese +* Other minor fixes + +### 1.0.0 (February 19, 2016) + +* Initial release \ No newline at end of file