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. 에 대해 처음부터 다시 작성