mirror of
https://github.com/sudoxnym/habitica-android.git
synced 2026-05-19 12:18:59 +00:00
commit
3691246b52
50 changed files with 1021 additions and 64 deletions
|
|
@ -24,7 +24,7 @@ android:
|
|||
- tools
|
||||
|
||||
# The BuildTools version used by your project
|
||||
- build-tools-23.0.3
|
||||
- build-tools-24.0.1
|
||||
|
||||
# The SDK version used to compile your project
|
||||
- android-24
|
||||
|
|
|
|||
|
|
@ -19,6 +19,12 @@ source_file = Habitica/res/values/strings.tutorial.xml
|
|||
source_lang = en
|
||||
type = ANDROID
|
||||
|
||||
[habitica-android.stringsprofilexml]
|
||||
file_filter = Habitica/res/values-<lang>/strings.profile.xml
|
||||
source_file = Habitica/res/values/strings.profile.xml
|
||||
source_lang = en
|
||||
type = ANDROID
|
||||
|
||||
[habitica-android.stringsxml]
|
||||
file_filter = Habitica/res/values-<lang>/strings.xml
|
||||
source_file = Habitica/res/values/strings.xml
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
package="com.habitrpg.android.habitica"
|
||||
android:versionCode="115"
|
||||
android:versionCode="117"
|
||||
android:versionName="0.0.33.2"
|
||||
android:screenOrientation="portrait"
|
||||
android:installLocation="auto" >
|
||||
|
|
@ -163,7 +163,7 @@
|
|||
|
||||
<provider
|
||||
android:name="android.support.v4.content.FileProvider"
|
||||
android:authorities="com.habitrpg.android.habitica.fileprovider"
|
||||
android:authorities="@string/content_provider"
|
||||
android:grantUriPermissions="true"
|
||||
android:exported="false">
|
||||
<meta-data
|
||||
|
|
|
|||
|
|
@ -71,11 +71,11 @@ dependencies {
|
|||
compile('com.mikepenz:materialdrawer:5.3.6@aar') {
|
||||
transitive = true
|
||||
}
|
||||
compile 'com.android.support:appcompat-v7:24.1.1'
|
||||
compile 'com.android.support:design:24.1.1'
|
||||
compile 'com.android.support:gridlayout-v7:24.1.1'
|
||||
compile 'com.android.support:recyclerview-v7:24.1.1'
|
||||
compile 'com.android.support:preference-v14:24.1.1'
|
||||
compile 'com.android.support:appcompat-v7:24.2.0'
|
||||
compile 'com.android.support:design:24.2.0'
|
||||
compile 'com.android.support:gridlayout-v7:24.2.0'
|
||||
compile 'com.android.support:recyclerview-v7:24.2.0'
|
||||
compile 'com.android.support:preference-v14:24.2.0'
|
||||
compile 'com.android.support:multidex:1.0.1'
|
||||
|
||||
// Image Loading/Caching
|
||||
|
|
@ -131,7 +131,6 @@ dependencies {
|
|||
exclude module: 'bolts-android'
|
||||
}
|
||||
//Tests
|
||||
compile 'com.android.support:appcompat-v7:24.1.1'
|
||||
testCompile "junit:junit:4.10"
|
||||
testCompile "org.assertj:assertj-core:1.7.0"
|
||||
testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3.1'
|
||||
|
|
@ -151,7 +150,7 @@ dependencies {
|
|||
|
||||
android {
|
||||
compileSdkVersion 24
|
||||
buildToolsVersion "23.0.3"
|
||||
buildToolsVersion "24.0.1"
|
||||
|
||||
defaultConfig {
|
||||
applicationId "com.habitrpg.android.habitica"
|
||||
|
|
@ -171,11 +170,17 @@ android {
|
|||
// Disable fabric build ID generation for debug builds
|
||||
ext.enableCrashlytics = false
|
||||
multiDexEnabled true
|
||||
|
||||
resValue "string", "content_provider", "com.habitrpg.android.habitica.debug.fileprovider"
|
||||
resValue "string", "app_name", "Habitica Debug"
|
||||
}
|
||||
release {
|
||||
signingConfig signingConfigs.release
|
||||
debuggable false
|
||||
multiDexEnabled true
|
||||
|
||||
resValue "string", "content_provider", "com.habitrpg.android.habitica.fileprovider"
|
||||
resValue "string", "app_name", "Habitica"
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
21
Habitica/res/layout/dialog_choose_message_recipient.xml
Normal file
21
Habitica/res/layout/dialog_choose_message_recipient.xml
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/enter_recipient_uuid"/>
|
||||
<EditText
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/uuidEditText" android:layout_gravity="center_horizontal"
|
||||
android:focusable="true" android:singleLine="true"/>
|
||||
<Button
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/scan_qr_code"
|
||||
android:id="@+id/scanQRCodeButton"/>
|
||||
</LinearLayout>
|
||||
20
Habitica/res/layout/dialog_edit_tag.xml
Normal file
20
Habitica/res/layout/dialog_edit_tag.xml
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<EditText
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/tagEditText" android:layout_gravity="center_horizontal"
|
||||
android:focusable="true" android:singleLine="true"/>
|
||||
<Button
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/edit_tag_btn_delete"
|
||||
android:textColor="@color/white"
|
||||
android:id="@+id/btnDelete"
|
||||
android:drawableEnd="@drawable/ic_action_delete_white_24"
|
||||
android:drawableRight="@drawable/ic_action_delete_white_24"/>
|
||||
</LinearLayout>
|
||||
19
Habitica/res/layout/edit_tags_drawer_item.xml
Normal file
19
Habitica/res/layout/edit_tags_drawer_item.xml
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal">
|
||||
<TextView
|
||||
android:id="@+id/tagTextView"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="0dp"
|
||||
android:layout_weight="1"
|
||||
android:paddingLeft="@dimen/material_drawer_vertical_padding"
|
||||
android:paddingRight="@dimen/material_drawer_vertical_padding"/>
|
||||
<Button
|
||||
android:id="@+id/btnEdit"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textColor="@color/white"
|
||||
android:text="@string/edit_tag_btn_edit"/>
|
||||
</LinearLayout>
|
||||
38
Habitica/res/layout/edit_tags_section_drawer_item.xml
Normal file
38
Habitica/res/layout/edit_tags_section_drawer_item.xml
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
|
||||
<View android:id="@+id/material_drawer_divider"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="1dp"
|
||||
android:layout_marginTop="@dimen/material_drawer_padding" />
|
||||
|
||||
<LinearLayout android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal">
|
||||
|
||||
|
||||
<TextView
|
||||
android:id="@+id/drawer_section_name"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="@dimen/material_drawer_item_primary"
|
||||
android:layout_weight="1"
|
||||
android:fontFamily="sans-serif-medium"
|
||||
android:gravity="center_vertical|start"
|
||||
android:lines="1"
|
||||
android:paddingLeft="@dimen/material_drawer_vertical_padding"
|
||||
android:paddingRight="@dimen/material_drawer_vertical_padding"
|
||||
android:singleLine="true"
|
||||
android:textSize="@dimen/material_drawer_item_section_text"
|
||||
android:text="@string/filter_drawer_filter_tags"/>
|
||||
<Button
|
||||
android:id="@+id/btnEdit"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textColor="@color/white"
|
||||
android:text="@string/edit_tag_btn_edit" />
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
|
@ -31,9 +31,10 @@
|
|||
android:layout_width="60dp"
|
||||
android:layout_height="60dp"
|
||||
android:layout_gravity="center"
|
||||
android:background="@color/transparent"
|
||||
android:background="@color/white"
|
||||
android:clipChildren="true"
|
||||
android:padding="0dp"
|
||||
android:padding="1dp"
|
||||
android:visibility="gone"
|
||||
>
|
||||
<com.habitrpg.android.habitica.ui.AvatarView
|
||||
android:id="@+id/avatarView"
|
||||
|
|
@ -49,7 +50,7 @@
|
|||
android:id="@+id/QRDownloadButton"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Download"
|
||||
android:text="@string/download"
|
||||
style="@style/Widget.AppCompat.Button.Colored"
|
||||
android:layout_margin="20dp"
|
||||
android:layout_gravity="center_horizontal|bottom"
|
||||
|
|
|
|||
10
Habitica/res/menu/inbox.xml
Normal file
10
Habitica/res/menu/inbox.xml
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||
<item
|
||||
android:id="@+id/send_message"
|
||||
android:title="@string/send_new_message"
|
||||
android:icon="@drawable/ic_action_chat"
|
||||
app:showAsAction="always"
|
||||
/>
|
||||
</menu>
|
||||
|
|
@ -13,6 +13,7 @@
|
|||
<string name="SP_userID_summary">Вашият потребителски идентификатор</string>
|
||||
<string name="SP_APIToken_title">Жетон за ППИ</string>
|
||||
<string name="SP_APIToken_summary">Вашият жетон за ППИ</string>
|
||||
<string name="SP_user_qr_code">Вашият QR-код</string>
|
||||
<string name="PS_contact_title">Свържете се с мен</string>
|
||||
<string name="unknown_error">Възникна грешка…</string>
|
||||
<string name="pref_account_header">Профил</string>
|
||||
|
|
@ -233,6 +234,7 @@
|
|||
<string name="privacy">Поверителност</string>
|
||||
<string name="write_message">Напишете съобщение</string>
|
||||
<string name="post">Изпр.</string>
|
||||
<string name="guild_search_hint">Търсене на гилдии</string>
|
||||
<string name="todo_due" formatted="false">Срок: %s</string>
|
||||
<string name="daily_streak" formatted="false">текуща серия: %d</string>
|
||||
<string name="todo_has_duedate">Задачата има краен срок</string>
|
||||
|
|
@ -350,6 +352,11 @@
|
|||
<string name="hourglass">пясъчен часовник</string>
|
||||
<string name="hourglasses">пясъчни часовници</string>
|
||||
<string name="gold_singular">злато</string>
|
||||
<string name="gold_plural">злато</string>
|
||||
<string name="chat_message_copied">Съобщението е копирано</string>
|
||||
<string name="copy_chat_message">Копиране</string>
|
||||
<!--QR Strings-->
|
||||
<string name="qr_section_title">С този QR-код можете да бъдете поканен(а) от някого</string>
|
||||
<string name="qr_save_message">QR-кодът е запазен в</string>
|
||||
<string name="qr_dialogue_title">Вашият QR-код</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -3,8 +3,8 @@
|
|||
<string name="tutorial_habits">Schließe positive Gewohnheiten ab, um Gold und Erfahrung zu erhalten! Negative Gewohnheiten fügen Deinem Avatar beim Antippen Schaden zu, versuche diese also im echten Leben zu vermeiden!</string>
|
||||
<string name="tutorial_dailies">Besiege Deine täglichen Aufgaben um Gold und Erfahrung zu erhalten. Vorsicht! Tägliche Aufgaben fügen Dir Schaden zu, wenn Du sie nicht rechtzeitig schaffst.</string>
|
||||
<string name="tutorial_todos">Erledige Deine To-Dos im echten Leben und hake diese ab, um GOLD und ERFAHRUNG zu erhalten und so Belohnungen und neue Features freizuschalten!</string>
|
||||
<string name="tutorial_rewards">Dies sind Deine Belohnungen! Erwerbe Gold, indem Du reale Gewohnheiten, tägliche Aufgaben und To-Dos abschließt. Gib dieses hinterher für Belohnungen im Spiel oder selbsterstellte Belohnungen in der Realität aus!</string>
|
||||
<string name="tutorial_equipment">Wenn Du Ausrüstung kaufst, taucht diese hier auf. Deine Kampfausrüstung beeinflusst Deine Spielerstatistiken und Dein Kostüm (falls aktiviert) beeinflusst Dein Aussehen.</string>
|
||||
<string name="tutorial_rewards">Dies sind Deine Belohnungen! Erwirb Gold, indem Du reale Gewohnheiten, tägliche Aufgaben und To-Dos abschließt. Gib dieses hinterher für Belohnungen im Spiel oder selbsterstellte Belohnungen in der Realität aus!</string>
|
||||
<string name="tutorial_equipment">Wenn Du Ausrüstung kaufst, taucht diese hier auf. Deine Kampfausrüstung beeinflusst Deine Spielerstatistiken, und Dein Kostüm (falls aktiviert) beeinflusst Dein Aussehen.</string>
|
||||
<string name="tutorial_items">Verdiene Gegenstände indem Du Aufgaben erledigst und Stufen aufsteigst. Tippe auf einen Gegenstand um ihn zu benutzen!</string>
|
||||
<string name="tutorial_pets">Wenn du Aufgaben abschließt, hast Du eine Chance, Eier und Tränke zu finden. Kombiniere sie, um Haustiere auszubrüten.</string>
|
||||
<string name="tutorial_skills">Fähigkeiten erlauben es Dir, mächtige Effekte auszulösen. Tippe auf eine Fähigkeit, um sie zu benutzen. Das kostet Mana (der blaue Balken), das Du verdienst, indem Du Dich jeden Tag einloggst und reale Aufgaben abschließt. Für mehr Infos schaue im Menü in die FAQ!</string>
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@
|
|||
<string name="SP_userID_summary">Deine Benutzer-ID</string>
|
||||
<string name="SP_APIToken_title">API-Token</string>
|
||||
<string name="SP_APIToken_summary">Dein API-Token</string>
|
||||
<string name="SP_user_qr_code">Dein QR Code</string>
|
||||
<string name="PS_contact_title">Kontaktiere mich</string>
|
||||
<string name="unknown_error">Ein Fehler ist aufgetreten...</string>
|
||||
<string name="pref_account_header">Konto</string>
|
||||
|
|
@ -109,7 +110,7 @@
|
|||
<string name="profile_image">Profilbild</string>
|
||||
<string name="mana_price_button" formatted="false">%d MP</string>
|
||||
<string name="used_skill" formatted="false">Du hast %1$s für %2$d Mana benutzt.</string>
|
||||
<string name="new_checklist_item">Unteraufgabe</string>
|
||||
<string name="new_checklist_item">Neue Unteraufgabe</string>
|
||||
<string name="add_checklist_item">Hinzufügen</string>
|
||||
<string name="reminder_title">Denke daran Deine täglichen Aufgaben abzuhaken!</string>
|
||||
<string name="skill_progress_title">Fertigkeiten benutzen</string>
|
||||
|
|
@ -233,6 +234,7 @@ Für den Anfang: Welche Bereiche Deines Lebens möchtest Du verbessern?</string>
|
|||
<string name="privacy">Privatsphäre</string>
|
||||
<string name="write_message">Nachricht schreiben</string>
|
||||
<string name="post">posten</string>
|
||||
<string name="guild_search_hint">Nach Gilden suchen</string>
|
||||
<string name="todo_due" formatted="false">Bis: %s</string>
|
||||
<string name="daily_streak" formatted="false">Aktuelle Serie: %d</string>
|
||||
<string name="todo_has_duedate">Diese Aufgabe hat eine Frist.</string>
|
||||
|
|
@ -350,6 +352,11 @@ Für den Anfang: Welche Bereiche Deines Lebens möchtest Du verbessern?</string>
|
|||
<string name="hourglass">Sanduhr</string>
|
||||
<string name="hourglasses">Sanduhren</string>
|
||||
<string name="gold_singular">Gold</string>
|
||||
<string name="gold_plural">Gold</string>
|
||||
<string name="chat_message_copied">Nachricht in Zwischenablage kopiert</string>
|
||||
<string name="copy_chat_message">In Zwischenablage kopieren</string>
|
||||
<!--QR Strings-->
|
||||
<string name="qr_section_title">Lass Dich durch diesen QR Code von jemandem einladen</string>
|
||||
<string name="qr_save_message">QR code gespeichert: </string>
|
||||
<string name="qr_dialogue_title">Dein QR Code</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -325,4 +325,5 @@ To start, which parts of your life do you want to improve?</string>
|
|||
<string name="open_in_store">Open in Play Store</string>
|
||||
<string name="change_class_confirmation">Are you sure you want to change your class? This will cost 3 gems.</string>
|
||||
<string name="leaderMessage" formatted="false">Message from %1$s</string>
|
||||
<!--QR Strings-->
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -330,4 +330,5 @@ Para empezar, ¿qué aspectos de tu vida te gustaría mejorar?</string>
|
|||
<string name="timeTravelers">Viajeros del tiempo</string>
|
||||
<string name="seasonalShop">Tienda estacional</string>
|
||||
<string name="empty_inbox">No tienes ningún mensaje en la bandeja de entrada. Puedes enviar un mensaje a un usuario desde los mensajes de chat públicos que hayan enviado.</string>
|
||||
<!--QR Strings-->
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -233,6 +233,7 @@ Pour commencer, quels aspects de votre vie souhaitez-vous améliorer ?</string>
|
|||
<string name="privacy">Sécurité</string>
|
||||
<string name="write_message">Écrire un message</string>
|
||||
<string name="post">Envoyer</string>
|
||||
<string name="guild_search_hint">Chercher des guildes</string>
|
||||
<string name="todo_due" formatted="false">Échéance : %s</string>
|
||||
<string name="daily_streak" formatted="false">combo actuel : %d</string>
|
||||
<string name="todo_has_duedate">La tâche a une date d\'échéance</string>
|
||||
|
|
@ -350,6 +351,8 @@ Pour commencer, quels aspects de votre vie souhaitez-vous améliorer ?</string>
|
|||
<string name="hourglass">sablier</string>
|
||||
<string name="hourglasses">sabliers</string>
|
||||
<string name="gold_singular">pièce d\'or</string>
|
||||
<string name="gold_plural">or</string>
|
||||
<string name="chat_message_copied">Message copié dans le presse-papier</string>
|
||||
<string name="copy_chat_message">Copier dans le presse-papier</string>
|
||||
<!--QR Strings-->
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -16,4 +16,5 @@
|
|||
<string name="sidebar.news">חדשות</string>
|
||||
<string name="sidebar.settings">הגדרות</string>
|
||||
<string name="sidebar.about">אודות</string>
|
||||
<string name="sidebar_shops">חנויות</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -13,12 +13,23 @@
|
|||
<string name="SP_userID_summary">מזהה המשתמש שלכם</string>
|
||||
<string name="SP_APIToken_title">מפתח API</string>
|
||||
<string name="SP_APIToken_summary">מפתח ה API שלכם</string>
|
||||
<string name="SP_user_qr_code">קוד ה QR שלכם</string>
|
||||
<string name="PS_contact_title">צרו איתי קשר</string>
|
||||
<string name="unknown_error">ארעה תקלה...</string>
|
||||
<string name="pref_account_header">חשבון</string>
|
||||
<string name="pref_reminder_header">תזכורת יומית</string>
|
||||
<string name="pref_reminder_checkbox">הפעל תזכורת</string>
|
||||
<string name="pref_reminder_picker">קבע מועד תזכורת</string>
|
||||
<string name="pref_push_notifications_checkbox">הודעות בדחיפה של משתמש</string>
|
||||
<string name="push_notifications">התראות בדחיפה</string>
|
||||
<string name="preference_push_you_won_challenge">זכיתם באתגר!</string>
|
||||
<string name="preference_push_received_a_private_message">קיבלתם הודעה פרטית</string>
|
||||
<string name="preference_push_gifted_gems">אבני חן ניתנו במתנה</string>
|
||||
<string name="preference_push_gifted_subscription">מנוי ניתן במתנה</string>
|
||||
<string name="preference_push_invited_to_party">הוזמנו לחבורה</string>
|
||||
<string name="preference_push_invited_to_guild">הוזמנו לגילדה</string>
|
||||
<string name="preference_push_your_quest_has_begun">ההרפתקה שלכם החלה</string>
|
||||
<string name="preference_push_invited_to_quest">הוזמנו להרפתקה</string>
|
||||
<!--Adding tasks-->
|
||||
<string name="task_value">ערך</string>
|
||||
<string name="new_todo">מטרה חדשה</string>
|
||||
|
|
@ -223,6 +234,7 @@
|
|||
<string name="privacy">פרטיות</string>
|
||||
<string name="write_message">כיתבו הודעה</string>
|
||||
<string name="post">שליחה</string>
|
||||
<string name="guild_search_hint">חיפוש אחר גילדות</string>
|
||||
<string name="todo_due" formatted="false">חל: %s</string>
|
||||
<string name="daily_streak" formatted="false">רצף נוכחי: %d</string>
|
||||
<string name="todo_has_duedate">למשימה יש תאריך יעד</string>
|
||||
|
|
@ -325,4 +337,26 @@
|
|||
<string name="open_in_store">פתיחה בפליי סטור</string>
|
||||
<string name="change_class_confirmation">האם אתם בטוחים שאתם מעוניינים להחליף מקצוע? זה יעלה לכם 3 אבני חן.</string>
|
||||
<string name="leaderMessage" formatted="false">הודעה מאת %1$s</string>
|
||||
<string name="confirm">אישור</string>
|
||||
<string name="market">שוק</string>
|
||||
<string name="timeTravelers">נוסעים בזמן</string>
|
||||
<string name="seasonalShop">חנות עונתית</string>
|
||||
<string name="empty_inbox">אין לכם הודעות בדואר הנכנס. אתם יכולים לשלוח למשתמשים הודעה חדשה מהצ׳אט הפומבי שלהם!</string>
|
||||
<string name="party_invite">שחררו על-ידי הזמנת חברים</string>
|
||||
<string name="no_gold">אין די זהב</string>
|
||||
<string name="no_potion">אינכם צריכים לקנות שיקוי בריאות</string>
|
||||
<string name="successful_purchase" formatted="false">%1$s נרכש בהצלחה</string>
|
||||
<string name="purchase_confirmation_title">אשרו רכישה</string>
|
||||
<string name="confirm_purchase_text" formatted="false">קנו %1$s בעבור %2$s %3$s</string>
|
||||
<string name="gem">אבן חן</string>
|
||||
<string name="hourglass">שעון חול</string>
|
||||
<string name="hourglasses">שעוני חול</string>
|
||||
<string name="gold_singular">זהב</string>
|
||||
<string name="gold_plural">זהב</string>
|
||||
<string name="chat_message_copied">הודעה הועתקה ללוח</string>
|
||||
<string name="copy_chat_message">העתקה ללוח</string>
|
||||
<!--QR Strings-->
|
||||
<string name="qr_section_title">תנו למישהו להזמין אתכם עם קוד ה QR הזה</string>
|
||||
<string name="qr_save_message">קוד QR נשמר ב</string>
|
||||
<string name="qr_dialogue_title">קוד ה QR שלכם</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -322,4 +322,5 @@ Za početak, koje djelove života želiš poboljšati?</string>
|
|||
<string name="share_raised" formatted="false">Upravo sam dobio %1$s %2$s životinju za jahanje u Habitici izvršavanjem svojih zadataka u stvarnom životu!</string>
|
||||
<string name="open_in_store">Otvori u Trgovini Play</string>
|
||||
<string name="change_class_confirmation">Jeste li sigurni da želite promijeniti svoju Klasu? Ovo će te koštati 3 dragulja.</string>
|
||||
<!--QR Strings-->
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -319,4 +319,5 @@ Untuk memulai, bagian mana dari hidupmu yang ingin kamu tingkatkan?</string>
|
|||
<string name="share_levelup" formatted="false">Saya naik level %s di Habitica dengan meningkatkan kebiasaan kehidupan-nyata saya!</string>
|
||||
<string name="share_hatched" formatted="false">Saya menetaskan peliharaan seekor %2$s %1$s di Habitica dengan menyelesaikan tugas kehidupan-nyata saya! </string>
|
||||
<string name="share_raised" formatted="false">Saya baru mendapatkan tunggangan seekor %2$s %1$s di Habitica dengan menyelesaikan tugas kehidupan-nyata saya!</string>
|
||||
<!--QR Strings-->
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -350,4 +350,5 @@ Le Dailies mancate e le cattive Habit non li danneggiano molto, e hanno sempre m
|
|||
<string name="gold_singular">oro</string>
|
||||
<string name="chat_message_copied">Messaggio copiato negli Appunti</string>
|
||||
<string name="copy_chat_message">Copia negli appunti</string>
|
||||
<!--QR Strings-->
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@
|
|||
<string name="SP_userID_summary">あなたのユーザーID</string>
|
||||
<string name="SP_APIToken_title">API トークン</string>
|
||||
<string name="SP_APIToken_summary">あなたの API トークン</string>
|
||||
<string name="SP_user_qr_code">QR コード</string>
|
||||
<string name="PS_contact_title">開発者に連絡する</string>
|
||||
<string name="unknown_error">エラーが発生しました…</string>
|
||||
<string name="pref_account_header">アカウント</string>
|
||||
|
|
@ -234,6 +235,7 @@
|
|||
<string name="privacy">プライバシー</string>
|
||||
<string name="write_message">メッセージを書く</string>
|
||||
<string name="post">投稿</string>
|
||||
<string name="guild_search_hint">ギルドを検索</string>
|
||||
<string name="todo_due" formatted="false">期限 : %s</string>
|
||||
<string name="daily_streak" formatted="false">現在の連続実行 : %d 回</string>
|
||||
<string name="todo_has_duedate">期限ありタスク</string>
|
||||
|
|
@ -351,6 +353,11 @@
|
|||
<string name="hourglass">砂時計</string>
|
||||
<string name="hourglasses">砂時計</string>
|
||||
<string name="gold_singular">ゴールド</string>
|
||||
<string name="gold_plural">ゴールド</string>
|
||||
<string name="chat_message_copied">クリップボードにコピーされたメッセージ</string>
|
||||
<string name="copy_chat_message">クリップボードにコピー</string>
|
||||
<!--QR Strings-->
|
||||
<string name="qr_section_title">この QR コードで招待を受けます。</string>
|
||||
<string name="qr_save_message">QR コードの保存先</string>
|
||||
<string name="qr_dialogue_title">QR コード</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -332,4 +332,5 @@
|
|||
<string name="open_in_store">플레이스토어로 열기</string>
|
||||
<string name="change_class_confirmation">보석 3개를 사용하여 클레스를 바꾸시겠습니까? </string>
|
||||
<string name="leaderMessage" formatted="false">%1$s로부터 온 메세지</string>
|
||||
<!--QR Strings-->
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -233,6 +233,7 @@ Pradžiai, kurias savo gyvenimo dalis norėtum tobulint?</string>
|
|||
<string name="privacy">Privatumas</string>
|
||||
<string name="write_message">Rašyti Žinutę</string>
|
||||
<string name="post">Siųsti</string>
|
||||
<string name="guild_search_hint">Ieškoti gildijų</string>
|
||||
<string name="todo_due" formatted="false">Terminas: %s</string>
|
||||
<string name="daily_streak" formatted="false">dabartinė serija: %d</string>
|
||||
<string name="todo_has_duedate">Užduotis turi Terminą</string>
|
||||
|
|
@ -350,6 +351,8 @@ Pradžiai, kurias savo gyvenimo dalis norėtum tobulint?</string>
|
|||
<string name="hourglass">smėlio laikrodis</string>
|
||||
<string name="hourglasses">smėlio laikrodžiai</string>
|
||||
<string name="gold_singular">aukso</string>
|
||||
<string name="gold_plural">aukso</string>
|
||||
<string name="chat_message_copied">Žinutė nukopijuota į Iškarpinę</string>
|
||||
<string name="copy_chat_message">Kopijuoti į Iškarpinę</string>
|
||||
<!--QR Strings-->
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -233,6 +233,7 @@ Om te beginnen, welke delen van je leven wil je verbeteren?</string>
|
|||
<string name="privacy">Privacy</string>
|
||||
<string name="write_message">Bericht schrijven</string>
|
||||
<string name="post">Post</string>
|
||||
<string name="guild_search_hint">Zoek naar gildes</string>
|
||||
<string name="todo_due" formatted="false">Tegen: %s</string>
|
||||
<string name="daily_streak" formatted="false">huidige serie: %d</string>
|
||||
<string name="todo_has_duedate">Taak heeft een Deadline</string>
|
||||
|
|
@ -350,6 +351,8 @@ Om te beginnen, welke delen van je leven wil je verbeteren?</string>
|
|||
<string name="hourglass">zandloper</string>
|
||||
<string name="hourglasses">zandlopers</string>
|
||||
<string name="gold_singular">goud</string>
|
||||
<string name="gold_plural">goud</string>
|
||||
<string name="chat_message_copied">Bericht gekopieerd naar klembord</string>
|
||||
<string name="copy_chat_message">Kopieer naar klembord</string>
|
||||
<!--QR Strings-->
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
<string name="sidebar.tasks">Zadania</string>
|
||||
<string name="sidebar.skills">Umiejętności</string>
|
||||
<string name="sidebar.section.social">Społeczność</string>
|
||||
<string name="sidebar.inbox">Skrzyna pocztowa</string>
|
||||
<string name="sidebar.inbox">Skrzynka pocztowa</string>
|
||||
<string name="sidebar.tavern">Karczma</string>
|
||||
<string name="sidebar.party">Drużyna</string>
|
||||
<string name="sidebar.purchaseGems">Kup Klejnoty</string>
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@
|
|||
<string name="SP_userID_summary">Twoje ID</string>
|
||||
<string name="SP_APIToken_title">API Token</string>
|
||||
<string name="SP_APIToken_summary">Twój Token API</string>
|
||||
<string name="SP_user_qr_code">Twój kod QR</string>
|
||||
<string name="PS_contact_title">Skontaktuj się ze mną</string>
|
||||
<string name="unknown_error">Wystąpił błąd...</string>
|
||||
<string name="pref_account_header">Konto</string>
|
||||
|
|
@ -233,6 +234,7 @@ Od czego chcesz zacząć poprawiać swoje życie?</string>
|
|||
<string name="privacy">Prywatność</string>
|
||||
<string name="write_message">Napisz wiadomość</string>
|
||||
<string name="post">Wyślij</string>
|
||||
<string name="guild_search_hint">Szukaj gildii</string>
|
||||
<string name="todo_due" formatted="false">Termin: %s</string>
|
||||
<string name="daily_streak" formatted="false">licznik serii: %d</string>
|
||||
<string name="todo_has_duedate">Zdania mają termin wykonania</string>
|
||||
|
|
@ -350,6 +352,11 @@ Od czego chcesz zacząć poprawiać swoje życie?</string>
|
|||
<string name="hourglass">klepsydra</string>
|
||||
<string name="hourglasses">klepsydry</string>
|
||||
<string name="gold_singular">złoto</string>
|
||||
<string name="gold_plural">złoto</string>
|
||||
<string name="chat_message_copied">Wiadomość skopiowana do schowka</string>
|
||||
<string name="copy_chat_message">Kopiuj do schowka</string>
|
||||
<!--QR Strings-->
|
||||
<string name="qr_section_title">Czy ktoś zaprosił Cię przy pomocy tego kodu QR?</string>
|
||||
<string name="qr_save_message">Kod QR zapisany w</string>
|
||||
<string name="qr_dialogue_title">Twój kod QR</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@
|
|||
<string name="SP_userID_summary">Seu ID de usuário</string>
|
||||
<string name="SP_APIToken_title">API Token</string>
|
||||
<string name="SP_APIToken_summary">Seu API Token</string>
|
||||
<string name="SP_user_qr_code">Seu código QR</string>
|
||||
<string name="PS_contact_title">Contate-me</string>
|
||||
<string name="unknown_error">Um erro aconteceu...</string>
|
||||
<string name="pref_account_header">Conta</string>
|
||||
|
|
@ -233,6 +234,7 @@ Para começar, quais partes da sua vida você quer melhorar?</string>
|
|||
<string name="privacy">Privacidade</string>
|
||||
<string name="write_message">Escrever mensagem</string>
|
||||
<string name="post">Publicar</string>
|
||||
<string name="guild_search_hint">Busque guildas</string>
|
||||
<string name="todo_due" formatted="false">Devido: %s</string>
|
||||
<string name="daily_streak" formatted="false">Raia atual: %d</string>
|
||||
<string name="todo_has_duedate">Tarefa com vencimento</string>
|
||||
|
|
@ -351,7 +353,11 @@ Para começar, quais partes da sua vida você quer melhorar?</string>
|
|||
<string name="hourglass">ampulheta</string>
|
||||
<string name="hourglasses">ampulhetas</string>
|
||||
<string name="gold_singular">ouro</string>
|
||||
<string name="gold_plural">ouros</string>
|
||||
<string name="chat_message_copied">Mensagem copiada para Área de Transferência</string>
|
||||
<string name="copy_chat_message">Copiar para Área e Transferência
|
||||
</string>
|
||||
<string name="copy_chat_message">Mensagem copiada para Área de Transferência</string>
|
||||
<!--QR Strings-->
|
||||
<string name="qr_section_title">Deixe que te convidem com esse código QR</string>
|
||||
<string name="qr_save_message">Código QR salvo</string>
|
||||
<string name="qr_dialogue_title">Seu código QR</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -311,4 +311,5 @@ Para começar, quais as partes da tua vida que queres melhorar?</string>
|
|||
<string name="open_in_store">Abrir na Play Store</string>
|
||||
<string name="change_class_confirmation">Tem a certeza de que pretende alterar a sua classe? Isto irá custar 3 gemas.</string>
|
||||
<string name="leaderMessage" formatted="false">Mensagem de %1$s</string>
|
||||
<!--QR Strings-->
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -352,4 +352,5 @@
|
|||
<string name="gold_singular">золото</string>
|
||||
<string name="chat_message_copied">Сообщение скопировано в буфер обмена</string>
|
||||
<string name="copy_chat_message">Скопировать в буфер обмена</string>
|
||||
<!--QR Strings-->
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -330,4 +330,5 @@
|
|||
<string name="timeTravelers">時光旅人</string>
|
||||
<string name="seasonalShop">季節限定商店</string>
|
||||
<string name="empty_inbox">你的收件匣裡面沒有任何信息。你可以利用聊天去傳送訊息給大家</string>
|
||||
<!--QR Strings-->
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -13,12 +13,23 @@
|
|||
<string name="SP_userID_summary">你的用户ID</string>
|
||||
<string name="SP_APIToken_title">API令牌</string>
|
||||
<string name="SP_APIToken_summary">你的API令牌</string>
|
||||
<string name="SP_user_qr_code">你的二维码</string>
|
||||
<string name="PS_contact_title">联系我</string>
|
||||
<string name="unknown_error">发生了一个错误……</string>
|
||||
<string name="pref_account_header">账号</string>
|
||||
<string name="pref_reminder_header">每日任务提醒</string>
|
||||
<string name="pref_reminder_checkbox">激活提醒</string>
|
||||
<string name="pref_reminder_picker">设置提醒时间</string>
|
||||
<string name="pref_push_notifications_checkbox">用户推送通知</string>
|
||||
<string name="push_notifications">推送通知</string>
|
||||
<string name="preference_push_you_won_challenge">你赢得了一项挑战!</string>
|
||||
<string name="preference_push_received_a_private_message">收到一条私信</string>
|
||||
<string name="preference_push_gifted_gems">赠送的钻石</string>
|
||||
<string name="preference_push_gifted_subscription">赠送的订阅</string>
|
||||
<string name="preference_push_invited_to_party">被邀请加入队伍</string>
|
||||
<string name="preference_push_invited_to_guild">被邀请加入公会</string>
|
||||
<string name="preference_push_your_quest_has_begun">你的冒险开始了</string>
|
||||
<string name="preference_push_invited_to_quest">被邀请加入冒险</string>
|
||||
<!--Adding tasks-->
|
||||
<string name="task_value">数值</string>
|
||||
<string name="new_todo">新待办事项</string>
|
||||
|
|
@ -223,6 +234,7 @@
|
|||
<string name="privacy">隐私</string>
|
||||
<string name="write_message">写消息</string>
|
||||
<string name="post">公告</string>
|
||||
<string name="guild_search_hint">寻找工会</string>
|
||||
<string name="todo_due" formatted="false">到期:%s</string>
|
||||
<string name="daily_streak" formatted="false">目前连击数:%d</string>
|
||||
<string name="todo_has_duedate">任务有截止日</string>
|
||||
|
|
@ -340,4 +352,11 @@
|
|||
<string name="hourglass">沙漏</string>
|
||||
<string name="hourglasses">沙漏</string>
|
||||
<string name="gold_singular">金币</string>
|
||||
<string name="gold_plural">金币</string>
|
||||
<string name="chat_message_copied">复制到剪帖板的信息</string>
|
||||
<string name="copy_chat_message">复制到剪贴板</string>
|
||||
<!--QR Strings-->
|
||||
<string name="qr_section_title">让别人通过此二维码邀请你</string>
|
||||
<string name="qr_save_message">将二维码保存至</string>
|
||||
<string name="qr_dialogue_title">你的二维码</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -15,4 +15,7 @@
|
|||
<string name="reject_guild_invite" translatable="false">REJECT_GUILD_INVITE</string>
|
||||
<string name="accept_quest_invite" translatable="false">ACCEPT_QUEST_INVITE</string>
|
||||
<string name="reject_quest_invite" translatable="false">REJECT_QUEST_INVITE</string>
|
||||
|
||||
<string name="qr_album_name">habitica</string>
|
||||
<string name="qr_file_name"> habitrpg-qr-code.jpg</string>
|
||||
</resources>
|
||||
|
|
@ -1,7 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
|
||||
<string name="app_name">Habitica</string>
|
||||
<string name="action_refresh">Refresh</string>
|
||||
<string name="XP_default">Experience</string>
|
||||
<string name="HP_default">Health</string>
|
||||
|
|
@ -378,12 +377,24 @@ To start, which parts of your life do you want to improve?</string>
|
|||
<string name="gold_plural">gold</string>
|
||||
<string name="chat_message_copied">Message copied to Clipboard</string>
|
||||
<string name="copy_chat_message">Copy to clipboard</string>
|
||||
<string name="edit_tag_title">Edit Tag</string>
|
||||
<string name="edit_tag_btn_edit">Edit</string>
|
||||
<string name="edit_tag_btn_done">Done</string>
|
||||
<string name="edit_tag_btn_delete">Delete</string>
|
||||
<string name="confirm_delete_tag_title">Are you sure?</string>
|
||||
<string name="confirm_delete_tag_message">Do you really want to delete?</string>
|
||||
<string name="filter_drawer_edit_tags">Edit Tags</string>
|
||||
<string name="filter_drawer_filter_tags">Filter by Tags</string>
|
||||
|
||||
<!-- QR Strings -->
|
||||
<string name="qr_section_title">Have someone invite you with this QR Code</string>
|
||||
<string name="qr_album_name">habitica</string>
|
||||
<string name="qr_file_name"> habitrpg-qr-code.jpg</string>
|
||||
<string name="qr_save_message">QR code saved at </string>
|
||||
<string name="qr_dialogue_title">Your QR Code</string>
|
||||
<string name="download">Download</string>
|
||||
<string name="send_new_message">Send new message</string>
|
||||
<string name="choose_recipient_title">Choose Message Recipient</string>
|
||||
<string name="action_continue">Continue</string>
|
||||
<string name="scan_qr_code">Scan QR Code</string>
|
||||
<string name="enter_recipient_uuid">Enter Recipients User ID</string>
|
||||
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,12 @@
|
|||
package com.habitrpg.android.habitica.events;
|
||||
|
||||
/**
|
||||
* Created by jjbillings on 8/11/16.
|
||||
*/
|
||||
public class ToggledEditTagsEvent {
|
||||
public boolean editing;
|
||||
|
||||
public ToggledEditTagsEvent(boolean editing) {
|
||||
this.editing = editing;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
package com.habitrpg.android.habitica.events.commands;
|
||||
|
||||
import com.magicmicky.habitrpgwrapper.lib.models.Tag;
|
||||
|
||||
/**
|
||||
* Created by jjbillings on 8.9.2016.
|
||||
*/
|
||||
public class DeleteTagCommand {
|
||||
public Tag tag;
|
||||
|
||||
public DeleteTagCommand(Tag tag) {
|
||||
this.tag = tag;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
package com.habitrpg.android.habitica.events.commands;
|
||||
|
||||
import com.magicmicky.habitrpgwrapper.lib.models.Tag;
|
||||
|
||||
/**
|
||||
* Created by jjbillings on 8/16/16.
|
||||
*/
|
||||
public class EditTagCommand {
|
||||
public Tag tag;
|
||||
|
||||
public EditTagCommand(Tag tag) {
|
||||
this.tag = tag;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
package com.habitrpg.android.habitica.events.commands;
|
||||
|
||||
/**
|
||||
* Created by jbillz on 8/19/16.
|
||||
*/
|
||||
public class RefreshUserCommand {
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
package com.habitrpg.android.habitica.events.commands;
|
||||
|
||||
import com.magicmicky.habitrpgwrapper.lib.models.Tag;
|
||||
|
||||
/**
|
||||
* Created by jjbillings on 8/17/16.
|
||||
*/
|
||||
public class UpdateTagCommand {
|
||||
public Tag tag;
|
||||
public String uuid;
|
||||
|
||||
public UpdateTagCommand(Tag tag, String uuid) {
|
||||
this.tag = tag;
|
||||
this.uuid = uuid;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,5 +1,7 @@
|
|||
package com.habitrpg.android.habitica.helpers;
|
||||
|
||||
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
|
||||
|
||||
import android.app.Dialog;
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
|
|
@ -7,7 +9,9 @@ import android.graphics.Bitmap;
|
|||
import android.media.Image;
|
||||
import android.os.Environment;
|
||||
import android.support.v7.preference.PreferenceManager;
|
||||
import android.util.DisplayMetrics;
|
||||
import android.util.Log;
|
||||
import android.util.TypedValue;
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
import android.widget.FrameLayout;
|
||||
|
|
@ -108,10 +112,21 @@ public class QrCodeManager {
|
|||
return;
|
||||
}
|
||||
|
||||
Bitmap myBitmap = QRCode.from(this.content).withColor(0xFF432874, 0xFFFFFFFF).withSize(400, 400).bitmap();
|
||||
int qrCodeSize = (int)dipToPixels(400.0f);
|
||||
|
||||
Bitmap myBitmap = QRCode.from(this.content)
|
||||
.withErrorCorrection(ErrorCorrectionLevel.H)
|
||||
.withColor(0xFF432874, 0xFFFFFFFF)
|
||||
.withSize(qrCodeSize, qrCodeSize)
|
||||
.bitmap();
|
||||
qrCodeImageView.setImageBitmap(myBitmap);
|
||||
}
|
||||
|
||||
public float dipToPixels(float dipValue) {
|
||||
DisplayMetrics metrics = this.context.getResources().getDisplayMetrics();
|
||||
return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dipValue, metrics);
|
||||
}
|
||||
|
||||
public void setDownloadQr() {
|
||||
if (qrCodeDownloadButton == null) {
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -24,6 +24,7 @@ import android.content.pm.PackageManager;
|
|||
import android.content.pm.ResolveInfo;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.util.Log;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
|
@ -277,6 +278,10 @@ public class IntentIntegrator {
|
|||
return initiateScan(ALL_CODE_TYPES);
|
||||
}
|
||||
|
||||
public final AlertDialog initiateScan(Fragment fragment) {
|
||||
return initiateScan(fragment, ALL_CODE_TYPES);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initiates a scan only for a certain set of barcode types, given as strings corresponding
|
||||
* to their names in ZXing's {@code BarcodeFormat} class like "UPC_A". You can supply constants
|
||||
|
|
@ -286,6 +291,10 @@ public class IntentIntegrator {
|
|||
* if a prompt was needed, or null otherwise
|
||||
*/
|
||||
public final AlertDialog initiateScan(Collection<String> desiredBarcodeFormats) {
|
||||
return initiateScan(null, desiredBarcodeFormats);
|
||||
}
|
||||
|
||||
public final AlertDialog initiateScan(Fragment fragment, Collection<String> desiredBarcodeFormats) {
|
||||
Intent intentScan = new Intent(BS_PACKAGE + ".SCAN");
|
||||
intentScan.addCategory(Intent.CATEGORY_DEFAULT);
|
||||
|
||||
|
|
@ -310,7 +319,11 @@ public class IntentIntegrator {
|
|||
intentScan.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
|
||||
intentScan.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
|
||||
attachMoreExtras(intentScan);
|
||||
startActivityForResult(intentScan, REQUEST_CODE);
|
||||
if (fragment == null) {
|
||||
startActivityForResult(intentScan, REQUEST_CODE);
|
||||
} else {
|
||||
startActivityForResult(fragment, intentScan, REQUEST_CODE);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
|
@ -328,6 +341,10 @@ public class IntentIntegrator {
|
|||
activity.startActivityForResult(intent, code);
|
||||
}
|
||||
|
||||
protected void startActivityForResult(Fragment fragment, Intent intent, int code) {
|
||||
fragment.startActivityForResult(intent, code);
|
||||
}
|
||||
|
||||
private String findTargetAppPackage(Intent intent) {
|
||||
PackageManager pm = activity.getPackageManager();
|
||||
List<ResolveInfo> availableApps = pm.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@ import com.habitrpg.android.habitica.events.ReloadContentEvent;
|
|||
import com.habitrpg.android.habitica.events.SelectClassEvent;
|
||||
import com.habitrpg.android.habitica.events.ShareEvent;
|
||||
import com.habitrpg.android.habitica.events.TaskRemovedEvent;
|
||||
import com.habitrpg.android.habitica.events.ToggledEditTagsEvent;
|
||||
import com.habitrpg.android.habitica.events.ToggledInnStateEvent;
|
||||
import com.habitrpg.android.habitica.events.commands.BuyGemItemCommand;
|
||||
import com.habitrpg.android.habitica.events.commands.BuyRewardCommand;
|
||||
|
|
@ -816,6 +817,7 @@ public class MainActivity extends BaseActivity implements Action1<Throwable>, Ha
|
|||
drawer.closeDrawer();
|
||||
} else if (drawer.getDrawerLayout().isDrawerOpen(GravityCompat.END)) {
|
||||
drawer.getDrawerLayout().closeDrawer(GravityCompat.END);
|
||||
EventBus.getDefault().post(new ToggledEditTagsEvent(false));
|
||||
} else {
|
||||
super.onBackPressed();
|
||||
if (this.activeFragment != null) {
|
||||
|
|
@ -826,8 +828,6 @@ public class MainActivity extends BaseActivity implements Action1<Throwable>, Ha
|
|||
|
||||
@Override
|
||||
public void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||
super.onActivityResult(requestCode, resultCode, data);
|
||||
checkout.onActivityResult(requestCode, resultCode, data);
|
||||
if (resultCode == SELECT_CLASS_RESULT) {
|
||||
if (this.apiHelper != null) {
|
||||
this.apiHelper.retrieveUser(true)
|
||||
|
|
@ -836,6 +836,8 @@ public class MainActivity extends BaseActivity implements Action1<Throwable>, Ha
|
|||
});
|
||||
}
|
||||
}
|
||||
super.onActivityResult(requestCode, resultCode, data);
|
||||
checkout.onActivityResult(requestCode, resultCode, data);
|
||||
}
|
||||
|
||||
// region Events
|
||||
|
|
@ -1507,6 +1509,7 @@ public class MainActivity extends BaseActivity implements Action1<Throwable>, Ha
|
|||
drawer = this.filterDrawer;
|
||||
}
|
||||
if (drawer != null) {
|
||||
EventBus.getDefault().post(new ToggledEditTagsEvent(false));
|
||||
drawer.openDrawer();
|
||||
}
|
||||
}
|
||||
|
|
@ -1538,4 +1541,13 @@ public class MainActivity extends BaseActivity implements Action1<Throwable>, Ha
|
|||
intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
|
||||
startActivity(intent);
|
||||
}
|
||||
|
||||
public void removeFilterDrawerItem(int position) {
|
||||
this.filterDrawer.removeItemByPosition(position);
|
||||
}
|
||||
|
||||
public void updateFilterDrawerItem (IDrawerItem item, int position) {
|
||||
this.filterDrawer.removeItemByPosition(position);
|
||||
this.filterDrawer.addItemAtPosition(item,position);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -48,11 +48,11 @@ public class AccountDetailsFragment extends BasePreferencesFragment {
|
|||
public boolean onPreferenceTreeClick(Preference preference) {
|
||||
if (preference.getKey().equals(getString(R.string.SP_user_qr_code))) {
|
||||
qrCodeManager.showDialogue();
|
||||
} else {
|
||||
ClipboardManager clipMan = (ClipboardManager) getActivity().getSystemService(Context.CLIPBOARD_SERVICE);
|
||||
clipMan.setPrimaryClip(ClipData.newPlainText(preference.getKey(), preference.getSummary()));
|
||||
Toast.makeText(getActivity(), "Copied " + preference.getKey() + " to clipboard.", Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
|
||||
ClipboardManager clipMan = (ClipboardManager) getActivity().getSystemService(Context.CLIPBOARD_SERVICE);
|
||||
clipMan.setPrimaryClip(ClipData.newPlainText(preference.getKey(), preference.getSummary()));
|
||||
Toast.makeText(getActivity(), "Copied " + preference.getKey() + " to clipboard.", Toast.LENGTH_SHORT).show();
|
||||
return super.onPreferenceTreeClick(preference);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,18 +3,33 @@ package com.habitrpg.android.habitica.ui.fragments.social;
|
|||
import com.habitrpg.android.habitica.R;
|
||||
import com.habitrpg.android.habitica.callbacks.HabitRPGUserCallback;
|
||||
import com.habitrpg.android.habitica.components.AppComponent;
|
||||
import com.habitrpg.android.habitica.prefs.scanner.IntentIntegrator;
|
||||
import com.habitrpg.android.habitica.prefs.scanner.IntentResult;
|
||||
import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment;
|
||||
import com.habitrpg.android.habitica.ui.helpers.UiUtils;
|
||||
import com.habitrpg.android.habitica.ui.helpers.ViewHelper;
|
||||
import com.magicmicky.habitrpgwrapper.lib.models.ChatMessage;
|
||||
import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser;
|
||||
import com.raizlabs.android.dbflow.sql.builder.Condition;
|
||||
import com.raizlabs.android.dbflow.sql.language.Select;
|
||||
|
||||
import org.w3c.dom.Text;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.content.ContextCompat;
|
||||
import android.support.v4.widget.SwipeRefreshLayout;
|
||||
import android.support.v7.app.AlertDialog;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.Button;
|
||||
import android.widget.EditText;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
|
|
@ -36,6 +51,7 @@ public class InboxFragment extends BaseMainFragment
|
|||
|
||||
Map<String, ChatMessage> messages;
|
||||
List<String> roomsAdded;
|
||||
private View chooseRecipientDialogView;
|
||||
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||
|
|
@ -59,6 +75,48 @@ public class InboxFragment extends BaseMainFragment
|
|||
return v;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
|
||||
this.activity.getMenuInflater().inflate(R.menu.inbox, menu);
|
||||
super.onCreateOptionsMenu(menu, inflater);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
int id = item.getItemId();
|
||||
|
||||
switch (id) {
|
||||
case R.id.send_message:
|
||||
openNewMessageDialog();
|
||||
return true;
|
||||
}
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
|
||||
private void openNewMessageDialog() {
|
||||
this.chooseRecipientDialogView = this.activity.getLayoutInflater().inflate(R.layout.dialog_choose_message_recipient,null);
|
||||
|
||||
Button scaneQRCodeButton = (Button) chooseRecipientDialogView.findViewById(R.id.scanQRCodeButton);
|
||||
|
||||
AlertDialog alert = new AlertDialog.Builder(this.activity)
|
||||
.setTitle(getString(R.string.choose_recipient_title))
|
||||
.setPositiveButton(getString(R.string.action_continue), (dialog, which) -> {
|
||||
EditText uuidEditText = (EditText)chooseRecipientDialogView.findViewById(R.id.uuidEditText);
|
||||
openInboxMessages(uuidEditText.getText().toString(), "");
|
||||
})
|
||||
.setNeutralButton(getString(R.string.action_cancel), (dialog, which) -> {
|
||||
UiUtils.dismissKeyboard(this.activity);
|
||||
dialog.cancel();
|
||||
})
|
||||
.create();
|
||||
scaneQRCodeButton.setOnClickListener((View v) -> {
|
||||
IntentIntegrator scanIntegrator = new IntentIntegrator(getActivity());
|
||||
scanIntegrator.initiateScan(this);
|
||||
});
|
||||
alert.setView(chooseRecipientDialogView);
|
||||
alert.show();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void injectFragment(AppComponent component) {
|
||||
component.inject(this);
|
||||
|
|
@ -110,9 +168,13 @@ public class InboxFragment extends BaseMainFragment
|
|||
@Override
|
||||
public void onClick(View v) {
|
||||
TextView entry = (TextView) v;
|
||||
InboxMessageListFragment inboxMessageListFragment = new InboxMessageListFragment();
|
||||
String replyToUserName = entry.getText().toString();
|
||||
inboxMessageListFragment.setMessages(this.messages, replyToUserName, entry.getTag().toString());
|
||||
openInboxMessages(entry.getTag().toString(), replyToUserName);
|
||||
}
|
||||
|
||||
private void openInboxMessages(String userID, String username) {
|
||||
InboxMessageListFragment inboxMessageListFragment = new InboxMessageListFragment();
|
||||
inboxMessageListFragment.setMessages(this.messages, username, userID);
|
||||
this.activity.displayFragment(inboxMessageListFragment);
|
||||
}
|
||||
|
||||
|
|
@ -123,4 +185,24 @@ public class InboxFragment extends BaseMainFragment
|
|||
this.setInboxMessages();
|
||||
swipeRefreshLayout.setRefreshing(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||
super.onActivityResult(requestCode, resultCode, data);
|
||||
|
||||
IntentResult scanningResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
|
||||
|
||||
if (scanningResult != null && scanningResult.getContents() != null) {
|
||||
if (this.chooseRecipientDialogView != null) {
|
||||
EditText uuidEditText = (EditText) this.chooseRecipientDialogView.findViewById(R.id.uuidEditText);
|
||||
String qrCodeUrl = scanningResult.getContents();
|
||||
Uri uri = Uri.parse(qrCodeUrl);
|
||||
if (uri == null || uri.getPathSegments().size() < 3) {
|
||||
return;
|
||||
}
|
||||
String userID = uri.getPathSegments().get(2);
|
||||
uuidEditText.setText(userID);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -12,12 +12,17 @@ import com.habitrpg.android.habitica.components.AppComponent;
|
|||
import com.habitrpg.android.habitica.events.HabitScoreEvent;
|
||||
import com.habitrpg.android.habitica.events.TaskSaveEvent;
|
||||
import com.habitrpg.android.habitica.events.TaskTappedEvent;
|
||||
import com.habitrpg.android.habitica.events.ToggledEditTagsEvent;
|
||||
import com.habitrpg.android.habitica.events.ToggledInnStateEvent;
|
||||
import com.habitrpg.android.habitica.events.commands.AddNewTaskCommand;
|
||||
import com.habitrpg.android.habitica.events.commands.ChecklistCheckedCommand;
|
||||
import com.habitrpg.android.habitica.events.commands.CreateTagCommand;
|
||||
import com.habitrpg.android.habitica.events.commands.DeleteTagCommand;
|
||||
import com.habitrpg.android.habitica.events.commands.EditTagCommand;
|
||||
import com.habitrpg.android.habitica.events.commands.FilterTasksByTagsCommand;
|
||||
import com.habitrpg.android.habitica.events.commands.RefreshUserCommand;
|
||||
import com.habitrpg.android.habitica.events.commands.TaskCheckedCommand;
|
||||
import com.habitrpg.android.habitica.events.commands.UpdateTagCommand;
|
||||
import com.habitrpg.android.habitica.helpers.TagsHelper;
|
||||
import com.habitrpg.android.habitica.ui.activities.MainActivity;
|
||||
import com.habitrpg.android.habitica.ui.activities.TaskFormActivity;
|
||||
|
|
@ -27,13 +32,15 @@ import com.habitrpg.android.habitica.ui.adapter.tasks.SortableTasksRecyclerViewA
|
|||
import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment;
|
||||
import com.habitrpg.android.habitica.ui.helpers.Debounce;
|
||||
import com.habitrpg.android.habitica.ui.helpers.UiUtils;
|
||||
import com.habitrpg.android.habitica.ui.helpers.ViewHelper;
|
||||
import com.habitrpg.android.habitica.ui.menu.EditTagsDrawerItem;
|
||||
import com.habitrpg.android.habitica.ui.menu.EditTagsSectionDrawer;
|
||||
import com.habitrpg.android.habitica.ui.menu.EditTextDrawer;
|
||||
import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser;
|
||||
import com.magicmicky.habitrpgwrapper.lib.models.Tag;
|
||||
import com.magicmicky.habitrpgwrapper.lib.models.TaskDirection;
|
||||
import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task;
|
||||
import com.mikepenz.materialdrawer.interfaces.OnCheckedChangeListener;
|
||||
import com.mikepenz.materialdrawer.model.SectionDrawerItem;
|
||||
import com.mikepenz.materialdrawer.model.SwitchDrawerItem;
|
||||
import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem;
|
||||
|
||||
|
|
@ -46,9 +53,10 @@ import android.os.AsyncTask;
|
|||
import android.os.Bundle;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.support.v4.app.FragmentPagerAdapter;
|
||||
import android.support.v4.content.ContextCompat;
|
||||
import android.support.v4.view.GravityCompat;
|
||||
import android.support.v4.view.ViewPager;
|
||||
import android.util.Log;
|
||||
import android.support.v7.app.AlertDialog;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuInflater;
|
||||
|
|
@ -57,7 +65,9 @@ import android.view.View;
|
|||
import android.view.ViewGroup;
|
||||
import android.view.animation.Animation;
|
||||
import android.view.animation.AnimationUtils;
|
||||
import android.widget.Button;
|
||||
import android.widget.CompoundButton;
|
||||
import android.widget.EditText;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.ImageView;
|
||||
|
||||
|
|
@ -68,9 +78,6 @@ import java.util.Map;
|
|||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import rx.Observer;
|
||||
import rx.functions.Action1;
|
||||
|
||||
public class TasksFragment extends BaseMainFragment implements OnCheckedChangeListener {
|
||||
|
||||
private static final int TASK_CREATED_RESULT = 1;
|
||||
|
|
@ -86,6 +93,9 @@ public class TasksFragment extends BaseMainFragment implements OnCheckedChangeLi
|
|||
private ArrayList<String> tagIds; // Added this so other activities/fragments can get the IDs
|
||||
|
||||
private boolean displayingTaskForm;
|
||||
private boolean editingTags;
|
||||
private List<Tag> tags;
|
||||
private List<Tag> tagsCopy;
|
||||
private HashMap<String, Boolean> tagFilterMap = new HashMap<>();
|
||||
private Debounce filterChangedHandler = new Debounce(1500, 1000) {
|
||||
@Override
|
||||
|
|
@ -111,7 +121,8 @@ public class TasksFragment extends BaseMainFragment implements OnCheckedChangeLi
|
|||
super.onCreate(savedInstanceState);
|
||||
|
||||
if (user != null) {
|
||||
fillTagFilterDrawer(user.getTags());
|
||||
tags = user.getTags();
|
||||
fillTagFilterDrawer(tags);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -121,6 +132,7 @@ public class TasksFragment extends BaseMainFragment implements OnCheckedChangeLi
|
|||
|
||||
this.usesTabLayout = true;
|
||||
this.displayingTaskForm = false;
|
||||
this.editingTags = false;
|
||||
super.onCreateView(inflater, container, savedInstanceState);
|
||||
View v = inflater.inflate(R.layout.fragment_viewpager, container, false);
|
||||
|
||||
|
|
@ -260,17 +272,14 @@ public class TasksFragment extends BaseMainFragment implements OnCheckedChangeLi
|
|||
tabLayout.setupWithViewPager(viewPager);
|
||||
}
|
||||
}
|
||||
|
||||
// endregion
|
||||
|
||||
//region Events
|
||||
|
||||
public void updateUserData(HabitRPGUser user) {
|
||||
super.updateUserData(user);
|
||||
stopAnimatingRefreshItem();
|
||||
if (this.user != null) {
|
||||
fillTagFilterDrawer(user.getTags());
|
||||
|
||||
fillTagFilterDrawer(tags);
|
||||
for (TaskRecyclerViewFragment fragm : ViewFragmentsDictionary.values()) {
|
||||
if (fragm != null) {
|
||||
BaseTasksRecyclerViewAdapter adapter = fragm.recyclerAdapter;
|
||||
|
|
@ -321,6 +330,7 @@ public class TasksFragment extends BaseMainFragment implements OnCheckedChangeLi
|
|||
tag.user_id = user.getId();
|
||||
tag.async().save();
|
||||
|
||||
tags.add(tag);
|
||||
addTagFilterDrawerItem(tag);
|
||||
}, throwable -> {
|
||||
UiUtils.showSnackbar(activity, activity.getFloatingMenuWrapper(), "Error: " + throwable.getMessage(), UiUtils.SnackbarDisplayType.FAILURE);
|
||||
|
|
@ -328,6 +338,57 @@ public class TasksFragment extends BaseMainFragment implements OnCheckedChangeLi
|
|||
}
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
public void onEvent(final DeleteTagCommand event) {
|
||||
final Tag t = event.tag;
|
||||
if (apiHelper != null) {
|
||||
apiHelper.apiService.deleteTag(t.getId())
|
||||
.compose(apiHelper.configureApiCallObserver())
|
||||
.subscribe(tag -> {
|
||||
tagFilterMap.remove(t.getId());
|
||||
filterChangedHandler.hit();
|
||||
removeTagFilterDrawerItem(t);
|
||||
EventBus.getDefault().post(new RefreshUserCommand());
|
||||
}, throwable -> {
|
||||
UiUtils.showSnackbar(activity, activity.getFloatingMenuWrapper(), "Error: " + throwable.getMessage(), UiUtils.SnackbarDisplayType.FAILURE);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
public void onEvent(final EditTagCommand event) {
|
||||
showEditTagDialog(event.tag);
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
public void onEvent(final UpdateTagCommand event) {
|
||||
final Tag t = event.tag;
|
||||
final String uuid = event.uuid;
|
||||
if (apiHelper != null) {
|
||||
apiHelper.apiService.updateTag(uuid,t)
|
||||
.compose(apiHelper.configureApiCallObserver())
|
||||
.subscribe(tag -> {
|
||||
UiUtils.dismissKeyboard(this.activity);
|
||||
updateTagFilterDrawerItem(tag);
|
||||
EventBus.getDefault().post(new RefreshUserCommand());
|
||||
}, throwable -> {
|
||||
UiUtils.showSnackbar(activity, activity.getFloatingMenuWrapper(), "Error: " + throwable.getMessage(), UiUtils.SnackbarDisplayType.FAILURE);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
public void onEvent(RefreshUserCommand event) {
|
||||
if (apiHelper != null) {
|
||||
apiHelper.retrieveUser(true)
|
||||
.compose(apiHelper.configureApiCallObserver())
|
||||
.subscribe(
|
||||
new HabitRPGUserCallback(activity),
|
||||
throwable -> stopAnimatingRefreshItem()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
public void onEvent(TaskTappedEvent event) {
|
||||
if (this.displayingTaskForm) {
|
||||
|
|
@ -404,32 +465,94 @@ public class TasksFragment extends BaseMainFragment implements OnCheckedChangeLi
|
|||
user.getPreferences().setSleep(event.Inn);
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
public void onEvent(ToggledEditTagsEvent event) {
|
||||
if(user != null) {
|
||||
if(this.editingTags == event.editing) {
|
||||
return;
|
||||
}
|
||||
this.editingTags = event.editing;
|
||||
fillTagFilterDrawer(tags);
|
||||
}
|
||||
}
|
||||
//endregion Events
|
||||
|
||||
public void fillTagFilterDrawer(List<Tag> tagList) {
|
||||
if (this.tagsHelper != null) {
|
||||
List<IDrawerItem> items = new ArrayList<>();
|
||||
items.add(new SectionDrawerItem().withName("Filter by Tag"));
|
||||
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(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)
|
||||
);
|
||||
}
|
||||
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)
|
||||
);
|
||||
}
|
||||
this.activity.fillFilterDrawer(items);
|
||||
}
|
||||
this.activity.fillFilterDrawer(items);
|
||||
}
|
||||
}
|
||||
|
||||
public void addTagFilterDrawerItem(Tag tag) {
|
||||
if (this.tagsHelper != null) {
|
||||
IDrawerItem item = new SwitchDrawerItem()
|
||||
.withName(tag.getName())
|
||||
.withTag(tag)
|
||||
.withChecked(this.tagsHelper.isTagChecked(tag.getId()))
|
||||
.withOnCheckedChangeListener(this);
|
||||
this.activity.addFilterDrawerItem(item);
|
||||
if(this.editingTags) {
|
||||
IDrawerItem item = new EditTagsDrawerItem()
|
||||
.withName(tag.getName())
|
||||
.withTag(tag);
|
||||
this.activity.addFilterDrawerItem(item);
|
||||
}else {
|
||||
IDrawerItem item = new SwitchDrawerItem()
|
||||
.withName(tag.getName())
|
||||
.withTag(tag)
|
||||
.withChecked(this.tagsHelper.isTagChecked(tag.getId()))
|
||||
.withOnCheckedChangeListener(this);
|
||||
this.activity.addFilterDrawerItem(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void removeTagFilterDrawerItem(Tag t) {
|
||||
//Have to add 2 for the Drawer components that reside above the actual tags' ui component.
|
||||
int pos = tags.indexOf(t) + 2;
|
||||
tags.remove(t);
|
||||
|
||||
this.activity.removeFilterDrawerItem(pos);
|
||||
}
|
||||
|
||||
public void updateTagFilterDrawerItem(Tag t) {
|
||||
|
||||
if (this.tagsHelper != null) {
|
||||
|
||||
//Add 2 for the same reason as above
|
||||
int pos = tags.indexOf(t) + 2;
|
||||
IDrawerItem item;
|
||||
|
||||
if(this.editingTags) {
|
||||
item = new EditTagsDrawerItem()
|
||||
.withName(t.getName())
|
||||
.withTag(t);
|
||||
}else {
|
||||
item = new SwitchDrawerItem()
|
||||
.withName(t.getName())
|
||||
.withTag(t)
|
||||
.withChecked(this.tagsHelper.isTagChecked(t.getId()))
|
||||
.withOnCheckedChangeListener(this);
|
||||
}
|
||||
this.activity.updateFilterDrawerItem(item,pos);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -442,7 +565,6 @@ public class TasksFragment extends BaseMainFragment implements OnCheckedChangeLi
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onDestroyView() {
|
||||
this.activity.lockDrawer(GravityCompat.END);
|
||||
|
|
@ -474,4 +596,81 @@ public class TasksFragment extends BaseMainFragment implements OnCheckedChangeLi
|
|||
refreshItem.setActionView(null);
|
||||
}
|
||||
}
|
||||
|
||||
public void showEditTagDialog(Tag tag) {
|
||||
|
||||
Button btnDelete = null;
|
||||
|
||||
final View editTagDialogView = this.activity.getLayoutInflater().inflate(R.layout.dialog_edit_tag,null);
|
||||
|
||||
if(editTagDialogView != null) {
|
||||
EditText tagEditText = (EditText)editTagDialogView.findViewById(R.id.tagEditText);
|
||||
tagEditText.setText(tag.getName());
|
||||
|
||||
btnDelete = (Button)editTagDialogView.findViewById(R.id.btnDelete);
|
||||
ViewHelper.SetBackgroundTint(btnDelete, ContextCompat.getColor(this.activity, R.color.worse_10));
|
||||
}
|
||||
|
||||
AlertDialog alert = new AlertDialog.Builder(this.activity)
|
||||
.setTitle(getString(R.string.edit_tag_title))
|
||||
.setPositiveButton(getString(R.string.save_changes), null)
|
||||
.setNeutralButton(getString(R.string.dialog_go_back), (dialog, which) -> {
|
||||
EditText tagEditText = (EditText)editTagDialogView.findViewById(R.id.tagEditText);
|
||||
UiUtils.dismissKeyboard(this.activity,tagEditText);
|
||||
dialog.cancel();
|
||||
})
|
||||
.create();
|
||||
btnDelete.setOnClickListener((View v) -> {showDeleteTagDialog(alert,tag);});
|
||||
alert.setView(editTagDialogView);
|
||||
alert.show();
|
||||
|
||||
alert.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener(){
|
||||
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
EditText tagEditText = (EditText)editTagDialogView.findViewById(R.id.tagEditText);
|
||||
if(attemptUpdateTag(tagEditText,tag)) {
|
||||
alert.dismiss();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public boolean attemptUpdateTag(EditText tagEditText, Tag tag) {
|
||||
String newTagName = tagEditText.getText().toString();
|
||||
boolean dismiss = true;
|
||||
|
||||
if(newTagName.equals("")) {
|
||||
dismiss = false;
|
||||
return dismiss;
|
||||
}
|
||||
|
||||
UiUtils.dismissKeyboard(activity,tagEditText);
|
||||
|
||||
if(newTagName.equals(tag.getName())) {
|
||||
return dismiss;
|
||||
}
|
||||
|
||||
String uuid = tag.getId();
|
||||
tag.setName(newTagName);
|
||||
EventBus.getDefault().post(new UpdateTagCommand(tag, uuid));
|
||||
return dismiss;
|
||||
}
|
||||
|
||||
public void showDeleteTagDialog(AlertDialog d, Tag tag) {
|
||||
AlertDialog confirmDeleteAlert = new AlertDialog.Builder(this.activity)
|
||||
.setTitle(getString(R.string.confirm_delete_tag_title)).setMessage(getString(R.string.confirm_delete_tag_message))
|
||||
.setPositiveButton(getString(R.string.yes),(dialog,which) -> {
|
||||
EventBus.getDefault().post(new DeleteTagCommand(tag));
|
||||
UiUtils.dismissKeyboard(this.activity,d.getCurrentFocus());
|
||||
//dismiss both dialogs
|
||||
dialog.dismiss();
|
||||
d.dismiss();
|
||||
})
|
||||
.setNegativeButton(getString(R.string.no),(dialog, which) -> {
|
||||
dialog.dismiss();
|
||||
})
|
||||
.create();
|
||||
confirmDeleteAlert.show();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -28,6 +28,20 @@ public class UiUtils {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Hides soft keyboard if it's opened.
|
||||
* This eliminates weird behavior when hiding keyboard from within Dialog
|
||||
*
|
||||
* @param view View that currently has focus
|
||||
* @param activity - Current activity
|
||||
*/
|
||||
public static void dismissKeyboard(Activity activity, View view) {
|
||||
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
|
||||
if(view != null) {
|
||||
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Shows snackbar in given container.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -0,0 +1,114 @@
|
|||
package com.habitrpg.android.habitica.ui.menu;
|
||||
|
||||
import com.habitrpg.android.habitica.R;
|
||||
import com.habitrpg.android.habitica.events.commands.EditTagCommand;
|
||||
import com.habitrpg.android.habitica.ui.helpers.ViewHelper;
|
||||
import com.magicmicky.habitrpgwrapper.lib.models.Tag;
|
||||
import com.mikepenz.fastadapter.utils.ViewHolderFactory;
|
||||
import com.mikepenz.materialdrawer.holder.ColorHolder;
|
||||
import com.mikepenz.materialdrawer.holder.StringHolder;
|
||||
import com.mikepenz.materialdrawer.model.BasePrimaryDrawerItem;
|
||||
import com.mikepenz.materialdrawer.model.BaseViewHolder;
|
||||
|
||||
import org.greenrobot.eventbus.EventBus;
|
||||
|
||||
import android.content.Context;
|
||||
import android.support.annotation.LayoutRes;
|
||||
import android.support.annotation.StringRes;
|
||||
import android.support.v4.content.ContextCompat;
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
import android.widget.TextView;
|
||||
|
||||
/**
|
||||
* Created by jjbillings on 8/12/16.
|
||||
*/
|
||||
public class EditTagsDrawerItem extends BasePrimaryDrawerItem<EditTagsDrawerItem, EditTagsDrawerItem.ViewHolder> {
|
||||
|
||||
private StringHolder name;
|
||||
|
||||
public EditTagsDrawerItem withName(StringHolder name) {
|
||||
this.name = name;
|
||||
return this;
|
||||
}
|
||||
|
||||
public EditTagsDrawerItem withName(String name) {
|
||||
this.name = new StringHolder(name);
|
||||
return this;
|
||||
}
|
||||
|
||||
public EditTagsDrawerItem withName(@StringRes int nameRes) {
|
||||
this.name = new StringHolder(nameRes);
|
||||
return this;
|
||||
}
|
||||
|
||||
public StringHolder getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public int getType() {
|
||||
return R.id.material_drawer_item_primary_toggle;
|
||||
}
|
||||
|
||||
@Override
|
||||
@LayoutRes
|
||||
public int getLayoutRes() {
|
||||
return R.layout.edit_tags_drawer_item;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void bindView(final ViewHolder viewHolder) {
|
||||
Context ctx = viewHolder.itemView.getContext();
|
||||
|
||||
//set the text for the name
|
||||
StringHolder.applyTo(this.getName(), viewHolder.tagTextView);
|
||||
viewHolder.tagTextView.setTextColor(ColorHolder.color(getTextColor(), ctx, com.mikepenz.materialdrawer.R.attr.material_drawer_primary_text, com.mikepenz.materialdrawer.R.color.material_drawer_primary_text));
|
||||
|
||||
//Setup the Delete Button
|
||||
ViewHelper.SetBackgroundTint(viewHolder.btnEdit, ContextCompat.getColor(ctx, R.color.brand));
|
||||
viewHolder.btnEdit.setEnabled(true);
|
||||
|
||||
viewHolder.tag = (Tag)this.getTag();
|
||||
|
||||
//call the onPostBindView method to trigger post bind view actions (like the listener to modify the item if required)
|
||||
onPostBindView(this, viewHolder.itemView);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ViewHolderFactory<ViewHolder> getFactory() {
|
||||
return new ItemFactory();
|
||||
}
|
||||
|
||||
public static class ItemFactory implements ViewHolderFactory<ViewHolder> {
|
||||
public ViewHolder create(View v) {
|
||||
return new ViewHolder(v);
|
||||
}
|
||||
}
|
||||
|
||||
public static class ViewHolder extends BaseViewHolder implements View.OnClickListener {
|
||||
private TextView tagTextView;
|
||||
private Button btnEdit;
|
||||
private Tag tag;
|
||||
|
||||
private ViewHolder(View view) {
|
||||
super(view);
|
||||
tagTextView = (TextView)view.findViewById(R.id.tagTextView);
|
||||
|
||||
btnEdit = (Button)view.findViewById(R.id.btnEdit);
|
||||
btnEdit.setOnClickListener(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
if(this.tag != null) {
|
||||
EventBus.getDefault().post(new EditTagCommand(this.tag));
|
||||
//EventBus.getDefault().post(new DeleteTagCommand(this.tag));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,199 @@
|
|||
package com.habitrpg.android.habitica.ui.menu;
|
||||
|
||||
import com.habitrpg.android.habitica.ui.helpers.ViewHelper;
|
||||
import com.mikepenz.fastadapter.utils.ViewHolderFactory;
|
||||
import com.mikepenz.materialdrawer.holder.ColorHolder;
|
||||
import com.mikepenz.materialdrawer.holder.StringHolder;
|
||||
import com.mikepenz.materialdrawer.model.AbstractDrawerItem;
|
||||
import com.mikepenz.materialdrawer.model.interfaces.Nameable;
|
||||
import com.mikepenz.materialdrawer.model.interfaces.Typefaceable;
|
||||
import com.mikepenz.materialize.util.UIUtils;
|
||||
|
||||
import com.habitrpg.android.habitica.R;
|
||||
import com.habitrpg.android.habitica.events.ToggledEditTagsEvent;
|
||||
|
||||
import org.greenrobot.eventbus.EventBus;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Typeface;
|
||||
import android.support.annotation.LayoutRes;
|
||||
import android.support.annotation.StringRes;
|
||||
import android.support.v4.content.ContextCompat;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
import android.widget.TextView;
|
||||
|
||||
/**
|
||||
* Created by jjbillings on 8/12/16.
|
||||
*/
|
||||
public class EditTagsSectionDrawer extends AbstractDrawerItem<EditTagsSectionDrawer, EditTagsSectionDrawer.ViewHolder> implements Nameable<EditTagsSectionDrawer>, Typefaceable<EditTagsSectionDrawer> {
|
||||
|
||||
private StringHolder name;
|
||||
private boolean divider = true;
|
||||
private boolean editing = false;
|
||||
|
||||
private ColorHolder textColor;
|
||||
|
||||
private Typeface typeface = null;
|
||||
|
||||
public EditTagsSectionDrawer withName(StringHolder name) {
|
||||
this.name = name;
|
||||
return this;
|
||||
}
|
||||
|
||||
public EditTagsSectionDrawer withName(String name) {
|
||||
this.name = new StringHolder(name);
|
||||
return this;
|
||||
}
|
||||
|
||||
public EditTagsSectionDrawer withName(@StringRes int nameRes) {
|
||||
this.name = new StringHolder(nameRes);
|
||||
return this;
|
||||
}
|
||||
|
||||
public EditTagsSectionDrawer withEditing(boolean edit) {
|
||||
this.editing = edit;
|
||||
return this;
|
||||
}
|
||||
|
||||
public EditTagsSectionDrawer withDivider(boolean divider) {
|
||||
this.divider = divider;
|
||||
return this;
|
||||
}
|
||||
|
||||
public EditTagsSectionDrawer withTextColor(int textColor) {
|
||||
this.textColor = ColorHolder.fromColor(textColor);
|
||||
return this;
|
||||
}
|
||||
|
||||
public EditTagsSectionDrawer withTextColorRes(int textColorRes) {
|
||||
this.textColor = ColorHolder.fromColorRes(textColorRes);
|
||||
return this;
|
||||
}
|
||||
|
||||
public EditTagsSectionDrawer withTypeface(Typeface typeface) {
|
||||
this.typeface = typeface;
|
||||
return this;
|
||||
}
|
||||
|
||||
public boolean hasDivider() {
|
||||
return divider;
|
||||
}
|
||||
|
||||
public ColorHolder getTextColor() {
|
||||
return textColor;
|
||||
}
|
||||
|
||||
public StringHolder getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEnabled() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSelected() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getType() {
|
||||
return R.id.material_drawer_item_section;
|
||||
}
|
||||
|
||||
@Override
|
||||
@LayoutRes
|
||||
public int getLayoutRes() {
|
||||
return R.layout.edit_tags_section_drawer_item;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Typeface getTypeface() {
|
||||
return typeface;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void bindView(ViewHolder viewHolder) {
|
||||
Context ctx = viewHolder.itemView.getContext();
|
||||
|
||||
//set the identifier from the drawerItem here. It can be used to run tests
|
||||
viewHolder.itemView.setId(hashCode());
|
||||
|
||||
//define this item to be not clickable nor enabled
|
||||
viewHolder.view.setClickable(false);
|
||||
viewHolder.view.setEnabled(false);
|
||||
|
||||
//define the text color
|
||||
viewHolder.name.setTextColor(ColorHolder.color(getTextColor(), ctx, com.mikepenz.materialdrawer.R.attr.material_drawer_secondary_text, com.mikepenz.materialdrawer.R.color.material_drawer_secondary_text));
|
||||
|
||||
viewHolder.editing = this.editing;
|
||||
|
||||
if(this.editing) {
|
||||
viewHolder.btnEdit.setText(ctx.getString(R.string.edit_tag_btn_done));
|
||||
}else {
|
||||
viewHolder.btnEdit.setText(ctx.getString(R.string.edit_tag_btn_edit));
|
||||
}
|
||||
|
||||
ViewHelper.SetBackgroundTint(viewHolder.btnEdit, ContextCompat.getColor(ctx, R.color.brand));
|
||||
|
||||
//set the text for the name
|
||||
StringHolder.applyTo(this.getName(), viewHolder.name);
|
||||
|
||||
//define the typeface for our textViews
|
||||
if (getTypeface() != null) {
|
||||
viewHolder.name.setTypeface(getTypeface());
|
||||
}
|
||||
|
||||
//hide the divider if we do not need one
|
||||
if (this.hasDivider()) {
|
||||
viewHolder.divider.setVisibility(View.VISIBLE);
|
||||
} else {
|
||||
viewHolder.divider.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
//set the color for the divider
|
||||
viewHolder.divider.setBackgroundColor(UIUtils.getThemeColorFromAttrOrRes(ctx, com.mikepenz.materialdrawer.R.attr.material_drawer_divider, com.mikepenz.materialdrawer.R.color.material_drawer_divider));
|
||||
|
||||
//call the onPostBindView method to trigger post bind view actions (like the listener to modify the item if required)
|
||||
onPostBindView(this, viewHolder.itemView);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ViewHolderFactory<ViewHolder> getFactory() {
|
||||
return new ItemFactory();
|
||||
}
|
||||
|
||||
public static class ItemFactory implements ViewHolderFactory<ViewHolder> {
|
||||
public ViewHolder create(View v) {
|
||||
return new ViewHolder(v);
|
||||
}
|
||||
}
|
||||
|
||||
public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
|
||||
private View view;
|
||||
private View divider;
|
||||
private TextView name;
|
||||
private Button btnEdit;
|
||||
|
||||
private boolean editing;
|
||||
|
||||
private ViewHolder(View view) {
|
||||
super(view);
|
||||
this.view = view;
|
||||
this.divider = view.findViewById(R.id.material_drawer_divider);
|
||||
this.name = (TextView) view.findViewById(R.id.drawer_section_name);
|
||||
|
||||
this.btnEdit = (Button) view.findViewById(R.id.btnEdit);
|
||||
this.btnEdit.setOnClickListener(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
ToggledEditTagsEvent editTagsEvent = new ToggledEditTagsEvent(!this.editing);
|
||||
EventBus.getDefault().post(editTagsEvent);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -7,5 +7,5 @@ Verwandle Dein Leben in ein Spiel, um motiviert und organisiert zu bleiben. Habi
|
|||
|
||||
Füge Deine Gewohnheiten, täglichen Aufgaben und To-Do-Listen hinzu und dann schaffe Deinen eigenen Avatar. Hake Aufgaben ab, um mit Deinem Avatar aufzusteigen und neue Features wie Rüstung, Haustiere, Fähigkeiten oder sogar Quests freizuschalten. Bekämpfe mit Freunden Monster, um gegenseitig Verantwortung zu übernehmen. Benutze Gold um In-Game-Belohnungen zu gewinnen, wie Ausrüstung oder persönliche Preise, wie das Schauen einer Episode Deiner Lieblingsserie. Flexibel, sozial und spaßig. Habitica ist der perfekte Weg, Dich selbst zu motivieren alles mögliche zu erreichen.
|
||||
|
||||
Wir sind aktuell in der Beta-Phase, also schick uns Feedback an mobile@habitica.com! Und, falls Dir die App gefällt, würden wir uns freuen, wenn Du uns eine Bewertung schickst.</string>
|
||||
Wir sind aktuell in der Beta-Phase, also schick uns Feedback an mobile@habitica.com! Und falls Dir die App gefällt, würden wir uns freuen, wenn Du uns eine Bewertung schickst.</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -1,11 +1,11 @@
|
|||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<resources>
|
||||
<string name="store_short_description">Traktuj życie jak grę, będziesz zmotywowany i zorganizowany!</string>
|
||||
<string name="store_description">Nowa apka od HabitRPG! Przepisana od zera, bardziej przyjazna i z nowymi funkcjami.
|
||||
<string name="store_description">Nowa aplikacja od HabitRPG! Przepisana od zera, bardziej przyjazna i z nowymi funkcjami.
|
||||
|
||||
Traktuj życie jako grę, będziesz zmotywowany i zorganizowany.
|
||||
Traktuj życie jako grę, będziesz zmotywowany i zorganizowany!
|
||||
|
||||
Wpisz swoje Nawyki, swoje Codzienne cele, swoją listę Do-Zrobienia i stwórz własnego awatara. Odhaczaj zadania aby levelować postać i odblokować opcje jak pancerz, zwierzaczki, zdolności a nawet misje! Walcz z potworami wespół z przyjaciółmi aby wzajemnie się podbudowywać, i zdobywać złoto oraz nagrody: ekwipunek, odznaczenia, bilet na odcinek Twojego ulubionego serialu. Przyjazny, społeczny i zabawny, HAbitica jest doskonałym sposobem by zmotywować się i dokończyć wszystko.
|
||||
Wpisz swoje Nawyki, swoje Codzienne cele, swoją listę Do-Zrobienia i stwórz własnego awatara. Odhaczaj zadania, aby zdobywać poziomy swojej postaci i odblokować takie opcje jak pancerz, zwierzaczki, zdolności, a nawet misje! Walcz z potworami razem z przyjaciółmi, aby wzajemnie się motywować i zdobywać złoto oraz nagrody: ekwipunek, odznaczenia, bilet na odcinek Twojego ulubionego serialu. Przyjazny, społeczny i zabawny, Habitica jest doskonałym sposobem by zmotywować się i osiągać postawione sobie cele.
|
||||
|
||||
Obecnie mamy wersję beta, tak więc swobodnie zbesztaj nas przez mobile@habitica.com! A jeśli podoba ci się nasza apka, będziemy wdzięczni za pozostawienie opini.</string>
|
||||
Obecnie mamy wersję beta, tak więc wszelkie opinie i sugestie będą mile widziane - wyślij maila pod adres mobile@habitica.com! A jeśli podoba ci się nasza aplikacja, będziemy wdzięczni za ocenę!</string>
|
||||
</resources>
|
||||
|
|
|
|||
Loading…
Reference in a new issue