diff --git a/Habitica/AndroidManifest.xml b/Habitica/AndroidManifest.xml index d36a69485..b8eb2b9fe 100644 --- a/Habitica/AndroidManifest.xml +++ b/Habitica/AndroidManifest.xml @@ -2,8 +2,8 @@ @@ -210,7 +210,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..4e213fcdf 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,16 @@ 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: 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-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-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..795f52f71 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 과제가 만기일이 있습니다 @@ -242,7 +252,7 @@ 의상 머리 머리 장식 - 안경휴 + 안경 갑옷 @@ -337,5 +347,32 @@ 플레이스토어로 열기 보석 3개를 사용하여 클레스를 바꾸시겠습니까? %1$s로부터 온 메세지 + 확인 + 시장 + 시간 여행자들 + 계절 상점 + 받은 편지함 메시지가 없습니다. 공개 채팅 메시지를 통해 사용자에게 새 메시지를 보낼 수 있습니다! + 친구를 초대하여 잠금 해제하기 + 골드가 충분하지 않음 + 체력 물약을 살 필요가 없음 + %1$s을(를) 성공적으로 구매했음 + 구매 확인 + %1$s을(를) %2$s %3$s(으)로 구매함 + 보석 + 모래시계 + 모래시계 + 골드 + 골드 + 메시지를 클립보드에 복사했음 + 클립보드로 복사함 + 태그 편집 + 편집 + 완료 + 삭제 + 정말이요? + 정말 삭제할까요? + 태그 편집 + 태그로 정렬 + 나의 QR 코드 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! 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! diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml index 234899388..8cc0aba4a 100644 --- a/Habitica/res/values/strings.xml +++ b/Habitica/res/values/strings.xml @@ -414,6 +414,7 @@ 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. use 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 @@ 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() { 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 e15232b84..d3b891564 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 @@ -55,7 +55,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; @@ -67,7 +67,6 @@ import dagger.Component; @Singleton @Component(modules = {AppModule.class, ApiModule.class}) public interface AppComponent { - void inject(AvatarStatsWidgetService target); void inject(ClassSelectionActivity classSelectionActivity); @@ -180,4 +179,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..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 @@ -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; @@ -401,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); @@ -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,18 +434,15 @@ 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()) .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()); } }); 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/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 1812f43a8..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,13 +102,17 @@ public class PartyFragment extends BaseMainFragment { } private void updateGroupUI() { - viewPagerAdapter.notifyDataSetChanged(); + if (viewPagerAdapter != null) { + 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) { @@ -135,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 069900afd..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 @@ -484,25 +484,33 @@ 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) + ); + } + } + if (isAdded()) { + this.activity.fillFilterDrawer(items); } - 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) + ); + } + } + if (isAdded()) { + this.activity.fillFilterDrawer(items); } - this.activity.fillFilterDrawer(items); } } } 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..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 @@ -1,48 +1,58 @@ 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; 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; +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 - ComponentName thisWidget = new ComponentName(context, - AvatarStatsWidgetProvider.class); - int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget); + this.setUp(context); + this.appWidgetManager = appWidgetManager; + this.context = context; - 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 +74,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 1af3b4c08..000000000 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/AvatarStatsWidgetService.java +++ /dev/null @@ -1,110 +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.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); - appWidgetManager.partiallyUpdateAppWidget(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 042fbb707..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,7 +94,9 @@ public class DailiesWidgetProvider extends BaseWidgetProvider { PendingIntent.FLAG_UPDATE_CURRENT); rv.setPendingIntentTemplate(R.id.list_view, toastPendingIntent); - appWidgetManager.partiallyUpdateAppWidget(appWidgetIds[i], rv); + appWidgetManager.updateAppWidget(appWidgetIds[i], rv); + + AppWidgetManager.getInstance(context).notifyAppWidgetViewDataChanged(appWidgetIds[i], R.id.list_view); } super.onUpdate(context, appWidgetManager, appWidgetIds); } @@ -108,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/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 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) 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..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 @@ -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; } 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. 에 대해 처음부터 다시 작성