diff --git a/Habitica/build.gradle b/Habitica/build.gradle
index 6b89e411a6..06dbaa33f1 100644
--- a/Habitica/build.gradle
+++ b/Habitica/build.gradle
@@ -124,6 +124,8 @@ dependencies {
exclude group: 'com.android.support', module: 'multidex'
}
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
+
+ implementation 'com.android.support:multidex:1.0.3'
}
@@ -135,6 +137,7 @@ android {
applicationId "com.habitrpg.android.habitica"
vectorDrawables.useSupportLibrary = true
buildConfigField "String", "STORE", "\"google\""
+ multiDexEnabled true
}
lintOptions {
@@ -161,7 +164,7 @@ android {
release {
signingConfig signingConfigs.release
debuggable false
- multiDexEnabled false
+ multiDexEnabled true
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
resValue "string", "content_provider", "com.habitrpg.android.habitica.fileprovider"
diff --git a/Habitica/proguard-rules.pro b/Habitica/proguard-rules.pro
index 5a3b0633e0..4930ab7e43 100644
--- a/Habitica/proguard-rules.pro
+++ b/Habitica/proguard-rules.pro
@@ -178,3 +178,5 @@
-dontwarn com.viewpagerindicator.**
#-ignorewarnings
+-keep class com.google.firebase.provider.FirebaseInitProvider
+-keep class com.example.instabug.**
diff --git a/Habitica/res/values/attrs.xml b/Habitica/res/values/attrs.xml
index 0e0e6ea551..fc4568fe58 100644
--- a/Habitica/res/values/attrs.xml
+++ b/Habitica/res/values/attrs.xml
@@ -21,7 +21,7 @@
-
+
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaBaseApplication.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaBaseApplication.kt
index 450acf4a75..78300ed224 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaBaseApplication.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaBaseApplication.kt
@@ -10,6 +10,7 @@ import android.content.res.Resources
import android.database.DatabaseErrorHandler
import android.database.sqlite.SQLiteDatabase
import android.preference.PreferenceManager
+import android.support.multidex.MultiDexApplication
import android.support.v7.app.AppCompatDelegate
import android.util.Log
@@ -50,7 +51,7 @@ import io.realm.Realm
import io.realm.RealmConfiguration
//contains all HabiticaApplicationLogic except dagger componentInitialisation
-abstract class HabiticaBaseApplication : Application() {
+abstract class HabiticaBaseApplication : MultiDexApplication() {
var refWatcher: RefWatcher? = null
@Inject
internal lateinit var lazyApiHelper: ApiClient
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/api/MaintenanceApiService.java b/Habitica/src/main/java/com/habitrpg/android/habitica/api/MaintenanceApiService.java
index 90c51c8eb3..e5a1c55b4d 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/api/MaintenanceApiService.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/api/MaintenanceApiService.java
@@ -1,6 +1,5 @@
package com.habitrpg.android.habitica.api;
-import com.habitrpg.android.habitica.models.responses.HabitResponse;
import com.habitrpg.android.habitica.models.responses.MaintenanceResponse;
import io.reactivex.Flowable;
@@ -9,9 +8,9 @@
public interface MaintenanceApiService {
@GET("maintenance-android.json")
- Flowable> getMaintenanceStatus();
+ Flowable getMaintenanceStatus();
@GET("deprecation-android.json")
- Flowable> getDepricationStatus();
+ Flowable getDepricationStatus();
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/ContentRepository.java b/Habitica/src/main/java/com/habitrpg/android/habitica/data/ContentRepository.java
deleted file mode 100644
index 0fb731d7d2..0000000000
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/ContentRepository.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.habitrpg.android.habitica.data;
-
-import com.habitrpg.android.habitica.models.ContentResult;
-import com.habitrpg.android.habitica.models.WorldState;
-
-import io.reactivex.Flowable;
-
-public interface ContentRepository extends BaseRepository {
-
- Flowable retrieveContent();
- Flowable retrieveContent(boolean forced);
-
- Flowable retrieveWorldState();
-}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/ContentRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/ContentRepository.kt
new file mode 100644
index 0000000000..e0de287dcc
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/ContentRepository.kt
@@ -0,0 +1,14 @@
+package com.habitrpg.android.habitica.data
+
+import com.habitrpg.android.habitica.models.ContentResult
+import com.habitrpg.android.habitica.models.WorldState
+
+import io.reactivex.Flowable
+
+interface ContentRepository : BaseRepository {
+
+ fun retrieveContent(): Flowable
+ fun retrieveContent(forced: Boolean): Flowable
+
+ fun retrieveWorldState(): Flowable
+}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/CustomizationRepository.java b/Habitica/src/main/java/com/habitrpg/android/habitica/data/CustomizationRepository.java
deleted file mode 100644
index aea0310886..0000000000
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/CustomizationRepository.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package com.habitrpg.android.habitica.data;
-
-import com.habitrpg.android.habitica.models.inventory.Customization;
-
-import io.reactivex.Flowable;
-import io.realm.RealmResults;
-
-public interface CustomizationRepository extends ContentRepository {
- Flowable> getCustomizations(String type, String category, boolean onlyAvailable);
-}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/CustomizationRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/CustomizationRepository.kt
new file mode 100644
index 0000000000..abfd9c12ec
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/CustomizationRepository.kt
@@ -0,0 +1,10 @@
+package com.habitrpg.android.habitica.data
+
+import com.habitrpg.android.habitica.models.inventory.Customization
+
+import io.reactivex.Flowable
+import io.realm.RealmResults
+
+interface CustomizationRepository : ContentRepository {
+ fun getCustomizations(type: String, category: String?, onlyAvailable: Boolean): Flowable>
+}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/FAQRepository.java b/Habitica/src/main/java/com/habitrpg/android/habitica/data/FAQRepository.java
deleted file mode 100644
index 95ca24fe6b..0000000000
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/FAQRepository.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.habitrpg.android.habitica.data;
-
-import com.habitrpg.android.habitica.models.FAQArticle;
-
-import io.reactivex.Flowable;
-import io.realm.RealmResults;
-
-public interface FAQRepository extends BaseRepository {
- Flowable> getArticles();
-
-}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/FAQRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/FAQRepository.kt
new file mode 100644
index 0000000000..f430d09ed4
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/FAQRepository.kt
@@ -0,0 +1,11 @@
+package com.habitrpg.android.habitica.data
+
+import com.habitrpg.android.habitica.models.FAQArticle
+
+import io.reactivex.Flowable
+import io.realm.RealmResults
+
+interface FAQRepository : BaseRepository {
+ fun getArticles(): Flowable>
+
+}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/InventoryRepository.java b/Habitica/src/main/java/com/habitrpg/android/habitica/data/InventoryRepository.java
deleted file mode 100644
index cda99983c3..0000000000
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/InventoryRepository.java
+++ /dev/null
@@ -1,92 +0,0 @@
-package com.habitrpg.android.habitica.data;
-
-import com.habitrpg.android.habitica.models.inventory.Egg;
-import com.habitrpg.android.habitica.models.inventory.Equipment;
-import com.habitrpg.android.habitica.models.inventory.Food;
-import com.habitrpg.android.habitica.models.inventory.HatchingPotion;
-import com.habitrpg.android.habitica.models.inventory.Item;
-import com.habitrpg.android.habitica.models.inventory.Mount;
-import com.habitrpg.android.habitica.models.inventory.Pet;
-import com.habitrpg.android.habitica.models.inventory.Quest;
-import com.habitrpg.android.habitica.models.inventory.QuestContent;
-import com.habitrpg.android.habitica.models.responses.BuyResponse;
-import com.habitrpg.android.habitica.models.responses.FeedResponse;
-import com.habitrpg.android.habitica.models.shops.Shop;
-import com.habitrpg.android.habitica.models.shops.ShopItem;
-import com.habitrpg.android.habitica.models.user.Items;
-import com.habitrpg.android.habitica.models.user.User;
-
-import org.jetbrains.annotations.NotNull;
-
-import java.util.List;
-import java.util.Map;
-
-import io.reactivex.Flowable;
-import io.realm.RealmResults;
-
-
-public interface InventoryRepository extends ContentRepository {
- Flowable getQuestContent(String key);
-
- Flowable> getItems(List searchedKeys);
-
- long getArmoireRemainingCount();
-
- Flowable> getInAppRewards();
- Flowable> retrieveInAppRewards();
-
- Flowable> getOwnedEquipment(@NotNull String type);
- Flowable> getOwnedEquipment();
-
- Flowable extends RealmResults extends Item>> getOwnedItems(Class extends Item> itemClass, User user);
- Flowable extends Map> getOwnedItems(@NotNull User user);
-
- Flowable getEquipment(String key);
-
- Flowable openMysteryItem(User user);
-
- void saveEquipment(Equipment equipment);
-
- Flowable> getMounts();
- Flowable> getMounts(@NotNull String type, @NotNull String group);
-
- Flowable> getOwnedMounts();
- Flowable> getOwnedMounts(@NotNull String animalType, @NotNull String animalGroup);
-
- Flowable> getPets();
- Flowable> getPets(@NotNull String type, @NotNull String group);
-
- Flowable> getOwnedPets();
- Flowable> getOwnedPets(@NotNull String type, @NotNull String group);
-
- void updateOwnedEquipment(User user);
-
- void changeOwnedCount(String type, String key, int amountToAdd);
-
- Flowable sellItem(User user, String type, String key);
- Flowable sellItem(User user, Item item);
-
- Flowable equipGear(User user, String equipment, boolean asCostume);
- Flowable equip(User user, String type, String key);
-
- Flowable feedPet(Pet pet, Food food);
-
- Flowable hatchPet(Egg egg, HatchingPotion hatchingPotion);
-
- Flowable inviteToQuest(QuestContent quest);
-
- Flowable buyItem(User user, String id, double value);
-
- Flowable retrieveShopInventory(String identifier);
- Flowable retrieveMarketGear();
-
- Flowable purchaseMysterySet(String categoryIdentifier);
-
- Flowable purchaseHourglassItem(String purchaseType, String key);
-
- Flowable purchaseQuest(String key);
-
- Flowable purchaseItem(String purchaseType, String key);
-
- Flowable> togglePinnedItem(ShopItem item);
-}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/InventoryRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/InventoryRepository.kt
new file mode 100644
index 0000000000..b5ba483dfb
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/InventoryRepository.kt
@@ -0,0 +1,87 @@
+package com.habitrpg.android.habitica.data
+
+import com.habitrpg.android.habitica.models.inventory.Egg
+import com.habitrpg.android.habitica.models.inventory.Equipment
+import com.habitrpg.android.habitica.models.inventory.Food
+import com.habitrpg.android.habitica.models.inventory.HatchingPotion
+import com.habitrpg.android.habitica.models.inventory.Item
+import com.habitrpg.android.habitica.models.inventory.Mount
+import com.habitrpg.android.habitica.models.inventory.Pet
+import com.habitrpg.android.habitica.models.inventory.Quest
+import com.habitrpg.android.habitica.models.inventory.QuestContent
+import com.habitrpg.android.habitica.models.responses.BuyResponse
+import com.habitrpg.android.habitica.models.responses.FeedResponse
+import com.habitrpg.android.habitica.models.shops.Shop
+import com.habitrpg.android.habitica.models.shops.ShopItem
+import com.habitrpg.android.habitica.models.user.Items
+import com.habitrpg.android.habitica.models.user.User
+
+import io.reactivex.Flowable
+import io.realm.RealmResults
+
+
+interface InventoryRepository : ContentRepository {
+
+ fun getArmoireRemainingCount(): Long
+
+ fun getInAppRewards(): Flowable>
+ fun getOwnedEquipment(): Flowable>
+
+ fun getMounts(): Flowable>
+
+ fun getOwnedMounts(): Flowable>
+
+ fun getPets(): Flowable>
+
+ fun getOwnedPets(): Flowable>
+ fun getQuestContent(key: String): Flowable
+
+ fun getItems(searchedKeys: List): Flowable>
+ fun retrieveInAppRewards(): Flowable>
+
+ fun getOwnedEquipment(type: String): Flowable>
+
+ fun getOwnedItems(itemClass: Class, user: User?): Flowable>
+ fun getOwnedItems(user: User): Flowable>
+
+ fun getEquipment(key: String): Flowable
+
+ fun openMysteryItem(user: User?): Flowable
+
+ fun saveEquipment(equipment: Equipment)
+ fun getMounts(type: String, group: String): Flowable>
+ fun getOwnedMounts(animalType: String, animalGroup: String): Flowable>
+ fun getPets(type: String, group: String): Flowable>
+ fun getOwnedPets(type: String, group: String): Flowable>
+
+ fun updateOwnedEquipment(user: User)
+
+ fun changeOwnedCount(type: String, key: String, amountToAdd: Int)
+
+ fun sellItem(user: User?, type: String, key: String): Flowable
+ fun sellItem(user: User?, item: Item): Flowable
+
+ fun equipGear(user: User?, equipment: String, asCostume: Boolean): Flowable
+ fun equip(user: User?, type: String, key: String): Flowable
+
+ fun feedPet(pet: Pet, food: Food): Flowable
+
+ fun hatchPet(egg: Egg, hatchingPotion: HatchingPotion): Flowable
+
+ fun inviteToQuest(quest: QuestContent): Flowable
+
+ fun buyItem(user: User?, id: String, value: Double): Flowable
+
+ fun retrieveShopInventory(identifier: String): Flowable
+ fun retrieveMarketGear(): Flowable
+
+ fun purchaseMysterySet(categoryIdentifier: String): Flowable
+
+ fun purchaseHourglassItem(purchaseType: String, key: String): Flowable
+
+ fun purchaseQuest(key: String): Flowable
+
+ fun purchaseItem(purchaseType: String, key: String): Flowable
+
+ fun togglePinnedItem(item: ShopItem): Flowable>
+}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/SetupCustomizationRepository.java b/Habitica/src/main/java/com/habitrpg/android/habitica/data/SetupCustomizationRepository.java
deleted file mode 100644
index ba58ad315e..0000000000
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/SetupCustomizationRepository.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.habitrpg.android.habitica.data;
-
-
-import com.habitrpg.android.habitica.models.SetupCustomization;
-import com.habitrpg.android.habitica.models.user.User;
-
-import java.util.List;
-
-public interface SetupCustomizationRepository {
-
- List getCustomizations(String type, User user);
- List getCustomizations(String type, String subtype, User user);
-}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/SetupCustomizationRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/SetupCustomizationRepository.kt
new file mode 100644
index 0000000000..d89f09aaf4
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/SetupCustomizationRepository.kt
@@ -0,0 +1,11 @@
+package com.habitrpg.android.habitica.data
+
+
+import com.habitrpg.android.habitica.models.SetupCustomization
+import com.habitrpg.android.habitica.models.user.User
+
+interface SetupCustomizationRepository {
+
+ fun getCustomizations(type: String, user: User): List
+ fun getCustomizations(type: String, subtype: String?, user: User): List
+}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt
index 073645b98d..3d50d1071f 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt
@@ -71,7 +71,9 @@ class ApiClientImpl//private OnHabitsAPIResult mResultListener;
private val apiService: ApiService
private val apiCallTransformer = FlowableTransformer, Any> { observable ->
- observable.map { habitResponse ->
+ observable
+ .filter { it.data != null }
+ .map { habitResponse ->
if (habitResponse.notifications != null) {
popupNotificationsManager.showNotificationDialog(habitResponse.notifications)
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/CustomizationRepositoryImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/CustomizationRepositoryImpl.kt
index 50fb78540c..6390945d23 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/CustomizationRepositoryImpl.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/CustomizationRepositoryImpl.kt
@@ -10,7 +10,7 @@ import io.realm.RealmResults
class CustomizationRepositoryImpl(localRepository: CustomizationLocalRepository, apiClient: ApiClient) : ContentRepositoryImpl(localRepository, apiClient), CustomizationRepository {
- override fun getCustomizations(type: String, category: String, onlyAvailable: Boolean): Flowable> {
+ override fun getCustomizations(type: String, category: String?, onlyAvailable: Boolean): Flowable> {
return localRepository.getCustomizations(type, category, onlyAvailable)
}
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/InventoryRepositoryImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/InventoryRepositoryImpl.kt
index 47218789e7..ebee79fadd 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/InventoryRepositoryImpl.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/InventoryRepositoryImpl.kt
@@ -55,7 +55,7 @@ class InventoryRepositoryImpl(localRepository: InventoryLocalRepository, apiClie
return localRepository.getEquipment(key)
}
- override fun openMysteryItem(user: User): Flowable {
+ override fun openMysteryItem(user: User?): Flowable {
return apiClient.openMysteryItem().doOnNext { itemData ->
itemData.owned = true
localRepository.save(itemData)
@@ -107,7 +107,7 @@ class InventoryRepositoryImpl(localRepository: InventoryLocalRepository, apiClie
localRepository.changeOwnedCount(type, key, amountToAdd)
}
- override fun sellItem(user: User, type: String, key: String): Flowable {
+ override fun sellItem(user: User?, type: String, key: String): Flowable {
return localRepository.getItem(type, key)
.flatMap { item -> sellItem(user, item) }
}
@@ -135,7 +135,7 @@ class InventoryRepositoryImpl(localRepository: InventoryLocalRepository, apiClie
}
}
- override fun equipGear(user: User, key: String, asCostume: Boolean): Flowable {
+ override fun equipGear(user: User?, key: String, asCostume: Boolean): Flowable {
return equip(user, if (asCostume) "costume" else "equipped", key)
}
@@ -181,9 +181,12 @@ class InventoryRepositoryImpl(localRepository: InventoryLocalRepository, apiClie
.doOnNext { localRepository.changeOwnedCount(quest, -1) }
}
- override fun buyItem(user: User, key: String, value: Double): Flowable {
- return apiClient.buyItem(key)
+ override fun buyItem(user: User?, id: String, value: Double): Flowable {
+ return apiClient.buyItem(id)
.doOnNext { buyResponse ->
+ if (user == null) {
+ return@doOnNext
+ }
val copiedUser = localRepository.getUnmanagedCopy(user)
if (buyResponse.items != null) {
buyResponse.items.userId = user.id
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/SetupCustomizationRepositoryImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/SetupCustomizationRepositoryImpl.kt
index 04a81ba029..62b7b8ed6d 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/SetupCustomizationRepositoryImpl.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/SetupCustomizationRepositoryImpl.kt
@@ -77,14 +77,14 @@ constructor(private val context: Context) : SetupCustomizationRepository {
SetupCustomization.createSkin("6bd049", R.color.skin_6bd049)
)
- override fun getCustomizations(category: String, user: User): List {
- return getCustomizations(category, null, user)
+ override fun getCustomizations(type: String, user: User): List {
+ return getCustomizations(type, null, user)
}
- override fun getCustomizations(category: String, subcategory: String?, user: User): List {
- when (category) {
+ override fun getCustomizations(type: String, subtype: String?, user: User): List {
+ when (type) {
"body" -> {
- return when (subcategory) {
+ return when (subtype) {
"size" -> sizes
"shirt" -> getShirts(user.preferences?.size ?: "slim")
else -> emptyList()
@@ -92,7 +92,7 @@ constructor(private val context: Context) : SetupCustomizationRepository {
}
"skin" -> return skins
"hair" -> {
- return when (subcategory) {
+ return when (subtype) {
"bangs" -> getBangs(user.preferences?.hair!!.color)
"ponytail" -> getHairBases(user.preferences?.hair!!.color)
"color" -> hairColors
@@ -100,7 +100,7 @@ constructor(private val context: Context) : SetupCustomizationRepository {
}
}
"extras" -> {
- return when (subcategory) {
+ return when (subtype) {
"flower" -> flowers
"glasses" -> glasses
"wheelchair" -> wheelchairs
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/CustomizationLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/CustomizationLocalRepository.kt
index dd812c1bfc..f1dc16cd91 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/CustomizationLocalRepository.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/CustomizationLocalRepository.kt
@@ -6,5 +6,5 @@ import io.reactivex.Flowable
import io.realm.RealmResults
interface CustomizationLocalRepository : ContentLocalRepository {
- fun getCustomizations(type: String, category: String, onlyAvailable: Boolean): Flowable>
+ fun getCustomizations(type: String, category: String?, onlyAvailable: Boolean): Flowable>
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/InventoryLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/InventoryLocalRepository.kt
index 7c718704ff..b6b9410d2d 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/InventoryLocalRepository.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/InventoryLocalRepository.kt
@@ -42,7 +42,7 @@ interface InventoryLocalRepository : ContentLocalRepository {
fun getItem(type: String, key: String): Flowable-
- fun decrementMysteryItemCount(user: User)
+ fun decrementMysteryItemCount(user: User?)
fun saveInAppRewards(onlineItems: List)
fun changePetFeedStatus(key: String?, feedStatus: Int)
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmCustomizationLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmCustomizationLocalRepository.kt
index 973144e341..70da32eeaa 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmCustomizationLocalRepository.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmCustomizationLocalRepository.kt
@@ -10,7 +10,7 @@ import java.util.*
class RealmCustomizationLocalRepository(realm: Realm) : RealmContentLocalRepository(realm), CustomizationLocalRepository {
- override fun getCustomizations(type: String, category: String, onlyAvailable: Boolean): Flowable> {
+ override fun getCustomizations(type: String, category: String?, onlyAvailable: Boolean): Flowable> {
var query = realm.where(Customization::class.java)
.equalTo("type", type)
.equalTo("category", category)
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmInventoryLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmInventoryLocalRepository.kt
index f015b12a19..b36e3a2cc9 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmInventoryLocalRepository.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmInventoryLocalRepository.kt
@@ -216,7 +216,10 @@ class RealmInventoryLocalRepository(realm: Realm, private val context: Context)
.cast(Item::class.java)
}
- override fun decrementMysteryItemCount(user: User) {
+ override fun decrementMysteryItemCount(user: User?) {
+ if (user == null) {
+ return
+ }
val item = realm.where(SpecialItem::class.java).equalTo("isMysteryItem", true).findFirst()
realm.executeTransaction {
if (item != null && item.isValid) {
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/RemoteConfigManager.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/RemoteConfigManager.java
index b0a8fb5252..316fffab40 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/RemoteConfigManager.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/RemoteConfigManager.java
@@ -23,6 +23,7 @@ public class RemoteConfigManager {
private Boolean enableRepeatbles = false;
private Boolean enableNewShops = false;
private String shopSpriteSuffix = "";
+ private Integer maxChatLength = 3000;
private String REMOTE_STRING_KEY = "remote-string";
public RemoteConfigManager(Context context) {
@@ -43,6 +44,8 @@ public String shopSpriteSuffix() {
return shopSpriteSuffix;
}
+ public Integer maxChatLength() { return maxChatLength; }
+
private void loadFromPreferences () {
String storedPreferences = PreferenceManager.getDefaultSharedPreferences(context)
.getString(REMOTE_STRING_KEY, "");
@@ -64,6 +67,9 @@ private void parseConfig(String jsonString) {
if (obj.has("shopSpriteSuffix")) {
shopSpriteSuffix = obj.getString("shopSpriteSuffix");
}
+ if (obj.has("maxChatLength")) {
+ maxChatLength = obj.getInt("maxChatLength");
+ }
} catch (JSONException e) {
e.printStackTrace();
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/TiledBitmapPostProcessor.java b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/TiledBitmapPostProcessor.java
deleted file mode 100644
index 741736b9bf..0000000000
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/TiledBitmapPostProcessor.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.habitrpg.android.habitica.helpers;
-
-import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.Shader;
-import android.graphics.drawable.BitmapDrawable;
-
-import com.facebook.imagepipeline.request.BasePostprocessor;
-
-/**
- * Created by phillip on 21.07.17.
- */
-
-public class TiledBitmapPostProcessor extends BasePostprocessor {
-
- private final Resources resources;
-
- public TiledBitmapPostProcessor(Resources resources) {
- super();
- this.resources = resources;
- }
-
- @Override
- public void process(Bitmap bitmap) {
- BitmapDrawable TileMe = new BitmapDrawable(resources, bitmap);
- TileMe.setTileModeX(Shader.TileMode.REPEAT);
- TileMe.setTileModeY(Shader.TileMode.REPEAT);
- super.process(TileMe.getBitmap());
- }
-}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/ItemDetailDialog.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/ItemDetailDialog.java
deleted file mode 100644
index c651d11642..0000000000
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/ItemDetailDialog.java
+++ /dev/null
@@ -1,123 +0,0 @@
-package com.habitrpg.android.habitica.ui;
-
-import android.content.Context;
-import android.support.annotation.NonNull;
-import android.support.v7.app.AlertDialog;
-import android.view.Gravity;
-import android.view.View;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-import com.facebook.drawee.view.SimpleDraweeView;
-import com.habitrpg.android.habitica.R;
-import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils;
-import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper;
-
-public class ItemDetailDialog extends AlertDialog {
-
- private final SimpleDraweeView itemImageView;
- private final TextView contentTextView;
- private final TextView priceTextView;
- private final ImageView currencyImageView;
-
- public ItemDetailDialog(@NonNull Context context) {
- super(context);
-
- // External ContentView
- LinearLayout contentViewLayout = new LinearLayout(context);
- contentViewLayout.setOrientation(LinearLayout.VERTICAL);
-
- // Gear Image
- itemImageView = new SimpleDraweeView(context);
- LinearLayout.LayoutParams gearImageLayoutParams = new LinearLayout.LayoutParams(
- LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
-
- gearImageLayoutParams.gravity = Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL;
- gearImageLayoutParams.setMargins(0, 0, 0, 20);
- itemImageView.setMinimumWidth(200);
- itemImageView.setMinimumHeight(200);
- itemImageView.setLayoutParams(gearImageLayoutParams);
- itemImageView.setVisibility(View.GONE);
-
- // Gear Description
- contentTextView = new TextView(context, null);
- contentTextView.setPadding(16, 0, 16, 0);
- contentTextView.setVisibility(View.GONE);
-
- // GoldPrice View
- LinearLayout goldPriceLayout = new LinearLayout(context);
- goldPriceLayout.setGravity(Gravity.CENTER_HORIZONTAL);
- LinearLayout.LayoutParams goldPriceLayoutParams = new LinearLayout.LayoutParams(
- LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
- goldPriceLayoutParams.setMargins(0, 0, 0, 16);
- goldPriceLayoutParams.gravity = Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL;
-
- goldPriceLayout.setOrientation(LinearLayout.HORIZONTAL);
- goldPriceLayout.setLayoutParams(goldPriceLayoutParams);
- goldPriceLayout.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL);
-
- // Price View
- priceTextView = new TextView(context);
- priceTextView.setPadding(10, 0, 0, 0);
-
- currencyImageView = new ImageView(context);
- currencyImageView.setMinimumHeight(50);
- currencyImageView.setMinimumWidth(50);
- currencyImageView.setPadding(0, 0, 5, 0);
-
- goldPriceLayout.addView(currencyImageView);
- goldPriceLayout.addView(priceTextView);
-
- contentViewLayout.setGravity(Gravity.CENTER_VERTICAL);
-
- contentViewLayout.addView(itemImageView);
-
- contentViewLayout.addView(goldPriceLayout);
-
- contentViewLayout.addView(contentTextView);
-
- setView(contentViewLayout);
-
- this.setButton(AlertDialog.BUTTON_NEGATIVE, context.getText(R.string.reward_dialog_dismiss), (clickedDialog, which) -> {
- clickedDialog.dismiss();
- });
- }
-
- public void setDescription(CharSequence description) {
- contentTextView.setText(description);
- contentTextView.setVisibility(View.VISIBLE);
- }
-
- public void setCurrency(String currency) {
- switch (currency) {
- case "gold":
- currencyImageView.setImageBitmap(HabiticaIconsHelper.imageOfGold());
- break;
- case "gems":
- currencyImageView.setImageBitmap(HabiticaIconsHelper.imageOfGem());
- break;
- default:
- currencyImageView.setImageDrawable(null);
- break;
- }
- }
-
- public void setValue(Double value) {
- priceTextView.setText(value.toString());
- }
-
- public void setValue(Integer value) {
- priceTextView.setText(value.toString());
-
- }
-
- public void setImage(String imageName) {
- itemImageView.setVisibility(View.VISIBLE);
- DataBindingUtils.INSTANCE.loadImage(itemImageView, imageName);
- }
-
- public void setBuyListener(OnClickListener listener) {
- this.setButton(BUTTON_POSITIVE, getContext().getText(R.string.reward_dialog_buy), listener);
- }
-}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/ItemDetailDialog.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/ItemDetailDialog.kt
new file mode 100644
index 0000000000..38b45d8691
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/ItemDetailDialog.kt
@@ -0,0 +1,114 @@
+package com.habitrpg.android.habitica.ui
+
+import android.content.Context
+import android.content.DialogInterface
+import android.support.v7.app.AlertDialog
+import android.view.Gravity
+import android.view.View
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+
+import com.facebook.drawee.view.SimpleDraweeView
+import com.habitrpg.android.habitica.R
+import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils
+import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper
+
+class ItemDetailDialog(context: Context) : AlertDialog(context) {
+
+ private val itemImageView: SimpleDraweeView
+ private val contentTextView: TextView
+ private val priceTextView: TextView
+ private val currencyImageView: ImageView
+
+ init {
+
+ // External ContentView
+ val contentViewLayout = LinearLayout(context)
+ contentViewLayout.orientation = LinearLayout.VERTICAL
+
+ // Gear Image
+ itemImageView = SimpleDraweeView(context)
+ val gearImageLayoutParams = LinearLayout.LayoutParams(
+ LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT)
+
+ gearImageLayoutParams.gravity = Gravity.CENTER_HORIZONTAL or Gravity.CENTER_VERTICAL
+ gearImageLayoutParams.setMargins(0, 0, 0, 20)
+ itemImageView.minimumWidth = 200
+ itemImageView.minimumHeight = 200
+ itemImageView.layoutParams = gearImageLayoutParams
+ itemImageView.visibility = View.GONE
+
+ // Gear Description
+ contentTextView = TextView(context, null)
+ contentTextView.setPadding(16, 0, 16, 0)
+ contentTextView.visibility = View.GONE
+
+ // GoldPrice View
+ val goldPriceLayout = LinearLayout(context)
+ goldPriceLayout.gravity = Gravity.CENTER_HORIZONTAL
+ val goldPriceLayoutParams = LinearLayout.LayoutParams(
+ LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT)
+ goldPriceLayoutParams.setMargins(0, 0, 0, 16)
+ goldPriceLayoutParams.gravity = Gravity.CENTER_HORIZONTAL or Gravity.CENTER_VERTICAL
+
+ goldPriceLayout.orientation = LinearLayout.HORIZONTAL
+ goldPriceLayout.layoutParams = goldPriceLayoutParams
+ goldPriceLayout.gravity = Gravity.CENTER_HORIZONTAL or Gravity.CENTER_VERTICAL
+
+ // Price View
+ priceTextView = TextView(context)
+ priceTextView.setPadding(10, 0, 0, 0)
+
+ currencyImageView = ImageView(context)
+ currencyImageView.minimumHeight = 50
+ currencyImageView.minimumWidth = 50
+ currencyImageView.setPadding(0, 0, 5, 0)
+
+ goldPriceLayout.addView(currencyImageView)
+ goldPriceLayout.addView(priceTextView)
+
+ contentViewLayout.gravity = Gravity.CENTER_VERTICAL
+
+ contentViewLayout.addView(itemImageView)
+
+ contentViewLayout.addView(goldPriceLayout)
+
+ contentViewLayout.addView(contentTextView)
+
+ setView(contentViewLayout)
+
+ this.setButton(AlertDialog.BUTTON_NEGATIVE, context.getText(R.string.reward_dialog_dismiss)) { clickedDialog, which -> clickedDialog.dismiss() }
+ }
+
+ fun setDescription(description: CharSequence) {
+ contentTextView.text = description
+ contentTextView.visibility = View.VISIBLE
+ }
+
+ fun setCurrency(currency: String) {
+ when (currency) {
+ "gold" -> currencyImageView.setImageBitmap(HabiticaIconsHelper.imageOfGold())
+ "gems" -> currencyImageView.setImageBitmap(HabiticaIconsHelper.imageOfGem())
+ else -> currencyImageView.setImageDrawable(null)
+ }
+ }
+
+ fun setValue(value: Double?) {
+ priceTextView.text = value?.toString()
+ }
+
+ fun setValue(value: Int?) {
+ priceTextView.text = value?.toString()
+
+ }
+
+ fun setImage(imageName: String) {
+ itemImageView.visibility = View.VISIBLE
+ DataBindingUtils.loadImage(itemImageView, imageName)
+ }
+
+ fun setBuyListener(listener: DialogInterface.OnClickListener) {
+ this.setButton(DialogInterface.BUTTON_POSITIVE, context.getText(R.string.reward_dialog_buy), listener)
+ }
+}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/MaxHeightLinearLayout.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/MaxHeightLinearLayout.java
deleted file mode 100644
index f2cc673ff0..0000000000
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/MaxHeightLinearLayout.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package com.habitrpg.android.habitica.ui;
-
-
-import android.annotation.TargetApi;
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.os.Build;
-import android.util.AttributeSet;
-import android.util.DisplayMetrics;
-import android.view.View;
-import android.view.WindowManager;
-import android.widget.LinearLayout;
-
-import com.habitrpg.android.habitica.R;
-
-public class MaxHeightLinearLayout extends LinearLayout {
-
- private final float defaultHeight = 0.9f;
- private float maxHeight;
- private DisplayMetrics displaymetrics = new DisplayMetrics();
-
- public MaxHeightLinearLayout(Context context) {
- super(context);
- }
-
- public MaxHeightLinearLayout(Context context, AttributeSet attrs) {
- super(context, attrs);
- if (!isInEditMode()) {
- init(context, attrs);
- }
- }
-
- public MaxHeightLinearLayout(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- if (!isInEditMode()) {
- init(context, attrs);
- }
- }
-
- @TargetApi(Build.VERSION_CODES.LOLLIPOP)
- public MaxHeightLinearLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
- super(context, attrs, defStyleAttr, defStyleRes);
- if (!isInEditMode()) {
- init(context, attrs);
- }
- }
-
- private void init(Context context, AttributeSet attrs) {
- if (attrs != null) {
- TypedArray styledAttrs = context.obtainStyledAttributes(attrs, R.styleable.MaxHeightScrollView);
- //200 is a defualt value
- maxHeight = styledAttrs.getFloat(R.styleable.MaxHeightScrollView_maxHeightMultiplier, defaultHeight);
-
- styledAttrs.recycle();
- }
- }
-
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-
- WindowManager windowManager = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
- windowManager.getDefaultDisplay().getMetrics(displaymetrics);
- int height = (int) (displaymetrics.heightPixels * maxHeight);
- heightMeasureSpec = Math.min(heightMeasureSpec, View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.AT_MOST));
-
- super.onMeasure(widthMeasureSpec, heightMeasureSpec);
-
- }
-}
\ No newline at end of file
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/MaxHeightLinearLayout.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/MaxHeightLinearLayout.kt
new file mode 100644
index 0000000000..ad7123d046
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/MaxHeightLinearLayout.kt
@@ -0,0 +1,64 @@
+package com.habitrpg.android.habitica.ui
+
+
+import android.annotation.TargetApi
+import android.content.Context
+import android.content.res.TypedArray
+import android.os.Build
+import android.util.AttributeSet
+import android.util.DisplayMetrics
+import android.view.View
+import android.view.WindowManager
+import android.widget.LinearLayout
+
+import com.habitrpg.android.habitica.R
+
+class MaxHeightLinearLayout : LinearLayout {
+
+ private val defaultHeight = 0.9f
+ private var maxHeight: Float = 0.toFloat()
+ private val displaymetrics = DisplayMetrics()
+
+ constructor(context: Context) : super(context)
+
+ constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
+ if (!isInEditMode) {
+ init(context, attrs)
+ }
+ }
+
+ constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {
+ if (!isInEditMode) {
+ init(context, attrs)
+ }
+ }
+
+ @TargetApi(Build.VERSION_CODES.LOLLIPOP)
+ constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes) {
+ if (!isInEditMode) {
+ init(context, attrs)
+ }
+ }
+
+ private fun init(context: Context, attrs: AttributeSet?) {
+ if (attrs != null) {
+ val styledAttrs = context.obtainStyledAttributes(attrs, R.styleable.MaxHeightLinearLayout)
+ //200 is a defualt value
+ maxHeight = styledAttrs.getFloat(R.styleable.MaxHeightLinearLayout_maxHeightMultiplier, defaultHeight)
+
+ styledAttrs.recycle()
+ }
+ }
+
+ override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
+ var heightMeasurement = heightMeasureSpec
+
+ val windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
+ windowManager.defaultDisplay.getMetrics(displaymetrics)
+ val height = (displaymetrics.heightPixels * maxHeight).toInt()
+ heightMeasurement = Math.min(heightMeasurement, View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.AT_MOST))
+
+ super.onMeasure(widthMeasureSpec, heightMeasurement)
+
+ }
+}
\ No newline at end of file
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.kt
index 58dc83cbcd..5bea63f288 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.kt
@@ -33,8 +33,8 @@ import com.habitrpg.android.habitica.models.user.Stats
import com.habitrpg.android.habitica.ui.AvatarView
import com.habitrpg.android.habitica.ui.AvatarWithBarsViewModel
import com.habitrpg.android.habitica.ui.adapter.social.AchievementAdapter
+import com.habitrpg.android.habitica.ui.helpers.KeyboardUtil
import com.habitrpg.android.habitica.ui.helpers.MarkdownParser
-import com.habitrpg.android.habitica.ui.helpers.UiUtils
import com.habitrpg.android.habitica.ui.helpers.bindView
import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar
import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar.SnackbarDisplayType
@@ -142,9 +142,9 @@ class FullProfileActivity : BaseActivity() {
String.format(getString(R.string.profile_message_sent_to), userName), SnackbarDisplayType.NORMAL)
}, RxErrorHandler.handleEmptyError())
- UiUtils.dismissKeyboard(this)
+ KeyboardUtil.dismissKeyboard(this)
}
- .setNegativeButton(android.R.string.cancel) { _, _ -> UiUtils.dismissKeyboard(this) }
+ .setNegativeButton(android.R.string.cancel) { _, _ -> KeyboardUtil.dismissKeyboard(this) }
.create()
@@ -154,11 +154,7 @@ class FullProfileActivity : BaseActivity() {
}
private fun updateView(user: Member) {
- val profile = user.profile
-
- if (profile == null) {
- return
- }
+ val profile = user.profile ?: return
userName = profile.name
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GroupFormActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GroupFormActivity.kt
index 7e1ca663ad..4dce2d3eeb 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GroupFormActivity.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GroupFormActivity.kt
@@ -16,8 +16,8 @@ import android.widget.LinearLayout
import android.widget.Spinner
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.AppComponent
+import com.habitrpg.android.habitica.ui.helpers.KeyboardUtil
import com.habitrpg.android.habitica.ui.helpers.MarkdownParser
-import com.habitrpg.android.habitica.ui.helpers.UiUtils
import com.habitrpg.android.habitica.ui.helpers.bindView
import net.pherth.android.emoji_library.EmojiEditText
import net.pherth.android.emoji_library.EmojiPopup
@@ -152,13 +152,13 @@ class GroupFormActivity : BaseActivity() {
override fun onSupportNavigateUp(): Boolean {
finish()
- UiUtils.dismissKeyboard(this)
+ KeyboardUtil.dismissKeyboard(this)
return true
}
override fun onBackPressed() {
finish()
- UiUtils.dismissKeyboard(this)
+ KeyboardUtil.dismissKeyboard(this)
}
private fun finishActivitySuccessfuly() {
@@ -170,7 +170,7 @@ class GroupFormActivity : BaseActivity() {
resultIntent.putExtras(bundle)
setResult(Activity.RESULT_OK, resultIntent)
finish()
- UiUtils.dismissKeyboard(this)
+ KeyboardUtil.dismissKeyboard(this)
}
private inner class EmojiClickListener(internal var view: EmojiEditText) : View.OnClickListener {
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.kt
index 899e98bd55..badcce9d4e 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.kt
@@ -41,7 +41,7 @@ import com.habitrpg.android.habitica.helpers.AmplitudeManager
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.auth.UserAuthResponse
import com.habitrpg.android.habitica.prefs.scanner.IntentIntegrator
-import com.habitrpg.android.habitica.ui.helpers.UiUtils
+import com.habitrpg.android.habitica.ui.helpers.KeyboardUtil
import com.habitrpg.android.habitica.ui.helpers.bindView
import com.habitrpg.android.habitica.ui.views.login.LockableScrollView
import com.habitrpg.android.habitica.ui.views.login.LoginBackgroundView
@@ -556,10 +556,10 @@ class LoginActivity : BaseActivity(), Consumer {
showAnimation.play(newGameAlphaAnimation).after(scrollViewAlphaAnimation)
showAnimation.play(showLoginAlphaAnimation).after(scrollViewAlphaAnimation)
showAnimation.start()
- UiUtils.dismissKeyboard(this)
+ KeyboardUtil.dismissKeyboard(this)
}
- fun onForgotPasswordClicked() {
+ private fun onForgotPasswordClicked() {
val input = EditText(this)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
input.setAutofillHints(EditText.AUTOFILL_HINT_EMAIL_ADDRESS)
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt
index caee20c8dd..3225f69c27 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt
@@ -1,6 +1,7 @@
package com.habitrpg.android.habitica.ui.activities
import android.annotation.SuppressLint
+import android.annotation.TargetApi
import android.appwidget.AppWidgetManager
import android.content.ComponentName
import android.content.Intent
@@ -69,6 +70,7 @@ import io.reactivex.Completable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.functions.Action
import io.reactivex.functions.Consumer
+import io.reactivex.schedulers.Schedulers
import io.realm.Realm
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
@@ -142,6 +144,7 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction {
private var drawerFragment: NavigationDrawerFragment? = null
private var drawerToggle: ActionBarDrawerToggle? = null
private var keyboardUtil: KeyboardUtil? = null
+ private var resumeFromActivity = false
private val statusBarHeight: Int
get() {
@@ -257,8 +260,12 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction {
override fun onResume() {
super.onResume()
- retrieveUser()
- this.checkMaintenance()
+ if(!resumeFromActivity){
+ retrieveUser()
+ this.checkMaintenance()
+ }
+ resumeFromActivity = false
+
if (this.sharedPreferences.getLong("lastReminderSchedule", 0) < Date().time - 86400000) {
try {
@@ -290,6 +297,21 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction {
super.onPause()
}
+ override fun startActivity(intent: Intent?) {
+ resumeFromActivity = true
+ super.startActivity(intent)
+ }
+
+ override fun startActivityForResult(intent: Intent?, requestCode: Int) {
+ resumeFromActivity = true
+ super.startActivityForResult(intent, requestCode)
+ }
+
+ override fun startActivity(intent: Intent?, options: Bundle?) {
+ resumeFromActivity = true
+ super.startActivity(intent, options)
+ }
+
private fun updateWidgets() {
updateWidget(AvatarStatsWidgetProvider::class.java)
updateWidget(TodoListWidgetProvider::class.java)
@@ -499,7 +521,8 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction {
}
if (event.Reward.specialTag != null && event.Reward.specialTag == "item") {
- inventoryRepository.buyItem(user, event.Reward.id, event.Reward.value)
+ val id = event.Reward.id ?: return
+ inventoryRepository.buyItem(user, id, event.Reward.value)
.subscribe(Consumer { buyResponse ->
var snackbarMessage = getString(R.string.successful_purchase, event.Reward.text)
if (event.Reward.id == "armoire") {
@@ -801,7 +824,8 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction {
private fun checkMaintenance() {
this.maintenanceService.maintenanceStatus
- .compose(apiClient.configureApiCallObserver())
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
.subscribe(Consumer { maintenanceResponse ->
if (maintenanceResponse == null) {
return@Consumer
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MaintenanceActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MaintenanceActivity.kt
index 8cf5ca0f70..7e4f7de024 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MaintenanceActivity.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MaintenanceActivity.kt
@@ -15,7 +15,9 @@ import com.habitrpg.android.habitica.data.ApiClient
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.ui.helpers.MarkdownParser
import com.habitrpg.android.habitica.ui.helpers.bindView
+import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.functions.Consumer
+import io.reactivex.schedulers.Schedulers
import net.pherth.android.emoji_library.EmojiTextView
import javax.inject.Inject
@@ -66,7 +68,8 @@ class MaintenanceActivity : BaseActivity() {
super.onResume()
if (!isDeprecationNotice) {
this.maintenanceService.maintenanceStatus
- .compose(apiClient.configureApiCallObserver())
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
.subscribe(Consumer { maintenanceResponse ->
if (!maintenanceResponse.activeMaintenance) {
finish()
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt
index f1ceb3b056..b861d068d2 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt
@@ -178,7 +178,7 @@ class NavigationDrawerFragment : DialogFragment() {
subscriptions?.add(socialRepository.getGroup(Group.TAVERN_ID)
.doOnNext({ quest = it.quest })
.filter { it.hasActiveQuest }
- .flatMapMaybe { inventoryRepository.getQuestContent(it.quest?.key).firstElement() }
+ .flatMapMaybe { inventoryRepository.getQuestContent(it.quest?.key ?: "").firstElement() }
.subscribe(Consumer {
questContent = it
}, RxErrorHandler.handleEmptyError()))
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/faq/FAQOverviewFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/faq/FAQOverviewFragment.kt
index b2d344f021..21bfc90ea9 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/faq/FAQOverviewFragment.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/faq/FAQOverviewFragment.kt
@@ -62,7 +62,7 @@ class FAQOverviewFragment : BaseMainFragment() {
if (user == null || adapter == null) {
return
}
- faqRepository.articles.subscribe(Consumer { adapter?.setArticles(it) }, RxErrorHandler.handleEmptyError())
+ faqRepository.getArticles().subscribe(Consumer { adapter?.setArticles(it) }, RxErrorHandler.handleEmptyError())
}
override fun customTitle(): String {
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarCustomizationFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarCustomizationFragment.kt
index aa6beca3a1..554440040f 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarCustomizationFragment.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarCustomizationFragment.kt
@@ -114,14 +114,11 @@ class AvatarCustomizationFragment : BaseMainFragment() {
}
private fun loadCustomizations() {
- if (user == null) {
- return
- }
+ val type = this.type ?: return
compositeSubscription.add(customizationRepository.getCustomizations(type, category, true).subscribe(Consumer> { adapter.setCustomizations(it) }, RxErrorHandler.handleEmptyError()))
if (type == "hair" && (category == "beard" || category == "mustache")) {
val otherCategory = if (category == "mustache") "beard" else "mustache"
compositeSubscription.add(customizationRepository.getCustomizations(type, otherCategory, true).subscribe(Consumer> { adapter.additionalSetItems = it }, RxErrorHandler.handleEmptyError()))
-
}
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/equipment/EquipmentOverviewFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/equipment/EquipmentOverviewFragment.kt
index 53c6c20385..c42030aa2f 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/equipment/EquipmentOverviewFragment.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/equipment/EquipmentOverviewFragment.kt
@@ -54,7 +54,7 @@ class EquipmentOverviewFragment : BaseMainFragment() {
setImageNames()
if (this.nameMapping.isEmpty()) {
- compositeSubscription.add(inventoryRepository.ownedEquipment.subscribe(Consumer {
+ compositeSubscription.add(inventoryRepository.getOwnedEquipment().subscribe(Consumer {
for (gear in it) {
this.nameMapping[gear.key ?: ""] = gear.text
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemRecyclerFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemRecyclerFragment.kt
index 070b31812c..b5e7744f1e 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemRecyclerFragment.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemRecyclerFragment.kt
@@ -117,24 +117,28 @@ class ItemRecyclerFragment : BaseFragment() {
this.itemType = savedInstanceState.getString(ITEM_TYPE_KEY, "")
}
- if (this.isHatching) {
- dialog.requestWindowFeature(Window.FEATURE_NO_TITLE)
- this.titleView?.text = getString(R.string.hatch_with, this.hatchingItem?.text)
- this.titleView?.visibility = View.VISIBLE
- this.footerView?.text = getString(R.string.hatching_market_info)
- this.footerView?.visibility = View.VISIBLE
- this.openMarketButton?.visibility = View.VISIBLE
- } else if (this.isFeeding) {
- dialog.requestWindowFeature(Window.FEATURE_NO_TITLE)
- this.titleView?.text = getString(R.string.dialog_feeding, this.feedingPet?.colorText, this.feedingPet?.animalText)
- this.titleView?.visibility = View.VISIBLE
- this.footerView?.text = getString(R.string.feeding_market_info)
- this.footerView?.visibility = View.VISIBLE
- this.openMarketButton?.visibility = View.VISIBLE
- } else {
- this.titleView?.visibility = View.GONE
- this.footerView?.visibility = View.GONE
- this.openMarketButton?.visibility = View.GONE
+ when {
+ this.isHatching -> {
+ dialog.requestWindowFeature(Window.FEATURE_NO_TITLE)
+ this.titleView?.text = getString(R.string.hatch_with, this.hatchingItem?.text)
+ this.titleView?.visibility = View.VISIBLE
+ this.footerView?.text = getString(R.string.hatching_market_info)
+ this.footerView?.visibility = View.VISIBLE
+ this.openMarketButton?.visibility = View.VISIBLE
+ }
+ this.isFeeding -> {
+ dialog.requestWindowFeature(Window.FEATURE_NO_TITLE)
+ this.titleView?.text = getString(R.string.dialog_feeding, this.feedingPet?.colorText, this.feedingPet?.animalText)
+ this.titleView?.visibility = View.VISIBLE
+ this.footerView?.text = getString(R.string.feeding_market_info)
+ this.footerView?.visibility = View.VISIBLE
+ this.openMarketButton?.visibility = View.VISIBLE
+ }
+ else -> {
+ this.titleView?.visibility = View.GONE
+ this.footerView?.visibility = View.GONE
+ this.openMarketButton?.visibility = View.GONE
+ }
}
openMarketButton?.setOnClickListener {
@@ -164,13 +168,13 @@ class ItemRecyclerFragment : BaseFragment() {
}
private fun loadItems() {
- var itemClass: Class? = null
- when (itemType) {
- "eggs" -> itemClass = Egg::class.java
- "hatchingPotions" -> itemClass = HatchingPotion::class.java
- "food" -> itemClass = Food::class.java
- "quests" -> itemClass = QuestContent::class.java
- "special" -> itemClass = SpecialItem::class.java
+ val itemClass: Class = when (itemType) {
+ "eggs" -> Egg::class.java
+ "hatchingPotions" -> HatchingPotion::class.java
+ "food" -> Food::class.java
+ "quests" -> QuestContent::class.java
+ "special" -> SpecialItem::class.java
+ else -> Egg::class.java
}
inventoryRepository.getOwnedItems(itemClass, user).firstElement().subscribe(Consumer { items ->
if (items.size > 0) {
@@ -178,7 +182,7 @@ class ItemRecyclerFragment : BaseFragment() {
}
}, RxErrorHandler.handleEmptyError())
- compositeSubscription.add(inventoryRepository?.ownedPets.subscribe(Consumer { adapter?.setOwnedPets(it) }, RxErrorHandler.handleEmptyError()))
+ compositeSubscription.add(inventoryRepository?.getOwnedPets().subscribe(Consumer { adapter?.setOwnedPets(it) }, RxErrorHandler.handleEmptyError()))
}
private fun openMarket() {
@@ -187,6 +191,6 @@ class ItemRecyclerFragment : BaseFragment() {
companion object {
- private val ITEM_TYPE_KEY = "CLASS_TYPE_KEY"
+ private const val ITEM_TYPE_KEY = "CLASS_TYPE_KEY"
}
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/ShopFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/ShopFragment.kt
index 2649032e94..666a126c7c 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/ShopFragment.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/ShopFragment.kt
@@ -153,14 +153,14 @@ class ShopFragment : BaseFragment() {
compositeSubscription.add(this.inventoryRepository.getOwnedItems(it)
.subscribe(Consumer { adapter?.setOwnedItems(it) }, RxErrorHandler.handleEmptyError()))
}
- compositeSubscription.add(this.inventoryRepository.inAppRewards
+ compositeSubscription.add(this.inventoryRepository.getInAppRewards()
.map
> { it.map { it.key } }
.subscribe(Consumer { adapter?.setPinnedItemKeys(it) }, RxErrorHandler.handleEmptyError()))
}
private fun loadMarketGear() {
inventoryRepository.retrieveMarketGear()
- .zipWith(inventoryRepository.ownedEquipment.map { it.map { it.key } }, BiFunction, Shop> { shop, equipment ->
+ .zipWith(inventoryRepository.getOwnedEquipment().map { it.map { it.key } }, BiFunction, Shop> { shop, equipment ->
for (category in shop.categories) {
val items = category.items.filter {
!equipment.contains(it.key)
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/StableRecyclerFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/StableRecyclerFragment.kt
index 6efbd6186a..e1fbdf92e9 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/StableRecyclerFragment.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/StableRecyclerFragment.kt
@@ -120,9 +120,9 @@ class StableRecyclerFragment : BaseFragment() {
private fun loadItems() {
val observable: Flowable = if ("pets" == itemType) {
- inventoryRepository.pets.firstElement().toFlowable().flatMap { Flowable.fromIterable(it) }
+ inventoryRepository.getPets().firstElement().toFlowable().flatMap { Flowable.fromIterable(it) }
} else {
- inventoryRepository.mounts.firstElement().toFlowable().flatMap { Flowable.fromIterable(it) }
+ inventoryRepository.getMounts().firstElement().toFlowable().flatMap { Flowable.fromIterable(it) }
}
observable.toList().flatMap { unsortedAnimals ->
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/AvatarSetupFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/AvatarSetupFragment.kt
index cf9241a8c2..697d4bebde 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/AvatarSetupFragment.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/AvatarSetupFragment.kt
@@ -126,9 +126,8 @@ class AvatarSetupFragment : BaseFragment() {
}
private fun loadCustomizations() {
- if (this.user == null || this.adapter == null || this.activeCategory == null) {
- return
- }
+ val user = this.user ?: return
+ val activeCategory = this.activeCategory ?: return
this.adapter?.setCustomizationList(customizationRepository.getCustomizations(activeCategory, activeSubCategory, user))
}
@@ -151,7 +150,7 @@ class AvatarSetupFragment : BaseFragment() {
}
- fun selectedBodyCategory() {
+ private fun selectedBodyCategory() {
activateButton(bodyButton)
this.activeCategory = "body"
this.subCategoryTabs?.removeAllTabs()
@@ -161,7 +160,7 @@ class AvatarSetupFragment : BaseFragment() {
loadCustomizations()
}
- fun selectedSkinCategory() {
+ private fun selectedSkinCategory() {
activateButton(skinButton)
this.activeCategory = "skin"
this.subCategoryTabs?.removeAllTabs()
@@ -170,7 +169,7 @@ class AvatarSetupFragment : BaseFragment() {
loadCustomizations()
}
- fun selectedHairCategory() {
+ private fun selectedHairCategory() {
activateButton(hairButton)
this.activeCategory = "hair"
this.subCategoryTabs?.removeAllTabs()
@@ -181,7 +180,7 @@ class AvatarSetupFragment : BaseFragment() {
loadCustomizations()
}
- fun selectedExtrasCategory() {
+ private fun selectedExtrasCategory() {
activateButton(extrasButton)
this.activeCategory = "extras"
this.subCategoryTabs?.removeAllTabs()
@@ -192,10 +191,8 @@ class AvatarSetupFragment : BaseFragment() {
loadCustomizations()
}
- fun randomizeCharacter() {
- if (user == null) {
- return
- }
+ private fun randomizeCharacter() {
+ val user = this.user ?: return
val command = UpdateUserCommand()
val updateData = HashMap()
updateData["preferences.size"] = chooseRandomKey(customizationRepository.getCustomizations("body", "size", user), false)
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/ChatListFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/ChatListFragment.kt
index 3a2096761f..d47f6cd5c6 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/ChatListFragment.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/ChatListFragment.kt
@@ -18,6 +18,7 @@ import com.habitrpg.android.habitica.components.AppComponent
import com.habitrpg.android.habitica.data.SocialRepository
import com.habitrpg.android.habitica.data.UserRepository
import com.habitrpg.android.habitica.extensions.notNull
+import com.habitrpg.android.habitica.helpers.RemoteConfigManager
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.social.ChatMessage
import com.habitrpg.android.habitica.models.user.User
@@ -43,6 +44,9 @@ class ChatListFragment : BaseFragment(), SwipeRefreshLayout.OnRefreshListener {
lateinit var socialRepository: SocialRepository
@Inject
lateinit var userRepository: UserRepository
+ @Inject
+ lateinit var configManager: RemoteConfigManager
+
private var isTavern: Boolean = false
internal var layoutManager: LinearLayoutManager? = null
private var groupId: String = ""
@@ -117,6 +121,7 @@ class ChatListFragment : BaseFragment(), SwipeRefreshLayout.OnRefreshListener {
}
chatBarView.sendAction = { sendChatMessage(it) }
+ chatBarView.maxChatLength = configManager.maxChatLength()
recyclerView.adapter = chatAdapter
recyclerView.itemAnimator = SafeDefaultItemAnimator()
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxFragment.kt
index 77630e6ffc..66a3eda31c 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxFragment.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxFragment.kt
@@ -19,7 +19,7 @@ import com.habitrpg.android.habitica.models.social.ChatMessage
import com.habitrpg.android.habitica.modules.AppModule
import com.habitrpg.android.habitica.prefs.scanner.IntentIntegrator
import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment
-import com.habitrpg.android.habitica.ui.helpers.UiUtils
+import com.habitrpg.android.habitica.ui.helpers.KeyboardUtil
import io.reactivex.functions.Consumer
import io.realm.RealmResults
import kotlinx.android.synthetic.main.fragment_inbox.*
@@ -94,7 +94,7 @@ class InboxFragment : BaseMainFragment(), SwipeRefreshLayout.OnRefreshListener,
openInboxMessages(uuidEditText.text.toString(), "")
}
.setNeutralButton(getString(R.string.action_cancel)) { dialog, _ ->
- UiUtils.dismissKeyboard(thisActivity)
+ KeyboardUtil.dismissKeyboard(thisActivity)
dialog.cancel()
}
.create()
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxMessageListFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxMessageListFragment.kt
index 3648162cfd..70bcf12c4e 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxMessageListFragment.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxMessageListFragment.kt
@@ -10,7 +10,6 @@ import android.support.v7.widget.LinearLayoutManager
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
-import android.widget.TextView
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.AppComponent
import com.habitrpg.android.habitica.data.SocialRepository
@@ -22,8 +21,8 @@ import com.habitrpg.android.habitica.ui.activities.FullProfileActivity
import com.habitrpg.android.habitica.ui.activities.MainActivity
import com.habitrpg.android.habitica.ui.adapter.social.ChatRecyclerViewAdapter
import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment
+import com.habitrpg.android.habitica.ui.helpers.KeyboardUtil
import com.habitrpg.android.habitica.ui.helpers.SafeDefaultItemAnimator
-import com.habitrpg.android.habitica.ui.helpers.UiUtils
import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar
import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar.Companion.showSnackbar
import io.reactivex.functions.Action
@@ -127,7 +126,7 @@ class InboxMessageListFragment : BaseMainFragment(), SwipeRefreshLayout.OnRefres
replyToUserUUID?.notNull {
socialRepository.postPrivateMessage(it, chatText)
.subscribe(Consumer { this.refreshUserInbox() }, RxErrorHandler.handleEmptyError())
- UiUtils.dismissKeyboard(getActivity())
+ KeyboardUtil.dismissKeyboard(getActivity())
}
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/PublicGuildsFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/PublicGuildsFragment.kt
index 2efa5e5468..bf7c248a93 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/PublicGuildsFragment.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/PublicGuildsFragment.kt
@@ -11,11 +11,12 @@ import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.AppComponent
import com.habitrpg.android.habitica.data.SocialRepository
import com.habitrpg.android.habitica.extensions.inflate
+import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.ui.adapter.social.PublicGuildsRecyclerViewAdapter
import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment
+import com.habitrpg.android.habitica.ui.helpers.KeyboardUtil
import com.habitrpg.android.habitica.ui.helpers.SafeDefaultItemAnimator
-import com.habitrpg.android.habitica.ui.helpers.UiUtils
import com.habitrpg.android.habitica.ui.helpers.bindView
import com.habitrpg.android.habitica.ui.helpers.resetViews
import io.reactivex.functions.Consumer
@@ -83,8 +84,8 @@ class PublicGuildsFragment : BaseMainFragment(), SearchView.OnQueryTextListener
override fun onQueryTextSubmit(s: String): Boolean {
viewAdapter.filter.filter(s)
- if (this.activity != null) {
- UiUtils.dismissKeyboard(this.activity!!)
+ activity.notNull {
+ KeyboardUtil.dismissKeyboard(it)
}
return true
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/QuestDetailFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/QuestDetailFragment.kt
index 7008d517c3..bf9de7788c 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/QuestDetailFragment.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/QuestDetailFragment.kt
@@ -87,7 +87,7 @@ class QuestDetailFragment : BaseMainFragment() {
super.onResume()
compositeSubscription.add(socialRepository.getGroup(partyId).subscribe(Consumer { this.updateParty(it) }, RxErrorHandler.handleEmptyError()))
if (questKey != null) {
- compositeSubscription.add(inventoryRepository.getQuestContent(questKey).subscribe(Consumer { this.updateQuestContent(it) }, RxErrorHandler.handleEmptyError()))
+ compositeSubscription.add(inventoryRepository.getQuestContent(questKey ?: "").subscribe(Consumer { this.updateQuestContent(it) }, RxErrorHandler.handleEmptyError()))
}
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/TavernDetailFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/TavernDetailFragment.kt
index ebb20e4614..dd3bd4f904 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/TavernDetailFragment.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/TavernDetailFragment.kt
@@ -85,7 +85,7 @@ class TavernDetailFragment : BaseFragment() {
.doOnNext { if (!it.hasActiveQuest) worldBossSection.visibility = View.GONE }
.filter { it.hasActiveQuest }
.doOnNext { questProgressView.progress = it.quest}
- .flatMapMaybe { inventoryRepository.getQuestContent(it.quest?.key).firstElement() }
+ .flatMapMaybe { inventoryRepository.getQuestContent(it.quest?.key ?: "").firstElement() }
.subscribe(Consumer {
questProgressView.quest = it
worldBossSection.visibility = View.VISIBLE
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyDetailFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyDetailFragment.kt
index 4dcc9b4b1c..fb53d8b7bf 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyDetailFragment.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyDetailFragment.kt
@@ -130,7 +130,7 @@ class PartyDetailFragment : BaseFragment() {
questImageWrapper?.visibility = View.VISIBLE
val mainHandler = Handler(context?.mainLooper)
mainHandler.postDelayed({
- inventoryRepository.getQuestContent(quest?.key)
+ inventoryRepository.getQuestContent(quest?.key ?: "")
.firstElement()
.subscribe(Consumer { this@PartyDetailFragment.updateQuestContent(it) }, RxErrorHandler.handleEmptyError())
}, 500)
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/RewardsRecyclerviewFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/RewardsRecyclerviewFragment.kt
index e68887cbd0..91ae7feffd 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/RewardsRecyclerviewFragment.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/RewardsRecyclerviewFragment.kt
@@ -45,7 +45,7 @@ class RewardsRecyclerviewFragment : TaskRecyclerViewFragment() {
}
recyclerView.itemAnimator = SafeDefaultItemAnimator()
- inventoryRepository.inAppRewards.subscribe(Consumer {
+ inventoryRepository.getInAppRewards().subscribe(Consumer {
(recyclerAdapter as RewardsRecyclerViewAdapter?)?.updateItemRewards(it)
}, RxErrorHandler.handleEmptyError())
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/KeyboardUtil.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/KeyboardUtil.kt
index 0741521798..3c6619ec96 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/KeyboardUtil.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/KeyboardUtil.kt
@@ -77,17 +77,12 @@ class KeyboardUtil(activity: Activity, private val contentView: View) {
}
}
-
-
- /**
- * Helper to hide the keyboard
- *
- * @param act
- */
- fun hideKeyboard(act: Activity?) {
- if (act != null && act.currentFocus != null) {
- val inputMethodManager = act.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
- inputMethodManager.hideSoftInputFromWindow(act.currentFocus?.windowToken, 0)
+ companion object {
+ fun dismissKeyboard(act: Activity?) {
+ if (act != null && act.currentFocus != null) {
+ val inputMethodManager = act.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
+ inputMethodManager.hideSoftInputFromWindow(act.currentFocus?.windowToken, 0)
+ }
}
}
}
\ No newline at end of file
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/UiUtils.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/UiUtils.java
deleted file mode 100644
index 6c2ffc5cc4..0000000000
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/UiUtils.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package com.habitrpg.android.habitica.ui.helpers;
-
-import android.app.Activity;
-import android.content.Context;
-import android.support.annotation.Nullable;
-import android.view.View;
-import android.view.inputmethod.InputMethodManager;
-
-/**
- * Simple utilities class for UI related stuff.
- */
-public class UiUtils {
-
- /**
- * Hides soft keyboard if it's opened.
- *
- * @param activity Currently visible activity.
- */
- public static void dismissKeyboard(Activity activity) {
- InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
- View currentFocus = activity.getCurrentFocus();
- if (currentFocus != null) {
- imm.hideSoftInputFromWindow(currentFocus.getWindowToken(), 0);
- }
- }
-
- /**
- * 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, @Nullable View view) {
- InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
- if (view != null) {
- imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
- }
- }
-}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/RewardViewHolder.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/RewardViewHolder.kt
index 3c4f7381f2..c0125f26f8 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/RewardViewHolder.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/RewardViewHolder.kt
@@ -1,5 +1,6 @@
package com.habitrpg.android.habitica.ui.viewHolders.tasks
+import android.content.DialogInterface
import android.support.v4.content.ContextCompat
import android.view.View
import android.widget.ImageView
@@ -49,11 +50,11 @@ class RewardViewHolder(itemView: View) : BaseTaskViewHolder(itemView) {
if (isItem) {
val dialog = ItemDetailDialog(context)
dialog.setTitle(task?.text)
- dialog.setDescription(task?.notes)
+ dialog.setDescription(task?.notes ?: "")
dialog.setImage("shop_" + this.task?.id)
dialog.setCurrency("gold")
dialog.setValue(task!!.value)
- dialog.setBuyListener { _, _ -> this.buyReward() }
+ dialog.setBuyListener( DialogInterface.OnClickListener { _, _ -> this.buyReward() })
dialog.show()
} else {
val event = TaskTappedEvent()
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/FadingViewPager.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/FadingViewPager.java
deleted file mode 100644
index 95eccc016d..0000000000
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/FadingViewPager.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package com.habitrpg.android.habitica.ui.views;
-
-import android.content.Context;
-import android.support.v4.view.ViewPager;
-import android.util.AttributeSet;
-import android.view.MotionEvent;
-import android.view.View;
-
-
-public class FadingViewPager extends ViewPager {
- public boolean disableFading;
-
- public FadingViewPager(Context context) {
- super(context);
-
- setTransformer();
- }
-
- public FadingViewPager(Context context, AttributeSet attrs) {
- super(context, attrs);
- setTransformer();
- }
-
- private void setTransformer() {
- this.setPageTransformer(true, (page, position) -> {
- page.setTranslationX(page.getWidth() * -position);
-
- if(position <= -1.0F || position >= 1.0F) {
- page.setAlpha(0.0F);
- page.setVisibility(View.INVISIBLE);
- } else if( position == 0.0F ) {
- page.setVisibility(View.VISIBLE);
- page.setAlpha(1.0F);
- } else {
- if (disableFading) {
- return;
- }
- page.setVisibility(View.VISIBLE);
- // position is between -1.0F & 0.0F OR 0.0F & 1.0F
- page.setAlpha(1.0F - Math.abs(position));
- }
- });
- }
-
- @Override
- public boolean onTouchEvent(MotionEvent ev) {
- return false;
- }
-
- @Override
- public boolean onInterceptHoverEvent(MotionEvent event) {
- return false;
- }
-}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/FadingViewPager.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/FadingViewPager.kt
new file mode 100644
index 0000000000..c5f062b08a
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/FadingViewPager.kt
@@ -0,0 +1,49 @@
+package com.habitrpg.android.habitica.ui.views
+
+import android.content.Context
+import android.support.v4.view.ViewPager
+import android.util.AttributeSet
+import android.view.MotionEvent
+import android.view.View
+
+
+class FadingViewPager : ViewPager {
+ var disableFading: Boolean = false
+
+ constructor(context: Context) : super(context) {
+ setTransformer()
+ }
+
+ constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
+ setTransformer()
+ }
+
+ private fun setTransformer() {
+ this.setPageTransformer(true) { page, position ->
+ page.translationX = page.width * -position
+
+ if (position <= -1.0f || position >= 1.0f) {
+ page.alpha = 0.0f
+ page.visibility = View.INVISIBLE
+ } else if (position == 0.0f) {
+ page.visibility = View.VISIBLE
+ page.alpha = 1.0f
+ } else {
+ if (disableFading) {
+ return@setPageTransformer
+ }
+ page.visibility = View.VISIBLE
+ // position is between -1.0F & 0.0F OR 0.0F & 1.0F
+ page.alpha = 1.0f - Math.abs(position)
+ }
+ }
+ }
+
+ override fun onTouchEvent(ev: MotionEvent): Boolean {
+ return false
+ }
+
+ override fun onInterceptHoverEvent(event: MotionEvent): Boolean {
+ return false
+ }
+}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/Typewriter.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/Typewriter.java
deleted file mode 100644
index 97ac12100b..0000000000
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/Typewriter.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package com.habitrpg.android.habitica.ui.views;
-
-
-import android.content.Context;
-import android.os.Handler;
-import android.support.v4.content.ContextCompat;
-import android.text.Spannable;
-import android.text.SpannableStringBuilder;
-import android.text.style.ForegroundColorSpan;
-import android.util.AttributeSet;
-
-import com.habitrpg.android.habitica.R;
-
-// http://stackoverflow.com/a/6700718/1315039
-public class Typewriter extends android.support.v7.widget.AppCompatTextView {
-
- private SpannableStringBuilder stringBuilder;
- private Object visibleSpan;
- private Object hiddenSpan;
- private int index;
- private long delay = 30;
-
-
- public Typewriter(Context context) {
- super(context);
- setupTextColors(context);
- }
-
- public Typewriter(Context context, AttributeSet attrs) {
- super(context, attrs);
- setupTextColors(context);
- }
-
- private void setupTextColors(Context context) {
- visibleSpan = new ForegroundColorSpan(ContextCompat.getColor(context, R.color.textColorLight));
- hiddenSpan = new ForegroundColorSpan(ContextCompat.getColor(context, R.color.transparent));
- }
-
- private Handler handler = new Handler();
- private Runnable characterAdder = new Runnable() {
- @Override
- public void run() {
- stringBuilder.setSpan(visibleSpan, 0, index++, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
- setText(stringBuilder);
- if(index <= stringBuilder.length()) {
- handler.postDelayed(characterAdder, delay);
- }
- }
- };
-
- public void animateText(CharSequence text) {
- stringBuilder = new SpannableStringBuilder(text);
- stringBuilder.setSpan(hiddenSpan, 0, stringBuilder.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
- index = 0;
-
- setText(stringBuilder);
- handler.removeCallbacks(characterAdder);
- handler.postDelayed(characterAdder, delay);
- }
-
- public void setCharacterDelay(long millis) {
- delay = millis;
- }
-
- public boolean isAnimating() {
- return index < stringBuilder.length();
- }
-
- public void stopTextAnimation() {
- index = stringBuilder.length();
- }
-}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/Typewriter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/Typewriter.kt
new file mode 100644
index 0000000000..ac3bae997a
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/Typewriter.kt
@@ -0,0 +1,68 @@
+package com.habitrpg.android.habitica.ui.views
+
+
+import android.content.Context
+import android.os.Handler
+import android.support.v4.content.ContextCompat
+import android.text.Spannable
+import android.text.SpannableStringBuilder
+import android.text.style.ForegroundColorSpan
+import android.util.AttributeSet
+
+import com.habitrpg.android.habitica.R
+
+// http://stackoverflow.com/a/6700718/1315039
+class Typewriter : android.support.v7.widget.AppCompatTextView {
+
+ private var stringBuilder: SpannableStringBuilder? = null
+ private var visibleSpan: Any? = null
+ private var hiddenSpan: Any? = null
+ private var index: Int = 0
+ private var delay: Long = 30
+
+ private val textHandler = Handler()
+ private val characterAdder = object : Runnable {
+ override fun run() {
+ stringBuilder?.setSpan(visibleSpan, 0, index++, Spannable.SPAN_INCLUSIVE_INCLUSIVE)
+ text = stringBuilder
+ if (index <= stringBuilder?.length ?: 0) {
+ textHandler.postDelayed(this, delay)
+ }
+ }
+ }
+
+ val isAnimating: Boolean
+ get() = index < stringBuilder?.length ?: 0
+
+
+ constructor(context: Context) : super(context) {
+ setupTextColors(context)
+ }
+
+ constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
+ setupTextColors(context)
+ }
+
+ private fun setupTextColors(context: Context) {
+ visibleSpan = ForegroundColorSpan(ContextCompat.getColor(context, R.color.textColorLight))
+ hiddenSpan = ForegroundColorSpan(ContextCompat.getColor(context, R.color.transparent))
+ }
+
+ fun animateText(text: CharSequence) {
+ stringBuilder = SpannableStringBuilder(text)
+ stringBuilder?.setSpan(hiddenSpan, 0, stringBuilder?.length ?: 0, Spannable.SPAN_INCLUSIVE_EXCLUSIVE)
+ index = 0
+
+ setText(stringBuilder)
+ textHandler.removeCallbacks(characterAdder)
+ textHandler.postDelayed(characterAdder, delay)
+ }
+
+ fun setCharacterDelay(millis: Long) {
+ delay = millis
+ }
+
+ fun stopTextAnimation() {
+ index = stringBuilder?.length ?: 0
+ }
+}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/WrapContentDraweeView.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/WrapContentDraweeView.java
deleted file mode 100644
index 1aed32d640..0000000000
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/WrapContentDraweeView.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package com.habitrpg.android.habitica.ui.views;
-
-import android.content.Context;
-import android.graphics.drawable.Animatable;
-import android.net.Uri;
-import android.support.annotation.Nullable;
-import android.util.AttributeSet;
-
-import com.facebook.drawee.backends.pipeline.PipelineDraweeControllerBuilder;
-import com.facebook.drawee.controller.BaseControllerListener;
-import com.facebook.drawee.controller.ControllerListener;
-import com.facebook.drawee.generic.GenericDraweeHierarchy;
-import com.facebook.drawee.interfaces.DraweeController;
-import com.facebook.drawee.view.SimpleDraweeView;
-import com.facebook.imagepipeline.image.ImageInfo;
-
-//https://stackoverflow.com/questions/33955510/facebook-fresco-using-wrap-content
-public class WrapContentDraweeView extends SimpleDraweeView {
-
- // we set a listener and update the view's aspect ratio depending on the loaded image
- private final ControllerListener listener = new BaseControllerListener() {
- @Override
- public void onIntermediateImageSet(String id, @Nullable ImageInfo imageInfo) {
- updateViewSize(imageInfo);
- }
-
- @Override
- public void onFinalImageSet(String id, @Nullable ImageInfo imageInfo, @Nullable Animatable animatable) {
- updateViewSize(imageInfo);
- }
- };
-
- public WrapContentDraweeView(Context context, GenericDraweeHierarchy hierarchy) {
- super(context, hierarchy);
- }
-
- public WrapContentDraweeView(Context context) {
- super(context);
- }
-
- public WrapContentDraweeView(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- public WrapContentDraweeView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- }
-
- public WrapContentDraweeView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
- super(context, attrs, defStyleAttr, defStyleRes);
- }
-
- @Override
- public void setImageURI(Uri uri, Object callerContext) {
- DraweeController controller = ((PipelineDraweeControllerBuilder)getControllerBuilder())
- .setControllerListener(listener)
- .setCallerContext(callerContext)
- .setUri(uri)
- .setAutoPlayAnimations(true)
- .setOldController(getController())
- .build();
- setController(controller);
- }
-
- void updateViewSize(@Nullable ImageInfo imageInfo) {
- if (imageInfo != null) {
- setAspectRatio((float) imageInfo.getWidth() / imageInfo.getHeight());
- }
- }
-}
\ No newline at end of file
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/WrapContentDraweeView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/WrapContentDraweeView.kt
new file mode 100644
index 0000000000..bb3643c32e
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/WrapContentDraweeView.kt
@@ -0,0 +1,49 @@
+package com.habitrpg.android.habitica.ui.views
+
+import android.content.Context
+import android.graphics.drawable.Animatable
+import android.net.Uri
+import android.util.AttributeSet
+import com.facebook.drawee.backends.pipeline.PipelineDraweeControllerBuilder
+import com.facebook.drawee.controller.BaseControllerListener
+import com.facebook.drawee.view.SimpleDraweeView
+import com.facebook.imagepipeline.image.ImageInfo
+
+//https://stackoverflow.com/questions/33955510/facebook-fresco-using-wrap-content
+class WrapContentDraweeView : SimpleDraweeView {
+
+ // we set a listener and update the view's aspect ratio depending on the loaded image
+ private val listener = object : BaseControllerListener() {
+ override fun onIntermediateImageSet(id: String?, imageInfo: ImageInfo?) {
+ updateViewSize(imageInfo)
+ }
+
+ override fun onFinalImageSet(id: String?, imageInfo: ImageInfo?, animatable: Animatable?) {
+ updateViewSize(imageInfo)
+ }
+ }
+
+ constructor(context: Context) : super(context)
+
+ constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
+
+ constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle)
+
+
+ override fun setImageURI(uri: Uri, callerContext: Any?) {
+ val controller = (controllerBuilder as PipelineDraweeControllerBuilder)
+ .setControllerListener(listener)
+ .setCallerContext(callerContext)
+ .setUri(uri)
+ .setAutoPlayAnimations(true)
+ .setOldController(controller)
+ .build()
+ setController(controller)
+ }
+
+ internal fun updateViewSize(imageInfo: ImageInfo?) {
+ if (imageInfo != null) {
+ aspectRatio = imageInfo.width.toFloat() / imageInfo.height
+ }
+ }
+}
\ No newline at end of file
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/login/LockableScrollView.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/login/LockableScrollView.java
deleted file mode 100644
index 39fe2fd2e3..0000000000
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/login/LockableScrollView.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package com.habitrpg.android.habitica.ui.views.login;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.view.MotionEvent;
-import android.widget.ScrollView;
-
-public class LockableScrollView extends ScrollView {
-
- private boolean scrollable = true;
-
- public LockableScrollView(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- public void setScrollingEnabled(boolean enabled) {
- scrollable = enabled;
- }
-
- public boolean isScrollable() {
- return scrollable;
- }
-
- @Override
- public boolean onTouchEvent(MotionEvent ev) {
- switch (ev.getAction()) {
- case MotionEvent.ACTION_DOWN:
- if (scrollable) return super.onTouchEvent(ev);
- return scrollable; // mScrollable is always false at this point
- default:
- return super.onTouchEvent(ev);
- }
- }
-
- @Override
- public boolean onInterceptTouchEvent(MotionEvent ev) {
- if (!scrollable) return false;
- else return super.onInterceptTouchEvent(ev);
- }
-
-}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/login/LockableScrollView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/login/LockableScrollView.kt
new file mode 100644
index 0000000000..099fd01e71
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/login/LockableScrollView.kt
@@ -0,0 +1,33 @@
+package com.habitrpg.android.habitica.ui.views.login
+
+import android.content.Context
+import android.util.AttributeSet
+import android.view.MotionEvent
+import android.widget.ScrollView
+
+class LockableScrollView(context: Context, attrs: AttributeSet) : ScrollView(context, attrs) {
+
+ private var isScrollable = true
+
+ fun setScrollingEnabled(enabled: Boolean) {
+ isScrollable = enabled
+ }
+
+ override fun onTouchEvent(ev: MotionEvent): Boolean {
+ return when (ev.action) {
+ MotionEvent.ACTION_DOWN -> {
+ if (isScrollable) super.onTouchEvent(ev) else isScrollable
+// mScrollable is always false at this point
+ }
+ else -> super.onTouchEvent(ev)
+ }
+ }
+
+ override fun onInterceptTouchEvent(ev: MotionEvent): Boolean {
+ return if (!isScrollable)
+ false
+ else
+ super.onInterceptTouchEvent(ev)
+ }
+
+}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/login/StarView.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/login/StarView.java
deleted file mode 100644
index b830c28ee7..0000000000
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/login/StarView.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package com.habitrpg.android.habitica.ui.views.login;
-
-
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.ObjectAnimator;
-import android.animation.ValueAnimator;
-import android.content.Context;
-import android.support.annotation.Nullable;
-import android.support.v7.widget.AppCompatImageView;
-import android.util.AttributeSet;
-import android.view.View;
-
-import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper;
-
-import java.util.List;
-
-public class StarView extends AppCompatImageView {
-
-
- private List blinkDurations;
- private int blinkIndex = 0;
-
- public StarView(Context context, @Nullable AttributeSet attrs) {
- super(context, attrs);
- }
-
- public StarView(Context context) {
- super(context);
- this.setScaleType(ScaleType.CENTER);
- }
-
- public void setStarSize(int size) {
- switch (size) {
- case 0: {
- this.setImageBitmap(HabiticaIconsHelper.imageOfStarSmall());
- break;
- }
- case 1: {
- this.setImageBitmap(HabiticaIconsHelper.imageOfStarMedium());
- break;
- }
- case 2: {
- this.setImageBitmap(HabiticaIconsHelper.imageOfStarLarge());
- break;
- }
- }
- }
-
- public void setBlinkDurations(List blinkDurations) {
- this.blinkDurations = blinkDurations;
- runBlink();
- }
-
- private void runBlink() {
- if (blinkIndex >= blinkDurations.size()) {
- blinkIndex = 0;
- }
- ValueAnimator animator = ObjectAnimator.ofFloat(this, View.ALPHA, 0);
- animator.setDuration(1000);
- animator.setStartDelay(blinkDurations.get(blinkIndex));
- animator.setRepeatCount(1);
- animator.setRepeatMode(ValueAnimator.REVERSE);
- animator.addListener(new AnimatorListenerAdapter() {
- public void onAnimationEnd(Animator animation) {
- blinkIndex++;
- runBlink();
- }
- });
- try {
- animator.start();
- } catch (NullPointerException ignored) {
- }
- }
-}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/login/StarView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/login/StarView.kt
new file mode 100644
index 0000000000..e028f5b165
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/login/StarView.kt
@@ -0,0 +1,68 @@
+package com.habitrpg.android.habitica.ui.views.login
+
+
+import android.animation.Animator
+import android.animation.AnimatorListenerAdapter
+import android.animation.ObjectAnimator
+import android.animation.ValueAnimator
+import android.content.Context
+import android.support.v7.widget.AppCompatImageView
+import android.util.AttributeSet
+import android.view.View
+import android.widget.ImageView
+
+import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper
+
+class StarView : AppCompatImageView {
+
+
+ private var blinkDurations: List? = null
+ private var blinkIndex = 0
+
+ constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
+
+ constructor(context: Context) : super(context) {
+ this.scaleType = ImageView.ScaleType.CENTER
+ }
+
+ fun setStarSize(size: Int) {
+ when (size) {
+ 0 -> {
+ this.setImageBitmap(HabiticaIconsHelper.imageOfStarSmall())
+ }
+ 1 -> {
+ this.setImageBitmap(HabiticaIconsHelper.imageOfStarMedium())
+ }
+ 2 -> {
+ this.setImageBitmap(HabiticaIconsHelper.imageOfStarLarge())
+ }
+ }
+ }
+
+ fun setBlinkDurations(blinkDurations: List) {
+ this.blinkDurations = blinkDurations
+ runBlink()
+ }
+
+ private fun runBlink() {
+ if (blinkIndex >= blinkDurations!!.size) {
+ blinkIndex = 0
+ }
+ val animator = ObjectAnimator.ofFloat(this, View.ALPHA, 0f)
+ animator.duration = 1000
+ animator.startDelay = blinkDurations?.get(blinkIndex)?.toLong() ?: 0
+ animator.repeatCount = 1
+ animator.repeatMode = ValueAnimator.REVERSE
+ animator.addListener(object : AnimatorListenerAdapter() {
+ override fun onAnimationEnd(animation: Animator) {
+ blinkIndex++
+ runBlink()
+ }
+ })
+ try {
+ animator.start()
+ } catch (ignored: NullPointerException) {
+ }
+
+ }
+}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/setup/AvatarCustomizationDrawer.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/setup/AvatarCustomizationDrawer.java
deleted file mode 100644
index 3f67efcf49..0000000000
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/setup/AvatarCustomizationDrawer.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.habitrpg.android.habitica.ui.views.setup;
-
-
-import android.content.Context;
-import android.support.annotation.Nullable;
-import android.util.AttributeSet;
-import android.widget.LinearLayout;
-
-import com.habitrpg.android.habitica.R;
-
-public class AvatarCustomizationDrawer extends LinearLayout {
- public AvatarCustomizationDrawer(Context context, @Nullable AttributeSet attrs) {
- super(context, attrs);
-
- inflate(context, R.layout.avatar_setup_drawer, this);
- }
-
-
-}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/setup/AvatarCustomizationDrawer.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/setup/AvatarCustomizationDrawer.kt
new file mode 100644
index 0000000000..5ee17545ef
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/setup/AvatarCustomizationDrawer.kt
@@ -0,0 +1,14 @@
+package com.habitrpg.android.habitica.ui.views.setup
+
+
+import android.content.Context
+import android.util.AttributeSet
+import android.widget.LinearLayout
+import com.habitrpg.android.habitica.R
+import com.habitrpg.android.habitica.extensions.inflate
+
+class AvatarCustomizationDrawer(context: Context, attrs: AttributeSet?) : LinearLayout(context, attrs) {
+ init {
+ inflate(R.layout.avatar_setup_drawer, true)
+ }
+}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/social/ChatBarView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/social/ChatBarView.kt
index 73ec5cf636..09a8fc5f9a 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/social/ChatBarView.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/social/ChatBarView.kt
@@ -27,7 +27,7 @@ class ChatBarView : FrameLayout {
private var navBarAccountedHeightCalculated = false
- private var maxChatLength = 200
+ internal var maxChatLength = 200
var sendAction: ((String) -> Unit)? = null
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/utils/Action.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/utils/Action1.kt
similarity index 100%
rename from Habitica/src/main/java/com/habitrpg/android/habitica/utils/Action.kt
rename to Habitica/src/main/java/com/habitrpg/android/habitica/utils/Action1.kt
diff --git a/habitica.resources.example b/habitica.resources.example
index 98f80f4584..4e56df8fe8 100644
--- a/habitica.resources.example
+++ b/habitica.resources.example
@@ -4,3 +4,4 @@ amplitude_app_id=CHANGE_ME
seeds_app_key=CHANGE_ME
seeds_interstitial_gems=CHANGE_ME
seeds_interstitial_sharing=CHANGE_ME
+instabug_key=CHANGE_ME