linting fixes

This commit is contained in:
Phillip Thelen 2023-12-21 14:17:06 +01:00
parent ba5f49fe69
commit 88f2ee7d8e
173 changed files with 304 additions and 769 deletions

View file

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!--suppress AndroidDomInspection -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
package="com.habitrpg.android.habitica" package="com.habitrpg.android.habitica"

View file

@ -115,7 +115,7 @@ dependencies {
implementation "com.google.accompanist:accompanist-systemuicontroller:$accompanist_version" implementation "com.google.accompanist:accompanist-systemuicontroller:$accompanist_version"
implementation 'com.google.android.play:core:1.10.3' implementation 'com.google.android.play:core:1.10.3'
implementation 'androidx.activity:activity-compose:1.8.1' implementation 'androidx.activity:activity-compose:1.8.2'
implementation "androidx.compose.runtime:runtime-livedata:$compose_version" implementation "androidx.compose.runtime:runtime-livedata:$compose_version"
implementation "androidx.compose.material:material:$compose_version" implementation "androidx.compose.material:material:$compose_version"
implementation "androidx.compose.animation:animation:$compose_version" implementation "androidx.compose.animation:animation:$compose_version"

View file

@ -25,4 +25,4 @@
android:background="?attr/colorWindowBackground"/> android:background="?attr/colorWindowBackground"/>
<include layout="@layout/activity_main_content" android:id="@+id/content" /> <include layout="@layout/activity_main_content" android:id="@+id/content" />
</LinearLayout> </LinearLayout>
</androidx.drawerlayout.widget.DrawerLayout> </androidx.drawerlayout.widget.DrawerLayout>

View file

@ -120,7 +120,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="2" android:layout_weight="2"
android:tint="@color/text_brand_neon" app:tint="@color/text_brand_neon"
android:src="@drawable/challenge_gem_add_button"/> android:src="@drawable/challenge_gem_add_button"/>
<ImageView <ImageView
@ -137,7 +137,7 @@
android:gravity="center" android:gravity="center"
android:inputType="number" android:inputType="number"
android:textColor="@color/text_secondary" android:textColor="@color/text_secondary"
android:text="0" tools:text="0"
android:id="@+id/create_challenge_prize" android:id="@+id/create_challenge_prize"
android:textAlignment="center" /> android:textAlignment="center" />
@ -147,7 +147,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="2" android:layout_weight="2"
android:tint="@color/text_brand_neon" app:tint="@color/text_brand_neon"
android:src="@drawable/challenge_gem_remove_button"/> android:src="@drawable/challenge_gem_remove_button"/>
</LinearLayout> </LinearLayout>
@ -226,4 +226,4 @@
</androidx.recyclerview.widget.RecyclerView> </androidx.recyclerview.widget.RecyclerView>
</LinearLayout> </LinearLayout>
</androidx.core.widget.NestedScrollView> </androidx.core.widget.NestedScrollView>
</LinearLayout> </LinearLayout>

View file

@ -268,6 +268,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:clickable="true" android:clickable="true"
android:focusable="true"
android:foreground="?android:attr/selectableItemBackground"> android:foreground="?android:attr/selectableItemBackground">
<LinearLayout <LinearLayout
@ -284,8 +285,6 @@
android:stretchColumns="0,1,2,3,4"> android:stretchColumns="0,1,2,3,4">
<TableRow android:layout_height="wrap_content"> <TableRow android:layout_height="wrap_content">
<!-- Headers -->
<LinearLayout <LinearLayout
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
@ -430,4 +429,4 @@
</LinearLayout> </LinearLayout>
</androidx.core.widget.NestedScrollView> </androidx.core.widget.NestedScrollView>
</LinearLayout> </LinearLayout>

View file

@ -23,4 +23,4 @@
android:layout_gravity="start" android:layout_gravity="start"
tools:layout="@layout/drawer_main"/> tools:layout="@layout/drawer_main"/>
</androidx.drawerlayout.widget.DrawerLayout> </androidx.drawerlayout.widget.DrawerLayout>

View file

@ -7,9 +7,11 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_margin="5dp" android:layout_margin="5dp"
android:clickable="true" android:clickable="true"
android:focusable="true"
android:foreground="?selectableItemBackground" android:foreground="?selectableItemBackground"
android:orientation="horizontal" android:orientation="horizontal"
android:baselineAligned="false" android:baselineAligned="false"
android:paddingStart="0dp"
android:paddingEnd="16dp"> android:paddingEnd="16dp">
<LinearLayout <LinearLayout
@ -102,4 +104,4 @@
android:text="@string/joined"/> android:text="@string/joined"/>
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>

View file

@ -61,7 +61,7 @@
android:layout_height="30dp" android:layout_height="30dp"
android:layout_gravity="center" android:layout_gravity="center"
android:background="@color/transparent" android:background="@color/transparent"
android:tint="@color/disabled_background" app:tint="@color/disabled_background"
android:src="@drawable/ic_send_grey_600_24dp" android:src="@drawable/ic_send_grey_600_24dp"
android:contentDescription="@string/send"/> android:contentDescription="@string/send"/>
</LinearLayout> </LinearLayout>
@ -92,4 +92,4 @@
style="@style/HabiticaButton.Primary" style="@style/HabiticaButton.Primary"
android:text="@string/i_agree_to_follow_the_guidelines"/> android:text="@string/i_agree_to_follow_the_guidelines"/>
</LinearLayout> </LinearLayout>
</merge> </merge>

View file

@ -5,6 +5,7 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_gravity="end" android:layout_gravity="end"
tools:background="?colorPrimary" tools:background="?colorPrimary"
android:focusable="true"
android:clickable="true"> android:clickable="true">
<ImageView <ImageView
@ -23,4 +24,4 @@
android:textColor="@color/white" android:textColor="@color/white"
android:background="@drawable/badge_bg"/> android:background="@drawable/badge_bg"/>
</RelativeLayout> </RelativeLayout>

View file

@ -25,6 +25,7 @@
android:layout_marginBottom="@dimen/spacing_large" android:layout_marginBottom="@dimen/spacing_large"
android:clipChildren="true" android:clipChildren="true"
android:clipToPadding="true" android:clipToPadding="true"
android:focusable="true"
android:clickable="true" android:clickable="true"
android:visibility="gone" android:visibility="gone"
tools:visibility="visible"> tools:visibility="visible">
@ -253,4 +254,4 @@
</LinearLayout> </LinearLayout>
</FrameLayout> </FrameLayout>
</LinearLayout> </LinearLayout>
</androidx.core.widget.NestedScrollView> </androidx.core.widget.NestedScrollView>

View file

@ -34,6 +34,7 @@
android:layout_marginBottom="8dp" android:layout_marginBottom="8dp"
android:background="@drawable/g1g1_box" android:background="@drawable/g1g1_box"
android:clickable="true" android:clickable="true"
android:focusable="true"
android:clipChildren="true" android:clipChildren="true"
android:clipToOutline="true" android:clipToOutline="true"
android:clipToPadding="true" android:clipToPadding="true"
@ -47,7 +48,8 @@
android:layout_alignParentStart="true" android:layout_alignParentStart="true"
android:layout_alignParentTop="true" android:layout_alignParentTop="true"
android:layout_alignParentBottom="false" android:layout_alignParentBottom="false"
android:scaleType="center" /> android:scaleType="center"
android:importantForAccessibility="no" />
<ImageView <ImageView
android:id="@+id/promo_banner_right_image" android:id="@+id/promo_banner_right_image"
@ -55,7 +57,8 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_alignParentTop="true" android:layout_alignParentTop="true"
android:layout_alignParentEnd="true" android:layout_alignParentEnd="true"
android:scaleType="center" /> android:scaleType="center"
android:importantForAccessibility="no" />
<LinearLayout <LinearLayout
android:layout_width="wrap_content" android:layout_width="wrap_content"
@ -114,7 +117,8 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" android:layout_gravity="center_horizontal"
android:layout_marginBottom="20dp" android:layout_marginBottom="20dp"
android:src="@drawable/subscribe_header" /> android:src="@drawable/subscribe_header"
android:importantForAccessibility="no" />
<com.habitrpg.android.habitica.ui.views.subscriptions.SubscriptionDetailsView <com.habitrpg.android.habitica.ui.views.subscriptions.SubscriptionDetailsView
android:id="@+id/subscriptionDetails" android:id="@+id/subscriptionDetails"
@ -140,7 +144,8 @@
android:layout_gravity="center_horizontal" android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp" android:layout_marginTop="20dp"
android:layout_marginBottom="20dp" android:layout_marginBottom="20dp"
android:src="@drawable/separator_fancy" /> android:src="@drawable/separator_fancy"
android:importantForAccessibility="no" />
<com.habitrpg.android.habitica.ui.views.subscriptions.SubscriberBenefitView <com.habitrpg.android.habitica.ui.views.subscriptions.SubscriberBenefitView
android:id="@+id/subscriber_benefits" android:id="@+id/subscriber_benefits"
@ -153,7 +158,8 @@
android:layout_gravity="center" android:layout_gravity="center"
android:layout_marginTop="20dp" android:layout_marginTop="20dp"
android:layout_marginBottom="12dp" android:layout_marginBottom="12dp"
android:src="@drawable/separator_fancy" /> android:src="@drawable/separator_fancy"
android:importantForAccessibility="no" />
<ProgressBar <ProgressBar
android:id="@+id/loadingIndicator" android:id="@+id/loadingIndicator"
@ -253,7 +259,8 @@
android:layout_gravity="center_horizontal" android:layout_gravity="center_horizontal"
android:layout_marginTop="24dp" android:layout_marginTop="24dp"
android:layout_marginBottom="6dp" android:layout_marginBottom="6dp"
android:src="@drawable/gift_sub_gift" /> android:src="@drawable/gift_sub_gift"
android:importantForAccessibility="no" />
<TextView <TextView
android:layout_width="match_parent" android:layout_width="match_parent"

View file

@ -5,6 +5,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
style="@style/RowWrapper" style="@style/RowWrapper"
android:focusable="true"
android:clickable="true"> android:clickable="true">
<com.habitrpg.common.habitica.views.PixelArtView <com.habitrpg.common.habitica.views.PixelArtView
android:id="@+id/imageView" android:id="@+id/imageView"
@ -31,4 +32,4 @@
android:textColor="@color/text_secondary" android:textColor="@color/text_secondary"
style="@style/RowText" /> style="@style/RowText" />
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>

View file

@ -3,6 +3,7 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_width="match_parent" android:layout_width="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:focusable="true"
android:clickable="true" android:clickable="true"
android:id="@+id/background"> android:id="@+id/background">
<View android:layout_height="match_parent" <View android:layout_height="match_parent"

View file

@ -46,7 +46,7 @@
android:id="@+id/more_button" android:id="@+id/more_button"
android:src="@drawable/ic_more_horiz_black_18dp" android:src="@drawable/ic_more_horiz_black_18dp"
android:background="@color/transparent" android:background="@color/transparent"
android:tint="?textColorPrimary" app:tint="?textColorPrimary"
android:layout_width="30dp" android:layout_width="30dp"
android:layout_height="20dp" android:layout_height="20dp"
android:layout_gravity="end"/> android:layout_gravity="end"/>
@ -139,4 +139,4 @@
</TableLayout> </TableLayout>
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" <merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical" android:orientation="vertical"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -48,4 +48,4 @@
android:layout_marginBottom="4dp" android:layout_marginBottom="4dp"
style="@style/Body1" style="@style/Body1"
tools:text="Welcome to the Market! Stock up on new gear or buy rare eggs and potions. Check in periodically for new stock." /> tools:text="Welcome to the Market! Stock up on new gear or buy rare eggs and potions. Check in periodically for new stock." />
</FrameLayout> </merge>

View file

@ -52,6 +52,7 @@
android:layout_marginHorizontal="12dp" android:layout_marginHorizontal="12dp"
android:layout_marginVertical="@dimen/spacing_medium" android:layout_marginVertical="@dimen/spacing_medium"
android:visibility="gone" android:visibility="gone"
android:baselineAligned="false"
android:clipToOutline="true"> android:clipToOutline="true">
<LinearLayout <LinearLayout
android:layout_width="0dp" android:layout_width="0dp"

View file

@ -146,7 +146,8 @@
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="horizontal"> android:orientation="horizontal"
android:baselineAligned="false">
<LinearLayout <LinearLayout
android:id="@+id/months_subscribed_layout" android:id="@+id/months_subscribed_layout"
style="@style/subscriptionBox" style="@style/subscriptionBox"

View file

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!--suppress NavigationFile -->
<navigation xmlns:android="http://schemas.android.com/apk/res/android" <navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"

View file

@ -114,7 +114,7 @@ abstract class HabiticaBaseApplication : Application(), Application.ActivityLife
override fun onCreate() { override fun onCreate() {
super.onCreate() super.onCreate()
lifecycleTracker = ApplicationLifecycleTracker(sharedPrefs) lifecycleTracker = ApplicationLifecycleTracker(sharedPrefs)
ProcessLifecycleOwner.get().lifecycle.addObserver(lifecycleTracker); ProcessLifecycleOwner.get().lifecycle.addObserver(lifecycleTracker)
if (!BuildConfig.DEBUG) { if (!BuildConfig.DEBUG) {
try { try {

View file

@ -15,7 +15,6 @@ import com.habitrpg.android.habitica.models.responses.UnlockResponse
import com.habitrpg.android.habitica.models.social.Group import com.habitrpg.android.habitica.models.social.Group
import com.habitrpg.android.habitica.models.social.GroupMembership import com.habitrpg.android.habitica.models.social.GroupMembership
import com.habitrpg.android.habitica.models.tasks.Task import com.habitrpg.android.habitica.models.tasks.Task
import com.habitrpg.android.habitica.models.user.OwnedItem
import com.habitrpg.android.habitica.models.user.Stats import com.habitrpg.android.habitica.models.user.Stats
import com.habitrpg.android.habitica.models.user.User import com.habitrpg.android.habitica.models.user.User
import com.habitrpg.android.habitica.models.user.UserQuestStatus import com.habitrpg.android.habitica.models.user.UserQuestStatus
@ -196,7 +195,7 @@ class UserRepositoryImpl(
return apiClient.getNews() return apiClient.getNews()
} }
override suspend fun getNewsNotification(): Notification? { override suspend fun getNewsNotification(): Notification {
val baileyNews = apiClient.getNews() val baileyNews = apiClient.getNews()
val baileyAnnouncement = (baileyNews?.first() as Map<*, *>)["title"] as String val baileyAnnouncement = (baileyNews?.first() as Map<*, *>)["title"] as String
val notification = Notification() val notification = Notification()
@ -369,15 +368,15 @@ class UserRepositoryImpl(
} }
} }
} }
if (type == "background") { return if (type == "background") {
apiClient.unlockPath("background.$identifier") apiClient.unlockPath("background.$identifier")
return retrieveUser(false, true) retrieveUser(false, true)
} else { } else {
var updatePath = "preferences.$type" var updatePath = "preferences.$type"
if (category != null) { if (category != null) {
updatePath = "$updatePath.$category" updatePath = "$updatePath.$category"
} }
return updateUser(updatePath, identifier) updateUser(updatePath, identifier)
} }
} }

View file

@ -3,8 +3,6 @@ package com.habitrpg.android.habitica.data.local.implementation
import com.habitrpg.android.habitica.data.local.ContentLocalRepository import com.habitrpg.android.habitica.data.local.ContentLocalRepository
import com.habitrpg.android.habitica.models.ContentResult import com.habitrpg.android.habitica.models.ContentResult
import com.habitrpg.android.habitica.models.WorldState import com.habitrpg.android.habitica.models.WorldState
import com.habitrpg.android.habitica.models.inventory.Quest
import com.habitrpg.android.habitica.models.social.Group
import io.realm.Realm import io.realm.Realm
import io.realm.kotlin.toFlow import io.realm.kotlin.toFlow
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow

View file

@ -184,7 +184,7 @@ class RealmInventoryLocalRepository(realm: Realm) :
return queryUser(userID) return queryUser(userID)
.map { .map {
it?.items?.mounts?.filter { it?.items?.mounts?.filter {
it.owned == true it.owned
} ?: emptyList() } ?: emptyList()
} }
} }
@ -301,7 +301,7 @@ class RealmInventoryLocalRepository(realm: Realm) :
} }
val liveUser = getLiveObject(user) val liveUser = getLiveObject(user)
val ownedItems = liveUser?.items?.special val ownedItems = liveUser?.items?.special
val item = ownedItems?.firstOrNull() { it.key == "inventory_present" } val item = ownedItems?.firstOrNull { it.key == "inventory_present" }
executeTransaction { executeTransaction {
if (item != null && item.isValid) { if (item != null && item.isValid) {
item.numberOwned = item.numberOwned - 1 item.numberOwned = item.numberOwned - 1

View file

@ -1,6 +1,5 @@
package com.habitrpg.android.habitica.extensions package com.habitrpg.android.habitica.extensions
import android.content.DialogInterface
import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog

View file

@ -1,12 +1,5 @@
package com.habitrpg.android.habitica.helpers package com.habitrpg.android.habitica.helpers
import android.app.Activity
import android.content.Context
import android.content.SharedPreferences
import android.provider.Settings
import android.util.Log
import androidx.core.content.edit
import androidx.core.os.bundleOf
/*import com.google.android.gms.ads.AdRequest /*import com.google.android.gms.ads.AdRequest
import com.google.android.gms.ads.LoadAdError import com.google.android.gms.ads.LoadAdError
import com.google.android.gms.ads.MobileAds import com.google.android.gms.ads.MobileAds
@ -15,8 +8,11 @@ import com.google.android.gms.ads.RequestConfiguration
import com.google.android.gms.ads.rewarded.RewardItem import com.google.android.gms.ads.rewarded.RewardItem
import com.google.android.gms.ads.rewarded.RewardedAd import com.google.android.gms.ads.rewarded.RewardedAd
import com.google.android.gms.ads.rewarded.RewardedAdLoadCallback*/ import com.google.android.gms.ads.rewarded.RewardedAdLoadCallback*/
import com.google.firebase.analytics.FirebaseAnalytics import android.app.Activity
import com.google.firebase.crashlytics.FirebaseCrashlytics import android.content.Context
import android.content.SharedPreferences
import android.provider.Settings
import androidx.core.content.edit
import com.habitrpg.android.habitica.BuildConfig import com.habitrpg.android.habitica.BuildConfig
import java.io.UnsupportedEncodingException import java.io.UnsupportedEncodingException
import java.security.MessageDigest import java.security.MessageDigest
@ -108,9 +104,9 @@ class AdHandler(val activity: Activity, val type: AdType, val rewardAction: (Boo
if (currentAdStatus != AdStatus.UNINITIALIZED) return if (currentAdStatus != AdStatus.UNINITIALIZED) return
if (BuildConfig.DEBUG || BuildConfig.TESTING_LEVEL == "staff" || BuildConfig.TESTING_LEVEL == "alpha") { if (BuildConfig.DEBUG || BuildConfig.TESTING_LEVEL == "staff" || BuildConfig.TESTING_LEVEL == "alpha") {
val android_id: String = val androidId: String =
Settings.Secure.getString(context.contentResolver, Settings.Secure.ANDROID_ID) Settings.Secure.getString(context.contentResolver, Settings.Secure.ANDROID_ID)
val deviceId: String = android_id.md5()?.uppercase() ?: "" val deviceId: String = androidId.md5()?.uppercase() ?: ""
//val configuration = RequestConfiguration.Builder().setTestDeviceIds(listOf(deviceId)).build() //val configuration = RequestConfiguration.Builder().setTestDeviceIds(listOf(deviceId)).build()
//MobileAds.setRequestConfiguration(configuration) //MobileAds.setRequestConfiguration(configuration)
} }
@ -208,9 +204,9 @@ class AdHandler(val activity: Activity, val type: AdType, val rewardAction: (Boo
} }
} }
private fun configureReward() { //private fun configureReward() {
//rewardedAd?.run { } //rewardedAd?.run { }
} //}
private fun showRewardedAd() { private fun showRewardedAd() {
if (nextAdAllowedDate(type)?.after(Date()) == true) { if (nextAdAllowedDate(type)?.after(Date()) == true) {

View file

@ -51,12 +51,8 @@ class ReviewManager(context: Context, private val configManager: AppConfigManage
return false return false
} }
if (lastReviewCheckin != -1 && currentCheckins - lastReviewCheckin < 5) { // Less than 5 check-ins since the last review request, wait for more check-ins
// Less than 5 check-ins since the last review request, wait for more check-ins return !(lastReviewCheckin != -1 && currentCheckins - lastReviewCheckin < 5)
return false
}
return true
} }
fun requestReview(activity: AppCompatActivity, currentCheckins: Int) { fun requestReview(activity: AppCompatActivity, currentCheckins: Int) {

View file

@ -47,7 +47,7 @@ class SoundFile(val theme: String, private val fileName: String) {
player?.setVolume(100f, 100f) player?.setVolume(100f, 100f)
player?.isLooping = false player?.isLooping = false
player?.start() player?.start()
} catch (e: IllegalStateException) { } catch (_: IllegalStateException) {
} catch (e: Exception) { } catch (e: Exception) {
ExceptionHandler.reportError(e) ExceptionHandler.reportError(e)
} }

View file

@ -80,7 +80,7 @@ class UserStatComputer {
var itemClass: String? = i.klass var itemClass: String? = i.klass
val itemSpecialClass = i.specialClass val itemSpecialClass = i.specialClass
val classDoesNotExist = itemClass == null || itemClass.isEmpty() val classDoesNotExist = itemClass.isNullOrEmpty()
val specialClassDoesNotExist = itemSpecialClass.isEmpty() val specialClassDoesNotExist = itemSpecialClass.isEmpty()
if (classDoesNotExist && specialClassDoesNotExist) { if (classDoesNotExist && specialClassDoesNotExist) {
@ -93,7 +93,7 @@ class UserStatComputer {
if (!userClassMatchesGearClass && !userClassMatchesGearSpecialClass) classBonus = 0f if (!userClassMatchesGearClass && !userClassMatchesGearSpecialClass) classBonus = 0f
if (itemClass == null || itemClass.isEmpty() || itemClass == "special") { if (itemClass.isNullOrEmpty() || itemClass == "special") {
itemClass = itemSpecialClass itemClass = itemSpecialClass
} }

View file

@ -23,7 +23,7 @@ class GuildInviteLocalNotification(context: Context, identifier: String?) : Habi
val acceptInviteIntent = Intent(context, LocalNotificationActionReceiver::class.java) val acceptInviteIntent = Intent(context, LocalNotificationActionReceiver::class.java)
acceptInviteIntent.action = res.getString(R.string.accept_guild_invite) acceptInviteIntent.action = res.getString(R.string.accept_guild_invite)
val groupID = data.get("groupID") val groupID = data["groupID"]
acceptInviteIntent.putExtra("groupID", groupID) acceptInviteIntent.putExtra("groupID", groupID)
acceptInviteIntent.putExtra("NOTIFICATION_ID", notificationId) acceptInviteIntent.putExtra("NOTIFICATION_ID", notificationId)
val pendingIntentAccept = PendingIntent.getBroadcast( val pendingIntentAccept = PendingIntent.getBroadcast(

View file

@ -18,7 +18,7 @@ class PartyInviteLocalNotification(context: Context, identifier: String?) : Habi
val acceptInviteIntent = Intent(context, LocalNotificationActionReceiver::class.java) val acceptInviteIntent = Intent(context, LocalNotificationActionReceiver::class.java)
acceptInviteIntent.action = res.getString(R.string.accept_party_invite) acceptInviteIntent.action = res.getString(R.string.accept_party_invite)
val groupID = data.get("groupID") val groupID = data["groupID"]
acceptInviteIntent.putExtra("groupID", groupID) acceptInviteIntent.putExtra("groupID", groupID)
acceptInviteIntent.putExtra("NOTIFICATION_ID", notificationId) acceptInviteIntent.putExtra("NOTIFICATION_ID", notificationId)
val pendingIntentAccept = PendingIntent.getBroadcast( val pendingIntentAccept = PendingIntent.getBroadcast(

View file

@ -2,7 +2,4 @@ package com.habitrpg.android.habitica.helpers.notifications
import android.content.Context import android.content.Context
/**
* Created by keithholliday on 7/2/16.
*/
class WonChallengeLocalNotification(context: Context, identifier: String?) : HabiticaLocalNotification(context, identifier) class WonChallengeLocalNotification(context: Context, identifier: String?) : HabiticaLocalNotification(context, identifier)

View file

@ -1,8 +1,6 @@
package com.habitrpg.android.habitica.interactors package com.habitrpg.android.habitica.interactors
import android.content.Context import android.content.Context
import android.graphics.Bitmap
import android.graphics.Canvas
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.clip
import androidx.lifecycle.setViewTreeLifecycleOwner import androidx.lifecycle.setViewTreeLifecycleOwner
@ -13,14 +11,12 @@ import com.habitrpg.android.habitica.data.InventoryRepository
import com.habitrpg.android.habitica.databinding.MountImageviewBinding import com.habitrpg.android.habitica.databinding.MountImageviewBinding
import com.habitrpg.android.habitica.models.inventory.Food import com.habitrpg.android.habitica.models.inventory.Food
import com.habitrpg.android.habitica.models.inventory.Pet import com.habitrpg.android.habitica.models.inventory.Pet
import com.habitrpg.android.habitica.ui.activities.BaseActivity
import com.habitrpg.common.habitica.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.views.BackgroundScene import com.habitrpg.android.habitica.ui.views.BackgroundScene
import com.habitrpg.android.habitica.ui.views.SnackbarActivity import com.habitrpg.android.habitica.ui.views.SnackbarActivity
import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog
import com.habitrpg.common.habitica.extensions.dpToPx
import com.habitrpg.common.habitica.extensions.layoutInflater import com.habitrpg.common.habitica.extensions.layoutInflater
import com.habitrpg.common.habitica.helpers.launchCatching import com.habitrpg.common.habitica.helpers.launchCatching
import com.habitrpg.common.habitica.theme.HabiticaTheme
import com.habitrpg.shared.habitica.models.responses.FeedResponse import com.habitrpg.shared.habitica.models.responses.FeedResponse
import kotlinx.coroutines.MainScope import kotlinx.coroutines.MainScope
import javax.inject.Inject import javax.inject.Inject

View file

@ -30,7 +30,7 @@ constructor(
return inventoryRepository.hatchPet(requestValues.egg, requestValues.potion) { return inventoryRepository.hatchPet(requestValues.egg, requestValues.potion) {
val petWrapper = PetImageviewBinding.inflate(requestValues.context.layoutInflater) val petWrapper = PetImageviewBinding.inflate(requestValues.context.layoutInflater)
val petKey = requestValues.egg.key + "-" + requestValues.potion.key val petKey = requestValues.egg.key + "-" + requestValues.potion.key
petWrapper.petImageview.loadImage("stable_Pet-" + petKey) petWrapper.petImageview.loadImage("stable_Pet-$petKey")
val potionName = requestValues.potion.text val potionName = requestValues.potion.text
val eggName = requestValues.egg.text val eggName = requestValues.egg.text
val currentActivity = val currentActivity =

View file

@ -25,7 +25,7 @@ class ScoreTaskLocallyInteractor {
var nextDelta = 0.9747.pow(currentValue) * if (direction == TaskDirection.DOWN) -1 else 1 var nextDelta = 0.9747.pow(currentValue) * if (direction == TaskDirection.DOWN) -1 else 1
if (task.checklist?.size ?: 0 > 0) { if ((task.checklist?.size ?: 0) > 0) {
if (task.type == TaskType.TODO) { if (task.type == TaskType.TODO) {
nextDelta *= 1 + ( nextDelta *= 1 + (
task.checklist?.map { if (it.completed) 1 else 0 }?.reduce { _, _ -> 0 } task.checklist?.map { if (it.completed) 1 else 0 }?.reduce { _, _ -> 0 }

View file

@ -14,12 +14,10 @@ import androidx.savedstate.setViewTreeSavedStateRegistryOwner
import com.habitrpg.android.habitica.HabiticaBaseApplication import com.habitrpg.android.habitica.HabiticaBaseApplication
import com.habitrpg.android.habitica.databinding.MountImageviewBinding import com.habitrpg.android.habitica.databinding.MountImageviewBinding
import com.habitrpg.android.habitica.ui.activities.BaseActivity import com.habitrpg.android.habitica.ui.activities.BaseActivity
import com.habitrpg.common.habitica.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.views.BackgroundScene import com.habitrpg.android.habitica.ui.views.BackgroundScene
import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog
import com.habitrpg.common.habitica.extensions.dpToPx import com.habitrpg.common.habitica.extensions.dpToPx
import com.habitrpg.common.habitica.extensions.layoutInflater import com.habitrpg.common.habitica.extensions.layoutInflater
import com.habitrpg.common.habitica.extensions.loadImage import com.habitrpg.common.habitica.theme.HabiticaTheme
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
class ShareMountUseCase: UseCase<ShareMountUseCase.RequestValues, Unit>() { class ShareMountUseCase: UseCase<ShareMountUseCase.RequestValues, Unit>() {

View file

@ -1,37 +1,25 @@
package com.habitrpg.android.habitica.interactors package com.habitrpg.android.habitica.interactors
import android.app.Activity
import android.content.Context import android.content.Context
import android.graphics.Bitmap import android.graphics.Bitmap
import android.graphics.Canvas import android.graphics.Canvas
import android.graphics.Rect
import android.os.Build
import android.os.Handler
import android.view.PixelCopy
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.FrameLayout import android.widget.FrameLayout
import androidx.annotation.RequiresApi
import androidx.appcompat.widget.Toolbar
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.clip
import androidx.compose.ui.platform.findViewTreeCompositionContext import androidx.compose.ui.platform.findViewTreeCompositionContext
import androidx.core.view.doOnNextLayout import androidx.core.view.doOnNextLayout
import androidx.core.view.isVisible
import androidx.lifecycle.setViewTreeLifecycleOwner import androidx.lifecycle.setViewTreeLifecycleOwner
import androidx.savedstate.setViewTreeSavedStateRegistryOwner import androidx.savedstate.setViewTreeSavedStateRegistryOwner
import com.habitrpg.android.habitica.HabiticaBaseApplication import com.habitrpg.android.habitica.HabiticaBaseApplication
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.databinding.PetImageviewBinding import com.habitrpg.android.habitica.databinding.PetImageviewBinding
import com.habitrpg.android.habitica.models.inventory.Food
import com.habitrpg.android.habitica.models.inventory.Pet
import com.habitrpg.android.habitica.ui.activities.BaseActivity import com.habitrpg.android.habitica.ui.activities.BaseActivity
import com.habitrpg.common.habitica.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.views.BackgroundScene import com.habitrpg.android.habitica.ui.views.BackgroundScene
import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog
import com.habitrpg.common.habitica.extensions.dpToPx import com.habitrpg.common.habitica.extensions.dpToPx
import com.habitrpg.common.habitica.extensions.layoutInflater import com.habitrpg.common.habitica.extensions.layoutInflater
import com.habitrpg.common.habitica.extensions.loadImage import com.habitrpg.common.habitica.extensions.loadImage
import com.habitrpg.common.habitica.theme.HabiticaTheme
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
class SharePetUseCase: UseCase<SharePetUseCase.RequestValues, Unit>() { class SharePetUseCase: UseCase<SharePetUseCase.RequestValues, Unit>() {

View file

@ -15,9 +15,6 @@ class CustomizationSet {
customization.price?.let { total += it } customization.price?.let { total += it }
} }
} }
if (total >= price) { return total >= price
return true
}
return false
} }
} }

View file

@ -20,6 +20,6 @@ open class QuestBoss : RealmObject(), BaseObject {
val hasRage: Boolean val hasRage: Boolean
get() { get() {
return rage?.value ?: 0.0 > 0.0 return (rage?.value ?: 0.0) > 0.0
} }
} }

View file

@ -64,9 +64,6 @@ open class QuestContent : RealmObject(), Item {
fun hasGifImage(): Boolean { fun hasGifImage(): Boolean {
val gifImageKeys = listOf("lostMasterclasser4") val gifImageKeys = listOf("lostMasterclasser4")
if (gifImageKeys.contains(key)) { return gifImageKeys.contains(key)
return true
}
return false
} }
} }

View file

@ -170,8 +170,7 @@ class GiftOneGetOneHabiticaPromotion(startDate: Date?, endDate: Date?) : Habitic
fragment.binding?.promptButton?.setOnClickListener { fragment.binding?.promptButton?.setOnClickListener {
fragment.context?.let { context -> fragment.context?.let { context ->
SubscriptionFragment.showGiftSubscriptionDialog( SubscriptionFragment.showGiftSubscriptionDialog(
context, context
true
) )
} }
} }

View file

@ -4,9 +4,6 @@ import com.habitrpg.android.habitica.models.user.Items;
import com.habitrpg.android.habitica.models.user.Preferences; import com.habitrpg.android.habitica.models.user.Preferences;
import com.habitrpg.android.habitica.models.user.Purchases; import com.habitrpg.android.habitica.models.user.Purchases;
/**
* Created by viirus on 16/01/16.
*/
public class UnlockResponse { public class UnlockResponse {
public Preferences preferences; public Preferences preferences;

View file

@ -141,7 +141,7 @@ open class Task : RealmObject, BaseMainObject, Parcelable, BaseTask {
fun completeForUser(userID: String?, completed: Boolean) { fun completeForUser(userID: String?, completed: Boolean) {
if (isGroupTask && group?.assignedUsersDetail?.isNotEmpty() == true) { if (isGroupTask && group?.assignedUsersDetail?.isNotEmpty() == true) {
group?.assignedUsersDetail?.firstOrNull { it.assignedUserID == userID }?.completed = completed group?.assignedUsersDetail?.firstOrNull { it.assignedUserID == userID }?.completed = completed
if (group?.assignedUsersDetail?.filter { it.completed != completed }?.isEmpty() == true) { if (group?.assignedUsersDetail?.none { it.completed != completed } == true) {
this.completed = completed this.completed = completed
} }
} else { } else {
@ -436,30 +436,36 @@ open class Task : RealmObject, BaseMainObject, Parcelable, BaseTask {
attribute != task.attribute && attribute != null -> return true attribute != task.attribute && attribute != null -> return true
tags != task.tags -> return true tags != task.tags -> return true
} }
if (type == TaskType.HABIT) { when (type) {
return when { TaskType.HABIT -> {
up != task.up -> true return when {
down != task.down -> true up != task.up -> true
frequency != task.frequency -> true down != task.down -> true
counterUp != task.counterUp -> true frequency != task.frequency -> true
counterDown != task.counterDown -> true counterUp != task.counterUp -> true
else -> false counterDown != task.counterDown -> true
else -> false
}
} }
} else if (type == TaskType.DAILY) { TaskType.DAILY -> {
return when { return when {
startDate != task.startDate -> true startDate != task.startDate -> true
everyX != task.everyX -> true everyX != task.everyX -> true
frequency != task.frequency -> true frequency != task.frequency -> true
repeat != task.repeat -> true repeat != task.repeat -> true
streak != task.streak -> true streak != task.streak -> true
else -> false else -> false
}
}
TaskType.TODO -> {
return (dueDate != task.dueDate && task.dueDate != null)
}
TaskType.REWARD -> {
return value != task.value
}
else -> {
return false
} }
} else if (type == TaskType.TODO) {
return (dueDate != task.dueDate && task.dueDate != null)
} else if (type == TaskType.REWARD) {
return value != task.value
} else {
return false
} }
} }

View file

@ -7,6 +7,4 @@ import dagger.hilt.components.SingletonComponent
// provide proxy class for libraries(to avoid 65k limit) // provide proxy class for libraries(to avoid 65k limit)
@InstallIn(SingletonComponent::class) @InstallIn(SingletonComponent::class)
@Module @Module
open class DeveloperModule { open class DeveloperModule
}

View file

@ -19,9 +19,6 @@ class DeviceCommunicationService : WearableListenerService() {
private val messageClient by lazy { Wearable.getMessageClient(this) } private val messageClient by lazy { Wearable.getMessageClient(this) }
init {
}
override fun onMessageReceived(event: MessageEvent) { override fun onMessageReceived(event: MessageEvent) {
super.onMessageReceived(event) super.onMessageReceived(event)
when (event.path) { when (event.path) {

View file

@ -21,7 +21,7 @@ class RoundedFrameLayout @JvmOverloads constructor(
override fun onDraw(canvas: Canvas) { override fun onDraw(canvas: Canvas) {
clipPath.reset() clipPath.reset()
val radius = if (isCirclular) (canvas.height / 2).toFloat() else radius val radius = if (isCirclular) (height / 2).toFloat() else radius
canvas.getClipBounds(bounds) canvas.getClipBounds(bounds)
clipPath.addRoundRect(bounds.toRectF(), radius, radius, Path.Direction.CW) clipPath.addRoundRect(bounds.toRectF(), radius, radius, Path.Direction.CW)
canvas.clipPath(clipPath) canvas.clipPath(clipPath)

View file

@ -13,7 +13,7 @@ import androidx.lifecycle.lifecycleScope
import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.data.InventoryRepository import com.habitrpg.android.habitica.data.InventoryRepository
import com.habitrpg.android.habitica.databinding.ActivityArmoireBinding import com.habitrpg.android.habitica.databinding.ActivityArmoireBinding
import com.habitrpg.android.habitica.extensions.observeOnce import com.habitrpg.common.habitica.extensions.observeOnce
import com.habitrpg.android.habitica.helpers.AdHandler import com.habitrpg.android.habitica.helpers.AdHandler
import com.habitrpg.android.habitica.helpers.AdType import com.habitrpg.android.habitica.helpers.AdType
import com.habitrpg.android.habitica.helpers.Analytics import com.habitrpg.android.habitica.helpers.Analytics

View file

@ -1,7 +1,5 @@
package com.habitrpg.android.habitica.ui.activities package com.habitrpg.android.habitica.ui.activities
import android.R.attr.bitmap
import android.R.attr.name
import android.content.ContentValues import android.content.ContentValues
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent

View file

@ -12,7 +12,7 @@ import androidx.lifecycle.lifecycleScope
import androidx.navigation.navArgs import androidx.navigation.navArgs
import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.databinding.ActivityClassSelectionBinding import com.habitrpg.android.habitica.databinding.ActivityClassSelectionBinding
import com.habitrpg.android.habitica.extensions.observeOnce import com.habitrpg.common.habitica.extensions.observeOnce
import com.habitrpg.android.habitica.helpers.ReviewManager import com.habitrpg.android.habitica.helpers.ReviewManager
import com.habitrpg.common.habitica.helpers.MainNavigationController import com.habitrpg.common.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.models.user.Gear import com.habitrpg.android.habitica.models.user.Gear

View file

@ -1,12 +1,12 @@
package com.habitrpg.android.habitica.ui.activities package com.habitrpg.android.habitica.ui.activities
import android.annotation.SuppressLint
import android.content.SharedPreferences import android.content.SharedPreferences
import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.BitmapDrawable
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.view.animation.AccelerateInterpolator import android.view.animation.AccelerateInterpolator
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
@ -19,7 +19,6 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextAlign
@ -27,14 +26,13 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import androidx.core.content.edit import androidx.core.content.edit
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.habitrpg.android.habitica.HabiticaApplication
import com.habitrpg.android.habitica.HabiticaBaseApplication import com.habitrpg.android.habitica.HabiticaBaseApplication
import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.data.InventoryRepository import com.habitrpg.android.habitica.data.InventoryRepository
import com.habitrpg.android.habitica.databinding.ActivityDeathBinding import com.habitrpg.android.habitica.databinding.ActivityDeathBinding
import com.habitrpg.android.habitica.extensions.DateUtils import com.habitrpg.android.habitica.extensions.DateUtils
import com.habitrpg.android.habitica.extensions.getShortRemainingString import com.habitrpg.android.habitica.extensions.getShortRemainingString
import com.habitrpg.android.habitica.extensions.observeOnce import com.habitrpg.common.habitica.extensions.observeOnce
import com.habitrpg.android.habitica.helpers.AdHandler import com.habitrpg.android.habitica.helpers.AdHandler
import com.habitrpg.android.habitica.helpers.AdType import com.habitrpg.android.habitica.helpers.AdType
import com.habitrpg.android.habitica.helpers.Analytics import com.habitrpg.android.habitica.helpers.Analytics
@ -52,7 +50,6 @@ import com.habitrpg.common.habitica.helpers.Animations
import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.common.habitica.helpers.ExceptionHandler
import com.habitrpg.common.habitica.helpers.launchCatching import com.habitrpg.common.habitica.helpers.launchCatching
import com.habitrpg.common.habitica.theme.HabiticaTheme import com.habitrpg.common.habitica.theme.HabiticaTheme
import com.habitrpg.common.habitica.views.HabiticaCircularProgressView
import com.plattysoft.leonids.ParticleSystem import com.plattysoft.leonids.ParticleSystem
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.MainScope import kotlinx.coroutines.MainScope
@ -257,6 +254,7 @@ class DeathActivity : BaseActivity(), SnackbarActivity {
.emit(binding.root.width / 2, positionArray[1] + (binding.heartView.height / 2), 3, 6000) .emit(binding.root.width / 2, positionArray[1] + (binding.heartView.height / 2), 3, 6000)
} }
@SuppressLint("MissingSuperCall")
override fun onBackPressed() { override fun onBackPressed() {
moveTaskToBack(true) moveTaskToBack(true)
} }

View file

@ -9,7 +9,7 @@ import android.widget.EditText
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.databinding.ActivityFixcharacterBinding import com.habitrpg.android.habitica.databinding.ActivityFixcharacterBinding
import com.habitrpg.android.habitica.extensions.setTintWith import com.habitrpg.common.habitica.extensions.setTintWith
import com.habitrpg.android.habitica.models.user.Stats import com.habitrpg.android.habitica.models.user.Stats
import com.habitrpg.android.habitica.models.user.User import com.habitrpg.android.habitica.models.user.User
import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel

View file

@ -1,5 +1,6 @@
package com.habitrpg.android.habitica.ui.activities package com.habitrpg.android.habitica.ui.activities
import android.annotation.SuppressLint
import android.content.ClipData import android.content.ClipData
import android.content.ClipboardManager import android.content.ClipboardManager
import android.content.SharedPreferences import android.content.SharedPreferences
@ -28,7 +29,6 @@ import com.habitrpg.android.habitica.data.SocialRepository
import com.habitrpg.android.habitica.databinding.ActivityFullProfileBinding import com.habitrpg.android.habitica.databinding.ActivityFullProfileBinding
import com.habitrpg.android.habitica.extensions.addCancelButton import com.habitrpg.android.habitica.extensions.addCancelButton
import com.habitrpg.android.habitica.helpers.ReviewManager import com.habitrpg.android.habitica.helpers.ReviewManager
import com.habitrpg.common.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.helpers.UserStatComputer import com.habitrpg.android.habitica.helpers.UserStatComputer
import com.habitrpg.android.habitica.interactors.ShareAvatarUseCase import com.habitrpg.android.habitica.interactors.ShareAvatarUseCase
import com.habitrpg.android.habitica.models.Achievement import com.habitrpg.android.habitica.models.Achievement
@ -39,16 +39,16 @@ import com.habitrpg.android.habitica.models.user.Permission
import com.habitrpg.android.habitica.models.user.Stats import com.habitrpg.android.habitica.models.user.Stats
import com.habitrpg.android.habitica.ui.adapter.social.AchievementProfileAdapter import com.habitrpg.android.habitica.ui.adapter.social.AchievementProfileAdapter
import com.habitrpg.android.habitica.ui.fragments.ReportBottomSheetFragment import com.habitrpg.android.habitica.ui.fragments.ReportBottomSheetFragment
import com.habitrpg.common.habitica.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.views.AppHeaderView import com.habitrpg.android.habitica.ui.views.AppHeaderView
import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar
import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar.SnackbarDisplayType import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar.SnackbarDisplayType
import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog
import com.habitrpg.common.habitica.extensions.loadImage import com.habitrpg.common.habitica.extensions.loadImage
import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.common.habitica.helpers.MainNavigationController
import com.habitrpg.common.habitica.helpers.RecyclerViewState import com.habitrpg.common.habitica.helpers.RecyclerViewState
import com.habitrpg.common.habitica.helpers.launchCatching import com.habitrpg.common.habitica.helpers.launchCatching
import com.habitrpg.common.habitica.helpers.setMarkdown import com.habitrpg.common.habitica.helpers.setMarkdown
import com.habitrpg.common.habitica.theme.HabiticaTheme
import com.habitrpg.common.habitica.views.PixelArtView import com.habitrpg.common.habitica.views.PixelArtView
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@ -768,6 +768,7 @@ class FullProfileActivity : BaseActivity() {
return true return true
} }
@SuppressLint("MissingSuperCall")
override fun onBackPressed() { override fun onBackPressed() {
finish() finish()
} }

View file

@ -1,5 +1,6 @@
package com.habitrpg.android.habitica.ui.activities package com.habitrpg.android.habitica.ui.activities
import android.annotation.SuppressLint
import android.app.Activity import android.app.Activity
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
@ -80,6 +81,7 @@ class GroupFormActivity : BaseActivity() {
return true return true
} }
@SuppressLint("MissingSuperCall")
override fun onBackPressed() { override fun onBackPressed() {
finish() finish()
dismissKeyboard() dismissKeyboard()

View file

@ -491,8 +491,6 @@ class LoginActivity : BaseActivity() {
} }
companion object { companion object {
internal const val REQUEST_CODE_PICK_ACCOUNT = 1000
fun show(v: View) { fun show(v: View) {
v.visibility = View.VISIBLE v.visibility = View.VISIBLE
} }

View file

@ -49,8 +49,8 @@ import com.habitrpg.android.habitica.data.InventoryRepository
import com.habitrpg.android.habitica.data.TaskRepository import com.habitrpg.android.habitica.data.TaskRepository
import com.habitrpg.android.habitica.databinding.ActivityMainBinding import com.habitrpg.android.habitica.databinding.ActivityMainBinding
import com.habitrpg.android.habitica.extensions.hideKeyboard import com.habitrpg.android.habitica.extensions.hideKeyboard
import com.habitrpg.android.habitica.extensions.observeOnce import com.habitrpg.common.habitica.extensions.observeOnce
import com.habitrpg.android.habitica.extensions.setScaledPadding import com.habitrpg.common.habitica.extensions.setScaledPadding
import com.habitrpg.android.habitica.extensions.updateStatusBarColor import com.habitrpg.android.habitica.extensions.updateStatusBarColor
import com.habitrpg.android.habitica.helpers.Analytics import com.habitrpg.android.habitica.helpers.Analytics
import com.habitrpg.android.habitica.helpers.AppConfigManager import com.habitrpg.android.habitica.helpers.AppConfigManager

View file

@ -4,7 +4,6 @@ import android.app.Activity
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.view.HapticFeedbackConstants
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.widget.Button import android.widget.Button
@ -22,9 +21,9 @@ import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.data.InventoryRepository import com.habitrpg.android.habitica.data.InventoryRepository
import com.habitrpg.android.habitica.data.SocialRepository import com.habitrpg.android.habitica.data.SocialRepository
import com.habitrpg.android.habitica.databinding.ActivityNotificationsBinding import com.habitrpg.android.habitica.databinding.ActivityNotificationsBinding
import com.habitrpg.android.habitica.extensions.fadeInAnimation import com.habitrpg.common.habitica.extensions.fadeInAnimation
import com.habitrpg.android.habitica.extensions.flash import com.habitrpg.common.habitica.extensions.flash
import com.habitrpg.android.habitica.extensions.observeOnce import com.habitrpg.common.habitica.extensions.observeOnce
import com.habitrpg.android.habitica.helpers.HapticFeedbackManager import com.habitrpg.android.habitica.helpers.HapticFeedbackManager
import com.habitrpg.android.habitica.models.inventory.QuestContent import com.habitrpg.android.habitica.models.inventory.QuestContent
import com.habitrpg.android.habitica.ui.viewmodels.NotificationsViewModel import com.habitrpg.android.habitica.ui.viewmodels.NotificationsViewModel
@ -36,7 +35,6 @@ import com.habitrpg.common.habitica.models.Notification
import com.habitrpg.common.habitica.models.notifications.GroupTaskApprovedData import com.habitrpg.common.habitica.models.notifications.GroupTaskApprovedData
import com.habitrpg.common.habitica.models.notifications.GroupTaskNeedsWorkData import com.habitrpg.common.habitica.models.notifications.GroupTaskNeedsWorkData
import com.habitrpg.common.habitica.models.notifications.GroupTaskRequiresApprovalData import com.habitrpg.common.habitica.models.notifications.GroupTaskRequiresApprovalData
import com.habitrpg.common.habitica.models.notifications.GuildInvitationData
import com.habitrpg.common.habitica.models.notifications.ItemReceivedData import com.habitrpg.common.habitica.models.notifications.ItemReceivedData
import com.habitrpg.common.habitica.models.notifications.NewChatMessageData import com.habitrpg.common.habitica.models.notifications.NewChatMessageData
import com.habitrpg.common.habitica.models.notifications.NewStuffData import com.habitrpg.common.habitica.models.notifications.NewStuffData

View file

@ -62,7 +62,6 @@ class PrefsActivity : BaseActivity(), PreferenceFragmentCompat.OnPreferenceStart
} }
override fun snackbarContainer(): ViewGroup { override fun snackbarContainer(): ViewGroup {
val v = findViewById<ViewGroup>(R.id.snackbar_container) return findViewById(R.id.snackbar_container)
return v
} }
} }

View file

@ -99,7 +99,7 @@ class AchievementsAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
achievementIconView.loadImage(iconName) achievementIconView.loadImage(iconName)
achievementTitleView.text = achievement.title achievementTitleView.text = achievement.title
achievementDescriptionView?.text = achievement.text achievementDescriptionView?.text = achievement.text
if (achievement.optionalCount ?: 0 > 0) { if ((achievement.optionalCount ?: 0) > 0) {
achievementCountView.visibility = View.VISIBLE achievementCountView.visibility = View.VISIBLE
achievementCountView.text = achievement.optionalCount.toString() achievementCountView.text = achievement.optionalCount.toString()
} else { } else {

View file

@ -22,7 +22,7 @@ import java.util.Date
import java.util.EnumMap import java.util.EnumMap
import kotlin.math.min import kotlin.math.min
class CustomizationRecyclerViewAdapter() : androidx.recyclerview.widget.RecyclerView.Adapter<androidx.recyclerview.widget.RecyclerView.ViewHolder>() { class CustomizationRecyclerViewAdapter : androidx.recyclerview.widget.RecyclerView.Adapter<androidx.recyclerview.widget.RecyclerView.ViewHolder>() {
var userSize: String? = null var userSize: String? = null
var hairColor: String? = null var hairColor: String? = null
@ -34,9 +34,6 @@ class CustomizationRecyclerViewAdapter() : androidx.recyclerview.widget.Recycler
private var customizationList: MutableList<Any> = ArrayList() private var customizationList: MutableList<Any> = ArrayList()
var additionalSetItems: List<Customization> = ArrayList() var additionalSetItems: List<Customization> = ArrayList()
var activeCustomization: String? = null var activeCustomization: String? = null
set(value) {
field = value
}
var ownedCustomizations: List<String> = listOf() var ownedCustomizations: List<String> = listOf()
private var pinnedItemKeys: List<String> = ArrayList() private var pinnedItemKeys: List<String> = ArrayList()

View file

@ -10,7 +10,7 @@ import com.habitrpg.android.habitica.extensions.inflate
class SimpleSpinnerAdapter(context: Context, resource: Int) : ArrayAdapter<CharSequence>(context, resource, R.id.textView, context.resources.getTextArray(resource)) { class SimpleSpinnerAdapter(context: Context, resource: Int) : ArrayAdapter<CharSequence>(context, resource, R.id.textView, context.resources.getTextArray(resource)) {
override fun getDropDownView(position: Int, convertView: View?, parent: ViewGroup): View? { override fun getDropDownView(position: Int, convertView: View?, parent: ViewGroup): View {
val view = parent.inflate(R.layout.spinner_item, false) ?: View(context) val view = parent.inflate(R.layout.spinner_item, false) ?: View(context)
(view as? TextView)?.text = getItem(position) (view as? TextView)?.text = getItem(position)
return view return view

View file

@ -103,7 +103,7 @@ class SkillsRecyclerViewAdapter : RecyclerView.Adapter<SkillsRecyclerViewAdapter
} }
binding.buttonIconView.setImageDrawable(magicDrawable) binding.buttonIconView.setImageDrawable(magicDrawable)
if (skill.mana ?: 0 > mana) { if ((skill.mana ?: 0) > mana) {
binding.buttonWrapper.setBackgroundColor(ContextCompat.getColor(context, R.color.offset_background)) binding.buttonWrapper.setBackgroundColor(ContextCompat.getColor(context, R.color.offset_background))
binding.buttonIconView.alpha = 0.3f binding.buttonIconView.alpha = 0.3f
binding.priceLabel.alpha = 0.3f binding.priceLabel.alpha = 0.3f
@ -131,7 +131,7 @@ class SkillsRecyclerViewAdapter : RecyclerView.Adapter<SkillsRecyclerViewAdapter
} }
private fun getOwnedCount(key: String): Int { private fun getOwnedCount(key: String): Int {
return specialItems?.firstOrNull() { it.key == key }?.numberOwned ?: 0 return specialItems?.firstOrNull { it.key == key }?.numberOwned ?: 0
} }
} }
} }

View file

@ -117,9 +117,9 @@ class ItemRecyclerAdapter(val context: Context) : BaseRecyclerViewAdapter<BaseMa
notifyDataSetChanged() notifyDataSetChanged()
} }
inner class ShopAdViewHolder(val binding: ShopAdBinding): RecyclerView.ViewHolder(binding.root) inner class ShopAdViewHolder(val binding: ShopAdBinding): ViewHolder(binding.root)
inner class ItemViewHolder(val binding: ItemItemBinding) : RecyclerView.ViewHolder(binding.root), View.OnClickListener { inner class ItemViewHolder(val binding: ItemItemBinding) : ViewHolder(binding.root), View.OnClickListener {
private var ownedItem: OwnedItem? = null private var ownedItem: OwnedItem? = null
var item: Item? = null var item: Item? = null

View file

@ -9,7 +9,7 @@ import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.data.SetupCustomizationRepository import com.habitrpg.android.habitica.data.SetupCustomizationRepository
import com.habitrpg.android.habitica.databinding.SetupCustomizationItemBinding import com.habitrpg.android.habitica.databinding.SetupCustomizationItemBinding
import com.habitrpg.android.habitica.extensions.inflate import com.habitrpg.android.habitica.extensions.inflate
import com.habitrpg.android.habitica.extensions.setTintWith import com.habitrpg.common.habitica.extensions.setTintWith
import com.habitrpg.android.habitica.models.SetupCustomization import com.habitrpg.android.habitica.models.SetupCustomization
import com.habitrpg.android.habitica.models.user.User import com.habitrpg.android.habitica.models.user.User
@ -113,10 +113,8 @@ internal class CustomizationSetupAdapter : RecyclerView.Adapter<CustomizationSet
override fun onClick(v: View) { override fun onClick(v: View) {
customization?.let { selectedCustomization -> customization?.let { selectedCustomization ->
if (selectedCustomization.path == "glasses") { if (selectedCustomization.path == "glasses") {
val key = if (selectedCustomization.key.isEmpty()) { val key = selectedCustomization.key.ifEmpty {
user?.items?.gear?.equipped?.eyeWear user?.items?.gear?.equipped?.eyeWear
} else {
selectedCustomization.key
} }
key?.let { onEquipGear?.invoke(it) } key?.let { onEquipGear?.invoke(it) }
} else { } else {

View file

@ -11,7 +11,7 @@ import androidx.recyclerview.widget.RecyclerView
import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat
import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.extensions.inflate import com.habitrpg.android.habitica.extensions.inflate
import com.habitrpg.android.habitica.extensions.setTintWith import com.habitrpg.common.habitica.extensions.setTintWith
class TaskSetupAdapter : RecyclerView.Adapter<TaskSetupAdapter.TaskViewHolder>() { class TaskSetupAdapter : RecyclerView.Adapter<TaskSetupAdapter.TaskViewHolder>() {

View file

@ -30,7 +30,7 @@ abstract class BaseMainFragment<VB : ViewBinding> : BaseFragment<VB>() {
protected var showsBackButton: Boolean = false protected var showsBackButton: Boolean = false
open val mainActivity get() = getActivity() as? MainActivity open val mainActivity get() = activity as? MainActivity
val tabLayout get() = mainActivity?.binding?.content?.detailTabs val tabLayout get() = mainActivity?.binding?.content?.detailTabs
val collapsingToolbar get() = mainActivity?.binding?.content?.toolbar val collapsingToolbar get() = mainActivity?.binding?.content?.toolbar
val toolbarAccessoryContainer get() = mainActivity?.binding?.content?.toolbarAccessoryContainer val toolbarAccessoryContainer get() = mainActivity?.binding?.content?.toolbarAccessoryContainer

View file

@ -734,7 +734,6 @@ class NavigationDrawerFragment : DialogFragment() {
} }
} }
@OptIn(ExperimentalTime::class)
fun updatePromo() { fun updatePromo() {
activePromo = configManager.activePromo() activePromo = configManager.activePromo()
val promoItem = getItemWithIdentifier(SIDEBAR_PROMO) ?: return val promoItem = getItemWithIdentifier(SIDEBAR_PROMO) ?: return

View file

@ -46,7 +46,7 @@ class ReportBottomSheetFragment : BottomSheetDialogFragment() {
inflater: LayoutInflater, inflater: LayoutInflater,
container: ViewGroup?, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View? { ): View {
binding = FragmentReportMessageBinding.inflate(inflater, container, false) binding = FragmentReportMessageBinding.inflate(inflater, container, false)
return binding.root return binding.root
} }

View file

@ -10,7 +10,7 @@ import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.data.InventoryRepository import com.habitrpg.android.habitica.data.InventoryRepository
import com.habitrpg.android.habitica.databinding.FragmentStatsBinding import com.habitrpg.android.habitica.databinding.FragmentStatsBinding
import com.habitrpg.android.habitica.extensions.addOkButton import com.habitrpg.android.habitica.extensions.addOkButton
import com.habitrpg.android.habitica.extensions.setScaledPadding import com.habitrpg.common.habitica.extensions.setScaledPadding
import com.habitrpg.android.habitica.helpers.UserStatComputer import com.habitrpg.android.habitica.helpers.UserStatComputer
import com.habitrpg.android.habitica.models.user.Stats import com.habitrpg.android.habitica.models.user.Stats
import com.habitrpg.android.habitica.models.user.User import com.habitrpg.android.habitica.models.user.User
@ -110,9 +110,9 @@ class StatsFragment : BaseMainFragment<FragmentStatsBinding>() {
userViewModel.user.observe(viewLifecycleOwner) { user -> userViewModel.user.observe(viewLifecycleOwner) { user ->
if (user == null) return@observe if (user == null) return@observe
canAllocatePoints = canAllocatePoints =
user.stats?.lvl ?: 0 >= 10 && user.stats?.points ?: 0 > 0 (user.stats?.lvl ?: 0) >= 10 && (user.stats?.points ?: 0) > 0
binding?.unlockAtLevel?.visibility = binding?.unlockAtLevel?.visibility =
if (user.stats?.lvl ?: 0 < 10) View.VISIBLE else View.GONE if ((user.stats?.lvl ?: 0) < 10) View.VISIBLE else View.GONE
updateStats(user) updateStats(user)
updateAttributePoints(user) updateAttributePoints(user)
} }

View file

@ -24,7 +24,7 @@ import com.habitrpg.android.habitica.data.CustomizationRepository
import com.habitrpg.android.habitica.data.InventoryRepository import com.habitrpg.android.habitica.data.InventoryRepository
import com.habitrpg.android.habitica.databinding.BottomSheetBackgroundsFilterBinding import com.habitrpg.android.habitica.databinding.BottomSheetBackgroundsFilterBinding
import com.habitrpg.android.habitica.databinding.FragmentRefreshRecyclerviewBinding import com.habitrpg.android.habitica.databinding.FragmentRefreshRecyclerviewBinding
import com.habitrpg.android.habitica.extensions.setTintWith import com.habitrpg.common.habitica.extensions.setTintWith
import com.habitrpg.android.habitica.helpers.Analytics import com.habitrpg.android.habitica.helpers.Analytics
import com.habitrpg.android.habitica.models.CustomizationFilter import com.habitrpg.android.habitica.models.CustomizationFilter
import com.habitrpg.android.habitica.models.inventory.Customization import com.habitrpg.android.habitica.models.inventory.Customization

View file

@ -24,25 +24,23 @@ import androidx.compose.ui.draw.alpha
import androidx.compose.ui.platform.ViewCompositionStrategy import androidx.compose.ui.platform.ViewCompositionStrategy
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.core.graphics.scale
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.map import androidx.lifecycle.map
import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.data.InventoryRepository import com.habitrpg.android.habitica.data.InventoryRepository
import com.habitrpg.android.habitica.databinding.FragmentComposeScrollingBinding import com.habitrpg.android.habitica.databinding.FragmentComposeScrollingBinding
import com.habitrpg.android.habitica.interactors.ShareAvatarUseCase import com.habitrpg.android.habitica.interactors.ShareAvatarUseCase
import com.habitrpg.common.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.models.inventory.Equipment import com.habitrpg.android.habitica.models.inventory.Equipment
import com.habitrpg.android.habitica.ui.activities.BaseActivity import com.habitrpg.android.habitica.ui.activities.BaseActivity
import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment
import com.habitrpg.android.habitica.ui.theme.colors import com.habitrpg.android.habitica.ui.theme.colors
import com.habitrpg.common.habitica.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel
import com.habitrpg.android.habitica.ui.views.SegmentedControl import com.habitrpg.android.habitica.ui.views.SegmentedControl
import com.habitrpg.android.habitica.ui.views.equipment.AvatarCustomizationOverviewView import com.habitrpg.android.habitica.ui.views.equipment.AvatarCustomizationOverviewView
import com.habitrpg.android.habitica.ui.views.equipment.EquipmentOverviewView import com.habitrpg.android.habitica.ui.views.equipment.EquipmentOverviewView
import com.habitrpg.common.habitica.helpers.MainNavigationController
import com.habitrpg.common.habitica.helpers.launchCatching import com.habitrpg.common.habitica.helpers.launchCatching
import com.habitrpg.common.habitica.views.AvatarView import com.habitrpg.common.habitica.theme.HabiticaTheme
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.firstOrNull
import javax.inject.Inject import javax.inject.Inject

View file

@ -11,7 +11,7 @@ import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.data.InventoryRepository import com.habitrpg.android.habitica.data.InventoryRepository
import com.habitrpg.android.habitica.databinding.FragmentRefreshRecyclerviewBinding import com.habitrpg.android.habitica.databinding.FragmentRefreshRecyclerviewBinding
import com.habitrpg.android.habitica.extensions.observeOnce import com.habitrpg.common.habitica.extensions.observeOnce
import com.habitrpg.android.habitica.helpers.ReviewManager import com.habitrpg.android.habitica.helpers.ReviewManager
import com.habitrpg.common.habitica.helpers.MainNavigationController import com.habitrpg.common.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.ui.adapter.inventory.EquipmentRecyclerViewAdapter import com.habitrpg.android.habitica.ui.adapter.inventory.EquipmentRecyclerViewAdapter
@ -97,7 +97,7 @@ class EquipmentDetailFragment :
binding?.recyclerView?.adapter = this.adapter binding?.recyclerView?.adapter = this.adapter
binding?.recyclerView?.layoutManager = LinearLayoutManager(mainActivity) binding?.recyclerView?.layoutManager = LinearLayoutManager(mainActivity)
binding?.recyclerView?.addItemDecoration(DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL)) binding?.recyclerView?.addItemDecoration(DividerItemDecoration(activity, DividerItemDecoration.VERTICAL))
binding?.recyclerView?.itemAnimator = SafeDefaultItemAnimator() binding?.recyclerView?.itemAnimator = SafeDefaultItemAnimator()
type?.let { type -> type?.let { type ->

View file

@ -12,7 +12,7 @@ import com.habitrpg.android.habitica.data.SocialRepository
import com.habitrpg.android.habitica.data.UserRepository import com.habitrpg.android.habitica.data.UserRepository
import com.habitrpg.android.habitica.databinding.FragmentItemsDialogBinding import com.habitrpg.android.habitica.databinding.FragmentItemsDialogBinding
import com.habitrpg.android.habitica.extensions.addCloseButton import com.habitrpg.android.habitica.extensions.addCloseButton
import com.habitrpg.android.habitica.extensions.observeOnce import com.habitrpg.common.habitica.extensions.observeOnce
import com.habitrpg.android.habitica.helpers.Analytics import com.habitrpg.android.habitica.helpers.Analytics
import com.habitrpg.android.habitica.helpers.EventCategory import com.habitrpg.android.habitica.helpers.EventCategory
import com.habitrpg.android.habitica.helpers.HitType import com.habitrpg.android.habitica.helpers.HitType

View file

@ -16,7 +16,7 @@ import com.habitrpg.android.habitica.data.SocialRepository
import com.habitrpg.android.habitica.data.UserRepository import com.habitrpg.android.habitica.data.UserRepository
import com.habitrpg.android.habitica.databinding.FragmentItemsBinding import com.habitrpg.android.habitica.databinding.FragmentItemsBinding
import com.habitrpg.android.habitica.extensions.addCloseButton import com.habitrpg.android.habitica.extensions.addCloseButton
import com.habitrpg.android.habitica.extensions.observeOnce import com.habitrpg.common.habitica.extensions.observeOnce
import com.habitrpg.android.habitica.helpers.Analytics import com.habitrpg.android.habitica.helpers.Analytics
import com.habitrpg.android.habitica.helpers.EventCategory import com.habitrpg.android.habitica.helpers.EventCategory
import com.habitrpg.android.habitica.helpers.HitType import com.habitrpg.android.habitica.helpers.HitType

View file

@ -9,7 +9,7 @@ import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.data.InventoryRepository import com.habitrpg.android.habitica.data.InventoryRepository
import com.habitrpg.android.habitica.databinding.FragmentRefreshRecyclerviewBinding import com.habitrpg.android.habitica.databinding.FragmentRefreshRecyclerviewBinding
import com.habitrpg.android.habitica.extensions.observeOnce import com.habitrpg.common.habitica.extensions.observeOnce
import com.habitrpg.android.habitica.helpers.ReviewManager import com.habitrpg.android.habitica.helpers.ReviewManager
import com.habitrpg.android.habitica.interactors.FeedPetUseCase import com.habitrpg.android.habitica.interactors.FeedPetUseCase
import com.habitrpg.android.habitica.models.inventory.Egg import com.habitrpg.android.habitica.models.inventory.Egg
@ -99,7 +99,7 @@ class PetDetailRecyclerFragment :
} }
binding?.refreshLayout?.setOnRefreshListener(this) binding?.refreshLayout?.setOnRefreshListener(this)
layoutManager = androidx.recyclerview.widget.GridLayoutManager(getActivity(), 4) layoutManager = androidx.recyclerview.widget.GridLayoutManager(activity, 4)
layoutManager?.spanSizeLookup = layoutManager?.spanSizeLookup =
object : androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup() { object : androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup() {
override fun getSpanSize(position: Int): Int { override fun getSpanSize(position: Int): Int {

View file

@ -17,13 +17,11 @@ import androidx.core.view.isVisible
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.preference.EditTextPreference import androidx.preference.EditTextPreference
import androidx.preference.Preference import androidx.preference.Preference
import com.google.android.material.textfield.TextInputLayout
import com.habitrpg.android.habitica.HabiticaBaseApplication import com.habitrpg.android.habitica.HabiticaBaseApplication
import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.data.ApiClient import com.habitrpg.android.habitica.data.ApiClient
import com.habitrpg.android.habitica.extensions.addCancelButton import com.habitrpg.android.habitica.extensions.addCancelButton
import com.habitrpg.android.habitica.extensions.addCloseButton import com.habitrpg.android.habitica.extensions.addCloseButton
import com.habitrpg.common.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.models.user.User import com.habitrpg.android.habitica.models.user.User
import com.habitrpg.android.habitica.ui.activities.FixCharacterValuesActivity import com.habitrpg.android.habitica.ui.activities.FixCharacterValuesActivity
import com.habitrpg.android.habitica.ui.fragments.preferences.HabiticaAccountDialog.AccountUpdateConfirmed import com.habitrpg.android.habitica.ui.fragments.preferences.HabiticaAccountDialog.AccountUpdateConfirmed
@ -39,6 +37,7 @@ import com.habitrpg.common.habitica.api.HostConfig
import com.habitrpg.common.habitica.extensions.dpToPx import com.habitrpg.common.habitica.extensions.dpToPx
import com.habitrpg.common.habitica.extensions.layoutInflater import com.habitrpg.common.habitica.extensions.layoutInflater
import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.common.habitica.helpers.ExceptionHandler
import com.habitrpg.common.habitica.helpers.MainNavigationController
import com.habitrpg.common.habitica.helpers.launchCatching import com.habitrpg.common.habitica.helpers.launchCatching
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@ -350,7 +349,7 @@ class AccountPreferenceFragment :
} else { } else {
dialog.setTitle(R.string.add_password) dialog.setTitle(R.string.add_password)
} }
dialog.addButton(R.string.add, true, false, false) { dialog, _ -> dialog.addButton(R.string.add, true, false, false) { _, _ ->
KeyboardUtil.dismissKeyboard(activity) KeyboardUtil.dismissKeyboard(activity)
emailEditText?.showErrorIfNecessary() emailEditText?.showErrorIfNecessary()
passwordEditText?.showErrorIfNecessary() passwordEditText?.showErrorIfNecessary()
@ -386,8 +385,7 @@ class AccountPreferenceFragment :
emailEditText?.text = user?.authentication?.localAuthentication?.email emailEditText?.text = user?.authentication?.localAuthentication?.email
emailEditText?.validator = { PatternsCompat.EMAIL_ADDRESS.matcher(it ?: "").matches() } emailEditText?.validator = { PatternsCompat.EMAIL_ADDRESS.matcher(it ?: "").matches() }
emailEditText?.errorText = getString(R.string.email_invalid) emailEditText?.errorText = getString(R.string.email_invalid)
view?.findViewById<TextInputLayout>(R.id.input_layout)?.hint = emailEditText?.hint = context?.getString(R.string.email)
context?.getString(R.string.email)
val passwordEditText = view?.findViewById<ValidatingEditText>(R.id.password_edit_text) val passwordEditText = view?.findViewById<ValidatingEditText>(R.id.password_edit_text)
if (user?.authentication?.hasPassword != true) { if (user?.authentication?.hasPassword != true) {
passwordEditText?.isVisible = false passwordEditText?.isVisible = false
@ -395,7 +393,7 @@ class AccountPreferenceFragment :
context?.let { context -> context?.let { context ->
val dialog = HabiticaAlertDialog(context) val dialog = HabiticaAlertDialog(context)
dialog.setTitle(R.string.change_email) dialog.setTitle(R.string.change_email)
dialog.addButton(R.string.change, true, false, false) { dialog, _ -> dialog.addButton(R.string.change, true, false, false) { _, _ ->
KeyboardUtil.dismissKeyboard(activity) KeyboardUtil.dismissKeyboard(activity)
emailEditText?.showErrorIfNecessary() emailEditText?.showErrorIfNecessary()
if (emailEditText?.isValid != true) return@addButton if (emailEditText?.isValid != true) return@addButton
@ -445,11 +443,11 @@ class AccountPreferenceFragment :
editText?.text = value editText?.text = value
editText?.validator = validator editText?.validator = validator
editText?.errorText = getString(R.string.username_requirements) editText?.errorText = getString(R.string.username_requirements)
view?.findViewById<TextInputLayout>(R.id.input_layout)?.hint = title editText?.hint = title
context?.let { context -> context?.let { context ->
val dialog = HabiticaAlertDialog(context) val dialog = HabiticaAlertDialog(context)
dialog.setTitle(title) dialog.setTitle(title)
dialog.addButton(R.string.save, true, autoDismiss = false) { dialog, _ -> dialog.addButton(R.string.save, true, autoDismiss = false) { _, _ ->
KeyboardUtil.dismissKeyboard(activity) KeyboardUtil.dismissKeyboard(activity)
editText?.showErrorIfNecessary() editText?.showErrorIfNecessary()
if (editText?.isValid != true) return@addButton if (editText?.isValid != true) return@addButton

View file

@ -143,7 +143,7 @@ class PreferencesFragment :
showAsBottomSheet { dismiss -> showAsBottomSheet { dismiss ->
PauseResumeDamageView(user?.preferences?.sleep ?: true, { PauseResumeDamageView(user?.preferences?.sleep ?: true, {
lifecycleScope.launchCatching { lifecycleScope.launchCatching {
user?.let { it -> userRepository.sleep(it) } user?.let { userRepository.sleep(it) }
dismiss() dismiss()
} }
}) })
@ -239,11 +239,13 @@ class PreferencesFragment :
val alert = context?.let { HabiticaAlertDialog(it) } val alert = context?.let { HabiticaAlertDialog(it) }
alert?.setTitle(R.string.push_notification_system_settings_title) alert?.setTitle(R.string.push_notification_system_settings_title)
alert?.setMessage(R.string.push_notification_system_settings_description) alert?.setMessage(R.string.push_notification_system_settings_description)
alert?.addButton(R.string.open_settings, true, false) { _, _ -> if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val notifSettingIntent: Intent = Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS) alert?.addButton(R.string.open_settings, true, false) { _, _ ->
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) val notifSettingIntent: Intent = Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS)
.putExtra(Settings.EXTRA_APP_PACKAGE, context?.applicationContext?.packageName) .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(notifSettingIntent) .putExtra(Settings.EXTRA_APP_PACKAGE, context?.applicationContext?.packageName)
startActivity(notifSettingIntent)
}
} }
alert?.addButton(R.string.cancel, false) { _, _ -> alert?.addButton(R.string.cancel, false) { _, _ ->
alert.dismiss() alert.dismiss()

View file

@ -1,9 +1,7 @@
package com.habitrpg.android.habitica.ui.fragments.purchases package com.habitrpg.android.habitica.ui.fragments.purchases
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import com.android.billingclient.api.ProductDetails import com.android.billingclient.api.ProductDetails
import com.habitrpg.android.habitica.data.SocialRepository import com.habitrpg.android.habitica.data.SocialRepository
@ -47,10 +45,6 @@ class GiftPurchaseGemsFragment : BaseFragment<FragmentGiftGemPurchaseBinding>()
private var purchaseHandler: PurchaseHandler? = null private var purchaseHandler: PurchaseHandler? = null
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
}
fun setupCheckout() { fun setupCheckout() {
CoroutineScope(Dispatchers.IO).launch(ExceptionHandler.coroutine()) { CoroutineScope(Dispatchers.IO).launch(ExceptionHandler.coroutine()) {
val skus = purchaseHandler?.getAllGemSKUs() val skus = purchaseHandler?.getAllGemSKUs()

View file

@ -16,13 +16,11 @@ import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.data.InventoryRepository import com.habitrpg.android.habitica.data.InventoryRepository
import com.habitrpg.android.habitica.data.UserRepository import com.habitrpg.android.habitica.data.UserRepository
import com.habitrpg.android.habitica.databinding.FragmentBottomsheetSubscriptionBinding import com.habitrpg.android.habitica.databinding.FragmentBottomsheetSubscriptionBinding
import com.habitrpg.android.habitica.helpers.Analytics
import com.habitrpg.android.habitica.helpers.AppConfigManager import com.habitrpg.android.habitica.helpers.AppConfigManager
import com.habitrpg.android.habitica.helpers.PurchaseHandler import com.habitrpg.android.habitica.helpers.PurchaseHandler
import com.habitrpg.android.habitica.helpers.PurchaseTypes import com.habitrpg.android.habitica.helpers.PurchaseTypes
import com.habitrpg.android.habitica.models.user.User import com.habitrpg.android.habitica.models.user.User
import com.habitrpg.android.habitica.ui.views.subscriptions.SubscriptionOptionView import com.habitrpg.android.habitica.ui.views.subscriptions.SubscriptionOptionView
import com.habitrpg.common.habitica.extensions.loadImage
import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.common.habitica.helpers.ExceptionHandler
import com.habitrpg.common.habitica.helpers.MainNavigationController import com.habitrpg.common.habitica.helpers.MainNavigationController
import com.habitrpg.common.habitica.helpers.launchCatching import com.habitrpg.common.habitica.helpers.launchCatching
@ -72,7 +70,7 @@ open class SubscriptionBottomSheetFragment : BottomSheetDialogFragment() {
MainNavigationController.navigate(R.id.subscriptionPurchaseActivity) MainNavigationController.navigate(R.id.subscriptionPurchaseActivity)
} }
binding.subscribeButton.setOnClickListener { purchaseSubscription() } binding.subscribeButton.setOnClickListener { purchaseSubscription() }
binding.subscriptionDisclaimerView?.setMarkdown("Once weve confirmed your purchase, the payment will be charged to your Google Account.\n\nSubscriptions automatically renew unless auto-renewal is turned off at least 24-hours before the end of the current period. If you have an active subscription, your account will be charged for renewal within 24-hours prior to the end of your current subscription period and you will be charged the same price you initially paid.\n\nBy continuing you accept the [Terms of Use](https://habitica.com/static/terms) and [Privacy Policy](https://habitica.com/static/privacy).") binding.subscriptionDisclaimerView.setMarkdown("Once weve confirmed your purchase, the payment will be charged to your Google Account.\n\nSubscriptions automatically renew unless auto-renewal is turned off at least 24-hours before the end of the current period. If you have an active subscription, your account will be charged for renewal within 24-hours prior to the end of your current subscription period and you will be charged the same price you initially paid.\n\nBy continuing you accept the [Terms of Use](https://habitica.com/static/terms) and [Privacy Policy](https://habitica.com/static/privacy).")
lifecycleScope.launchCatching { lifecycleScope.launchCatching {
userRepository.getUser().collect { user -> userRepository.getUser().collect { user ->

View file

@ -13,13 +13,11 @@ import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle import androidx.lifecycle.repeatOnLifecycle
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import com.habitrpg.android.habitica.MainNavDirections
import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.data.SocialRepository import com.habitrpg.android.habitica.data.SocialRepository
import com.habitrpg.android.habitica.databinding.FragmentChatBinding import com.habitrpg.android.habitica.databinding.FragmentChatBinding
import com.habitrpg.android.habitica.extensions.observeOnce import com.habitrpg.common.habitica.extensions.observeOnce
import com.habitrpg.android.habitica.helpers.AppConfigManager import com.habitrpg.android.habitica.helpers.AppConfigManager
import com.habitrpg.common.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.models.social.ChatMessage import com.habitrpg.android.habitica.models.social.ChatMessage
import com.habitrpg.android.habitica.ui.activities.FullProfileActivity import com.habitrpg.android.habitica.ui.activities.FullProfileActivity
import com.habitrpg.android.habitica.ui.activities.MainActivity import com.habitrpg.android.habitica.ui.activities.MainActivity

View file

@ -16,13 +16,11 @@ import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle import androidx.lifecycle.repeatOnLifecycle
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.habitrpg.android.habitica.MainNavDirections
import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.data.SocialRepository import com.habitrpg.android.habitica.data.SocialRepository
import com.habitrpg.android.habitica.databinding.FragmentInboxMessageListBinding import com.habitrpg.android.habitica.databinding.FragmentInboxMessageListBinding
import com.habitrpg.android.habitica.extensions.addOkButton import com.habitrpg.android.habitica.extensions.addOkButton
import com.habitrpg.android.habitica.helpers.AppConfigManager import com.habitrpg.android.habitica.helpers.AppConfigManager
import com.habitrpg.common.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.models.social.ChatMessage import com.habitrpg.android.habitica.models.social.ChatMessage
import com.habitrpg.android.habitica.ui.activities.FullProfileActivity import com.habitrpg.android.habitica.ui.activities.FullProfileActivity
import com.habitrpg.android.habitica.ui.activities.MainActivity import com.habitrpg.android.habitica.ui.activities.MainActivity
@ -75,7 +73,7 @@ class InboxMessageListFragment : BaseMainFragment<FragmentInboxMessageListBindin
showsBackButton = true showsBackButton = true
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
val layoutManager = androidx.recyclerview.widget.LinearLayoutManager(this.getActivity()) val layoutManager = androidx.recyclerview.widget.LinearLayoutManager(this.activity)
layoutManager.reverseLayout = true layoutManager.reverseLayout = true
layoutManager.stackFromEnd = false layoutManager.stackFromEnd = false
binding?.recyclerView?.layoutManager = layoutManager binding?.recyclerView?.layoutManager = layoutManager
@ -193,10 +191,10 @@ class InboxMessageListFragment : BaseMainFragment<FragmentInboxMessageListBindin
} }
private fun copyMessageToClipboard(chatMessage: ChatMessage) { private fun copyMessageToClipboard(chatMessage: ChatMessage) {
val clipMan = getActivity()?.getSystemService(Context.CLIPBOARD_SERVICE) as? ClipboardManager val clipMan = activity?.getSystemService(Context.CLIPBOARD_SERVICE) as? ClipboardManager
val messageText = ClipData.newPlainText("Chat message", chatMessage.text) val messageText = ClipData.newPlainText("Chat message", chatMessage.text)
clipMan?.setPrimaryClip(messageText) clipMan?.setPrimaryClip(messageText)
val activity = getActivity() as? MainActivity val activity = activity as? MainActivity
if (activity != null && Build.VERSION.SDK_INT <= Build.VERSION_CODES.S_V2) { if (activity != null && Build.VERSION.SDK_INT <= Build.VERSION_CODES.S_V2) {
showSnackbar(activity.snackbarContainer, getString(R.string.chat_message_copied), HabiticaSnackbar.SnackbarDisplayType.NORMAL) showSnackbar(activity.snackbarContainer, getString(R.string.chat_message_copied), HabiticaSnackbar.SnackbarDisplayType.NORMAL)
} }

View file

@ -256,14 +256,14 @@ class QuestDetailFragment : BaseMainFragment<FragmentQuestDetailBinding>() {
HapticFeedbackManager.tap(requireView()) HapticFeedbackManager.tap(requireView())
context?.let { context?.let {
if (isQuestActive) { if (isQuestActive) {
val builder = AlertDialog.Builder(getActivity()) val builder = AlertDialog.Builder(activity)
.setMessage(R.string.quest_abort_message) .setMessage(R.string.quest_abort_message)
.setPositiveButton(R.string.yes) { _, _ -> .setPositiveButton(R.string.yes) { _, _ ->
party?.id?.let { partyID -> party?.id?.let { partyID ->
lifecycleScope.launchCatching { lifecycleScope.launchCatching {
socialRepository.abortQuest(partyID) socialRepository.abortQuest(partyID)
userRepository.retrieveUser(true) userRepository.retrieveUser(true)
getActivity()?.supportFragmentManager?.popBackStack() activity?.supportFragmentManager?.popBackStack()
} }
} }
}.setNegativeButton(R.string.no) { _, _ -> } }.setNegativeButton(R.string.no) { _, _ -> }
@ -276,7 +276,7 @@ class QuestDetailFragment : BaseMainFragment<FragmentQuestDetailBinding>() {
lifecycleScope.launchCatching { lifecycleScope.launchCatching {
socialRepository.cancelQuest(partyID) socialRepository.cancelQuest(partyID)
userRepository.retrieveUser(true) userRepository.retrieveUser(true)
getActivity()?.supportFragmentManager?.popBackStack() activity?.supportFragmentManager?.popBackStack()
} }
} }
} }
@ -288,7 +288,7 @@ class QuestDetailFragment : BaseMainFragment<FragmentQuestDetailBinding>() {
private fun onQuestLeave() { private fun onQuestLeave() {
HapticFeedbackManager.tap(requireView()) HapticFeedbackManager.tap(requireView())
val builder = AlertDialog.Builder(getActivity()) val builder = AlertDialog.Builder(activity)
.setMessage(if (quest?.active == true) R.string.quest_leave_message else R.string.quest_leave_message_nostart) .setMessage(if (quest?.active == true) R.string.quest_leave_message else R.string.quest_leave_message_nostart)
.setPositiveButton(R.string.yes) { _, _ -> .setPositiveButton(R.string.yes) { _, _ ->
party?.id?.let { partyID -> party?.id?.let { partyID ->
@ -296,7 +296,7 @@ class QuestDetailFragment : BaseMainFragment<FragmentQuestDetailBinding>() {
socialRepository.leaveQuest(partyID) socialRepository.leaveQuest(partyID)
socialRepository.retrieveGroup(partyID) socialRepository.retrieveGroup(partyID)
userRepository.retrieveUser(true) userRepository.retrieveUser(true)
getActivity()?.supportFragmentManager?.popBackStack() activity?.supportFragmentManager?.popBackStack()
} }
} }
}.setNegativeButton(R.string.no) { _, _ -> } }.setNegativeButton(R.string.no) { _, _ -> }

View file

@ -175,7 +175,7 @@ class ChallengeDetailFragment : BaseMainFragment<FragmentChallengeDetailBinding>
override fun onOptionsItemSelected(item: MenuItem): Boolean { override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) { when (item.itemId) {
R.id.action_edit -> { R.id.action_edit -> {
val intent = Intent(getActivity(), ChallengeFormActivity::class.java) val intent = Intent(activity, ChallengeFormActivity::class.java)
val bundle = Bundle() val bundle = Bundle()
bundle.putString(ChallengeFormActivity.CHALLENGE_ID_KEY, challengeID) bundle.putString(ChallengeFormActivity.CHALLENGE_ID_KEY, challengeID)
intent.putExtras(bundle) intent.putExtras(bundle)

View file

@ -50,8 +50,8 @@ internal class ChallengeFilterDialogHolder private constructor(
private fun fillChallengeGroups() { private fun fillChallengeGroups() {
binding.challengeFilterRecyclerView.layoutManager = LinearLayoutManager(context) binding.challengeFilterRecyclerView.layoutManager = LinearLayoutManager(context)
adapter = ChallengesFilterRecyclerViewAdapter(filterGroups) adapter = ChallengesFilterRecyclerViewAdapter(filterGroups)
if (currentFilter != null && currentFilter?.showByGroups != null) { currentFilter?.let { currentFilter ->
adapter?.checkedEntries?.addAll(currentFilter?.showByGroups ?: emptyList()) adapter?.checkedEntries?.addAll(currentFilter.showByGroups)
} }
binding.challengeFilterRecyclerView.adapter = adapter binding.challengeFilterRecyclerView.adapter = adapter

View file

@ -85,7 +85,7 @@ class ChallengesOverviewFragment : BaseMainFragment<FragmentViewpagerBinding>()
override fun onOptionsItemSelected(item: MenuItem): Boolean { override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) { when (item.itemId) {
R.id.action_create_challenge -> { R.id.action_create_challenge -> {
val intent = Intent(getActivity(), ChallengeFormActivity::class.java) val intent = Intent(activity, ChallengeFormActivity::class.java)
startActivity(intent) startActivity(intent)
return true return true
} }

View file

@ -19,8 +19,8 @@ import com.habitrpg.android.habitica.data.InventoryRepository
import com.habitrpg.android.habitica.data.TaskRepository import com.habitrpg.android.habitica.data.TaskRepository
import com.habitrpg.android.habitica.data.UserRepository import com.habitrpg.android.habitica.data.UserRepository
import com.habitrpg.android.habitica.databinding.FragmentRefreshRecyclerviewBinding import com.habitrpg.android.habitica.databinding.FragmentRefreshRecyclerviewBinding
import com.habitrpg.android.habitica.extensions.observeOnce import com.habitrpg.common.habitica.extensions.observeOnce
import com.habitrpg.android.habitica.extensions.setScaledPadding import com.habitrpg.common.habitica.extensions.setScaledPadding
import com.habitrpg.android.habitica.helpers.AppConfigManager import com.habitrpg.android.habitica.helpers.AppConfigManager
import com.habitrpg.android.habitica.helpers.HapticFeedbackManager import com.habitrpg.android.habitica.helpers.HapticFeedbackManager
import com.habitrpg.common.habitica.helpers.MainNavigationController import com.habitrpg.common.habitica.helpers.MainNavigationController
@ -70,7 +70,7 @@ open class TaskRecyclerViewFragment :
private var taskFlowJob: Job? = null private var taskFlowJob: Job? = null
val viewModel: TasksViewModel by viewModels({ requireParentFragment() }) val viewModel: TasksViewModel by viewModels({ requireParentFragment() })
internal var canScoreTaks: Boolean = true internal var canScoreTasks: Boolean = true
override var binding: FragmentRefreshRecyclerviewBinding? = null override var binding: FragmentRefreshRecyclerviewBinding? = null
override fun createBinding( override fun createBinding(
@ -162,7 +162,7 @@ open class TaskRecyclerViewFragment :
} }
viewModel.ownerID.observe(viewLifecycleOwner) { viewModel.ownerID.observe(viewLifecycleOwner) {
canScoreTaks = viewModel.isPersonalBoard canScoreTasks = viewModel.isPersonalBoard
updateTaskSubscription(it) updateTaskSubscription(it)
} }
lifecycleScope.launch { lifecycleScope.launch {
@ -324,7 +324,7 @@ open class TaskRecyclerViewFragment :
} }
// Factor in if adventure guide is shown. // Factor in if adventure guide is shown.
if (recyclerAdapter?.showAdventureGuide == true) { if (recyclerAdapter?.showAdventureGuide == true) {
newPosition = newPosition - 1 newPosition -= 1
} }
lifecycleScope.launchCatching { lifecycleScope.launchCatching {
taskRepository.updateTaskPosition( taskRepository.updateTaskPosition(

View file

@ -23,7 +23,7 @@ import androidx.viewpager2.widget.ViewPager2
import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.data.TagRepository import com.habitrpg.android.habitica.data.TagRepository
import com.habitrpg.android.habitica.databinding.FragmentViewpagerBinding import com.habitrpg.android.habitica.databinding.FragmentViewpagerBinding
import com.habitrpg.android.habitica.extensions.setTintWith import com.habitrpg.common.habitica.extensions.setTintWith
import com.habitrpg.android.habitica.helpers.Analytics import com.habitrpg.android.habitica.helpers.Analytics
import com.habitrpg.android.habitica.helpers.EventCategory import com.habitrpg.android.habitica.helpers.EventCategory
import com.habitrpg.android.habitica.helpers.HitType import com.habitrpg.android.habitica.helpers.HitType

View file

@ -26,7 +26,7 @@ import androidx.appcompat.view.menu.ActionMenuItemView
import androidx.appcompat.widget.ActionMenuView import androidx.appcompat.widget.ActionMenuView
import androidx.appcompat.widget.Toolbar import androidx.appcompat.widget.Toolbar
import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.extensions.waitForLayout import com.habitrpg.common.habitica.extensions.waitForLayout
import com.habitrpg.common.habitica.extensions.getThemeColor import com.habitrpg.common.habitica.extensions.getThemeColor
/** /**

View file

@ -13,7 +13,7 @@ import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.databinding.ChatItemBinding import com.habitrpg.android.habitica.databinding.ChatItemBinding
import com.habitrpg.android.habitica.databinding.TavernChatIntroItemBinding import com.habitrpg.android.habitica.databinding.TavernChatIntroItemBinding
import com.habitrpg.android.habitica.extensions.getAgoString import com.habitrpg.android.habitica.extensions.getAgoString
import com.habitrpg.android.habitica.extensions.setScaledPadding import com.habitrpg.common.habitica.extensions.setScaledPadding
import com.habitrpg.android.habitica.models.members.Member import com.habitrpg.android.habitica.models.members.Member
import com.habitrpg.android.habitica.models.social.ChatMessage import com.habitrpg.android.habitica.models.social.ChatMessage
import com.habitrpg.android.habitica.models.user.Permission import com.habitrpg.android.habitica.models.user.Permission

View file

@ -10,11 +10,8 @@ import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.databinding.MountOverviewItemBinding import com.habitrpg.android.habitica.databinding.MountOverviewItemBinding
import com.habitrpg.android.habitica.extensions.inflate import com.habitrpg.android.habitica.extensions.inflate
import com.habitrpg.android.habitica.models.inventory.Mount import com.habitrpg.android.habitica.models.inventory.Mount
import com.habitrpg.android.habitica.ui.menu.BottomSheetMenu
import com.habitrpg.android.habitica.ui.menu.BottomSheetMenuItem
import com.habitrpg.android.habitica.ui.views.showAsBottomSheet import com.habitrpg.android.habitica.ui.views.showAsBottomSheet
import com.habitrpg.android.habitica.ui.views.stable.MountBottomSheet import com.habitrpg.android.habitica.ui.views.stable.MountBottomSheet
import com.habitrpg.android.habitica.ui.views.stable.PetBottomSheet
import com.habitrpg.common.habitica.extensions.DataBindingUtils import com.habitrpg.common.habitica.extensions.DataBindingUtils
import dagger.hilt.android.internal.managers.ViewComponentManager import dagger.hilt.android.internal.managers.ViewComponentManager

View file

@ -27,7 +27,7 @@ import kotlinx.coroutines.MainScope
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
abstract class BaseTaskViewHolder constructor( abstract class BaseTaskViewHolder(
itemView: View, itemView: View,
var scoreTaskFunc: ((Task, TaskDirection) -> Unit), var scoreTaskFunc: ((Task, TaskDirection) -> Unit),
var openTaskFunc: ((Pair<Task, View>) -> Unit), var openTaskFunc: ((Pair<Task, View>) -> Unit),

View file

@ -37,8 +37,8 @@ class InboxViewModel @Inject constructor(
userViewModel: MainUserViewModel, userViewModel: MainUserViewModel,
val socialRepository: SocialRepository val socialRepository: SocialRepository
) : BaseViewModel(userRepository, userViewModel) { ) : BaseViewModel(userRepository, userViewModel) {
val recipientID: String? = savedStateHandle.get("userID") val recipientID: String? = savedStateHandle["userID"]
val recipientUsername: String? = savedStateHandle.get("username") val recipientUsername: String? = savedStateHandle["username"]
private var memberIDFlow = MutableStateFlow<String?>(null) private var memberIDFlow = MutableStateFlow<String?>(null)
val memberIDState: StateFlow<String?> = memberIDFlow val memberIDState: StateFlow<String?> = memberIDFlow
@ -54,7 +54,6 @@ class InboxViewModel @Inject constructor(
.filterNotNull() .filterNotNull()
.flatMapLatest { socialRepository.retrieveMember(it).toFlow() } .flatMapLatest { socialRepository.retrieveMember(it).toFlow() }
.asLiveData() .asLiveData()
fun getMemberData(): LiveData<Member?> = member
fun setMemberID(memberID: String) { fun setMemberID(memberID: String) {
if (memberID == memberIDState.value) return if (memberID == memberIDState.value) return

View file

@ -70,10 +70,6 @@ class MainUserViewModel @Inject constructor(private val authenticationHandler: A
} }
.asLiveData() .asLiveData()
fun onCleared() {
userRepository.close()
}
fun updateUser(path: String, value: Any) { fun updateUser(path: String, value: Any) {
MainScope().launch(ExceptionHandler.coroutine()) { MainScope().launch(ExceptionHandler.coroutine()) {
userRepository.updateUser(path, value) userRepository.updateUser(path, value)

View file

@ -102,7 +102,7 @@ class StableViewModel @Inject constructor(
var lastSection: StableSection? = null var lastSection: StableSection? = null
for (animal in unsortedAnimals) { for (animal in unsortedAnimals) {
val identifier = if (animal.animal.isNotEmpty() && (animal.type != "special" && animal.type != "wacky")) animal.animal else animal.key val identifier = if (animal.animal.isNotEmpty() && (animal.type != "special" && animal.type != "wacky")) animal.animal else animal.key
val lastIdentifier = if (lastAnimal.animal.isNotEmpty()) lastAnimal.animal else lastAnimal.key val lastIdentifier = lastAnimal.animal.ifEmpty { lastAnimal.key }
if (animal.type == "premium") { if (animal.type == "premium") {
if (!items.contains(lastAnimal)) { if (!items.contains(lastAnimal)) {
items.add(lastAnimal) items.add(lastAnimal)

View file

@ -102,7 +102,6 @@ fun getTranslatedClassName(resources : Resources, className : String?) : String
} }
} }
@OptIn(ExperimentalAnimationApi::class)
@Composable @Composable
fun AppHeaderView( fun AppHeaderView(
user : Avatar?, user : Avatar?,

View file

@ -4,14 +4,12 @@ import android.app.Activity
import android.view.ViewGroup import android.view.ViewGroup
import androidx.activity.compose.BackHandler import androidx.activity.compose.BackHandler
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.border
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.MaterialTheme
import androidx.compose.material.ModalBottomSheetLayout import androidx.compose.material.ModalBottomSheetLayout
import androidx.compose.material.ModalBottomSheetValue import androidx.compose.material.ModalBottomSheetValue
import androidx.compose.material.rememberModalBottomSheetState import androidx.compose.material.rememberModalBottomSheetState

View file

@ -427,9 +427,7 @@ open class DragLinearLayout @JvmOverloads constructor(context: Context, attrs: A
val absTop = top - startScrollY + currentTop val absTop = top - startScrollY + currentTop
val height = containerScrollView!!.height val height = containerScrollView!!.height
val delta: Int val delta: Int = when {
delta = when {
absTop < scrollSensitiveHeight -> { absTop < scrollSensitiveHeight -> {
(-MAX_DRAG_SCROLL_SPEED * smootherStep(scrollSensitiveHeight.toFloat(), 0f, absTop.toFloat())).toInt() (-MAX_DRAG_SCROLL_SPEED * smootherStep(scrollSensitiveHeight.toFloat(), 0f, absTop.toFloat())).toInt()
} }

View file

@ -6,7 +6,7 @@ import android.util.AttributeSet
import android.widget.TextView import android.widget.TextView
import androidx.preference.ListPreference import androidx.preference.ListPreference
import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.extensions.setScaledPadding import com.habitrpg.common.habitica.extensions.setScaledPadding
class HabiticaListPreference : ListPreference { class HabiticaListPreference : ListPreference {
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) :

View file

@ -6,9 +6,6 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.view.animation.AccelerateInterpolator import android.view.animation.AccelerateInterpolator
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.TextView
import androidx.annotation.ColorInt import androidx.annotation.ColorInt
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.view.ViewCompat import androidx.core.view.ViewCompat

View file

@ -21,7 +21,7 @@ class NPCBannerView(context: Context, attrs: AttributeSet?) : FrameLayout(contex
var shopSpriteSuffix: String? = null var shopSpriteSuffix: String? = null
set(value) { set(value) {
field = if (value == null || value.isEmpty() || value.startsWith("_")) { field = if (value.isNullOrEmpty() || value.startsWith("_")) {
value value
} else { } else {
"_$value" "_$value"

View file

@ -1,6 +1,5 @@
package com.habitrpg.android.habitica.ui.views package com.habitrpg.android.habitica.ui.views
import android.graphics.Bitmap
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.ImageBitmap import androidx.compose.ui.graphics.ImageBitmap

View file

@ -11,7 +11,7 @@ import androidx.compose.material.MaterialTheme
import androidx.compose.material.OutlinedButton import androidx.compose.material.OutlinedButton
import androidx.compose.material.Text import androidx.compose.material.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
@ -38,7 +38,7 @@ fun SegmentedControl(
cornerRadius: Int = 10, cornerRadius: Int = 10,
onItemSelection: (selectedItemIndex: Int) -> Unit onItemSelection: (selectedItemIndex: Int) -> Unit
) { ) {
val selectedIndex = remember { mutableStateOf(defaultSelectedItemIndex) } val selectedIndex = remember { mutableIntStateOf(defaultSelectedItemIndex) }
val color = MaterialTheme.colors.primary val color = MaterialTheme.colors.primary
Row( Row(
modifier = Modifier modifier = Modifier

View file

@ -24,7 +24,7 @@ class Typewriter : androidx.appcompat.widget.AppCompatTextView {
private var delay: Long = 30 private var delay: Long = 30
val isAnimating: Boolean val isAnimating: Boolean
get() = index < stringBuilder?.length ?: 0 get() = index < (stringBuilder?.length ?: 0)
constructor(context: Context) : super(context) { constructor(context: Context) : super(context) {
setupTextColors(context) setupTextColors(context)

Some files were not shown because too many files have changed in this diff Show more