From 884b65c8b9d19b045c249679fd7587e274c4dad7 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Fri, 30 Sep 2016 15:48:30 +0200 Subject: [PATCH 01/15] update translations --- Habitica/AndroidManifest.xml | 2 +- Habitica/res/values-bg/strings.xml | 1 + Habitica/res/values-de/strings.xml | 14 ++++++++++++++ Habitica/res/values-fr/strings.xml | 11 +++++++++++ Habitica/res/values-it/strings.xml | 1 + Habitica/res/values-nl/strings.xml | 3 +++ 6 files changed, 31 insertions(+), 1 deletion(-) diff --git a/Habitica/AndroidManifest.xml b/Habitica/AndroidManifest.xml index 5aeda4e9a..0c7efae99 100644 --- a/Habitica/AndroidManifest.xml +++ b/Habitica/AndroidManifest.xml @@ -2,7 +2,7 @@ diff --git a/Habitica/res/values-bg/strings.xml b/Habitica/res/values-bg/strings.xml index 2490495bc..7e58fc408 100644 --- a/Habitica/res/values-bg/strings.xml +++ b/Habitica/res/values-bg/strings.xml @@ -384,6 +384,7 @@ Добавяне на задача Добавяне на награда Изпълнихте всичките си ежедневни задачи. Добра работа! + Положителен навик в Хаибитика Ежедневни задачи в Хабитика Добавяне на задача в Хабитика diff --git a/Habitica/res/values-de/strings.xml b/Habitica/res/values-de/strings.xml index ee2f77ec0..feb223792 100644 --- a/Habitica/res/values-de/strings.xml +++ b/Habitica/res/values-de/strings.xml @@ -12,10 +12,14 @@ Deine Benutzer-ID API-Token Dein API-Token + Sprache + Habitica\'s Sprache ändern Dein QR Code Kontaktiere mich Ein Fehler ist aufgetreten... Konto + Erster Tag der Woche + Erster Tag der Woche in allen Kalendern Tägliche Erinnerung Erinnerung aktivieren Erinnerungszeit einstellen @@ -371,5 +375,15 @@ Für den Anfang: Welche Bereiche Deines Lebens möchtest Du verbessern? Nachrichtenempfänger auswählen Weiter QR Code scannen + ID des Empfängers eingeben Du wurdest in eine Gruppe eingeladen! + Habitica Statistiken + Neue Aufgabe + Neue Gewohnheit + Neue Tägliche Aufgabe + Neue To-Do + Neue Belohnung + Du hast alle deine täglichen Aufgaben erledigt. Gut gemacht! + Habitica: Tägliche Aufgaben + Habitica: Neue Aufgabe diff --git a/Habitica/res/values-fr/strings.xml b/Habitica/res/values-fr/strings.xml index 3a1cdec88..6f66bbcc7 100644 --- a/Habitica/res/values-fr/strings.xml +++ b/Habitica/res/values-fr/strings.xml @@ -375,5 +375,16 @@ Pour commencer, quels aspects de votre vie souhaitez-vous améliorer ? Choisissez un destinataire Continuer Scanner le QR code + Saisissez l\'identifiant du destinataire Vous avez été invité·e à rejoindre une équipe ! + Statistiques d\'Habitica + Ajouter une tâche + Ajouter une habitude + Ajouter une quotidienne + Ajouter une tâche à faire + Ajouter une récompense + Vous avez accompli toutes vos quotidiennes. Bravo ! + Réaliser une tâche Habitica + Quotidiennes Habitica + Ajouter une tâche Habitica diff --git a/Habitica/res/values-it/strings.xml b/Habitica/res/values-it/strings.xml index 8d842b2b3..cfa951028 100644 --- a/Habitica/res/values-it/strings.xml +++ b/Habitica/res/values-it/strings.xml @@ -376,6 +376,7 @@ Le Dailies mancate e le cattive Habit non li danneggiano molto, e hanno sempre m Scegli destinatario messaggio Continua Rileva codice QR + Inserisci ID Utente destinatario Hai ricevuto un invito per unirti a una squadra! Statistiche Habitica Aggiungi Attività diff --git a/Habitica/res/values-nl/strings.xml b/Habitica/res/values-nl/strings.xml index c00481219..9c3f2eabf 100644 --- a/Habitica/res/values-nl/strings.xml +++ b/Habitica/res/values-nl/strings.xml @@ -30,6 +30,7 @@ Edelstenen geschonken Abonnement geschonken Uitgenodigd voor groep + Uitgenodigd voor gilde Je queeste is begonnen Uitgenodigd voor queeste @@ -374,10 +375,12 @@ Om te beginnen, welke delen van je leven wil je verbeteren? Kies een ontvanger voor het bericht Ga verder Scan QR code + Voer ontvanger\'s Gebruikers ID in Je bent uitgenodigd voor een groep! Voeg taak toe Voeg Gewoonte toe Voeg Dagelijkse taak toe + To-Do toevoegen Voeg Beloning toe Je hebt al je Dagelijkse taken voltooid. Goed gedaan! From 2ba3d595cc86eda282808cf8ac0449579b3908af Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Fri, 30 Sep 2016 15:49:07 +0200 Subject: [PATCH 02/15] fix crash when user has no tags --- .../ui/fragments/tasks/TasksFragment.java | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.java index 069900afd..ca77a135f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.java @@ -484,23 +484,27 @@ public class TasksFragment extends BaseMainFragment implements OnCheckedChangeLi if(this.editingTags) { items.add(new EditTagsSectionDrawer().withEditing(this.editingTags).withName(getString(R.string.filter_drawer_edit_tags))); items.add(new EditTextDrawer()); - for (Tag t : tagList) { - items.add(new EditTagsDrawerItem() - .withName(t.getName()) - .withTag(t) - ); + if (tagList != null) { + for (Tag t : tagList) { + items.add(new EditTagsDrawerItem() + .withName(t.getName()) + .withTag(t) + ); + } } this.activity.fillFilterDrawer(items); }else { items.add(new EditTagsSectionDrawer().withEditing(this.editingTags).withName(getString(R.string.filter_drawer_filter_tags))); items.add(new EditTextDrawer()); - for (Tag t : tagList) { - items.add(new SwitchDrawerItem() - .withName(t.getName()) - .withTag(t) - .withChecked(this.tagsHelper.isTagChecked(t.getId())) - .withOnCheckedChangeListener(this) - ); + if (tagList != null) { + for (Tag t : tagList) { + items.add(new SwitchDrawerItem() + .withName(t.getName()) + .withTag(t) + .withChecked(this.tagsHelper.isTagChecked(t.getId())) + .withOnCheckedChangeListener(this) + ); + } } this.activity.fillFilterDrawer(items); } From a67e0032554ddcc5293882ae681962cc29ebd556 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Fri, 30 Sep 2016 15:50:51 +0200 Subject: [PATCH 03/15] fix potential crash with old data structures --- .../lib/utils/TaskTagDeserializer.java | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/TaskTagDeserializer.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/TaskTagDeserializer.java index ab76bb072..9c822e7d0 100644 --- a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/TaskTagDeserializer.java +++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/TaskTagDeserializer.java @@ -27,23 +27,24 @@ public class TaskTagDeserializer implements JsonDeserializer> { allTags = new ArrayList<>(); } - for (JsonElement tagElement : json.getAsJsonArray()) { - String tagId = tagElement.getAsString(); - TaskTag taskTag = new TaskTag(); - for (Tag tag : allTags) { - if (tag.getId().equals(tagId)) { - taskTag.setTag(tag); + if (json.isJsonArray()) { + for (JsonElement tagElement : json.getAsJsonArray()) { + String tagId = tagElement.getAsString(); + TaskTag taskTag = new TaskTag(); + for (Tag tag : allTags) { + if (tag.getId().equals(tagId)) { + taskTag.setTag(tag); - if (!alreadyContainsTag(taskTags, tagId)) { - taskTags.add(taskTag); + if (!alreadyContainsTag(taskTags, tagId)) { + taskTags.add(taskTag); + } + + break; } - - break; } } } - - + return taskTags; } From 928fdd921250dd3a103ff5de0c47c05385ff99e2 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Fri, 30 Sep 2016 15:51:11 +0200 Subject: [PATCH 04/15] fix crash in party view --- .../ui/fragments/social/party/PartyFragment.java | 12 +++++++----- .../lib/utils/TaskTagDeserializer.java | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyFragment.java index 1812f43a8..4eb77eb5e 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyFragment.java @@ -114,11 +114,13 @@ public class PartyFragment extends BaseMainFragment { private void updateGroupUI() { viewPagerAdapter.notifyDataSetChanged(); - if (group == null) { - tabLayout.setVisibility(View.GONE); - return; - } else { - tabLayout.setVisibility(View.VISIBLE); + if (tabLayout != null) { + if (group == null) { + tabLayout.setVisibility(View.GONE); + return; + } else { + tabLayout.setVisibility(View.VISIBLE); + } } if (partyMemberListFragment != null) { diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/TaskTagDeserializer.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/TaskTagDeserializer.java index 9c822e7d0..369e80744 100644 --- a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/TaskTagDeserializer.java +++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/TaskTagDeserializer.java @@ -44,7 +44,7 @@ public class TaskTagDeserializer implements JsonDeserializer> { } } } - + return taskTags; } From c044fddaea66b60530b582df6942053ad9a0ace1 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Fri, 30 Sep 2016 15:51:31 +0200 Subject: [PATCH 05/15] fix widgets on older android versions --- .../android/habitica/widget/AvatarStatsWidgetService.java | 7 ++++++- .../android/habitica/widget/DailiesWidgetProvider.java | 6 +++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/AvatarStatsWidgetService.java b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/AvatarStatsWidgetService.java index 1af3b4c08..f958f0eac 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/AvatarStatsWidgetService.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/AvatarStatsWidgetService.java @@ -5,6 +5,7 @@ import android.app.Service; import android.appwidget.AppWidgetManager; import android.content.ComponentName; import android.content.Intent; +import android.os.Build; import android.os.IBinder; import android.view.View; import android.widget.RemoteViews; @@ -100,7 +101,11 @@ public class AvatarStatsWidgetService extends Service { Intent openAppIntent = new Intent(this.getApplicationContext(), MainActivity.class); PendingIntent openApp = PendingIntent.getActivity(this, 0, openAppIntent, PendingIntent.FLAG_UPDATE_CURRENT); remoteViews.setOnClickPendingIntent(R.id.widget_main_view, openApp); - appWidgetManager.partiallyUpdateAppWidget(allWidgetIds, remoteViews); + if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + appWidgetManager.partiallyUpdateAppWidget(allWidgetIds, remoteViews); + } else { + appWidgetManager.updateAppWidget(allWidgetIds, remoteViews); + } } @Override diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesWidgetProvider.java b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesWidgetProvider.java index 042fbb707..ee513b063 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesWidgetProvider.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesWidgetProvider.java @@ -94,7 +94,11 @@ public class DailiesWidgetProvider extends BaseWidgetProvider { PendingIntent.FLAG_UPDATE_CURRENT); rv.setPendingIntentTemplate(R.id.list_view, toastPendingIntent); - appWidgetManager.partiallyUpdateAppWidget(appWidgetIds[i], rv); + if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + appWidgetManager.partiallyUpdateAppWidget(appWidgetIds[i], rv); + } else { + appWidgetManager.updateAppWidget(appWidgetIds[i], rv); + } } super.onUpdate(context, appWidgetManager, appWidgetIds); } From 4b7c402657cd20ce419bb6ef91b00ab5f588b138 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Fri, 30 Sep 2016 17:31:05 +0200 Subject: [PATCH 06/15] improve widget update behaviour --- Habitica/AndroidManifest.xml | 2 +- Habitica/res/values-ko/strings.tutorial.xml | 2 +- Habitica/res/values-ko/strings.xml | 42 ++++++- Habitica/res/values/strings.xml | 1 + .../habitica/components/AppComponent.java | 5 +- .../habitica/ui/activities/LoginActivity.java | 18 ++- .../widget/AvatarStatsWidgetProvider.java | 117 +++++++++++++++--- .../widget/AvatarStatsWidgetService.java | 115 ----------------- .../habitica/widget/DailiesListProvider.java | 4 +- .../widget/DailiesWidgetProvider.java | 10 +- translations/store_strings-ko.xml | 2 +- 11 files changed, 168 insertions(+), 150 deletions(-) delete mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/widget/AvatarStatsWidgetService.java diff --git a/Habitica/AndroidManifest.xml b/Habitica/AndroidManifest.xml index 0c7efae99..c465e1748 100644 --- a/Habitica/AndroidManifest.xml +++ b/Habitica/AndroidManifest.xml @@ -205,7 +205,7 @@ - + diff --git a/Habitica/res/values-ko/strings.tutorial.xml b/Habitica/res/values-ko/strings.tutorial.xml index be1c34cfa..c300ad875 100644 --- a/Habitica/res/values-ko/strings.tutorial.xml +++ b/Habitica/res/values-ko/strings.tutorial.xml @@ -1,6 +1,6 @@ - 좋은 습관을 달성하고 골드와 경험치를 얻으세요! 나쁜 습관은 당신의 아바타를 다치게하니, 일상생활을 열심히 하세요! + 좋은 습관을 달성하고 골드와 경험치를 얻으세요! 나쁜 습관은 당신의 아바타를 다치게 하니, 일상생활을 열심히 하세요! 골드와 경험치를 위해 일일과제를 달성하세요. 주의할 점! 일일과제는 제때 끝내지 못하면 당신의 아바타를 다치게 만들어요. 일상생활을 할일을 달성함으로써 골드와 경험치를 얻으세요. 경험치와 골드로 새로운 보상과 기능을 여세요! 이것들은 당신의 보상들이에요! 습관, 일일과제, 해야할 일들을 일상생활에서 달성하면 골드를 모을 수 있어요. 이 골드를 게임의 보상들이나 스스로 설정한 보상을 구입하는데 사용하세요! diff --git a/Habitica/res/values-ko/strings.xml b/Habitica/res/values-ko/strings.xml index 40378c3f2..b9ba38cd5 100644 --- a/Habitica/res/values-ko/strings.xml +++ b/Habitica/res/values-ko/strings.xml @@ -7,15 +7,19 @@ 데이터를 가져오지 못했습니다 설정 - 당신의 개인서버 - 유저 ID - 당신의 유저ID + 당신의 사용자 지정 서버 + 사용자 ID + 당신의 사용자 ID API 토큰 당신의 API 토큰 + 언어 + Habitica의 언어 바꾸기 당신의 QR코드 연락처 오류가 발생했습니다... 계정 + 주의 첫날 + 모든 캘린더에서 주의 첫날 매일 알림 알림 활성화 알림 시간 설정 @@ -24,6 +28,11 @@ 도전 기회를 얻었습니다. 개인 메시지를 받았습니다. 선물받은 젬 + 선물 받은 구독 + 파티에 초대 받음 + 길드에 초대 받음 + 퀘스트가 시작되었음 + 퀘스트에 초대를 받았음 새로운 할 일 @@ -235,6 +244,7 @@ 사생활 보호 메세지 작성 게시 + 길드 검색 만기: %s 연속 달성: %d 과제가 만기일이 있습니다 @@ -337,5 +347,31 @@ 플레이스토어로 열기 보석 3개를 사용하여 클레스를 바꾸시겠습니까? %1$s로부터 온 메세지 + 확인 + 시장 + 시간 여행자들 + 계절 상점 + 받은 편지함 메시지가 없습니다. 공개 채팅 메시지를 통해 사용자에게 새 메시지를 보낼 수 있습니다! + 친구를 초대하여 잠금 해제하기 + 골드가 충분하지 않음 + 체력 물약을 살 필요가 없음 + %1$s을(를) 성공적으로 구매했음 + 구매 확인 + %1$s을(를) %2$s %3$s(으)로 구매함 + 보석 + 모래시계 + 모래시계 + 골드 + 골드 + 메시지를 클립보드에 복사했음 + 클립보드로 복사함 + 태그 편집 + 편집 + 완료 + 삭제 + 정말이요? + 정말 삭제할까요? + 태그 편집 + 태그로 정렬 diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml index 4a66ad065..f455eafcc 100644 --- a/Habitica/res/values/strings.xml +++ b/Habitica/res/values/strings.xml @@ -413,5 +413,6 @@ To start, which parts of your life do you want to improve? Habitica Do Habit Habitica Dailies Habitica Add Task + Google play services could not be found. diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java b/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java index 14faffe08..b848b0731 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java @@ -54,7 +54,7 @@ import com.habitrpg.android.habitica.ui.fragments.social.party.PartyInviteFragme import com.habitrpg.android.habitica.ui.fragments.social.party.PartyMemberListFragment; import com.habitrpg.android.habitica.ui.fragments.tasks.TaskRecyclerViewFragment; import com.habitrpg.android.habitica.ui.fragments.tasks.TasksFragment; -import com.habitrpg.android.habitica.widget.AvatarStatsWidgetService; +import com.habitrpg.android.habitica.widget.AvatarStatsWidgetProvider; import com.habitrpg.android.habitica.widget.DailiesWidgetProvider; import com.habitrpg.android.habitica.widget.HabitButtonWidgetProvider; import com.habitrpg.android.habitica.widget.HabitButtonWidgetService; @@ -66,7 +66,6 @@ import dagger.Component; @Singleton @Component(modules = {AppModule.class, ApiModule.class}) public interface AppComponent { - void inject(AvatarStatsWidgetService target); void inject(ClassSelectionActivity classSelectionActivity); @@ -177,4 +176,6 @@ public interface AppComponent { void inject(HabitButtonWidgetActivity habitButtonWidgetActivity); void inject(HabitButtonWidgetProvider habitButtonWidgetProvider); + + void inject(AvatarStatsWidgetProvider avatarStatsWidgetProvider); } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.java index b569cb328..4913de933 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.java @@ -38,6 +38,7 @@ import org.json.JSONObject; import android.accounts.AccountManager; import android.app.Dialog; +import android.content.ActivityNotFoundException; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.Color; @@ -45,6 +46,7 @@ import android.net.Uri; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.design.widget.Snackbar; +import android.support.v7.app.AlertDialog; import android.support.v7.preference.PreferenceManager; import android.text.SpannableString; import android.text.style.UnderlineSpan; @@ -414,7 +416,16 @@ public class LoginActivity extends BaseActivity String[] accountTypes = new String[]{"com.google"}; Intent intent = AccountPicker.newChooseAccountIntent(null, null, accountTypes, false, null, null, null, null); - startActivityForResult(intent, REQUEST_CODE_PICK_ACCOUNT); + try { + startActivityForResult(intent, REQUEST_CODE_PICK_ACCOUNT); + } catch (ActivityNotFoundException e) { + Dialog dialog = new AlertDialog.Builder(this) + .setTitle(R.string.authentication_error_title) + .setMessage(R.string.google_services_missing) + .setNegativeButton(R.string.close, (dialogInterface, i) -> dialogInterface.dismiss()) + .create(); + dialog.show(); + } } private void handleGoogleLoginResult() { @@ -423,12 +434,9 @@ public class LoginActivity extends BaseActivity Observable.defer(() -> { try { return Observable.just(GoogleAuthUtil.getToken(LoginActivity.this, googleEmail, scopes)); - } catch (IOException e) { - throw Exceptions.propagate(e); - } catch (GoogleAuthException e) { + } catch (IOException | GoogleAuthException e) { throw Exceptions.propagate(e); } - }) .flatMap(token -> apiHelper.connectSocial("google", googleEmail, token)) .compose(apiHelper.configureApiCallObserver()) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/AvatarStatsWidgetProvider.java b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/AvatarStatsWidgetProvider.java index d735ce993..2c2475828 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/AvatarStatsWidgetProvider.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/AvatarStatsWidgetProvider.java @@ -1,8 +1,20 @@ package com.habitrpg.android.habitica.widget; +import com.habitrpg.android.habitica.APIHelper; +import com.habitrpg.android.habitica.HabiticaApplication; +import com.habitrpg.android.habitica.HostConfig; import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.ui.AvatarView; +import com.habitrpg.android.habitica.ui.activities.MainActivity; +import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; +import com.magicmicky.habitrpgwrapper.lib.models.Stats; +import com.raizlabs.android.dbflow.runtime.transaction.BaseTransaction; +import com.raizlabs.android.dbflow.runtime.transaction.TransactionListener; +import com.raizlabs.android.dbflow.sql.builder.Condition; +import com.raizlabs.android.dbflow.sql.language.Select; import android.annotation.TargetApi; +import android.app.PendingIntent; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProvider; import android.content.ComponentName; @@ -14,35 +26,39 @@ import android.util.Log; import android.view.View; import android.widget.RemoteViews; +import javax.inject.Inject; + public class AvatarStatsWidgetProvider extends BaseWidgetProvider { private static final String LOG = AvatarStatsWidgetProvider.class.getName(); + private AppWidgetManager appWidgetManager; @Override public int layoutResourceId() { return R.layout.widget_avatar_stats; } + @Inject + APIHelper apiHelper; + @Inject + HostConfig hostConfig; + + private void setUp(Context context) { + if (apiHelper == null) { + HabiticaApplication application = HabiticaApplication.getInstance(context); + application.getComponent().inject(this); + } + } + @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { - // Get all ids + this.setUp(context); + this.appWidgetManager = appWidgetManager; + this.context = context; ComponentName thisWidget = new ComponentName(context, AvatarStatsWidgetProvider.class); int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget); - if (Build.VERSION.SDK_INT >= 16) { - for (int widgetId : allWidgetIds) { - Bundle options = appWidgetManager.getAppWidgetOptions(widgetId); - appWidgetManager.partiallyUpdateAppWidget(widgetId, - sizeRemoteViews(context, options, widgetId)); - } - } - - // Build the intent to call the service - Intent intent = new Intent(context.getApplicationContext(), - AvatarStatsWidgetService.class); - intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, allWidgetIds); - - context.startService(intent); + new Select().from(HabitRPGUser.class).where(Condition.column("id").eq(hostConfig.getUser())).async().querySingle(userTransactionListener); } @@ -64,4 +80,75 @@ public class AvatarStatsWidgetProvider extends BaseWidgetProvider { return remoteViews; } + + private TransactionListener userTransactionListener = new TransactionListener() { + @Override + public void onResultReceived(HabitRPGUser habitRPGUser) { + updateData(habitRPGUser); + } + + @Override + public boolean onReady(BaseTransaction baseTransaction) { + return true; + } + + @Override + public boolean hasResult(BaseTransaction baseTransaction, HabitRPGUser habitRPGUser) { + return true; + } + }; + + private void updateData(HabitRPGUser user) { + if (user == null || user.getStats() == null) { + return; + } + Stats stats = user.getStats(); + ComponentName thisWidget = new ComponentName(context, AvatarStatsWidgetProvider.class); + int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget); + String healthValueString = "" + stats.getHp().intValue() + "/" + stats.getMaxHealth(); + String expValueString = "" + stats.getExp().intValue() + "/" + stats.getToNextLevel(); + String mpValueString = "" + stats.getMp().intValue() + "/" + stats.getMaxMP(); + + for (int widgetId : allWidgetIds) { + RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_avatar_stats); + + remoteViews.setTextViewText(R.id.TV_hp_value, healthValueString); + remoteViews.setTextViewText(R.id.exp_TV_value, expValueString); + remoteViews.setTextViewText(R.id.mp_TV_value, mpValueString); + + remoteViews.setProgressBar(R.id.hp_bar, stats.getMaxHealth(), stats.getHp().intValue(), false); + remoteViews.setProgressBar(R.id.exp_bar, stats.getToNextLevel(), stats.getExp().intValue(), false); + remoteViews.setProgressBar(R.id.mp_bar, stats.getMaxMP(), stats.getMp().intValue(), false); + remoteViews.setViewVisibility(R.id.mp_wrapper, (stats.get_class() == null || stats.getLvl() < 10 || user.getPreferences().getDisableClasses()) ? View.GONE : View.VISIBLE); + + int gp = (stats.getGp().intValue()); + int sp = (int) ((stats.getGp() - gp) * 100); + remoteViews.setTextViewText(R.id.gold_tv, String.valueOf(gp)); + remoteViews.setTextViewText(R.id.silver_tv, String.valueOf(sp)); + remoteViews.setTextViewText(R.id.gems_tv, String.valueOf((int) (user.getBalance() * 4))); + remoteViews.setTextViewText(R.id.lvl_tv, context.getString(R.string.user_level, user.getStats().getLvl().toString())); + + AvatarView avatarView = new AvatarView(context, true, true, true); + ; + avatarView.setUser(user); + RemoteViews finalRemoteViews = remoteViews; + avatarView.onAvatarImageReady(bitmap -> { + finalRemoteViews.setImageViewBitmap(R.id.avatar_view, bitmap); + appWidgetManager.partiallyUpdateAppWidget(allWidgetIds, finalRemoteViews); + }); + + //If user click on life and xp: open the app + Intent openAppIntent = new Intent(context.getApplicationContext(), MainActivity.class); + PendingIntent openApp = PendingIntent.getActivity(context, 0, openAppIntent, PendingIntent.FLAG_UPDATE_CURRENT); + remoteViews.setOnClickPendingIntent(R.id.widget_main_view, openApp); + + + if (Build.VERSION.SDK_INT >= 16) { + Bundle options = appWidgetManager.getAppWidgetOptions(widgetId); + remoteViews = sizeRemoteViews(context, options, widgetId); + } + + appWidgetManager.updateAppWidget(widgetId, remoteViews); + } + } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/AvatarStatsWidgetService.java b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/AvatarStatsWidgetService.java deleted file mode 100644 index f958f0eac..000000000 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/AvatarStatsWidgetService.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.habitrpg.android.habitica.widget; - -import android.app.PendingIntent; -import android.app.Service; -import android.appwidget.AppWidgetManager; -import android.content.ComponentName; -import android.content.Intent; -import android.os.Build; -import android.os.IBinder; -import android.view.View; -import android.widget.RemoteViews; - -import com.habitrpg.android.habitica.HabiticaApplication; -import com.habitrpg.android.habitica.HostConfig; -import com.habitrpg.android.habitica.R; -import com.habitrpg.android.habitica.ui.AvatarView; -import com.habitrpg.android.habitica.ui.activities.MainActivity; -import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; -import com.magicmicky.habitrpgwrapper.lib.models.Stats; -import com.raizlabs.android.dbflow.runtime.transaction.BaseTransaction; -import com.raizlabs.android.dbflow.runtime.transaction.TransactionListener; -import com.raizlabs.android.dbflow.sql.builder.Condition; -import com.raizlabs.android.dbflow.sql.language.Select; - -import javax.inject.Inject; - -public class AvatarStatsWidgetService extends Service { - private static final String LOG = ".avatarwidget.service"; - @Inject - public HostConfig hostConfig; - private AppWidgetManager appWidgetManager; - - - @Override - public int onStartCommand(final Intent intent, int flags, int startId) { - HabiticaApplication application = (HabiticaApplication) getApplication(); - application.getComponent().inject(this); - this.appWidgetManager = AppWidgetManager.getInstance(this); - - new Select().from(HabitRPGUser.class).where(Condition.column("id").eq(hostConfig.getUser())).async().querySingle(userTransactionListener); - - stopSelf(); - - return START_STICKY; - } - - private TransactionListener userTransactionListener = new TransactionListener() { - @Override - public void onResultReceived(HabitRPGUser habitRPGUser) { - updateData(habitRPGUser); - } - - @Override - public boolean onReady(BaseTransaction baseTransaction) { - return true; - } - - @Override - public boolean hasResult(BaseTransaction baseTransaction, HabitRPGUser habitRPGUser) { - return true; - } - }; - - private void updateData(HabitRPGUser user) { - if (user == null || user.getStats() == null) { - return; - } - Stats stats = user.getStats(); - ComponentName thisWidget = new ComponentName(this, AvatarStatsWidgetProvider.class); - int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget); - String healthValueString = "" + stats.getHp().intValue() + "/" + stats.getMaxHealth(); - String expValueString = "" + stats.getExp().intValue() + "/" + stats.getToNextLevel(); - String mpValueString = "" + stats.getMp().intValue() + "/" + stats.getMaxMP(); - - RemoteViews remoteViews = new RemoteViews(this.getPackageName(), R.layout.widget_avatar_stats); - - remoteViews.setTextViewText(R.id.TV_hp_value, healthValueString); - remoteViews.setTextViewText(R.id.exp_TV_value, expValueString); - remoteViews.setTextViewText(R.id.mp_TV_value, mpValueString); - - remoteViews.setProgressBar(R.id.hp_bar, stats.getMaxHealth(), stats.getHp().intValue(), false); - remoteViews.setProgressBar(R.id.exp_bar, stats.getToNextLevel(), stats.getExp().intValue(), false); - remoteViews.setProgressBar(R.id.mp_bar, stats.getMaxMP(), stats.getMp().intValue(), false); - remoteViews.setViewVisibility(R.id.mp_wrapper, (stats.get_class() == null || stats.getLvl() < 10 || user.getPreferences().getDisableClasses()) ? View.GONE : View.VISIBLE); - - int gp = (stats.getGp().intValue()); - int sp = (int) ((stats.getGp() - gp) * 100); - remoteViews.setTextViewText(R.id.gold_tv, String.valueOf(gp)); - remoteViews.setTextViewText(R.id.silver_tv, String.valueOf(sp)); - remoteViews.setTextViewText(R.id.gems_tv, String.valueOf((int)(user.getBalance() * 4))); - remoteViews.setTextViewText(R.id.lvl_tv, getString(R.string.user_level, user.getStats().getLvl())); - - AvatarView avatarView = new AvatarView(this, true, true, true);; - avatarView.setUser(user); - avatarView.onAvatarImageReady(bitmap -> { - remoteViews.setImageViewBitmap(R.id.avatar_view, bitmap); - appWidgetManager.partiallyUpdateAppWidget(allWidgetIds, remoteViews); - }); - - //If user click on life and xp: open the app - Intent openAppIntent = new Intent(this.getApplicationContext(), MainActivity.class); - PendingIntent openApp = PendingIntent.getActivity(this, 0, openAppIntent, PendingIntent.FLAG_UPDATE_CURRENT); - remoteViews.setOnClickPendingIntent(R.id.widget_main_view, openApp); - if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - appWidgetManager.partiallyUpdateAppWidget(allWidgetIds, remoteViews); - } else { - appWidgetManager.updateAppWidget(allWidgetIds, remoteViews); - } - } - - @Override - public IBinder onBind(Intent intent) { - return null; - } -} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesListProvider.java b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesListProvider.java index d9578f2a2..e1c035133 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesListProvider.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesListProvider.java @@ -45,7 +45,9 @@ public class DailiesListProvider implements RemoteViewsService.RemoteViewsFactor taskList = tasks; this.reloadData = false; AppWidgetManager.getInstance(context).notifyAppWidgetViewDataChanged(widgetId, R.id.list_view); - }, throwable -> {}); + }, throwable -> { + this.reloadData = false; + }); } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesWidgetProvider.java b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesWidgetProvider.java index ee513b063..c486a3bf7 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesWidgetProvider.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesWidgetProvider.java @@ -94,11 +94,9 @@ public class DailiesWidgetProvider extends BaseWidgetProvider { PendingIntent.FLAG_UPDATE_CURRENT); rv.setPendingIntentTemplate(R.id.list_view, toastPendingIntent); - if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - appWidgetManager.partiallyUpdateAppWidget(appWidgetIds[i], rv); - } else { - appWidgetManager.updateAppWidget(appWidgetIds[i], rv); - } + appWidgetManager.updateAppWidget(appWidgetIds[i], rv); + + AppWidgetManager.getInstance(context).notifyAppWidgetViewDataChanged(appWidgetIds[i], R.id.list_view); } super.onUpdate(context, appWidgetManager, appWidgetIds); } @@ -112,4 +110,4 @@ public class DailiesWidgetProvider extends BaseWidgetProvider { public RemoteViews configureRemoteViews(RemoteViews remoteViews, int widgetId, int columns, int rows) { return remoteViews; } -} +} \ No newline at end of file diff --git a/translations/store_strings-ko.xml b/translations/store_strings-ko.xml index ced1f4267..0195849e1 100644 --- a/translations/store_strings-ko.xml +++ b/translations/store_strings-ko.xml @@ -1,6 +1,6 @@ - 게임처럼 당신의 인생을 치료 동기 부여 및 조직 유지 합니다! + 인생을 게임처럼 다루어서 동기를 부여하고 체계를 잡으세요! HabitRPG 에서NEW 앱 ! 부드러운 경험과 더 features. 에 대해 처음부터 다시 작성 From beb2dba92e3d88351d829df32bf7bededd66ffd8 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Fri, 30 Sep 2016 18:08:07 +0200 Subject: [PATCH 07/15] clean up unused code bit --- .../android/habitica/widget/AvatarStatsWidgetProvider.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/AvatarStatsWidgetProvider.java b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/AvatarStatsWidgetProvider.java index 2c2475828..cfd98bfee 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/AvatarStatsWidgetProvider.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/AvatarStatsWidgetProvider.java @@ -13,16 +13,13 @@ import com.raizlabs.android.dbflow.runtime.transaction.TransactionListener; import com.raizlabs.android.dbflow.sql.builder.Condition; import com.raizlabs.android.dbflow.sql.language.Select; -import android.annotation.TargetApi; import android.app.PendingIntent; import android.appwidget.AppWidgetManager; -import android.appwidget.AppWidgetProvider; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.os.Build; import android.os.Bundle; -import android.util.Log; import android.view.View; import android.widget.RemoteViews; @@ -54,9 +51,6 @@ public class AvatarStatsWidgetProvider extends BaseWidgetProvider { this.setUp(context); this.appWidgetManager = appWidgetManager; this.context = context; - ComponentName thisWidget = new ComponentName(context, - AvatarStatsWidgetProvider.class); - int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget); new Select().from(HabitRPGUser.class).where(Condition.column("id").eq(hostConfig.getUser())).async().querySingle(userTransactionListener); } From 0b47d4da80011a2e3189b091b68f1c73a43ccaaf Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Fri, 30 Sep 2016 19:54:59 +0200 Subject: [PATCH 08/15] fix potential login crash --- Habitica/build.gradle | 2 +- .../habitrpg/android/habitica/ui/activities/LoginActivity.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Habitica/build.gradle b/Habitica/build.gradle index 31f6af158..8c320e647 100644 --- a/Habitica/build.gradle +++ b/Habitica/build.gradle @@ -12,7 +12,7 @@ buildscript { dependencies { classpath 'io.fabric.tools:gradle:1.21.5' classpath 'me.tatarka:gradle-retrolambda:3.2.5' - classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.4.4' + classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.6.1' classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' classpath 'com.jakewharton.hugo:hugo-plugin:1.2.1' } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.java index 4913de933..3aded1ed6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.java @@ -442,7 +442,7 @@ public class LoginActivity extends BaseActivity .compose(apiHelper.configureApiCallObserver()) .subscribe(LoginActivity.this, throwable -> { hideProgress(); - if (GoogleAuthException.class.isAssignableFrom(throwable.getCause().getClass())) { + if (throwable.getCause() != null && GoogleAuthException.class.isAssignableFrom(throwable.getCause().getClass())) { handleGoogleAuthException((GoogleAuthException)throwable.getCause()); } }); From 3313edac157aea80333462703a2afcb4c12eef59 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Fri, 30 Sep 2016 19:57:45 +0200 Subject: [PATCH 09/15] bump version --- Habitica/AndroidManifest.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Habitica/AndroidManifest.xml b/Habitica/AndroidManifest.xml index c465e1748..46b4789a0 100644 --- a/Habitica/AndroidManifest.xml +++ b/Habitica/AndroidManifest.xml @@ -2,8 +2,8 @@ From e0dfda1b218c4b5ef4282fedfa9fae5fc97825d7 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Sat, 1 Oct 2016 19:42:25 +0200 Subject: [PATCH 10/15] fix various crashes --- .../habitica/ui/activities/LoginActivity.java | 2 +- .../social/GroupInformationFragment.java | 2 +- .../fragments/social/party/PartyFragment.java | 16 ++------ .../ui/fragments/tasks/TasksFragment.java | 8 +++- .../widget/HabitButtonWidgetService.java | 37 ++++++++++--------- 5 files changed, 31 insertions(+), 34 deletions(-) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.java index 3aded1ed6..142f611e3 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.java @@ -403,7 +403,7 @@ public class LoginActivity extends BaseActivity e.printStackTrace(); } - if (this.isRegistering || userAuthResponse.getNewUser()) { + if (userAuthResponse.getNewUser()) { this.startSetupActivity(); } else { AmplitudeManager.sendEvent("login", AmplitudeManager.EVENT_CATEGORY_BEHAVIOUR, AmplitudeManager.EVENT_HITTYPE_EVENT); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/GroupInformationFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/GroupInformationFragment.java index 0b015a096..854fa3b07 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/GroupInformationFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/GroupInformationFragment.java @@ -107,7 +107,7 @@ public class GroupInformationFragment extends BaseFragment { QrCodeManager qrCodeManager = new QrCodeManager(this.getContext()); qrCodeManager.setUpView(qrLayout); - if (user.getInvitations().getParty() != null && user.getInvitations().getParty().getId() != null) { + if (user != null && user.getInvitations().getParty() != null && user.getInvitations().getParty().getId() != null) { viewBinding.setInvitation(user.getInvitations().getParty()); } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyFragment.java index 4eb77eb5e..3ecd129dd 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyFragment.java @@ -84,16 +84,6 @@ public class PartyFragment extends BaseMainFragment { }); }, throwable -> { }); - } else { -// AlertDialog.Builder builder = new AlertDialog.Builder(activity) -// .setMessage(activity.getString(R.string.no_party_message)) -// .setNeutralButton(android.R.string.ok, (dialog, which) -> { -// activity.getSupportFragmentManager().popBackStackImmediate(); -// }); -// builder.show(); -// if (tabLayout != null) { -// tabLayout.removeAllTabs(); -// } } @@ -112,7 +102,9 @@ public class PartyFragment extends BaseMainFragment { } private void updateGroupUI() { - viewPagerAdapter.notifyDataSetChanged(); + if (viewPagerAdapter != null) { + viewPagerAdapter.notifyDataSetChanged(); + } if (tabLayout != null) { if (group == null) { @@ -137,7 +129,7 @@ public class PartyFragment extends BaseMainFragment { PartyFragment.this.activity.supportInvalidateOptionsMenu(); - if (group.quest != null && group.quest.key != null && !group.quest.key.isEmpty()) { + if (group != null && group.quest != null && group.quest.key != null && !group.quest.key.isEmpty()) { contentCache.GetQuestContent(group.quest.key, content -> { if (groupInformationFragment != null) { groupInformationFragment.setQuestContent(content); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.java index ca77a135f..38cabced6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.java @@ -492,7 +492,9 @@ public class TasksFragment extends BaseMainFragment implements OnCheckedChangeLi ); } } - this.activity.fillFilterDrawer(items); + if (isAdded()) { + this.activity.fillFilterDrawer(items); + } }else { items.add(new EditTagsSectionDrawer().withEditing(this.editingTags).withName(getString(R.string.filter_drawer_filter_tags))); items.add(new EditTextDrawer()); @@ -506,7 +508,9 @@ public class TasksFragment extends BaseMainFragment implements OnCheckedChangeLi ); } } - this.activity.fillFilterDrawer(items); + if (isAdded()) { + this.activity.fillFilterDrawer(items); + } } } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/HabitButtonWidgetService.java b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/HabitButtonWidgetService.java index bdaea8c9b..a5411ee79 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/HabitButtonWidgetService.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/HabitButtonWidgetService.java @@ -79,26 +79,27 @@ public class HabitButtonWidgetService extends Service { private void updateData(Task task) { RemoteViews remoteViews = new RemoteViews(this.getPackageName(), R.layout.widget_habit_button); - remoteViews.setTextViewText(R.id.habit_title, task.text); + if (task != null) { + remoteViews.setTextViewText(R.id.habit_title, task.text); - if (!task.getUp()) { - remoteViews.setViewVisibility(R.id.btnPlusWrapper, View.GONE); - remoteViews.setOnClickPendingIntent(R.id.btnPlusWrapper, null); - } else { - remoteViews.setViewVisibility(R.id.btnPlusWrapper, View.VISIBLE); - remoteViews.setInt(R.id.btnPlus, "setBackgroundColor", resources.getColor(task.getLightTaskColor())); - remoteViews.setOnClickPendingIntent(R.id.btnPlusWrapper, getPendingIntent(task.getId(), TaskDirection.up.toString(), taskMapping.get(task.getId()))); + if (!task.getUp()) { + remoteViews.setViewVisibility(R.id.btnPlusWrapper, View.GONE); + remoteViews.setOnClickPendingIntent(R.id.btnPlusWrapper, null); + } else { + remoteViews.setViewVisibility(R.id.btnPlusWrapper, View.VISIBLE); + remoteViews.setInt(R.id.btnPlus, "setBackgroundColor", resources.getColor(task.getLightTaskColor())); + remoteViews.setOnClickPendingIntent(R.id.btnPlusWrapper, getPendingIntent(task.getId(), TaskDirection.up.toString(), taskMapping.get(task.getId()))); + } + if (!task.getDown()) { + remoteViews.setViewVisibility(R.id.btnMinusWrapper, View.GONE); + remoteViews.setOnClickPendingIntent(R.id.btnMinusWrapper, null); + } else { + remoteViews.setViewVisibility(R.id.btnMinusWrapper, View.VISIBLE); + remoteViews.setInt(R.id.btnMinus, "setBackgroundColor", resources.getColor(task.getMediumTaskColor())); + remoteViews.setOnClickPendingIntent(R.id.btnMinusWrapper, getPendingIntent(task.getId(), TaskDirection.down.toString() , taskMapping.get(task.getId()))); + } + appWidgetManager.updateAppWidget(taskMapping.get(task.getId()), remoteViews); } - if (!task.getDown()) { - remoteViews.setViewVisibility(R.id.btnMinusWrapper, View.GONE); - remoteViews.setOnClickPendingIntent(R.id.btnMinusWrapper, null); - } else { - remoteViews.setViewVisibility(R.id.btnMinusWrapper, View.VISIBLE); - remoteViews.setInt(R.id.btnMinus, "setBackgroundColor", resources.getColor(task.getMediumTaskColor())); - remoteViews.setOnClickPendingIntent(R.id.btnMinusWrapper, getPendingIntent(task.getId(), TaskDirection.down.toString() , taskMapping.get(task.getId()))); - } - - appWidgetManager.updateAppWidget(taskMapping.get(task.getId()), remoteViews); } @Override From b7b9cdb4dd2797ce819d184220ce2bfb70df1f15 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Sat, 1 Oct 2016 19:43:42 +0200 Subject: [PATCH 11/15] update translations --- Habitica/AndroidManifest.xml | 2 +- Habitica/res/values-de/strings.xml | 3 ++- Habitica/res/values-ko/strings.xml | 3 ++- Habitica/res/values-pl/strings.xml | 10 ++++++++++ 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/Habitica/AndroidManifest.xml b/Habitica/AndroidManifest.xml index 46b4789a0..a7ef0b4a6 100644 --- a/Habitica/AndroidManifest.xml +++ b/Habitica/AndroidManifest.xml @@ -2,7 +2,7 @@ diff --git a/Habitica/res/values-de/strings.xml b/Habitica/res/values-de/strings.xml index feb223792..4e213fcdf 100644 --- a/Habitica/res/values-de/strings.xml +++ b/Habitica/res/values-de/strings.xml @@ -377,13 +377,14 @@ Für den Anfang: Welche Bereiche Deines Lebens möchtest Du verbessern? QR Code scannen ID des Empfängers eingeben Du wurdest in eine Gruppe eingeladen! - Habitica Statistiken + Habitica: Avatar Neue Aufgabe Neue Gewohnheit Neue Tägliche Aufgabe Neue To-Do Neue Belohnung Du hast alle deine täglichen Aufgaben erledigt. Gut gemacht! + Habitica: Gewohnheit Habitica: Tägliche Aufgaben Habitica: Neue Aufgabe diff --git a/Habitica/res/values-ko/strings.xml b/Habitica/res/values-ko/strings.xml index b9ba38cd5..795f52f71 100644 --- a/Habitica/res/values-ko/strings.xml +++ b/Habitica/res/values-ko/strings.xml @@ -252,7 +252,7 @@ 의상 머리 머리 장식 - 안경휴 + 안경 갑옷 @@ -374,4 +374,5 @@ 태그 편집 태그로 정렬 + 나의 QR 코드 diff --git a/Habitica/res/values-pl/strings.xml b/Habitica/res/values-pl/strings.xml index 531989ca3..11f7209d1 100644 --- a/Habitica/res/values-pl/strings.xml +++ b/Habitica/res/values-pl/strings.xml @@ -12,10 +12,14 @@ Twój identyfikator Token API Twój Token API + Język + Zmień język Habitici Twój kod QR Skontaktuj się ze mną Wystąpił błąd... Konto + Pierwszy Dzień Tygodnia + Pierwszy dzień tygodnia we wszystkich kalendarzach Przypominienie Aktywuj przypomnienie Ustaw czas przypomnienia @@ -372,4 +376,10 @@ Od czego chcesz zacząć poprawiać swoje życie? Kontynuuj Przeskanuj kod QR Zostałeś zaproszony do drużyny! + Dodaj Zadanie + Dodaj Nawyk + Dodaj Codzienne + Dodaj Do-Zrobienia + Dodaj Nagrodę + Wykonałeś wszystkie codzienne. Brawo! From f7d3981eec69d0c23aa50a266db9eae28ce07e8a Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Sun, 2 Oct 2016 02:33:25 +0200 Subject: [PATCH 12/15] fix avatar setup issues --- .../ui/fragments/setup/AvatarSetupFragment.java | 15 +++++++++++++-- .../habitrpgwrapper/lib/models/Preferences.java | 3 +++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/AvatarSetupFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/AvatarSetupFragment.java index 842391a6c..2b4ae10ac 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/AvatarSetupFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/AvatarSetupFragment.java @@ -1,5 +1,6 @@ package com.habitrpg.android.habitica.ui.fragments.setup; +import com.habitrpg.android.habitica.APIHelper; import com.habitrpg.android.habitica.R; import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.ui.AvatarView; @@ -23,6 +24,8 @@ import android.view.ViewGroup; import java.util.List; +import javax.inject.Inject; + import butterknife.BindView; import butterknife.ButterKnife; @@ -39,6 +42,9 @@ public class AvatarSetupFragment extends BaseFragment { GridLayoutManager layoutManager; private HabitRPGUser user; + @Inject + APIHelper apiHelper; + @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -96,12 +102,17 @@ public class AvatarSetupFragment extends BaseFragment { Where select = new Select() .from(Customization.class) - .where(Condition.CombinedCondition.begin(Condition.column("purchased").eq(true)) - .or(Condition.column("price").eq(0)) + .where(Condition.CombinedCondition.begin(Condition.column("price").eq(0)) .or(Condition.column("price").isNull()) ); List customizations = select.queryList(); + if (customizations.size() == 0) { + this.apiHelper.getContent().compose(this.apiHelper.configureApiCallObserver()) + .subscribe(contentResult -> { + this.loadCustomizations(); + }, throwable -> {}); + } this.adapter.setCustomizationList(customizations); } diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/Preferences.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/Preferences.java index 1f310e4dd..4bd6fc991 100644 --- a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/Preferences.java +++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/Preferences.java @@ -213,6 +213,9 @@ public class Preferences extends BaseModel { @Override public void save() { + if (user_id == null) { + return; + } hair.userId = user_id; if (suppressModals != null) From 0d76a75b3eb7e650375dac9f82e5dc346eb3a0ab Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Sun, 2 Oct 2016 17:26:18 +0200 Subject: [PATCH 13/15] add debug logging to database file name --- .../com/habitrpg/android/habitica/HabiticaApplication.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaApplication.java b/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaApplication.java index d10318b2d..f27a5ad33 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaApplication.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaApplication.java @@ -313,7 +313,9 @@ public class HabiticaApplication extends MultiDexApplication { @Override public File getDatabasePath(String name) { - return new File(getExternalFilesDir(null), "HabiticaDatabase/" + name); + File dbFile = new File(getExternalFilesDir(null), "HabiticaDatabase/" + name); + Crashlytics.setString("Database File", dbFile.getAbsolutePath()); + return dbFile; } private void createBillingAndCheckout() { From 12043dad1a47278d9cc95d33c9e10eebcde964f1 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Sun, 2 Oct 2016 17:26:28 +0200 Subject: [PATCH 14/15] allow dailies widget to be smaller --- Habitica/AndroidManifest.xml | 2 +- Habitica/res/xml/dailies_task_widget_info.xml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Habitica/AndroidManifest.xml b/Habitica/AndroidManifest.xml index a7ef0b4a6..69578283f 100644 --- a/Habitica/AndroidManifest.xml +++ b/Habitica/AndroidManifest.xml @@ -2,7 +2,7 @@ diff --git a/Habitica/res/xml/dailies_task_widget_info.xml b/Habitica/res/xml/dailies_task_widget_info.xml index b775c57c7..db0b85187 100644 --- a/Habitica/res/xml/dailies_task_widget_info.xml +++ b/Habitica/res/xml/dailies_task_widget_info.xml @@ -1,8 +1,8 @@ From 6959da071d8b032be0f744f5a26b3c6e42e4ccd5 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Mon, 3 Oct 2016 16:02:35 +0200 Subject: [PATCH 15/15] bump build number --- Habitica/AndroidManifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Habitica/AndroidManifest.xml b/Habitica/AndroidManifest.xml index 69578283f..49fff089c 100644 --- a/Habitica/AndroidManifest.xml +++ b/Habitica/AndroidManifest.xml @@ -2,7 +2,7 @@