diff --git a/Habitica/build.gradle b/Habitica/build.gradle index 8669c7e7e..1b07c5fdb 100644 --- a/Habitica/build.gradle +++ b/Habitica/build.gradle @@ -2,6 +2,7 @@ plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' id 'kotlin-kapt' + id 'dagger.hilt.android.plugin' id 'com.google.gms.google-services' id 'com.google.firebase.crashlytics' @@ -34,8 +35,8 @@ dependencies { implementation "com.squareup.retrofit2:converter-gson:$retrofit_version" //Dependency Injection - implementation "com.google.dagger:dagger:$daggerhilt_version" - kapt "com.google.dagger:dagger-compiler:$daggerhilt_version" + implementation "com.google.dagger:hilt-android:$daggerhilt_version" + kapt "com.google.dagger:hilt-compiler:$daggerhilt_version" compileOnly 'javax.annotation:javax.annotation-api:1.3.2' //App Compatibility and Material Design implementation "androidx.appcompat:appcompat:$appcompat_version" diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml index bbb43442a..7ba8677c8 100644 --- a/Habitica/res/values/strings.xml +++ b/Habitica/res/values/strings.xml @@ -1168,6 +1168,7 @@ Apple Not connected Add password + Not Set Connect Disconnect Add diff --git a/Habitica/src/debug/java/com/habitrpg/android/habitica/HabiticaApplication.java b/Habitica/src/debug/java/com/habitrpg/android/habitica/HabiticaApplication.java index 8dc72304f..afc43c2c9 100644 --- a/Habitica/src/debug/java/com/habitrpg/android/habitica/HabiticaApplication.java +++ b/Habitica/src/debug/java/com/habitrpg/android/habitica/HabiticaApplication.java @@ -5,12 +5,4 @@ import com.habitrpg.android.habitica.components.DaggerAppComponent; import com.habitrpg.android.habitica.modules.AppModule; public class HabiticaApplication extends HabiticaBaseApplication { - - @Override - protected AppComponent initDagger() { - return DaggerAppComponent.builder() - .appModule(new AppModule(this)) - .developerModule(new DebugDeveloperModule()) - .build(); - } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaBaseApplication.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaBaseApplication.kt index 7e62d18ed..b60edd96f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaBaseApplication.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaBaseApplication.kt @@ -23,14 +23,10 @@ import com.google.firebase.analytics.FirebaseAnalytics import com.google.firebase.installations.FirebaseInstallations import com.google.firebase.remoteconfig.FirebaseRemoteConfig import com.google.firebase.remoteconfig.FirebaseRemoteConfigSettings -import com.habitrpg.android.habitica.components.AppComponent -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.ApiClient import com.habitrpg.android.habitica.helpers.AdHandler import com.habitrpg.android.habitica.helpers.AmplitudeManager import com.habitrpg.android.habitica.helpers.notifications.PushNotificationManager -import com.habitrpg.android.habitica.modules.UserModule -import com.habitrpg.android.habitica.modules.UserRepositoryModule import com.habitrpg.android.habitica.ui.activities.BaseActivity import com.habitrpg.android.habitica.ui.activities.LoginActivity import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper @@ -40,13 +36,14 @@ import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.common.habitica.helpers.LanguageHelper import com.habitrpg.common.habitica.helpers.MarkdownParser import com.habitrpg.common.habitica.helpers.launchCatching +import dagger.hilt.android.HiltAndroidApp import io.realm.Realm import io.realm.RealmConfiguration import kotlinx.coroutines.MainScope import java.lang.ref.WeakReference import javax.inject.Inject -// contains all HabiticaApplicationLogic except dagger componentInitialisation +@HiltAndroidApp abstract class HabiticaBaseApplication : Application(), Application.ActivityLifecycleCallbacks { @Inject internal lateinit var lazyApiHelper: ApiClient @@ -71,7 +68,6 @@ abstract class HabiticaBaseApplication : Application(), Application.ActivityLife } registerActivityLifecycleCallbacks(this) setupRealm() - setupDagger() setLocale() setupRemoteConfig() setupNotifications() @@ -150,14 +146,6 @@ abstract class HabiticaBaseApplication : Application(), Application.ActivityLife } } - private fun setupDagger() { - component = initDagger() - reloadUserComponent() - component?.inject(this) - } - - protected abstract fun initDagger(): AppComponent - override fun openOrCreateDatabase( name: String, mode: Int, @@ -240,12 +228,6 @@ abstract class HabiticaBaseApplication : Application(), Application.ActivityLife } companion object { - - var component: AppComponent? = null - private set - - var userComponent: UserComponent? = null - fun getInstance(context: Context): HabiticaBaseApplication? { return context.applicationContext as? HabiticaBaseApplication } @@ -268,17 +250,12 @@ abstract class HabiticaBaseApplication : Application(), Application.ActivityLife putString("theme_mode", lightMode) putString("launch_screen", launchScreen) } - reloadUserComponent() getInstance(context)?.lazyApiHelper?.updateAuthenticationCredentials(null, null) Wearable.getCapabilityClient(context).removeLocalCapability("provide_auth") startActivity(LoginActivity::class.java, context) } } - fun reloadUserComponent() { - userComponent = component?.plus(UserModule(), UserRepositoryModule()) - } - private fun startActivity(activityClass: Class<*>, context: Context) { val intent = Intent(context, activityClass) intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java b/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java deleted file mode 100644 index a67649a8c..000000000 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.habitrpg.android.habitica.components; - -import com.habitrpg.android.habitica.HabiticaBaseApplication; -import com.habitrpg.android.habitica.modules.ApiModule; -import com.habitrpg.android.habitica.modules.AppModule; -import com.habitrpg.android.habitica.modules.DeveloperModule; -import com.habitrpg.android.habitica.modules.RepositoryModule; -import com.habitrpg.android.habitica.modules.UserModule; -import com.habitrpg.android.habitica.modules.UserRepositoryModule; - -import javax.inject.Singleton; - -import dagger.Component; - -@Singleton -@Component(modules = {DeveloperModule.class, AppModule.class, ApiModule.class, RepositoryModule.class}) -public interface AppComponent { - - UserComponent plus(UserModule userModule, UserRepositoryModule userRepositoryModule); - - void inject(HabiticaBaseApplication habiticaBaseApplication); -} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.kt new file mode 100644 index 000000000..b2e6ba145 --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.kt @@ -0,0 +1,19 @@ +package com.habitrpg.android.habitica.components + +import com.habitrpg.android.habitica.modules.ApiModule +import com.habitrpg.android.habitica.modules.AppModule +import com.habitrpg.android.habitica.modules.DeveloperModule +import com.habitrpg.android.habitica.modules.RepositoryModule +import com.habitrpg.android.habitica.modules.UserModule +import com.habitrpg.android.habitica.modules.UserRepositoryModule +import dagger.Component +import javax.inject.Singleton + +@Singleton +@Component(modules = [DeveloperModule::class, AppModule::class, ApiModule::class, RepositoryModule::class]) +interface AppComponent { + fun plus( + userModule : UserModule?, + userRepositoryModule : UserRepositoryModule? + ) : UserComponent? +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/components/UserComponent.java b/Habitica/src/main/java/com/habitrpg/android/habitica/components/UserComponent.java deleted file mode 100644 index 749d8dbaf..000000000 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/components/UserComponent.java +++ /dev/null @@ -1,388 +0,0 @@ -package com.habitrpg.android.habitica.components; - -import com.habitrpg.android.habitica.HabiticaBaseApplication; -import com.habitrpg.android.habitica.data.ApiClient; -import com.habitrpg.android.habitica.helpers.SoundManager; -import com.habitrpg.android.habitica.helpers.UserScope; -import com.habitrpg.android.habitica.helpers.notifications.HabiticaFirebaseMessagingService; -import com.habitrpg.android.habitica.helpers.notifications.PushNotificationManager; -import com.habitrpg.android.habitica.modules.UserModule; -import com.habitrpg.android.habitica.modules.UserRepositoryModule; -import com.habitrpg.android.habitica.receivers.DeviceCommunicationService; -import com.habitrpg.android.habitica.receivers.LocalNotificationActionReceiver; -import com.habitrpg.android.habitica.receivers.NotificationPublisher; -import com.habitrpg.android.habitica.receivers.TaskAlarmBootReceiver; -import com.habitrpg.android.habitica.receivers.TaskReceiver; -import com.habitrpg.android.habitica.ui.activities.AdventureGuideActivity; -import com.habitrpg.android.habitica.ui.activities.ArmoireActivity; -import com.habitrpg.android.habitica.ui.activities.BirthdayActivity; -import com.habitrpg.android.habitica.ui.activities.ChallengeFormActivity; -import com.habitrpg.android.habitica.ui.activities.ClassSelectionActivity; -import com.habitrpg.android.habitica.ui.activities.DeathActivity; -import com.habitrpg.android.habitica.ui.activities.FixCharacterValuesActivity; -import com.habitrpg.android.habitica.ui.activities.FullProfileActivity; -import com.habitrpg.android.habitica.ui.activities.GemPurchaseActivity; -import com.habitrpg.android.habitica.ui.activities.GiftGemsActivity; -import com.habitrpg.android.habitica.ui.activities.GiftSubscriptionActivity; -import com.habitrpg.android.habitica.ui.activities.GroupFormActivity; -import com.habitrpg.android.habitica.ui.activities.GroupInviteActivity; -import com.habitrpg.android.habitica.ui.activities.GuidelinesActivity; -import com.habitrpg.android.habitica.ui.activities.HabitButtonWidgetActivity; -import com.habitrpg.android.habitica.ui.activities.IntroActivity; -import com.habitrpg.android.habitica.ui.activities.LoginActivity; -import com.habitrpg.android.habitica.ui.activities.MainActivity; -import com.habitrpg.android.habitica.ui.activities.MaintenanceActivity; -import com.habitrpg.android.habitica.ui.activities.NotificationsActivity; -import com.habitrpg.android.habitica.ui.activities.PrefsActivity; -import com.habitrpg.android.habitica.ui.activities.ReportMessageActivity; -import com.habitrpg.android.habitica.ui.activities.SetupActivity; -import com.habitrpg.android.habitica.ui.activities.SkillMemberActivity; -import com.habitrpg.android.habitica.ui.activities.SkillTasksActivity; -import com.habitrpg.android.habitica.ui.activities.TaskFormActivity; -import com.habitrpg.android.habitica.ui.activities.TaskSummaryActivity; -import com.habitrpg.android.habitica.ui.activities.TaskSummaryViewModel; -import com.habitrpg.android.habitica.ui.adapter.social.challenges.ChallengeTasksRecyclerViewAdapter; -import com.habitrpg.android.habitica.ui.adapter.tasks.DailiesRecyclerViewHolder; -import com.habitrpg.android.habitica.ui.adapter.tasks.HabitsRecyclerViewAdapter; -import com.habitrpg.android.habitica.ui.adapter.tasks.RewardsRecyclerViewAdapter; -import com.habitrpg.android.habitica.ui.adapter.tasks.TodosRecyclerViewAdapter; -import com.habitrpg.android.habitica.ui.fragments.AboutFragment; -import com.habitrpg.android.habitica.ui.fragments.AchievementsFragment; -import com.habitrpg.android.habitica.ui.fragments.NavigationDrawerFragment; -import com.habitrpg.android.habitica.ui.fragments.NewsFragment; -import com.habitrpg.android.habitica.ui.fragments.PromoInfoFragment; -import com.habitrpg.android.habitica.ui.fragments.PromoWebFragment; -import com.habitrpg.android.habitica.ui.fragments.StatsFragment; -import com.habitrpg.android.habitica.ui.fragments.inventory.customization.AvatarCustomizationFragment; -import com.habitrpg.android.habitica.ui.fragments.inventory.customization.AvatarEquipmentFragment; -import com.habitrpg.android.habitica.ui.fragments.inventory.customization.AvatarOverviewFragment; -import com.habitrpg.android.habitica.ui.fragments.inventory.equipment.EquipmentDetailFragment; -import com.habitrpg.android.habitica.ui.fragments.inventory.items.ItemDialogFragment; -import com.habitrpg.android.habitica.ui.fragments.inventory.items.ItemRecyclerFragment; -import com.habitrpg.android.habitica.ui.fragments.inventory.items.ItemsFragment; -import com.habitrpg.android.habitica.ui.fragments.inventory.shops.ShopFragment; -import com.habitrpg.android.habitica.ui.fragments.inventory.stable.MountDetailRecyclerFragment; -import com.habitrpg.android.habitica.ui.fragments.inventory.stable.PetDetailRecyclerFragment; -import com.habitrpg.android.habitica.ui.fragments.inventory.stable.StableFragment; -import com.habitrpg.android.habitica.ui.fragments.inventory.stable.StableRecyclerFragment; -import com.habitrpg.android.habitica.ui.fragments.preferences.AccountPreferenceFragment; -import com.habitrpg.android.habitica.ui.fragments.preferences.EmailNotificationsPreferencesFragment; -import com.habitrpg.android.habitica.ui.fragments.preferences.PreferencesFragment; -import com.habitrpg.android.habitica.ui.fragments.preferences.PushNotificationsPreferencesFragment; -import com.habitrpg.android.habitica.ui.fragments.purchases.GemsPurchaseFragment; -import com.habitrpg.android.habitica.ui.fragments.purchases.GiftBalanceGemsFragment; -import com.habitrpg.android.habitica.ui.fragments.purchases.GiftPurchaseGemsFragment; -import com.habitrpg.android.habitica.ui.fragments.purchases.SubscriptionFragment; -import com.habitrpg.android.habitica.ui.fragments.setup.AvatarSetupFragment; -import com.habitrpg.android.habitica.ui.fragments.setup.IntroFragment; -import com.habitrpg.android.habitica.ui.fragments.setup.TaskSetupFragment; -import com.habitrpg.android.habitica.ui.fragments.setup.WelcomeFragment; -import com.habitrpg.android.habitica.ui.fragments.skills.SkillTasksRecyclerViewFragment; -import com.habitrpg.android.habitica.ui.fragments.skills.SkillsFragment; -import com.habitrpg.android.habitica.ui.fragments.social.ChatFragment; -import com.habitrpg.android.habitica.ui.fragments.social.InboxMessageListFragment; -import com.habitrpg.android.habitica.ui.fragments.social.InboxOverviewFragment; -import com.habitrpg.android.habitica.ui.fragments.social.QuestDetailFragment; -import com.habitrpg.android.habitica.ui.fragments.social.TavernDetailFragment; -import com.habitrpg.android.habitica.ui.fragments.social.TavernFragment; -import com.habitrpg.android.habitica.ui.fragments.social.challenges.ChallengeDetailFragment; -import com.habitrpg.android.habitica.ui.fragments.social.challenges.ChallengeListFragment; -import com.habitrpg.android.habitica.ui.fragments.social.challenges.ChallengesOverviewFragment; -import com.habitrpg.android.habitica.ui.fragments.social.guilds.GuildDetailFragment; -import com.habitrpg.android.habitica.ui.fragments.social.guilds.GuildFragment; -import com.habitrpg.android.habitica.ui.fragments.social.guilds.GuildListFragment; -import com.habitrpg.android.habitica.ui.fragments.social.guilds.GuildOverviewFragment; -import com.habitrpg.android.habitica.ui.fragments.social.party.NoPartyFragmentFragment; -import com.habitrpg.android.habitica.ui.fragments.social.party.PartyDetailFragment; -import com.habitrpg.android.habitica.ui.fragments.social.party.PartyFragment; -import com.habitrpg.android.habitica.ui.fragments.social.party.PartyInviteFragment; -import com.habitrpg.android.habitica.ui.fragments.social.party.PartyInvitePagerFragment; -import com.habitrpg.android.habitica.ui.fragments.social.party.PartySeekingFragment; -import com.habitrpg.android.habitica.ui.fragments.social.party.PartySeekingViewModel; -import com.habitrpg.android.habitica.ui.fragments.support.BugFixFragment; -import com.habitrpg.android.habitica.ui.fragments.support.FAQDetailFragment; -import com.habitrpg.android.habitica.ui.fragments.support.FAQOverviewFragment; -import com.habitrpg.android.habitica.ui.fragments.support.SupportMainFragment; -import com.habitrpg.android.habitica.ui.fragments.tasks.TaskRecyclerViewFragment; -import com.habitrpg.android.habitica.ui.fragments.tasks.TasksFragment; -import com.habitrpg.android.habitica.ui.viewmodels.AuthenticationViewModel; -import com.habitrpg.android.habitica.ui.viewmodels.GroupViewModel; -import com.habitrpg.android.habitica.ui.viewmodels.InboxViewModel; -import com.habitrpg.android.habitica.ui.viewmodels.MainActivityViewModel; -import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel; -import com.habitrpg.android.habitica.ui.viewmodels.NotificationsViewModel; -import com.habitrpg.android.habitica.ui.viewmodels.StableViewModel; -import com.habitrpg.android.habitica.ui.viewmodels.TaskFormViewModel; -import com.habitrpg.android.habitica.ui.viewmodels.TasksViewModel; -import com.habitrpg.android.habitica.ui.viewmodels.inventory.equipment.EquipmentOverviewViewModel; -import com.habitrpg.android.habitica.ui.views.dialogs.PetSuggestHatchDialog; -import com.habitrpg.android.habitica.ui.views.insufficientCurrency.InsufficientGemsDialog; -import com.habitrpg.android.habitica.ui.views.shops.PurchaseDialog; -import com.habitrpg.android.habitica.ui.views.social.ChatBarView; -import com.habitrpg.android.habitica.ui.views.stats.BulkAllocateStatsDialog; -import com.habitrpg.android.habitica.ui.views.tasks.TaskFilterDialog; -import com.habitrpg.android.habitica.widget.AvatarStatsWidgetProvider; -import com.habitrpg.android.habitica.widget.BaseWidgetProvider; -import com.habitrpg.android.habitica.widget.DailiesWidgetProvider; -import com.habitrpg.android.habitica.widget.HabitButtonWidgetProvider; -import com.habitrpg.android.habitica.widget.HabitButtonWidgetService; -import com.habitrpg.android.habitica.widget.TaskListFactory; -import com.habitrpg.android.habitica.widget.TaskListWidgetProvider; - -import org.jetbrains.annotations.NotNull; - -import dagger.Subcomponent; - -@UserScope -@Subcomponent(modules = {UserModule.class, UserRepositoryModule.class}) -public interface UserComponent { - void inject(ClassSelectionActivity classSelectionActivity); - - void inject(GroupFormActivity groupFormActivity); - - void inject(IntroActivity introActivity); - - void inject(LoginActivity loginActivity); - - void inject(MainActivity mainActivity); - - void inject(MaintenanceActivity maintenanceActivity); - - void inject(GroupInviteActivity groupInviteActivity); - - void inject(PrefsActivity prefsActivity); - - void inject(NotificationsActivity notificationsActivity); - - void inject(SetupActivity setupActivity); - - void inject(SkillTasksActivity skillTasksActivity); - - void inject(SkillMemberActivity skillMembersActivity); - - void inject(TasksFragment tasksFragment); - - void inject(FAQOverviewFragment faqOverviewFragment); - - void inject(AvatarCustomizationFragment avatarCustomizationFragment); - - void inject(AvatarOverviewFragment avatarOverviewFragment); - - void inject(EquipmentDetailFragment equipmentDetailFragment); - - void inject(ItemRecyclerFragment itemRecyclerFragment); - - void inject(ItemsFragment itemsFragment); - - void inject(MountDetailRecyclerFragment mountDetailRecyclerFragment); - - void inject(PetDetailRecyclerFragment petDetailRecyclerFragment); - - void inject(StableFragment stableFragment); - - void inject(StableRecyclerFragment stableRecyclerFragment); - - void inject(AvatarSetupFragment avatarSetupFragment); - - void inject(IntroFragment introFragment); - - void inject(TaskSetupFragment taskSetupFragment); - - void inject(SkillsFragment skillsFragment); - - void inject(SkillTasksRecyclerViewFragment skillTasksRecyclerViewFragment); - - void inject(PartyFragment partyFragment); - - void inject(PartyInviteFragment partyInviteFragment); - - void inject(NoPartyFragmentFragment noPartyFragmentFragment); - - void inject(GuildFragment guildFragment); - - void inject(GuildListFragment guildListFragment); - - void inject(TavernFragment tavernFragment); - - void inject(TaskRecyclerViewFragment taskRecyclerViewFragment); - - void inject(GemsPurchaseFragment gemsPurchaseFragment); - - void inject(NewsFragment newsFragment); - - void inject(HabiticaBaseApplication habiticaApplication); - - void inject(PreferencesFragment preferencesFragment); - - void inject(InboxOverviewFragment inboxFragment); - - void inject(InboxMessageListFragment inboxMessageListFragment); - - void inject(ShopFragment shopFragment); - - void inject(PushNotificationManager pushNotificationManager); - - void inject(LocalNotificationActionReceiver localNotificationActionReceiver); - - void inject(FullProfileActivity fullProfileActivity); - - void inject(DailiesWidgetProvider dailiesWidgetProvider); - - void inject(HabitButtonWidgetService habitButtonWidgetService); - - void inject(HabitButtonWidgetActivity habitButtonWidgetActivity); - - void inject(HabitButtonWidgetProvider habitButtonWidgetProvider); - - void inject(AvatarStatsWidgetProvider avatarStatsWidgetProvider); - - void inject(SoundManager soundManager); - - void inject(ChallengesOverviewFragment challengesOverviewFragment); - - void inject(ChallengeListFragment challengeListFragment); - - void inject(ApiClient apiClient); - - void inject(TaskListWidgetProvider taskListWidgetProvider); - - void inject(DailiesRecyclerViewHolder dailiesRecyclerViewHolder); - - void inject(HabitsRecyclerViewAdapter habitsRecyclerViewAdapter); - - void inject(RewardsRecyclerViewAdapter rewardsRecyclerViewAdapter); - - void inject(TodosRecyclerViewAdapter todosRecyclerViewAdapter); - - void inject(SubscriptionFragment subscriptionFragment); - - void inject(ChallengeTasksRecyclerViewAdapter challengeTasksRecyclerViewAdapter); - - void inject(TaskListFactory taskListFactory); - - void inject(GemPurchaseActivity gemPurchaseActivity); - - void inject(TaskFilterDialog taskFilterDialog); - - void inject(TaskReceiver taskReceiver); - - void inject(TaskAlarmBootReceiver taskAlarmBootReceiver); - - void inject(HabiticaFirebaseMessagingService habiticaFirebaseMessagingService); - - void inject(BaseWidgetProvider baseWidgetProvider); - - void inject(NotificationPublisher notificationPublisher); - - void inject(ChallengeFormActivity challengeFormActivity); - - void inject(TavernDetailFragment tavernDetailFragment); - - void inject(PartyDetailFragment partyDetailFragment); - - void inject(QuestDetailFragment questDetailFragment); - - void inject(PurchaseDialog purchaseDialog); - - void inject(FixCharacterValuesActivity fixCharacterValuesActivity); - - void inject(StatsFragment statsFragment); - - void inject(BulkAllocateStatsDialog bulkAllocateStatsDialog); - - void inject(PushNotificationsPreferencesFragment pushNotificationsPreferencesFragment); - - void inject(WelcomeFragment welcomeFragment); - - void inject(NavigationDrawerFragment navigationDrawerFragment); - - void inject(ChallengeDetailFragment challengeDetailFragment); - - void inject(GroupViewModel viewModel); - - void inject(NotificationsViewModel viewModel); - - void inject(ChatFragment chatFragment); - - void inject(GiftSubscriptionActivity giftSubscriptionActivity); - - void inject(AboutFragment aboutFragment); - - void inject(ChatBarView chatBarView); - - void inject(TaskFormActivity taskFormActivity); - - void inject(ReportMessageActivity reportMessageActivity); - - void inject(GuildDetailFragment guildDetailFragment); - - void inject(AchievementsFragment achievementsFragment); - - void inject(InboxViewModel inboxViewModel); - - void inject(InsufficientGemsDialog insufficientGemsDialog); - - void inject(GiftGemsActivity giftGemsActivity); - - void inject(GiftPurchaseGemsFragment giftPurchaseGemsFragment); - - void inject(GiftBalanceGemsFragment giftBalanceGemsFragment); - - void inject(EmailNotificationsPreferencesFragment emailNotificationsPreferencesFragment); - - void inject(SupportMainFragment supportMainFragment); - - void inject(BugFixFragment bugFixFragment); - - void inject(FAQDetailFragment faqDetailFragment); - - void inject(AdventureGuideActivity adventureGuideFragment); - - void inject(PromoInfoFragment promoInfoFragment); - - void inject(@NotNull GuildOverviewFragment guildOverviewFragment); - - void inject(@NotNull PromoWebFragment promoWebFragment); - - void inject(@NotNull ItemDialogFragment itemDialogFragment); - - void inject(@NotNull EquipmentOverviewViewModel equipmentOverviewViewModel); - - void inject(@NotNull AccountPreferenceFragment accountPreferenceFragment); - - void inject(@NotNull AuthenticationViewModel authenticationViewModel); - - void inject(@NotNull MainActivityViewModel mainActivityViewModel); - - void inject(@NotNull GuidelinesActivity guidelinesActivity); - - void inject(@NotNull MainUserViewModel mainUserViewModel); - - void inject(@NotNull PetSuggestHatchDialog petSuggestHatchDialog); - - void inject(@NotNull ArmoireActivity armoireActivity); - - void inject(@NotNull TasksViewModel tasksViewModel); - - void inject(@NotNull StableViewModel stableViewModel); - - void inject(@NotNull DeathActivity deathActivity); - - void inject(@NotNull DeviceCommunicationService deviceCommunicationService); - - void inject(@NotNull TaskSummaryActivity taskSummaryActivity); - - void inject(@NotNull TaskSummaryViewModel taskSummaryViewModel); - - void inject(@NotNull TaskFormViewModel taskFormViewModel); - - void inject(@NotNull AvatarEquipmentFragment avatarEquipmentFragment); - - void inject(@NotNull BirthdayActivity birthdayActivity); - - void inject(@NotNull PartySeekingFragment partySeekingFragment); - - void inject(@NotNull PartySeekingViewModel partySeekingViewModel); - - void inject(@NotNull PartyInvitePagerFragment partyInvitePagerFragment); -} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/components/UserComponent.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/components/UserComponent.kt new file mode 100644 index 000000000..78b152db1 --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/components/UserComponent.kt @@ -0,0 +1,13 @@ +package com.habitrpg.android.habitica.components + +import com.habitrpg.android.habitica.modules.UserModule +import com.habitrpg.android.habitica.modules.UserRepositoryModule +import dagger.Subcomponent +import dagger.hilt.android.scopes.ActivityRetainedScoped +import dagger.hilt.android.scopes.ServiceScoped + +@ActivityRetainedScoped +@ServiceScoped +@Subcomponent(modules = [UserModule::class, UserRepositoryModule::class]) +interface UserComponent { +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt index f1fbe95a6..99549ffda 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt @@ -102,7 +102,6 @@ class ApiClientImpl( private var hadError = false init { - HabiticaBaseApplication.userComponent?.inject(this) analyticsManager.setUserIdentifier(this.hostConfig.userID) buildRetrofit() } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/SoundManager.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/SoundManager.kt index 0822bb3b9..594d0622f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/SoundManager.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/SoundManager.kt @@ -1,22 +1,14 @@ package com.habitrpg.android.habitica.helpers -import com.habitrpg.android.habitica.HabiticaBaseApplication import com.habitrpg.common.habitica.helpers.launchCatching import kotlinx.coroutines.MainScope import javax.inject.Inject -class SoundManager { - - @Inject - lateinit var soundFileLoader: SoundFileLoader +class SoundManager @Inject constructor(var soundFileLoader: SoundFileLoader) { var soundTheme: String = SoundThemeOff private val loadedSoundFiles: MutableMap = HashMap() - init { - HabiticaBaseApplication.userComponent?.inject(this) - } - fun preloadAllFiles() { loadedSoundFiles.clear() if (soundTheme == SoundThemeOff) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/UserScope.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/UserScope.kt deleted file mode 100644 index bffb030f2..000000000 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/UserScope.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.habitrpg.android.habitica.helpers - -import javax.inject.Scope - -@Scope -@Retention(AnnotationRetention.RUNTIME) -annotation class UserScope diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaFirebaseMessagingService.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaFirebaseMessagingService.kt index 75dc272a8..7be4c1ef3 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaFirebaseMessagingService.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/notifications/HabiticaFirebaseMessagingService.kt @@ -3,35 +3,21 @@ package com.habitrpg.android.habitica.helpers.notifications import com.google.firebase.messaging.FirebaseMessaging import com.google.firebase.messaging.FirebaseMessagingService import com.google.firebase.messaging.RemoteMessage -import com.habitrpg.android.habitica.HabiticaBaseApplication -import com.habitrpg.android.habitica.components.UserComponent +import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject +@AndroidEntryPoint class HabiticaFirebaseMessagingService : FirebaseMessagingService() { - private val userComponent: UserComponent? - get() = HabiticaBaseApplication.userComponent - @Inject internal lateinit var pushNotificationManager: PushNotificationManager override fun onMessageReceived(remoteMessage: RemoteMessage) { - try { - userComponent?.inject(this) - } catch (_: java.lang.IllegalStateException) { - } PushNotificationManager.displayNotification(remoteMessage, applicationContext) - - if (remoteMessage.data["identifier"]?.contains(PushNotificationManager.WON_CHALLENGE_PUSH_NOTIFICATION_KEY) == true) { - // if (this::userRepository.isInitialized) { - // userRepository.retrieveUser(true).subscribe({}, RxErrorHandler.handleEmptyError()) - // } - } } override fun onNewToken(s: String) { super.onNewToken(s) - userComponent?.inject(this) FirebaseMessaging.getInstance().token.addOnCompleteListener { task -> val refreshedToken = task.result if (refreshedToken != null && this::pushNotificationManager.isInitialized) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/modules/ApiModule.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/modules/ApiModule.kt index 157d43088..8268b89f5 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/modules/ApiModule.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/modules/ApiModule.kt @@ -13,11 +13,15 @@ import com.habitrpg.common.habitica.helpers.AnalyticsManager import com.habitrpg.common.habitica.helpers.KeyHelper import dagger.Module import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.android.qualifiers.ApplicationContext +import dagger.hilt.components.SingletonComponent import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory import java.lang.ref.WeakReference import javax.inject.Singleton +@InstallIn(SingletonComponent::class) @Module open class ApiModule { @Provides @@ -25,7 +29,7 @@ open class ApiModule { fun providesHostConfig( sharedPreferences: SharedPreferences, keyHelper: KeyHelper?, - context: Context + @ApplicationContext context: Context ): HostConfig { return HostConfig(sharedPreferences, keyHelper, context) } @@ -48,7 +52,7 @@ open class ApiModule { hostConfig: HostConfig, analyticsManager: AnalyticsManager, notificationsManager: NotificationsManager, - context: Context + @ApplicationContext context: Context ): ApiClient { val apiClient = ApiClientImpl( gsonConverter, diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/modules/AppModule.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/modules/AppModule.kt index 25e29814e..92d7634c3 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/modules/AppModule.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/modules/AppModule.kt @@ -1,6 +1,5 @@ package com.habitrpg.android.habitica.modules -import android.app.Application import android.content.Context import android.content.SharedPreferences import android.content.res.Resources @@ -9,13 +8,15 @@ import com.habitrpg.android.habitica.data.ApiClient import com.habitrpg.android.habitica.data.ContentRepository import com.habitrpg.android.habitica.helpers.AppConfigManager import com.habitrpg.android.habitica.helpers.SoundFileLoader -import com.habitrpg.android.habitica.helpers.SoundManager import com.habitrpg.android.habitica.helpers.notifications.PushNotificationManager import com.habitrpg.common.habitica.helpers.KeyHelper import com.habitrpg.common.habitica.helpers.KeyHelper.Companion.getInstance import com.habitrpg.shared.habitica.HLogger import dagger.Module import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.android.qualifiers.ApplicationContext +import dagger.hilt.components.SingletonComponent import java.io.IOException import java.security.KeyStore import java.security.KeyStoreException @@ -23,17 +24,12 @@ import java.security.NoSuchAlgorithmException import java.security.cert.CertificateException import javax.inject.Singleton +@InstallIn(SingletonComponent::class) @Module -class AppModule(private val application: Application) { +class AppModule { @Provides @Singleton - fun providesContext(): Context { - return application - } - - @Provides - @Singleton - fun provideSharedPreferences(context: Context): SharedPreferences { + fun provideSharedPreferences(@ApplicationContext context: Context): SharedPreferences { return PreferenceManager.getDefaultSharedPreferences(context) } @@ -57,7 +53,7 @@ class AppModule(private val application: Application) { @Provides fun provideKeyHelper( - context: Context, + @ApplicationContext context: Context, sharedPreferences: SharedPreferences, keyStore: KeyStore? ): KeyHelper? { @@ -67,27 +63,21 @@ class AppModule(private val application: Application) { } @Provides - fun providesResources(context: Context): Resources { + fun providesResources(@ApplicationContext context: Context): Resources { return context.resources } @Provides - fun providesSoundFileLoader(context: Context): SoundFileLoader { + fun providesSoundFileLoader(@ApplicationContext context: Context): SoundFileLoader { return SoundFileLoader(context) } - @Provides - @Singleton - fun providesSoundManager(): SoundManager { - return SoundManager() - } - @Provides @Singleton fun pushNotificationManager( apiClient: ApiClient, sharedPreferences: SharedPreferences, - context: Context + @ApplicationContext context: Context ): PushNotificationManager { return PushNotificationManager(apiClient, sharedPreferences, context) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/modules/DeveloperModule.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/modules/DeveloperModule.kt index 48e927953..91b2e8339 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/modules/DeveloperModule.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/modules/DeveloperModule.kt @@ -5,14 +5,18 @@ import com.habitrpg.android.habitica.proxy.implementation.EmptyAnalyticsManager import com.habitrpg.common.habitica.helpers.AnalyticsManager import dagger.Module import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.android.qualifiers.ApplicationContext +import dagger.hilt.components.SingletonComponent import javax.inject.Singleton // provide proxy class for libraries(to avoid 65k limit) +@InstallIn(SingletonComponent::class) @Module open class DeveloperModule { @Provides @Singleton - open fun provideAnalyticsManager(context: Context): AnalyticsManager { + open fun provideAnalyticsManager(@ApplicationContext context: Context): AnalyticsManager { return EmptyAnalyticsManager() } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/modules/RepositoryModule.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/modules/RepositoryModule.kt index eba641a84..9042cb1e9 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/modules/RepositoryModule.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/modules/RepositoryModule.kt @@ -8,8 +8,12 @@ import com.habitrpg.android.habitica.data.local.ContentLocalRepository import com.habitrpg.android.habitica.data.local.implementation.RealmContentLocalRepository import dagger.Module import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.android.qualifiers.ApplicationContext +import dagger.hilt.components.SingletonComponent import io.realm.Realm +@InstallIn(SingletonComponent::class) @Module open class RepositoryModule { @Provides @@ -26,7 +30,7 @@ open class RepositoryModule { fun providesContentRepository( contentLocalRepository: ContentLocalRepository, apiClient: ApiClient, - context: Context + @ApplicationContext context: Context ): ContentRepository { return ContentRepositoryImpl( contentLocalRepository, diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/modules/UserModule.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/modules/UserModule.kt index e665812db..2f97fc2aa 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/modules/UserModule.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/modules/UserModule.kt @@ -7,18 +7,20 @@ import com.habitrpg.android.habitica.data.SocialRepository import com.habitrpg.android.habitica.data.TaskRepository import com.habitrpg.android.habitica.data.UserRepository import com.habitrpg.android.habitica.helpers.TaskAlarmManager -import com.habitrpg.android.habitica.helpers.UserScope import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel import dagger.Module import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.android.qualifiers.ApplicationContext +import dagger.hilt.components.SingletonComponent import javax.inject.Named +@InstallIn(SingletonComponent::class) @Module class UserModule { @Provides - @UserScope fun providesTaskAlarmManager( - context: Context, + @ApplicationContext context: Context, taskRepository: TaskRepository, @Named(NAMED_USER_ID) userId: String ): TaskAlarmManager { @@ -27,7 +29,6 @@ class UserModule { @Provides @Named(NAMED_USER_ID) - @UserScope fun providesUserID(sharedPreferences: SharedPreferences): String { return if (BuildConfig.DEBUG && BuildConfig.TEST_USER_ID.isNotEmpty()) { BuildConfig.TEST_USER_ID @@ -37,7 +38,6 @@ class UserModule { } @Provides - @UserScope fun providesUserViewModel( @Named(NAMED_USER_ID) userID: String, userRepository: UserRepository, diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/modules/UserRepositoryModule.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/modules/UserRepositoryModule.kt index 54ffa1532..78c167b7f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/modules/UserRepositoryModule.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/modules/UserRepositoryModule.kt @@ -42,18 +42,21 @@ import com.habitrpg.android.habitica.data.local.implementation.RealmTutorialLoca import com.habitrpg.android.habitica.data.local.implementation.RealmUserLocalRepository import com.habitrpg.android.habitica.helpers.AppConfigManager import com.habitrpg.android.habitica.helpers.PurchaseHandler -import com.habitrpg.android.habitica.helpers.UserScope import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel import com.habitrpg.common.habitica.helpers.AnalyticsManager import dagger.Module import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.android.qualifiers.ApplicationContext +import dagger.hilt.components.SingletonComponent import io.realm.Realm import javax.inject.Named +@InstallIn(SingletonComponent::class) @Module class UserRepositoryModule { @Provides - fun providesSetupCustomizationRepository(context: Context?): SetupCustomizationRepository { + fun providesSetupCustomizationRepository(@ApplicationContext context: Context?): SetupCustomizationRepository { return SetupCustomizationRepositoryImpl(context!!) } @@ -63,7 +66,6 @@ class UserRepositoryModule { } @Provides - @UserScope fun providesTaskRepository( localRepository: TaskLocalRepository, apiClient: ApiClient, @@ -148,9 +150,7 @@ class UserRepositoryModule { @Provides fun providesInventoryLocalRepository( - realm: Realm?, - context: Context? - ): InventoryLocalRepository { + realm: Realm?): InventoryLocalRepository { return RealmInventoryLocalRepository(realm!!) } @@ -207,9 +207,8 @@ class UserRepositoryModule { } @Provides - @UserScope fun providesPurchaseHandler( - context: Context, + @ApplicationContext context: Context, analyticsManager: AnalyticsManager, apiClient: ApiClient, userViewModel: MainUserViewModel diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/DeviceCommunicationService.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/DeviceCommunicationService.kt index 91be85d4c..ad556a3dd 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/DeviceCommunicationService.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/DeviceCommunicationService.kt @@ -4,14 +4,15 @@ import android.content.Intent import com.google.android.gms.wearable.MessageEvent import com.google.android.gms.wearable.Wearable import com.google.android.gms.wearable.WearableListenerService -import com.habitrpg.android.habitica.HabiticaBaseApplication import com.habitrpg.android.habitica.ui.activities.LoginActivity import com.habitrpg.android.habitica.ui.activities.MainActivity import com.habitrpg.android.habitica.ui.activities.TaskFormActivity import com.habitrpg.common.habitica.api.HostConfig import com.habitrpg.common.habitica.helpers.DeviceCommunication +import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject +@AndroidEntryPoint class DeviceCommunicationService : WearableListenerService() { @Inject lateinit var hostConfig: HostConfig @@ -19,7 +20,6 @@ class DeviceCommunicationService : WearableListenerService() { private val messageClient by lazy { Wearable.getMessageClient(this) } init { - HabiticaBaseApplication.userComponent?.inject(this) } override fun onMessageReceived(event: MessageEvent) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/LocalNotificationActionReceiver.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/LocalNotificationActionReceiver.kt index 5ae4c18c1..1d98334ed 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/LocalNotificationActionReceiver.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/LocalNotificationActionReceiver.kt @@ -8,7 +8,6 @@ import android.text.Spannable import android.widget.Toast import androidx.core.app.NotificationManagerCompat import androidx.core.app.RemoteInput -import com.habitrpg.android.habitica.HabiticaBaseApplication import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.data.ApiClient import com.habitrpg.android.habitica.data.SocialRepository @@ -18,10 +17,12 @@ import com.habitrpg.android.habitica.interactors.NotifyUserUseCase import com.habitrpg.android.habitica.models.user.User import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.common.habitica.helpers.launchCatching +import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.MainScope import kotlinx.coroutines.launch import javax.inject.Inject +@AndroidEntryPoint class LocalNotificationActionReceiver : BroadcastReceiver() { @Inject lateinit var userRepository: UserRepository @@ -46,7 +47,6 @@ class LocalNotificationActionReceiver : BroadcastReceiver() { private var intent: Intent? = null override fun onReceive(context: Context, intent: Intent) { - HabiticaBaseApplication.userComponent?.inject(this) this.intent = intent this.context = context handleLocalNotificationAction(intent.action) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/NotificationPublisher.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/NotificationPublisher.kt index 00a41e7eb..8e06e4186 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/NotificationPublisher.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/NotificationPublisher.kt @@ -10,7 +10,6 @@ import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat import androidx.core.content.ContextCompat import androidx.core.content.edit -import com.habitrpg.android.habitica.HabiticaBaseApplication import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.data.TaskRepository import com.habitrpg.android.habitica.data.UserRepository @@ -19,6 +18,7 @@ import com.habitrpg.android.habitica.helpers.TaskAlarmManager import com.habitrpg.android.habitica.ui.activities.MainActivity import com.habitrpg.common.habitica.helpers.launchCatching import com.habitrpg.shared.habitica.models.tasks.TaskType +import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.MainScope import kotlinx.coroutines.flow.firstOrNull import java.util.Calendar @@ -27,6 +27,7 @@ import java.util.Random import javax.inject.Inject // https://gist.github.com/BrandonSmith/6679223 +@AndroidEntryPoint class NotificationPublisher : BroadcastReceiver() { @Inject @@ -43,8 +44,7 @@ class NotificationPublisher : BroadcastReceiver() { this.context = context if (!wasInjected) { wasInjected = true - HabiticaBaseApplication.userComponent?.inject(this) - } + } var wasInactive = false // Show special notification if user hasn't logged in for a week diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/TaskAlarmBootReceiver.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/TaskAlarmBootReceiver.kt index 62719211f..ae2fc610c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/TaskAlarmBootReceiver.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/TaskAlarmBootReceiver.kt @@ -4,15 +4,16 @@ import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.content.SharedPreferences -import com.habitrpg.android.habitica.HabiticaBaseApplication import com.habitrpg.android.habitica.helpers.TaskAlarmManager import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.shared.habitica.HLogger import com.habitrpg.shared.habitica.LogLevel +import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.MainScope import kotlinx.coroutines.launch import javax.inject.Inject +@AndroidEntryPoint class TaskAlarmBootReceiver : BroadcastReceiver() { @Inject @@ -24,7 +25,6 @@ class TaskAlarmBootReceiver : BroadcastReceiver() { if (intent.action != Intent.ACTION_BOOT_COMPLETED) { return } - HabiticaBaseApplication.userComponent?.inject(this) MainScope().launch(ExceptionHandler.coroutine()) { taskAlarmManager.scheduleAllSavedAlarms(sharedPreferences.getBoolean("preventDailyReminder", false)) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/TaskReceiver.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/TaskReceiver.kt index de0d995e9..c899c671a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/TaskReceiver.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/receivers/TaskReceiver.kt @@ -10,7 +10,6 @@ import android.os.Build import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat import androidx.core.content.ContextCompat -import com.habitrpg.android.habitica.HabiticaBaseApplication import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.data.TaskRepository import com.habitrpg.android.habitica.extensions.withImmutableFlag @@ -21,11 +20,13 @@ import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.shared.habitica.HLogger import com.habitrpg.shared.habitica.LogLevel import com.habitrpg.shared.habitica.models.tasks.TaskType +import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.MainScope import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.launch import javax.inject.Inject +@AndroidEntryPoint class TaskReceiver : BroadcastReceiver() { @Inject @@ -36,7 +37,6 @@ class TaskReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { HLogger.log(LogLevel.INFO, this::javaClass.name, "onReceive") - HabiticaBaseApplication.userComponent?.inject(this) val extras = intent.extras if (extras != null) { val taskId = extras.getString(TaskAlarmManager.TASK_ID_INTENT_KEY) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/AddTaskWidgetActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/AddTaskWidgetActivity.kt index 6ba60fa4d..27177e06b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/AddTaskWidgetActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/AddTaskWidgetActivity.kt @@ -10,7 +10,9 @@ import androidx.preference.PreferenceManager import com.habitrpg.android.habitica.databinding.WidgetConfigureAddTaskBinding import com.habitrpg.android.habitica.widget.AddTaskWidgetProvider import com.habitrpg.shared.habitica.models.tasks.TaskType +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class AddTaskWidgetActivity : AppCompatActivity() { private var widgetId: Int = 0 diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/AdventureGuideActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/AdventureGuideActivity.kt index a0d18fd27..c1f90c7fe 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/AdventureGuideActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/AdventureGuideActivity.kt @@ -10,7 +10,6 @@ import android.widget.TextView import androidx.core.app.NavUtils import androidx.core.content.ContextCompat import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.databinding.ActivityAdventureGuideBinding import com.habitrpg.android.habitica.databinding.AdventureGuideItemBinding import com.habitrpg.android.habitica.helpers.AmplitudeManager @@ -18,8 +17,10 @@ import com.habitrpg.android.habitica.models.user.User import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel import com.habitrpg.common.habitica.extensions.fromHtml import com.habitrpg.common.habitica.extensions.loadImage +import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject +@AndroidEntryPoint class AdventureGuideActivity : BaseActivity() { private lateinit var binding: ActivityAdventureGuideBinding @@ -38,10 +39,6 @@ class AdventureGuideActivity : BaseActivity() { return binding.root } - override fun injectActivity(component: UserComponent?) { - component?.inject(this) - } - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ArmoireActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ArmoireActivity.kt index 11711fb39..57706b907 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ArmoireActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ArmoireActivity.kt @@ -11,7 +11,6 @@ import android.widget.RelativeLayout import androidx.core.content.ContextCompat import androidx.lifecycle.lifecycleScope import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.InventoryRepository import com.habitrpg.android.habitica.databinding.ActivityArmoireBinding import com.habitrpg.android.habitica.helpers.AdHandler @@ -26,11 +25,13 @@ import com.habitrpg.common.habitica.helpers.Animations import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.common.habitica.helpers.launchCatching import com.plattysoft.leonids.ParticleSystem +import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.MainScope import kotlinx.coroutines.launch import java.util.Locale import javax.inject.Inject +@AndroidEntryPoint class ArmoireActivity : BaseActivity() { private var equipmentKey: String? = null @@ -47,10 +48,6 @@ class ArmoireActivity : BaseActivity() { override fun getLayoutResId(): Int = R.layout.activity_armoire - override fun injectActivity(component: UserComponent?) { - component?.inject(this) - } - override fun getContentView(layoutResId: Int?): View { binding = ActivityArmoireBinding.inflate(layoutInflater) return binding.root diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/BaseActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/BaseActivity.kt index 9d2597f25..3955d5f94 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/BaseActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/BaseActivity.kt @@ -20,9 +20,7 @@ import androidx.core.os.bundleOf import androidx.lifecycle.lifecycleScope import androidx.preference.PreferenceManager import com.habitrpg.android.habitica.HabiticaApplication -import com.habitrpg.android.habitica.HabiticaBaseApplication import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.UserRepository import com.habitrpg.android.habitica.extensions.forceLocale import com.habitrpg.android.habitica.extensions.updateStatusBarColor @@ -87,7 +85,6 @@ abstract class BaseActivity : AppCompatActivity() { super.onCreate(savedInstanceState) habiticaApplication - injectActivity(HabiticaBaseApplication.userComponent) getLayoutResId()?.let { setContentView(getContentView(it)) } @@ -178,8 +175,6 @@ abstract class BaseActivity : AppCompatActivity() { } } - protected abstract fun injectActivity(component: UserComponent?) - protected fun setupToolbar(toolbar: Toolbar?) { this.toolbar = toolbar if (toolbar != null) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/BirthdayActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/BirthdayActivity.kt index 77d720601..825104961 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/BirthdayActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/BirthdayActivity.kt @@ -74,6 +74,7 @@ import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog import com.habitrpg.android.habitica.ui.views.insufficientCurrency.InsufficientGemsDialog import com.habitrpg.common.habitica.extensions.DataBindingUtils import com.habitrpg.common.habitica.helpers.launchCatching +import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.MainScope import kotlinx.coroutines.delay import kotlinx.coroutines.flow.map @@ -82,6 +83,7 @@ import java.text.SimpleDateFormat import java.util.Date import javax.inject.Inject +@AndroidEntryPoint class BirthdayActivity : BaseActivity() { @Inject lateinit var userViewModel: MainUserViewModel @@ -189,10 +191,6 @@ class BirthdayActivity : BaseActivity() { userRepository.retrieveUser(false, true) isPurchasing.value = false } - - override fun injectActivity(component: UserComponent?) { - component?.inject(this) - } } @Composable diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ChallengeFormActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ChallengeFormActivity.kt index f9c2ccf27..92271c630 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ChallengeFormActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ChallengeFormActivity.kt @@ -18,7 +18,6 @@ import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.widget.AppCompatCheckedTextView import androidx.lifecycle.lifecycleScope import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.ChallengeRepository import com.habitrpg.android.habitica.data.SocialRepository import com.habitrpg.android.habitica.databinding.ActivityCreateChallengeBinding @@ -39,6 +38,7 @@ import com.habitrpg.common.habitica.extensions.getThemeColor import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.common.habitica.helpers.launchCatching import com.habitrpg.shared.habitica.models.tasks.TaskType +import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.flow.firstOrNull @@ -46,6 +46,7 @@ import kotlinx.coroutines.launch import java.util.UUID import javax.inject.Inject +@AndroidEntryPoint class ChallengeFormActivity : BaseActivity() { private lateinit var binding: ActivityCreateChallengeBinding @@ -118,10 +119,6 @@ class ChallengeFormActivity : BaseActivity() { return R.layout.activity_create_challenge } - override fun injectActivity(component: UserComponent?) { - component?.inject(this) - } - override fun onCreateOptionsMenu(menu: Menu): Boolean { val inflater = menuInflater inflater.inflate(R.menu.menu_create_challenge, menu) @@ -224,11 +221,11 @@ class ChallengeFormActivity : BaseActivity() { val intent = intent val bundle = intent.extras - ChallengeTasksRecyclerViewAdapter( + /*ChallengeTasksRecyclerViewAdapter( TasksViewModel(), 0, this, "", openTaskDisabled = false, taskActionsDisabled = true - ).also { challengeTasks = it } + ).also { challengeTasks = it }*/ challengeTasks.onTaskOpen = { if (it.isValid) { openNewTaskActivity(it.type, it) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ClassSelectionActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ClassSelectionActivity.kt index ee6125cc5..b79cdc72d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ClassSelectionActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ClassSelectionActivity.kt @@ -11,7 +11,6 @@ import androidx.core.content.ContextCompat import androidx.lifecycle.lifecycleScope import androidx.navigation.navArgs import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.databinding.ActivityClassSelectionBinding import com.habitrpg.android.habitica.models.user.Gear import com.habitrpg.android.habitica.models.user.Items @@ -23,9 +22,11 @@ import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaProgressDialog import com.habitrpg.common.habitica.helpers.ExceptionHandler +import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.launch import javax.inject.Inject +@AndroidEntryPoint class ClassSelectionActivity : BaseActivity() { @Inject @@ -152,10 +153,6 @@ class ClassSelectionActivity : BaseActivity() { binding.warriorButton.setCompoundDrawablesWithIntrinsicBounds(warriorIcon, null, null, null) } - override fun injectActivity(component: UserComponent?) { - component?.inject(this) - } - private fun makeUser(preferences: Preferences, outfit: Outfit): User { val user = User() user.preferences = preferences diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/DeathActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/DeathActivity.kt index a089fff6b..e90749dc0 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/DeathActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/DeathActivity.kt @@ -7,7 +7,6 @@ import android.view.View import android.view.animation.AccelerateInterpolator import androidx.lifecycle.lifecycleScope import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.InventoryRepository import com.habitrpg.android.habitica.databinding.ActivityDeathBinding import com.habitrpg.android.habitica.extensions.observeOnce @@ -21,9 +20,11 @@ import com.habitrpg.common.habitica.extensions.fromHtml import com.habitrpg.common.habitica.helpers.Animations import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.plattysoft.leonids.ParticleSystem +import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.launch import javax.inject.Inject +@AndroidEntryPoint class DeathActivity : BaseActivity() { private lateinit var binding: ActivityDeathBinding @@ -36,10 +37,6 @@ class DeathActivity : BaseActivity() { override fun getLayoutResId(): Int = R.layout.activity_armoire - override fun injectActivity(component: UserComponent?) { - component?.inject(this) - } - override fun getContentView(layoutResId: Int?): View { binding = ActivityDeathBinding.inflate(layoutInflater) return binding.root diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FixCharacterValuesActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FixCharacterValuesActivity.kt index ac9f25d1b..f9ad1be2f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FixCharacterValuesActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FixCharacterValuesActivity.kt @@ -8,15 +8,16 @@ import android.view.View import android.widget.EditText import androidx.core.content.ContextCompat import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.databinding.ActivityFixcharacterBinding import com.habitrpg.android.habitica.extensions.setTintWith import com.habitrpg.android.habitica.models.user.Stats import com.habitrpg.android.habitica.models.user.User import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper +import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject +@AndroidEntryPoint class FixCharacterValuesActivity : BaseActivity() { private lateinit var binding: ActivityFixcharacterBinding @@ -31,10 +32,6 @@ class FixCharacterValuesActivity : BaseActivity() { return binding.root } - override fun injectActivity(component: UserComponent?) { - component?.inject(this) - } - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.kt index 50f8beca6..5166e040b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.kt @@ -22,7 +22,6 @@ import androidx.core.view.MenuCompat import androidx.core.view.isVisible import androidx.lifecycle.lifecycleScope import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.ApiClient import com.habitrpg.android.habitica.data.InventoryRepository import com.habitrpg.android.habitica.data.SocialRepository @@ -48,6 +47,7 @@ import com.habitrpg.common.habitica.helpers.RecyclerViewState import com.habitrpg.common.habitica.helpers.launchCatching import com.habitrpg.common.habitica.helpers.setMarkdown import com.habitrpg.common.habitica.views.PixelArtView +import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.MainScope import kotlinx.coroutines.delay @@ -58,6 +58,7 @@ import javax.inject.Inject import kotlin.math.floor import kotlin.math.min +@AndroidEntryPoint class FullProfileActivity : BaseActivity() { private var blocks: List = listOf() private var isModerator = false @@ -717,10 +718,6 @@ class FullProfileActivity : BaseActivity() { return binding.root } - override fun injectActivity(component: UserComponent?) { - component?.inject(this) - } - companion object { fun open(userId: String) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GemPurchaseActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GemPurchaseActivity.kt index 76183fa63..1bad732a6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GemPurchaseActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GemPurchaseActivity.kt @@ -4,19 +4,17 @@ import android.os.Bundle import androidx.appcompat.widget.Toolbar import androidx.fragment.app.Fragment import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.ui.fragments.purchases.GemsPurchaseFragment import com.habitrpg.android.habitica.ui.fragments.purchases.SubscriptionFragment +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class GemPurchaseActivity : PurchaseActivity() { override fun getLayoutResId(): Int { return R.layout.activity_gem_purchase } - override fun injectActivity(component: UserComponent?) { - component?.inject(this) - } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GiftGemsActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GiftGemsActivity.kt index 6ff7761e8..1d3864a18 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GiftGemsActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GiftGemsActivity.kt @@ -8,7 +8,6 @@ import androidx.navigation.navArgs import androidx.viewpager2.adapter.FragmentStateAdapter import com.google.android.material.tabs.TabLayoutMediator import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.SocialRepository import com.habitrpg.android.habitica.databinding.ActivityGiftGemsBinding import com.habitrpg.android.habitica.helpers.AppConfigManager @@ -18,10 +17,12 @@ import com.habitrpg.android.habitica.ui.fragments.purchases.GiftBalanceGemsFragm import com.habitrpg.android.habitica.ui.fragments.purchases.GiftPurchaseGemsFragment import com.habitrpg.android.habitica.ui.views.CurrencyView import com.habitrpg.common.habitica.helpers.ExceptionHandler +import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.launch import javax.inject.Inject +@AndroidEntryPoint class GiftGemsActivity : PurchaseActivity() { private lateinit var binding: ActivityGiftGemsBinding @@ -54,10 +55,6 @@ class GiftGemsActivity : PurchaseActivity() { return binding.root } - override fun injectActivity(component: UserComponent?) { - component?.inject(this) - } - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GiftSubscriptionActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GiftSubscriptionActivity.kt index 9d555b59f..069b0a1f1 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GiftSubscriptionActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GiftSubscriptionActivity.kt @@ -7,7 +7,6 @@ import androidx.lifecycle.lifecycleScope import androidx.navigation.navArgs import com.android.billingclient.api.ProductDetails import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.SocialRepository import com.habitrpg.android.habitica.databinding.ActivityGiftSubscriptionBinding import com.habitrpg.android.habitica.helpers.AppConfigManager @@ -15,12 +14,14 @@ import com.habitrpg.android.habitica.helpers.PurchaseHandler import com.habitrpg.android.habitica.helpers.PurchaseTypes import com.habitrpg.android.habitica.ui.views.subscriptions.SubscriptionOptionView import com.habitrpg.common.habitica.helpers.ExceptionHandler +import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import javax.inject.Inject +@AndroidEntryPoint class GiftSubscriptionActivity : PurchaseActivity() { private lateinit var binding: ActivityGiftSubscriptionBinding @@ -42,10 +43,6 @@ class GiftSubscriptionActivity : PurchaseActivity() { return R.layout.activity_gift_subscription } - override fun injectActivity(component: UserComponent?) { - component?.inject(this) - } - override fun getContentView(layoutResId: Int?): View { binding = ActivityGiftSubscriptionBinding.inflate(layoutInflater) return binding.root diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GroupFormActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GroupFormActivity.kt index 3ebc9adc9..544d3a6b1 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GroupFormActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GroupFormActivity.kt @@ -5,12 +5,13 @@ import android.content.Intent import android.os.Bundle import android.view.View import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.databinding.ActivityGroupFormBinding import com.habitrpg.android.habitica.ui.helpers.AutocompleteAdapter import com.habitrpg.android.habitica.ui.helpers.dismissKeyboard import com.habitrpg.common.habitica.helpers.MarkdownParser +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class GroupFormActivity : BaseActivity() { private lateinit var binding: ActivityGroupFormBinding @@ -65,10 +66,6 @@ class GroupFormActivity : BaseActivity() { } } - override fun injectActivity(component: UserComponent?) { - component?.inject(this) - } - private fun fillForm() { binding.groupNameEditText.setText(groupName) binding.groupDescriptionEditText.setText(groupDescription) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GroupInviteActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GroupInviteActivity.kt index aca79ac48..27c23e6b5 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GroupInviteActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GroupInviteActivity.kt @@ -10,19 +10,16 @@ import androidx.fragment.app.Fragment import androidx.viewpager2.adapter.FragmentStateAdapter import com.google.android.material.tabs.TabLayoutMediator import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.SocialRepository import com.habitrpg.android.habitica.databinding.ActivityPartyInviteBinding -import com.habitrpg.android.habitica.extensions.runDelayed import com.habitrpg.android.habitica.modules.AppModule import com.habitrpg.android.habitica.ui.fragments.social.party.PartyInviteFragment import com.habitrpg.android.habitica.ui.helpers.dismissKeyboard -import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar -import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar.Companion.showSnackbar +import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject import javax.inject.Named -import kotlin.time.DurationUnit +@AndroidEntryPoint class GroupInviteActivity : BaseActivity() { private lateinit var binding: ActivityPartyInviteBinding @@ -53,10 +50,6 @@ class GroupInviteActivity : BaseActivity() { setViewPagerAdapter() } - override fun injectActivity(component: UserComponent?) { - component?.inject(this) - } - override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.menu_party_invite, menu) return super.onCreateOptionsMenu(menu) @@ -68,12 +61,6 @@ class GroupInviteActivity : BaseActivity() { R.id.action_send_invites -> { setResult(Activity.RESULT_OK, createResultIntent()) dismissKeyboard() - if (fragments.size > binding.viewPager.currentItem && fragments[binding.viewPager.currentItem].values.isNotEmpty()) { - showSnackbar(binding.snackbarView, "Invite Sent!", HabiticaSnackbar.SnackbarDisplayType.SUCCESS) - runDelayed(1, DurationUnit.SECONDS, this::finish) - } else { - finish() - } true } android.R.id.home -> { @@ -87,13 +74,6 @@ class GroupInviteActivity : BaseActivity() { private fun createResultIntent(): Intent { val intent = Intent() if (fragments.size == 0) return intent - for (fragment in fragments) { - if (fragment.isEmailInvite) { - intent.putExtra(EMAILS_KEY, fragment.values) - } else { - intent.putExtra(USER_IDS_KEY, fragment.values) - } - } return intent } @@ -103,7 +83,6 @@ class GroupInviteActivity : BaseActivity() { val statePagerAdapter = object : FragmentStateAdapter(fragmentManager, lifecycle) { override fun createFragment(position: Int): Fragment { val fragment = PartyInviteFragment() - fragment.isEmailInvite = position == 1 fragments.add(fragment) return fragment } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GuidelinesActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GuidelinesActivity.kt index c0cb54434..0d001b1a6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GuidelinesActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GuidelinesActivity.kt @@ -4,9 +4,9 @@ import android.os.Bundle import android.view.MenuItem import android.widget.TextView import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.common.habitica.helpers.setMarkdown +import dagger.hilt.android.AndroidEntryPoint import okhttp3.Call import okhttp3.Callback import okhttp3.OkHttpClient @@ -16,13 +16,10 @@ import java.io.BufferedReader import java.io.IOException import java.io.InputStreamReader +@AndroidEntryPoint class GuidelinesActivity : BaseActivity() { override fun getLayoutResId(): Int = R.layout.activity_guidelines - override fun injectActivity(component: UserComponent?) { - component?.inject(this) - } - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setupToolbar(findViewById(R.id.toolbar)) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/HabitButtonWidgetActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/HabitButtonWidgetActivity.kt index bb2094924..fc406de64 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/HabitButtonWidgetActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/HabitButtonWidgetActivity.kt @@ -9,7 +9,6 @@ import androidx.core.content.edit import androidx.preference.PreferenceManager import androidx.recyclerview.widget.LinearLayoutManager import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.TaskRepository import com.habitrpg.android.habitica.databinding.WidgetConfigureHabitButtonBinding import com.habitrpg.android.habitica.modules.AppModule @@ -17,6 +16,7 @@ import com.habitrpg.android.habitica.ui.adapter.SkillTasksRecyclerViewAdapter import com.habitrpg.android.habitica.widget.HabitButtonWidgetProvider import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.shared.habitica.models.tasks.TaskType +import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob @@ -25,6 +25,7 @@ import kotlinx.coroutines.launch import javax.inject.Inject import javax.inject.Named +@AndroidEntryPoint class HabitButtonWidgetActivity : BaseActivity() { private val job = SupervisorJob() @@ -47,10 +48,6 @@ class HabitButtonWidgetActivity : BaseActivity() { return binding.root } - override fun injectActivity(component: UserComponent?) { - component?.inject(this) - } - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/IntroActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/IntroActivity.kt index b528f5fe0..be429304f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/IntroActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/IntroActivity.kt @@ -13,15 +13,16 @@ import androidx.fragment.app.FragmentStatePagerAdapter import androidx.lifecycle.lifecycleScope import androidx.viewpager.widget.ViewPager import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.ContentRepository import com.habitrpg.android.habitica.databinding.ActivityIntroBinding import com.habitrpg.android.habitica.ui.fragments.setup.IntroFragment import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.viewpagerindicator.IconPagerAdapter +import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.launch import javax.inject.Inject +@AndroidEntryPoint class IntroActivity : BaseActivity(), View.OnClickListener, ViewPager.OnPageChangeListener { private lateinit var binding: ActivityIntroBinding @@ -54,10 +55,6 @@ class IntroActivity : BaseActivity(), View.OnClickListener, ViewPager.OnPageChan window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS) } - override fun injectActivity(component: UserComponent?) { - component?.inject(this) - } - private fun setupIntro() { binding.viewPager.adapter = PagerAdapter(supportFragmentManager) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.kt index 79b1edc56..eb2f2816b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.kt @@ -32,7 +32,6 @@ import com.google.android.gms.wearable.MessageClient import com.google.android.gms.wearable.Wearable import com.google.firebase.analytics.FirebaseAnalytics import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.ApiClient import com.habitrpg.android.habitica.databinding.ActivityLoginBinding import com.habitrpg.android.habitica.extensions.addCancelButton @@ -46,13 +45,14 @@ import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.common.habitica.helpers.launchCatching import com.habitrpg.common.habitica.models.auth.UserAuthResponse +import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import javax.inject.Inject +@AndroidEntryPoint class LoginActivity : BaseActivity() { - private lateinit var viewModel: AuthenticationViewModel private lateinit var binding: ActivityLoginBinding @Inject @@ -61,6 +61,8 @@ class LoginActivity : BaseActivity() { lateinit var sharedPrefs: SharedPreferences @Inject lateinit var configManager: AppConfigManager + @Inject + lateinit var viewModel : AuthenticationViewModel private var isRegistering: Boolean = false private var isShowingForm: Boolean = false @@ -141,7 +143,6 @@ class LoginActivity : BaseActivity() { override fun onCreate(savedInstanceState: Bundle?) { window.requestFeature(Window.FEATURE_ACTION_BAR) super.onCreate(savedInstanceState) - viewModel = AuthenticationViewModel() supportActionBar?.hide() // Set default values to avoid null-responses when requesting unedited settings PreferenceManager.setDefaultValues(this, R.xml.preferences_fragment, false) @@ -189,10 +190,6 @@ class LoginActivity : BaseActivity() { } } - override fun injectActivity(component: UserComponent?) { - component?.inject(this) - } - private fun resetLayout() { if (this.isRegistering) { if (binding.email.visibility == View.GONE) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt index 9f4c7e58d..f05351cdd 100755 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt @@ -30,7 +30,6 @@ import com.google.android.gms.wearable.Wearable import com.google.firebase.perf.FirebasePerformance import com.habitrpg.android.habitica.BuildConfig import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.ApiClient import com.habitrpg.android.habitica.data.InventoryRepository import com.habitrpg.android.habitica.data.TaskRepository @@ -72,6 +71,7 @@ import com.habitrpg.common.habitica.helpers.launchCatching import com.habitrpg.common.habitica.views.AvatarView import com.habitrpg.shared.habitica.models.responses.MaintenanceResponse import com.habitrpg.shared.habitica.models.responses.TaskScoringResult +import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.delay @@ -84,6 +84,7 @@ import kotlin.time.toDuration var mainActivityCreatedAt: Date? = null +@AndroidEntryPoint open class MainActivity : BaseActivity(), SnackbarActivity { private var launchScreen: String? = null @@ -350,10 +351,6 @@ open class MainActivity : BaseActivity(), SnackbarActivity { } else super.onOptionsItemSelected(item) } - override fun injectActivity(component: UserComponent?) { - component?.inject(this) - } - override fun onResume() { super.onResume() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MaintenanceActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MaintenanceActivity.kt index d5fd83378..26941cbee 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MaintenanceActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MaintenanceActivity.kt @@ -8,13 +8,14 @@ import androidx.core.net.toUri import androidx.lifecycle.lifecycleScope import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.api.MaintenanceApiService -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.ApiClient import com.habitrpg.android.habitica.databinding.ActivityMaintenanceBinding import com.habitrpg.common.habitica.helpers.launchCatching import com.habitrpg.common.habitica.helpers.setMarkdown +import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject +@AndroidEntryPoint class MaintenanceActivity : BaseActivity() { private lateinit var binding: ActivityMaintenanceBinding @@ -58,10 +59,6 @@ class MaintenanceActivity : BaseActivity() { binding.playStoreButton.setOnClickListener { openInPlayStore() } } - override fun injectActivity(component: UserComponent?) { - component?.inject(this) - } - override fun onResume() { super.onResume() if (!isDeprecationNotice) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/NotificationsActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/NotificationsActivity.kt index 3ff11c630..06069a04b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/NotificationsActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/NotificationsActivity.kt @@ -15,7 +15,6 @@ import androidx.activity.viewModels import androidx.core.content.ContextCompat import androidx.lifecycle.lifecycleScope import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.InventoryRepository import com.habitrpg.android.habitica.data.SocialRepository import com.habitrpg.android.habitica.databinding.ActivityNotificationsBinding @@ -37,10 +36,12 @@ import com.habitrpg.common.habitica.models.notifications.PartyInvitationData import com.habitrpg.common.habitica.models.notifications.QuestInvitationData import com.habitrpg.common.habitica.models.notifications.UnallocatedPointsData import com.habitrpg.common.habitica.views.PixelArtView +import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.launch import javax.inject.Inject +@AndroidEntryPoint class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnRefreshListener { private lateinit var binding: ActivityNotificationsBinding @@ -79,10 +80,6 @@ class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget binding.notificationsRefreshLayout.setOnRefreshListener(this) } - override fun injectActivity(component: UserComponent?) { - component?.inject(this) - } - override fun onSupportNavigateUp(): Boolean { if (supportFragmentManager.backStackEntryCount > 0) { onBackPressed() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/PrefsActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/PrefsActivity.kt index 6a4f312c5..51b307b62 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/PrefsActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/PrefsActivity.kt @@ -5,13 +5,14 @@ import android.view.ViewGroup import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceScreen import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.ui.fragments.preferences.AccountPreferenceFragment import com.habitrpg.android.habitica.ui.fragments.preferences.EmailNotificationsPreferencesFragment import com.habitrpg.android.habitica.ui.fragments.preferences.PreferencesFragment import com.habitrpg.android.habitica.ui.fragments.preferences.PushNotificationsPreferencesFragment import com.habitrpg.android.habitica.ui.views.SnackbarActivity +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class PrefsActivity : BaseActivity(), PreferenceFragmentCompat.OnPreferenceStartScreenCallback, SnackbarActivity { override fun getLayoutResId(): Int = R.layout.activity_prefs @@ -26,10 +27,6 @@ class PrefsActivity : BaseActivity(), PreferenceFragmentCompat.OnPreferenceStart .commit() } - override fun injectActivity(component: UserComponent?) { - component?.inject(this) - } - override fun onSupportNavigateUp(): Boolean { if (supportFragmentManager.backStackEntryCount > 0) { onBackPressed() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ReportMessageActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ReportMessageActivity.kt index 0eaf36795..78a060920 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ReportMessageActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ReportMessageActivity.kt @@ -12,16 +12,17 @@ import androidx.lifecycle.lifecycleScope import androidx.navigation.navArgs import com.google.android.material.bottomsheet.BottomSheetBehavior import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.SocialRepository import com.habitrpg.android.habitica.databinding.ActivityReportMessageBinding import com.habitrpg.android.habitica.ui.helpers.dismissKeyboard import com.habitrpg.common.habitica.extensions.getThemeColor import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.common.habitica.helpers.setMarkdown +import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.launch import javax.inject.Inject +@AndroidEntryPoint class ReportMessageActivity : BaseActivity() { private lateinit var binding: ActivityReportMessageBinding @@ -39,10 +40,6 @@ class ReportMessageActivity : BaseActivity() { return R.layout.activity_report_message } - override fun injectActivity(component: UserComponent?) { - component?.inject(this) - } - override fun getContentView(layoutResId: Int?): View { binding = ActivityReportMessageBinding.inflate(layoutInflater) return binding.root diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SetupActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SetupActivity.kt index ffbfac8cc..01f34d28f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SetupActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SetupActivity.kt @@ -18,7 +18,6 @@ import androidx.lifecycle.lifecycleScope import androidx.preference.PreferenceManager import androidx.viewpager.widget.ViewPager import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.ApiClient import com.habitrpg.android.habitica.data.InventoryRepository import com.habitrpg.android.habitica.data.TaskRepository @@ -31,6 +30,7 @@ import com.habitrpg.android.habitica.ui.fragments.setup.WelcomeFragment import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.common.habitica.helpers.launchCatching import com.viewpagerindicator.IconPagerAdapter +import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.launch @@ -39,6 +39,7 @@ import java.util.Locale import javax.inject.Inject import kotlin.time.Duration.Companion.milliseconds +@AndroidEntryPoint class SetupActivity : BaseActivity(), ViewPager.OnPageChangeListener { private lateinit var binding: ActivitySetupBinding @@ -108,10 +109,6 @@ class SetupActivity : BaseActivity(), ViewPager.OnPageChangeListener { binding.nextButton.setOnClickListener { nextClicked() } } - override fun injectActivity(component: UserComponent?) { - component?.inject(this) - } - override fun onDestroy() { userRepository.close() super.onDestroy() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SkillMemberActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SkillMemberActivity.kt index 2a21886aa..f2c720a27 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SkillMemberActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SkillMemberActivity.kt @@ -7,19 +7,20 @@ import android.view.View import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.SocialRepository import com.habitrpg.android.habitica.databinding.ActivitySkillMembersBinding import com.habitrpg.android.habitica.ui.adapter.social.PartyMemberRecyclerViewAdapter import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.common.habitica.helpers.launchCatching +import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch import javax.inject.Inject +@AndroidEntryPoint class SkillMemberActivity : BaseActivity() { private lateinit var binding: ActivitySkillMembersBinding private var viewAdapter: PartyMemberRecyclerViewAdapter? = null @@ -33,10 +34,6 @@ class SkillMemberActivity : BaseActivity() { return R.layout.activity_skill_members } - override fun injectActivity(component: UserComponent?) { - component?.inject(this) - } - override fun getContentView(layoutResId: Int?): View { binding = ActivitySkillMembersBinding.inflate(layoutInflater) return binding.root diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SkillTasksActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SkillTasksActivity.kt index 59e2a03ab..fbd500c0c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SkillTasksActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SkillTasksActivity.kt @@ -10,16 +10,17 @@ import androidx.fragment.app.Fragment import androidx.viewpager2.adapter.FragmentStateAdapter import com.google.android.material.tabs.TabLayoutMediator import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.TaskRepository import com.habitrpg.android.habitica.databinding.ActivitySkillTasksBinding import com.habitrpg.android.habitica.models.tasks.Task import com.habitrpg.android.habitica.modules.AppModule import com.habitrpg.android.habitica.ui.fragments.skills.SkillTasksRecyclerViewFragment import com.habitrpg.shared.habitica.models.tasks.TaskType +import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject import javax.inject.Named +@AndroidEntryPoint class SkillTasksActivity : BaseActivity() { private lateinit var binding: ActivitySkillTasksBinding @@ -45,10 +46,6 @@ class SkillTasksActivity : BaseActivity() { return binding.root } - override fun injectActivity(component: UserComponent?) { - component?.inject(this) - } - private fun loadTaskLists() { val statePagerAdapter = object : FragmentStateAdapter(supportFragmentManager, lifecycle) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.kt index 19717e335..90b923dc1 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.kt @@ -69,6 +69,7 @@ import com.habitrpg.shared.habitica.models.tasks.Frequency import com.habitrpg.shared.habitica.models.tasks.HabitResetOption import com.habitrpg.shared.habitica.models.tasks.TaskDifficulty import com.habitrpg.shared.habitica.models.tasks.TaskType +import dagger.hilt.android.AndroidEntryPoint import io.realm.RealmList import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.firstOrNull @@ -77,6 +78,7 @@ import kotlinx.coroutines.launch import java.util.Date import javax.inject.Inject +@AndroidEntryPoint class TaskFormActivity : BaseActivity() { private val viewModel: TaskFormViewModel by viewModels() @@ -172,10 +174,6 @@ class TaskFormActivity : BaseActivity() { return binding.root } - override fun injectActivity(component: UserComponent?) { - component?.inject(this) - } - override fun onCreate(savedInstanceState: Bundle?) { overrideModernHeader = false val bundle = intent.extras ?: return diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskSummaryActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskSummaryActivity.kt index e2cae4535..34b49f837 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskSummaryActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskSummaryActivity.kt @@ -38,68 +38,51 @@ import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.withStyle -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.asLiveData import com.google.accompanist.systemuicontroller.rememberSystemUiController import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.SocialRepository import com.habitrpg.android.habitica.data.TaskRepository +import com.habitrpg.android.habitica.data.UserRepository import com.habitrpg.android.habitica.helpers.MainNavigationController import com.habitrpg.android.habitica.helpers.TaskDescriptionBuilder import com.habitrpg.android.habitica.models.members.Member import com.habitrpg.android.habitica.ui.theme.HabiticaTheme import com.habitrpg.android.habitica.ui.viewmodels.BaseViewModel +import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel import com.habitrpg.android.habitica.ui.views.CompletedAt import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper import com.habitrpg.android.habitica.ui.views.UserRow import com.habitrpg.shared.habitica.models.tasks.TaskType +import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.Flow import java.text.DateFormat import java.util.Date -import javax.inject.Inject -class TaskSummaryViewModel(val taskId: String) : BaseViewModel() { - @Inject - lateinit var taskRespository: TaskRepository +class TaskSummaryViewModel( + userRepository : UserRepository, + userViewModel : MainUserViewModel, + val taskRepository : TaskRepository, + val socialRepository : SocialRepository +) : BaseViewModel(userRepository, userViewModel) { + val taskID : String = "" - @Inject - lateinit var socialRepository: SocialRepository + val task = taskRepository.getTask(taskID).asLiveData() - val task = taskRespository.getTask(taskId).asLiveData() - - override fun inject(component: UserComponent) { - component.inject(this) - } - - fun getMember(userID: String?): Flow { + fun getMember(userID : String?) : Flow { return socialRepository.getMember(userID) } - - @Suppress("UNCHECKED_CAST") - class Factory(private val taskID: String) : ViewModelProvider.Factory { - override fun create(modelClass: Class): T { - return TaskSummaryViewModel(taskID) as T - } - } } +@AndroidEntryPoint class TaskSummaryActivity : BaseActivity() { - override fun getLayoutResId(): Int? = null + override fun getLayoutResId() : Int? = null - private val viewModel: TaskSummaryViewModel by viewModels { - TaskSummaryViewModel.Factory( - intent.extras?.getString( - TaskFormActivity.TASK_ID_KEY - ) ?: "" - ) - } + private val viewModel : TaskSummaryViewModel by viewModels() - override fun onCreate(savedInstanceState: Bundle?) { + override fun onCreate(savedInstanceState : Bundle?) { super.onCreate(savedInstanceState) setContent { HabiticaTheme { @@ -107,14 +90,10 @@ class TaskSummaryActivity : BaseActivity() { } } } - - override fun injectActivity(component: UserComponent?) { - component?.inject(this) - } } @Composable -fun TaskSummaryView(viewModel: TaskSummaryViewModel) { +fun TaskSummaryView(viewModel : TaskSummaryViewModel) { val taskDescriptionBuilder = TaskDescriptionBuilder(LocalContext.current) val task by viewModel.task.observeAsState() val titleModifier = Modifier.padding(top = 30.dp) @@ -327,7 +306,7 @@ fun TaskSummaryView(viewModel: TaskSummaryViewModel) { } } -private fun String.makeBoldComposable(): AnnotatedString { +private fun String.makeBoldComposable() : AnnotatedString { return buildAnnotatedString { var isBold = false for (segment in split("**")) { @@ -338,9 +317,3 @@ private fun String.makeBoldComposable(): AnnotatedString { } } } - -@Preview -@Composable -private fun TaskSummaryViewPreview() { - TaskSummaryView(TaskSummaryViewModel("")) -} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/CustomizationRecyclerViewAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/CustomizationRecyclerViewAdapter.kt index 46226afa5..8817c2332 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/CustomizationRecyclerViewAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/CustomizationRecyclerViewAdapter.kt @@ -5,7 +5,6 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.core.content.ContextCompat -import com.habitrpg.android.habitica.HabiticaBaseApplication import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.databinding.CustomizationGridItemBinding import com.habitrpg.android.habitica.databinding.CustomizationSectionFooterBinding @@ -15,7 +14,6 @@ import com.habitrpg.android.habitica.models.inventory.Customization import com.habitrpg.android.habitica.models.inventory.CustomizationSet import com.habitrpg.android.habitica.models.shops.ShopItem import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog -import com.habitrpg.android.habitica.ui.views.shops.PurchaseDialog import com.habitrpg.common.habitica.extensions.dpToPx import com.habitrpg.common.habitica.extensions.loadImage import com.habitrpg.common.habitica.views.AvatarView @@ -44,6 +42,7 @@ class CustomizationRecyclerViewAdapter() : androidx.recyclerview.widget.Recycler private var pinnedItemKeys: List = ArrayList() var onCustomizationSelected: ((Customization) -> Unit)? = null + var onShowPurchaseDialog: ((ShopItem) -> Unit)? = null override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): androidx.recyclerview.widget.RecyclerView.ViewHolder { return when (viewType) { @@ -212,9 +211,7 @@ class CustomizationRecyclerViewAdapter() : androidx.recyclerview.widget.Recycler dialog.show() } else { customization?.let { - val dialog = PurchaseDialog(itemView.context, HabiticaBaseApplication.userComponent, ShopItem.fromCustomization(it, userSize, hairColor)) - if (it.type == "background") dialog.isPinned = pinnedItemKeys.contains(ShopItem.fromCustomization(it, userSize, hairColor).key) - dialog.show() + onShowPurchaseDialog?.invoke(ShopItem.fromCustomization(it, userSize, hairColor)) } } return @@ -293,8 +290,7 @@ class CustomizationRecyclerViewAdapter() : androidx.recyclerview.widget.Recycler override fun onClick(v: View) { set?.let { - val dialog = PurchaseDialog(itemView.context, HabiticaBaseApplication.userComponent, ShopItem.fromCustomizationSet(it, additionalSetItems, userSize, hairColor)) - dialog.show() + onShowPurchaseDialog?.invoke(ShopItem.fromCustomizationSet(it, additionalSetItems, userSize, hairColor)) } } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/ShopRecyclerAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/ShopRecyclerAdapter.kt index 1cba9f788..c2fd65054 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/ShopRecyclerAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/ShopRecyclerAdapter.kt @@ -22,6 +22,7 @@ import com.habitrpg.common.habitica.extensions.fromHtml class ShopRecyclerAdapter : androidx.recyclerview.widget.RecyclerView.Adapter() { var onNeedsRefresh: (() -> Unit)? = null + var onShowPurchaseDialog: ((ShopItem, Boolean) -> Unit)? = null private val items: MutableList = ArrayList() private var shopIdentifier: String? = null @@ -96,6 +97,7 @@ class ShopRecyclerAdapter : androidx.recyclerview.widget.RecyclerView.Adapter val formattedNumber = NumberAbbreviator.abbreviate(itemView.context, guild.memberCount.toDouble(), number) binding.guildBadgeView.setImageBitmap( HabiticaIconsHelper.imageOfGuildCrest( - itemView.context, false, false, guild.memberCount.toFloat(), diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/challenges/ChallengeTasksRecyclerViewAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/challenges/ChallengeTasksRecyclerViewAdapter.kt index d700317cb..2576ea062 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/challenges/ChallengeTasksRecyclerViewAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/challenges/ChallengeTasksRecyclerViewAdapter.kt @@ -6,7 +6,6 @@ import android.view.ViewGroup import android.widget.Button import android.widget.TextView import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.models.tasks.Task import com.habitrpg.android.habitica.ui.adapter.tasks.BaseTasksRecyclerViewAdapter import com.habitrpg.android.habitica.ui.viewHolders.BindableViewHolder @@ -33,10 +32,6 @@ class ChallengeTasksRecyclerViewAdapter( var onAddItem: ((Task) -> Unit)? = null var onTaskOpen: ((Task) -> Unit)? = null - override fun injectThis(component: UserComponent) { - component.inject(this) - } - override fun getItemViewType(position: Int): Int { val task = this.filteredContent?.get(position) @@ -86,13 +81,13 @@ class ChallengeTasksRecyclerViewAdapter( */ fun replaceTask(task: Task): Boolean { var i = 0 - while (i < this.content?.size ?: 0) { + while (i < (this.content?.size ?: 0)) { if (content?.get(i)?.id == task.id) { break } ++i } - if (i < content?.size ?: 0) { + if (i < (content?.size ?: 0)) { content?.set(i, task) filter() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/BaseTasksRecyclerViewAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/BaseTasksRecyclerViewAdapter.kt index 6e203ff18..3f34942f1 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/BaseTasksRecyclerViewAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/BaseTasksRecyclerViewAdapter.kt @@ -4,16 +4,11 @@ import android.content.Context import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import com.habitrpg.android.habitica.HabiticaBaseApplication -import com.habitrpg.android.habitica.components.UserComponent -import com.habitrpg.android.habitica.data.TaskRepository import com.habitrpg.android.habitica.models.tasks.Task import com.habitrpg.android.habitica.ui.adapter.BaseRecyclerViewAdapter import com.habitrpg.android.habitica.ui.viewHolders.BindableViewHolder import com.habitrpg.android.habitica.ui.viewmodels.TasksViewModel -import com.habitrpg.common.habitica.helpers.AnalyticsManager import com.habitrpg.shared.habitica.models.tasks.TaskType -import javax.inject.Inject abstract class BaseTasksRecyclerViewAdapter>( var taskType: TaskType, @@ -22,21 +17,14 @@ abstract class BaseTasksRecyclerViewAdapter>( newContext: Context, private val userID: String? ) : BaseRecyclerViewAdapter() { - @Inject - lateinit var analyticsManager: AnalyticsManager - @Inject - lateinit var taskRepository: TaskRepository protected var content: MutableList? = null protected var filteredContent: MutableList? = null internal var context: Context = newContext.applicationContext init { this.filteredContent = ArrayList() - HabiticaBaseApplication.userComponent?.let { injectThis(it) } } - protected abstract fun injectThis(component: UserComponent) - override fun onBindViewHolder(holder: VH, position: Int) { val item = filteredContent?.get(position) if (item != null) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/RewardsRecyclerViewAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/RewardsRecyclerViewAdapter.kt index 2e61c7f8a..138f706d8 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/RewardsRecyclerViewAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/tasks/RewardsRecyclerViewAdapter.kt @@ -38,6 +38,7 @@ class RewardsRecyclerViewAdapter( override var brokenTaskEvents: ((Task) -> Unit)? = null override var adventureGuideOpenEvents: ((Boolean) -> Unit)? = null var purchaseCardEvents: ((ShopItem) -> Unit)? = null + var onShowPurchaseDialog: ((ShopItem, Boolean) -> Unit)? = null override var taskDisplayMode: String = "standard" set(value) { @@ -80,6 +81,7 @@ class RewardsRecyclerViewAdapter( } else { val viewHolder = ShopItemViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.row_shopitem, parent, false)) viewHolder.purchaseCardAction = { purchaseCardEvents?.invoke(it) } + viewHolder.onShowPurchaseDialog = onShowPurchaseDialog viewHolder } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/AboutFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/AboutFragment.kt index 52c7dd2d1..d2d09814a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/AboutFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/AboutFragment.kt @@ -12,7 +12,6 @@ import android.widget.Toast import androidx.core.net.toUri import com.google.firebase.analytics.FirebaseAnalytics import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.databinding.FragmentAboutBinding import com.habitrpg.android.habitica.helpers.AppConfigManager import com.habitrpg.android.habitica.helpers.MainNavigationController @@ -21,7 +20,9 @@ import com.habitrpg.common.habitica.extensions.DataBindingUtils import com.plattysoft.leonids.ParticleSystem import javax.inject.Inject import javax.inject.Named +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class AboutFragment : BaseMainFragment() { @field:[Inject Named(AppModule.NAMED_USER_ID)] @@ -30,9 +31,6 @@ class AboutFragment : BaseMainFragment() { @Inject lateinit var appConfigManager: AppConfigManager - override fun injectFragment(component: UserComponent) { - component.inject(this) - } private val privacyPolicyLink = "https://habitica.com/static/privacy" private val termsLink = "https://habitica.com/static/terms" @@ -85,7 +83,7 @@ class AboutFragment : BaseMainFragment() { private val versionName: String by lazy { try { @Suppress("DEPRECATION") - activity?.packageManager?.getPackageInfo(activity?.packageName ?: "", 0)?.versionName ?: "" + mainActivity?.packageManager?.getPackageInfo(mainActivity?.packageName ?: "", 0)?.versionName ?: "" } catch (e: PackageManager.NameNotFoundException) { "" } @@ -94,7 +92,7 @@ class AboutFragment : BaseMainFragment() { private val versionCode: Int by lazy { try { @Suppress("DEPRECATION") - activity?.packageManager?.getPackageInfo(activity?.packageName ?: "", 0)?.versionCode ?: 0 + mainActivity?.packageManager?.getPackageInfo(mainActivity?.packageName ?: "", 0)?.versionCode ?: 0 } catch (e: PackageManager.NameNotFoundException) { 0 } @@ -132,8 +130,8 @@ class AboutFragment : BaseMainFragment() { val context = context ?: return FirebaseAnalytics.getInstance(context).logEvent("found_easter_egg", null) DataBindingUtils.loadImage(context, "Pet-Sabretooth-Base") { bitmap -> - activity?.runOnUiThread { - activity?.let { + mainActivity?.runOnUiThread { + mainActivity?.let { ParticleSystem(it, 50, bitmap, 3000) .setAcceleration(0.00013f, 90) .setSpeedByComponentsRange(-0.08f, 0.08f, 0.05f, 0.1f) @@ -144,8 +142,8 @@ class AboutFragment : BaseMainFragment() { } } DataBindingUtils.loadImage(context, "Pet-Sabretooth-Golden") { bitmap -> - activity?.runOnUiThread { - activity?.let { + mainActivity?.runOnUiThread { + mainActivity?.let { ParticleSystem(it, 50, bitmap, 3000) .setAcceleration(0.00013f, 90) .setSpeedByComponentsRange(-0.08f, 0.08f, 0.05f, 0.1f) @@ -156,8 +154,8 @@ class AboutFragment : BaseMainFragment() { } } DataBindingUtils.loadImage(context, "Pet-Sabretooth-Red") { bitmap -> - activity?.runOnUiThread { - activity?.let { + mainActivity?.runOnUiThread { + mainActivity?.let { ParticleSystem(it, 50, bitmap, 3000) .setAcceleration(0.00013f, 90) .setSpeedByComponentsRange(-0.08f, 0.08f, 0.05f, 0.1f) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/AchievementsFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/AchievementsFragment.kt index 2d724c16e..b683aaa9c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/AchievementsFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/AchievementsFragment.kt @@ -13,7 +13,6 @@ import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.GridLayoutManager import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.InventoryRepository import com.habitrpg.android.habitica.databinding.FragmentRefreshRecyclerviewBinding import com.habitrpg.android.habitica.ui.adapter.AchievementsAdapter @@ -25,7 +24,9 @@ import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch import javax.inject.Inject +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class AchievementsFragment : BaseMainFragment(), SwipeRefreshLayout.OnRefreshListener { @Inject @@ -48,9 +49,6 @@ class AchievementsFragment : BaseMainFragment : BottomSheetDialogFragment( open val displayedClassName: String? get() = this.javaClass.simpleName - override fun onCreate(savedInstanceState: Bundle?) { - HabiticaBaseApplication.userComponent?.let { - injectFragment(it) - } - super.onCreate(savedInstanceState) - } - abstract fun createBinding(inflater: LayoutInflater, container: ViewGroup?): VB override fun onCreateView( @@ -56,8 +47,6 @@ abstract class BaseDialogFragment : BottomSheetDialogFragment( return binding?.root } - abstract fun injectFragment(component: UserComponent) - override fun onResume() { super.onResume() showTutorialIfNeeded() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseFragment.kt index e52c5303a..5faab5b3a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseFragment.kt @@ -7,8 +7,6 @@ import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import androidx.viewbinding.ViewBinding -import com.habitrpg.android.habitica.HabiticaBaseApplication -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.TutorialRepository import com.habitrpg.android.habitica.ui.activities.MainActivity import com.habitrpg.common.habitica.helpers.AnalyticsManager @@ -38,17 +36,6 @@ abstract class BaseFragment : Fragment() { open val displayedClassName: String? get() = this.javaClass.simpleName - fun initializeComponent() { - if (!shouldInitializeComponent) return - HabiticaBaseApplication.userComponent?.let { - injectFragment(it) - } - } - - override fun onCreate(savedInstanceState: Bundle?) { - initializeComponent() - super.onCreate(savedInstanceState) - } abstract fun createBinding(inflater: LayoutInflater, container: ViewGroup?): VB @@ -61,8 +48,6 @@ abstract class BaseFragment : Fragment() { return binding?.root } - abstract fun injectFragment(component: UserComponent) - override fun onResume() { super.onResume() showTutorialIfNeeded() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseMainFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseMainFragment.kt index 6d34e4049..4b1139bb8 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseMainFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseMainFragment.kt @@ -35,11 +35,11 @@ abstract class BaseMainFragment : BaseFragment() { protected var showsBackButton: Boolean = false - open val activity get() = getActivity() as? MainActivity - val tabLayout get() = activity?.binding?.content?.detailTabs - val collapsingToolbar get() = activity?.binding?.content?.toolbar - val toolbarAccessoryContainer get() = activity?.binding?.content?.toolbarAccessoryContainer - val bottomNavigation get() = activity?.binding?.content?.bottomNavigation + open val mainActivity get() = getActivity() as? MainActivity + val tabLayout get() = mainActivity?.binding?.content?.detailTabs + val collapsingToolbar get() = mainActivity?.binding?.content?.toolbar + val toolbarAccessoryContainer get() = mainActivity?.binding?.content?.toolbarAccessoryContainer + val bottomNavigation get() = mainActivity?.binding?.content?.bottomNavigation var usesTabLayout: Boolean = false var hidesToolbar: Boolean = false var usesBottomNavigation = false @@ -81,24 +81,24 @@ abstract class BaseMainFragment : BaseFragment() { override fun onResume() { super.onResume() - activity?.showBackButton = showsBackButton - activity?.supportActionBar?.setDisplayHomeAsUpEnabled(true) + mainActivity?.showBackButton = showsBackButton + mainActivity?.supportActionBar?.setDisplayHomeAsUpEnabled(true) } override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { super.onCreateOptionsMenu(menu, inflater) - activity?.toolbar?.let { ToolbarColorHelper.colorizeToolbar(it, activity) } + mainActivity?.toolbar?.let { ToolbarColorHelper.colorizeToolbar(it, mainActivity) } updateToolbarInteractivity() } var isTitleInteractive = false open fun updateToolbarInteractivity() { - activity?.binding?.content?.toolbarTitle?.background?.alpha = if (isTitleInteractive) 255 else 0 + mainActivity?.binding?.content?.toolbarTitle?.background?.alpha = if (isTitleInteractive) 255 else 0 if (isTitleInteractive) { - activity?.binding?.content?.toolbarTitle?.setScaledPadding(context, 16, 4, 16, 4) + mainActivity?.binding?.content?.toolbarTitle?.setScaledPadding(context, 16, 4, 16, 4) } else { - activity?.binding?.content?.toolbarTitle?.setPadding(0) + mainActivity?.binding?.content?.toolbarTitle?.setPadding(0) } } @@ -118,11 +118,11 @@ abstract class BaseMainFragment : BaseFragment() { } private fun hideToolbar() { - activity?.binding?.content?.headerView?.visibility = View.GONE + mainActivity?.binding?.content?.headerView?.visibility = View.GONE } private fun showToolbar() { - activity?.binding?.content?.headerView?.visibility = View.VISIBLE + mainActivity?.binding?.content?.headerView?.visibility = View.VISIBLE } private fun disableToolbarScrolling() { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt index 94896c87d..a780f1c12 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt @@ -19,7 +19,6 @@ import androidx.drawerlayout.widget.DrawerLayout import androidx.fragment.app.DialogFragment import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.SimpleItemAnimator -import com.habitrpg.android.habitica.HabiticaBaseApplication import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.data.ContentRepository import com.habitrpg.android.habitica.data.InventoryRepository @@ -59,7 +58,9 @@ import kotlin.time.Duration import kotlin.time.DurationUnit import kotlin.time.ExperimentalTime import kotlin.time.toDuration +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class NavigationDrawerFragment : DialogFragment() { private var binding: DrawerMainBinding? = null @@ -110,7 +111,6 @@ class NavigationDrawerFragment : DialogFragment() { } else { NavigationDrawerAdapter(0, 0) } - HabiticaBaseApplication.userComponent?.inject(this) super.onCreate(savedInstanceState) if (savedInstanceState != null) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NewsFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NewsFragment.kt index b3ed6e4b3..ddfba9898 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NewsFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NewsFragment.kt @@ -11,12 +11,13 @@ import android.webkit.WebView import android.webkit.WebViewClient import androidx.lifecycle.lifecycleScope import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.databinding.FragmentNewsBinding import com.habitrpg.android.habitica.helpers.MainNavigationController import com.habitrpg.common.habitica.helpers.ExceptionHandler +import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.launch +@AndroidEntryPoint class NewsFragment : BaseMainFragment() { override var binding: FragmentNewsBinding? = null @@ -71,9 +72,6 @@ class NewsFragment : BaseMainFragment() { binding?.newsWebview?.loadUrl("$address/static/new-stuff") } - override fun injectFragment(component: UserComponent) { - component.inject(this) - } override fun onResume() { super.onResume() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/PromoInfoFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/PromoInfoFragment.kt index 24db882a4..f69e0c164 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/PromoInfoFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/PromoInfoFragment.kt @@ -4,11 +4,12 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.databinding.FragmentPromoInfoBinding import com.habitrpg.android.habitica.helpers.AppConfigManager import javax.inject.Inject +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class PromoInfoFragment : BaseMainFragment() { override var binding: FragmentPromoInfoBinding? = null @@ -20,9 +21,6 @@ class PromoInfoFragment : BaseMainFragment() { @Inject lateinit var configManager: AppConfigManager - override fun injectFragment(component: UserComponent) { - component.inject(this) - } override fun onCreateView( inflater: LayoutInflater, @@ -41,6 +39,6 @@ class PromoInfoFragment : BaseMainFragment() { override fun onResume() { super.onResume() - activity?.title = "" + mainActivity?.title = "" } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/PromoWebFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/PromoWebFragment.kt index 9016edcec..618a07752 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/PromoWebFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/PromoWebFragment.kt @@ -11,7 +11,9 @@ import com.habitrpg.android.habitica.databinding.FragmentNewsBinding import com.habitrpg.android.habitica.modules.AppModule import javax.inject.Inject import javax.inject.Named +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class PromoWebFragment : BaseMainFragment() { @field:[Inject Named(AppModule.NAMED_USER_ID)] lateinit var userID: String @@ -47,7 +49,4 @@ class PromoWebFragment : BaseMainFragment() { } } - override fun injectFragment(component: UserComponent) { - component.inject(this) - } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/StatsFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/StatsFragment.kt index bec1d020e..f51c3a867 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/StatsFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/StatsFragment.kt @@ -6,9 +6,7 @@ import android.view.View import android.view.ViewGroup import androidx.core.content.ContextCompat import androidx.lifecycle.lifecycleScope -import com.habitrpg.android.habitica.HabiticaBaseApplication import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.InventoryRepository import com.habitrpg.android.habitica.databinding.FragmentStatsBinding import com.habitrpg.android.habitica.extensions.addOkButton @@ -23,10 +21,12 @@ import com.habitrpg.android.habitica.ui.views.stats.BulkAllocateStatsDialog import com.habitrpg.common.habitica.extensions.getThemeColor import com.habitrpg.common.habitica.helpers.launchCatching import com.habitrpg.shared.habitica.models.tasks.Attribute +import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.firstOrNull import javax.inject.Inject import kotlin.math.min +@AndroidEntryPoint class StatsFragment : BaseMainFragment() { override var binding: FragmentStatsBinding? = null @@ -156,7 +156,7 @@ class StatsFragment : BaseMainFragment() { private fun showBulkAllocateDialog() { context?.let { context -> - val dialog = BulkAllocateStatsDialog(context, HabiticaBaseApplication.userComponent) + val dialog = BulkAllocateStatsDialog(context, userRepository) dialog.show() } } @@ -245,9 +245,6 @@ class StatsFragment : BaseMainFragment() { binding?.numberOfPointsTextView?.setScaledPadding(context, 18, 4, 18, 4) } - override fun injectFragment(component: UserComponent) { - component.inject(this) - } private fun updateStats(user: User) { val outfit = user.items?.gear?.equipped diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarCustomizationFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarCustomizationFragment.kt index b8741a2ab..b15b5f55a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarCustomizationFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarCustomizationFragment.kt @@ -20,7 +20,6 @@ import com.google.android.flexbox.FlexDirection.ROW import com.google.android.flexbox.FlexboxLayoutManager import com.google.android.flexbox.JustifyContent import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.CustomizationRepository import com.habitrpg.android.habitica.data.InventoryRepository import com.habitrpg.android.habitica.databinding.BottomSheetBackgroundsFilterBinding @@ -28,6 +27,7 @@ import com.habitrpg.android.habitica.databinding.FragmentRefreshRecyclerviewBind import com.habitrpg.android.habitica.extensions.setTintWith import com.habitrpg.android.habitica.models.CustomizationFilter import com.habitrpg.android.habitica.models.inventory.Customization +import com.habitrpg.android.habitica.models.shops.ShopItem import com.habitrpg.android.habitica.models.user.OwnedCustomization import com.habitrpg.android.habitica.models.user.User import com.habitrpg.android.habitica.ui.adapter.CustomizationRecyclerViewAdapter @@ -36,16 +36,19 @@ import com.habitrpg.android.habitica.ui.helpers.MarginDecoration import com.habitrpg.android.habitica.ui.helpers.SafeDefaultItemAnimator import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaBottomSheetDialog +import com.habitrpg.android.habitica.ui.views.shops.PurchaseDialog import com.habitrpg.common.habitica.extensions.dpToPx import com.habitrpg.common.habitica.extensions.getThemeColor import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.common.habitica.helpers.launchCatching +import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch import javax.inject.Inject +@AndroidEntryPoint class AvatarCustomizationFragment : BaseMainFragment(), SwipeRefreshLayout.OnRefreshListener { @@ -69,7 +72,7 @@ class AvatarCustomizationFragment : private var activeCustomization: String? = null internal var adapter: CustomizationRecyclerViewAdapter = CustomizationRecyclerViewAdapter() - internal var layoutManager: FlexboxLayoutManager = FlexboxLayoutManager(activity, ROW) + internal var layoutManager: FlexboxLayoutManager = FlexboxLayoutManager(mainActivity, ROW) private val currentFilter = MutableStateFlow(CustomizationFilter(false, true)) private val ownedCustomizations = MutableStateFlow>(emptyList()) @@ -96,6 +99,10 @@ class AvatarCustomizationFragment : } } } + adapter.onShowPurchaseDialog = { item -> + val dialog = PurchaseDialog(requireContext(), userRepository, inventoryRepository, item) + dialog.show() + } lifecycleScope.launchCatching { inventoryRepository.getInAppRewards() @@ -118,7 +125,7 @@ class AvatarCustomizationFragment : } adapter.customizationType = type binding?.refreshLayout?.setOnRefreshListener(this) - layoutManager = FlexboxLayoutManager(activity, ROW) + layoutManager = FlexboxLayoutManager(mainActivity, ROW) layoutManager.justifyContent = JustifyContent.CENTER layoutManager.alignItems = AlignItems.FLEX_START binding?.recyclerView?.layoutManager = layoutManager @@ -184,9 +191,6 @@ class AvatarCustomizationFragment : return super.onOptionsItemSelected(item) } - override fun injectFragment(component: UserComponent) { - component.inject(this) - } private fun loadCustomizations() { val type = this.type ?: return diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarEquipmentFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarEquipmentFragment.kt index 95b619d1f..937acf8f0 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarEquipmentFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarEquipmentFragment.kt @@ -8,7 +8,6 @@ import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.GridLayoutManager import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.InventoryRepository import com.habitrpg.android.habitica.databinding.FragmentRefreshRecyclerviewBinding import com.habitrpg.android.habitica.models.user.User @@ -21,7 +20,9 @@ import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.common.habitica.helpers.launchCatching import kotlinx.coroutines.launch import javax.inject.Inject +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class AvatarEquipmentFragment : BaseMainFragment(), SwipeRefreshLayout.OnRefreshListener { @@ -42,7 +43,7 @@ class AvatarEquipmentFragment : private var activeEquipment: String? = null internal var adapter: CustomizationEquipmentRecyclerViewAdapter = CustomizationEquipmentRecyclerViewAdapter() - internal var layoutManager: GridLayoutManager = GridLayoutManager(activity, 2) + internal var layoutManager: GridLayoutManager = GridLayoutManager(mainActivity, 2) override fun onCreateView( inflater: LayoutInflater, @@ -77,7 +78,7 @@ class AvatarEquipmentFragment : } binding?.refreshLayout?.setOnRefreshListener(this) setGridSpanCount(view.width) - val layoutManager = GridLayoutManager(activity, 4) + val layoutManager = GridLayoutManager(mainActivity, 4) layoutManager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() { override fun getSpanSize(position: Int): Int { return if (adapter.getItemViewType(position) == 0) { @@ -97,9 +98,6 @@ class AvatarEquipmentFragment : userViewModel.user.observe(viewLifecycleOwner) { updateUser(it) } } - override fun injectFragment(component: UserComponent) { - component.inject(this) - } private fun loadEquipment() { val type = this.type ?: return diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarOverviewFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarOverviewFragment.kt index 6b6b5700f..cc491d095 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarOverviewFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarOverviewFragment.kt @@ -106,9 +106,6 @@ open class AvatarOverviewFragment : return view } - override fun injectFragment(component: UserComponent) { - component.inject(this) - } private fun displayCustomizationFragment(type: String, category: String?) { MainNavigationController.navigate( diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/EquipmentOverviewFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/EquipmentOverviewFragment.kt index ea96ed9df..29bc88584 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/EquipmentOverviewFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/EquipmentOverviewFragment.kt @@ -1,7 +1,9 @@ package com.habitrpg.android.habitica.ui.fragments.inventory.customization import android.os.Bundle +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class EquipmentOverviewFragment : AvatarOverviewFragment() { override fun onCreate(savedInstanceState: Bundle?) { showCustomization = false diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/equipment/EquipmentDetailFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/equipment/EquipmentDetailFragment.kt index 8f23736ef..b13d825ee 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/equipment/EquipmentDetailFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/equipment/EquipmentDetailFragment.kt @@ -9,7 +9,6 @@ import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.LinearLayoutManager import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.InventoryRepository import com.habitrpg.android.habitica.databinding.FragmentRefreshRecyclerviewBinding import com.habitrpg.android.habitica.helpers.MainNavigationController @@ -21,7 +20,9 @@ import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.common.habitica.helpers.launchCatching import kotlinx.coroutines.launch import javax.inject.Inject +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class EquipmentDetailFragment : BaseMainFragment(), SwipeRefreshLayout.OnRefreshListener { @@ -80,7 +81,7 @@ class EquipmentDetailFragment : this.adapter.type = this.type binding?.recyclerView?.adapter = this.adapter - binding?.recyclerView?.layoutManager = LinearLayoutManager(activity) + binding?.recyclerView?.layoutManager = LinearLayoutManager(mainActivity) binding?.recyclerView?.addItemDecoration(DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL)) binding?.recyclerView?.itemAnimator = SafeDefaultItemAnimator() @@ -96,9 +97,6 @@ class EquipmentDetailFragment : super.onDestroy() } - override fun injectFragment(component: UserComponent) { - component.inject(this) - } override fun onRefresh() { lifecycleScope.launch(ExceptionHandler.coroutine()) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemDialogFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemDialogFragment.kt index 88e690dbb..e265894a9 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemDialogFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemDialogFragment.kt @@ -41,7 +41,9 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch import javax.inject.Inject +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class ItemDialogFragment : BaseDialogFragment() { @Inject @@ -78,9 +80,6 @@ class ItemDialogFragment : BaseDialogFragment() { super.onDestroy() } - override fun injectFragment(component: UserComponent) { - component.inject(this) - } override fun onCreateView( inflater: LayoutInflater, diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemRecyclerFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemRecyclerFragment.kt index f64675aca..559079e30 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemRecyclerFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemRecyclerFragment.kt @@ -48,7 +48,9 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch import javax.inject.Inject +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class ItemRecyclerFragment : BaseFragment(), SwipeRefreshLayout.OnRefreshListener { @Inject @@ -81,9 +83,6 @@ class ItemRecyclerFragment : BaseFragment(), SwipeRefreshL super.onDestroy() } - override fun injectFragment(component: UserComponent) { - component.inject(this) - } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemsFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemsFragment.kt index 374f1efa3..66c506e79 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemsFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemsFragment.kt @@ -8,10 +8,11 @@ import androidx.viewpager2.adapter.FragmentStateAdapter import com.google.android.material.tabs.TabLayout import com.google.android.material.tabs.TabLayoutMediator import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.databinding.FragmentViewpagerBinding import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class ItemsFragment : BaseMainFragment() { override var binding: FragmentViewpagerBinding? = null @@ -48,9 +49,6 @@ class ItemsFragment : BaseMainFragment() { } } - override fun injectFragment(component: UserComponent) { - component.inject(this) - } private fun setViewPagerAdapter() { val fragmentManager = childFragmentManager @@ -91,11 +89,11 @@ class ItemsFragment : BaseMainFragment() { private fun getPageTitle(position: Int): String { return when (position) { - 0 -> activity?.getString(R.string.eggs) - 1 -> activity?.getString(R.string.hatching_potions) - 2 -> activity?.getString(R.string.food) - 3 -> activity?.getString(R.string.quests) - 4 -> activity?.getString(R.string.special) + 0 -> mainActivity?.getString(R.string.eggs) + 1 -> mainActivity?.getString(R.string.hatching_potions) + 2 -> mainActivity?.getString(R.string.food) + 3 -> mainActivity?.getString(R.string.quests) + 4 -> mainActivity?.getString(R.string.special) else -> "" } ?: "" } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/MarketFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/MarketFragment.kt index 184184230..0ea664dea 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/MarketFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/MarketFragment.kt @@ -5,7 +5,9 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import com.habitrpg.android.habitica.models.shops.Shop +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class MarketFragment : ShopFragment() { override fun onCreateView( inflater: LayoutInflater, diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/QuestShopFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/QuestShopFragment.kt index 6d5bae138..40bcc734c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/QuestShopFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/QuestShopFragment.kt @@ -5,7 +5,9 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import com.habitrpg.android.habitica.models.shops.Shop +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class QuestShopFragment : ShopFragment() { override fun onCreateView( inflater: LayoutInflater, diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/SeasonalShopFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/SeasonalShopFragment.kt index a895fb4fa..455efd057 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/SeasonalShopFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/SeasonalShopFragment.kt @@ -5,7 +5,9 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import com.habitrpg.android.habitica.models.shops.Shop +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class SeasonalShopFragment : ShopFragment() { override fun onCreateView( inflater: LayoutInflater, diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/ShopFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/ShopFragment.kt index 8c1f71176..cee875454 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/ShopFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/ShopFragment.kt @@ -13,7 +13,6 @@ import androidx.core.os.bundleOf import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.GridLayoutManager import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.InventoryRepository import com.habitrpg.android.habitica.data.SocialRepository import com.habitrpg.android.habitica.databinding.FragmentRefreshRecyclerviewBinding @@ -28,6 +27,7 @@ import com.habitrpg.android.habitica.ui.helpers.SafeDefaultItemAnimator import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel import com.habitrpg.android.habitica.ui.views.CurrencyText import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog +import com.habitrpg.android.habitica.ui.views.shops.PurchaseDialog import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.common.habitica.helpers.RecyclerViewState import com.habitrpg.common.habitica.helpers.launchCatching @@ -103,6 +103,18 @@ open class ShopFragment : BaseMainFragment() loadMarketGear() } } + adapter?.onShowPurchaseDialog = { item, isPinned -> + val dialog = PurchaseDialog(requireContext(), userRepository, inventoryRepository, item) + dialog.shopIdentifier = shopIdentifier + dialog.isPinned = isPinned + dialog.onGearPurchased = { + loadShopInventory() + if (Shop.MARKET == shopIdentifier) { + loadMarketGear() + } + } + dialog.show() + } adapter?.context = context binding?.recyclerView?.adapter = adapter binding?.recyclerView?.itemAnimator = SafeDefaultItemAnimator() @@ -291,9 +303,6 @@ open class ShopFragment : BaseMainFragment() } } - override fun injectFragment(component: UserComponent) { - component.inject(this) - } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/TimeTravelersShopFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/TimeTravelersShopFragment.kt index 07e32cad7..77217c3b9 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/TimeTravelersShopFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/shops/TimeTravelersShopFragment.kt @@ -6,7 +6,9 @@ import android.view.View import android.view.ViewGroup import com.habitrpg.android.habitica.models.shops.Shop import com.habitrpg.android.habitica.ui.views.CurrencyText +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class TimeTravelersShopFragment : ShopFragment() { override fun onCreateView( inflater: LayoutInflater, diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/MountDetailRecyclerFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/MountDetailRecyclerFragment.kt index 7e8e41817..79620221a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/MountDetailRecyclerFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/MountDetailRecyclerFragment.kt @@ -7,7 +7,6 @@ import android.view.ViewGroup import androidx.lifecycle.lifecycleScope import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.InventoryRepository import com.habitrpg.android.habitica.databinding.FragmentRefreshRecyclerviewBinding import com.habitrpg.android.habitica.extensions.getTranslatedType @@ -25,7 +24,9 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch import javax.inject.Inject +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class MountDetailRecyclerFragment : BaseMainFragment(), SwipeRefreshLayout.OnRefreshListener { @@ -61,9 +62,6 @@ class MountDetailRecyclerFragment : super.onDestroy() } - override fun injectFragment(component: UserComponent) { - component.inject(this) - } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { showsBackButton = true @@ -79,7 +77,7 @@ class MountDetailRecyclerFragment : } binding?.refreshLayout?.setOnRefreshListener(this) - layoutManager = androidx.recyclerview.widget.GridLayoutManager(activity, 4) + layoutManager = androidx.recyclerview.widget.GridLayoutManager(mainActivity, 4) layoutManager?.spanSizeLookup = object : androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup() { override fun getSpanSize(position: Int): Int { return if (adapter?.getItemViewType(position) == 0 || adapter?.getItemViewType(position) == 1) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/PetDetailRecyclerFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/PetDetailRecyclerFragment.kt index ccc243c88..864f0f37d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/PetDetailRecyclerFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/PetDetailRecyclerFragment.kt @@ -7,7 +7,6 @@ import android.view.ViewGroup import androidx.lifecycle.lifecycleScope import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.InventoryRepository import com.habitrpg.android.habitica.databinding.FragmentRefreshRecyclerviewBinding import com.habitrpg.android.habitica.extensions.getTranslatedType @@ -31,7 +30,9 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch import javax.inject.Inject +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class PetDetailRecyclerFragment : BaseMainFragment(), SwipeRefreshLayout.OnRefreshListener { @@ -77,9 +78,6 @@ class PetDetailRecyclerFragment : super.onDestroy() } - override fun injectFragment(component: UserComponent) { - component.inject(this) - } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { showsBackButton = true @@ -143,7 +141,7 @@ class PetDetailRecyclerFragment : override fun onResume() { super.onResume() - activity?.title = animalType + mainActivity?.title = animalType } override fun onSaveInstanceState(outState: Bundle) { @@ -224,7 +222,7 @@ class PetDetailRecyclerFragment : private fun showFeedingDialog(pet: Pet, food: Food?) { if (food != null) { - val context = activity ?: context ?: return + val context = mainActivity ?: context ?: return lifecycleScope.launchCatching { feedPetUseCase.callInteractor( FeedPetUseCase.RequestValues( diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/StableFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/StableFragment.kt index f90a0b7c1..2091f7ee4 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/StableFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/StableFragment.kt @@ -8,11 +8,12 @@ import androidx.fragment.app.viewModels import androidx.viewpager2.adapter.FragmentStateAdapter import com.google.android.material.tabs.TabLayoutMediator import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.databinding.FragmentViewpagerBinding import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment import com.habitrpg.android.habitica.ui.viewmodels.StableViewModel +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class StableFragment : BaseMainFragment() { override var binding: FragmentViewpagerBinding? = null @@ -40,9 +41,6 @@ class StableFragment : BaseMainFragment() { setViewPagerAdapter() } - override fun injectFragment(component: UserComponent) { - component.inject(this) - } private fun setViewPagerAdapter() { val fragmentManager = childFragmentManager @@ -80,8 +78,8 @@ class StableFragment : BaseMainFragment() { private fun getPageTitle(position: Int): String { return when (position) { - 0 -> activity?.getString(R.string.pets) - 1 -> activity?.getString(R.string.mounts) + 0 -> mainActivity?.getString(R.string.pets) + 1 -> mainActivity?.getString(R.string.mounts) else -> "" } ?: "" } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/StableRecyclerFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/StableRecyclerFragment.kt index 52fd8ed60..4f7dcd4f1 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/StableRecyclerFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/StableRecyclerFragment.kt @@ -1,6 +1,5 @@ package com.habitrpg.android.habitica.ui.fragments.inventory.stable -import android.app.Application import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -9,7 +8,6 @@ import androidx.fragment.app.viewModels import androidx.lifecycle.lifecycleScope import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.InventoryRepository import com.habitrpg.android.habitica.data.UserRepository import com.habitrpg.android.habitica.databinding.FragmentRefreshRecyclerviewBinding @@ -22,21 +20,20 @@ import com.habitrpg.android.habitica.ui.helpers.MarginDecoration import com.habitrpg.android.habitica.ui.helpers.SafeDefaultItemAnimator import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel import com.habitrpg.android.habitica.ui.viewmodels.StableViewModel -import com.habitrpg.android.habitica.ui.viewmodels.StableViewModelFactory import com.habitrpg.common.habitica.helpers.EmptyItem import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.common.habitica.helpers.launchCatching +import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.launch import javax.inject.Inject +@AndroidEntryPoint class StableRecyclerFragment : BaseFragment(), SwipeRefreshLayout.OnRefreshListener { - private val viewModel: StableViewModel by viewModels(factoryProducer = { - StableViewModelFactory(context?.applicationContext as? Application, itemType) - }) + private val viewModel: StableViewModel by viewModels() @Inject lateinit var inventoryRepository: InventoryRepository @@ -75,9 +72,6 @@ class StableRecyclerFragment : super.onDestroy() } - override fun injectFragment(component: UserComponent) { - component.inject(this) - } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/AccountPreferenceFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/AccountPreferenceFragment.kt index 126caea9b..3fbeeb6e6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/AccountPreferenceFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/AccountPreferenceFragment.kt @@ -44,7 +44,9 @@ import com.habitrpg.common.habitica.helpers.launchCatching import kotlinx.coroutines.launch import retrofit2.HttpException import javax.inject.Inject +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class AccountPreferenceFragment : BasePreferencesFragment(), SharedPreferences.OnSharedPreferenceChangeListener, @@ -53,8 +55,8 @@ class AccountPreferenceFragment : lateinit var hostConfig: HostConfig @Inject lateinit var apiClient: ApiClient - - private lateinit var viewModel: AuthenticationViewModel + @Inject + lateinit var viewModel: AuthenticationViewModel private lateinit var accountDialog: HabiticaAccountDialog override var user: User? = null @@ -64,9 +66,7 @@ class AccountPreferenceFragment : } override fun onCreate(savedInstanceState: Bundle?) { - HabiticaBaseApplication.userComponent?.inject(this) super.onCreate(savedInstanceState) - viewModel = AuthenticationViewModel() findPreference("confirm_username")?.isVisible = user?.flags?.verifiedUsername == false } @@ -277,7 +277,7 @@ class AccountPreferenceFragment : context?.let { context -> val dialog = HabiticaAlertDialog(context) dialog.setTitle(R.string.change_password) - dialog.addButton(R.string.change, true, false, false) { dialog, _ -> + dialog.addButton(R.string.change, true, false, false) { d, _ -> KeyboardUtil.dismissKeyboard(activity) passwordEditText?.showErrorIfNecessary() passwordRepeatEditText?.showErrorIfNecessary() @@ -293,7 +293,7 @@ class AccountPreferenceFragment : displayType = HabiticaSnackbar.SnackbarDisplayType.SUCCESS ) } - dialog.dismiss() + d.dismiss() } dialog.addCancelButton() dialog.setAdditionalContentView(view) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/EmailNotificationsPreferencesFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/EmailNotificationsPreferencesFragment.kt index 0c6d24027..29c725c5c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/EmailNotificationsPreferencesFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/EmailNotificationsPreferencesFragment.kt @@ -1,22 +1,18 @@ package com.habitrpg.android.habitica.ui.fragments.preferences import android.content.SharedPreferences -import android.os.Bundle import androidx.lifecycle.lifecycleScope import androidx.preference.CheckBoxPreference -import com.habitrpg.android.habitica.HabiticaBaseApplication import com.habitrpg.android.habitica.models.user.User import com.habitrpg.common.habitica.helpers.launchCatching +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class EmailNotificationsPreferencesFragment : BasePreferencesFragment(), SharedPreferences.OnSharedPreferenceChangeListener { private var isInitialSet: Boolean = true private var isSettingUser: Boolean = false - override fun onCreate(savedInstanceState: Bundle?) { - HabiticaBaseApplication.userComponent?.inject(this) - super.onCreate(savedInstanceState) - } override fun onResume() { super.onResume() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/HabiticaAccountDialog.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/HabiticaAccountDialog.kt index a187020fd..df81e264e 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/HabiticaAccountDialog.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/HabiticaAccountDialog.kt @@ -14,7 +14,9 @@ import androidx.fragment.app.DialogFragment import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.databinding.DialogHabiticaAccountBinding import com.habitrpg.android.habitica.models.user.User +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class HabiticaAccountDialog(private var thisContext: Context) : DialogFragment(R.layout.dialog_habitica_account) { private var _binding: DialogHabiticaAccountBinding? = null private val binding get() = _binding!! diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.kt index 8ef4e3ca9..12f22328b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.kt @@ -54,11 +54,13 @@ import com.habitrpg.common.habitica.helpers.AppTestingLevel import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.common.habitica.helpers.LanguageHelper import com.habitrpg.common.habitica.helpers.launchCatching +import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.launch import java.util.Locale import javax.inject.Inject +@AndroidEntryPoint class PreferencesFragment : BasePreferencesFragment(), SharedPreferences.OnSharedPreferenceChangeListener { @@ -84,11 +86,6 @@ class PreferencesFragment : BasePreferencesFragment(), private var serverUrlPreference : ListPreference? = null private var taskListPreference : ListPreference? = null - override fun onCreate(savedInstanceState : Bundle?) { - HabiticaBaseApplication.userComponent?.inject(this) - super.onCreate(savedInstanceState) - } - override fun onViewCreated(view : View, savedInstanceState : Bundle?) { super.onViewCreated(view, savedInstanceState) listView.itemAnimator = null diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PushNotificationsPreferencesFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PushNotificationsPreferencesFragment.kt index ed5b555d6..8ab9c66b4 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PushNotificationsPreferencesFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PushNotificationsPreferencesFragment.kt @@ -1,23 +1,18 @@ package com.habitrpg.android.habitica.ui.fragments.preferences import android.content.SharedPreferences -import android.os.Bundle import androidx.lifecycle.lifecycleScope import androidx.preference.CheckBoxPreference -import com.habitrpg.android.habitica.HabiticaBaseApplication import com.habitrpg.android.habitica.models.user.User import com.habitrpg.common.habitica.helpers.launchCatching +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class PushNotificationsPreferencesFragment : BasePreferencesFragment(), SharedPreferences.OnSharedPreferenceChangeListener { private var isInitialSet: Boolean = true private var isSettingUser: Boolean = false - override fun onCreate(savedInstanceState: Bundle?) { - HabiticaBaseApplication.userComponent?.inject(this) - super.onCreate(savedInstanceState) - } - override fun onResume() { super.onResume() preferenceScreen.sharedPreferences?.registerOnSharedPreferenceChangeListener(this) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/TimePreferenceDialogFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/TimePreferenceDialogFragment.kt index ac80e8b41..b222d1ec9 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/TimePreferenceDialogFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/TimePreferenceDialogFragment.kt @@ -9,7 +9,9 @@ import androidx.preference.PreferenceDialogFragmentCompat import androidx.preference.PreferenceFragmentCompat import com.habitrpg.android.habitica.prefs.TimePreference import java.util.Locale +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class TimePreferenceDialogFragment : PreferenceDialogFragmentCompat() { lateinit var picker: TimePicker diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/GemsPurchaseFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/GemsPurchaseFragment.kt index 1a0963cae..6d5676be9 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/GemsPurchaseFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/GemsPurchaseFragment.kt @@ -40,7 +40,9 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import javax.inject.Inject +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class GemsPurchaseFragment : BaseFragment() { override var binding: FragmentGemPurchaseBinding? = null @@ -56,9 +58,6 @@ class GemsPurchaseFragment : BaseFragment() { @Inject lateinit var purchaseHandler: PurchaseHandler - override fun injectFragment(component: UserComponent) { - component.inject(this) - } private var isGemSaleHappening = false diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/GiftBalanceGemsFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/GiftBalanceGemsFragment.kt index 9db037647..858cafed3 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/GiftBalanceGemsFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/GiftBalanceGemsFragment.kt @@ -18,7 +18,9 @@ import com.habitrpg.android.habitica.ui.fragments.BaseFragment import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog import com.habitrpg.common.habitica.helpers.launchCatching import javax.inject.Inject +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class GiftBalanceGemsFragment : BaseFragment() { @Inject @@ -60,9 +62,6 @@ class GiftBalanceGemsFragment : BaseFragment() { binding?.usernameTextview?.text = it.formattedUsername } - override fun injectFragment(component: UserComponent) { - component.inject(this) - } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/GiftPurchaseGemsFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/GiftPurchaseGemsFragment.kt index 38539c7c5..a8a11c62f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/GiftPurchaseGemsFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/GiftPurchaseGemsFragment.kt @@ -20,7 +20,9 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import javax.inject.Inject +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class GiftPurchaseGemsFragment : BaseFragment() { @Inject @@ -46,9 +48,6 @@ class GiftPurchaseGemsFragment : BaseFragment() private var purchaseHandler: PurchaseHandler? = null - override fun injectFragment(component: UserComponent) { - component.inject(this) - } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/SubscriptionFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/SubscriptionFragment.kt index d6f12a9c0..c23938c86 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/SubscriptionFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/SubscriptionFragment.kt @@ -43,7 +43,9 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import javax.inject.Inject +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class SubscriptionFragment : BaseFragment() { override var binding: FragmentSubscriptionBinding? = null @@ -149,9 +151,6 @@ class SubscriptionFragment : BaseFragment() { } } - override fun injectFragment(component: UserComponent) { - component.inject(this) - } private fun loadInventory() { CoroutineScope(Dispatchers.IO).launchCatching { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/AvatarSetupFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/AvatarSetupFragment.kt index bca11824c..f3c9199fb 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/AvatarSetupFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/AvatarSetupFragment.kt @@ -24,7 +24,9 @@ import com.habitrpg.android.habitica.ui.views.setup.AvatarCategoryView import com.habitrpg.common.habitica.helpers.launchCatching import java.util.Random import javax.inject.Inject +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class AvatarSetupFragment : BaseFragment() { @Inject @@ -113,9 +115,6 @@ class AvatarSetupFragment : BaseFragment() { } } - override fun injectFragment(component: UserComponent) { - component.inject(this) - } private fun loadCustomizations() { val user = this.user ?: return diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/IntroFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/IntroFragment.kt index 49443d97b..449e811b2 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/IntroFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/IntroFragment.kt @@ -8,7 +8,9 @@ import android.view.ViewGroup import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.databinding.FragmentIntroBinding import com.habitrpg.android.habitica.ui.fragments.BaseFragment +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class IntroFragment : BaseFragment() { override var binding: FragmentIntroBinding? = null @@ -52,9 +54,6 @@ class IntroFragment : BaseFragment() { } } - override fun injectFragment(component: UserComponent) { - component.inject(this) - } fun setImage(image: Drawable?) { this.image = image diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/TaskSetupFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/TaskSetupFragment.kt index 6496ed559..2b7995660 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/TaskSetupFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/TaskSetupFragment.kt @@ -19,7 +19,9 @@ import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper import com.habitrpg.shared.habitica.models.tasks.Frequency import com.habitrpg.shared.habitica.models.tasks.TaskType import java.util.Date +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class TaskSetupFragment : BaseFragment() { var activity: SetupActivity? = null @@ -73,9 +75,6 @@ class TaskSetupFragment : BaseFragment() { } } - override fun injectFragment(component: UserComponent) { - component.inject(this) - } private fun setTasks() { this.taskGroups = listOf(listOf(getString(R.string.setup_group_work), TYPE_WORK), listOf(getString(R.string.setup_group_exercise), TYPE_EXERCISE), listOf(getString(R.string.setup_group_health), TYPE_HEALTH), listOf(getString(R.string.setup_group_school), TYPE_SCHOOL), listOf(getString(R.string.setup_group_teams), TYPE_TEAMS), listOf(getString(R.string.setup_group_chores), TYPE_CHORES), listOf(getString(R.string.setup_group_creativity), TYPE_CREATIVITY), listOf(getString(R.string.setuP_group_other), TYPE_OTHER)) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/WelcomeFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/WelcomeFragment.kt index 7084d6f9a..221c4e7b3 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/WelcomeFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/WelcomeFragment.kt @@ -25,7 +25,9 @@ import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch import javax.inject.Inject +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class WelcomeFragment : BaseFragment() { var onNameValid: ((Boolean?) -> Unit)? = null @@ -144,7 +146,4 @@ class WelcomeFragment : BaseFragment() { } } - override fun injectFragment(component: UserComponent) { - component.inject(this) - } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/skills/SkillTasksRecyclerViewFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/skills/SkillTasksRecyclerViewFragment.kt index 116dd322c..bdf166574 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/skills/SkillTasksRecyclerViewFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/skills/SkillTasksRecyclerViewFragment.kt @@ -16,7 +16,9 @@ import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel import com.habitrpg.shared.habitica.models.tasks.TaskType import kotlinx.coroutines.flow.map import javax.inject.Inject +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class SkillTasksRecyclerViewFragment : BaseFragment() { @Inject lateinit var taskRepository: TaskRepository @@ -35,9 +37,6 @@ class SkillTasksRecyclerViewFragment : BaseFragment var onTaskSelection: ((Task) -> Unit)? = null - override fun injectFragment(component: UserComponent) { - component.inject(this) - } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/skills/SkillsFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/skills/SkillsFragment.kt index c1fbc77fe..4ad48afa4 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/skills/SkillsFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/skills/SkillsFragment.kt @@ -11,7 +11,6 @@ import androidx.activity.result.contract.ActivityResultContracts import androidx.core.content.ContextCompat import androidx.lifecycle.lifecycleScope import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.databinding.FragmentRecyclerviewBinding import com.habitrpg.android.habitica.models.Skill import com.habitrpg.android.habitica.models.responses.SkillResponse @@ -31,7 +30,9 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.flow.combine import kotlinx.coroutines.launch import javax.inject.Inject +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class SkillsFragment : BaseMainFragment() { internal var adapter: SkillsRecyclerViewAdapter? = null private var selectedSkill: Skill? = null @@ -58,16 +59,13 @@ class SkillsFragment : BaseMainFragment() { return super.onCreateView(inflater, container, savedInstanceState) } - override fun injectFragment(component: UserComponent) { - component.inject(this) - } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) userViewModel.user.observe(viewLifecycleOwner) { user -> user?.let { checkUserLoadSkills(it) } } - binding?.recyclerView?.layoutManager = androidx.recyclerview.widget.LinearLayoutManager(activity) + binding?.recyclerView?.layoutManager = androidx.recyclerview.widget.LinearLayoutManager(mainActivity) binding?.recyclerView?.adapter = adapter binding?.recyclerView?.itemAnimator = SafeDefaultItemAnimator() } @@ -98,12 +96,12 @@ class SkillsFragment : BaseMainFragment() { when { "special" == skill.habitClass -> { selectedSkill = skill - val intent = Intent(activity, SkillMemberActivity::class.java) + val intent = Intent(mainActivity, SkillMemberActivity::class.java) memberSelectionResult.launch(intent) } skill.target == "task" -> { selectedSkill = skill - val intent = Intent(activity, SkillTasksActivity::class.java) + val intent = Intent(mainActivity, SkillTasksActivity::class.java) taskSelectionResult.launch(intent) } else -> useSkill(skill) @@ -113,7 +111,7 @@ class SkillsFragment : BaseMainFragment() { private fun displaySkillResult(usedSkill: Skill?, response: SkillResponse) { if (!isAdded) return adapter?.mana = response.user?.stats?.mp ?: 0.0 - val activity = activity ?: return + val activity = mainActivity ?: return if ("special" == usedSkill?.habitClass) { showSnackbar(activity.snackbarContainer, context?.getString(R.string.used_skill_without_mana, usedSkill.text), HabiticaSnackbar.SnackbarDisplayType.BLUE) } else { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/ChatFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/ChatFragment.kt index b81ddd77f..15e3329ae 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/ChatFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/ChatFragment.kt @@ -12,7 +12,7 @@ import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager import com.habitrpg.android.habitica.MainNavDirections import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent +import com.habitrpg.android.habitica.data.SocialRepository import com.habitrpg.android.habitica.databinding.FragmentChatBinding import com.habitrpg.android.habitica.extensions.observeOnce import com.habitrpg.android.habitica.helpers.AppConfigManager @@ -22,40 +22,44 @@ import com.habitrpg.android.habitica.ui.activities.FullProfileActivity import com.habitrpg.android.habitica.ui.activities.MainActivity import com.habitrpg.android.habitica.ui.adapter.social.ChatRecyclerViewAdapter import com.habitrpg.android.habitica.ui.fragments.BaseFragment +import com.habitrpg.android.habitica.ui.helpers.AutocompleteAdapter import com.habitrpg.android.habitica.ui.helpers.SafeDefaultItemAnimator import com.habitrpg.android.habitica.ui.viewmodels.GroupViewModel import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar.Companion.showSnackbar import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar.SnackbarDisplayType import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog +import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.delay import javax.inject.Inject import kotlin.time.DurationUnit import kotlin.time.toDuration +@AndroidEntryPoint class ChatFragment : BaseFragment() { - override var binding: FragmentChatBinding? = null + override var binding : FragmentChatBinding? = null - override fun createBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentChatBinding { + override fun createBinding( + inflater : LayoutInflater, + container : ViewGroup? + ) : FragmentChatBinding { return FragmentChatBinding.inflate(inflater, container, false) } - lateinit var viewModel: GroupViewModel + lateinit var viewModel : GroupViewModel @Inject - lateinit var configManager: AppConfigManager + lateinit var configManager : AppConfigManager + @Inject + lateinit var socialRepository: SocialRepository - private var chatAdapter: ChatRecyclerViewAdapter? = null + private var chatAdapter : ChatRecyclerViewAdapter? = null private var navigatedOnceToFragment = false private var isScrolledToBottom = true private var isFirstRefresh = true - var autocompleteContext: String = "" + var autocompleteContext : String = "" - override fun injectFragment(component: UserComponent) { - component.inject(this) - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + override fun onViewCreated(view : View, savedInstanceState : Bundle?) { super.onViewCreated(view, savedInstanceState) val layoutManager = LinearLayoutManager(context) @@ -77,22 +81,31 @@ class ChatFragment : BaseFragment() { binding?.chatBarView?.maxChatLength = configManager.maxChatLength() binding?.chatBarView?.autocompleteContext = "party" binding?.chatBarView?.groupID = viewModel.getGroupData().value?.id + binding?.chatBarView?.autocompleteAdapter = AutocompleteAdapter( + requireContext(), + socialRepository, + autocompleteContext, + viewModel.groupID, + configManager.enableUsernameAutocomplete() + ) + binding?.recyclerView?.adapter = chatAdapter binding?.recyclerView?.itemAnimator = SafeDefaultItemAnimator() - binding?.recyclerView?.addOnScrollListener(object : androidx.recyclerview.widget.RecyclerView.OnScrollListener() { + binding?.recyclerView?.addOnScrollListener(object : + androidx.recyclerview.widget.RecyclerView.OnScrollListener() { override fun onScrolled( - recyclerView: androidx.recyclerview.widget.RecyclerView, - dx: Int, - dy: Int + recyclerView : androidx.recyclerview.widget.RecyclerView, + dx : Int, + dy : Int ) { super.onScrolled(recyclerView, dx, dy) isScrolledToBottom = layoutManager.findFirstVisibleItemPosition() == 0 } }) - viewModel.chatmessages.observe(viewLifecycleOwner, { setChatMessages(it) }) + viewModel.chatmessages.observe(viewLifecycleOwner) { setChatMessages(it) } binding?.chatBarView?.onCommunityGuidelinesAccepted = { viewModel.updateUser("flags.communityGuidelinesAccepted", true) @@ -113,7 +126,7 @@ class ChatFragment : BaseFragment() { } } - private fun setReplyTo(username: String?) { + private fun setReplyTo(username : String?) { val previousMessage = binding?.chatBarView?.message ?: "" if (previousMessage.contains("@$username")) { return @@ -141,22 +154,31 @@ class ChatFragment : BaseFragment() { } } - private fun copyMessageToClipboard(chatMessage: ChatMessage) { + private fun copyMessageToClipboard(chatMessage : ChatMessage) { val clipMan = activity?.getSystemService(Context.CLIPBOARD_SERVICE) as? ClipboardManager val messageText = ClipData.newPlainText("Chat message", chatMessage.text) clipMan?.setPrimaryClip(messageText) val activity = activity as? MainActivity if (activity != null && Build.VERSION.SDK_INT <= Build.VERSION_CODES.S_V2) { - showSnackbar(activity.snackbarContainer, getString(R.string.chat_message_copied), SnackbarDisplayType.NORMAL) + showSnackbar( + activity.snackbarContainer, + getString(R.string.chat_message_copied), + SnackbarDisplayType.NORMAL + ) } } - private fun showFlagConfirmationDialog(chatMessage: ChatMessage) { - val directions = MainNavDirections.actionGlobalReportMessageActivity(chatMessage.text ?: "", chatMessage.user ?: "", chatMessage.id, chatMessage.groupId) + private fun showFlagConfirmationDialog(chatMessage : ChatMessage) { + val directions = MainNavDirections.actionGlobalReportMessageActivity( + chatMessage.text ?: "", + chatMessage.user ?: "", + chatMessage.id, + chatMessage.groupId + ) MainNavigationController.navigate(directions) } - private fun showDeleteConfirmationDialog(chatMessage: ChatMessage) { + private fun showDeleteConfirmationDialog(chatMessage : ChatMessage) { val context = context if (context != null) { val dialog = HabiticaAlertDialog(context) @@ -169,7 +191,7 @@ class ChatFragment : BaseFragment() { } } - private fun setChatMessages(chatMessages: List) { + private fun setChatMessages(chatMessages : List) { chatAdapter?.data = chatMessages binding?.chatBarView?.chatMessages = chatMessages @@ -178,7 +200,7 @@ class ChatFragment : BaseFragment() { markMessagesAsSeen() } - private fun sendChatMessage(chatText: String) { + private fun sendChatMessage(chatText : String) { viewModel.postGroupChat( chatText, { binding?.recyclerView?.scrollToPosition(0) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxMessageListFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxMessageListFragment.kt index 99d0bab2d..f805da4ab 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxMessageListFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxMessageListFragment.kt @@ -16,7 +16,6 @@ import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.RecyclerView import com.habitrpg.android.habitica.MainNavDirections import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.SocialRepository import com.habitrpg.android.habitica.databinding.FragmentInboxMessageListBinding import com.habitrpg.android.habitica.extensions.addOkButton @@ -29,18 +28,19 @@ import com.habitrpg.android.habitica.ui.adapter.social.InboxAdapter import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment import com.habitrpg.android.habitica.ui.helpers.SafeDefaultItemAnimator import com.habitrpg.android.habitica.ui.viewmodels.InboxViewModel -import com.habitrpg.android.habitica.ui.viewmodels.InboxViewModelFactory import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar.Companion.showSnackbar import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.common.habitica.helpers.launchCatching +import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.delay import kotlinx.coroutines.launch import javax.inject.Inject import kotlin.time.DurationUnit import kotlin.time.toDuration +@AndroidEntryPoint class InboxMessageListFragment : BaseMainFragment() { override var binding: FragmentInboxMessageListBinding? = null @@ -58,9 +58,7 @@ class InboxMessageListFragment : BaseMainFragment) { socialRepository.markSomePrivateMessagesAsRead(viewModel.user.value, messages) @@ -205,7 +200,7 @@ class InboxMessageListFragment : BaseMainFragment(), androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnRefreshListener, View.OnClickListener { @Inject @@ -85,7 +86,7 @@ class InboxOverviewFragment : BaseMainFragment(), androidx } override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { - this.activity?.menuInflater?.inflate(R.menu.inbox, menu) + this.mainActivity?.menuInflater?.inflate(R.menu.inbox, menu) val item = menu.findItem(R.id.send_message) tintMenuIcon(item) super.onCreateOptionsMenu(menu, inflater) @@ -102,11 +103,11 @@ class InboxOverviewFragment : BaseMainFragment(), androidx } private fun openNewMessageDialog() { - if (BuildConfig.DEBUG && this.activity == null) { + if (BuildConfig.DEBUG && this.mainActivity == null) { error("Assertion failed") } val binding = DialogChooseMessageRecipientBinding.inflate(layoutInflater) - this.activity?.let { thisActivity -> + this.mainActivity?.let { thisActivity -> val alert = HabiticaAlertDialog(thisActivity) alert.setTitle(getString(R.string.choose_recipient_title)) alert.addButton( @@ -139,9 +140,6 @@ class InboxOverviewFragment : BaseMainFragment(), androidx } } - override fun injectFragment(component: UserComponent) { - component.inject(this) - } private fun retrieveMessages() { lifecycleScope.launchCatching { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/QuestDetailFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/QuestDetailFragment.kt index e484a296d..9ff3b84fd 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/QuestDetailFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/QuestDetailFragment.kt @@ -38,7 +38,9 @@ import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch import javax.inject.Inject import javax.inject.Named +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class QuestDetailFragment : BaseMainFragment() { @Inject @@ -307,7 +309,4 @@ class QuestDetailFragment : BaseMainFragment() { builder.show() } - override fun injectFragment(component: UserComponent) { - component.inject(this) - } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/TavernDetailFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/TavernDetailFragment.kt index 5330f5520..d367293a5 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/TavernDetailFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/TavernDetailFragment.kt @@ -36,7 +36,9 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch import javax.inject.Inject +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class TavernDetailFragment : BaseFragment() { @Inject @@ -171,9 +173,6 @@ class TavernDetailFragment : BaseFragment() { (binding?.playerTiersView?.parent as? ViewGroup)?.invalidate() } - override fun injectFragment(component: UserComponent) { - component.inject(this) - } companion object { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/TavernFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/TavernFragment.kt index 676bf589c..ff9ef6571 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/TavernFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/TavernFragment.kt @@ -20,7 +20,9 @@ import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment import com.habitrpg.android.habitica.ui.viewmodels.GroupViewModel import com.habitrpg.android.habitica.ui.viewmodels.GroupViewType import javax.inject.Inject +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class TavernFragment : BaseMainFragment() { @Inject @@ -60,9 +62,6 @@ class TavernFragment : BaseMainFragment() { super.onDestroy() } - override fun injectFragment(component: UserComponent) { - component.inject(this) - } override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { inflater.inflate(R.menu.menu_tavern, menu) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeDetailFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeDetailFragment.kt index 2c2264c56..fe6b5b7bf 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeDetailFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeDetailFragment.kt @@ -13,7 +13,6 @@ import android.view.ViewGroup import androidx.core.net.toUri import androidx.lifecycle.lifecycleScope import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.ChallengeRepository import com.habitrpg.android.habitica.data.SocialRepository import com.habitrpg.android.habitica.databinding.DialogChallengeDetailTaskGroupBinding @@ -43,7 +42,9 @@ import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map import retrofit2.HttpException import javax.inject.Inject +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class ChallengeDetailFragment : BaseMainFragment() { @Inject @@ -63,9 +64,6 @@ class ChallengeDetailFragment : BaseMainFragment var challenge: Challenge? = null private var isCreator = false - override fun injectFragment(component: UserComponent) { - component.inject(this) - } override fun onCreateView( inflater: LayoutInflater, @@ -248,7 +246,7 @@ class ChallengeDetailFragment : BaseMainFragment binding?.creatorLabel?.tier = creator.contributor?.level ?: 0 binding?.creatorLabel?.username = creator.displayName isCreator = creator.id == userViewModel.userID - this.activity?.invalidateOptionsMenu() + this.mainActivity?.invalidateOptionsMenu() } private fun setJoined(joined: Boolean) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeListFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeListFragment.kt index c73d077ef..4675d3c38 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeListFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeListFragment.kt @@ -26,7 +26,9 @@ import kotlinx.coroutines.flow.combine import kotlinx.coroutines.launch import javax.inject.Inject import javax.inject.Named +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class ChallengeListFragment : BaseFragment(), androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnRefreshListener { @@ -127,9 +129,6 @@ class ChallengeListFragment : ) } - override fun injectFragment(component: UserComponent) { - component.inject(this) - } override fun onRefresh() { nextPageToLoad = 0 diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengesOverviewFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengesOverviewFragment.kt index c501142f5..9c5d35a35 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengesOverviewFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengesOverviewFragment.kt @@ -21,7 +21,9 @@ import com.habitrpg.android.habitica.databinding.FragmentViewpagerBinding import com.habitrpg.android.habitica.ui.activities.ChallengeFormActivity import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment import javax.inject.Inject +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class ChallengesOverviewFragment : BaseMainFragment() { @Inject @@ -66,9 +68,6 @@ class ChallengesOverviewFragment : BaseMainFragment() super.onDestroy() } - override fun injectFragment(component: UserComponent) { - component.inject(this) - } override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { super.onCreateOptionsMenu(menu, inflater) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/guilds/GuildDetailFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/guilds/GuildDetailFragment.kt index 8a7a77dd9..510a4881a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/guilds/GuildDetailFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/guilds/GuildDetailFragment.kt @@ -12,7 +12,6 @@ import androidx.core.view.isVisible import androidx.lifecycle.lifecycleScope import com.habitrpg.android.habitica.MainNavDirections import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.ChallengeRepository import com.habitrpg.android.habitica.data.UserRepository import com.habitrpg.android.habitica.databinding.FragmentGuildDetailBinding @@ -25,18 +24,19 @@ import com.habitrpg.android.habitica.ui.activities.GroupInviteActivity import com.habitrpg.android.habitica.ui.activities.MainActivity import com.habitrpg.android.habitica.ui.fragments.BaseFragment import com.habitrpg.android.habitica.ui.viewmodels.GroupViewModel -import com.habitrpg.android.habitica.ui.views.HabiticaIcons import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper import com.habitrpg.android.habitica.ui.views.SnackbarActivity import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog import com.habitrpg.common.habitica.helpers.launchCatching import com.habitrpg.common.habitica.helpers.setMarkdown +import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.launch import javax.inject.Inject +@AndroidEntryPoint class GuildDetailFragment : BaseFragment() { @Inject @@ -187,13 +187,10 @@ class GuildDetailFragment : BaseFragment() { (this.activity as? MainActivity)?.showSnackbar(title = getString(R.string.left_guild)) } - override fun injectFragment(component: UserComponent) { - component.inject(this) - } private fun updateGuild(guild: Group?) { binding?.titleView?.text = guild?.name - binding?.guildMembersIcon?.setImageBitmap(HabiticaIcons.imageOfGuildCrestMedium((guild?.memberCount ?: 0).toFloat())) + binding?.guildMembersIcon?.setImageBitmap(HabiticaIconsHelper.imageOfGuildCrestMedium((guild?.memberCount ?: 0).toFloat())) binding?.guildMembersText?.text = guild?.memberCount.toString() binding?.guildBankText?.text = guild?.gemCount.toString() binding?.guildSummary?.setMarkdown(guild?.summary) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/guilds/GuildFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/guilds/GuildFragment.kt index e7a689072..008eb7932 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/guilds/GuildFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/guilds/GuildFragment.kt @@ -17,7 +17,6 @@ import androidx.viewpager2.widget.ViewPager2 import com.google.android.material.tabs.TabLayoutMediator import com.google.firebase.analytics.FirebaseAnalytics import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.databinding.FragmentViewpagerBinding import com.habitrpg.android.habitica.models.social.Group import com.habitrpg.android.habitica.ui.activities.GroupFormActivity @@ -25,7 +24,9 @@ import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment import com.habitrpg.android.habitica.ui.fragments.social.ChatFragment import com.habitrpg.android.habitica.ui.viewmodels.GroupViewModel import com.habitrpg.android.habitica.ui.viewmodels.GroupViewType +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class GuildFragment : BaseMainFragment() { internal val viewModel: GroupViewModel by viewModels() @@ -48,9 +49,6 @@ class GuildFragment : BaseMainFragment() { return super.onCreateView(inflater, container, savedInstanceState) } - override fun injectFragment(component: UserComponent) { - component.inject(this) - } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { showsBackButton = true @@ -58,7 +56,7 @@ class GuildFragment : BaseMainFragment() { viewModel.groupViewType = GroupViewType.GUILD viewModel.getGroupData().observe(viewLifecycleOwner) { setGroup(it) } - viewModel.getIsMemberData().observe(viewLifecycleOwner) { activity?.invalidateOptionsMenu() } + viewModel.getIsMemberData().observe(viewLifecycleOwner) { mainActivity?.invalidateOptionsMenu() } arguments?.let { val args = GuildFragmentArgs.fromBundle(it) @@ -98,15 +96,15 @@ class GuildFragment : BaseMainFragment() { } override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { - if (this.activity != null) { + if (this.mainActivity != null) { if (viewModel.isMember) { if (viewModel.isLeader) { - this.activity?.menuInflater?.inflate(R.menu.guild_admin, menu) + this.mainActivity?.menuInflater?.inflate(R.menu.guild_admin, menu) } else { - this.activity?.menuInflater?.inflate(R.menu.guild_member, menu) + this.mainActivity?.menuInflater?.inflate(R.menu.guild_member, menu) } } else { - this.activity?.menuInflater?.inflate(R.menu.guild_nonmember, menu) + this.mainActivity?.menuInflater?.inflate(R.menu.guild_nonmember, menu) } } super.onCreateOptionsMenu(menu, inflater) @@ -206,7 +204,7 @@ class GuildFragment : BaseMainFragment() { bundle.putString("leader", guild?.leaderID) bundle.putBoolean("leaderOnlyChallenges", guild?.leaderOnlyChallenges ?: true) - val intent = Intent(activity, GroupFormActivity::class.java) + val intent = Intent(mainActivity, GroupFormActivity::class.java) intent.putExtras(bundle) intent.flags = Intent.FLAG_ACTIVITY_REORDER_TO_FRONT groupFormResult.launch(intent) @@ -220,7 +218,7 @@ class GuildFragment : BaseMainFragment() { } private fun setGroup(group: Group?) { - this.activity?.invalidateOptionsMenu() + this.mainActivity?.invalidateOptionsMenu() if (viewModel.isPublicGuild) { chatFragment?.autocompleteContext = "publicGuild" diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/guilds/GuildListFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/guilds/GuildListFragment.kt index 1e05ecb27..8aab2ff17 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/guilds/GuildListFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/guilds/GuildListFragment.kt @@ -20,7 +20,9 @@ import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.common.habitica.helpers.launchCatching import kotlinx.coroutines.launch import javax.inject.Inject +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class GuildListFragment : BaseFragment(), SearchView.OnQueryTextListener, @@ -42,9 +44,6 @@ class GuildListFragment : private var viewAdapter = GuildListAdapter() - override fun injectFragment(component: UserComponent) { - component.inject(this) - } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/guilds/GuildOverviewFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/guilds/GuildOverviewFragment.kt index 9c4c93838..e339993cf 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/guilds/GuildOverviewFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/guilds/GuildOverviewFragment.kt @@ -23,7 +23,9 @@ import com.habitrpg.android.habitica.extensions.addCloseButton import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog import javax.inject.Inject +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class GuildOverviewFragment : BaseMainFragment(), SearchView.OnQueryTextListener { @Inject @@ -54,9 +56,6 @@ class GuildOverviewFragment : BaseMainFragment(), Sear setViewPagerAdapter() } - override fun injectFragment(component: UserComponent) { - component.inject(this) - } override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { super.onCreateOptionsMenu(menu, inflater) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/NoPartyFragmentFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/NoPartyFragmentFragment.kt index e4d4dbf16..2509f8a5e 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/NoPartyFragmentFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/NoPartyFragmentFragment.kt @@ -20,7 +20,6 @@ import androidx.core.os.bundleOf import androidx.lifecycle.lifecycleScope import com.google.firebase.analytics.FirebaseAnalytics import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.SocialRepository import com.habitrpg.android.habitica.databinding.FragmentNoPartyBinding import com.habitrpg.android.habitica.helpers.AppConfigManager @@ -37,7 +36,9 @@ import com.habitrpg.common.habitica.views.AvatarView import kotlinx.coroutines.launch import javax.inject.Inject import kotlin.math.roundToInt +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class NoPartyFragmentFragment : BaseMainFragment() { @Inject @@ -104,7 +105,7 @@ class NoPartyFragmentFragment : BaseMainFragment() { val clipboard = context?.getSystemService(Context.CLIPBOARD_SERVICE) as? ClipboardManager val clip = ClipData.newPlainText(context?.getString(R.string.username), userViewModel.username) clipboard?.setPrimaryClip(clip) - val activity = activity + val activity = mainActivity if (activity != null && Build.VERSION.SDK_INT <= Build.VERSION_CODES.S_V2) { HabiticaSnackbar.showSnackbar(activity.snackbarContainer, getString(R.string.username_copied), HabiticaSnackbar.SnackbarDisplayType.NORMAL) } @@ -114,7 +115,7 @@ class NoPartyFragmentFragment : BaseMainFragment() { val bundle = Bundle() bundle.putString("groupType", "party") bundle.putString("leader", userViewModel.userID) - val intent = Intent(activity, GroupFormActivity::class.java) + val intent = Intent(mainActivity, GroupFormActivity::class.java) intent.putExtras(bundle) intent.flags = Intent.FLAG_ACTIVITY_REORDER_TO_FRONT groupFormResult.launch(intent) @@ -197,9 +198,6 @@ class NoPartyFragmentFragment : BaseMainFragment() { super.onDestroy() } - override fun injectFragment(component: UserComponent) { - component.inject(this) - } companion object { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyDetailFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyDetailFragment.kt index 852a2b255..4846cbdca 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyDetailFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyDetailFragment.kt @@ -49,7 +49,9 @@ import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.launch import javax.inject.Inject import javax.inject.Named +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class PartyDetailFragment : BaseFragment() { var viewModel: PartyViewModel? = null @@ -75,9 +77,6 @@ class PartyDetailFragment : BaseFragment() { @field:[Inject Named(AppModule.NAMED_USER_ID)] lateinit var userId: String - override fun injectFragment(component: UserComponent) { - component.inject(this) - } override fun onDestroyView() { inventoryRepository.close() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyFragment.kt index a9e03f6ed..5058aa4cb 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyFragment.kt @@ -16,7 +16,6 @@ import androidx.viewpager2.adapter.FragmentStateAdapter import androidx.viewpager2.widget.ViewPager2 import com.google.android.material.tabs.TabLayoutMediator import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.databinding.FragmentViewpagerBinding import com.habitrpg.android.habitica.models.social.Group import com.habitrpg.android.habitica.ui.activities.GroupFormActivity @@ -25,7 +24,9 @@ import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment import com.habitrpg.android.habitica.ui.fragments.social.ChatFragment import com.habitrpg.android.habitica.ui.viewmodels.GroupViewType import com.habitrpg.android.habitica.ui.viewmodels.PartyViewModel +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class PartyFragment : BaseMainFragment() { private var detailFragment: PartyDetailFragment? = null @@ -80,9 +81,6 @@ class PartyFragment : BaseMainFragment() { viewModel.retrieveGroup {} } - override fun injectFragment(component: UserComponent) { - component.inject(this) - } private fun updateGroupUI(group: Group?) { viewPagerAdapter?.notifyDataSetChanged() @@ -94,7 +92,7 @@ class PartyFragment : BaseMainFragment() { tabLayout?.visibility = View.VISIBLE } - this.activity?.invalidateOptionsMenu() + this.mainActivity?.invalidateOptionsMenu() } override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { @@ -112,7 +110,7 @@ class PartyFragment : BaseMainFragment() { override fun onOptionsItemSelected(item: MenuItem): Boolean { when (item.itemId) { R.id.menu_invite_item -> { - val intent = Intent(activity, GroupInviteActivity::class.java) + val intent = Intent(mainActivity, GroupInviteActivity::class.java) intent.putExtra("groupType", "party") sendInvitesResult.launch(intent) return true @@ -145,7 +143,7 @@ class PartyFragment : BaseMainFragment() { bundle.putString("leader", group?.leaderID) bundle.putBoolean("leaderCreateChallenge", group?.leaderOnlyChallenges ?: false) - val intent = Intent(activity, GroupFormActivity::class.java) + val intent = Intent(mainActivity, GroupFormActivity::class.java) intent.putExtras(bundle) intent.flags = Intent.FLAG_ACTIVITY_REORDER_TO_FRONT groupFormResult.launch(intent) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyInviteFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyInviteFragment.kt index 84e91b437..f6dc2e692 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyInviteFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyInviteFragment.kt @@ -4,35 +4,41 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import com.habitrpg.android.habitica.components.UserComponent +import com.habitrpg.android.habitica.data.SocialRepository +import com.habitrpg.android.habitica.data.UserRepository import com.habitrpg.android.habitica.databinding.FragmentComposeBinding import com.habitrpg.android.habitica.helpers.AppConfigManager import com.habitrpg.android.habitica.ui.fragments.BaseFragment import com.habitrpg.android.habitica.ui.viewmodels.BaseViewModel +import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel +import dagger.hilt.android.AndroidEntryPoint +import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject -class PartyInviteViewModel: BaseViewModel() { - override fun inject(component : UserComponent) { - - } +@HiltViewModel +class PartyInviteViewModel @Inject constructor( + userRepository : UserRepository, + userViewModel : MainUserViewModel, + val socialRepository : SocialRepository +) : BaseViewModel(userRepository, userViewModel) { } +@AndroidEntryPoint class PartyInviteFragment : BaseFragment() { @Inject - lateinit var configManager: AppConfigManager + lateinit var configManager : AppConfigManager - override var binding: FragmentComposeBinding? = null + override var binding : FragmentComposeBinding? = null - override fun createBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentComposeBinding { + override fun createBinding( + inflater : LayoutInflater, + container : ViewGroup? + ) : FragmentComposeBinding { return FragmentComposeBinding.inflate(inflater, container, false) } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + override fun onViewCreated(view : View, savedInstanceState : Bundle?) { super.onViewCreated(view, savedInstanceState) } - - override fun injectFragment(component: UserComponent) { - component.inject(this) - } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyInvitePagerFragmennt.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyInvitePagerFragmennt.kt index 2a3c93950..9e2db96da 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyInvitePagerFragmennt.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyInvitePagerFragmennt.kt @@ -8,10 +8,11 @@ import androidx.fragment.app.Fragment import androidx.viewpager2.adapter.FragmentStateAdapter import com.google.android.material.tabs.TabLayoutMediator import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.databinding.FragmentViewpagerBinding import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class PartyInvitePagerFragment : BaseMainFragment() { override var binding : FragmentViewpagerBinding? = null @@ -40,10 +41,6 @@ class PartyInvitePagerFragment : BaseMainFragment() { binding?.viewPager?.currentItem = 0 } - override fun injectFragment(component : UserComponent) { - component.inject(this) - } - private fun setViewPagerAdapter() { val fragmentManager = childFragmentManager binding?.viewPager?.adapter = object : FragmentStateAdapter(fragmentManager, lifecycle) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartySeekingFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartySeekingFragment.kt index 7bdebd352..7d4dc2087 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartySeekingFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartySeekingFragment.kt @@ -25,28 +25,29 @@ import androidx.compose.ui.unit.sp import androidx.fragment.app.viewModels import androidx.lifecycle.viewModelScope import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.SocialRepository +import com.habitrpg.android.habitica.data.UserRepository import com.habitrpg.android.habitica.databinding.FragmentComposeBinding import com.habitrpg.android.habitica.models.members.Member import com.habitrpg.android.habitica.ui.fragments.BaseFragment import com.habitrpg.android.habitica.ui.theme.HabiticaTheme import com.habitrpg.android.habitica.ui.viewmodels.BaseViewModel +import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel import com.habitrpg.common.habitica.helpers.launchCatching +import dagger.hilt.android.AndroidEntryPoint +import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject -class PartySeekingViewModel: BaseViewModel() { +@HiltViewModel +class PartySeekingViewModel @Inject constructor( + userRepository : UserRepository, + userViewModel : MainUserViewModel, + val socialRepository : SocialRepository +): BaseViewModel(userRepository, userViewModel) { val isRefreshing = mutableStateOf(false) - @Inject - lateinit var socialRepository: SocialRepository - val seekingUsers = mutableStateOf>(emptyList()) - override fun inject(component : UserComponent) { - component.inject(this) - } - init { retrieveUsers() } @@ -60,6 +61,7 @@ class PartySeekingViewModel: BaseViewModel() { } } +@AndroidEntryPoint class PartySeekingFragment: BaseFragment() { val viewModel: PartySeekingViewModel by viewModels() @@ -71,10 +73,6 @@ class PartySeekingFragment: BaseFragment() { return FragmentComposeBinding.inflate(inflater) } - override fun injectFragment(component : UserComponent) { - component.inject(this) - } - override fun onCreateView( inflater : LayoutInflater, container : ViewGroup?, diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/support/BugFixFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/support/BugFixFragment.kt index fde635072..c126b0b22 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/support/BugFixFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/support/BugFixFragment.kt @@ -11,7 +11,6 @@ import android.view.ViewGroup import androidx.core.os.bundleOf import androidx.lifecycle.lifecycleScope import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.databinding.FragmentSupportBugFixBinding import com.habitrpg.android.habitica.databinding.KnownIssueBinding import com.habitrpg.android.habitica.helpers.AppConfigManager @@ -23,10 +22,12 @@ import com.habitrpg.common.habitica.extensions.layoutInflater import com.habitrpg.common.habitica.helpers.AppTestingLevel import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.jaredrummler.android.device.DeviceName +import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.launch import javax.inject.Inject import javax.inject.Named +@AndroidEntryPoint class BugFixFragment : BaseMainFragment() { private var deviceInfo: DeviceName.DeviceInfo? = null override var binding: FragmentSupportBugFixBinding? = null @@ -46,9 +47,6 @@ class BugFixFragment : BaseMainFragment() { @Inject lateinit var userViewModel: MainUserViewModel - override fun injectFragment(component: UserComponent) { - component.inject(this) - } override fun onCreateView( inflater: LayoutInflater, @@ -88,7 +86,7 @@ class BugFixFragment : BaseMainFragment() { private val versionName: String by lazy { try { - activity?.packageManager?.getPackageInfo(activity?.packageName ?: "", 0)?.versionName + mainActivity?.packageManager?.getPackageInfo(mainActivity?.packageName ?: "", 0)?.versionName ?: "" } catch (e: PackageManager.NameNotFoundException) { "" @@ -98,7 +96,7 @@ class BugFixFragment : BaseMainFragment() { private val versionCode: Int by lazy { try { @Suppress("DEPRECATION") - activity?.packageManager?.getPackageInfo(activity?.packageName ?: "", 0)?.versionCode + mainActivity?.packageManager?.getPackageInfo(mainActivity?.packageName ?: "", 0)?.versionCode ?: 0 } catch (e: PackageManager.NameNotFoundException) { 0 @@ -145,7 +143,7 @@ class BugFixFragment : BaseMainFragment() { bodyOfEmail += "%0D%0ADetails:%0D%0A%0D%0A" - activity?.let { + mainActivity?.let { val emailIntent = Intent(Intent.ACTION_SENDTO) val mailto = "mailto:" + appConfigManager.supportEmail() + "?subject=" + Uri.encode(subject) + diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/support/FAQDetailFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/support/FAQDetailFragment.kt index dc50ef882..c6fadb57a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/support/FAQDetailFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/support/FAQDetailFragment.kt @@ -13,7 +13,9 @@ import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment import com.habitrpg.common.habitica.helpers.MarkdownParser import com.habitrpg.common.habitica.helpers.launchCatching import javax.inject.Inject +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class FAQDetailFragment : BaseMainFragment() { @Inject lateinit var faqRepository: FAQRepository @@ -55,7 +57,4 @@ class FAQDetailFragment : BaseMainFragment() { binding?.answerTextView?.movementMethod = LinkMovementMethod.getInstance() } - override fun injectFragment(component: UserComponent) { - component.inject(this) - } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/support/FAQOverviewFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/support/FAQOverviewFragment.kt index a0e3bedc4..cd044ffe2 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/support/FAQOverviewFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/support/FAQOverviewFragment.kt @@ -20,7 +20,9 @@ import com.habitrpg.common.habitica.extensions.layoutInflater import com.habitrpg.common.habitica.helpers.launchCatching import com.habitrpg.common.habitica.helpers.setMarkdown import javax.inject.Inject +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class FAQOverviewFragment : BaseMainFragment() { override var binding: FragmentFaqOverviewBinding? = null @@ -79,9 +81,6 @@ class FAQOverviewFragment : BaseMainFragment() { super.onDestroy() } - override fun injectFragment(component: UserComponent) { - component.inject(this) - } private fun loadArticles() { lifecycleScope.launchCatching { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/support/SupportMainFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/support/SupportMainFragment.kt index ee37c9337..5f6c28610 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/support/SupportMainFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/support/SupportMainFragment.kt @@ -8,7 +8,6 @@ import android.view.ViewGroup import androidx.core.net.toUri import androidx.lifecycle.lifecycleScope import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.FAQRepository import com.habitrpg.android.habitica.databinding.FragmentSupportMainBinding import com.habitrpg.android.habitica.helpers.AppConfigManager @@ -20,7 +19,9 @@ import com.habitrpg.common.habitica.helpers.ExceptionHandler import kotlinx.coroutines.launch import javax.inject.Inject import javax.inject.Named +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class SupportMainFragment : BaseMainFragment() { override var binding: FragmentSupportMainBinding? = null @@ -63,7 +64,7 @@ class SupportMainFragment : BaseMainFragment() { binding?.resetTutorialButton?.setOnClickListener { lifecycleScope.launch(ExceptionHandler.coroutine()) { userRepository.resetTutorial() - activity?.showSnackbar(null, null, getString(R.string.tutorial_reset_confirmation), displayType = HabiticaSnackbar.SnackbarDisplayType.SUCCESS) + mainActivity?.showSnackbar(null, null, getString(R.string.tutorial_reset_confirmation), displayType = HabiticaSnackbar.SnackbarDisplayType.SUCCESS) } } } @@ -73,7 +74,4 @@ class SupportMainFragment : BaseMainFragment() { super.onDestroy() } - override fun injectFragment(component: UserComponent) { - component.inject(this) - } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/RewardsRecyclerviewFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/RewardsRecyclerviewFragment.kt index 2b95a87ca..b10fae01b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/RewardsRecyclerviewFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/RewardsRecyclerviewFragment.kt @@ -13,17 +13,21 @@ import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import com.habitrpg.android.habitica.R +import com.habitrpg.android.habitica.models.shops.Shop import com.habitrpg.android.habitica.models.shops.ShopItem import com.habitrpg.android.habitica.ui.activities.MainActivity import com.habitrpg.android.habitica.ui.activities.SkillMemberActivity import com.habitrpg.android.habitica.ui.adapter.tasks.RewardsRecyclerViewAdapter import com.habitrpg.android.habitica.ui.helpers.SafeDefaultItemAnimator import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar +import com.habitrpg.android.habitica.ui.views.shops.PurchaseDialog import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.common.habitica.helpers.launchCatching import com.habitrpg.shared.habitica.models.tasks.TaskType +import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.launch +@AndroidEntryPoint class RewardsRecyclerviewFragment : TaskRecyclerViewFragment() { private var showCustomRewards: Boolean = true @@ -72,6 +76,14 @@ class RewardsRecyclerviewFragment : TaskRecyclerViewFragment() { val intent = Intent(activity, SkillMemberActivity::class.java) cardSelectedResult.launch(intent) } + (recyclerAdapter as? RewardsRecyclerViewAdapter)?.onShowPurchaseDialog = { item, isPinned -> + val dialog = PurchaseDialog(requireContext(), userRepository, inventoryRepository, item) + dialog.isPinned = isPinned + dialog.onGearPurchased = { + viewModel.refreshData { } + } + dialog.show() + } recyclerAdapter?.brokenTaskEvents = { showBrokenChallengeDialog(it) } viewModel.user.observe(viewLifecycleOwner) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragment.kt index 1aaa38707..8118ac9bc 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragment.kt @@ -15,7 +15,6 @@ import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView.NO_POSITION import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.InventoryRepository import com.habitrpg.android.habitica.data.TaskRepository import com.habitrpg.android.habitica.data.UserRepository @@ -50,6 +49,7 @@ import com.habitrpg.common.habitica.helpers.launchCatching import com.habitrpg.shared.habitica.models.responses.TaskDirection import com.habitrpg.shared.habitica.models.responses.TaskScoringResult import com.habitrpg.shared.habitica.models.tasks.TaskType +import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.flow.distinctUntilChanged @@ -63,6 +63,7 @@ import kotlinx.coroutines.withContext import java.util.Date import javax.inject.Inject +@AndroidEntryPoint open class TaskRecyclerViewFragment : BaseFragment(), androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnRefreshListener { @@ -142,7 +143,7 @@ open class TaskRecyclerViewFragment : taskRepository.syncErroredTasks() } } - recyclerAdapter?.taskOpenEvents = { task, view -> + recyclerAdapter?.taskOpenEvents = { task, _ -> openTaskForm(task) } recyclerAdapter?.taskScoreEvents = { task, direction -> @@ -230,9 +231,6 @@ open class TaskRecyclerViewFragment : super.onDestroy() } - override fun injectFragment(component: UserComponent) { - component.inject(this) - } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.kt index 298ce46ff..7559c6ded 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.kt @@ -20,9 +20,8 @@ import androidx.fragment.app.viewModels import androidx.lifecycle.lifecycleScope import androidx.viewpager2.adapter.FragmentStateAdapter import androidx.viewpager2.widget.ViewPager2 -import com.habitrpg.android.habitica.HabiticaBaseApplication import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent +import com.habitrpg.android.habitica.data.TagRepository import com.habitrpg.android.habitica.databinding.FragmentViewpagerBinding import com.habitrpg.android.habitica.extensions.setTintWith import com.habitrpg.android.habitica.helpers.AmplitudeManager @@ -35,10 +34,16 @@ import com.habitrpg.android.habitica.ui.views.tasks.TaskFilterDialog import com.habitrpg.common.habitica.extensions.getThemeColor import com.habitrpg.common.habitica.helpers.launchCatching import com.habitrpg.shared.habitica.models.tasks.TaskType +import dagger.hilt.android.AndroidEntryPoint import java.util.Date import java.util.WeakHashMap +import javax.inject.Inject +@AndroidEntryPoint class TasksFragment : BaseMainFragment(), SearchView.OnQueryTextListener, HabiticaBottomNavigationViewListener { + @Inject + lateinit var tagRepository : TagRepository + internal val viewModel: TasksViewModel by viewModels() override var binding: FragmentViewpagerBinding? = null @@ -121,7 +126,7 @@ class TasksFragment : BaseMainFragment(), SearchView.O bottomNavigation?.canAddTasks = viewModel.canAddTasks() } - activity?.binding?.content?.toolbarTitle?.setOnClickListener { + mainActivity?.binding?.content?.toolbarTitle?.setOnClickListener { viewModel.cycleOwnerIDs() } } @@ -133,9 +138,6 @@ class TasksFragment : BaseMainFragment(), SearchView.O super.onPause() } - override fun injectFragment(component: UserComponent) { - component.inject(this) - } override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { super.onCreateOptionsMenu(menu, inflater) @@ -193,11 +195,11 @@ class TasksFragment : BaseMainFragment(), SearchView.O private fun showFilterDialog() { context?.let { - val dialog = TaskFilterDialog(it, HabiticaBaseApplication.userComponent, viewModel.isPersonalBoard) + val dialog = TaskFilterDialog(it, tagRepository, viewModel.isPersonalBoard) dialog.viewModel = viewModel // There are some cases where these things might not be correctly set after the app resumes. This is just to catch that as best as possible - val navigation = bottomNavigation ?: activity?.binding?.content?.bottomNavigation + val navigation = bottomNavigation ?: mainActivity?.binding?.content?.bottomNavigation val taskType = navigation?.activeTaskType ?: activeFragment?.taskType dialog.setOnDismissListener { updateFilterIcon() } @@ -332,7 +334,7 @@ class TasksFragment : BaseMainFragment(), SearchView.O } bundle.putStringArrayList(TaskFormActivity.SELECTED_TAGS_KEY, ArrayList(viewModel.tags)) - val intent = Intent(activity, TaskFormActivity::class.java) + val intent = Intent(mainActivity, TaskFormActivity::class.java) intent.putExtras(bundle) intent.flags = Intent.FLAG_ACTIVITY_REORDER_TO_FRONT if (this.isAdded) { @@ -420,7 +422,7 @@ class TasksFragment : BaseMainFragment(), SearchView.O private fun updateBoardDisplay() { if (viewModel.ownerTitle.isNotBlank()) { - activity?.title = viewModel.ownerTitle + mainActivity?.title = viewModel.ownerTitle MainNavigationController.updateLabel(R.id.tasksFragment, viewModel.ownerTitle.toString()) } viewModel.userViewModel.currentTeamPlan.value = viewModel.teamPlans[viewModel.ownerID.value] diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/AutocompleteAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/AutocompleteAdapter.kt index 0812b69c6..ab433c767 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/AutocompleteAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/AutocompleteAdapter.kt @@ -37,7 +37,7 @@ class AutocompleteAdapter( return object : Filter() { override fun performFiltering(constraint: CharSequence?): FilterResults { val filterResults = FilterResults() - if (constraint != null && constraint.isNotEmpty()) { + if (!constraint.isNullOrEmpty()) { if (constraint[0] == '@' && constraint.length >= 3 && socialRepository != null && remoteAutocomplete) { if (Date().time - lastAutocomplete > 2000) { lastAutocomplete = Date().time diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/ShopItemViewHolder.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/ShopItemViewHolder.kt index dbd7fc05a..c022b63ab 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/ShopItemViewHolder.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/ShopItemViewHolder.kt @@ -5,11 +5,9 @@ import android.graphics.drawable.BitmapDrawable import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView -import com.habitrpg.android.habitica.HabiticaBaseApplication import com.habitrpg.android.habitica.databinding.RowShopitemBinding import com.habitrpg.android.habitica.models.shops.ShopItem import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper -import com.habitrpg.android.habitica.ui.views.shops.PurchaseDialog import com.habitrpg.common.habitica.extensions.dpToPx import com.habitrpg.common.habitica.extensions.isUsingNightModeResources import com.habitrpg.common.habitica.extensions.loadImage @@ -19,6 +17,7 @@ class ShopItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), Vi var shopIdentifier: String? = null private var item: ShopItem? = null var onNeedsRefresh: (() -> Unit)? = null + var onShowPurchaseDialog: ((ShopItem, Boolean) -> Unit)? = null private var context: Context = itemView.context @@ -95,17 +94,7 @@ class ShopItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), Vi override fun onClick(view: View) { val item = item if (item != null && item.isValid) { - - val dialog = PurchaseDialog(context, HabiticaBaseApplication.userComponent, item) - dialog.shopIdentifier = shopIdentifier - dialog.isPinned = isPinned - dialog.purchaseCardAction = { - purchaseCardAction?.invoke(it) - } - dialog.onGearPurchased = { - onNeedsRefresh?.invoke() - } - dialog.show() + onShowPurchaseDialog?.invoke(item, isPinned) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/BaseTaskViewHolder.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/BaseTaskViewHolder.kt index 3d354305b..fc5bf97a4 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/BaseTaskViewHolder.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/BaseTaskViewHolder.kt @@ -239,7 +239,7 @@ abstract class BaseTaskViewHolder constructor( val completedCount = data.group?.assignedUsersDetail?.filter { it.completed }?.size ?: 0 if (completedCount > 0) { completedCountTextView.text = - "$completedCount/${data?.group?.assignedUsersDetail?.size}" + "$completedCount/${data.group?.assignedUsersDetail?.size}" completedCountTextView.visibility = View.VISIBLE } else { completedCountTextView.visibility = View.GONE diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/AuthenticationViewModel.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/AuthenticationViewModel.kt index 3f341ec9e..12a1e2693 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/AuthenticationViewModel.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/AuthenticationViewModel.kt @@ -18,7 +18,6 @@ import com.google.android.gms.common.GoogleApiAvailability import com.google.android.gms.common.GooglePlayServicesUtil import com.google.android.gms.common.Scopes import com.habitrpg.android.habitica.BuildConfig -import com.habitrpg.android.habitica.HabiticaBaseApplication import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.data.ApiClient import com.habitrpg.android.habitica.data.UserRepository @@ -36,28 +35,17 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import javax.inject.Inject -class AuthenticationViewModel() { - @Inject - internal lateinit var apiClient: ApiClient - @Inject - internal lateinit var userRepository: UserRepository - @Inject - internal lateinit var sharedPrefs: SharedPreferences - @Inject - internal lateinit var hostConfig: HostConfig - @Inject - internal lateinit var analyticsManager: AnalyticsManager - @Inject - @JvmField - var keyHelper: KeyHelper? = null +class AuthenticationViewModel @Inject constructor( + val apiClient : ApiClient, + val userRepository : UserRepository, + val sharedPrefs : SharedPreferences, + val hostConfig : HostConfig, + val analyticsManager : AnalyticsManager, + private val keyHelper : KeyHelper? +) { + var googleEmail : String? = null - var googleEmail: String? = null - - init { - HabiticaBaseApplication.userComponent?.inject(this) - } - - fun connectApple(fragmentManager: FragmentManager, onSuccess: (UserAuthResponse) -> Unit) { + fun connectApple(fragmentManager : FragmentManager, onSuccess : (UserAuthResponse) -> Unit) { val configuration = SignInWithAppleConfiguration( clientId = BuildConfig.APPLE_AUTH_CLIENT_ID, redirectUri = "${hostConfig.address}/api/v4/user/auth/apple", @@ -74,6 +62,7 @@ class AuthenticationViewModel() { response.newUser = result.newUser onSuccess(response) } + else -> { } } @@ -81,8 +70,8 @@ class AuthenticationViewModel() { } fun handleGoogleLogin( - activity: Activity, - pickAccountResult: ActivityResultLauncher + activity : Activity, + pickAccountResult : ActivityResultLauncher ) { if (!checkPlayServices(activity)) { return @@ -94,7 +83,7 @@ class AuthenticationViewModel() { ) try { pickAccountResult.launch(intent) - } catch (e: ActivityNotFoundException) { + } catch (e : ActivityNotFoundException) { val alert = HabiticaAlertDialog(activity) alert.setTitle(R.string.authentication_error_title) alert.setMessage(R.string.google_services_missing) @@ -104,9 +93,9 @@ class AuthenticationViewModel() { } fun handleGoogleLoginResult( - activity: Activity, - recoverFromPlayServicesErrorResult: ActivityResultLauncher?, - onSuccess: (Boolean) -> Unit + activity : Activity, + recoverFromPlayServicesErrorResult : ActivityResultLauncher?, + onSuccess : (Boolean) -> Unit ) { val scopesString = Scopes.PROFILE + " " + Scopes.EMAIL val scopes = "oauth2:$scopesString" @@ -122,7 +111,8 @@ class AuthenticationViewModel() { } }) { val token = GoogleAuthUtil.getToken(activity, googleEmail ?: "", scopes) - val response = apiClient.connectSocial("google", googleEmail ?: "", token) ?: return@launchCatching + val response = + apiClient.connectSocial("google", googleEmail ?: "", token) ?: return@launchCatching newUser = response.newUser handleAuthResponse(response) onSuccess(newUser) @@ -130,9 +120,9 @@ class AuthenticationViewModel() { } private fun handleGoogleAuthException( - e: Exception, - activity: Activity, - recoverFromPlayServicesErrorResult: ActivityResultLauncher + e : Exception, + activity : Activity, + recoverFromPlayServicesErrorResult : ActivityResultLauncher ) { if (e is GooglePlayServicesAvailabilityException) { GoogleApiAvailability.getInstance() @@ -154,7 +144,7 @@ class AuthenticationViewModel() { } } - private fun checkPlayServices(activity: Activity): Boolean { + private fun checkPlayServices(activity : Activity) : Boolean { val googleAPI = GoogleApiAvailability.getInstance() val result = googleAPI.isGooglePlayServicesAvailable(activity) if (result != ConnectionResult.SUCCESS) { @@ -170,29 +160,28 @@ class AuthenticationViewModel() { return true } - fun handleAuthResponse(userAuthResponse: UserAuthResponse) { + fun handleAuthResponse(userAuthResponse : UserAuthResponse) { try { saveTokens(userAuthResponse.apiToken, userAuthResponse.id) - } catch (e: Exception) { + } catch (e : Exception) { analyticsManager.logException(e) } - - HabiticaBaseApplication.reloadUserComponent() } @Throws(Exception::class) - private fun saveTokens(api: String, user: String) { + private fun saveTokens(api : String, user : String) { this.apiClient.updateAuthenticationCredentials(user, api) sharedPrefs.edit { putString("UserID", user) - val encryptedKey = if (keyHelper != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - try { - keyHelper?.encrypt(api) - } catch (e: Exception) { - null - } - } else null - if (encryptedKey?.length ?: 0 > 5) { + val encryptedKey = + if (keyHelper != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + try { + keyHelper.encrypt(api) + } catch (e : Exception) { + null + } + } else null + if ((encryptedKey?.length ?: 0) > 5) { putString(user, encryptedKey) } else { // Something might have gone wrong with encryption, so fall back to this. diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/BaseViewModel.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/BaseViewModel.kt index 6cfc6b75c..c2425b131 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/BaseViewModel.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/BaseViewModel.kt @@ -3,33 +3,16 @@ package com.habitrpg.android.habitica.ui.viewmodels import androidx.lifecycle.LiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.habitrpg.android.habitica.HabiticaBaseApplication -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.UserRepository import com.habitrpg.android.habitica.models.user.User import com.habitrpg.common.habitica.helpers.ExceptionHandler import kotlinx.coroutines.launch -import javax.inject.Inject - -abstract class BaseViewModel(initializeComponent: Boolean = true) : ViewModel() { - - @Inject - lateinit var userRepository: UserRepository - @Inject - lateinit var userViewModel: MainUserViewModel +abstract class BaseViewModel (val userRepository : UserRepository, val userViewModel : MainUserViewModel) : ViewModel() { val user: LiveData by lazy { userViewModel.user } - init { - if (initializeComponent) { - HabiticaBaseApplication.userComponent?.let { inject(it) } - } - } - - abstract fun inject(component: UserComponent) - override fun onCleared() { userRepository.close() super.onCleared() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/GroupViewModel.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/GroupViewModel.kt index 4ba3e8200..e6f3117d6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/GroupViewModel.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/GroupViewModel.kt @@ -5,9 +5,9 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.asLiveData import androidx.lifecycle.viewModelScope -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.ChallengeRepository import com.habitrpg.android.habitica.data.SocialRepository +import com.habitrpg.android.habitica.data.UserRepository import com.habitrpg.android.habitica.helpers.MainNavigationController import com.habitrpg.android.habitica.helpers.NotificationsManager import com.habitrpg.android.habitica.models.members.Member @@ -17,7 +17,9 @@ import com.habitrpg.android.habitica.models.social.Group import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.common.habitica.helpers.launchCatching import com.habitrpg.common.habitica.models.notifications.NewChatMessageData +import dagger.hilt.android.lifecycle.HiltViewModel import io.realm.kotlin.toFlow +import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.filterNotNull @@ -28,28 +30,26 @@ import kotlinx.coroutines.launch import retrofit2.HttpException import javax.inject.Inject -enum class GroupViewType(internal val order: String) { +enum class GroupViewType(internal val order : String) { PARTY("party"), GUILD("guild"), TAVERN("tavern") } -open class GroupViewModel(initializeComponent: Boolean) : BaseViewModel(initializeComponent) { - constructor() : this(true) - - @Inject - lateinit var challengeRepository: ChallengeRepository - - @Inject - lateinit var socialRepository: SocialRepository - - @Inject - lateinit var notificationsManager: NotificationsManager +@OptIn(ExperimentalCoroutinesApi::class) +@HiltViewModel +open class GroupViewModel @Inject constructor( + userRepository : UserRepository, + userViewModel : MainUserViewModel, + val challengeRepository : ChallengeRepository, + val socialRepository : SocialRepository, + val notificationsManager : NotificationsManager +) : BaseViewModel(userRepository, userViewModel) { protected val groupIDState = MutableStateFlow(null) - val groupIDFlow: Flow = groupIDState + val groupIDFlow : Flow = groupIDState - var groupViewType: GroupViewType? = null + var groupViewType : GroupViewType? = null private val groupFlow = groupIDFlow .filterNotNull() @@ -67,25 +67,21 @@ open class GroupViewModel(initializeComponent: Boolean) : BaseViewModel(initiali .map { it != null } private val isMemberData = isMemberFlow.asLiveData() - private val _chatMessages: MutableLiveData> by lazy { + private val _chatMessages : MutableLiveData> by lazy { MutableLiveData>(listOf()) } - val chatmessages: LiveData> by lazy { + val chatmessages : LiveData> by lazy { _chatMessages } - var gotNewMessages: Boolean = false - - override fun inject(component: UserComponent) { - component.inject(this) - } + var gotNewMessages : Boolean = false override fun onCleared() { socialRepository.close() super.onCleared() } - fun setGroupID(groupID: String) { + fun setGroupID(groupID : String) { if (groupID == groupIDState.value) return groupIDState.value = groupID @@ -99,22 +95,22 @@ open class GroupViewModel(initializeComponent: Boolean) : BaseViewModel(initiali } } - val groupID: String? + val groupID : String? get() = groupIDState.value - val isMember: Boolean + val isMember : Boolean get() = isMemberData.value ?: false - val leaderID: String? + val leaderID : String? get() = group.value?.leaderID - val isLeader: Boolean + val isLeader : Boolean get() = user.value?.id == leaderID - val isPublicGuild: Boolean + val isPublicGuild : Boolean get() = group.value?.privacy == "public" - fun getGroupData(): LiveData = group - fun getLeaderData(): LiveData = leader - fun getIsMemberData(): LiveData = isMemberData + fun getGroupData() : LiveData = group + fun getLeaderData() : LiveData = leader + fun getIsMemberData() : LiveData = isMemberData - fun retrieveGroup(function: (() -> Unit)?) { + fun retrieveGroup(function : (() -> Unit)?) { if (groupID?.isNotEmpty() == true) { viewModelScope.launch( ExceptionHandler.coroutine { @@ -132,13 +128,13 @@ open class GroupViewModel(initializeComponent: Boolean) : BaseViewModel(initiali } } - fun inviteToGroup(inviteData: HashMap) { + fun inviteToGroup(inviteData : HashMap) { viewModelScope.launchCatching { socialRepository.inviteToGroup(group.value?.id ?: "", inviteData) } } - fun updateOrCreateGroup(bundle: Bundle?) { + fun updateOrCreateGroup(bundle : Bundle?) { viewModelScope.launch(ExceptionHandler.coroutine()) { if (group.value == null) { socialRepository.createGroup( @@ -161,9 +157,9 @@ open class GroupViewModel(initializeComponent: Boolean) : BaseViewModel(initiali } fun leaveGroup( - groupChallenges: List, - keepChallenges: Boolean = true, - function: (() -> Unit)? = null + groupChallenges : List, + keepChallenges : Boolean = true, + function : (() -> Unit)? = null ) { if (!keepChallenges) { viewModelScope.launchCatching { @@ -179,14 +175,14 @@ open class GroupViewModel(initializeComponent: Boolean) : BaseViewModel(initiali } } - fun joinGroup(id: String? = null, function: (() -> Unit)? = null) { + fun joinGroup(id : String? = null, function : (() -> Unit)? = null) { viewModelScope.launchCatching { socialRepository.joinGroup(id ?: groupID) function?.invoke() } } - fun rejectGroupInvite(id: String? = null) { + fun rejectGroupInvite(id : String? = null) { groupID?.let { viewModelScope.launchCatching { socialRepository.rejectGroupInvite(id ?: it) @@ -204,7 +200,7 @@ open class GroupViewModel(initializeComponent: Boolean) : BaseViewModel(initiali } } - fun likeMessage(message: ChatMessage) { + fun likeMessage(message : ChatMessage) { viewModelScope.launchCatching { val message = socialRepository.likeMessage(message) val index = _chatMessages.value?.indexOfFirst { it.id == message?.id } @@ -220,7 +216,7 @@ open class GroupViewModel(initializeComponent: Boolean) : BaseViewModel(initiali } } - fun deleteMessage(chatMessage: ChatMessage) { + fun deleteMessage(chatMessage : ChatMessage) { val oldIndex = _chatMessages.value?.indexOf(chatMessage) ?: return val list = _chatMessages.value?.toMutableList() list?.remove(chatMessage) @@ -236,7 +232,7 @@ open class GroupViewModel(initializeComponent: Boolean) : BaseViewModel(initiali } } - fun postGroupChat(chatText: String, onComplete: () -> Unit, onError: () -> Unit) { + fun postGroupChat(chatText : String, onComplete : () -> Unit, onError : () -> Unit) { groupID?.let { groupID -> viewModelScope.launch( ExceptionHandler.coroutine { @@ -255,7 +251,7 @@ open class GroupViewModel(initializeComponent: Boolean) : BaseViewModel(initiali } } - fun retrieveGroupChat(onComplete: () -> Unit) { + fun retrieveGroupChat(onComplete : () -> Unit) { var groupID = groupID if (groupViewType == GroupViewType.PARTY) { groupID = "party" @@ -271,7 +267,7 @@ open class GroupViewModel(initializeComponent: Boolean) : BaseViewModel(initiali } } - fun updateGroup(bundle: Bundle?) { + fun updateGroup(bundle : Bundle?) { viewModelScope.launch(ExceptionHandler.coroutine()) { socialRepository.updateGroup( group.value, diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/InboxViewModel.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/InboxViewModel.kt index 2cfe61c05..1392ae68b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/InboxViewModel.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/InboxViewModel.kt @@ -2,19 +2,18 @@ package com.habitrpg.android.habitica.ui.viewmodels import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.asLiveData import androidx.lifecycle.viewModelScope import androidx.paging.DataSource import androidx.paging.PagedList import androidx.paging.PositionalDataSource import androidx.paging.toLiveData -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.SocialRepository +import com.habitrpg.android.habitica.data.UserRepository import com.habitrpg.android.habitica.models.members.Member import com.habitrpg.android.habitica.models.social.ChatMessage import com.habitrpg.common.habitica.helpers.ExceptionHandler +import dagger.hilt.android.lifecycle.HiltViewModel import io.realm.kotlin.toFlow import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.MainScope @@ -30,9 +29,13 @@ import kotlinx.coroutines.launch import javax.inject.Inject import kotlin.math.ceil -class InboxViewModel(recipientID: String?, recipientUsername: String?) : BaseViewModel() { - @Inject - lateinit var socialRepository: SocialRepository +@HiltViewModel +class InboxViewModel @Inject constructor( + userRepository : UserRepository, + userViewModel : MainUserViewModel, + val socialRepository : SocialRepository) : BaseViewModel(userRepository, userViewModel) { + val recipientID: String? = null + val recipientUsername: String? = null private var memberIDFlow = MutableStateFlow(null) val memberIDState: StateFlow = memberIDFlow @@ -58,10 +61,6 @@ class InboxViewModel(recipientID: String?, recipientUsername: String?) : BaseVie val memberID: String? get() = memberIDFlow.value - override fun inject(component: UserComponent) { - component.inject(this) - } - fun invalidateDataSource() { dataSourceFactory.sourceLiveData.value?.invalidate() } @@ -153,13 +152,3 @@ class MessagesDataSourceFactory( return latestSource } } - -class InboxViewModelFactory( - private val recipientID: String?, - private val recipientUsername: String? -) : ViewModelProvider.Factory { - - override fun create(modelClass: Class): T { - return InboxViewModel(recipientID, recipientUsername) as T - } -} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/MainActivityViewModel.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/MainActivityViewModel.kt index 8f502e41b..e1d2cedf3 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/MainActivityViewModel.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/MainActivityViewModel.kt @@ -6,10 +6,10 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.viewModelScope import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.api.MaintenanceApiService -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.ContentRepository import com.habitrpg.android.habitica.data.InventoryRepository import com.habitrpg.android.habitica.data.TaskRepository +import com.habitrpg.android.habitica.data.UserRepository import com.habitrpg.android.habitica.helpers.AmplitudeManager import com.habitrpg.android.habitica.helpers.TaskAlarmManager import com.habitrpg.android.habitica.helpers.notifications.PushNotificationManager @@ -21,41 +21,33 @@ import com.habitrpg.common.habitica.helpers.AnalyticsManager import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.common.habitica.helpers.launchCatching import com.habitrpg.shared.habitica.models.responses.MaintenanceResponse +import dagger.hilt.android.lifecycle.HiltViewModel import io.realm.kotlin.isValid import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.launch import java.util.Date import javax.inject.Inject -class MainActivityViewModel : BaseViewModel(), TutorialView.OnTutorialReaction { - @Inject - internal lateinit var hostConfig: HostConfig - @Inject - internal lateinit var pushNotificationManager: PushNotificationManager - @Inject - internal lateinit var sharedPreferences: SharedPreferences - @Inject - internal lateinit var contentRepository: ContentRepository - @Inject - internal lateinit var taskRepository: TaskRepository - @Inject - internal lateinit var inventoryRepository: InventoryRepository - @Inject - internal lateinit var taskAlarmManager: TaskAlarmManager - @Inject - internal lateinit var analyticsManager: AnalyticsManager - @Inject - internal lateinit var maintenanceService: MaintenanceApiService +@HiltViewModel +class MainActivityViewModel @Inject constructor( + userRepository : UserRepository, + userViewModel : MainUserViewModel, + val hostConfig : HostConfig, + val pushNotificationManager : PushNotificationManager, + val sharedPreferences : SharedPreferences, + val contentRepository : ContentRepository, + val taskRepository : TaskRepository, + val inventoryRepository : InventoryRepository, + val taskAlarmManager : TaskAlarmManager, + val analyticsManager : AnalyticsManager, + val maintenanceService : MaintenanceApiService +) : BaseViewModel(userRepository, userViewModel), TutorialView.OnTutorialReaction { - override fun inject(component: UserComponent) { - component.inject(this) - } - - val isAuthenticated: Boolean + val isAuthenticated : Boolean get() = hostConfig.hasAuthentication() - val launchScreen: String? + val launchScreen : String? get() = sharedPreferences.getString("launch_screen", "") - var preferenceLanguage: String? + var preferenceLanguage : String? get() = sharedPreferences.getString("language", "en") set(value) { sharedPreferences.edit { @@ -74,9 +66,14 @@ class MainActivityViewModel : BaseViewModel(), TutorialView.OnTutorialReaction { fun onCreate() { try { viewModelScope.launch(ExceptionHandler.coroutine()) { - taskAlarmManager.scheduleAllSavedAlarms(sharedPreferences.getBoolean("preventDailyReminder", false)) + taskAlarmManager.scheduleAllSavedAlarms( + sharedPreferences.getBoolean( + "preventDailyReminder", + false + ) + ) } - } catch (e: Exception) { + } catch (e : Exception) { analyticsManager.logException(e) } } @@ -89,14 +86,23 @@ class MainActivityViewModel : BaseViewModel(), TutorialView.OnTutorialReaction { } } - fun retrieveUser(forced: Boolean = false) { + fun retrieveUser(forced : Boolean = false) { if (hostConfig.hasAuthentication()) { viewModelScope.launch(ExceptionHandler.coroutine()) { contentRepository.retrieveWorldState() userRepository.retrieveUser(true, forced)?.let { user -> - analyticsManager.setUserProperty("has_party", if (user.party?.id?.isNotEmpty() == true) "true" else "false") - analyticsManager.setUserProperty("is_subscribed", if (user.isSubscribed) "true" else "false") - analyticsManager.setUserProperty("checkin_count", user.loginIncentives.toString()) + analyticsManager.setUserProperty( + "has_party", + if (user.party?.id?.isNotEmpty() == true) "true" else "false" + ) + analyticsManager.setUserProperty( + "is_subscribed", + if (user.isSubscribed) "true" else "false" + ) + analyticsManager.setUserProperty( + "checkin_count", + user.loginIncentives.toString() + ) analyticsManager.setUserProperty("level", user.stats?.lvl?.toString() ?: "") pushNotificationManager.setUser(user) if (!pushNotificationManager.notificationPermissionEnabled()) { @@ -115,23 +121,23 @@ class MainActivityViewModel : BaseViewModel(), TutorialView.OnTutorialReaction { } } - fun updateAllowPushNotifications(allowPushNotifications: Boolean) { + fun updateAllowPushNotifications(allowPushNotifications : Boolean) { sharedPreferences.getBoolean("usePushNotifications", true) sharedPreferences.edit { putBoolean("usePushNotifications", allowPushNotifications) } } - override fun onTutorialCompleted(step: TutorialStep) { + override fun onTutorialCompleted(step : TutorialStep) { updateUser("flags.tutorial." + step.tutorialGroup + "." + step.identifier, true) logTutorialStatus(step, true) } - override fun onTutorialDeferred(step: TutorialStep) { + override fun onTutorialDeferred(step : TutorialStep) { taskRepository.modify(step) { it.displayedOn = Date() } } - fun logTutorialStatus(step: TutorialStep, complete: Boolean) { + fun logTutorialStatus(step : TutorialStep, complete : Boolean) { val additionalData = HashMap() additionalData["eventLabel"] = step.identifier + "-android" additionalData["eventValue"] = step.identifier ?: "" @@ -144,7 +150,7 @@ class MainActivityViewModel : BaseViewModel(), TutorialView.OnTutorialReaction { ) } - fun ifNeedsMaintenance(onResult: ((MaintenanceResponse) -> Unit)) { + fun ifNeedsMaintenance(onResult : ((MaintenanceResponse) -> Unit)) { viewModelScope.launchCatching { val maintenanceResponse = maintenanceService.getMaintenanceStatus() if (maintenanceResponse?.activeMaintenance == null) { @@ -155,10 +161,10 @@ class MainActivityViewModel : BaseViewModel(), TutorialView.OnTutorialReaction { } fun getToolbarTitle( - id: Int, - label: CharSequence?, - eggType: String?, - onSuccess: ((CharSequence?) -> Unit) + id : Int, + label : CharSequence?, + eggType : String?, + onSuccess : ((CharSequence?) -> Unit) ) { if (id == R.id.petDetailRecyclerFragment || id == R.id.mountDetailRecyclerFragment) { viewModelScope.launchCatching { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/MainUserViewModel.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/MainUserViewModel.kt index 997384c40..ef8ad1bd7 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/MainUserViewModel.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/MainUserViewModel.kt @@ -16,8 +16,9 @@ import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.launch +import javax.inject.Inject -class MainUserViewModel(private val providedUserID: String, val userRepository: UserRepository, val socialRepository: SocialRepository) { +class MainUserViewModel @Inject constructor(private val providedUserID: String, val userRepository: UserRepository, val socialRepository: SocialRepository) { val formattedUsername: CharSequence? get() = user.value?.formattedUsername diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/NotificationsViewModel.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/NotificationsViewModel.kt index 8005f46af..78f8e61b6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/NotificationsViewModel.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/NotificationsViewModel.kt @@ -4,8 +4,8 @@ import android.os.Bundle import androidx.core.os.bundleOf import androidx.lifecycle.viewModelScope import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.SocialRepository +import com.habitrpg.android.habitica.data.UserRepository import com.habitrpg.android.habitica.helpers.MainNavigationController import com.habitrpg.android.habitica.helpers.NotificationsManager import com.habitrpg.android.habitica.models.social.UserParty @@ -22,6 +22,7 @@ import com.habitrpg.common.habitica.models.notifications.NewStuffData import com.habitrpg.common.habitica.models.notifications.PartyInvitationData import com.habitrpg.common.habitica.models.notifications.PartyInvite import com.habitrpg.common.habitica.models.notifications.QuestInvitationData +import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.combine @@ -30,11 +31,13 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch import javax.inject.Inject -open class NotificationsViewModel : BaseViewModel() { - @Inject - lateinit var notificationsManager: NotificationsManager - @Inject - lateinit var socialRepository: SocialRepository +@HiltViewModel +open class NotificationsViewModel @Inject constructor( + userRepository : UserRepository, + userViewModel : MainUserViewModel, + val notificationsManager : NotificationsManager, + val socialRepository : SocialRepository +) : BaseViewModel(userRepository, userViewModel) { private val supportedNotificationTypes = listOf( Notification.Type.NEW_STUFF.type, @@ -52,14 +55,10 @@ open class NotificationsViewModel : BaseViewModel() { Notification.Type.QUEST_INVITATION.type ) - private var party: UserParty? = null + private var party : UserParty? = null private val customNotifications = MutableStateFlow>(emptyList()) - override fun inject(component: UserComponent) { - component.inject(this) - } - init { userViewModel.user.observeForever { if (it == null) return@observeForever @@ -77,9 +76,9 @@ open class NotificationsViewModel : BaseViewModel() { } } - fun getNotifications(): Flow> { - val serverNotifications = notificationsManager.getNotifications() - .map { filterSupportedTypes(it) } + fun getNotifications() : Flow> { + val serverNotifications = + notificationsManager.getNotifications().map { filterSupportedTypes(it) } return serverNotifications.combine(customNotifications) { serverNotificationsList, customNotificationsList -> if (serverNotificationsList.firstOrNull { notification -> notification.type == Notification.Type.NEW_STUFF.type } != null) { @@ -89,70 +88,61 @@ open class NotificationsViewModel : BaseViewModel() { }.map { it.sortedBy { notification -> notification.priority } } } - fun getNotificationCount(): Flow { - return getNotifications() - .map { it.count() } + fun getNotificationCount() : Flow { + return getNotifications().map { it.count() }.distinctUntilChanged() + } + + fun allNotificationsSeen() : Flow { + return getNotifications().map { it.all { notification -> notification.seen != false } } .distinctUntilChanged() } - fun allNotificationsSeen(): Flow { - return getNotifications() - .map { it.all { notification -> notification.seen != false } } - .distinctUntilChanged() - } - - fun getHasPartyNotification(): Flow { - return getNotifications() - .map { + fun getHasPartyNotification() : Flow { + return getNotifications().map { it.find { notification -> val data = notification.data as? NewChatMessageData isPartyMessage(data) } != null - } - .distinctUntilChanged() + }.distinctUntilChanged() } - suspend fun refreshNotifications(): User? { + suspend fun refreshNotifications() : User? { return userRepository.retrieveUser(withTasks = false, forced = true) } - private fun filterSupportedTypes(notifications: List): List { + private fun filterSupportedTypes(notifications : List) : List { return notifications.filter { supportedNotificationTypes.contains(it.type) } } - private fun convertInvitationsToNotifications(user: User): MutableList { + private fun convertInvitationsToNotifications(user : User) : MutableList { val notifications = mutableListOf() - notifications.addAll( - user.invitations?.parties?.map { - val notification = Notification() - notification.id = "custom-party-invitation-" + it.id - notification.type = Notification.Type.PARTY_INVITATION.type - val data = PartyInvitationData() - data.invitation = PartyInvite() - data.invitation?.id = it.id - data.invitation?.name = it.name - data.invitation?.inviter = it.inviter - notification.data = data - notification - } ?: emptyList() - ) + notifications.addAll(user.invitations?.parties?.map { + val notification = Notification() + notification.id = "custom-party-invitation-" + it.id + notification.type = Notification.Type.PARTY_INVITATION.type + val data = PartyInvitationData() + data.invitation = PartyInvite() + data.invitation?.id = it.id + data.invitation?.name = it.name + data.invitation?.inviter = it.inviter + notification.data = data + notification + } ?: emptyList()) - notifications.addAll( - user.invitations?.guilds?.map { - val notification = Notification() - notification.id = "custom-guild-invitation-" + it.id - notification.type = Notification.Type.GUILD_INVITATION.type - val data = GuildInvitationData() - data.invitation = GuildInvite() - data.invitation?.id = it.id - data.invitation?.name = it.name - data.invitation?.inviter = it.inviter - data.invitation?.publicGuild = it.publicGuild - notification.data = data - notification - } ?: emptyList() - ) + notifications.addAll(user.invitations?.guilds?.map { + val notification = Notification() + notification.id = "custom-guild-invitation-" + it.id + notification.type = Notification.Type.GUILD_INVITATION.type + val data = GuildInvitationData() + data.invitation = GuildInvite() + data.invitation?.id = it.id + data.invitation?.name = it.name + data.invitation?.inviter = it.inviter + data.invitation?.publicGuild = it.publicGuild + notification.data = data + notification + } ?: emptyList()) val quest = user.party?.quest if (quest != null && quest.RSVPNeeded) { @@ -169,7 +159,7 @@ open class NotificationsViewModel : BaseViewModel() { return notifications } - fun isPartyMessage(data: NewChatMessageData?): Boolean { + fun isPartyMessage(data : NewChatMessageData?) : Boolean { if (party?.isValid != true || data?.group?.id == null) { return false } @@ -181,17 +171,18 @@ open class NotificationsViewModel : BaseViewModel() { * Is the given notification an "artificial" custom notification (created by this class) * instead of one of the ones coming from server. */ - private fun isCustomNotification(notification: Notification): Boolean { + private fun isCustomNotification(notification : Notification) : Boolean { return notification.id.startsWith("custom-") } - private fun isCustomNewStuffNotification(notification: Notification) = + private fun isCustomNewStuffNotification(notification : Notification) = notification.id == "custom-new-stuff-notification" - fun dismissNotification(notification: Notification) { + fun dismissNotification(notification : Notification) { if (isCustomNotification(notification)) { if (isCustomNewStuffNotification(notification)) { - customNotifications.value = customNotifications.value.filterNot { it.id == notification.id } + customNotifications.value = + customNotifications.value.filterNot { it.id == notification.id } } return } @@ -201,14 +192,12 @@ open class NotificationsViewModel : BaseViewModel() { } } - fun dismissAllNotifications(notifications: List) { - val dismissableIds = notifications - .filter { !isCustomNotification(it) } - .filter { !actionableNotificationTypes.contains(it.type) } - .map { it.id } + fun dismissAllNotifications(notifications : List) { + val dismissableIds = notifications.filter { !isCustomNotification(it) } + .filter { !actionableNotificationTypes.contains(it.type) }.map { it.id } - val customNewStuffNotification = notifications - .firstOrNull { isCustomNewStuffNotification(it) } + val customNewStuffNotification = + notifications.firstOrNull { isCustomNewStuffNotification(it) } if (customNewStuffNotification != null) { dismissNotification(customNewStuffNotification) @@ -226,11 +215,10 @@ open class NotificationsViewModel : BaseViewModel() { } } - fun markNotificationsAsSeen(notifications: List) { - val unseenIds = notifications - .filter { !isCustomNotification(it) } - .filter { it.seen == false } - .map { it.id } + fun markNotificationsAsSeen(notifications : List) { + val unseenIds = + notifications.filter { !isCustomNotification(it) }.filter { it.seen == false } + .map { it.id } if (unseenIds.isEmpty()) { return @@ -244,33 +232,47 @@ open class NotificationsViewModel : BaseViewModel() { } } - private fun findNotification(id: String): Notification? { - return notificationsManager.getNotification(id) ?: customNotifications.value?.find { it.id == id } + private fun findNotification(id : String) : Notification? { + return notificationsManager.getNotification(id) + ?: customNotifications.value.find { it.id == id } } - fun click(notificationId: String, navController: MainNavigationController) { + fun click(notificationId : String, navController : MainNavigationController) { val notification = findNotification(notificationId) ?: return dismissNotification(notification) when (notification.type) { Notification.Type.NEW_STUFF.type -> navController.navigate(R.id.newsFragment) - Notification.Type.NEW_CHAT_MESSAGE.type -> clickNewChatMessage(notification, navController) - Notification.Type.GUILD_INVITATION.type -> clickGroupInvitation(notification, navController) - Notification.Type.PARTY_INVITATION.type -> clickGroupInvitation(notification, navController) + Notification.Type.NEW_CHAT_MESSAGE.type -> clickNewChatMessage( + notification, navController + ) + + Notification.Type.GUILD_INVITATION.type -> clickGroupInvitation( + notification, navController + ) + + Notification.Type.PARTY_INVITATION.type -> clickGroupInvitation( + notification, navController + ) + Notification.Type.QUEST_INVITATION.type -> navController.navigate(R.id.partyFragment) - Notification.Type.NEW_MYSTERY_ITEMS.type -> navController.navigate(R.id.itemsFragment, bundleOf(Pair("itemType", "special"))) + Notification.Type.NEW_MYSTERY_ITEMS.type -> navController.navigate( + R.id.itemsFragment, bundleOf(Pair("itemType", "special")) + ) + Notification.Type.UNALLOCATED_STATS_POINTS.type -> navController.navigate(R.id.statsFragment) // Group tasks should go to Group tasks view if that is added to this app at some point Notification.Type.GROUP_TASK_APPROVED.type -> navController.navigate(R.id.tasksFragment) Notification.Type.GROUP_TASK_NEEDS_WORK.type -> navController.navigate(R.id.tasksFragment) - Notification.Type.ITEM_RECEIVED.type -> clickItemReceivedNotification(notification, navController) + Notification.Type.ITEM_RECEIVED.type -> clickItemReceivedNotification( + notification, navController + ) } } private fun clickItemReceivedNotification( - notification: Notification, - navController: MainNavigationController + notification : Notification, navController : MainNavigationController ) { val data = notification.data as? ItemReceivedData when (data?.destination) { @@ -281,8 +283,7 @@ open class NotificationsViewModel : BaseViewModel() { } private fun clickNewChatMessage( - notification: Notification, - navController: MainNavigationController + notification : Notification, navController : MainNavigationController ) { val data = notification.data as? NewChatMessageData if (isPartyMessage(data)) { @@ -292,41 +293,47 @@ open class NotificationsViewModel : BaseViewModel() { } else { val bundle = Bundle() bundle.putString("groupID", data?.group?.id) - bundle.putBoolean("isMember", true) // safe to assume user is member since they got the notification + bundle.putBoolean( + "isMember", true + ) // safe to assume user is member since they got the notification bundle.putInt("tabToOpen", 1) navController.navigate(R.id.guildFragment, bundle) } } private fun clickGroupInvitation( - notification: Notification, - navController: MainNavigationController + notification : Notification, navController : MainNavigationController ) { when (notification.type) { Notification.Type.GUILD_INVITATION.type -> { val bundle = Bundle() val data = notification.data as? GuildInvitationData bundle.putString("groupID", data?.invitation?.id) - bundle.putBoolean("isMember", true) // safe to assume user is member since they got the notification + bundle.putBoolean( + "isMember", true + ) // safe to assume user is member since they got the notification navController.navigate(R.id.guildFragment, bundle) } + Notification.Type.PARTY_INVITATION.type -> { navController.navigate(R.id.partyFragment) } } } - fun accept(notificationId: String) { + fun accept(notificationId : String) { val notification = findNotification(notificationId) ?: return when (notification.type) { Notification.Type.GUILD_INVITATION.type -> { val data = notification.data as? GuildInvitationData acceptGroupInvitation(data?.invitation?.id) } + Notification.Type.PARTY_INVITATION.type -> { val data = notification.data as? PartyInvitationData acceptGroupInvitation(data?.invitation?.id) } + Notification.Type.QUEST_INVITATION.type -> acceptQuestInvitation() Notification.Type.GROUP_TASK_REQUIRES_APPROVAL.type -> acceptTaskApproval(notification) } @@ -339,17 +346,19 @@ open class NotificationsViewModel : BaseViewModel() { } } - fun reject(notificationId: String) { + fun reject(notificationId : String) { val notification = findNotification(notificationId) ?: return when (notification.type) { Notification.Type.GUILD_INVITATION.type -> { val data = notification.data as? GuildInvitationData rejectGroupInvite(data?.invitation?.id) } + Notification.Type.PARTY_INVITATION.type -> { val data = notification.data as? PartyInvitationData rejectGroupInvite(data?.invitation?.id) } + Notification.Type.QUEST_INVITATION.type -> rejectQuestInvitation() Notification.Type.GROUP_TASK_REQUIRES_APPROVAL.type -> rejectTaskApproval(notification) } @@ -358,7 +367,7 @@ open class NotificationsViewModel : BaseViewModel() { } } - private fun acceptGroupInvitation(groupId: String?) { + private fun acceptGroupInvitation(groupId : String?) { groupId?.let { viewModelScope.launch(ExceptionHandler.coroutine()) { socialRepository.joinGroup(it) @@ -367,7 +376,7 @@ open class NotificationsViewModel : BaseViewModel() { } } - fun rejectGroupInvite(groupId: String?) { + fun rejectGroupInvite(groupId : String?) { groupId?.let { viewModelScope.launchCatching { socialRepository.rejectGroupInvite(it) @@ -400,11 +409,11 @@ open class NotificationsViewModel : BaseViewModel() { } } - private fun acceptTaskApproval(notification: Notification) { + private fun acceptTaskApproval(notification : Notification) { notification.data as? GroupTaskRequiresApprovalData } - private fun rejectTaskApproval(notification: Notification) { + private fun rejectTaskApproval(notification : Notification) { notification.data as? GroupTaskRequiresApprovalData } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/PartyViewModel.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/PartyViewModel.kt index f2d97de66..be876dd2a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/PartyViewModel.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/PartyViewModel.kt @@ -2,27 +2,40 @@ package com.habitrpg.android.habitica.ui.viewmodels import androidx.lifecycle.asLiveData import androidx.lifecycle.viewModelScope -import com.habitrpg.android.habitica.components.UserComponent +import com.habitrpg.android.habitica.data.ChallengeRepository +import com.habitrpg.android.habitica.data.SocialRepository +import com.habitrpg.android.habitica.data.UserRepository +import com.habitrpg.android.habitica.helpers.NotificationsManager import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.common.habitica.helpers.launchCatching +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch +import javax.inject.Inject -class PartyViewModel(initializeComponent: Boolean) : GroupViewModel(initializeComponent) { - constructor() : this(true) +@HiltViewModel +class PartyViewModel @Inject constructor( + userRepository : UserRepository, + userViewModel : MainUserViewModel, + challengeRepository : ChallengeRepository, + socialRepository : SocialRepository, + notificationsManager : NotificationsManager +) : GroupViewModel(userRepository, userViewModel, challengeRepository, socialRepository, notificationsManager) { - internal val isQuestActive: Boolean + internal val isQuestActive : Boolean get() = getGroupData().value?.quest?.active == true - internal val isUserOnQuest: Boolean + internal val isUserOnQuest : Boolean get() = !( getGroupData().value?.quest?.members?.none { it.key == user.value?.id } ?: true ) + @OptIn(ExperimentalCoroutinesApi::class) private val membersFlow = groupIDFlow .filterNotNull() .flatMapLatest { socialRepository.getPartyMembers(it) } @@ -32,10 +45,6 @@ class PartyViewModel(initializeComponent: Boolean) : GroupViewModel(initializeCo groupViewType = GroupViewType.PARTY } - override fun inject(component: UserComponent) { - component.inject(this) - } - fun getMembersData() = members fun acceptQuest() { @@ -58,7 +67,7 @@ class PartyViewModel(initializeComponent: Boolean) : GroupViewModel(initializeCo } } - fun showParticipantButtons(): Boolean { + fun showParticipantButtons() : Boolean { val user = user.value return !(user?.party == null || user.party?.quest == null) && !isQuestActive && user.party?.quest?.RSVPNeeded == true } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/StableViewModel.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/StableViewModel.kt index 72f13221d..c23957839 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/StableViewModel.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/StableViewModel.kt @@ -1,16 +1,11 @@ package com.habitrpg.android.habitica.ui.viewmodels -import android.app.Application import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.asLiveData import androidx.lifecycle.viewModelScope -import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.InventoryRepository -import com.habitrpg.android.habitica.extensions.getTranslatedType +import com.habitrpg.android.habitica.data.UserRepository import com.habitrpg.android.habitica.models.inventory.Animal import com.habitrpg.android.habitica.models.inventory.Egg import com.habitrpg.android.habitica.models.inventory.Mount @@ -21,19 +16,20 @@ import com.habitrpg.android.habitica.models.user.OwnedObject import com.habitrpg.android.habitica.models.user.OwnedPet import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.common.habitica.helpers.launchCatching +import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch import javax.inject.Inject -class StableViewModel(private val application: Application?, private val itemType: String?) : BaseViewModel() { +@HiltViewModel +class StableViewModel @Inject constructor( + userRepository : UserRepository, + userViewModel : MainUserViewModel, + val inventoryRepository : InventoryRepository +) : BaseViewModel(userRepository, userViewModel) { - @Inject - lateinit var inventoryRepository: InventoryRepository - - override fun inject(component: UserComponent) { - component.inject(this) - } + private val itemType = "" private val _items: MutableLiveData> = MutableLiveData() val items: LiveData> = _items @@ -119,14 +115,14 @@ class StableViewModel(private val application: Application?, private val itemTyp if (items.size > 0 && items[items.size - 1].javaClass == StableSection::class.java) { items.removeAt(items.size - 1) } - val title = if (itemType == "pets") { + /*val title = if (itemType == "pets") { application?.getString(R.string.pet_category, animal.getTranslatedType(application)) } else { application?.getString(R.string.mount_category, animal.getTranslatedType(application)) } val section = StableSection(animal.type, title ?: "") items.add(section) - lastSection = section + lastSection = section*/ } val isOwned = when (itemType) { "pets" -> { @@ -155,13 +151,3 @@ class StableViewModel(private val application: Application?, private val itemTyp return items } } - -class StableViewModelFactory( - private val application: Application?, - private val itemType: String? -) : ViewModelProvider.Factory { - - override fun create(modelClass: Class): T { - return StableViewModel(application, itemType) as T - } -} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/TaskFormViewModel.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/TaskFormViewModel.kt index 6c3378935..3d4be772f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/TaskFormViewModel.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/TaskFormViewModel.kt @@ -1,16 +1,17 @@ package com.habitrpg.android.habitica.ui.viewmodels import androidx.compose.runtime.mutableStateOf -import com.habitrpg.android.habitica.components.UserComponent +import com.habitrpg.android.habitica.data.UserRepository import com.habitrpg.shared.habitica.models.tasks.Attribute import com.habitrpg.shared.habitica.models.tasks.HabitResetOption import com.habitrpg.shared.habitica.models.tasks.TaskDifficulty +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject -class TaskFormViewModel : BaseViewModel() { - override fun inject(component: UserComponent) { - component.inject(this) - } - +@HiltViewModel +class TaskFormViewModel @Inject constructor( + userRepository : UserRepository, + userViewModel : MainUserViewModel) : BaseViewModel(userRepository, userViewModel) { val taskDifficulty = mutableStateOf(TaskDifficulty.EASY) val selectedAttribute = mutableStateOf(Attribute.STRENGTH) val habitResetOption = mutableStateOf(HabitResetOption.DAILY) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/TasksViewModel.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/TasksViewModel.kt index 4b4e26a63..7597e4711 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/TasksViewModel.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/TasksViewModel.kt @@ -7,9 +7,9 @@ import androidx.core.content.edit import androidx.lifecycle.MutableLiveData import androidx.lifecycle.viewModelScope import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.TagRepository import com.habitrpg.android.habitica.data.TaskRepository +import com.habitrpg.android.habitica.data.UserRepository import com.habitrpg.android.habitica.helpers.AmplitudeManager import com.habitrpg.android.habitica.helpers.AppConfigManager import com.habitrpg.android.habitica.helpers.GroupPlanInfoProvider @@ -20,6 +20,7 @@ import com.habitrpg.common.habitica.helpers.launchCatching import com.habitrpg.shared.habitica.models.responses.TaskDirection import com.habitrpg.shared.habitica.models.responses.TaskScoringResult import com.habitrpg.shared.habitica.models.tasks.TaskType +import dagger.hilt.android.lifecycle.HiltViewModel import io.realm.Case import io.realm.OrderedRealmCollection import io.realm.RealmQuery @@ -29,36 +30,28 @@ import kotlinx.coroutines.launch import java.util.Date import javax.inject.Inject -class TasksViewModel : BaseViewModel(), GroupPlanInfoProvider { - override fun inject(component: UserComponent) { - component.inject(this) - } - - @Inject - lateinit var taskRepository: TaskRepository - - @Inject - lateinit var tagRepository: TagRepository - - @Inject - lateinit var appConfigManager: AppConfigManager - - @Inject - lateinit var sharedPreferences: SharedPreferences - - private var owners: List> = listOf() +@HiltViewModel +class TasksViewModel @Inject constructor( + userRepository : UserRepository, + userViewModel : MainUserViewModel, + val taskRepository : TaskRepository, + val tagRepository : TagRepository, + val appConfigManager : AppConfigManager, + val sharedPreferences : SharedPreferences +) : BaseViewModel(userRepository, userViewModel), GroupPlanInfoProvider { + private var owners : List> = listOf() var canSwitchOwners = MutableLiveData() - val ownerID: MutableLiveData by lazy { + val ownerID : MutableLiveData by lazy { MutableLiveData() } var teamPlans = mapOf() - var initialPreferenceFilterSet: Boolean = false + var initialPreferenceFilterSet : Boolean = false - val isPersonalBoard: Boolean + val isPersonalBoard : Boolean get() { return ownerID.value == userViewModel.userID } - val ownerTitle: CharSequence + val ownerTitle : CharSequence get() { return owners.firstOrNull { it.first == ownerID.value }?.second ?: "" } @@ -68,12 +61,13 @@ class TasksViewModel : BaseViewModel(), GroupPlanInfoProvider { userRepository.getTeamPlans() .collect { plans -> teamPlans = plans.associateBy { it.id } - owners = listOf(Pair(userViewModel.userID, userViewModel.displayName)) + plans.map { - Pair( - it.id, - it.summary - ) - } + owners = + listOf(Pair(userViewModel.userID, userViewModel.displayName)) + plans.map { + Pair( + it.id, + it.summary + ) + } if (owners.size > 1 && canSwitchOwners.value != false) { canSwitchOwners.value = owners.size > 1 } @@ -81,7 +75,7 @@ class TasksViewModel : BaseViewModel(), GroupPlanInfoProvider { } } - internal fun refreshData(onComplete: () -> Unit) { + internal fun refreshData(onComplete : () -> Unit) { viewModelScope.launch(ExceptionHandler.coroutine()) { if (isPersonalBoard) { userRepository.retrieveUser( @@ -109,9 +103,9 @@ class TasksViewModel : BaseViewModel(), GroupPlanInfoProvider { } fun scoreTask( - task: Task, - direction: TaskDirection, - onResult: (TaskScoringResult, Int) -> Unit + task : Task, + direction : TaskDirection, + onResult : (TaskScoringResult, Int) -> Unit ) { viewModelScope.launch(ExceptionHandler.coroutine()) { taskRepository.taskChecked( @@ -135,18 +129,18 @@ class TasksViewModel : BaseViewModel(), GroupPlanInfoProvider { } } - private val filterSets: HashMap>>> = + private val filterSets : HashMap>>> = hashMapOf( Pair(TaskType.HABIT, MutableLiveData()), Pair(TaskType.DAILY, MutableLiveData()), Pair(TaskType.TODO, MutableLiveData()) ) - fun getFilterSet(type: TaskType): MutableLiveData>>? { + fun getFilterSet(type : TaskType) : MutableLiveData>>? { return filterSets[type] } - var searchQuery: String? = null + var searchQuery : String? = null set(value) { field = value filterSets.forEach { @@ -156,7 +150,7 @@ class TasksViewModel : BaseViewModel(), GroupPlanInfoProvider { } private val activeFilters = HashMap() - var tags: MutableList = mutableListOf() + var tags : MutableList = mutableListOf() set(value) { field = value filterSets.forEach { @@ -165,7 +159,7 @@ class TasksViewModel : BaseViewModel(), GroupPlanInfoProvider { } } - fun addActiveTag(tagID: String) { + fun addActiveTag(tagID : String) { if (!tags.contains(tagID)) { tags.add(tagID) } @@ -175,7 +169,7 @@ class TasksViewModel : BaseViewModel(), GroupPlanInfoProvider { } } - fun removeActiveTag(tagID: String) { + fun removeActiveTag(tagID : String) { if (tags.contains(tagID)) { tags.remove(tagID) } @@ -185,15 +179,15 @@ class TasksViewModel : BaseViewModel(), GroupPlanInfoProvider { } } - fun filterCount(type: TaskType?): Int { + fun filterCount(type : TaskType?) : Int { return this.tags.size + if (isTaskFilterActive(type)) 1 else 0 } - fun isFiltering(type: TaskType?): Boolean { + fun isFiltering(type : TaskType?) : Boolean { return filterCount(type) > 0 } - private fun isTaskFilterActive(type: TaskType?): Boolean { + private fun isTaskFilterActive(type : TaskType?) : Boolean { if (activeFilters[type] == null) { return false } @@ -204,12 +198,12 @@ class TasksViewModel : BaseViewModel(), GroupPlanInfoProvider { } } - fun filter(tasks: List): List { + fun filter(tasks : List) : List { if (tasks.isEmpty()) { return tasks } val filtered = ArrayList() - var activeFilter: String? = null + var activeFilter : String? = null if (activeFilters.size > 0) { activeFilter = activeFilters[tasks[0].type] } @@ -222,7 +216,7 @@ class TasksViewModel : BaseViewModel(), GroupPlanInfoProvider { return filtered } - private fun isFiltered(task: Task, activeFilter: String?): Boolean { + private fun isFiltered(task : Task, activeFilter : String?) : Boolean { if (!task.containsAllTagIds(tags)) { return false } @@ -233,6 +227,7 @@ class TasksViewModel : BaseViewModel(), GroupPlanInfoProvider { } else { !task.completed } + Task.FILTER_GRAY -> task.completed || !task.isDisplayedActive Task.FILTER_WEAK -> task.value < 1 Task.FILTER_STRONG -> task.value >= 1 @@ -245,7 +240,7 @@ class TasksViewModel : BaseViewModel(), GroupPlanInfoProvider { } } - fun setActiveFilter(type: TaskType, activeFilter: String) { + fun setActiveFilter(type : TaskType, activeFilter : String) { activeFilters[type] = activeFilter filterSets[type]?.value = Triple(searchQuery, activeFilter, tags) @@ -256,7 +251,7 @@ class TasksViewModel : BaseViewModel(), GroupPlanInfoProvider { } } - fun getActiveFilter(type: TaskType?): String? { + fun getActiveFilter(type : TaskType?) : String? { return if (activeFilters.containsKey(type)) { activeFilters[type] } else { @@ -264,7 +259,7 @@ class TasksViewModel : BaseViewModel(), GroupPlanInfoProvider { } } - fun createQuery(unfilteredData: OrderedRealmCollection): RealmQuery? { + fun createQuery(unfilteredData : OrderedRealmCollection) : RealmQuery? { if (!unfilteredData.isValid) { return null } @@ -292,14 +287,17 @@ class TasksViewModel : BaseViewModel(), GroupPlanInfoProvider { } else { query.equalTo("completed", false) } + Task.FILTER_GRAY -> query = query.equalTo("completed", true).or().equalTo("isDue", false) + Task.FILTER_WEAK -> query = query.lessThan("value", 1.0) Task.FILTER_STRONG -> query = query.greaterThanOrEqualTo("value", 1.0) Task.FILTER_DATED -> query = query.isNotNull("dueDate").equalTo("completed", false).sort("dueDate") + Task.FILTER_COMPLETED -> query = query.equalTo("completed", true) } } @@ -310,14 +308,14 @@ class TasksViewModel : BaseViewModel(), GroupPlanInfoProvider { return query } - override fun canScoreTask(task: Task): Boolean { + override fun canScoreTask(task : Task) : Boolean { if (!task.isGroupTask) { return true } return task.isAssignedToUser(userViewModel.userID) || task.group?.assignedUsers?.isEmpty() != false } - override suspend fun canEditTask(task: Task): Boolean { + override suspend fun canEditTask(task : Task) : Boolean { if (!task.isGroupTask) { return true } @@ -326,7 +324,7 @@ class TasksViewModel : BaseViewModel(), GroupPlanInfoProvider { return group?.hasTaskEditPrivileges(userViewModel.userID) ?: false } - override suspend fun canAddTasks(): Boolean { + override suspend fun canAddTasks() : Boolean { if (isPersonalBoard) { return true } @@ -335,18 +333,27 @@ class TasksViewModel : BaseViewModel(), GroupPlanInfoProvider { return group?.hasTaskEditPrivileges(userViewModel.userID) ?: false } - override fun assignedTextForTask(resources: Resources, assignedUsers: List): String { + override fun assignedTextForTask(resources : Resources, assignedUsers : List) : String { return if (assignedUsers.contains(userViewModel.userID)) { if (assignedUsers.size == 1) { resources.getString(R.string.you) } else { - resources.getQuantityString(R.plurals.you_x_others, assignedUsers.size - 1, assignedUsers.size - 1) + resources.getQuantityString( + R.plurals.you_x_others, + assignedUsers.size - 1, + assignedUsers.size - 1 + ) } } else { if (assignedUsers.size == 1) { - userViewModel.currentTeamPlanMembers.value?.firstOrNull { it.id == assignedUsers.first() }?.displayName ?: "" + userViewModel.currentTeamPlanMembers.value?.firstOrNull { it.id == assignedUsers.first() }?.displayName + ?: "" } else { - resources.getQuantityString(R.plurals.people, assignedUsers.size, assignedUsers.size) + resources.getQuantityString( + R.plurals.people, + assignedUsers.size, + assignedUsers.size + ) } } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/inventory/equipment/EquipmentOverviewViewModel.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/inventory/equipment/EquipmentOverviewViewModel.kt index 70fcdbd2e..a83ba7f8b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/inventory/equipment/EquipmentOverviewViewModel.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/inventory/equipment/EquipmentOverviewViewModel.kt @@ -1,27 +1,27 @@ package com.habitrpg.android.habitica.ui.viewmodels.inventory.equipment import androidx.lifecycle.viewModelScope -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.InventoryRepository +import com.habitrpg.android.habitica.data.UserRepository import com.habitrpg.android.habitica.models.inventory.Equipment import com.habitrpg.android.habitica.ui.viewmodels.BaseViewModel +import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel import com.habitrpg.common.habitica.helpers.launchCatching +import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject -class EquipmentOverviewViewModel : BaseViewModel() { - val usesAutoEquip: Boolean +@HiltViewModel +class EquipmentOverviewViewModel @Inject constructor( + userRepository : UserRepository, + userViewModel : MainUserViewModel, + val inventoryRepository : InventoryRepository +) : BaseViewModel(userRepository, userViewModel) { + val usesAutoEquip : Boolean get() = user.value?.preferences?.autoEquip == true - val usesCostume: Boolean + val usesCostume : Boolean get() = user.value?.preferences?.costume == true - @Inject - lateinit var inventoryRepository: InventoryRepository - - override fun inject(component: UserComponent) { - component.inject(this) - } - - fun getGear(key: String, onSuccess: (Equipment) -> Unit) { + fun getGear(key : String, onSuccess : (Equipment) -> Unit) { viewModelScope.launchCatching { inventoryRepository.getEquipment(key).collect { onSuccess(it) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/AppHeaderView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/AppHeaderView.kt index feb08e96d..751007b1b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/AppHeaderView.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/AppHeaderView.kt @@ -251,14 +251,14 @@ fun AppHeaderView( } CurrencyText( "gold", - user?.stats?.gp ?: 0.0, + user.stats?.gp ?: 0.0, modifier = Modifier.padding(end = 12.dp), decimals = 0, minForAbbreviation = 10000 ) CurrencyText( "gems", - user?.gemCount?.toDouble() ?: 0.0, + user.gemCount?.toDouble() ?: 0.0, modifier = Modifier.clickable { MainNavigationController.navigate(R.id.gemPurchaseActivity) }, diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/HabiticaAlertDialog.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/HabiticaAlertDialog.kt index 06a3dd1ec..a629737ed 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/HabiticaAlertDialog.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/HabiticaAlertDialog.kt @@ -247,7 +247,7 @@ open class HabiticaAlertDialog(context: Context) : AlertDialog(context, R.style. super.dismiss() } - fun getActivity(): Activity? { + open fun getActivity(): Activity? { var thisContext = context while (thisContext as? ContextThemeWrapper != null && thisContext as? Activity == null) { thisContext = thisContext.baseContext diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/HabiticaBottomSheetDialog.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/HabiticaBottomSheetDialog.kt index c97252f11..06d164dcd 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/HabiticaBottomSheetDialog.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/HabiticaBottomSheetDialog.kt @@ -24,8 +24,8 @@ open class HabiticaBottomSheetDialog(context: Context) : BottomSheetDialog(conte super.setContentView(wrapperBinding.root) } - override fun setContentView(layoutResId: Int) { - layoutInflater.inflate(layoutResId, wrapperBinding.container) + override fun setContentView(layoutResID: Int) { + layoutInflater.inflate(layoutResID, wrapperBinding.container) super.setContentView(wrapperBinding.root) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/PetSuggestHatchDialog.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/PetSuggestHatchDialog.kt index ae426f475..cf44b9864 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/PetSuggestHatchDialog.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/PetSuggestHatchDialog.kt @@ -7,7 +7,6 @@ import android.view.View import androidx.core.content.ContextCompat import androidx.core.graphics.drawable.toBitmap import androidx.lifecycle.lifecycleScope -import com.habitrpg.android.habitica.HabiticaBaseApplication import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.databinding.DialogHatchPetButtonBinding import com.habitrpg.android.habitica.databinding.DialogPetSuggestHatchBinding @@ -36,7 +35,6 @@ class PetSuggestHatchDialog(context: Context) : HabiticaAlertDialog(context) { val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as? LayoutInflater inflater?.let { binding = DialogPetSuggestHatchBinding.inflate(it) } setAdditionalContentView(binding.root) - HabiticaBaseApplication.userComponent?.inject(this) binding.shimmerView.startShimmer() } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/insufficientCurrency/InsufficientGemsDialog.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/insufficientCurrency/InsufficientGemsDialog.kt index f5a2fcaa9..7dd58935b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/insufficientCurrency/InsufficientGemsDialog.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/insufficientCurrency/InsufficientGemsDialog.kt @@ -8,7 +8,6 @@ import android.widget.TextView import androidx.core.os.bundleOf import androidx.core.view.isVisible import com.google.firebase.analytics.FirebaseAnalytics -import com.habitrpg.android.habitica.HabiticaBaseApplication import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.extensions.addCloseButton import com.habitrpg.android.habitica.helpers.AppConfigManager @@ -40,7 +39,6 @@ class InsufficientGemsDialog(context: Context, var gemPrice: Int) : Insufficient } override fun onCreate(savedInstanceState: Bundle?) { - HabiticaBaseApplication.userComponent?.inject(this) super.onCreate(savedInstanceState) textView.setText(R.string.insufficientGems) addButton(R.string.see_other_options, true) { _, _ -> MainNavigationController.navigate(R.id.gemPurchaseActivity, bundleOf(Pair("openSubscription", false))) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialog.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialog.kt index b70a486e1..ac613f40e 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialog.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialog.kt @@ -14,13 +14,11 @@ import androidx.lifecycle.lifecycleScope import com.google.firebase.analytics.FirebaseAnalytics import com.habitrpg.android.habitica.HabiticaBaseApplication import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.InventoryRepository import com.habitrpg.android.habitica.data.UserRepository import com.habitrpg.android.habitica.extensions.addCancelButton import com.habitrpg.android.habitica.extensions.addCloseButton import com.habitrpg.android.habitica.extensions.getShortRemainingString -import com.habitrpg.android.habitica.helpers.AppConfigManager import com.habitrpg.android.habitica.helpers.HapticFeedbackManager import com.habitrpg.android.habitica.helpers.MainNavigationController import com.habitrpg.android.habitica.models.shops.Shop @@ -49,18 +47,10 @@ import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.launch import java.lang.Integer.max import java.util.Date -import javax.inject.Inject import kotlin.time.DurationUnit import kotlin.time.toDuration -class PurchaseDialog(context: Context, component: UserComponent?, val item: ShopItem) : HabiticaAlertDialog(context) { - - @Inject - lateinit var userRepository: UserRepository - @Inject - lateinit var inventoryRepository: InventoryRepository - @Inject - lateinit var configManager: AppConfigManager +class PurchaseDialog(context: Context, private val userRepository : UserRepository, private val inventoryRepository : InventoryRepository, val item: ShopItem) : HabiticaAlertDialog(context) { private val customHeader: View by lazy { LayoutInflater.from(context).inflate(R.layout.dialog_purchase_shopitem_header, null) @@ -238,8 +228,6 @@ class PurchaseDialog(context: Context, component: UserComponent?, val item: Shop } init { - component?.inject(this) - forceScrollableLayout = true setCustomHeaderView(customHeader) @@ -375,7 +363,7 @@ class PurchaseDialog(context: Context, component: UserComponent?, val item: Shop } else if (shopItem.purchaseType == "debuffPotion") { observable = { userRepository.useSkill(shopItem.key, null) } } else if (shopItem.purchaseType == "customization" || shopItem.purchaseType == "background" || shopItem.purchaseType == "backgrounds" || shopItem.purchaseType == "customizationSet") { - observable = { userRepository.unlockPath(item.unlockPath ?: "${item.pinType}.${item.key}" ?: "", item.value) } + observable = { userRepository.unlockPath(item.unlockPath ?: "${item.pinType}.${item.key}", item.value) } } else if (shopItem.purchaseType == "debuffPotion") { observable = { userRepository.useSkill(shopItem.key, null) } } else if (shopItem.purchaseType == "card") { @@ -385,7 +373,7 @@ class PurchaseDialog(context: Context, component: UserComponent?, val item: Shop } else if ("gold" == shopItem.currency && "gem" != shopItem.key) { observable = { val buyResponse = inventoryRepository.buyItem(user, shopItem.key, shopItem.value.toDouble(), quantity) - if (shopItem.key == "armoire" && configManager.enableNewArmoire() && buyResponse != null) { + if (shopItem.key == "armoire" && buyResponse != null) { MainNavigationController.navigate( R.id.armoireActivity, ArmoireActivityDirections.openArmoireActivity( diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/social/ChatBarView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/social/ChatBarView.kt index eb0e1101e..3a364758f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/social/ChatBarView.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/social/ChatBarView.kt @@ -6,19 +6,15 @@ import android.view.View import android.widget.LinearLayout import android.widget.TextView import androidx.core.content.ContextCompat -import com.habitrpg.android.habitica.HabiticaBaseApplication import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.data.SocialRepository import com.habitrpg.android.habitica.databinding.ChatBarViewBinding import com.habitrpg.android.habitica.extensions.OnChangeTextWatcher -import com.habitrpg.android.habitica.helpers.AppConfigManager import com.habitrpg.android.habitica.helpers.MainNavigationController import com.habitrpg.android.habitica.models.social.ChatMessage import com.habitrpg.android.habitica.ui.helpers.AutocompleteAdapter import com.habitrpg.android.habitica.ui.helpers.AutocompleteTokenizer import com.habitrpg.common.habitica.extensions.getThemeColor import com.habitrpg.common.habitica.extensions.layoutInflater -import javax.inject.Inject class ChatBarView : LinearLayout { @@ -34,12 +30,6 @@ class ChatBarView : LinearLayout { } var onCommunityGuidelinesAccepted: (() -> Unit)? = null - @Inject - lateinit var socialRepository: SocialRepository - - @Inject - lateinit var appConfigManager: AppConfigManager - private val binding = ChatBarViewBinding.inflate(context.layoutInflater, this) var chatMessages: List @@ -67,20 +57,19 @@ class ChatBarView : LinearLayout { set(value) = binding.chatEditText.setText(value, TextView.BufferType.EDITABLE) constructor(context: Context) : super(context) { - setupView(context) + setupView() } constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) { - setupView(context) + setupView() } - private var autocompleteAdapter: AutocompleteAdapter? = null + var autocompleteAdapter: AutocompleteAdapter? = null - private fun setupView(context: Context) { + private fun setupView() { orientation = VERTICAL this.setBackgroundResource(R.color.content_background) - HabiticaBaseApplication.userComponent?.inject(this) binding.chatEditText.addTextChangedListener( OnChangeTextWatcher { _, _, _, _ -> @@ -91,7 +80,6 @@ class ChatBarView : LinearLayout { binding.sendButton.setOnClickListener { sendButtonPressed() } - autocompleteAdapter = AutocompleteAdapter(context, socialRepository, autocompleteContext, groupID, appConfigManager.enableUsernameAutocomplete()) binding.chatEditText.setAdapter(autocompleteAdapter) binding.chatEditText.threshold = 2 diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/stats/BulkAllocateStatsDialog.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/stats/BulkAllocateStatsDialog.kt index cd850c7c5..cf13d08f6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/stats/BulkAllocateStatsDialog.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/stats/BulkAllocateStatsDialog.kt @@ -7,7 +7,6 @@ import androidx.appcompat.app.AlertDialog import androidx.core.content.ContextCompat import androidx.lifecycle.lifecycleScope import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.UserRepository import com.habitrpg.android.habitica.databinding.DialogBulkAllocateBinding import com.habitrpg.common.habitica.extensions.getThemeColor @@ -17,12 +16,9 @@ import com.habitrpg.common.habitica.helpers.launchCatching import kotlinx.coroutines.MainScope import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.launch -import javax.inject.Inject -class BulkAllocateStatsDialog(context: Context, component: UserComponent?) : AlertDialog(context) { +class BulkAllocateStatsDialog(context: Context, private val userRepository: UserRepository) : AlertDialog(context) { private val binding = DialogBulkAllocateBinding.inflate(context.layoutInflater) - @Inject - lateinit var userRepository: UserRepository private val allocatedPoints: Int get() { @@ -45,8 +41,6 @@ class BulkAllocateStatsDialog(context: Context, component: UserComponent?) : Ale } init { - component?.inject(this) - setView(binding.root) this.setButton(BUTTON_POSITIVE, context.getString(R.string.save)) { _, _ -> saveChanges() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/tasks/AssignSheet.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/tasks/AssignSheet.kt index 2de04d9dc..5b5f8219b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/tasks/AssignSheet.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/tasks/AssignSheet.kt @@ -139,7 +139,7 @@ private fun IsAssignedIndicator( painterResource(R.drawable.ic_close_white_24dp), null, colorFilter = ColorFilter.tint(color.value), - modifier = Modifier + modifier = modifier .rotate(rotation.value) .size(24.dp) .background( diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/tasks/TaskFilterDialog.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/tasks/TaskFilterDialog.kt index f46216524..17ee90c7f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/tasks/TaskFilterDialog.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/tasks/TaskFilterDialog.kt @@ -17,7 +17,6 @@ import androidx.core.widget.CompoundButtonCompat import androidx.core.widget.TextViewCompat import androidx.lifecycle.lifecycleScope import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.TagRepository import com.habitrpg.android.habitica.databinding.DialogTaskFilterBinding import com.habitrpg.android.habitica.databinding.EditTagItemBinding @@ -30,15 +29,11 @@ import com.habitrpg.common.habitica.extensions.getThemeColor import com.habitrpg.common.habitica.helpers.launchCatching import com.habitrpg.shared.habitica.models.tasks.TaskType import java.util.UUID -import javax.inject.Inject -class TaskFilterDialog(context: Context, component: UserComponent?, private val showTags: Boolean) : HabiticaBottomSheetDialog(context), RadioGroup.OnCheckedChangeListener { +class TaskFilterDialog(context: Context, private val repository: TagRepository, private val showTags: Boolean) : HabiticaBottomSheetDialog(context), RadioGroup.OnCheckedChangeListener { lateinit var viewModel: TasksViewModel private val binding = DialogTaskFilterBinding.inflate(layoutInflater) - @Inject - lateinit var repository: TagRepository - var taskType: TaskType = TaskType.HABIT set(value) { field = value @@ -76,7 +71,6 @@ class TaskFilterDialog(context: Context, component: UserComponent?, private val private var isEditing: Boolean = false init { - component?.inject(this) addIcon = ContextCompat.getDrawable(context, R.drawable.ic_add_purple_300_36dp) setTitle(R.string.filters) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/AddTaskWidgetProvider.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/AddTaskWidgetProvider.kt index 9c33a7197..a3ceae9c4 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/AddTaskWidgetProvider.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/AddTaskWidgetProvider.kt @@ -7,7 +7,9 @@ import android.widget.RemoteViews import androidx.preference.PreferenceManager import com.habitrpg.android.habitica.R import com.habitrpg.shared.habitica.models.tasks.TaskType +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class AddTaskWidgetProvider : BaseWidgetProvider() { override fun layoutResourceId(): Int { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/AvatarStatsWidgetProvider.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/AvatarStatsWidgetProvider.kt index 0de52f780..666b6c00f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/AvatarStatsWidgetProvider.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/AvatarStatsWidgetProvider.kt @@ -8,7 +8,6 @@ import android.content.Intent import android.view.View import android.view.ViewGroup import android.widget.RemoteViews -import com.habitrpg.android.habitica.HabiticaBaseApplication import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.extensions.withImmutableFlag import com.habitrpg.android.habitica.models.user.User @@ -19,10 +18,12 @@ import com.habitrpg.common.habitica.helpers.HealthFormatter import com.habitrpg.common.habitica.helpers.NumberAbbreviator import com.habitrpg.common.habitica.helpers.launchCatching import com.habitrpg.common.habitica.views.AvatarView +import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.MainScope import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.launch +@AndroidEntryPoint class AvatarStatsWidgetProvider : BaseWidgetProvider() { private lateinit var avatarView: AvatarView @@ -36,13 +37,6 @@ class AvatarStatsWidgetProvider : BaseWidgetProvider() { return R.layout.widget_avatar_stats } - private fun setUp() { - if (!hasInjected) { - hasInjected = true - HabiticaBaseApplication.userComponent?.inject(this) - } - } - override fun onEnabled(context: Context) { super.onEnabled(context) avatarView = AvatarView( @@ -54,7 +48,6 @@ class AvatarStatsWidgetProvider : BaseWidgetProvider() { val layoutParams = ViewGroup.LayoutParams(140.dpToPx(context), 147.dpToPx(context)) avatarView.layoutParams = layoutParams - this.setUp() MainScope().launchCatching { userRepository.getUser().collect { user = it @@ -79,7 +72,6 @@ class AvatarStatsWidgetProvider : BaseWidgetProvider() { val layoutParams = ViewGroup.LayoutParams(140.dpToPx(context), 147.dpToPx(context)) avatarView.layoutParams = layoutParams } - this.setUp() this.appWidgetManager = appWidgetManager this.context = context diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/BaseWidgetProvider.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/BaseWidgetProvider.kt index 8e51e6a63..635417c09 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/BaseWidgetProvider.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/BaseWidgetProvider.kt @@ -17,8 +17,6 @@ abstract class BaseWidgetProvider : AppWidgetProvider() { @Inject lateinit var userRepository: UserRepository - var hasInjected = false - protected var context: Context? = null /** @@ -72,7 +70,7 @@ abstract class BaseWidgetProvider : AppWidgetProvider() { protected fun showToastForTaskDirection(context: Context, data: TaskScoringResult?) { if (data != null) { - val pair = NotifyUserUseCase.getNotificationAndAddStatsToUserAsText(data.experienceDelta!!, data.healthDelta!!, data.goldDelta!!, data.manaDelta!!) + val pair = NotifyUserUseCase.getNotificationAndAddStatsToUserAsText(data.experienceDelta, data.healthDelta, data.goldDelta, data.manaDelta) val toast = Toast.makeText(context, pair.first, Toast.LENGTH_LONG) toast.show() } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesListFactory.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesListFactory.kt index 182510e05..010342589 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesListFactory.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesListFactory.kt @@ -3,6 +3,16 @@ package com.habitrpg.android.habitica.widget import android.content.Context import android.content.Intent import com.habitrpg.android.habitica.R +import com.habitrpg.android.habitica.data.TaskRepository +import com.habitrpg.android.habitica.data.UserRepository import com.habitrpg.shared.habitica.models.tasks.TaskType -class DailiesListFactory(context: Context, intent: Intent) : TaskListFactory(context, intent, TaskType.DAILY, R.layout.widget_dailies_list_row, R.id.dailies_text) +class DailiesListFactory(context : Context, intent : Intent, taskRepository : TaskRepository, userRepository : UserRepository) : TaskListFactory( + context, + intent, + TaskType.DAILY, + R.layout.widget_dailies_list_row, + R.id.dailies_text, + taskRepository, + userRepository +) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesWidgetService.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesWidgetService.kt index 54252fb79..b68e847be 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesWidgetService.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/DailiesWidgetService.kt @@ -2,10 +2,20 @@ package com.habitrpg.android.habitica.widget import android.content.Intent import android.widget.RemoteViewsService +import com.habitrpg.android.habitica.data.TaskRepository +import com.habitrpg.android.habitica.data.UserRepository +import dagger.hilt.android.AndroidEntryPoint +import javax.inject.Inject +@AndroidEntryPoint class DailiesWidgetService : RemoteViewsService() { + @Inject + lateinit var taskRepository: TaskRepository + @Inject + lateinit var userRepository : UserRepository + override fun onGetViewFactory(intent: Intent): RemoteViewsFactory { - return DailiesListFactory(this.applicationContext, intent) + return DailiesListFactory(this.applicationContext, intent, taskRepository, userRepository) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/HabitButtonWidgetProvider.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/HabitButtonWidgetProvider.kt index f03306d11..2b3c23e6d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/HabitButtonWidgetProvider.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/HabitButtonWidgetProvider.kt @@ -5,27 +5,21 @@ import android.content.ComponentName import android.content.Context import android.content.Intent import android.widget.RemoteViews -import com.habitrpg.android.habitica.HabiticaBaseApplication import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.data.TaskRepository import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.shared.habitica.models.responses.TaskDirection +import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.MainScope import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.launch import javax.inject.Inject +@AndroidEntryPoint class HabitButtonWidgetProvider : BaseWidgetProvider() { @Inject lateinit var taskRepository: TaskRepository - private fun setUp() { - if (!hasInjected) { - hasInjected = true - HabiticaBaseApplication.userComponent?.inject(this) - } - } - override fun layoutResourceId(): Int { return R.layout.widget_habit_button } @@ -36,7 +30,6 @@ class HabitButtonWidgetProvider : BaseWidgetProvider() { appWidgetIds: IntArray ) { super.onUpdate(context, appWidgetManager, appWidgetIds) - setUp() val thisWidget = ComponentName( context, HabitButtonWidgetProvider::class.java @@ -62,7 +55,6 @@ class HabitButtonWidgetProvider : BaseWidgetProvider() { } override fun onReceive(context: Context, intent: Intent) { - setUp() if (intent.action == HABIT_ACTION) { val mgr = AppWidgetManager.getInstance(context) val appWidgetId = intent.getIntExtra( diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/HabitButtonWidgetService.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/HabitButtonWidgetService.kt index 85685333a..4efcd37ac 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/HabitButtonWidgetService.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/HabitButtonWidgetService.kt @@ -12,7 +12,6 @@ import android.text.SpannableStringBuilder import android.view.View import android.widget.RemoteViews import androidx.core.content.ContextCompat -import com.habitrpg.android.habitica.HabiticaBaseApplication import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.data.TaskRepository import com.habitrpg.android.habitica.extensions.withImmutableFlag @@ -20,16 +19,20 @@ import com.habitrpg.android.habitica.models.tasks.Task import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.common.habitica.helpers.MarkdownParser import com.habitrpg.shared.habitica.models.responses.TaskDirection +import dagger.hilt.android.AndroidEntryPoint +import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.MainScope import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.launch import javax.inject.Inject import kotlin.math.min +@AndroidEntryPoint class HabitButtonWidgetService : Service() { @Inject lateinit var sharedPreferences: SharedPreferences @Inject + @ApplicationContext lateinit var context: Context @Inject lateinit var taskRepository: TaskRepository @@ -39,7 +42,6 @@ class HabitButtonWidgetService : Service() { private var allWidgetIds: IntArray? = null override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int { - HabiticaBaseApplication.userComponent?.inject(this) this.appWidgetManager = AppWidgetManager.getInstance(this) val thisWidget = ComponentName(this, HabitButtonWidgetProvider::class.java) allWidgetIds = appWidgetManager?.getAppWidgetIds(thisWidget) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TaskListFactory.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TaskListFactory.kt index 17d69218b..14587e332 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TaskListFactory.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TaskListFactory.kt @@ -6,7 +6,6 @@ import android.content.Intent import android.text.SpannableStringBuilder import android.widget.RemoteViews import android.widget.RemoteViewsService -import com.habitrpg.android.habitica.HabiticaBaseApplication import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.data.TaskRepository import com.habitrpg.android.habitica.data.UserRepository @@ -19,22 +18,19 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.launch -import javax.inject.Inject abstract class TaskListFactory internal constructor( val context: Context, intent: Intent, private val taskType: TaskType, private val listItemResId: Int, - private val listItemTextResId: Int + private val listItemTextResId: Int, + val taskRepository: TaskRepository, + val userRepository: UserRepository ) : RemoteViewsService.RemoteViewsFactory { private val job = SupervisorJob() private val widgetId: Int = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, 0) - @Inject - lateinit var taskRepository: TaskRepository - @Inject - lateinit var userRepository: UserRepository private var taskList: List = ArrayList() private var reloadData: Boolean = false @@ -43,9 +39,6 @@ abstract class TaskListFactory internal constructor( } private fun loadData() { - if (!this::taskRepository.isInitialized) { - return - } CoroutineScope(Dispatchers.Main + job).launch(ExceptionHandler.coroutine()) { val mirroredTasks = userRepository.getUser().firstOrNull()?.preferences?.tasks?.mirrorGroupTasks?.toTypedArray() val tasks = taskRepository.getTasks(taskType, null, mirroredTasks ?: emptyArray()).firstOrNull()?.filter { task -> @@ -58,7 +51,6 @@ abstract class TaskListFactory internal constructor( } override fun onCreate() { - HabiticaBaseApplication.userComponent?.inject(this) this.loadData() } override fun onDestroy() { /* no-op */ } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TaskListWidgetProvider.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TaskListWidgetProvider.kt index 459a2bd47..017eb694e 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TaskListWidgetProvider.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TaskListWidgetProvider.kt @@ -7,18 +7,19 @@ import android.content.Context import android.content.Intent import android.net.Uri import android.widget.RemoteViews -import com.habitrpg.android.habitica.HabiticaBaseApplication import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.data.TaskRepository import com.habitrpg.android.habitica.extensions.withImmutableFlag import com.habitrpg.android.habitica.extensions.withMutableFlag import com.habitrpg.android.habitica.ui.activities.MainActivity import com.habitrpg.common.habitica.helpers.ExceptionHandler +import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.MainScope import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.launch import javax.inject.Inject +@AndroidEntryPoint abstract class TaskListWidgetProvider : BaseWidgetProvider() { @Inject @@ -30,15 +31,7 @@ abstract class TaskListWidgetProvider : BaseWidgetProvider() { protected abstract val titleResId: Int - private fun setUp() { - if (!hasInjected) { - hasInjected = true - HabiticaBaseApplication.userComponent?.inject(this) - } - } - override fun onReceive(context: Context, intent: Intent) { - setUp() if (intent.action == DAILY_ACTION) { val appWidgetId = intent.getIntExtra( AppWidgetManager.EXTRA_APPWIDGET_ID, @@ -64,7 +57,6 @@ abstract class TaskListWidgetProvider : BaseWidgetProvider() { appWidgetIds: IntArray ) { super.onUpdate(context, appWidgetManager, appWidgetIds) - setUp() val thisWidget = ComponentName(context, providerClass) val allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TodoListFactory.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TodoListFactory.kt index 9fce9c75f..4570672f9 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TodoListFactory.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TodoListFactory.kt @@ -3,6 +3,13 @@ package com.habitrpg.android.habitica.widget import android.content.Context import android.content.Intent import com.habitrpg.android.habitica.R +import com.habitrpg.android.habitica.data.TaskRepository +import com.habitrpg.android.habitica.data.UserRepository import com.habitrpg.shared.habitica.models.tasks.TaskType -class TodoListFactory(context: Context, intent: Intent) : TaskListFactory(context, intent, TaskType.TODO, R.layout.widget_todo_list_row, R.id.todo_text) +class TodoListFactory( + context : Context, + intent : Intent, + taskRepository : TaskRepository, + userRepository : UserRepository +) : TaskListFactory(context, intent, TaskType.TODO, R.layout.widget_todo_list_row, R.id.todo_text, taskRepository, userRepository) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TodosWidgetService.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TodosWidgetService.kt index 56c427fdc..442c31e76 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TodosWidgetService.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/TodosWidgetService.kt @@ -2,10 +2,18 @@ package com.habitrpg.android.habitica.widget import android.content.Intent import android.widget.RemoteViewsService +import com.habitrpg.android.habitica.data.TaskRepository +import com.habitrpg.android.habitica.data.UserRepository +import javax.inject.Inject class TodosWidgetService : RemoteViewsService() { + @Inject + lateinit var taskRepository: TaskRepository + @Inject + lateinit var userRepository : UserRepository + override fun onGetViewFactory(intent: Intent): RemoteViewsFactory { - return TodoListFactory(this.applicationContext, intent) + return TodoListFactory(this.applicationContext, intent, taskRepository, userRepository) } } diff --git a/common/src/main/java/com/habitrpg/common/habitica/helpers/AppTestingLevel.kt b/common/src/main/java/com/habitrpg/common/habitica/helpers/AppTestingLevel.kt index b2049338a..720fefa12 100644 --- a/common/src/main/java/com/habitrpg/common/habitica/helpers/AppTestingLevel.kt +++ b/common/src/main/java/com/habitrpg/common/habitica/helpers/AppTestingLevel.kt @@ -1,9 +1,9 @@ package com.habitrpg.common.habitica.helpers -enum class AppTestingLevel(identifier: String) { - STAFF("staff"), - PARTNERS("partners"), - ALPHA("alpha"), - BETA("beta"), - PRODUCTION("production") +enum class AppTestingLevel { + STAFF, + PARTNERS, + ALPHA, + BETA, + PRODUCTION }