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> getOwnedItems(Class itemClass, User user); - Flowable> 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