From a381458a28ae2f7b95e427bc7699f4659f8a6536 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Mon, 7 Jun 2021 16:09:57 +0200 Subject: [PATCH] replace fresco with coil --- Habitica/build.gradle | 18 +- Habitica/res/layout/achievement_grid_item.xml | 4 +- Habitica/res/layout/achievement_list_item.xml | 3 +- Habitica/res/layout/activity_full_profile.xml | 14 +- Habitica/res/layout/activity_maintenance.xml | 2 +- Habitica/res/layout/adventure_guide_item.xml | 3 +- .../customization_grid_background_item.xml | 4 +- .../res/layout/customization_grid_item.xml | 3 +- .../res/layout/dialog_achievement_detail.xml | 3 +- .../layout/dialog_completed_quest_content.xml | 2 +- Habitica/res/layout/dialog_first_drop.xml | 4 +- .../res/layout/dialog_login_incentive.xml | 2 +- .../res/layout/dialog_open_mysteryitem.xml | 5 +- .../res/layout/dialog_pet_suggest_hatch.xml | 6 +- .../layout/dialog_purchase_content_gear.xml | 2 +- .../layout/dialog_purchase_content_item.xml | 2 +- .../layout/dialog_purchase_content_quest.xml | 2 +- .../layout/dialog_purchase_customization.xml | 2 +- Habitica/res/layout/dialog_purchase_gems.xml | 2 +- Habitica/res/layout/dialog_won_challenge.xml | 2 +- .../res/layout/equipment_overview_item.xml | 2 +- Habitica/res/layout/fragment_party_detail.xml | 4 +- Habitica/res/layout/fragment_quest_detail.xml | 2 +- Habitica/res/layout/fragment_subscription.xml | 2 +- Habitica/res/layout/gear_list_item.xml | 5 +- Habitica/res/layout/item_image_row.xml | 3 +- Habitica/res/layout/item_item.xml | 3 +- Habitica/res/layout/mount_overview_item.xml | 3 +- Habitica/res/layout/npc_banner.xml | 2 +- Habitica/res/layout/pet_detail_item.xml | 9 +- Habitica/res/layout/pet_imageview.xml | 2 +- Habitica/res/layout/pet_overview_item.xml | 3 +- .../res/layout/profile_achievement_item.xml | 3 +- Habitica/res/layout/profile_gear_tablerow.xml | 6 +- Habitica/res/layout/quest_collect.xml | 2 +- Habitica/res/layout/quest_menu_view.xml | 2 +- Habitica/res/layout/quest_progress.xml | 4 +- Habitica/res/layout/row_quest_reward.xml | 6 +- Habitica/res/layout/row_shopitem.xml | 2 +- Habitica/res/layout/skill_list_item.xml | 2 +- .../habitica/HabiticaBaseApplication.kt | 28 ++- .../data/implementation/TaskRepositoryImpl.kt | 1 - .../habitica/helpers/AprilFoolsHandler.kt | 7 +- .../postProcessors/InvertPostProcessor.kt | 35 ---- .../android/habitica/models/user/OwnedItem.kt | 13 -- .../habitica/models/user/OwnedMount.kt | 13 -- .../android/habitica/models/user/OwnedPet.kt | 12 -- .../android/habitica/ui/AvatarView.kt | 163 ++++++------------ .../habitica/ui/AvatarWithBarsViewModel.kt | 4 +- .../android/habitica/ui/ItemDetailDialog.kt | 5 +- .../ui/activities/FullProfileActivity.kt | 45 ++--- .../habitica/ui/activities/MainActivity.kt | 8 +- .../ui/adapter/AchievementsAdapter.kt | 4 +- ...stomizationEquipmentRecyclerViewAdapter.kt | 3 +- .../CustomizationRecyclerViewAdapter.kt | 6 +- .../inventory/StableRecyclerAdapter.kt | 4 +- .../social/AchievementProfileAdapter.kt | 20 +-- .../habitica/ui/fragments/AboutFragment.kt | 9 +- .../social/party/NoPartyFragmentFragment.kt | 18 +- .../habitica/ui/helpers/DataBindingUtils.kt | 74 +++----- .../ui/viewHolders/MountViewHolder.kt | 11 +- .../habitica/ui/viewHolders/PetViewHolder.kt | 11 +- .../habitica/ui/views/NPCBannerView.kt | 7 +- .../ui/views/WrapContentDraweeView.kt | 41 ----- .../views/dialogs/AchievementDetailDialog.kt | 4 +- .../ui/views/dialogs/FirstDropDialog.kt | 6 +- .../ui/views/dialogs/PetSuggestHatchDialog.kt | 5 +- .../dialogs/QuestCompletedDialogContent.kt | 3 +- .../ui/views/dialogs/WonChallengeDialog.kt | 3 +- .../views/shops/PurchaseDialogBaseContent.kt | 4 +- .../ui/views/shops/PurchaseDialogContent.kt | 17 +- .../views/shops/PurchaseDialogGearContent.kt | 4 +- .../views/shops/PurchaseDialogGemsContent.kt | 4 +- .../views/shops/PurchaseDialogItemContent.kt | 4 +- .../views/shops/PurchaseDialogQuestContent.kt | 5 +- .../ui/views/social/OldQuestProgressView.kt | 4 +- .../ui/views/social/QuestProgressView.kt | 9 +- Habitica/staff/release/output.json | 20 --- 78 files changed, 249 insertions(+), 537 deletions(-) delete mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/WrapContentDraweeView.kt delete mode 100644 Habitica/staff/release/output.json diff --git a/Habitica/build.gradle b/Habitica/build.gradle index dabdf2e1e..3c6e929de 100644 --- a/Habitica/build.gradle +++ b/Habitica/build.gradle @@ -61,13 +61,11 @@ dependencies { implementation 'androidx.appcompat:appcompat:1.3.0' implementation 'com.google.android.material:material:1.3.0' implementation 'androidx.recyclerview:recyclerview:1.2.0' - implementation 'androidx.legacy:legacy-preference-v14:1.0.0' // Markdown implementation "io.noties.markwon:core:4.6.2" implementation "io.noties.markwon:ext-strikethrough:4.6.2" implementation "io.noties.markwon:image:4.6.2" implementation "io.noties.markwon:recycler:4.6.2" - implementation "io.noties.markwon:html:4.6.2" //Eventbus implementation 'org.greenrobot:eventbus:3.2.0' // IAP Handling / Verification @@ -86,13 +84,9 @@ dependencies { //Analytics implementation 'com.amplitude:android-sdk:2.30.0' - // Fresco Image Management Library - implementation('com.facebook.fresco:fresco:2.4.0') { - exclude module: 'bolts-android' - } - implementation('com.facebook.fresco:animated-gif:2.4.0') { - exclude module: 'bolts-android' - } + // Image Management Library + implementation("io.coil-kt:coil:1.2.2") + implementation("io.coil-kt:coil-gif:1.2.2") //Tests testImplementation 'junit:junit:4.12' testImplementation 'androidx.test:core:1.3.0' @@ -124,8 +118,8 @@ dependencies { implementation 'androidx.navigation:navigation-ui-ktx:2.3.5' implementation "androidx.paging:paging-runtime-ktx:3.0.0" implementation 'com.plattysoft.leonids:LeonidsLib:1.3.2' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.3' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.3' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0' implementation 'com.willowtreeapps:signinwithapplebutton:0.3' @@ -149,7 +143,7 @@ android { buildConfigField "String", "TESTING_LEVEL", "\"production\"" resConfigs "en", "bg", "de", "en-rGB", "es", "fr", "hr-rHR", "in", "it", "iw", "ja", "ko", "lt", "nl", "pl", "pt-rBR", "pt-rPT", "ru", "tr", "zh", "zh-rTW" - versionCode 2960 + versionCode 2962 versionName "3.3" } diff --git a/Habitica/res/layout/achievement_grid_item.xml b/Habitica/res/layout/achievement_grid_item.xml index cb586e0f6..fa0bd3687 100644 --- a/Habitica/res/layout/achievement_grid_item.xml +++ b/Habitica/res/layout/achievement_grid_item.xml @@ -1,7 +1,6 @@ - - - - + android:layout_height="40dp"/> - + android:layout_height="40dp"/> diff --git a/Habitica/res/layout/activity_maintenance.xml b/Habitica/res/layout/activity_maintenance.xml index e986615a3..75faeed7e 100644 --- a/Habitica/res/layout/activity_maintenance.xml +++ b/Habitica/res/layout/activity_maintenance.xml @@ -14,7 +14,7 @@ android:gravity="center" android:layout_marginTop="8dp" style="@style/CardTitle"/> - - diff --git a/Habitica/res/layout/customization_grid_background_item.xml b/Habitica/res/layout/customization_grid_background_item.xml index 058ae23f6..1e4c6878b 100644 --- a/Habitica/res/layout/customization_grid_background_item.xml +++ b/Habitica/res/layout/customization_grid_background_item.xml @@ -8,13 +8,11 @@ android:background="@drawable/layout_rounded_bg_window" android:orientation="vertical" android:layout_gravity="center"> - - - - - - - - + android:layout_width="@dimen/shopitem_image_size" /> - - - - diff --git a/Habitica/res/layout/dialog_purchase_content_item.xml b/Habitica/res/layout/dialog_purchase_content_item.xml index a4437c820..b5a974e7e 100644 --- a/Habitica/res/layout/dialog_purchase_content_item.xml +++ b/Habitica/res/layout/dialog_purchase_content_item.xml @@ -11,7 +11,7 @@ tools:parentTag="LinearLayout" tools:orientation="vertical"> - diff --git a/Habitica/res/layout/dialog_purchase_content_quest.xml b/Habitica/res/layout/dialog_purchase_content_quest.xml index f55c00636..e160016a4 100644 --- a/Habitica/res/layout/dialog_purchase_content_quest.xml +++ b/Habitica/res/layout/dialog_purchase_content_quest.xml @@ -10,7 +10,7 @@ tools:parentTag="LinearLayout" tools:orientation="vertical"> - diff --git a/Habitica/res/layout/dialog_purchase_customization.xml b/Habitica/res/layout/dialog_purchase_customization.xml index 945089e95..26adb2384 100644 --- a/Habitica/res/layout/dialog_purchase_customization.xml +++ b/Habitica/res/layout/dialog_purchase_customization.xml @@ -3,7 +3,7 @@ android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content"> - - diff --git a/Habitica/res/layout/dialog_won_challenge.xml b/Habitica/res/layout/dialog_won_challenge.xml index 382743b05..2b754f810 100644 --- a/Habitica/res/layout/dialog_won_challenge.xml +++ b/Habitica/res/layout/dialog_won_challenge.xml @@ -25,7 +25,7 @@ android:layout_height="wrap_content" android:layout_gravity="center" android:src="@drawable/sparkles_left" /> - - - @@ -101,7 +101,7 @@ android:background="@drawable/layout_rounded_bg_window" android:padding="@dimen/spacing_medium" android:layout_marginBottom="@dimen/spacing_medium"> - - - - + android:id="@+id/gear_image"/> - - - diff --git a/Habitica/res/layout/npc_banner.xml b/Habitica/res/layout/npc_banner.xml index 3d767bba3..c0b660b69 100644 --- a/Habitica/res/layout/npc_banner.xml +++ b/Habitica/res/layout/npc_banner.xml @@ -10,7 +10,7 @@ android:layout_width="match_parent" android:layout_height="@dimen/shop_height" /> - diff --git a/Habitica/res/layout/pet_detail_item.xml b/Habitica/res/layout/pet_detail_item.xml index 91a6202ab..7fbe91ad3 100644 --- a/Habitica/res/layout/pet_detail_item.xml +++ b/Habitica/res/layout/pet_detail_item.xml @@ -7,12 +7,11 @@ android:background="@drawable/layout_rounded_bg_window" android:orientation="vertical" android:padding="8dp"> - + android:layout_gravity="center"/> - - - diff --git a/Habitica/res/layout/pet_overview_item.xml b/Habitica/res/layout/pet_overview_item.xml index 9b32b7b20..be8bfb6c4 100644 --- a/Habitica/res/layout/pet_overview_item.xml +++ b/Habitica/res/layout/pet_overview_item.xml @@ -18,12 +18,11 @@ android:layout_width="68dp" android:layout_height="58dp" android:layout_gravity="center"> - - @@ -31,10 +30,9 @@ - + android:layout_margin="5dp"/> \ No newline at end of file diff --git a/Habitica/res/layout/quest_collect.xml b/Habitica/res/layout/quest_collect.xml index 1a97294cb..d24ca6731 100644 --- a/Habitica/res/layout/quest_collect.xml +++ b/Habitica/res/layout/quest_collect.xml @@ -8,7 +8,7 @@ android:gravity="center_vertical" android:orientation="horizontal"> - - - - - + android:scaleType="center"/> - - = 28) { + add(ImageDecoderDecoder(this@HabiticaBaseApplication)) + } else { + add(GifDecoder()) + } + } + if (BuildConfig.DEBUG) { + builder = builder.logger(DebugLogger()) + } + Coil.setImageLoader(builder.build()) RxErrorHandler.init(analyticsManager) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/TaskRepositoryImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/TaskRepositoryImpl.kt index 2ebfa9a1b..88ccf0fd9 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/TaskRepositoryImpl.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/TaskRepositoryImpl.kt @@ -8,7 +8,6 @@ import com.habitrpg.android.habitica.helpers.AppConfigManager import com.habitrpg.android.habitica.helpers.RxErrorHandler import com.habitrpg.android.habitica.interactors.ScoreTaskLocallyInteractor import com.habitrpg.android.habitica.models.BaseMainObject -import com.habitrpg.android.habitica.models.BaseObject import com.habitrpg.android.habitica.models.responses.BulkTaskScoringData import com.habitrpg.android.habitica.models.responses.TaskDirection import com.habitrpg.android.habitica.models.responses.TaskDirectionData diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/AprilFoolsHandler.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/AprilFoolsHandler.kt index 396e9a57e..64268000f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/AprilFoolsHandler.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/AprilFoolsHandler.kt @@ -1,8 +1,5 @@ package com.habitrpg.android.habitica.helpers -import com.facebook.imagepipeline.request.BasePostprocessor -import com.habitrpg.android.habitica.helpers.postProcessors.InvertPostProcessor -import com.habitrpg.android.habitica.ui.AvatarView import java.util.* class AprilFoolsHandler { @@ -20,13 +17,13 @@ class AprilFoolsHandler { } private fun invertFools() { - AvatarView.postProcessors[AvatarView.LayerType.PET] = { + /*AvatarView.postProcessors[AvatarView.LayerType.PET] = { if (Date().after(eventEnd)) { null } else { InvertPostProcessor() } - } + }*/ } } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/postProcessors/InvertPostProcessor.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/postProcessors/InvertPostProcessor.kt index 734b2e598..0066a8323 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/postProcessors/InvertPostProcessor.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/postProcessors/InvertPostProcessor.kt @@ -1,37 +1,2 @@ package com.habitrpg.android.habitica.helpers.postProcessors -import android.graphics.* -import com.facebook.cache.common.CacheKey -import com.facebook.cache.common.SimpleCacheKey -import com.facebook.imagepipeline.request.BasePostprocessor - - -class InvertPostProcessor: BasePostprocessor() { - - override fun getName(): String { - return "invertPostProcessor" - } - - - override fun process(bitmap: Bitmap) { - val canvas = Canvas(bitmap) - val paint = Paint() - - val matrixInvert = ColorMatrix() - matrixInvert.set(floatArrayOf( - -1.0f, 0.0f, 0.0f, 0.0f, 255.0f, - 0.0f, -1.0f, 0.0f, 0.0f, 255.0f, - 0.0f, 0.0f, -1.0f, 0.0f, 255.0f, - 0.0f, 0.0f, 0.0f, 1.0f, 0.0f - )) - - val filter = ColorMatrixColorFilter(matrixInvert) - paint.colorFilter = filter - - canvas.drawBitmap(bitmap, 0f, 0f, paint) - } - - override fun getPostprocessorCacheKey(): CacheKey { - return SimpleCacheKey("0") - } -} \ No newline at end of file diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/OwnedItem.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/OwnedItem.kt index 59d91662a..dd656c40f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/OwnedItem.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/OwnedItem.kt @@ -22,17 +22,4 @@ open class OwnedItem : RealmObject(), BaseMainObject, OwnedObject { var itemType: String? = null var numberOwned = 0 - - override fun equals(other: Any?): Boolean { - return if (other is OwnedItem) { - userID == other.userID && key == other.key && itemType == other.itemType - } else super.equals(other) - } - - override fun hashCode(): Int { - var result = userID?.hashCode() ?: 0 - result = 31 * result + (key?.hashCode() ?: 0) - result = 31 * result + (itemType?.hashCode() ?: 0) - return result - } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/OwnedMount.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/OwnedMount.kt index 376d5a270..723e2e6bf 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/OwnedMount.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/OwnedMount.kt @@ -12,17 +12,4 @@ open class OwnedMount : RealmObject(), OwnedObject { var owned = false - - override fun equals(other: Any?): Boolean { - return if (other is OwnedMount) { - userID == other.userID && key == other.key - } else super.equals(other) - } - - override fun hashCode(): Int { - var result = userID?.hashCode() ?: 0 - result = 31 * result + (key?.hashCode() ?: 0) - result = 31 * result + owned.hashCode() - return result - } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/OwnedPet.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/OwnedPet.kt index 877aaa7e6..b7a624f3f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/OwnedPet.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/OwnedPet.kt @@ -10,16 +10,4 @@ open class OwnedPet : RealmObject(), OwnedObject { override var userID: String? = null override var key: String? = null var trained = 0 - - override fun equals(other: Any?): Boolean { - return if (other is OwnedPet) { - userID == other.userID && key == other.key - } else super.equals(other) - } - - override fun hashCode(): Int { - var result = userID?.hashCode() ?: 0 - result = 31 * result + (key?.hashCode() ?: 0) - return result - } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/AvatarView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/AvatarView.kt index d2002b384..44c183ec3 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/AvatarView.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/AvatarView.kt @@ -2,22 +2,16 @@ package com.habitrpg.android.habitica.ui import android.content.Context import android.graphics.* -import android.graphics.drawable.Animatable import android.graphics.drawable.Drawable -import android.net.Uri import android.text.TextUtils import android.util.AttributeSet -import android.util.Log import android.view.View -import com.facebook.drawee.backends.pipeline.Fresco -import com.facebook.drawee.controller.BaseControllerListener -import com.facebook.drawee.generic.GenericDraweeHierarchy -import com.facebook.drawee.generic.GenericDraweeHierarchyBuilder -import com.facebook.drawee.view.DraweeHolder -import com.facebook.drawee.view.MultiDraweeHolder -import com.facebook.imagepipeline.image.ImageInfo -import com.facebook.imagepipeline.request.BasePostprocessor -import com.facebook.imagepipeline.request.ImageRequestBuilder +import android.widget.FrameLayout +import android.widget.ImageView +import coil.imageLoader +import coil.load +import coil.request.ImageRequest +import coil.target.ViewTarget import com.habitrpg.android.habitica.BuildConfig import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.helpers.AppConfigManager @@ -27,7 +21,7 @@ import io.reactivex.rxjava3.functions.Consumer import java.util.* import java.util.concurrent.atomic.AtomicInteger -class AvatarView : View { +class AvatarView : FrameLayout { private var showBackground = true private var showMount = true @@ -36,8 +30,7 @@ class AvatarView : View { private var hasBackground: Boolean = false private var hasMount: Boolean = false private var hasPet: Boolean = false - private var isOrphan: Boolean = false - private val multiDraweeHolder = MultiDraweeHolder() + private val imageViewHolder = mutableListOf() private var avatar: Avatar? = null private var avatarRectF: RectF? = null private val avatarMatrix = Matrix() @@ -93,11 +86,9 @@ class AvatarView : View { } constructor(context: Context, showBackground: Boolean, showMount: Boolean, showPet: Boolean) : super(context) { - this.showBackground = showBackground this.showMount = showMount this.showPet = showPet - isOrphan = true } private fun init(attrs: AttributeSet?, defStyle: Int) { @@ -113,10 +104,12 @@ class AvatarView : View { } finally { a.recycle() } + + setWillNotDraw(false) } private fun showLayers(layerMap: Map) { - if (multiDraweeHolder.size() > 0) return + if (imageViewHolder.isNotEmpty()) return var i = 0 currentLayers = layerMap @@ -126,46 +119,32 @@ class AvatarView : View { for ((layerKey, layerName) in layerMap) { val layerNumber = i++ - val hierarchy = GenericDraweeHierarchyBuilder(resources) - .setFadeDuration(0) - .build() - - val draweeHolder = DraweeHolder.create(hierarchy, context) - draweeHolder.topLevelDrawable?.callback = this - multiDraweeHolder.add(draweeHolder) - - val uri = Uri.parse(IMAGE_URI_ROOT + DataBindingUtils.getFullFilename(layerName, null)) - var request = ImageRequestBuilder.newBuilderWithSource(uri) - postProcessors[layerKey]?.let { - request = request.setPostprocessor(it()) + val imageView = if (imageViewHolder.size <= layerNumber) { + val newImageView = ImageView(context) + newImageView.scaleType = ImageView.ScaleType.MATRIX + addView(newImageView) + imageViewHolder.add(newImageView) + newImageView + } else { + imageViewHolder[layerNumber] } - val controller = Fresco.newDraweeControllerBuilder() - .setImageRequest(request.build()) - .setControllerListener(object : BaseControllerListener() { - override fun onFinalImageSet( - id: String?, - imageInfo: ImageInfo?, - anim: Animatable?) { - if (imageInfo != null) { - if (multiDraweeHolder.size() > layerNumber) { - multiDraweeHolder.get(layerNumber).topLevelDrawable?.bounds = getLayerBounds(layerKey, layerName, imageInfo) - } - onLayerComplete() - } - } - - override fun onFailure(id: String?, throwable: Throwable?) { - Log.e(TAG, "Error loading layer: $layerName", throwable) - onLayerComplete() - } - }) - .setAutoPlayAnimations(!isOrphan) - .build() - draweeHolder.controller = controller + imageView.load(DataBindingUtils.BASE_IMAGE_URL + DataBindingUtils.getFullFilename(layerName)) { + allowHardware(false) + target({}, { + onLayerComplete() + }, { + val bounds = getLayerBounds(layerKey, layerName, it) + imageView.load(it) + imageView.imageMatrix = avatarMatrix + val layoutParams = imageView.layoutParams as? FrameLayout.LayoutParams + layoutParams?.topMargin = bounds.top + layoutParams?.marginStart = bounds.left + imageView.layoutParams = layoutParams + onLayerComplete() + }) + } } - - if (isOrphan) multiDraweeHolder.onAttach() } private fun getLayerMap(avatar: Avatar, resetHasAttributes: Boolean): Map { @@ -322,9 +301,9 @@ class AvatarView : View { return layerMap } - private fun getLayerBounds(layerType: LayerType, layerName: String, layerImageInfo: ImageInfo): Rect { + private fun getLayerBounds(layerType: LayerType, layerName: String, drawable: Drawable): Rect { var offset: PointF? = null - val bounds = Rect(0, 0, layerImageInfo.width, layerImageInfo.height) + val bounds = Rect(0, 0, drawable.intrinsicWidth, drawable.intrinsicHeight) val boundsF = RectF(bounds) // lookup layer specific offset @@ -367,7 +346,7 @@ class AvatarView : View { // compact hero box offset = PointF(0.0f, 18.0f) } - LayerType.PET -> offset = PointF(0f, (FULL_HERO_RECT.height() - layerImageInfo.height).toFloat()) + LayerType.PET -> offset = PointF(0f, (FULL_HERO_RECT.height() - bounds.height()).toFloat()) } } @@ -403,7 +382,7 @@ class AvatarView : View { fun onAvatarImageReady(consumer: Consumer) { avatarImageConsumer = consumer - if (multiDraweeHolder.size() > 0 && numberLayersInProcess.get() == 0) { + if (imageViewHolder.size > 0 && numberLayersInProcess.get() == 0) { avatarImageConsumer?.accept(avatarImage) } else { initAvatarRectMatrix() @@ -420,39 +399,28 @@ class AvatarView : View { val equals = currentLayers != null && currentLayers == newLayerMap - if (!equals || postProcessors.isNotEmpty()) { - multiDraweeHolder.clear() + if (!equals) { + imageViewHolder.clear() numberLayersInProcess.set(0) } } - invalidate() + } private fun initAvatarRectMatrix() { if (avatarRectF == null) { val srcRect = originalRect - - if (isOrphan) { - avatarRectF = RectF(srcRect) - - // change scale to not be 1:1 - // a quick fix as fresco AnimatedDrawable/ScaleTypeDrawable - // will not translate matrix properly - avatarMatrix.setScale(1.2f, 1.2f) - avatarMatrix.mapRect(avatarRectF) - } else { - // full hero box when showMount and showPet is enabled (140w * 147h) - // compact hero box when only showBackground is enabled (114w * 114h) - // hero only box when all show settings disabled (90w * 90h) - avatarRectF = RectF(0f, 0f, width.toFloat(), height.toFloat()) - avatarMatrix.setRectToRect(RectF(srcRect), avatarRectF, Matrix.ScaleToFit.START) // TODO support other ScaleToFit - avatarRectF = RectF(srcRect) - avatarMatrix.mapRect(avatarRectF) - } + // full hero box when showMount and showPet is enabled (140w * 147h) + // compact hero box when only showBackground is enabled (114w * 114h) + // hero only box when all show settings disabled (90w * 90h) + avatarRectF = RectF(0f, 0f, width.toFloat(), height.toFloat()) + avatarMatrix.setRectToRect(RectF(srcRect), avatarRectF, Matrix.ScaleToFit.START) // TODO support other ScaleToFit + avatarRectF = RectF(srcRect) + avatarMatrix.mapRect(avatarRectF) } } - override fun onDraw(canvas: Canvas) { + override fun onDraw(canvas: Canvas?) { super.onDraw(canvas) initAvatarRectMatrix() @@ -461,37 +429,9 @@ class AvatarView : View { if (avatar?.isValid() != true) return // request image layers if not yet processed - if (multiDraweeHolder.size() == 0) { + if (imageViewHolder.size == 0) { showLayers(layerMap) } - - // manually call onAttach/onDetach if view is without parent as they will never be called otherwise - if (isOrphan) multiDraweeHolder.onAttach() - multiDraweeHolder.draw(canvas) - } - - override fun onDetachedFromWindow() { - super.onDetachedFromWindow() - multiDraweeHolder.onDetach() - } - - override fun onStartTemporaryDetach() { - super.onStartTemporaryDetach() - multiDraweeHolder.onDetach() - } - - override fun onAttachedToWindow() { - super.onAttachedToWindow() - multiDraweeHolder.onAttach() - } - - override fun onFinishTemporaryDetach() { - super.onFinishTemporaryDetach() - multiDraweeHolder.onAttach() - } - - override fun verifyDrawable(who: Drawable): Boolean { - return multiDraweeHolder.verifyDrawable(who) || super.verifyDrawable(who) } override fun invalidateDrawable(drawable: Drawable) { @@ -526,12 +466,11 @@ class AvatarView : View { } companion object { - const val IMAGE_URI_ROOT = "https://habitica-assets.s3.amazonaws.com/mobileApp/images/" private const val TAG = "AvatarView" private val FULL_HERO_RECT = Rect(0, 0, 140, 147) private val COMPACT_HERO_RECT = Rect(0, 0, 114, 114) private val HERO_ONLY_RECT = Rect(0, 0, 90, 90) - val postProcessors: MutableMap BasePostprocessor?)> = mutableMapOf() + //val postProcessors: MutableMap BasePostprocessor?)> = mutableMapOf() } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/AvatarWithBarsViewModel.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/AvatarWithBarsViewModel.kt index 8f4fb5b2c..e3b7a2d49 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/AvatarWithBarsViewModel.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/AvatarWithBarsViewModel.kt @@ -46,7 +46,6 @@ class AvatarWithBarsViewModel(private val context: Context, private val binding: } } - @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) fun updateData(user: Avatar) { userObject = user @@ -65,7 +64,8 @@ class AvatarWithBarsViewModel(private val context: Context, private val binding: if (!user.hasClass()) { setUserLevel(context, binding.lvlTv, stats.lvl) } else { - setUserLevelWithClass(context, binding.lvlTv, stats.lvl, userClass.capitalize(Locale.getDefault()), stats.habitClass) + setUserLevelWithClass(context, binding.lvlTv, stats.lvl, + userClass.replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() }, stats.habitClass) } setHpBarData(stats.hp?.toFloat() ?: 0.toFloat(), stats.maxHealth ?: 0) 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 index 60b8c35bf..0daad3ae1 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/ItemDetailDialog.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/ItemDetailDialog.kt @@ -9,14 +9,13 @@ 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 itemImageView: ImageView private val contentTextView: TextView private val priceTextView: TextView private val currencyImageView: ImageView @@ -28,7 +27,7 @@ class ItemDetailDialog(context: Context) : AlertDialog(context) { contentViewLayout.orientation = LinearLayout.VERTICAL // Gear Image - itemImageView = SimpleDraweeView(context) + itemImageView = ImageView(context) val gearImageLayoutParams = LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT) 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 20f954b68..818d72a09 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 @@ -4,16 +4,10 @@ import android.content.Context import android.graphics.Typeface import android.os.Bundle import android.view.* -import android.widget.ProgressBar -import android.widget.TableLayout -import android.widget.TableRow -import android.widget.TextView +import android.widget.* import androidx.core.content.ContextCompat import androidx.core.os.bundleOf -import com.facebook.drawee.backends.pipeline.Fresco -import com.facebook.drawee.controller.BaseControllerListener -import com.facebook.drawee.view.SimpleDraweeView -import com.facebook.imagepipeline.image.ImageInfo +import coil.load import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.ApiClient @@ -31,7 +25,6 @@ import com.habitrpg.android.habitica.models.inventory.Equipment import com.habitrpg.android.habitica.models.members.Member import com.habitrpg.android.habitica.models.user.Outfit 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.AchievementProfileAdapter import com.habitrpg.android.habitica.ui.helpers.loadImage @@ -202,14 +195,7 @@ class FullProfileActivity : BaseActivity() { if (imageUrl == null || imageUrl.isEmpty()) { binding.profileImage.visibility = View.GONE } else { - binding.profileImage.controller = Fresco.newDraweeControllerBuilder() - .setUri(imageUrl) - .setControllerListener(object : BaseControllerListener() { - override fun onFailure(id: String?, throwable: Throwable?) { - binding.profileImage.visibility = View.GONE - } - }) - .build() + binding.profileImage.load(imageUrl) } val blurbText = profile.blurb @@ -240,8 +226,8 @@ class FullProfileActivity : BaseActivity() { binding.petsFoundCount.text = user.petsFoundCount.toString() binding.mountsTamedCount.text = user.mountsTamedCount.toString() - binding.currentPetDrawee.loadImage("Pet-" + user.currentPet) - binding.currentMountDrawee.loadImage("Mount_Icon_" + user.currentMount) + if (user.currentPet?.isNotBlank() == true) binding.currentPetDrawee.loadImage("Pet-" + user.currentPet) + if (user.currentMount?.isNotBlank() == true) binding.currentMountDrawee.loadImage("Mount_Icon_" + user.currentMount) } // endregion @@ -314,16 +300,9 @@ class FullProfileActivity : BaseActivity() { private fun addEquipmentRow(table: TableLayout, gearKey: String?, text: String?, stats: String?) { val gearRow = layoutInflater.inflate(R.layout.profile_gear_tablerow, table, false) as? TableRow - val draweeView = gearRow?.findViewById(R.id.gear_drawee) + val draweeView = gearRow?.findViewById(R.id.gear_drawee) - draweeView?.controller = Fresco.newDraweeControllerBuilder() - .setUri(AvatarView.IMAGE_URI_ROOT + "shop_" + gearKey + ".png") - .setControllerListener(object : BaseControllerListener() { - override fun onFailure(id: String?, throwable: Throwable?) { - draweeView?.visibility = View.GONE - } - }) - .build() + draweeView?.loadImage("shop_$gearKey") val keyTextView = gearRow?.findViewById(R.id.tableRowTextView1) keyTextView?.text = text @@ -342,7 +321,10 @@ class FullProfileActivity : BaseActivity() { private fun addLevelAttributes(user: Member) { val byLevelStat = min((user.stats?.lvl ?: 0) / 2.0f, 50f) - addAttributeRow(getString(R.string.profile_level), byLevelStat, byLevelStat, byLevelStat, byLevelStat, true, false) + addAttributeRow(getString(R.string.profile_level), byLevelStat, byLevelStat, byLevelStat, byLevelStat, + roundDown = true, + isSummary = false + ) } private fun loadItemDataByOutfit(outfit: Outfit?): Flowable> { @@ -393,7 +375,10 @@ class FullProfileActivity : BaseActivity() { private fun addNormalAddBuffAttributes(stats: Stats) { val buffs = stats.buffs - addAttributeRow(getString(R.string.profile_allocated), stats.strength?.toFloat() ?: 0f, stats.intelligence?.toFloat() ?: 0f, stats.constitution?.toFloat() ?: 0f, stats.per?.toFloat() ?: 0f, true, false) + addAttributeRow(getString(R.string.profile_allocated), stats.strength?.toFloat() ?: 0f, stats.intelligence?.toFloat() ?: 0f, stats.constitution?.toFloat() ?: 0f, stats.per?.toFloat() ?: 0f, + roundDown = true, + isSummary = false + ) addAttributeRow(getString(R.string.buffs), buffs?.str ?: 0f, buffs?._int ?: 0f, buffs?.con ?: 0f, buffs?.per ?: 0f, roundDown = true, isSummary = false) 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 c2d2b6d33..671bd2cfb 100755 --- 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 @@ -15,6 +15,7 @@ import android.os.Bundle import android.util.Log import android.view.* import android.widget.FrameLayout +import android.widget.ImageView import android.widget.TextView import androidx.appcompat.app.ActionBarDrawerToggle import androidx.core.content.FileProvider @@ -25,7 +26,6 @@ import androidx.lifecycle.ViewModelProvider import androidx.navigation.NavDestination import androidx.navigation.findNavController import androidx.navigation.fragment.NavHostFragment -import com.facebook.drawee.view.SimpleDraweeView import com.google.firebase.analytics.FirebaseAnalytics import com.google.firebase.perf.FirebasePerformance import com.habitrpg.android.habitica.HabiticaBaseApplication @@ -514,7 +514,7 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction { HabiticaSnackbar.showSnackbar(snackbarContainer, feedResponse.message, SnackbarDisplayType.NORMAL) if (feedResponse.value == -1) { val mountWrapper = View.inflate(this, R.layout.pet_imageview, null) as? FrameLayout - val mountImageView = mountWrapper?.findViewById(R.id.pet_imageview) as? SimpleDraweeView + val mountImageView = mountWrapper?.findViewById(R.id.pet_imageview) as? ImageView DataBindingUtils.loadImage(mountImageView, "Mount_Icon_" + event.usingPet.key) val dialog = HabiticaAlertDialog(this@MainActivity) @@ -756,7 +756,7 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction { val factory = LayoutInflater.from(this) val view = factory.inflate(R.layout.dialog_login_incentive, null) - val imageView = view.findViewById(R.id.imageView) as? SimpleDraweeView + val imageView = view.findViewById(R.id.imageView) as? ImageView var imageKey = notificationData?.rewardKey?.get(0) if (imageKey?.contains("armor") == true) { imageKey = "slim_$imageKey" @@ -860,7 +860,7 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction { fun hatchPet(potion: HatchingPotion, egg: Egg) { compositeSubscription.add(this.inventoryRepository.hatchPet(egg, potion) { val petWrapper = View.inflate(this, R.layout.pet_imageview, null) as? FrameLayout - val petImageView = petWrapper?.findViewById(R.id.pet_imageview) as? SimpleDraweeView + val petImageView = petWrapper?.findViewById(R.id.pet_imageview) as? ImageView DataBindingUtils.loadImage(petImageView, "stable_Pet-" + egg.key + "-" + potion.key) val potionName = potion.text diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/AchievementsAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/AchievementsAdapter.kt index 35d228912..8dcd62ac3 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/AchievementsAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/AchievementsAdapter.kt @@ -2,9 +2,9 @@ package com.habitrpg.android.habitica.ui.adapter import android.view.View import android.view.ViewGroup +import android.widget.ImageView import android.widget.TextView import androidx.recyclerview.widget.RecyclerView -import com.facebook.drawee.view.SimpleDraweeView import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.databinding.AchievementChallengeItemBinding import com.habitrpg.android.habitica.databinding.AchievementQuestItemBinding @@ -72,7 +72,7 @@ class AchievementsAdapter: RecyclerView.Adapter() { private var achievement: Achievement? = null private val achievementContainer: ViewGroup? - private val achievementIconView: SimpleDraweeView + private val achievementIconView: ImageView private val achievementCountView: TextView private val achievementTitleView: TextView private val achievementDescriptionView: TextView? diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/CustomizationEquipmentRecyclerViewAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/CustomizationEquipmentRecyclerViewAdapter.kt index 77f0bb048..436c0b564 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/CustomizationEquipmentRecyclerViewAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/CustomizationEquipmentRecyclerViewAdapter.kt @@ -8,7 +8,6 @@ import android.widget.LinearLayout import android.widget.TextView import androidx.core.content.ContextCompat import androidx.core.os.bundleOf -import com.facebook.drawee.view.SimpleDraweeView import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.databinding.CustomizationGridItemBinding import com.habitrpg.android.habitica.helpers.MainNavigationController @@ -118,7 +117,7 @@ class CustomizationEquipmentRecyclerViewAdapter : androidx.recyclerview.widget.R if (equipment?.owned != true && (equipment?.value ?: 0.0) > 0.0) { val dialogContent = LayoutInflater.from(itemView.context).inflate(R.layout.dialog_purchase_customization, null) as LinearLayout - val imageView = dialogContent.findViewById(R.id.imageView) + val imageView = dialogContent.findViewById(R.id.imageView) DataBindingUtils.loadImage(imageView, "shop_" + this.equipment?.key) val priceLabel = dialogContent.findViewById(R.id.priceLabel) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/CustomizationRecyclerViewAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/CustomizationRecyclerViewAdapter.kt index a37746edc..0209a7132 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/CustomizationRecyclerViewAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/CustomizationRecyclerViewAdapter.kt @@ -10,7 +10,7 @@ import android.widget.LinearLayout import android.widget.TextView import androidx.core.content.ContextCompat import androidx.core.os.bundleOf -import com.facebook.drawee.view.SimpleDraweeView +import coil.load import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.databinding.CustomizationGridItemBinding import com.habitrpg.android.habitica.databinding.CustomizationSectionHeaderBinding @@ -149,7 +149,7 @@ class CustomizationRecyclerViewAdapter() : androidx.recyclerview.widget.Recycler this.customization = customization if (customization.type == "background" && customization.identifier == "") { - binding.imageView.setActualImageResource(R.drawable.no_background) + binding.imageView.load(R.drawable.no_background) } else { DataBindingUtils.loadImage(binding.imageView, customization.getIconName(userSize, hairColor)) } @@ -193,7 +193,7 @@ class CustomizationRecyclerViewAdapter() : androidx.recyclerview.widget.Recycler } else { val dialogContent = LayoutInflater.from(itemView.context).inflate(R.layout.dialog_purchase_customization, null) as LinearLayout - val imageView = dialogContent.findViewById(R.id.imageView) + val imageView = dialogContent.findViewById(R.id.imageView) DataBindingUtils.loadImage(imageView, customization?.getImageName(userSize, hairColor)) val priceLabel = dialogContent.findViewById(R.id.priceLabel) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/StableRecyclerAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/StableRecyclerAdapter.kt index 0386342e2..1ba31a2c3 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/StableRecyclerAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/StableRecyclerAdapter.kt @@ -2,11 +2,11 @@ package com.habitrpg.android.habitica.ui.adapter.inventory import android.view.View import android.view.ViewGroup +import android.widget.ImageView import android.widget.TextView import androidx.core.content.ContextCompat import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView -import com.facebook.drawee.view.SimpleDraweeView import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.databinding.ShopHeaderBinding import com.habitrpg.android.habitica.extensions.inflate @@ -182,7 +182,7 @@ class StableRecyclerAdapter : RecyclerView.Adapter() { internal inner class StableViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), View.OnClickListener { private var animal: Animal? = null - private val imageView: SimpleDraweeView = itemView.findViewById(R.id.imageView) + private val imageView: ImageView = itemView.findViewById(R.id.imageView) private val titleView: TextView = itemView.findViewById(R.id.titleTextView) private val ownedTextView: TextView = itemView.findViewById(R.id.ownedTextView) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/AchievementProfileAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/AchievementProfileAdapter.kt index 08aa92844..1e712b8ec 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/AchievementProfileAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/AchievementProfileAdapter.kt @@ -1,25 +1,16 @@ package com.habitrpg.android.habitica.ui.adapter.social -import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.ImageView -import android.widget.TextView import androidx.recyclerview.widget.RecyclerView -import com.facebook.drawee.backends.pipeline.Fresco -import com.facebook.drawee.controller.BaseControllerListener -import com.facebook.imagepipeline.image.ImageInfo import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.databinding.ProfileAchievementItemBinding -import com.habitrpg.android.habitica.extensions.addOkButton -import com.habitrpg.android.habitica.extensions.fromHtml import com.habitrpg.android.habitica.extensions.inflate import com.habitrpg.android.habitica.models.Achievement -import com.habitrpg.android.habitica.ui.AvatarView import com.habitrpg.android.habitica.ui.activities.MainActivity +import com.habitrpg.android.habitica.ui.helpers.loadImage import com.habitrpg.android.habitica.ui.viewHolders.SectionViewHolder import com.habitrpg.android.habitica.ui.views.dialogs.AchievementDetailDialog -import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog class AchievementProfileAdapter : RecyclerView.Adapter() { @@ -71,14 +62,7 @@ class AchievementProfileAdapter : RecyclerView.Adapter( } fun bind(item: Achievement) { - val iconUrl = AvatarView.IMAGE_URI_ROOT + (if (!item.earned) "achievement-unearned" else item.icon) + "2x.png" - - binding.achievementDrawee.controller = Fresco.newDraweeControllerBuilder() - .setUri(iconUrl) - .setControllerListener(object : BaseControllerListener() { - override fun onFailure(id: String?, throwable: Throwable?) { /* no-on */ } - }) - .build() + binding.achievementDrawee.loadImage((if (!item.earned) "achievement-unearned" else item.icon) + "2x.png") this.achievement = item binding.achievementText.text = item.title diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/AboutFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/AboutFragment.kt index adb237f21..43d8cde14 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/AboutFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/AboutFragment.kt @@ -122,8 +122,9 @@ class AboutFragment : BaseMainFragment() { } private fun doTheThing() { - context?.let { FirebaseAnalytics.getInstance(it).logEvent("found_easter_egg", null) } - DataBindingUtils.loadImage("Pet-Sabretooth-Base") {bitmap -> + val context = context ?: return + FirebaseAnalytics.getInstance(context).logEvent("found_easter_egg", null) + DataBindingUtils.loadImage(context,"Pet-Sabretooth-Base") {bitmap -> activity?.runOnUiThread { activity?.let { ParticleSystem(it, 50, bitmap, 3000) @@ -135,7 +136,7 @@ class AboutFragment : BaseMainFragment() { } } } - DataBindingUtils.loadImage("Pet-Sabretooth-Golden") {bitmap -> + DataBindingUtils.loadImage(context,"Pet-Sabretooth-Golden") {bitmap -> activity?.runOnUiThread { activity?.let { ParticleSystem(it, 50, bitmap, 3000) @@ -147,7 +148,7 @@ class AboutFragment : BaseMainFragment() { } } } - DataBindingUtils.loadImage("Pet-Sabretooth-Red") {bitmap -> + DataBindingUtils.loadImage(context, "Pet-Sabretooth-Red") {bitmap -> activity?.runOnUiThread { activity?.let { ParticleSystem(it, 50, bitmap, 3000) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/NoPartyFragmentFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/NoPartyFragmentFragment.kt index 93d40c4de..73dbe0ded 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/NoPartyFragmentFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/NoPartyFragmentFragment.kt @@ -14,6 +14,7 @@ import android.view.View import android.view.ViewGroup import android.widget.TextView import androidx.activity.result.contract.ActivityResultContracts +import androidx.core.graphics.drawable.toBitmap import androidx.core.os.bundleOf import com.google.firebase.analytics.FirebaseAnalytics import com.habitrpg.android.habitica.R @@ -105,19 +106,16 @@ class NoPartyFragmentFragment : BaseMainFragment() { } context?.let { context -> - DataBindingUtils.loadImage("timeTravelersShop_background_fall") {bitmap -> + DataBindingUtils.loadImage(context, "timeTravelersShop_background_fall") { drawable -> + val bitmap = drawable.toBitmap() val aspectRatio = bitmap.width / bitmap.height.toFloat() val height = context.resources.getDimension(R.dimen.shop_height).toInt() val width = (height * aspectRatio).roundToInt() - val drawable = BitmapDrawable(context.resources, Bitmap.createScaledBitmap(bitmap, width, height, false)) - drawable.tileModeX = Shader.TileMode.REPEAT - Observable.just(drawable) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ - if (binding?.noPartyBackground != null) { - binding?.noPartyBackground?.background = it - } - }, RxErrorHandler.handleEmptyError()) + val bitmapDrawable = BitmapDrawable(context.resources, Bitmap.createScaledBitmap(bitmap, width, height, false)) + bitmapDrawable.tileModeX = Shader.TileMode.REPEAT + if (binding?.noPartyBackground != null) { + binding?.noPartyBackground?.background = bitmapDrawable + } } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/DataBindingUtils.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/DataBindingUtils.kt index 2107737b6..0d2fc8618 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/DataBindingUtils.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/DataBindingUtils.kt @@ -1,26 +1,18 @@ package com.habitrpg.android.habitica.ui.helpers +import android.content.Context import android.graphics.Bitmap import android.graphics.PorterDuff -import android.graphics.drawable.Animatable +import android.graphics.drawable.Drawable import android.view.View -import android.view.ViewGroup import android.view.animation.Animation import android.view.animation.Transformation +import android.widget.ImageView import android.widget.LinearLayout import androidx.core.content.res.ResourcesCompat -import androidx.core.net.toUri -import com.facebook.common.executors.CallerThreadExecutor -import com.facebook.common.references.CloseableReference -import com.facebook.datasource.DataSource -import com.facebook.drawee.backends.pipeline.Fresco -import com.facebook.drawee.controller.BaseControllerListener -import com.facebook.drawee.interfaces.DraweeController -import com.facebook.drawee.view.SimpleDraweeView -import com.facebook.imagepipeline.datasource.BaseBitmapDataSubscriber -import com.facebook.imagepipeline.image.CloseableImage -import com.facebook.imagepipeline.image.ImageInfo -import com.facebook.imagepipeline.request.ImageRequestBuilder +import coil.imageLoader +import coil.load +import coil.request.ImageRequest import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.extensions.setTintWith import com.habitrpg.android.habitica.helpers.AppConfigManager @@ -28,67 +20,42 @@ import java.util.* import kotlin.collections.HashMap -fun SimpleDraweeView.loadImage(imageName: String, imageFormat: String? = null) { +fun ImageView.loadImage(imageName: String?, imageFormat: String? = null) { DataBindingUtils.loadImage(this, imageName, imageFormat) } object DataBindingUtils { - fun loadImage(view: SimpleDraweeView?, imageName: String) { + fun loadImage(view: ImageView?, imageName: String) { loadImage(view, imageName, null) } - fun loadImage(view: SimpleDraweeView?, imageName: String?, imageFormat: String? = null) { + fun loadImage(view: ImageView?, imageName: String?, imageFormat: String? = null) { if (view != null && imageName != null && view.visibility == View.VISIBLE) { val fullname = getFullFilename(imageName, imageFormat) if (view.tag == fullname) { return } view.tag = fullname - val builder = Fresco.newDraweeControllerBuilder() - .setUri("https://habitica-assets.s3.amazonaws.com/mobileApp/images/$fullname") - .setControllerListener(object : BaseControllerListener() { - override fun onFinalImageSet(id: String?, imageInfo: ImageInfo?, animatable: Animatable?) { - if (imageInfo != null && view.layoutParams.height == ViewGroup.LayoutParams.WRAP_CONTENT) { - view.aspectRatio = imageInfo.width.toFloat() / imageInfo.height - } - super.onFinalImageSet(id, imageInfo, animatable) - } - }) - .setAutoPlayAnimations(true) - .setOldController(view.controller) - val controller: DraweeController = builder.build() - view.controller = controller + view.load(BASE_IMAGE_URL + fullname) } } - fun loadImage(imageName: String, imageResult: (Bitmap) -> Unit) { - loadImage(imageName, null, imageResult) + fun loadImage(context: Context, imageName: String, imageResult: (Drawable) -> Unit) { + loadImage(context, imageName, null, imageResult) } - fun loadImage(imageName: String, imageFormat: String?, imageResult: (Bitmap) -> Unit) { - val imageRequest = ImageRequestBuilder - .newBuilderWithSource("https://habitica-assets.s3.amazonaws.com/mobileApp/images/${getFullFilename(imageName, imageFormat)}".toUri()) - .build() - - val imagePipeline = Fresco.getImagePipeline() - val dataSource = imagePipeline.fetchDecodedImage(imageRequest, this) - - dataSource.subscribe(object : BaseBitmapDataSubscriber() { - public override fun onNewResultImpl(bitmap: Bitmap?) { - if (dataSource.isFinished && bitmap != null) { - imageResult(bitmap) - dataSource.close() - } + fun loadImage(context: Context, imageName: String, imageFormat: String?, imageResult: (Drawable) -> Unit) { + val request = ImageRequest.Builder(context) + .data(BASE_IMAGE_URL + getFullFilename(imageName, imageFormat)) + .target { + imageResult(it) } - - override fun onFailureImpl(dataSource: DataSource>) { - dataSource.close() - } - }, CallerThreadExecutor.getInstance()) + .build() + context.imageLoader.enqueue(request) } - fun getFullFilename(imageName: String, imageFormat: String?): String { + fun getFullFilename(imageName: String, imageFormat: String? = null): String { val name = when { spriteSubstitutions.containsKey(imageName) -> spriteSubstitutions[imageName] FILENAME_MAP.containsKey(imageName) -> FILENAME_MAP[imageName] @@ -126,6 +93,7 @@ object DataBindingUtils { override fun willChangeBounds(): Boolean = true } + val BASE_IMAGE_URL = "https://habitica-assets.s3.amazonaws.com/mobileApp/images/" private val FILEFORMAT_MAP: Map private val FILENAME_MAP: Map diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/MountViewHolder.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/MountViewHolder.kt index 3471f9ba5..f665a2cb7 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/MountViewHolder.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/MountViewHolder.kt @@ -4,6 +4,7 @@ import android.content.res.Resources import android.graphics.drawable.BitmapDrawable import android.view.View import android.view.ViewGroup +import androidx.core.graphics.drawable.toBitmap import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.databinding.MountOverviewItemBinding import com.habitrpg.android.habitica.extensions.inflate @@ -41,13 +42,9 @@ class MountViewHolder(parent: ViewGroup, private val equipEvents: PublishSubject binding.imageView.alpha = 0.2f } binding.imageView.background = null - DataBindingUtils.loadImage(imageName) { - val drawable = BitmapDrawable(itemView.context.resources, if (owned) it else it.extractAlpha()) - Observable.just(drawable) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ - binding.imageView.background = drawable - }, RxErrorHandler.handleEmptyError()) + DataBindingUtils.loadImage(itemView.context, imageName) { + val drawable = if (owned) it else BitmapDrawable(itemView.context.resources, it.toBitmap().extractAlpha()) + binding.imageView.background = drawable } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/PetViewHolder.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/PetViewHolder.kt index 849bc2a4d..6fb3db579 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/PetViewHolder.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/PetViewHolder.kt @@ -4,6 +4,7 @@ import android.graphics.PorterDuff import android.graphics.drawable.BitmapDrawable import android.view.View import android.view.ViewGroup +import androidx.core.graphics.drawable.toBitmap import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.databinding.PetDetailItemBinding import com.habitrpg.android.habitica.events.commands.FeedCommand @@ -98,14 +99,10 @@ class PetViewHolder(parent: ViewGroup, private val equipEvents: PublishSubject() { - override fun onIntermediateImageSet(id: String?, imageInfo: ImageInfo?) { - } - - override fun onFinalImageSet(id: String?, imageInfo: ImageInfo?, animatable: Animatable?) { - } - } - - 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) - } -} \ No newline at end of file diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/AchievementDetailDialog.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/AchievementDetailDialog.kt index e621f0df1..fbd17d597 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/AchievementDetailDialog.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/AchievementDetailDialog.kt @@ -2,8 +2,8 @@ package com.habitrpg.android.habitica.ui.views.dialogs import android.content.Context import android.view.LayoutInflater +import android.widget.ImageView import android.widget.TextView -import com.facebook.drawee.view.SimpleDraweeView import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.extensions.addCloseButton import com.habitrpg.android.habitica.extensions.fromHtml @@ -12,7 +12,7 @@ import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils class AchievementDetailDialog(val achievement: Achievement, context: Context): HabiticaAlertDialog(context) { - private var iconView: SimpleDraweeView? + private var iconView: ImageView? private var descriptionView: TextView? init { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/FirstDropDialog.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/FirstDropDialog.kt index af3c341f9..cdc1f473f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/FirstDropDialog.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/FirstDropDialog.kt @@ -2,15 +2,15 @@ package com.habitrpg.android.habitica.ui.views.dialogs import android.content.Context import android.view.LayoutInflater -import com.facebook.drawee.view.SimpleDraweeView +import android.widget.ImageView import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.helpers.MainNavigationController import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils class FirstDropDialog(context: Context) : HabiticaAlertDialog(context) { - private var eggView: SimpleDraweeView? - private var hatchingPotionView: SimpleDraweeView? + private var eggView: ImageView? + private var hatchingPotionView: ImageView? init { val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as? LayoutInflater diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/PetSuggestHatchDialog.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/PetSuggestHatchDialog.kt index 0335101a2..52128915b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/PetSuggestHatchDialog.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/PetSuggestHatchDialog.kt @@ -5,6 +5,7 @@ import android.graphics.drawable.BitmapDrawable import android.view.LayoutInflater import android.view.View import android.widget.LinearLayout +import androidx.core.graphics.drawable.toBitmap import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.databinding.DialogPetSuggestHatchBinding import com.habitrpg.android.habitica.helpers.RxErrorHandler @@ -143,9 +144,9 @@ class PetSuggestHatchDialog(context: Context) : HabiticaAlertDialog(context) { val imageName = "stable_Pet-${pet.animal}-${pet.color}" - DataBindingUtils.loadImage(imageName) { + DataBindingUtils.loadImage(context, imageName) { val resources = context.resources ?: return@loadImage - val drawable = BitmapDrawable(resources, if (hasMount) it else it.extractAlpha()) + val drawable = if (hasMount) it else BitmapDrawable(resources, it.toBitmap().extractAlpha()) Observable.just(drawable) .observeOn(AndroidSchedulers.mainThread()) .subscribe({ diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/QuestCompletedDialogContent.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/QuestCompletedDialogContent.kt index d1f4023ed..4bc0aa721 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/QuestCompletedDialogContent.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/QuestCompletedDialogContent.kt @@ -9,7 +9,6 @@ import android.view.ViewGroup 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.databinding.DialogCompletedQuestContentBinding import com.habitrpg.android.habitica.extensions.fromHtml @@ -87,7 +86,7 @@ class QuestCompletedDialogContent : LinearLayout { private fun addRewardsRow(inflater: LayoutInflater?, item: QuestDropItem, containerView: ViewGroup?) { val view = inflater?.inflate(R.layout.row_quest_reward, containerView, false) as? ViewGroup - val imageView = view?.findViewById(R.id.imageView) as? SimpleDraweeView + val imageView = view?.findViewById(R.id.imageView) as? ImageView val titleTextView = view?.findViewById(R.id.titleTextView) as? TextView DataBindingUtils.loadImage(imageView, item.imageName) if (item.count > 1) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/WonChallengeDialog.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/WonChallengeDialog.kt index 799004320..c9c6df553 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/WonChallengeDialog.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/WonChallengeDialog.kt @@ -5,7 +5,6 @@ import android.view.LayoutInflater import android.view.View import android.widget.ImageView import android.widget.TextView -import com.facebook.drawee.view.SimpleDraweeView import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.extensions.fromHtml import com.habitrpg.android.habitica.models.notifications.ChallengeWonData @@ -13,7 +12,7 @@ import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils class WonChallengeDialog(context: Context) : HabiticaAlertDialog(context) { fun configure(data: ChallengeWonData?) { - val imageView = additionalContentView?.findViewById(R.id.achievement_view) + val imageView = additionalContentView?.findViewById(R.id.achievement_view) DataBindingUtils.loadImage(imageView, "achievement-karaoke-2x") if (data?.name != null) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogBaseContent.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogBaseContent.kt index 85e70af87..42980cc4e 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogBaseContent.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogBaseContent.kt @@ -1,14 +1,14 @@ package com.habitrpg.android.habitica.ui.views.shops import android.content.Context +import android.widget.ImageView import android.widget.TextView -import com.facebook.drawee.view.SimpleDraweeView import com.habitrpg.android.habitica.databinding.DialogPurchaseContentItemBinding import com.habitrpg.android.habitica.extensions.layoutInflater class PurchaseDialogBaseContent(context: Context) : PurchaseDialogContent(context) { val binding = DialogPurchaseContentItemBinding.inflate(context.layoutInflater, this) - override val imageView: SimpleDraweeView + override val imageView: ImageView get() = binding.imageView override val titleTextView: TextView get() = binding.titleTextView diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogContent.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogContent.kt index d2d034234..eeb57acab 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogContent.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogContent.kt @@ -3,21 +3,22 @@ package com.habitrpg.android.habitica.ui.views.shops import android.content.Context import android.util.AttributeSet import android.view.Gravity +import android.widget.ImageView import android.widget.LinearLayout import android.widget.TextView -import com.facebook.drawee.backends.pipeline.Fresco -import com.facebook.drawee.view.SimpleDraweeView +import coil.load import com.habitrpg.android.habitica.extensions.dpToPx import com.habitrpg.android.habitica.extensions.fromHtml import com.habitrpg.android.habitica.models.inventory.QuestContent import com.habitrpg.android.habitica.models.shops.ShopItem import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils +import com.habitrpg.android.habitica.ui.helpers.loadImage abstract class PurchaseDialogContent @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : LinearLayout(context, attrs, defStyleAttr) { - abstract val imageView: SimpleDraweeView + abstract val imageView: ImageView abstract val titleTextView: TextView init { @@ -27,23 +28,19 @@ abstract class PurchaseDialogContent @JvmOverloads constructor( open fun setItem(item: ShopItem) { if (item.path?.contains("timeTravelBackgrounds") == true) { - val controller = Fresco.newDraweeControllerBuilder() - .setUri("https://habitica-assets.s3.amazonaws.com/mobileApp/images/${item.imageName?.replace("icon_", "")}.gif") - .setAutoPlayAnimations(true) - .build() - imageView.controller = controller + imageView.load("${DataBindingUtils.BASE_IMAGE_URL}${item.imageName?.replace("icon_", "")}.gif") val params = imageView.layoutParams params.height = 147.dpToPx(context) params.width = 140.dpToPx(context) imageView.layoutParams = params } else { - DataBindingUtils.loadImage(imageView, item.imageName) + imageView.loadImage(item.imageName) } titleTextView.text = item.text } open fun setQuestContentItem(questContent: QuestContent) { - DataBindingUtils.loadImage(imageView, "inventory_quest_scroll_" + questContent.key) + imageView.loadImage("inventory_quest_scroll_" + questContent.key) titleTextView.setText(questContent.text.fromHtml(), TextView.BufferType.SPANNABLE) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogGearContent.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogGearContent.kt index 85561fc57..cb57e4a34 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogGearContent.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogGearContent.kt @@ -1,9 +1,9 @@ package com.habitrpg.android.habitica.ui.views.shops import android.content.Context +import android.widget.ImageView import android.widget.TextView import androidx.core.content.ContextCompat -import com.facebook.drawee.view.SimpleDraweeView import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.databinding.DialogPurchaseContentGearBinding import com.habitrpg.android.habitica.extensions.layoutInflater @@ -12,7 +12,7 @@ import com.habitrpg.android.habitica.models.shops.ShopItem internal class PurchaseDialogGearContent(context: Context) : PurchaseDialogContent(context) { val binding = DialogPurchaseContentGearBinding.inflate(context.layoutInflater, this) - override val imageView: SimpleDraweeView + override val imageView: ImageView get() = binding.imageView override val titleTextView: TextView get() = binding.titleTextView diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogGemsContent.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogGemsContent.kt index 142eaa350..876c82d6e 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogGemsContent.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogGemsContent.kt @@ -1,8 +1,8 @@ package com.habitrpg.android.habitica.ui.views.shops import android.content.Context +import android.widget.ImageView import android.widget.TextView -import com.facebook.drawee.view.SimpleDraweeView import com.habitrpg.android.habitica.databinding.DialogPurchaseGemsBinding import com.habitrpg.android.habitica.extensions.asDrawable import com.habitrpg.android.habitica.extensions.layoutInflater @@ -11,7 +11,7 @@ import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper internal class PurchaseDialogGemsContent(context: Context) : PurchaseDialogContent(context) { internal val binding = DialogPurchaseGemsBinding.inflate(context.layoutInflater, this) - override val imageView: SimpleDraweeView + override val imageView: ImageView get() = binding.imageView override val titleTextView: TextView get() = binding.titleTextView diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogItemContent.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogItemContent.kt index 4cbc83346..129542efe 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogItemContent.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogItemContent.kt @@ -1,15 +1,15 @@ package com.habitrpg.android.habitica.ui.views.shops import android.content.Context +import android.widget.ImageView import android.widget.TextView -import com.facebook.drawee.view.SimpleDraweeView import com.habitrpg.android.habitica.databinding.DialogPurchaseContentItemBinding import com.habitrpg.android.habitica.extensions.layoutInflater import com.habitrpg.android.habitica.models.shops.ShopItem class PurchaseDialogItemContent(context: Context) : PurchaseDialogContent(context) { private val binding = DialogPurchaseContentItemBinding.inflate(context.layoutInflater, this) - override val imageView: SimpleDraweeView + override val imageView: ImageView get() = binding.imageView override val titleTextView: TextView get() = binding.titleTextView diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogQuestContent.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogQuestContent.kt index 612be8a1c..bc85f85ee 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogQuestContent.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogQuestContent.kt @@ -7,7 +7,6 @@ import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView -import com.facebook.drawee.view.SimpleDraweeView import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.databinding.DialogPurchaseContentQuestBinding import com.habitrpg.android.habitica.extensions.layoutInflater @@ -18,7 +17,7 @@ import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper class PurchaseDialogQuestContent(context: Context) : PurchaseDialogContent(context) { private val binding = DialogPurchaseContentQuestBinding.inflate(context.layoutInflater, this) - override val imageView: SimpleDraweeView + override val imageView: ImageView get() = binding.imageView override val titleTextView: TextView get() = binding.titleTextView @@ -88,7 +87,7 @@ class PurchaseDialogQuestContent(context: Context) : PurchaseDialogContent(conte private fun addRewardsRow(inflater: LayoutInflater?, item: QuestDropItem, containerView: ViewGroup?) { val view = inflater?.inflate(R.layout.row_quest_reward, containerView, false) as? ViewGroup - val imageView = view?.findViewById(R.id.imageView) as? SimpleDraweeView + val imageView = view?.findViewById(R.id.imageView) as? ImageView val titleTextView = view?.findViewById(R.id.titleTextView) as? TextView DataBindingUtils.loadImage(imageView, item.imageName) if (item.count > 1) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/social/OldQuestProgressView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/social/OldQuestProgressView.kt index 263c38dd0..ff4c21dc8 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/social/OldQuestProgressView.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/social/OldQuestProgressView.kt @@ -6,10 +6,10 @@ import android.graphics.RectF import android.util.AttributeSet import android.view.LayoutInflater import android.view.View +import android.widget.ImageView import android.widget.LinearLayout import android.widget.TextView import androidx.core.content.ContextCompat -import com.facebook.drawee.view.SimpleDraweeView import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.databinding.QuestProgressOldBinding import com.habitrpg.android.habitica.extensions.layoutInflater @@ -88,7 +88,7 @@ class OldQuestProgressView : LinearLayout { for (collect in progress.collect ?: emptyList()) { val contentCollect = quest.getCollectWithKey(collect.key) ?: continue val view = inflater.inflate(R.layout.quest_collect, binding.collectionContainer, false) - val iconView = view.findViewById(R.id.icon_view) as? SimpleDraweeView + val iconView = view.findViewById(R.id.icon_view) as? ImageView val nameView = view.findViewById(R.id.name_view) as? TextView val valueView = view.findViewById(R.id.value_view) as? ValueBar DataBindingUtils.loadImage(iconView, "quest_" + quest.key + "_" + collect.key) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/social/QuestProgressView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/social/QuestProgressView.kt index d5f430948..c680e6708 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/social/QuestProgressView.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/social/QuestProgressView.kt @@ -16,7 +16,7 @@ import android.widget.TextView import androidx.appcompat.app.AlertDialog import androidx.core.content.ContextCompat import androidx.core.content.edit -import com.facebook.drawee.view.SimpleDraweeView +import androidx.core.graphics.drawable.toBitmap import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.databinding.QuestProgressBinding import com.habitrpg.android.habitica.extensions.layoutInflater @@ -181,10 +181,11 @@ class QuestProgressView : LinearLayout { progress?.rageStrikes?.sortedByDescending { it.wasHit }?.forEach { strike -> val iconView = ImageView(context) if (strike.wasHit) { - DataBindingUtils.loadImage("rage_strike_${strike.key}") { + DataBindingUtils.loadImage(context,"rage_strike_${strike.key}") { Observable.just(it) .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ bitmap -> + .subscribe({ drawable -> + val bitmap = drawable.toBitmap() val displayDensity = resources.displayMetrics.density val width = bitmap.width * displayDensity val height = bitmap.height * displayDensity @@ -250,7 +251,7 @@ class QuestProgressView : LinearLayout { for (collect in collection) { val contentCollect = quest.getCollectWithKey(collect.key) ?: continue val view = inflater.inflate(R.layout.quest_collect, binding.collectionContainer, false) - val iconView: SimpleDraweeView = view.findViewById(R.id.icon_view) + val iconView: ImageView = view.findViewById(R.id.icon_view) val nameView: TextView = view.findViewById(R.id.name_view) val valueView: ValueBar = view.findViewById(R.id.value_view) DataBindingUtils.loadImage(iconView, "quest_" + quest.key + "_" + collect.key) diff --git a/Habitica/staff/release/output.json b/Habitica/staff/release/output.json deleted file mode 100644 index a6aa28f97..000000000 --- a/Habitica/staff/release/output.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "version": 1, - "artifactType": { - "type": "APK", - "kind": "Directory" - }, - "applicationId": "com.habitrpg.android.habitica", - "variantName": "staffRelease", - "elements": [ - { - "type": "SINGLE", - "filters": [], - "properties": [], - "versionCode": 2509, - "versionName": "2509", - "enabled": true, - "outputFile": "Habitica-staff-release.apk" - } - ] -} \ No newline at end of file