diff --git a/app/src/main/java/org/isoron/uhabits/helpers/UIHelper.java b/app/src/main/java/org/isoron/uhabits/helpers/UIHelper.java index 3a2a8c7bd..a5983e8b5 100644 --- a/app/src/main/java/org/isoron/uhabits/helpers/UIHelper.java +++ b/app/src/main/java/org/isoron/uhabits/helpers/UIHelper.java @@ -23,6 +23,7 @@ import android.content.Context; import android.content.SharedPreferences; import android.content.res.Resources; import android.graphics.Typeface; +import android.os.Looper; import android.preference.PreferenceManager; import android.util.AttributeSet; import android.util.DisplayMetrics; @@ -110,4 +111,19 @@ public abstract class UIHelper DisplayMetrics metrics = resources.getDisplayMetrics(); return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp, metrics); } + + /** + * Throws a runtime exception if called from the main thread. Useful to make sure that + * slow methods never accidentally slow the application down. + * + * @throws RuntimeException when run from main thread + */ + public static void throwIfMainThread() throws RuntimeException + { + Looper looper = Looper.myLooper(); + if(looper == null) return; + + if(looper == Looper.getMainLooper()) + throw new RuntimeException("This method should never be called from the main thread"); + } } diff --git a/app/src/main/java/org/isoron/uhabits/models/CheckmarkList.java b/app/src/main/java/org/isoron/uhabits/models/CheckmarkList.java index f761f26c9..865e4c358 100644 --- a/app/src/main/java/org/isoron/uhabits/models/CheckmarkList.java +++ b/app/src/main/java/org/isoron/uhabits/models/CheckmarkList.java @@ -30,6 +30,7 @@ import com.activeandroid.query.Delete; import com.activeandroid.query.Select; import org.isoron.uhabits.helpers.DateHelper; +import org.isoron.uhabits.helpers.UIHelper; import java.io.IOException; import java.io.Writer; @@ -151,6 +152,8 @@ public class CheckmarkList */ protected void compute(long from, final long to) { + UIHelper.throwIfMainThread(); + final long day = DateHelper.millisecondsInOneDay; Checkmark newestCheckmark = findNewest(); 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 9146ed3c8..06331885d 100644 --- a/app/src/main/java/org/isoron/uhabits/models/ScoreList.java +++ b/app/src/main/java/org/isoron/uhabits/models/ScoreList.java @@ -33,6 +33,7 @@ import com.activeandroid.util.SQLiteUtils; import org.isoron.uhabits.helpers.DatabaseHelper; import org.isoron.uhabits.helpers.DateHelper; +import org.isoron.uhabits.helpers.UIHelper; import java.io.IOException; import java.io.Writer; @@ -102,6 +103,8 @@ public class ScoreList */ protected void compute(long from, long to) { + UIHelper.throwIfMainThread(); + final long day = DateHelper.millisecondsInOneDay; final double freq = ((double) habit.freqNum) / habit.freqDen; diff --git a/app/src/main/java/org/isoron/uhabits/models/StreakList.java b/app/src/main/java/org/isoron/uhabits/models/StreakList.java index f8a296ae2..691403d25 100644 --- a/app/src/main/java/org/isoron/uhabits/models/StreakList.java +++ b/app/src/main/java/org/isoron/uhabits/models/StreakList.java @@ -28,6 +28,7 @@ import com.activeandroid.query.Delete; import com.activeandroid.query.Select; import org.isoron.uhabits.helpers.DateHelper; +import org.isoron.uhabits.helpers.UIHelper; import java.util.ArrayList; import java.util.LinkedList; @@ -86,6 +87,8 @@ public class StreakList public void rebuild() { + UIHelper.throwIfMainThread(); + long beginning; long today = DateHelper.getStartOfToday(); long day = DateHelper.millisecondsInOneDay;