diff --git a/CHANGELOG.md b/CHANGELOG.md index 19d4a036b..7dea3b708 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +### 1.5.2 (May 19, 2016) + +* Fix missing attachment on bug reports +* Fix bug that prevents some widgets from rendering +* Complete Japanese translation + ### 1.5.1 (May 17, 2016) * Fix build on F-Droid @@ -86,4 +92,4 @@ ### 1.0.0 (February 19, 2016) -* Initial release \ No newline at end of file +* Initial release diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 71f54d978..e8d4dc86d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -21,8 +21,8 @@ + android:versionCode="18" + android:versionName="1.5.2"> diff --git a/app/src/main/java/org/isoron/uhabits/BaseActivity.java b/app/src/main/java/org/isoron/uhabits/BaseActivity.java index 1444f228a..6d59a00d0 100644 --- a/app/src/main/java/org/isoron/uhabits/BaseActivity.java +++ b/app/src/main/java/org/isoron/uhabits/BaseActivity.java @@ -154,7 +154,7 @@ abstract public class BaseActivity extends AppCompatActivity implements Thread.U try { ex.printStackTrace(); - HabitsApplication.generateLogFile(); + HabitsApplication.dumpBugReportToFile(); } catch(Exception e) { diff --git a/app/src/main/java/org/isoron/uhabits/HabitsApplication.java b/app/src/main/java/org/isoron/uhabits/HabitsApplication.java index 27a8fbf43..dee4ca17d 100644 --- a/app/src/main/java/org/isoron/uhabits/HabitsApplication.java +++ b/app/src/main/java/org/isoron/uhabits/HabitsApplication.java @@ -36,6 +36,7 @@ import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; +import java.util.LinkedList; public class HabitsApplication extends Application { @@ -87,6 +88,7 @@ public class HabitsApplication extends Application public static String getLogcat() throws IOException { + int maxNLines = 250; StringBuilder builder = new StringBuilder(); String[] command = new String[] { "logcat", "-d"}; @@ -95,10 +97,18 @@ public class HabitsApplication extends Application InputStreamReader in = new InputStreamReader(process.getInputStream()); BufferedReader bufferedReader = new BufferedReader(in); + LinkedList log = new LinkedList<>(); + String line; while ((line = bufferedReader.readLine()) != null) { - builder.append(line); + log.addLast(line); + if(log.size() > maxNLines) log.removeFirst(); + } + + for(String l : log) + { + builder.append(l); builder.append('\n'); } @@ -130,10 +140,8 @@ public class HabitsApplication extends Application } @NonNull - public static File generateLogFile() throws IOException + public static File dumpBugReportToFile() throws IOException { - String logcat = getLogcat(); - String deviceInfo = getDeviceInfo(); String date = DateHelper.getBackupDateFormat().format(DateHelper.getLocalTime()); if(context == null) throw new RuntimeException("application context should not be null"); @@ -142,10 +150,17 @@ public class HabitsApplication extends Application File logFile = new File(String.format("%s/Log %s.txt", dir.getPath(), date)); FileWriter output = new FileWriter(logFile); - output.write(deviceInfo); - output.write(logcat); + output.write(generateBugReport()); output.close(); return logFile; } + + @NonNull + public static String generateBugReport() throws IOException + { + String logcat = getLogcat(); + String deviceInfo = getDeviceInfo(); + return deviceInfo + "\n" + logcat; + } } diff --git a/app/src/main/java/org/isoron/uhabits/MainActivity.java b/app/src/main/java/org/isoron/uhabits/MainActivity.java index a8dad23b8..77c8625a1 100644 --- a/app/src/main/java/org/isoron/uhabits/MainActivity.java +++ b/app/src/main/java/org/isoron/uhabits/MainActivity.java @@ -53,7 +53,6 @@ import org.isoron.uhabits.widgets.HistoryWidgetProvider; import org.isoron.uhabits.widgets.ScoreWidgetProvider; import org.isoron.uhabits.widgets.StreakWidgetProvider; -import java.io.File; import java.io.IOException; public class MainActivity extends BaseActivity @@ -239,12 +238,25 @@ public class MainActivity extends BaseActivity { try { - File logFile = HabitsApplication.generateLogFile(); + HabitsApplication.dumpBugReportToFile(); + } + catch (IOException e) + { + // ignored + } + + try + { + String log = "---------- BUG REPORT BEGINS ----------\n"; + log += HabitsApplication.generateBugReport(); + log += "---------- BUG REPORT ENDS ------------\n"; Intent intent = new Intent(); - intent.setAction(Intent.ACTION_SENDTO); - intent.setData(Uri.parse(getString(R.string.bugReportURL))); - intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(logFile)); + intent.setAction(Intent.ACTION_SEND); + intent.setType("message/rfc822"); + intent.putExtra(Intent.EXTRA_EMAIL, new String[] { "dev@loophabits.org" }); + intent.putExtra(Intent.EXTRA_SUBJECT, "Bug Report - Loop Habit Tracker"); + intent.putExtra(Intent.EXTRA_TEXT, log); startActivity(intent); } catch (IOException e) diff --git a/app/src/main/java/org/isoron/uhabits/helpers/ReminderHelper.java b/app/src/main/java/org/isoron/uhabits/helpers/ReminderHelper.java index c575ffcf4..07b113f15 100644 --- a/app/src/main/java/org/isoron/uhabits/helpers/ReminderHelper.java +++ b/app/src/main/java/org/isoron/uhabits/helpers/ReminderHelper.java @@ -93,8 +93,9 @@ public class ReminderHelper else manager.set(AlarmManager.RTC_WAKEUP, reminderTime, pendingIntent); - Log.d("ReminderHelper", String.format("Setting alarm (%s): %s", - DateFormat.getDateTimeInstance().format(new Date(reminderTime)), habit.name)); + Log.d("ReminderHelper", String.format("Setting alarm (%s): %s...", + DateFormat.getDateTimeInstance().format(new Date(reminderTime)), + habit.name.substring(0, 3))); } @Nullable 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 7e6c8c968..dfb27f1bf 100644 --- a/app/src/main/java/org/isoron/uhabits/helpers/UIHelper.java +++ b/app/src/main/java/org/isoron/uhabits/helpers/UIHelper.java @@ -191,7 +191,7 @@ public abstract class UIHelper { // TODO: Move this to another place, or detect automatically String fullyTranslatedLanguages[] = { "ca", "zh", "en", "de", "in", "it", "ko", "pl", "pt", - "es", "tk", "uk"}; + "es", "tk", "uk", "ja"}; final String currentLanguage = Locale.getDefault().getLanguage(); 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 de7ee345a..1ab2a9024 100644 --- a/app/src/main/java/org/isoron/uhabits/views/RingView.java +++ b/app/src/main/java/org/isoron/uhabits/views/RingView.java @@ -27,6 +27,7 @@ import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.graphics.RectF; +import android.support.annotation.Nullable; import android.text.TextPaint; import android.util.AttributeSet; import android.view.View; @@ -57,8 +58,10 @@ public class RingView extends View private float textSize; private boolean enableFontAwesome; + @Nullable private Bitmap drawingCache; private Canvas cacheCanvas; + private boolean isTransparencyEnabled; public RingView(Context context) @@ -175,12 +178,14 @@ public class RingView extends View { super.onSizeChanged(w, h, oldw, oldh); - if(isTransparencyEnabled) - { - if (drawingCache != null) drawingCache.recycle(); - drawingCache = Bitmap.createBitmap(diameter, diameter, Bitmap.Config.ARGB_8888); - cacheCanvas = new Canvas(drawingCache); - } + if(isTransparencyEnabled) reallocateCache(); + } + + private void reallocateCache() + { + if (drawingCache != null) drawingCache.recycle(); + drawingCache = Bitmap.createBitmap(diameter, diameter, Bitmap.Config.ARGB_8888); + cacheCanvas = new Canvas(drawingCache); } @Override @@ -191,6 +196,7 @@ public class RingView extends View if(isTransparencyEnabled) { + if(drawingCache == null) reallocateCache(); activeCanvas = cacheCanvas; drawingCache.eraseColor(Color.TRANSPARENT); } diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 9b85d78f4..f802621b5 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -149,4 +149,32 @@ Android Wear 端末から直接、リマインダーをチェック、スヌー "バグ報告の生成に失敗しました。" "バグ報告の生成" "トラブルシューティング" +"このアプリの翻訳を支援する" +"夜間モード" +"夜間モードで真黒を使用する" +"夜間モードで灰色の背景を黒で置き換えます。AMOLED ディスプレイの電話でバッテリー使用量を抑えます。" +"インターフェース" +"日の順序を逆転する" +"メイン画面で日を逆順に表示します" +"日" +"週" +"月" + + +"四半期" +"年" + + + +"回 /" +"%d 日ごと" +"%d 週ごと" +"%d ヶ月ごと" + + +"スコア" +"リマインダー サウンド" + + +"なし" \ No newline at end of file