migrate to hilt

This commit is contained in:
Phillip Thelen 2023-03-08 09:53:33 +01:00
parent 38e9909651
commit ec44f0ac31
164 changed files with 922 additions and 1623 deletions

View file

@ -2,6 +2,7 @@ plugins {
id 'com.android.application' id 'com.android.application'
id 'org.jetbrains.kotlin.android' id 'org.jetbrains.kotlin.android'
id 'kotlin-kapt' id 'kotlin-kapt'
id 'dagger.hilt.android.plugin'
id 'com.google.gms.google-services' id 'com.google.gms.google-services'
id 'com.google.firebase.crashlytics' id 'com.google.firebase.crashlytics'
@ -34,8 +35,8 @@ dependencies {
implementation "com.squareup.retrofit2:converter-gson:$retrofit_version" implementation "com.squareup.retrofit2:converter-gson:$retrofit_version"
//Dependency Injection //Dependency Injection
implementation "com.google.dagger:dagger:$daggerhilt_version" implementation "com.google.dagger:hilt-android:$daggerhilt_version"
kapt "com.google.dagger:dagger-compiler:$daggerhilt_version" kapt "com.google.dagger:hilt-compiler:$daggerhilt_version"
compileOnly 'javax.annotation:javax.annotation-api:1.3.2' compileOnly 'javax.annotation:javax.annotation-api:1.3.2'
//App Compatibility and Material Design //App Compatibility and Material Design
implementation "androidx.appcompat:appcompat:$appcompat_version" implementation "androidx.appcompat:appcompat:$appcompat_version"

View file

@ -1168,6 +1168,7 @@
<string name="apple" translatable="false">Apple</string> <string name="apple" translatable="false">Apple</string>
<string name="not_connected">Not connected</string> <string name="not_connected">Not connected</string>
<string name="add_password">Add password</string> <string name="add_password">Add password</string>
<string name="not_set" tools:override="true">Not Set</string>
<string name="connect">Connect</string> <string name="connect">Connect</string>
<string name="disconnect">Disconnect</string> <string name="disconnect">Disconnect</string>
<string name="add">Add</string> <string name="add">Add</string>

View file

@ -5,12 +5,4 @@ import com.habitrpg.android.habitica.components.DaggerAppComponent;
import com.habitrpg.android.habitica.modules.AppModule; import com.habitrpg.android.habitica.modules.AppModule;
public class HabiticaApplication extends HabiticaBaseApplication { public class HabiticaApplication extends HabiticaBaseApplication {
@Override
protected AppComponent initDagger() {
return DaggerAppComponent.builder()
.appModule(new AppModule(this))
.developerModule(new DebugDeveloperModule())
.build();
}
} }

View file

@ -23,14 +23,10 @@ import com.google.firebase.analytics.FirebaseAnalytics
import com.google.firebase.installations.FirebaseInstallations import com.google.firebase.installations.FirebaseInstallations
import com.google.firebase.remoteconfig.FirebaseRemoteConfig import com.google.firebase.remoteconfig.FirebaseRemoteConfig
import com.google.firebase.remoteconfig.FirebaseRemoteConfigSettings 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.data.ApiClient
import com.habitrpg.android.habitica.helpers.AdHandler import com.habitrpg.android.habitica.helpers.AdHandler
import com.habitrpg.android.habitica.helpers.AmplitudeManager import com.habitrpg.android.habitica.helpers.AmplitudeManager
import com.habitrpg.android.habitica.helpers.notifications.PushNotificationManager 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.BaseActivity
import com.habitrpg.android.habitica.ui.activities.LoginActivity import com.habitrpg.android.habitica.ui.activities.LoginActivity
import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper 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.LanguageHelper
import com.habitrpg.common.habitica.helpers.MarkdownParser import com.habitrpg.common.habitica.helpers.MarkdownParser
import com.habitrpg.common.habitica.helpers.launchCatching import com.habitrpg.common.habitica.helpers.launchCatching
import dagger.hilt.android.HiltAndroidApp
import io.realm.Realm import io.realm.Realm
import io.realm.RealmConfiguration import io.realm.RealmConfiguration
import kotlinx.coroutines.MainScope import kotlinx.coroutines.MainScope
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
import javax.inject.Inject import javax.inject.Inject
// contains all HabiticaApplicationLogic except dagger componentInitialisation @HiltAndroidApp
abstract class HabiticaBaseApplication : Application(), Application.ActivityLifecycleCallbacks { abstract class HabiticaBaseApplication : Application(), Application.ActivityLifecycleCallbacks {
@Inject @Inject
internal lateinit var lazyApiHelper: ApiClient internal lateinit var lazyApiHelper: ApiClient
@ -71,7 +68,6 @@ abstract class HabiticaBaseApplication : Application(), Application.ActivityLife
} }
registerActivityLifecycleCallbacks(this) registerActivityLifecycleCallbacks(this)
setupRealm() setupRealm()
setupDagger()
setLocale() setLocale()
setupRemoteConfig() setupRemoteConfig()
setupNotifications() 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( override fun openOrCreateDatabase(
name: String, name: String,
mode: Int, mode: Int,
@ -240,12 +228,6 @@ abstract class HabiticaBaseApplication : Application(), Application.ActivityLife
} }
companion object { companion object {
var component: AppComponent? = null
private set
var userComponent: UserComponent? = null
fun getInstance(context: Context): HabiticaBaseApplication? { fun getInstance(context: Context): HabiticaBaseApplication? {
return context.applicationContext as? HabiticaBaseApplication return context.applicationContext as? HabiticaBaseApplication
} }
@ -268,17 +250,12 @@ abstract class HabiticaBaseApplication : Application(), Application.ActivityLife
putString("theme_mode", lightMode) putString("theme_mode", lightMode)
putString("launch_screen", launchScreen) putString("launch_screen", launchScreen)
} }
reloadUserComponent()
getInstance(context)?.lazyApiHelper?.updateAuthenticationCredentials(null, null) getInstance(context)?.lazyApiHelper?.updateAuthenticationCredentials(null, null)
Wearable.getCapabilityClient(context).removeLocalCapability("provide_auth") Wearable.getCapabilityClient(context).removeLocalCapability("provide_auth")
startActivity(LoginActivity::class.java, context) startActivity(LoginActivity::class.java, context)
} }
} }
fun reloadUserComponent() {
userComponent = component?.plus(UserModule(), UserRepositoryModule())
}
private fun startActivity(activityClass: Class<*>, context: Context) { private fun startActivity(activityClass: Class<*>, context: Context) {
val intent = Intent(context, activityClass) val intent = Intent(context, activityClass)
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK) intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)

View file

@ -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);
}

View file

@ -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?
}

View file

@ -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);
}

View file

@ -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 {
}

View file

@ -102,7 +102,6 @@ class ApiClientImpl(
private var hadError = false private var hadError = false
init { init {
HabiticaBaseApplication.userComponent?.inject(this)
analyticsManager.setUserIdentifier(this.hostConfig.userID) analyticsManager.setUserIdentifier(this.hostConfig.userID)
buildRetrofit() buildRetrofit()
} }

View file

@ -1,22 +1,14 @@
package com.habitrpg.android.habitica.helpers package com.habitrpg.android.habitica.helpers
import com.habitrpg.android.habitica.HabiticaBaseApplication
import com.habitrpg.common.habitica.helpers.launchCatching import com.habitrpg.common.habitica.helpers.launchCatching
import kotlinx.coroutines.MainScope import kotlinx.coroutines.MainScope
import javax.inject.Inject import javax.inject.Inject
class SoundManager { class SoundManager @Inject constructor(var soundFileLoader: SoundFileLoader) {
@Inject
lateinit var soundFileLoader: SoundFileLoader
var soundTheme: String = SoundThemeOff var soundTheme: String = SoundThemeOff
private val loadedSoundFiles: MutableMap<String, SoundFile> = HashMap() private val loadedSoundFiles: MutableMap<String, SoundFile> = HashMap()
init {
HabiticaBaseApplication.userComponent?.inject(this)
}
fun preloadAllFiles() { fun preloadAllFiles() {
loadedSoundFiles.clear() loadedSoundFiles.clear()
if (soundTheme == SoundThemeOff) { if (soundTheme == SoundThemeOff) {

View file

@ -1,7 +0,0 @@
package com.habitrpg.android.habitica.helpers
import javax.inject.Scope
@Scope
@Retention(AnnotationRetention.RUNTIME)
annotation class UserScope

View file

@ -3,35 +3,21 @@ package com.habitrpg.android.habitica.helpers.notifications
import com.google.firebase.messaging.FirebaseMessaging import com.google.firebase.messaging.FirebaseMessaging
import com.google.firebase.messaging.FirebaseMessagingService import com.google.firebase.messaging.FirebaseMessagingService
import com.google.firebase.messaging.RemoteMessage import com.google.firebase.messaging.RemoteMessage
import com.habitrpg.android.habitica.HabiticaBaseApplication import dagger.hilt.android.AndroidEntryPoint
import com.habitrpg.android.habitica.components.UserComponent
import javax.inject.Inject import javax.inject.Inject
@AndroidEntryPoint
class HabiticaFirebaseMessagingService : FirebaseMessagingService() { class HabiticaFirebaseMessagingService : FirebaseMessagingService() {
private val userComponent: UserComponent?
get() = HabiticaBaseApplication.userComponent
@Inject @Inject
internal lateinit var pushNotificationManager: PushNotificationManager internal lateinit var pushNotificationManager: PushNotificationManager
override fun onMessageReceived(remoteMessage: RemoteMessage) { override fun onMessageReceived(remoteMessage: RemoteMessage) {
try {
userComponent?.inject(this)
} catch (_: java.lang.IllegalStateException) {
}
PushNotificationManager.displayNotification(remoteMessage, applicationContext) 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) { override fun onNewToken(s: String) {
super.onNewToken(s) super.onNewToken(s)
userComponent?.inject(this)
FirebaseMessaging.getInstance().token.addOnCompleteListener { task -> FirebaseMessaging.getInstance().token.addOnCompleteListener { task ->
val refreshedToken = task.result val refreshedToken = task.result
if (refreshedToken != null && this::pushNotificationManager.isInitialized) { if (refreshedToken != null && this::pushNotificationManager.isInitialized) {

View file

@ -13,11 +13,15 @@ import com.habitrpg.common.habitica.helpers.AnalyticsManager
import com.habitrpg.common.habitica.helpers.KeyHelper import com.habitrpg.common.habitica.helpers.KeyHelper
import dagger.Module import dagger.Module
import dagger.Provides import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent
import retrofit2.Retrofit import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory import retrofit2.converter.gson.GsonConverterFactory
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
import javax.inject.Singleton import javax.inject.Singleton
@InstallIn(SingletonComponent::class)
@Module @Module
open class ApiModule { open class ApiModule {
@Provides @Provides
@ -25,7 +29,7 @@ open class ApiModule {
fun providesHostConfig( fun providesHostConfig(
sharedPreferences: SharedPreferences, sharedPreferences: SharedPreferences,
keyHelper: KeyHelper?, keyHelper: KeyHelper?,
context: Context @ApplicationContext context: Context
): HostConfig { ): HostConfig {
return HostConfig(sharedPreferences, keyHelper, context) return HostConfig(sharedPreferences, keyHelper, context)
} }
@ -48,7 +52,7 @@ open class ApiModule {
hostConfig: HostConfig, hostConfig: HostConfig,
analyticsManager: AnalyticsManager, analyticsManager: AnalyticsManager,
notificationsManager: NotificationsManager, notificationsManager: NotificationsManager,
context: Context @ApplicationContext context: Context
): ApiClient { ): ApiClient {
val apiClient = ApiClientImpl( val apiClient = ApiClientImpl(
gsonConverter, gsonConverter,

View file

@ -1,6 +1,5 @@
package com.habitrpg.android.habitica.modules package com.habitrpg.android.habitica.modules
import android.app.Application
import android.content.Context import android.content.Context
import android.content.SharedPreferences import android.content.SharedPreferences
import android.content.res.Resources 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.data.ContentRepository
import com.habitrpg.android.habitica.helpers.AppConfigManager import com.habitrpg.android.habitica.helpers.AppConfigManager
import com.habitrpg.android.habitica.helpers.SoundFileLoader 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.android.habitica.helpers.notifications.PushNotificationManager
import com.habitrpg.common.habitica.helpers.KeyHelper import com.habitrpg.common.habitica.helpers.KeyHelper
import com.habitrpg.common.habitica.helpers.KeyHelper.Companion.getInstance import com.habitrpg.common.habitica.helpers.KeyHelper.Companion.getInstance
import com.habitrpg.shared.habitica.HLogger import com.habitrpg.shared.habitica.HLogger
import dagger.Module import dagger.Module
import dagger.Provides import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent
import java.io.IOException import java.io.IOException
import java.security.KeyStore import java.security.KeyStore
import java.security.KeyStoreException import java.security.KeyStoreException
@ -23,17 +24,12 @@ import java.security.NoSuchAlgorithmException
import java.security.cert.CertificateException import java.security.cert.CertificateException
import javax.inject.Singleton import javax.inject.Singleton
@InstallIn(SingletonComponent::class)
@Module @Module
class AppModule(private val application: Application) { class AppModule {
@Provides @Provides
@Singleton @Singleton
fun providesContext(): Context { fun provideSharedPreferences(@ApplicationContext context: Context): SharedPreferences {
return application
}
@Provides
@Singleton
fun provideSharedPreferences(context: Context): SharedPreferences {
return PreferenceManager.getDefaultSharedPreferences(context) return PreferenceManager.getDefaultSharedPreferences(context)
} }
@ -57,7 +53,7 @@ class AppModule(private val application: Application) {
@Provides @Provides
fun provideKeyHelper( fun provideKeyHelper(
context: Context, @ApplicationContext context: Context,
sharedPreferences: SharedPreferences, sharedPreferences: SharedPreferences,
keyStore: KeyStore? keyStore: KeyStore?
): KeyHelper? { ): KeyHelper? {
@ -67,27 +63,21 @@ class AppModule(private val application: Application) {
} }
@Provides @Provides
fun providesResources(context: Context): Resources { fun providesResources(@ApplicationContext context: Context): Resources {
return context.resources return context.resources
} }
@Provides @Provides
fun providesSoundFileLoader(context: Context): SoundFileLoader { fun providesSoundFileLoader(@ApplicationContext context: Context): SoundFileLoader {
return SoundFileLoader(context) return SoundFileLoader(context)
} }
@Provides
@Singleton
fun providesSoundManager(): SoundManager {
return SoundManager()
}
@Provides @Provides
@Singleton @Singleton
fun pushNotificationManager( fun pushNotificationManager(
apiClient: ApiClient, apiClient: ApiClient,
sharedPreferences: SharedPreferences, sharedPreferences: SharedPreferences,
context: Context @ApplicationContext context: Context
): PushNotificationManager { ): PushNotificationManager {
return PushNotificationManager(apiClient, sharedPreferences, context) return PushNotificationManager(apiClient, sharedPreferences, context)
} }

View file

@ -5,14 +5,18 @@ import com.habitrpg.android.habitica.proxy.implementation.EmptyAnalyticsManager
import com.habitrpg.common.habitica.helpers.AnalyticsManager import com.habitrpg.common.habitica.helpers.AnalyticsManager
import dagger.Module import dagger.Module
import dagger.Provides import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton import javax.inject.Singleton
// provide proxy class for libraries(to avoid 65k limit) // provide proxy class for libraries(to avoid 65k limit)
@InstallIn(SingletonComponent::class)
@Module @Module
open class DeveloperModule { open class DeveloperModule {
@Provides @Provides
@Singleton @Singleton
open fun provideAnalyticsManager(context: Context): AnalyticsManager { open fun provideAnalyticsManager(@ApplicationContext context: Context): AnalyticsManager {
return EmptyAnalyticsManager() return EmptyAnalyticsManager()
} }
} }

View file

@ -8,8 +8,12 @@ import com.habitrpg.android.habitica.data.local.ContentLocalRepository
import com.habitrpg.android.habitica.data.local.implementation.RealmContentLocalRepository import com.habitrpg.android.habitica.data.local.implementation.RealmContentLocalRepository
import dagger.Module import dagger.Module
import dagger.Provides import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent
import io.realm.Realm import io.realm.Realm
@InstallIn(SingletonComponent::class)
@Module @Module
open class RepositoryModule { open class RepositoryModule {
@Provides @Provides
@ -26,7 +30,7 @@ open class RepositoryModule {
fun providesContentRepository( fun providesContentRepository(
contentLocalRepository: ContentLocalRepository, contentLocalRepository: ContentLocalRepository,
apiClient: ApiClient, apiClient: ApiClient,
context: Context @ApplicationContext context: Context
): ContentRepository { ): ContentRepository {
return ContentRepositoryImpl( return ContentRepositoryImpl(
contentLocalRepository, contentLocalRepository,

View file

@ -7,18 +7,20 @@ import com.habitrpg.android.habitica.data.SocialRepository
import com.habitrpg.android.habitica.data.TaskRepository import com.habitrpg.android.habitica.data.TaskRepository
import com.habitrpg.android.habitica.data.UserRepository import com.habitrpg.android.habitica.data.UserRepository
import com.habitrpg.android.habitica.helpers.TaskAlarmManager import com.habitrpg.android.habitica.helpers.TaskAlarmManager
import com.habitrpg.android.habitica.helpers.UserScope
import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel
import dagger.Module import dagger.Module
import dagger.Provides import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent
import javax.inject.Named import javax.inject.Named
@InstallIn(SingletonComponent::class)
@Module @Module
class UserModule { class UserModule {
@Provides @Provides
@UserScope
fun providesTaskAlarmManager( fun providesTaskAlarmManager(
context: Context, @ApplicationContext context: Context,
taskRepository: TaskRepository, taskRepository: TaskRepository,
@Named(NAMED_USER_ID) userId: String @Named(NAMED_USER_ID) userId: String
): TaskAlarmManager { ): TaskAlarmManager {
@ -27,7 +29,6 @@ class UserModule {
@Provides @Provides
@Named(NAMED_USER_ID) @Named(NAMED_USER_ID)
@UserScope
fun providesUserID(sharedPreferences: SharedPreferences): String { fun providesUserID(sharedPreferences: SharedPreferences): String {
return if (BuildConfig.DEBUG && BuildConfig.TEST_USER_ID.isNotEmpty()) { return if (BuildConfig.DEBUG && BuildConfig.TEST_USER_ID.isNotEmpty()) {
BuildConfig.TEST_USER_ID BuildConfig.TEST_USER_ID
@ -37,7 +38,6 @@ class UserModule {
} }
@Provides @Provides
@UserScope
fun providesUserViewModel( fun providesUserViewModel(
@Named(NAMED_USER_ID) userID: String, @Named(NAMED_USER_ID) userID: String,
userRepository: UserRepository, userRepository: UserRepository,

View file

@ -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.data.local.implementation.RealmUserLocalRepository
import com.habitrpg.android.habitica.helpers.AppConfigManager import com.habitrpg.android.habitica.helpers.AppConfigManager
import com.habitrpg.android.habitica.helpers.PurchaseHandler import com.habitrpg.android.habitica.helpers.PurchaseHandler
import com.habitrpg.android.habitica.helpers.UserScope
import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel
import com.habitrpg.common.habitica.helpers.AnalyticsManager import com.habitrpg.common.habitica.helpers.AnalyticsManager
import dagger.Module import dagger.Module
import dagger.Provides import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent
import io.realm.Realm import io.realm.Realm
import javax.inject.Named import javax.inject.Named
@InstallIn(SingletonComponent::class)
@Module @Module
class UserRepositoryModule { class UserRepositoryModule {
@Provides @Provides
fun providesSetupCustomizationRepository(context: Context?): SetupCustomizationRepository { fun providesSetupCustomizationRepository(@ApplicationContext context: Context?): SetupCustomizationRepository {
return SetupCustomizationRepositoryImpl(context!!) return SetupCustomizationRepositoryImpl(context!!)
} }
@ -63,7 +66,6 @@ class UserRepositoryModule {
} }
@Provides @Provides
@UserScope
fun providesTaskRepository( fun providesTaskRepository(
localRepository: TaskLocalRepository, localRepository: TaskLocalRepository,
apiClient: ApiClient, apiClient: ApiClient,
@ -148,9 +150,7 @@ class UserRepositoryModule {
@Provides @Provides
fun providesInventoryLocalRepository( fun providesInventoryLocalRepository(
realm: Realm?, realm: Realm?): InventoryLocalRepository {
context: Context?
): InventoryLocalRepository {
return RealmInventoryLocalRepository(realm!!) return RealmInventoryLocalRepository(realm!!)
} }
@ -207,9 +207,8 @@ class UserRepositoryModule {
} }
@Provides @Provides
@UserScope
fun providesPurchaseHandler( fun providesPurchaseHandler(
context: Context, @ApplicationContext context: Context,
analyticsManager: AnalyticsManager, analyticsManager: AnalyticsManager,
apiClient: ApiClient, apiClient: ApiClient,
userViewModel: MainUserViewModel userViewModel: MainUserViewModel

View file

@ -4,14 +4,15 @@ import android.content.Intent
import com.google.android.gms.wearable.MessageEvent import com.google.android.gms.wearable.MessageEvent
import com.google.android.gms.wearable.Wearable import com.google.android.gms.wearable.Wearable
import com.google.android.gms.wearable.WearableListenerService 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.LoginActivity
import com.habitrpg.android.habitica.ui.activities.MainActivity import com.habitrpg.android.habitica.ui.activities.MainActivity
import com.habitrpg.android.habitica.ui.activities.TaskFormActivity import com.habitrpg.android.habitica.ui.activities.TaskFormActivity
import com.habitrpg.common.habitica.api.HostConfig import com.habitrpg.common.habitica.api.HostConfig
import com.habitrpg.common.habitica.helpers.DeviceCommunication import com.habitrpg.common.habitica.helpers.DeviceCommunication
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject import javax.inject.Inject
@AndroidEntryPoint
class DeviceCommunicationService : WearableListenerService() { class DeviceCommunicationService : WearableListenerService() {
@Inject @Inject
lateinit var hostConfig: HostConfig lateinit var hostConfig: HostConfig
@ -19,7 +20,6 @@ class DeviceCommunicationService : WearableListenerService() {
private val messageClient by lazy { Wearable.getMessageClient(this) } private val messageClient by lazy { Wearable.getMessageClient(this) }
init { init {
HabiticaBaseApplication.userComponent?.inject(this)
} }
override fun onMessageReceived(event: MessageEvent) { override fun onMessageReceived(event: MessageEvent) {

View file

@ -8,7 +8,6 @@ import android.text.Spannable
import android.widget.Toast import android.widget.Toast
import androidx.core.app.NotificationManagerCompat import androidx.core.app.NotificationManagerCompat
import androidx.core.app.RemoteInput import androidx.core.app.RemoteInput
import com.habitrpg.android.habitica.HabiticaBaseApplication
import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.data.ApiClient import com.habitrpg.android.habitica.data.ApiClient
import com.habitrpg.android.habitica.data.SocialRepository 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.android.habitica.models.user.User
import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.common.habitica.helpers.ExceptionHandler
import com.habitrpg.common.habitica.helpers.launchCatching import com.habitrpg.common.habitica.helpers.launchCatching
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.MainScope import kotlinx.coroutines.MainScope
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import javax.inject.Inject import javax.inject.Inject
@AndroidEntryPoint
class LocalNotificationActionReceiver : BroadcastReceiver() { class LocalNotificationActionReceiver : BroadcastReceiver() {
@Inject @Inject
lateinit var userRepository: UserRepository lateinit var userRepository: UserRepository
@ -46,7 +47,6 @@ class LocalNotificationActionReceiver : BroadcastReceiver() {
private var intent: Intent? = null private var intent: Intent? = null
override fun onReceive(context: Context, intent: Intent) { override fun onReceive(context: Context, intent: Intent) {
HabiticaBaseApplication.userComponent?.inject(this)
this.intent = intent this.intent = intent
this.context = context this.context = context
handleLocalNotificationAction(intent.action) handleLocalNotificationAction(intent.action)

View file

@ -10,7 +10,6 @@ import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat import androidx.core.app.NotificationManagerCompat
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.content.edit import androidx.core.content.edit
import com.habitrpg.android.habitica.HabiticaBaseApplication
import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.data.TaskRepository import com.habitrpg.android.habitica.data.TaskRepository
import com.habitrpg.android.habitica.data.UserRepository import com.habitrpg.android.habitica.data.UserRepository
@ -19,6 +18,7 @@ import com.habitrpg.android.habitica.helpers.TaskAlarmManager
import com.habitrpg.android.habitica.ui.activities.MainActivity import com.habitrpg.android.habitica.ui.activities.MainActivity
import com.habitrpg.common.habitica.helpers.launchCatching import com.habitrpg.common.habitica.helpers.launchCatching
import com.habitrpg.shared.habitica.models.tasks.TaskType import com.habitrpg.shared.habitica.models.tasks.TaskType
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.MainScope import kotlinx.coroutines.MainScope
import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.firstOrNull
import java.util.Calendar import java.util.Calendar
@ -27,6 +27,7 @@ import java.util.Random
import javax.inject.Inject import javax.inject.Inject
// https://gist.github.com/BrandonSmith/6679223 // https://gist.github.com/BrandonSmith/6679223
@AndroidEntryPoint
class NotificationPublisher : BroadcastReceiver() { class NotificationPublisher : BroadcastReceiver() {
@Inject @Inject
@ -43,8 +44,7 @@ class NotificationPublisher : BroadcastReceiver() {
this.context = context this.context = context
if (!wasInjected) { if (!wasInjected) {
wasInjected = true wasInjected = true
HabiticaBaseApplication.userComponent?.inject(this) }
}
var wasInactive = false var wasInactive = false
// Show special notification if user hasn't logged in for a week // Show special notification if user hasn't logged in for a week

View file

@ -4,15 +4,16 @@ import android.content.BroadcastReceiver
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.SharedPreferences import android.content.SharedPreferences
import com.habitrpg.android.habitica.HabiticaBaseApplication
import com.habitrpg.android.habitica.helpers.TaskAlarmManager import com.habitrpg.android.habitica.helpers.TaskAlarmManager
import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.common.habitica.helpers.ExceptionHandler
import com.habitrpg.shared.habitica.HLogger import com.habitrpg.shared.habitica.HLogger
import com.habitrpg.shared.habitica.LogLevel import com.habitrpg.shared.habitica.LogLevel
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.MainScope import kotlinx.coroutines.MainScope
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import javax.inject.Inject import javax.inject.Inject
@AndroidEntryPoint
class TaskAlarmBootReceiver : BroadcastReceiver() { class TaskAlarmBootReceiver : BroadcastReceiver() {
@Inject @Inject
@ -24,7 +25,6 @@ class TaskAlarmBootReceiver : BroadcastReceiver() {
if (intent.action != Intent.ACTION_BOOT_COMPLETED) { if (intent.action != Intent.ACTION_BOOT_COMPLETED) {
return return
} }
HabiticaBaseApplication.userComponent?.inject(this)
MainScope().launch(ExceptionHandler.coroutine()) { MainScope().launch(ExceptionHandler.coroutine()) {
taskAlarmManager.scheduleAllSavedAlarms(sharedPreferences.getBoolean("preventDailyReminder", false)) taskAlarmManager.scheduleAllSavedAlarms(sharedPreferences.getBoolean("preventDailyReminder", false))
} }

View file

@ -10,7 +10,6 @@ import android.os.Build
import androidx.core.app.NotificationCompat import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat import androidx.core.app.NotificationManagerCompat
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import com.habitrpg.android.habitica.HabiticaBaseApplication
import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.data.TaskRepository import com.habitrpg.android.habitica.data.TaskRepository
import com.habitrpg.android.habitica.extensions.withImmutableFlag 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.HLogger
import com.habitrpg.shared.habitica.LogLevel import com.habitrpg.shared.habitica.LogLevel
import com.habitrpg.shared.habitica.models.tasks.TaskType import com.habitrpg.shared.habitica.models.tasks.TaskType
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.MainScope import kotlinx.coroutines.MainScope
import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.firstOrNull
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import javax.inject.Inject import javax.inject.Inject
@AndroidEntryPoint
class TaskReceiver : BroadcastReceiver() { class TaskReceiver : BroadcastReceiver() {
@Inject @Inject
@ -36,7 +37,6 @@ class TaskReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) { override fun onReceive(context: Context, intent: Intent) {
HLogger.log(LogLevel.INFO, this::javaClass.name, "onReceive") HLogger.log(LogLevel.INFO, this::javaClass.name, "onReceive")
HabiticaBaseApplication.userComponent?.inject(this)
val extras = intent.extras val extras = intent.extras
if (extras != null) { if (extras != null) {
val taskId = extras.getString(TaskAlarmManager.TASK_ID_INTENT_KEY) val taskId = extras.getString(TaskAlarmManager.TASK_ID_INTENT_KEY)

View file

@ -10,7 +10,9 @@ import androidx.preference.PreferenceManager
import com.habitrpg.android.habitica.databinding.WidgetConfigureAddTaskBinding import com.habitrpg.android.habitica.databinding.WidgetConfigureAddTaskBinding
import com.habitrpg.android.habitica.widget.AddTaskWidgetProvider import com.habitrpg.android.habitica.widget.AddTaskWidgetProvider
import com.habitrpg.shared.habitica.models.tasks.TaskType import com.habitrpg.shared.habitica.models.tasks.TaskType
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class AddTaskWidgetActivity : AppCompatActivity() { class AddTaskWidgetActivity : AppCompatActivity() {
private var widgetId: Int = 0 private var widgetId: Int = 0

View file

@ -10,7 +10,6 @@ import android.widget.TextView
import androidx.core.app.NavUtils import androidx.core.app.NavUtils
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.databinding.ActivityAdventureGuideBinding import com.habitrpg.android.habitica.databinding.ActivityAdventureGuideBinding
import com.habitrpg.android.habitica.databinding.AdventureGuideItemBinding import com.habitrpg.android.habitica.databinding.AdventureGuideItemBinding
import com.habitrpg.android.habitica.helpers.AmplitudeManager 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.android.habitica.ui.viewmodels.MainUserViewModel
import com.habitrpg.common.habitica.extensions.fromHtml import com.habitrpg.common.habitica.extensions.fromHtml
import com.habitrpg.common.habitica.extensions.loadImage import com.habitrpg.common.habitica.extensions.loadImage
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject import javax.inject.Inject
@AndroidEntryPoint
class AdventureGuideActivity : BaseActivity() { class AdventureGuideActivity : BaseActivity() {
private lateinit var binding: ActivityAdventureGuideBinding private lateinit var binding: ActivityAdventureGuideBinding
@ -38,10 +39,6 @@ class AdventureGuideActivity : BaseActivity() {
return binding.root return binding.root
} }
override fun injectActivity(component: UserComponent?) {
component?.inject(this)
}
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)

View file

@ -11,7 +11,6 @@ import android.widget.RelativeLayout
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.habitrpg.android.habitica.R 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.InventoryRepository
import com.habitrpg.android.habitica.databinding.ActivityArmoireBinding import com.habitrpg.android.habitica.databinding.ActivityArmoireBinding
import com.habitrpg.android.habitica.helpers.AdHandler 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.ExceptionHandler
import com.habitrpg.common.habitica.helpers.launchCatching import com.habitrpg.common.habitica.helpers.launchCatching
import com.plattysoft.leonids.ParticleSystem import com.plattysoft.leonids.ParticleSystem
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.MainScope import kotlinx.coroutines.MainScope
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import java.util.Locale import java.util.Locale
import javax.inject.Inject import javax.inject.Inject
@AndroidEntryPoint
class ArmoireActivity : BaseActivity() { class ArmoireActivity : BaseActivity() {
private var equipmentKey: String? = null private var equipmentKey: String? = null
@ -47,10 +48,6 @@ class ArmoireActivity : BaseActivity() {
override fun getLayoutResId(): Int = R.layout.activity_armoire override fun getLayoutResId(): Int = R.layout.activity_armoire
override fun injectActivity(component: UserComponent?) {
component?.inject(this)
}
override fun getContentView(layoutResId: Int?): View { override fun getContentView(layoutResId: Int?): View {
binding = ActivityArmoireBinding.inflate(layoutInflater) binding = ActivityArmoireBinding.inflate(layoutInflater)
return binding.root return binding.root

View file

@ -20,9 +20,7 @@ import androidx.core.os.bundleOf
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import com.habitrpg.android.habitica.HabiticaApplication import com.habitrpg.android.habitica.HabiticaApplication
import com.habitrpg.android.habitica.HabiticaBaseApplication
import com.habitrpg.android.habitica.R 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.data.UserRepository
import com.habitrpg.android.habitica.extensions.forceLocale import com.habitrpg.android.habitica.extensions.forceLocale
import com.habitrpg.android.habitica.extensions.updateStatusBarColor import com.habitrpg.android.habitica.extensions.updateStatusBarColor
@ -87,7 +85,6 @@ abstract class BaseActivity : AppCompatActivity() {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
habiticaApplication habiticaApplication
injectActivity(HabiticaBaseApplication.userComponent)
getLayoutResId()?.let { getLayoutResId()?.let {
setContentView(getContentView(it)) setContentView(getContentView(it))
} }
@ -178,8 +175,6 @@ abstract class BaseActivity : AppCompatActivity() {
} }
} }
protected abstract fun injectActivity(component: UserComponent?)
protected fun setupToolbar(toolbar: Toolbar?) { protected fun setupToolbar(toolbar: Toolbar?) {
this.toolbar = toolbar this.toolbar = toolbar
if (toolbar != null) { if (toolbar != null) {

View file

@ -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.android.habitica.ui.views.insufficientCurrency.InsufficientGemsDialog
import com.habitrpg.common.habitica.extensions.DataBindingUtils import com.habitrpg.common.habitica.extensions.DataBindingUtils
import com.habitrpg.common.habitica.helpers.launchCatching import com.habitrpg.common.habitica.helpers.launchCatching
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.MainScope import kotlinx.coroutines.MainScope
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.map
@ -82,6 +83,7 @@ import java.text.SimpleDateFormat
import java.util.Date import java.util.Date
import javax.inject.Inject import javax.inject.Inject
@AndroidEntryPoint
class BirthdayActivity : BaseActivity() { class BirthdayActivity : BaseActivity() {
@Inject @Inject
lateinit var userViewModel: MainUserViewModel lateinit var userViewModel: MainUserViewModel
@ -189,10 +191,6 @@ class BirthdayActivity : BaseActivity() {
userRepository.retrieveUser(false, true) userRepository.retrieveUser(false, true)
isPurchasing.value = false isPurchasing.value = false
} }
override fun injectActivity(component: UserComponent?) {
component?.inject(this)
}
} }
@Composable @Composable

View file

@ -18,7 +18,6 @@ import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.widget.AppCompatCheckedTextView import androidx.appcompat.widget.AppCompatCheckedTextView
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.habitrpg.android.habitica.R 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.ChallengeRepository
import com.habitrpg.android.habitica.data.SocialRepository import com.habitrpg.android.habitica.data.SocialRepository
import com.habitrpg.android.habitica.databinding.ActivityCreateChallengeBinding 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.ExceptionHandler
import com.habitrpg.common.habitica.helpers.launchCatching import com.habitrpg.common.habitica.helpers.launchCatching
import com.habitrpg.shared.habitica.models.tasks.TaskType import com.habitrpg.shared.habitica.models.tasks.TaskType
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.firstOrNull
@ -46,6 +46,7 @@ import kotlinx.coroutines.launch
import java.util.UUID import java.util.UUID
import javax.inject.Inject import javax.inject.Inject
@AndroidEntryPoint
class ChallengeFormActivity : BaseActivity() { class ChallengeFormActivity : BaseActivity() {
private lateinit var binding: ActivityCreateChallengeBinding private lateinit var binding: ActivityCreateChallengeBinding
@ -118,10 +119,6 @@ class ChallengeFormActivity : BaseActivity() {
return R.layout.activity_create_challenge return R.layout.activity_create_challenge
} }
override fun injectActivity(component: UserComponent?) {
component?.inject(this)
}
override fun onCreateOptionsMenu(menu: Menu): Boolean { override fun onCreateOptionsMenu(menu: Menu): Boolean {
val inflater = menuInflater val inflater = menuInflater
inflater.inflate(R.menu.menu_create_challenge, menu) inflater.inflate(R.menu.menu_create_challenge, menu)
@ -224,11 +221,11 @@ class ChallengeFormActivity : BaseActivity() {
val intent = intent val intent = intent
val bundle = intent.extras val bundle = intent.extras
ChallengeTasksRecyclerViewAdapter( /*ChallengeTasksRecyclerViewAdapter(
TasksViewModel(), 0, this, "", TasksViewModel(), 0, this, "",
openTaskDisabled = false, openTaskDisabled = false,
taskActionsDisabled = true taskActionsDisabled = true
).also { challengeTasks = it } ).also { challengeTasks = it }*/
challengeTasks.onTaskOpen = { challengeTasks.onTaskOpen = {
if (it.isValid) { if (it.isValid) {
openNewTaskActivity(it.type, it) openNewTaskActivity(it.type, it)

View file

@ -11,7 +11,6 @@ import androidx.core.content.ContextCompat
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.navigation.navArgs import androidx.navigation.navArgs
import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.databinding.ActivityClassSelectionBinding import com.habitrpg.android.habitica.databinding.ActivityClassSelectionBinding
import com.habitrpg.android.habitica.models.user.Gear import com.habitrpg.android.habitica.models.user.Gear
import com.habitrpg.android.habitica.models.user.Items 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.HabiticaAlertDialog
import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaProgressDialog import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaProgressDialog
import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.common.habitica.helpers.ExceptionHandler
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import javax.inject.Inject import javax.inject.Inject
@AndroidEntryPoint
class ClassSelectionActivity : BaseActivity() { class ClassSelectionActivity : BaseActivity() {
@Inject @Inject
@ -152,10 +153,6 @@ class ClassSelectionActivity : BaseActivity() {
binding.warriorButton.setCompoundDrawablesWithIntrinsicBounds(warriorIcon, null, null, null) binding.warriorButton.setCompoundDrawablesWithIntrinsicBounds(warriorIcon, null, null, null)
} }
override fun injectActivity(component: UserComponent?) {
component?.inject(this)
}
private fun makeUser(preferences: Preferences, outfit: Outfit): User { private fun makeUser(preferences: Preferences, outfit: Outfit): User {
val user = User() val user = User()
user.preferences = preferences user.preferences = preferences

View file

@ -7,7 +7,6 @@ import android.view.View
import android.view.animation.AccelerateInterpolator import android.view.animation.AccelerateInterpolator
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.habitrpg.android.habitica.R 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.InventoryRepository
import com.habitrpg.android.habitica.databinding.ActivityDeathBinding import com.habitrpg.android.habitica.databinding.ActivityDeathBinding
import com.habitrpg.android.habitica.extensions.observeOnce 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.Animations
import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.common.habitica.helpers.ExceptionHandler
import com.plattysoft.leonids.ParticleSystem import com.plattysoft.leonids.ParticleSystem
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import javax.inject.Inject import javax.inject.Inject
@AndroidEntryPoint
class DeathActivity : BaseActivity() { class DeathActivity : BaseActivity() {
private lateinit var binding: ActivityDeathBinding private lateinit var binding: ActivityDeathBinding
@ -36,10 +37,6 @@ class DeathActivity : BaseActivity() {
override fun getLayoutResId(): Int = R.layout.activity_armoire override fun getLayoutResId(): Int = R.layout.activity_armoire
override fun injectActivity(component: UserComponent?) {
component?.inject(this)
}
override fun getContentView(layoutResId: Int?): View { override fun getContentView(layoutResId: Int?): View {
binding = ActivityDeathBinding.inflate(layoutInflater) binding = ActivityDeathBinding.inflate(layoutInflater)
return binding.root return binding.root

View file

@ -8,15 +8,16 @@ import android.view.View
import android.widget.EditText import android.widget.EditText
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.databinding.ActivityFixcharacterBinding import com.habitrpg.android.habitica.databinding.ActivityFixcharacterBinding
import com.habitrpg.android.habitica.extensions.setTintWith import com.habitrpg.android.habitica.extensions.setTintWith
import com.habitrpg.android.habitica.models.user.Stats import com.habitrpg.android.habitica.models.user.Stats
import com.habitrpg.android.habitica.models.user.User import com.habitrpg.android.habitica.models.user.User
import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel
import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject import javax.inject.Inject
@AndroidEntryPoint
class FixCharacterValuesActivity : BaseActivity() { class FixCharacterValuesActivity : BaseActivity() {
private lateinit var binding: ActivityFixcharacterBinding private lateinit var binding: ActivityFixcharacterBinding
@ -31,10 +32,6 @@ class FixCharacterValuesActivity : BaseActivity() {
return binding.root return binding.root
} }
override fun injectActivity(component: UserComponent?) {
component?.inject(this)
}
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)

View file

@ -22,7 +22,6 @@ import androidx.core.view.MenuCompat
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.habitrpg.android.habitica.R 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.ApiClient
import com.habitrpg.android.habitica.data.InventoryRepository import com.habitrpg.android.habitica.data.InventoryRepository
import com.habitrpg.android.habitica.data.SocialRepository import com.habitrpg.android.habitica.data.SocialRepository
@ -48,6 +47,7 @@ import com.habitrpg.common.habitica.helpers.RecyclerViewState
import com.habitrpg.common.habitica.helpers.launchCatching import com.habitrpg.common.habitica.helpers.launchCatching
import com.habitrpg.common.habitica.helpers.setMarkdown import com.habitrpg.common.habitica.helpers.setMarkdown
import com.habitrpg.common.habitica.views.PixelArtView import com.habitrpg.common.habitica.views.PixelArtView
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.MainScope import kotlinx.coroutines.MainScope
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
@ -58,6 +58,7 @@ import javax.inject.Inject
import kotlin.math.floor import kotlin.math.floor
import kotlin.math.min import kotlin.math.min
@AndroidEntryPoint
class FullProfileActivity : BaseActivity() { class FullProfileActivity : BaseActivity() {
private var blocks: List<String> = listOf() private var blocks: List<String> = listOf()
private var isModerator = false private var isModerator = false
@ -717,10 +718,6 @@ class FullProfileActivity : BaseActivity() {
return binding.root return binding.root
} }
override fun injectActivity(component: UserComponent?) {
component?.inject(this)
}
companion object { companion object {
fun open(userId: String) { fun open(userId: String) {

View file

@ -4,19 +4,17 @@ import android.os.Bundle
import androidx.appcompat.widget.Toolbar import androidx.appcompat.widget.Toolbar
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import com.habitrpg.android.habitica.R 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.GemsPurchaseFragment
import com.habitrpg.android.habitica.ui.fragments.purchases.SubscriptionFragment import com.habitrpg.android.habitica.ui.fragments.purchases.SubscriptionFragment
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class GemPurchaseActivity : PurchaseActivity() { class GemPurchaseActivity : PurchaseActivity() {
override fun getLayoutResId(): Int { override fun getLayoutResId(): Int {
return R.layout.activity_gem_purchase return R.layout.activity_gem_purchase
} }
override fun injectActivity(component: UserComponent?) {
component?.inject(this)
}
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)

View file

@ -8,7 +8,6 @@ import androidx.navigation.navArgs
import androidx.viewpager2.adapter.FragmentStateAdapter import androidx.viewpager2.adapter.FragmentStateAdapter
import com.google.android.material.tabs.TabLayoutMediator import com.google.android.material.tabs.TabLayoutMediator
import com.habitrpg.android.habitica.R 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.SocialRepository
import com.habitrpg.android.habitica.databinding.ActivityGiftGemsBinding import com.habitrpg.android.habitica.databinding.ActivityGiftGemsBinding
import com.habitrpg.android.habitica.helpers.AppConfigManager 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.fragments.purchases.GiftPurchaseGemsFragment
import com.habitrpg.android.habitica.ui.views.CurrencyView import com.habitrpg.android.habitica.ui.views.CurrencyView
import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.common.habitica.helpers.ExceptionHandler
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.firstOrNull
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import javax.inject.Inject import javax.inject.Inject
@AndroidEntryPoint
class GiftGemsActivity : PurchaseActivity() { class GiftGemsActivity : PurchaseActivity() {
private lateinit var binding: ActivityGiftGemsBinding private lateinit var binding: ActivityGiftGemsBinding
@ -54,10 +55,6 @@ class GiftGemsActivity : PurchaseActivity() {
return binding.root return binding.root
} }
override fun injectActivity(component: UserComponent?) {
component?.inject(this)
}
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)

View file

@ -7,7 +7,6 @@ import androidx.lifecycle.lifecycleScope
import androidx.navigation.navArgs import androidx.navigation.navArgs
import com.android.billingclient.api.ProductDetails import com.android.billingclient.api.ProductDetails
import com.habitrpg.android.habitica.R 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.SocialRepository
import com.habitrpg.android.habitica.databinding.ActivityGiftSubscriptionBinding import com.habitrpg.android.habitica.databinding.ActivityGiftSubscriptionBinding
import com.habitrpg.android.habitica.helpers.AppConfigManager 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.helpers.PurchaseTypes
import com.habitrpg.android.habitica.ui.views.subscriptions.SubscriptionOptionView import com.habitrpg.android.habitica.ui.views.subscriptions.SubscriptionOptionView
import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.common.habitica.helpers.ExceptionHandler
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import javax.inject.Inject import javax.inject.Inject
@AndroidEntryPoint
class GiftSubscriptionActivity : PurchaseActivity() { class GiftSubscriptionActivity : PurchaseActivity() {
private lateinit var binding: ActivityGiftSubscriptionBinding private lateinit var binding: ActivityGiftSubscriptionBinding
@ -42,10 +43,6 @@ class GiftSubscriptionActivity : PurchaseActivity() {
return R.layout.activity_gift_subscription return R.layout.activity_gift_subscription
} }
override fun injectActivity(component: UserComponent?) {
component?.inject(this)
}
override fun getContentView(layoutResId: Int?): View { override fun getContentView(layoutResId: Int?): View {
binding = ActivityGiftSubscriptionBinding.inflate(layoutInflater) binding = ActivityGiftSubscriptionBinding.inflate(layoutInflater)
return binding.root return binding.root

View file

@ -5,12 +5,13 @@ import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import com.habitrpg.android.habitica.R 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.databinding.ActivityGroupFormBinding
import com.habitrpg.android.habitica.ui.helpers.AutocompleteAdapter import com.habitrpg.android.habitica.ui.helpers.AutocompleteAdapter
import com.habitrpg.android.habitica.ui.helpers.dismissKeyboard import com.habitrpg.android.habitica.ui.helpers.dismissKeyboard
import com.habitrpg.common.habitica.helpers.MarkdownParser import com.habitrpg.common.habitica.helpers.MarkdownParser
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class GroupFormActivity : BaseActivity() { class GroupFormActivity : BaseActivity() {
private lateinit var binding: ActivityGroupFormBinding private lateinit var binding: ActivityGroupFormBinding
@ -65,10 +66,6 @@ class GroupFormActivity : BaseActivity() {
} }
} }
override fun injectActivity(component: UserComponent?) {
component?.inject(this)
}
private fun fillForm() { private fun fillForm() {
binding.groupNameEditText.setText(groupName) binding.groupNameEditText.setText(groupName)
binding.groupDescriptionEditText.setText(groupDescription) binding.groupDescriptionEditText.setText(groupDescription)

View file

@ -10,19 +10,16 @@ import androidx.fragment.app.Fragment
import androidx.viewpager2.adapter.FragmentStateAdapter import androidx.viewpager2.adapter.FragmentStateAdapter
import com.google.android.material.tabs.TabLayoutMediator import com.google.android.material.tabs.TabLayoutMediator
import com.habitrpg.android.habitica.R 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.SocialRepository
import com.habitrpg.android.habitica.databinding.ActivityPartyInviteBinding 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.modules.AppModule
import com.habitrpg.android.habitica.ui.fragments.social.party.PartyInviteFragment import com.habitrpg.android.habitica.ui.fragments.social.party.PartyInviteFragment
import com.habitrpg.android.habitica.ui.helpers.dismissKeyboard import com.habitrpg.android.habitica.ui.helpers.dismissKeyboard
import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar import dagger.hilt.android.AndroidEntryPoint
import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar.Companion.showSnackbar
import javax.inject.Inject import javax.inject.Inject
import javax.inject.Named import javax.inject.Named
import kotlin.time.DurationUnit
@AndroidEntryPoint
class GroupInviteActivity : BaseActivity() { class GroupInviteActivity : BaseActivity() {
private lateinit var binding: ActivityPartyInviteBinding private lateinit var binding: ActivityPartyInviteBinding
@ -53,10 +50,6 @@ class GroupInviteActivity : BaseActivity() {
setViewPagerAdapter() setViewPagerAdapter()
} }
override fun injectActivity(component: UserComponent?) {
component?.inject(this)
}
override fun onCreateOptionsMenu(menu: Menu): Boolean { override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.menu_party_invite, menu) menuInflater.inflate(R.menu.menu_party_invite, menu)
return super.onCreateOptionsMenu(menu) return super.onCreateOptionsMenu(menu)
@ -68,12 +61,6 @@ class GroupInviteActivity : BaseActivity() {
R.id.action_send_invites -> { R.id.action_send_invites -> {
setResult(Activity.RESULT_OK, createResultIntent()) setResult(Activity.RESULT_OK, createResultIntent())
dismissKeyboard() 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 true
} }
android.R.id.home -> { android.R.id.home -> {
@ -87,13 +74,6 @@ class GroupInviteActivity : BaseActivity() {
private fun createResultIntent(): Intent { private fun createResultIntent(): Intent {
val intent = Intent() val intent = Intent()
if (fragments.size == 0) return 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 return intent
} }
@ -103,7 +83,6 @@ class GroupInviteActivity : BaseActivity() {
val statePagerAdapter = object : FragmentStateAdapter(fragmentManager, lifecycle) { val statePagerAdapter = object : FragmentStateAdapter(fragmentManager, lifecycle) {
override fun createFragment(position: Int): Fragment { override fun createFragment(position: Int): Fragment {
val fragment = PartyInviteFragment() val fragment = PartyInviteFragment()
fragment.isEmailInvite = position == 1
fragments.add(fragment) fragments.add(fragment)
return fragment return fragment
} }

View file

@ -4,9 +4,9 @@ import android.os.Bundle
import android.view.MenuItem import android.view.MenuItem
import android.widget.TextView import android.widget.TextView
import com.habitrpg.android.habitica.R 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.ExceptionHandler
import com.habitrpg.common.habitica.helpers.setMarkdown import com.habitrpg.common.habitica.helpers.setMarkdown
import dagger.hilt.android.AndroidEntryPoint
import okhttp3.Call import okhttp3.Call
import okhttp3.Callback import okhttp3.Callback
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
@ -16,13 +16,10 @@ import java.io.BufferedReader
import java.io.IOException import java.io.IOException
import java.io.InputStreamReader import java.io.InputStreamReader
@AndroidEntryPoint
class GuidelinesActivity : BaseActivity() { class GuidelinesActivity : BaseActivity() {
override fun getLayoutResId(): Int = R.layout.activity_guidelines override fun getLayoutResId(): Int = R.layout.activity_guidelines
override fun injectActivity(component: UserComponent?) {
component?.inject(this)
}
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setupToolbar(findViewById(R.id.toolbar)) setupToolbar(findViewById(R.id.toolbar))

View file

@ -9,7 +9,6 @@ import androidx.core.content.edit
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import com.habitrpg.android.habitica.R 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.data.TaskRepository
import com.habitrpg.android.habitica.databinding.WidgetConfigureHabitButtonBinding import com.habitrpg.android.habitica.databinding.WidgetConfigureHabitButtonBinding
import com.habitrpg.android.habitica.modules.AppModule 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.android.habitica.widget.HabitButtonWidgetProvider
import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.common.habitica.helpers.ExceptionHandler
import com.habitrpg.shared.habitica.models.tasks.TaskType import com.habitrpg.shared.habitica.models.tasks.TaskType
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.SupervisorJob
@ -25,6 +25,7 @@ import kotlinx.coroutines.launch
import javax.inject.Inject import javax.inject.Inject
import javax.inject.Named import javax.inject.Named
@AndroidEntryPoint
class HabitButtonWidgetActivity : BaseActivity() { class HabitButtonWidgetActivity : BaseActivity() {
private val job = SupervisorJob() private val job = SupervisorJob()
@ -47,10 +48,6 @@ class HabitButtonWidgetActivity : BaseActivity() {
return binding.root return binding.root
} }
override fun injectActivity(component: UserComponent?) {
component?.inject(this)
}
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)

View file

@ -13,15 +13,16 @@ import androidx.fragment.app.FragmentStatePagerAdapter
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.viewpager.widget.ViewPager import androidx.viewpager.widget.ViewPager
import com.habitrpg.android.habitica.R 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.data.ContentRepository
import com.habitrpg.android.habitica.databinding.ActivityIntroBinding import com.habitrpg.android.habitica.databinding.ActivityIntroBinding
import com.habitrpg.android.habitica.ui.fragments.setup.IntroFragment import com.habitrpg.android.habitica.ui.fragments.setup.IntroFragment
import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.common.habitica.helpers.ExceptionHandler
import com.viewpagerindicator.IconPagerAdapter import com.viewpagerindicator.IconPagerAdapter
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import javax.inject.Inject import javax.inject.Inject
@AndroidEntryPoint
class IntroActivity : BaseActivity(), View.OnClickListener, ViewPager.OnPageChangeListener { class IntroActivity : BaseActivity(), View.OnClickListener, ViewPager.OnPageChangeListener {
private lateinit var binding: ActivityIntroBinding private lateinit var binding: ActivityIntroBinding
@ -54,10 +55,6 @@ class IntroActivity : BaseActivity(), View.OnClickListener, ViewPager.OnPageChan
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS) window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
} }
override fun injectActivity(component: UserComponent?) {
component?.inject(this)
}
private fun setupIntro() { private fun setupIntro() {
binding.viewPager.adapter = PagerAdapter(supportFragmentManager) binding.viewPager.adapter = PagerAdapter(supportFragmentManager)

View file

@ -32,7 +32,6 @@ import com.google.android.gms.wearable.MessageClient
import com.google.android.gms.wearable.Wearable import com.google.android.gms.wearable.Wearable
import com.google.firebase.analytics.FirebaseAnalytics import com.google.firebase.analytics.FirebaseAnalytics
import com.habitrpg.android.habitica.R 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.ApiClient
import com.habitrpg.android.habitica.databinding.ActivityLoginBinding import com.habitrpg.android.habitica.databinding.ActivityLoginBinding
import com.habitrpg.android.habitica.extensions.addCancelButton 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.ExceptionHandler
import com.habitrpg.common.habitica.helpers.launchCatching import com.habitrpg.common.habitica.helpers.launchCatching
import com.habitrpg.common.habitica.models.auth.UserAuthResponse import com.habitrpg.common.habitica.models.auth.UserAuthResponse
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import javax.inject.Inject import javax.inject.Inject
@AndroidEntryPoint
class LoginActivity : BaseActivity() { class LoginActivity : BaseActivity() {
private lateinit var viewModel: AuthenticationViewModel
private lateinit var binding: ActivityLoginBinding private lateinit var binding: ActivityLoginBinding
@Inject @Inject
@ -61,6 +61,8 @@ class LoginActivity : BaseActivity() {
lateinit var sharedPrefs: SharedPreferences lateinit var sharedPrefs: SharedPreferences
@Inject @Inject
lateinit var configManager: AppConfigManager lateinit var configManager: AppConfigManager
@Inject
lateinit var viewModel : AuthenticationViewModel
private var isRegistering: Boolean = false private var isRegistering: Boolean = false
private var isShowingForm: Boolean = false private var isShowingForm: Boolean = false
@ -141,7 +143,6 @@ class LoginActivity : BaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
window.requestFeature(Window.FEATURE_ACTION_BAR) window.requestFeature(Window.FEATURE_ACTION_BAR)
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
viewModel = AuthenticationViewModel()
supportActionBar?.hide() supportActionBar?.hide()
// Set default values to avoid null-responses when requesting unedited settings // Set default values to avoid null-responses when requesting unedited settings
PreferenceManager.setDefaultValues(this, R.xml.preferences_fragment, false) 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() { private fun resetLayout() {
if (this.isRegistering) { if (this.isRegistering) {
if (binding.email.visibility == View.GONE) { if (binding.email.visibility == View.GONE) {

View file

@ -30,7 +30,6 @@ import com.google.android.gms.wearable.Wearable
import com.google.firebase.perf.FirebasePerformance import com.google.firebase.perf.FirebasePerformance
import com.habitrpg.android.habitica.BuildConfig import com.habitrpg.android.habitica.BuildConfig
import com.habitrpg.android.habitica.R 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.ApiClient
import com.habitrpg.android.habitica.data.InventoryRepository import com.habitrpg.android.habitica.data.InventoryRepository
import com.habitrpg.android.habitica.data.TaskRepository 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.common.habitica.views.AvatarView
import com.habitrpg.shared.habitica.models.responses.MaintenanceResponse import com.habitrpg.shared.habitica.models.responses.MaintenanceResponse
import com.habitrpg.shared.habitica.models.responses.TaskScoringResult import com.habitrpg.shared.habitica.models.responses.TaskScoringResult
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
@ -84,6 +84,7 @@ import kotlin.time.toDuration
var mainActivityCreatedAt: Date? = null var mainActivityCreatedAt: Date? = null
@AndroidEntryPoint
open class MainActivity : BaseActivity(), SnackbarActivity { open class MainActivity : BaseActivity(), SnackbarActivity {
private var launchScreen: String? = null private var launchScreen: String? = null
@ -350,10 +351,6 @@ open class MainActivity : BaseActivity(), SnackbarActivity {
} else super.onOptionsItemSelected(item) } else super.onOptionsItemSelected(item)
} }
override fun injectActivity(component: UserComponent?) {
component?.inject(this)
}
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()

View file

@ -8,13 +8,14 @@ import androidx.core.net.toUri
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.api.MaintenanceApiService 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.data.ApiClient
import com.habitrpg.android.habitica.databinding.ActivityMaintenanceBinding import com.habitrpg.android.habitica.databinding.ActivityMaintenanceBinding
import com.habitrpg.common.habitica.helpers.launchCatching import com.habitrpg.common.habitica.helpers.launchCatching
import com.habitrpg.common.habitica.helpers.setMarkdown import com.habitrpg.common.habitica.helpers.setMarkdown
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject import javax.inject.Inject
@AndroidEntryPoint
class MaintenanceActivity : BaseActivity() { class MaintenanceActivity : BaseActivity() {
private lateinit var binding: ActivityMaintenanceBinding private lateinit var binding: ActivityMaintenanceBinding
@ -58,10 +59,6 @@ class MaintenanceActivity : BaseActivity() {
binding.playStoreButton.setOnClickListener { openInPlayStore() } binding.playStoreButton.setOnClickListener { openInPlayStore() }
} }
override fun injectActivity(component: UserComponent?) {
component?.inject(this)
}
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
if (!isDeprecationNotice) { if (!isDeprecationNotice) {

View file

@ -15,7 +15,6 @@ import androidx.activity.viewModels
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.habitrpg.android.habitica.R 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.InventoryRepository
import com.habitrpg.android.habitica.data.SocialRepository import com.habitrpg.android.habitica.data.SocialRepository
import com.habitrpg.android.habitica.databinding.ActivityNotificationsBinding import com.habitrpg.android.habitica.databinding.ActivityNotificationsBinding
@ -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.QuestInvitationData
import com.habitrpg.common.habitica.models.notifications.UnallocatedPointsData import com.habitrpg.common.habitica.models.notifications.UnallocatedPointsData
import com.habitrpg.common.habitica.views.PixelArtView import com.habitrpg.common.habitica.views.PixelArtView
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.firstOrNull
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import javax.inject.Inject import javax.inject.Inject
@AndroidEntryPoint
class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnRefreshListener { class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnRefreshListener {
private lateinit var binding: ActivityNotificationsBinding private lateinit var binding: ActivityNotificationsBinding
@ -79,10 +80,6 @@ class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget
binding.notificationsRefreshLayout.setOnRefreshListener(this) binding.notificationsRefreshLayout.setOnRefreshListener(this)
} }
override fun injectActivity(component: UserComponent?) {
component?.inject(this)
}
override fun onSupportNavigateUp(): Boolean { override fun onSupportNavigateUp(): Boolean {
if (supportFragmentManager.backStackEntryCount > 0) { if (supportFragmentManager.backStackEntryCount > 0) {
onBackPressed() onBackPressed()

View file

@ -5,13 +5,14 @@ import android.view.ViewGroup
import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceFragmentCompat
import androidx.preference.PreferenceScreen import androidx.preference.PreferenceScreen
import com.habitrpg.android.habitica.R 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.AccountPreferenceFragment
import com.habitrpg.android.habitica.ui.fragments.preferences.EmailNotificationsPreferencesFragment 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.PreferencesFragment
import com.habitrpg.android.habitica.ui.fragments.preferences.PushNotificationsPreferencesFragment import com.habitrpg.android.habitica.ui.fragments.preferences.PushNotificationsPreferencesFragment
import com.habitrpg.android.habitica.ui.views.SnackbarActivity import com.habitrpg.android.habitica.ui.views.SnackbarActivity
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class PrefsActivity : BaseActivity(), PreferenceFragmentCompat.OnPreferenceStartScreenCallback, SnackbarActivity { class PrefsActivity : BaseActivity(), PreferenceFragmentCompat.OnPreferenceStartScreenCallback, SnackbarActivity {
override fun getLayoutResId(): Int = R.layout.activity_prefs override fun getLayoutResId(): Int = R.layout.activity_prefs
@ -26,10 +27,6 @@ class PrefsActivity : BaseActivity(), PreferenceFragmentCompat.OnPreferenceStart
.commit() .commit()
} }
override fun injectActivity(component: UserComponent?) {
component?.inject(this)
}
override fun onSupportNavigateUp(): Boolean { override fun onSupportNavigateUp(): Boolean {
if (supportFragmentManager.backStackEntryCount > 0) { if (supportFragmentManager.backStackEntryCount > 0) {
onBackPressed() onBackPressed()

View file

@ -12,16 +12,17 @@ import androidx.lifecycle.lifecycleScope
import androidx.navigation.navArgs import androidx.navigation.navArgs
import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.habitrpg.android.habitica.R 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.SocialRepository
import com.habitrpg.android.habitica.databinding.ActivityReportMessageBinding import com.habitrpg.android.habitica.databinding.ActivityReportMessageBinding
import com.habitrpg.android.habitica.ui.helpers.dismissKeyboard import com.habitrpg.android.habitica.ui.helpers.dismissKeyboard
import com.habitrpg.common.habitica.extensions.getThemeColor import com.habitrpg.common.habitica.extensions.getThemeColor
import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.common.habitica.helpers.ExceptionHandler
import com.habitrpg.common.habitica.helpers.setMarkdown import com.habitrpg.common.habitica.helpers.setMarkdown
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import javax.inject.Inject import javax.inject.Inject
@AndroidEntryPoint
class ReportMessageActivity : BaseActivity() { class ReportMessageActivity : BaseActivity() {
private lateinit var binding: ActivityReportMessageBinding private lateinit var binding: ActivityReportMessageBinding
@ -39,10 +40,6 @@ class ReportMessageActivity : BaseActivity() {
return R.layout.activity_report_message return R.layout.activity_report_message
} }
override fun injectActivity(component: UserComponent?) {
component?.inject(this)
}
override fun getContentView(layoutResId: Int?): View { override fun getContentView(layoutResId: Int?): View {
binding = ActivityReportMessageBinding.inflate(layoutInflater) binding = ActivityReportMessageBinding.inflate(layoutInflater)
return binding.root return binding.root

View file

@ -18,7 +18,6 @@ import androidx.lifecycle.lifecycleScope
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import androidx.viewpager.widget.ViewPager import androidx.viewpager.widget.ViewPager
import com.habitrpg.android.habitica.R 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.ApiClient
import com.habitrpg.android.habitica.data.InventoryRepository import com.habitrpg.android.habitica.data.InventoryRepository
import com.habitrpg.android.habitica.data.TaskRepository 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.ExceptionHandler
import com.habitrpg.common.habitica.helpers.launchCatching import com.habitrpg.common.habitica.helpers.launchCatching
import com.viewpagerindicator.IconPagerAdapter import com.viewpagerindicator.IconPagerAdapter
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.FlowPreview
import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.flow.debounce
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@ -39,6 +39,7 @@ import java.util.Locale
import javax.inject.Inject import javax.inject.Inject
import kotlin.time.Duration.Companion.milliseconds import kotlin.time.Duration.Companion.milliseconds
@AndroidEntryPoint
class SetupActivity : BaseActivity(), ViewPager.OnPageChangeListener { class SetupActivity : BaseActivity(), ViewPager.OnPageChangeListener {
private lateinit var binding: ActivitySetupBinding private lateinit var binding: ActivitySetupBinding
@ -108,10 +109,6 @@ class SetupActivity : BaseActivity(), ViewPager.OnPageChangeListener {
binding.nextButton.setOnClickListener { nextClicked() } binding.nextButton.setOnClickListener { nextClicked() }
} }
override fun injectActivity(component: UserComponent?) {
component?.inject(this)
}
override fun onDestroy() { override fun onDestroy() {
userRepository.close() userRepository.close()
super.onDestroy() super.onDestroy()

View file

@ -7,19 +7,20 @@ import android.view.View
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import com.habitrpg.android.habitica.R 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.SocialRepository
import com.habitrpg.android.habitica.databinding.ActivitySkillMembersBinding import com.habitrpg.android.habitica.databinding.ActivitySkillMembersBinding
import com.habitrpg.android.habitica.ui.adapter.social.PartyMemberRecyclerViewAdapter import com.habitrpg.android.habitica.ui.adapter.social.PartyMemberRecyclerViewAdapter
import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel
import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.common.habitica.helpers.ExceptionHandler
import com.habitrpg.common.habitica.helpers.launchCatching import com.habitrpg.common.habitica.helpers.launchCatching
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.map
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import javax.inject.Inject import javax.inject.Inject
@AndroidEntryPoint
class SkillMemberActivity : BaseActivity() { class SkillMemberActivity : BaseActivity() {
private lateinit var binding: ActivitySkillMembersBinding private lateinit var binding: ActivitySkillMembersBinding
private var viewAdapter: PartyMemberRecyclerViewAdapter? = null private var viewAdapter: PartyMemberRecyclerViewAdapter? = null
@ -33,10 +34,6 @@ class SkillMemberActivity : BaseActivity() {
return R.layout.activity_skill_members return R.layout.activity_skill_members
} }
override fun injectActivity(component: UserComponent?) {
component?.inject(this)
}
override fun getContentView(layoutResId: Int?): View { override fun getContentView(layoutResId: Int?): View {
binding = ActivitySkillMembersBinding.inflate(layoutInflater) binding = ActivitySkillMembersBinding.inflate(layoutInflater)
return binding.root return binding.root

View file

@ -10,16 +10,17 @@ import androidx.fragment.app.Fragment
import androidx.viewpager2.adapter.FragmentStateAdapter import androidx.viewpager2.adapter.FragmentStateAdapter
import com.google.android.material.tabs.TabLayoutMediator import com.google.android.material.tabs.TabLayoutMediator
import com.habitrpg.android.habitica.R 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.data.TaskRepository
import com.habitrpg.android.habitica.databinding.ActivitySkillTasksBinding import com.habitrpg.android.habitica.databinding.ActivitySkillTasksBinding
import com.habitrpg.android.habitica.models.tasks.Task import com.habitrpg.android.habitica.models.tasks.Task
import com.habitrpg.android.habitica.modules.AppModule import com.habitrpg.android.habitica.modules.AppModule
import com.habitrpg.android.habitica.ui.fragments.skills.SkillTasksRecyclerViewFragment import com.habitrpg.android.habitica.ui.fragments.skills.SkillTasksRecyclerViewFragment
import com.habitrpg.shared.habitica.models.tasks.TaskType import com.habitrpg.shared.habitica.models.tasks.TaskType
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject import javax.inject.Inject
import javax.inject.Named import javax.inject.Named
@AndroidEntryPoint
class SkillTasksActivity : BaseActivity() { class SkillTasksActivity : BaseActivity() {
private lateinit var binding: ActivitySkillTasksBinding private lateinit var binding: ActivitySkillTasksBinding
@ -45,10 +46,6 @@ class SkillTasksActivity : BaseActivity() {
return binding.root return binding.root
} }
override fun injectActivity(component: UserComponent?) {
component?.inject(this)
}
private fun loadTaskLists() { private fun loadTaskLists() {
val statePagerAdapter = object : FragmentStateAdapter(supportFragmentManager, lifecycle) { val statePagerAdapter = object : FragmentStateAdapter(supportFragmentManager, lifecycle) {

View file

@ -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.HabitResetOption
import com.habitrpg.shared.habitica.models.tasks.TaskDifficulty import com.habitrpg.shared.habitica.models.tasks.TaskDifficulty
import com.habitrpg.shared.habitica.models.tasks.TaskType import com.habitrpg.shared.habitica.models.tasks.TaskType
import dagger.hilt.android.AndroidEntryPoint
import io.realm.RealmList import io.realm.RealmList
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.firstOrNull
@ -77,6 +78,7 @@ import kotlinx.coroutines.launch
import java.util.Date import java.util.Date
import javax.inject.Inject import javax.inject.Inject
@AndroidEntryPoint
class TaskFormActivity : BaseActivity() { class TaskFormActivity : BaseActivity() {
private val viewModel: TaskFormViewModel by viewModels() private val viewModel: TaskFormViewModel by viewModels()
@ -172,10 +174,6 @@ class TaskFormActivity : BaseActivity() {
return binding.root return binding.root
} }
override fun injectActivity(component: UserComponent?) {
component?.inject(this)
}
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
overrideModernHeader = false overrideModernHeader = false
val bundle = intent.extras ?: return val bundle = intent.extras ?: return

View file

@ -38,68 +38,51 @@ import androidx.compose.ui.text.SpanStyle
import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.buildAnnotatedString
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.withStyle import androidx.compose.ui.text.withStyle
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.asLiveData import androidx.lifecycle.asLiveData
import com.google.accompanist.systemuicontroller.rememberSystemUiController import com.google.accompanist.systemuicontroller.rememberSystemUiController
import com.habitrpg.android.habitica.R 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.SocialRepository
import com.habitrpg.android.habitica.data.TaskRepository import com.habitrpg.android.habitica.data.TaskRepository
import com.habitrpg.android.habitica.data.UserRepository
import com.habitrpg.android.habitica.helpers.MainNavigationController import com.habitrpg.android.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.helpers.TaskDescriptionBuilder import com.habitrpg.android.habitica.helpers.TaskDescriptionBuilder
import com.habitrpg.android.habitica.models.members.Member import com.habitrpg.android.habitica.models.members.Member
import com.habitrpg.android.habitica.ui.theme.HabiticaTheme import com.habitrpg.android.habitica.ui.theme.HabiticaTheme
import com.habitrpg.android.habitica.ui.viewmodels.BaseViewModel 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.CompletedAt
import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper
import com.habitrpg.android.habitica.ui.views.UserRow import com.habitrpg.android.habitica.ui.views.UserRow
import com.habitrpg.shared.habitica.models.tasks.TaskType import com.habitrpg.shared.habitica.models.tasks.TaskType
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import java.text.DateFormat import java.text.DateFormat
import java.util.Date import java.util.Date
import javax.inject.Inject
class TaskSummaryViewModel(val taskId: String) : BaseViewModel() { class TaskSummaryViewModel(
@Inject userRepository : UserRepository,
lateinit var taskRespository: TaskRepository userViewModel : MainUserViewModel,
val taskRepository : TaskRepository,
val socialRepository : SocialRepository
) : BaseViewModel(userRepository, userViewModel) {
val taskID : String = ""
@Inject val task = taskRepository.getTask(taskID).asLiveData()
lateinit var socialRepository: SocialRepository
val task = taskRespository.getTask(taskId).asLiveData() fun getMember(userID : String?) : Flow<Member?> {
override fun inject(component: UserComponent) {
component.inject(this)
}
fun getMember(userID: String?): Flow<Member?> {
return socialRepository.getMember(userID) return socialRepository.getMember(userID)
} }
@Suppress("UNCHECKED_CAST")
class Factory(private val taskID: String) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
return TaskSummaryViewModel(taskID) as T
}
}
} }
@AndroidEntryPoint
class TaskSummaryActivity : BaseActivity() { class TaskSummaryActivity : BaseActivity() {
override fun getLayoutResId(): Int? = null override fun getLayoutResId() : Int? = null
private val viewModel: TaskSummaryViewModel by viewModels { private val viewModel : TaskSummaryViewModel by viewModels()
TaskSummaryViewModel.Factory(
intent.extras?.getString(
TaskFormActivity.TASK_ID_KEY
) ?: ""
)
}
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState : Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContent { setContent {
HabiticaTheme { HabiticaTheme {
@ -107,14 +90,10 @@ class TaskSummaryActivity : BaseActivity() {
} }
} }
} }
override fun injectActivity(component: UserComponent?) {
component?.inject(this)
}
} }
@Composable @Composable
fun TaskSummaryView(viewModel: TaskSummaryViewModel) { fun TaskSummaryView(viewModel : TaskSummaryViewModel) {
val taskDescriptionBuilder = TaskDescriptionBuilder(LocalContext.current) val taskDescriptionBuilder = TaskDescriptionBuilder(LocalContext.current)
val task by viewModel.task.observeAsState() val task by viewModel.task.observeAsState()
val titleModifier = Modifier.padding(top = 30.dp) 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 { return buildAnnotatedString {
var isBold = false var isBold = false
for (segment in split("**")) { for (segment in split("**")) {
@ -338,9 +317,3 @@ private fun String.makeBoldComposable(): AnnotatedString {
} }
} }
} }
@Preview
@Composable
private fun TaskSummaryViewPreview() {
TaskSummaryView(TaskSummaryViewModel(""))
}

View file

@ -5,7 +5,6 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import com.habitrpg.android.habitica.HabiticaBaseApplication
import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.databinding.CustomizationGridItemBinding import com.habitrpg.android.habitica.databinding.CustomizationGridItemBinding
import com.habitrpg.android.habitica.databinding.CustomizationSectionFooterBinding 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.inventory.CustomizationSet
import com.habitrpg.android.habitica.models.shops.ShopItem import com.habitrpg.android.habitica.models.shops.ShopItem
import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog 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.dpToPx
import com.habitrpg.common.habitica.extensions.loadImage import com.habitrpg.common.habitica.extensions.loadImage
import com.habitrpg.common.habitica.views.AvatarView import com.habitrpg.common.habitica.views.AvatarView
@ -44,6 +42,7 @@ class CustomizationRecyclerViewAdapter() : androidx.recyclerview.widget.Recycler
private var pinnedItemKeys: List<String> = ArrayList() private var pinnedItemKeys: List<String> = ArrayList()
var onCustomizationSelected: ((Customization) -> Unit)? = null var onCustomizationSelected: ((Customization) -> Unit)? = null
var onShowPurchaseDialog: ((ShopItem) -> Unit)? = null
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): androidx.recyclerview.widget.RecyclerView.ViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): androidx.recyclerview.widget.RecyclerView.ViewHolder {
return when (viewType) { return when (viewType) {
@ -212,9 +211,7 @@ class CustomizationRecyclerViewAdapter() : androidx.recyclerview.widget.Recycler
dialog.show() dialog.show()
} else { } else {
customization?.let { customization?.let {
val dialog = PurchaseDialog(itemView.context, HabiticaBaseApplication.userComponent, ShopItem.fromCustomization(it, userSize, hairColor)) onShowPurchaseDialog?.invoke(ShopItem.fromCustomization(it, userSize, hairColor))
if (it.type == "background") dialog.isPinned = pinnedItemKeys.contains(ShopItem.fromCustomization(it, userSize, hairColor).key)
dialog.show()
} }
} }
return return
@ -293,8 +290,7 @@ class CustomizationRecyclerViewAdapter() : androidx.recyclerview.widget.Recycler
override fun onClick(v: View) { override fun onClick(v: View) {
set?.let { set?.let {
val dialog = PurchaseDialog(itemView.context, HabiticaBaseApplication.userComponent, ShopItem.fromCustomizationSet(it, additionalSetItems, userSize, hairColor)) onShowPurchaseDialog?.invoke(ShopItem.fromCustomizationSet(it, additionalSetItems, userSize, hairColor))
dialog.show()
} }
} }
} }

View file

@ -22,6 +22,7 @@ import com.habitrpg.common.habitica.extensions.fromHtml
class ShopRecyclerAdapter : androidx.recyclerview.widget.RecyclerView.Adapter<androidx.recyclerview.widget.RecyclerView.ViewHolder>() { class ShopRecyclerAdapter : androidx.recyclerview.widget.RecyclerView.Adapter<androidx.recyclerview.widget.RecyclerView.ViewHolder>() {
var onNeedsRefresh: (() -> Unit)? = null var onNeedsRefresh: (() -> Unit)? = null
var onShowPurchaseDialog: ((ShopItem, Boolean) -> Unit)? = null
private val items: MutableList<Any> = ArrayList() private val items: MutableList<Any> = ArrayList()
private var shopIdentifier: String? = null private var shopIdentifier: String? = null
@ -96,6 +97,7 @@ class ShopRecyclerAdapter : androidx.recyclerview.widget.RecyclerView.Adapter<an
val viewHolder = ShopItemViewHolder(view) val viewHolder = ShopItemViewHolder(view)
viewHolder.shopIdentifier = shopIdentifier viewHolder.shopIdentifier = shopIdentifier
viewHolder.onNeedsRefresh = onNeedsRefresh viewHolder.onNeedsRefresh = onNeedsRefresh
viewHolder.onShowPurchaseDialog = onShowPurchaseDialog
viewHolder viewHolder
} }
} }

View file

@ -99,7 +99,6 @@ class GuildListAdapter : BaseRecyclerViewAdapter<Group, RecyclerView.ViewHolder>
val formattedNumber = NumberAbbreviator.abbreviate(itemView.context, guild.memberCount.toDouble(), number) val formattedNumber = NumberAbbreviator.abbreviate(itemView.context, guild.memberCount.toDouble(), number)
binding.guildBadgeView.setImageBitmap( binding.guildBadgeView.setImageBitmap(
HabiticaIconsHelper.imageOfGuildCrest( HabiticaIconsHelper.imageOfGuildCrest(
itemView.context,
false, false,
false, false,
guild.memberCount.toFloat(), guild.memberCount.toFloat(),

View file

@ -6,7 +6,6 @@ import android.view.ViewGroup
import android.widget.Button import android.widget.Button
import android.widget.TextView import android.widget.TextView
import com.habitrpg.android.habitica.R 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.models.tasks.Task
import com.habitrpg.android.habitica.ui.adapter.tasks.BaseTasksRecyclerViewAdapter import com.habitrpg.android.habitica.ui.adapter.tasks.BaseTasksRecyclerViewAdapter
import com.habitrpg.android.habitica.ui.viewHolders.BindableViewHolder import com.habitrpg.android.habitica.ui.viewHolders.BindableViewHolder
@ -33,10 +32,6 @@ class ChallengeTasksRecyclerViewAdapter(
var onAddItem: ((Task) -> Unit)? = null var onAddItem: ((Task) -> Unit)? = null
var onTaskOpen: ((Task) -> Unit)? = null var onTaskOpen: ((Task) -> Unit)? = null
override fun injectThis(component: UserComponent) {
component.inject(this)
}
override fun getItemViewType(position: Int): Int { override fun getItemViewType(position: Int): Int {
val task = this.filteredContent?.get(position) val task = this.filteredContent?.get(position)
@ -86,13 +81,13 @@ class ChallengeTasksRecyclerViewAdapter(
*/ */
fun replaceTask(task: Task): Boolean { fun replaceTask(task: Task): Boolean {
var i = 0 var i = 0
while (i < this.content?.size ?: 0) { while (i < (this.content?.size ?: 0)) {
if (content?.get(i)?.id == task.id) { if (content?.get(i)?.id == task.id) {
break break
} }
++i ++i
} }
if (i < content?.size ?: 0) { if (i < (content?.size ?: 0)) {
content?.set(i, task) content?.set(i, task)
filter() filter()

View file

@ -4,16 +4,11 @@ import android.content.Context
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup 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.models.tasks.Task
import com.habitrpg.android.habitica.ui.adapter.BaseRecyclerViewAdapter import com.habitrpg.android.habitica.ui.adapter.BaseRecyclerViewAdapter
import com.habitrpg.android.habitica.ui.viewHolders.BindableViewHolder import com.habitrpg.android.habitica.ui.viewHolders.BindableViewHolder
import com.habitrpg.android.habitica.ui.viewmodels.TasksViewModel import com.habitrpg.android.habitica.ui.viewmodels.TasksViewModel
import com.habitrpg.common.habitica.helpers.AnalyticsManager
import com.habitrpg.shared.habitica.models.tasks.TaskType import com.habitrpg.shared.habitica.models.tasks.TaskType
import javax.inject.Inject
abstract class BaseTasksRecyclerViewAdapter<VH : BindableViewHolder<Task>>( abstract class BaseTasksRecyclerViewAdapter<VH : BindableViewHolder<Task>>(
var taskType: TaskType, var taskType: TaskType,
@ -22,21 +17,14 @@ abstract class BaseTasksRecyclerViewAdapter<VH : BindableViewHolder<Task>>(
newContext: Context, newContext: Context,
private val userID: String? private val userID: String?
) : BaseRecyclerViewAdapter<Task, VH>() { ) : BaseRecyclerViewAdapter<Task, VH>() {
@Inject
lateinit var analyticsManager: AnalyticsManager
@Inject
lateinit var taskRepository: TaskRepository
protected var content: MutableList<Task>? = null protected var content: MutableList<Task>? = null
protected var filteredContent: MutableList<Task>? = null protected var filteredContent: MutableList<Task>? = null
internal var context: Context = newContext.applicationContext internal var context: Context = newContext.applicationContext
init { init {
this.filteredContent = ArrayList() this.filteredContent = ArrayList()
HabiticaBaseApplication.userComponent?.let { injectThis(it) }
} }
protected abstract fun injectThis(component: UserComponent)
override fun onBindViewHolder(holder: VH, position: Int) { override fun onBindViewHolder(holder: VH, position: Int) {
val item = filteredContent?.get(position) val item = filteredContent?.get(position)
if (item != null) { if (item != null) {

View file

@ -38,6 +38,7 @@ class RewardsRecyclerViewAdapter(
override var brokenTaskEvents: ((Task) -> Unit)? = null override var brokenTaskEvents: ((Task) -> Unit)? = null
override var adventureGuideOpenEvents: ((Boolean) -> Unit)? = null override var adventureGuideOpenEvents: ((Boolean) -> Unit)? = null
var purchaseCardEvents: ((ShopItem) -> Unit)? = null var purchaseCardEvents: ((ShopItem) -> Unit)? = null
var onShowPurchaseDialog: ((ShopItem, Boolean) -> Unit)? = null
override var taskDisplayMode: String = "standard" override var taskDisplayMode: String = "standard"
set(value) { set(value) {
@ -80,6 +81,7 @@ class RewardsRecyclerViewAdapter(
} else { } else {
val viewHolder = ShopItemViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.row_shopitem, parent, false)) val viewHolder = ShopItemViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.row_shopitem, parent, false))
viewHolder.purchaseCardAction = { purchaseCardEvents?.invoke(it) } viewHolder.purchaseCardAction = { purchaseCardEvents?.invoke(it) }
viewHolder.onShowPurchaseDialog = onShowPurchaseDialog
viewHolder viewHolder
} }
} }

View file

@ -12,7 +12,6 @@ import android.widget.Toast
import androidx.core.net.toUri import androidx.core.net.toUri
import com.google.firebase.analytics.FirebaseAnalytics import com.google.firebase.analytics.FirebaseAnalytics
import com.habitrpg.android.habitica.R 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.databinding.FragmentAboutBinding
import com.habitrpg.android.habitica.helpers.AppConfigManager import com.habitrpg.android.habitica.helpers.AppConfigManager
import com.habitrpg.android.habitica.helpers.MainNavigationController import com.habitrpg.android.habitica.helpers.MainNavigationController
@ -21,7 +20,9 @@ import com.habitrpg.common.habitica.extensions.DataBindingUtils
import com.plattysoft.leonids.ParticleSystem import com.plattysoft.leonids.ParticleSystem
import javax.inject.Inject import javax.inject.Inject
import javax.inject.Named import javax.inject.Named
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class AboutFragment : BaseMainFragment<FragmentAboutBinding>() { class AboutFragment : BaseMainFragment<FragmentAboutBinding>() {
@field:[Inject Named(AppModule.NAMED_USER_ID)] @field:[Inject Named(AppModule.NAMED_USER_ID)]
@ -30,9 +31,6 @@ class AboutFragment : BaseMainFragment<FragmentAboutBinding>() {
@Inject @Inject
lateinit var appConfigManager: AppConfigManager lateinit var appConfigManager: AppConfigManager
override fun injectFragment(component: UserComponent) {
component.inject(this)
}
private val privacyPolicyLink = "https://habitica.com/static/privacy" private val privacyPolicyLink = "https://habitica.com/static/privacy"
private val termsLink = "https://habitica.com/static/terms" private val termsLink = "https://habitica.com/static/terms"
@ -85,7 +83,7 @@ class AboutFragment : BaseMainFragment<FragmentAboutBinding>() {
private val versionName: String by lazy { private val versionName: String by lazy {
try { try {
@Suppress("DEPRECATION") @Suppress("DEPRECATION")
activity?.packageManager?.getPackageInfo(activity?.packageName ?: "", 0)?.versionName ?: "" mainActivity?.packageManager?.getPackageInfo(mainActivity?.packageName ?: "", 0)?.versionName ?: ""
} catch (e: PackageManager.NameNotFoundException) { } catch (e: PackageManager.NameNotFoundException) {
"" ""
} }
@ -94,7 +92,7 @@ class AboutFragment : BaseMainFragment<FragmentAboutBinding>() {
private val versionCode: Int by lazy { private val versionCode: Int by lazy {
try { try {
@Suppress("DEPRECATION") @Suppress("DEPRECATION")
activity?.packageManager?.getPackageInfo(activity?.packageName ?: "", 0)?.versionCode ?: 0 mainActivity?.packageManager?.getPackageInfo(mainActivity?.packageName ?: "", 0)?.versionCode ?: 0
} catch (e: PackageManager.NameNotFoundException) { } catch (e: PackageManager.NameNotFoundException) {
0 0
} }
@ -132,8 +130,8 @@ class AboutFragment : BaseMainFragment<FragmentAboutBinding>() {
val context = context ?: return val context = context ?: return
FirebaseAnalytics.getInstance(context).logEvent("found_easter_egg", null) FirebaseAnalytics.getInstance(context).logEvent("found_easter_egg", null)
DataBindingUtils.loadImage(context, "Pet-Sabretooth-Base") { bitmap -> DataBindingUtils.loadImage(context, "Pet-Sabretooth-Base") { bitmap ->
activity?.runOnUiThread { mainActivity?.runOnUiThread {
activity?.let { mainActivity?.let {
ParticleSystem(it, 50, bitmap, 3000) ParticleSystem(it, 50, bitmap, 3000)
.setAcceleration(0.00013f, 90) .setAcceleration(0.00013f, 90)
.setSpeedByComponentsRange(-0.08f, 0.08f, 0.05f, 0.1f) .setSpeedByComponentsRange(-0.08f, 0.08f, 0.05f, 0.1f)
@ -144,8 +142,8 @@ class AboutFragment : BaseMainFragment<FragmentAboutBinding>() {
} }
} }
DataBindingUtils.loadImage(context, "Pet-Sabretooth-Golden") { bitmap -> DataBindingUtils.loadImage(context, "Pet-Sabretooth-Golden") { bitmap ->
activity?.runOnUiThread { mainActivity?.runOnUiThread {
activity?.let { mainActivity?.let {
ParticleSystem(it, 50, bitmap, 3000) ParticleSystem(it, 50, bitmap, 3000)
.setAcceleration(0.00013f, 90) .setAcceleration(0.00013f, 90)
.setSpeedByComponentsRange(-0.08f, 0.08f, 0.05f, 0.1f) .setSpeedByComponentsRange(-0.08f, 0.08f, 0.05f, 0.1f)
@ -156,8 +154,8 @@ class AboutFragment : BaseMainFragment<FragmentAboutBinding>() {
} }
} }
DataBindingUtils.loadImage(context, "Pet-Sabretooth-Red") { bitmap -> DataBindingUtils.loadImage(context, "Pet-Sabretooth-Red") { bitmap ->
activity?.runOnUiThread { mainActivity?.runOnUiThread {
activity?.let { mainActivity?.let {
ParticleSystem(it, 50, bitmap, 3000) ParticleSystem(it, 50, bitmap, 3000)
.setAcceleration(0.00013f, 90) .setAcceleration(0.00013f, 90)
.setSpeedByComponentsRange(-0.08f, 0.08f, 0.05f, 0.1f) .setSpeedByComponentsRange(-0.08f, 0.08f, 0.05f, 0.1f)

View file

@ -13,7 +13,6 @@ import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.GridLayoutManager
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.habitrpg.android.habitica.R 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.InventoryRepository
import com.habitrpg.android.habitica.databinding.FragmentRefreshRecyclerviewBinding import com.habitrpg.android.habitica.databinding.FragmentRefreshRecyclerviewBinding
import com.habitrpg.android.habitica.ui.adapter.AchievementsAdapter 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.flow.map
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import javax.inject.Inject import javax.inject.Inject
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class AchievementsFragment : BaseMainFragment<FragmentRefreshRecyclerviewBinding>(), SwipeRefreshLayout.OnRefreshListener { class AchievementsFragment : BaseMainFragment<FragmentRefreshRecyclerviewBinding>(), SwipeRefreshLayout.OnRefreshListener {
@Inject @Inject
@ -48,9 +49,6 @@ class AchievementsFragment : BaseMainFragment<FragmentRefreshRecyclerviewBinding
adapter.notifyDataSetChanged() adapter.notifyDataSetChanged()
} }
override fun injectFragment(component: UserComponent) {
component.inject(this)
}
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
@ -76,7 +74,7 @@ class AchievementsFragment : BaseMainFragment<FragmentRefreshRecyclerviewBinding
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
val layoutManager = GridLayoutManager(activity, 2) val layoutManager = GridLayoutManager(mainActivity, 2)
binding?.recyclerView?.layoutManager = layoutManager binding?.recyclerView?.layoutManager = layoutManager
binding?.recyclerView?.adapter = adapter binding?.recyclerView?.adapter = adapter
adapter.useGridLayout = useGridLayout adapter.useGridLayout = useGridLayout
@ -164,7 +162,7 @@ class AchievementsFragment : BaseMainFragment<FragmentRefreshRecyclerviewBinding
override fun onOptionsItemSelected(item: MenuItem): Boolean { override fun onOptionsItemSelected(item: MenuItem): Boolean {
if (item.itemId == menuID) { if (item.itemId == menuID) {
useGridLayout = !useGridLayout useGridLayout = !useGridLayout
activity?.invalidateOptionsMenu() mainActivity?.invalidateOptionsMenu()
} }
return super.onOptionsItemSelected(item) return super.onOptionsItemSelected(item)
} }

View file

@ -7,8 +7,6 @@ import android.view.ViewGroup
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.viewbinding.ViewBinding import androidx.viewbinding.ViewBinding
import com.google.android.material.bottomsheet.BottomSheetDialogFragment import com.google.android.material.bottomsheet.BottomSheetDialogFragment
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.data.TutorialRepository
import com.habitrpg.android.habitica.helpers.AmplitudeManager import com.habitrpg.android.habitica.helpers.AmplitudeManager
import com.habitrpg.android.habitica.ui.activities.MainActivity import com.habitrpg.android.habitica.ui.activities.MainActivity
@ -34,13 +32,6 @@ abstract class BaseDialogFragment<VB : ViewBinding> : BottomSheetDialogFragment(
open val displayedClassName: String? open val displayedClassName: String?
get() = this.javaClass.simpleName 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 abstract fun createBinding(inflater: LayoutInflater, container: ViewGroup?): VB
override fun onCreateView( override fun onCreateView(
@ -56,8 +47,6 @@ abstract class BaseDialogFragment<VB : ViewBinding> : BottomSheetDialogFragment(
return binding?.root return binding?.root
} }
abstract fun injectFragment(component: UserComponent)
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
showTutorialIfNeeded() showTutorialIfNeeded()

View file

@ -7,8 +7,6 @@ import android.view.ViewGroup
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.viewbinding.ViewBinding 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.data.TutorialRepository
import com.habitrpg.android.habitica.ui.activities.MainActivity import com.habitrpg.android.habitica.ui.activities.MainActivity
import com.habitrpg.common.habitica.helpers.AnalyticsManager import com.habitrpg.common.habitica.helpers.AnalyticsManager
@ -38,17 +36,6 @@ abstract class BaseFragment<VB : ViewBinding> : Fragment() {
open val displayedClassName: String? open val displayedClassName: String?
get() = this.javaClass.simpleName 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 abstract fun createBinding(inflater: LayoutInflater, container: ViewGroup?): VB
@ -61,8 +48,6 @@ abstract class BaseFragment<VB : ViewBinding> : Fragment() {
return binding?.root return binding?.root
} }
abstract fun injectFragment(component: UserComponent)
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
showTutorialIfNeeded() showTutorialIfNeeded()

View file

@ -35,11 +35,11 @@ abstract class BaseMainFragment<VB : ViewBinding> : BaseFragment<VB>() {
protected var showsBackButton: Boolean = false protected var showsBackButton: Boolean = false
open val activity get() = getActivity() as? MainActivity open val mainActivity get() = getActivity() as? MainActivity
val tabLayout get() = activity?.binding?.content?.detailTabs val tabLayout get() = mainActivity?.binding?.content?.detailTabs
val collapsingToolbar get() = activity?.binding?.content?.toolbar val collapsingToolbar get() = mainActivity?.binding?.content?.toolbar
val toolbarAccessoryContainer get() = activity?.binding?.content?.toolbarAccessoryContainer val toolbarAccessoryContainer get() = mainActivity?.binding?.content?.toolbarAccessoryContainer
val bottomNavigation get() = activity?.binding?.content?.bottomNavigation val bottomNavigation get() = mainActivity?.binding?.content?.bottomNavigation
var usesTabLayout: Boolean = false var usesTabLayout: Boolean = false
var hidesToolbar: Boolean = false var hidesToolbar: Boolean = false
var usesBottomNavigation = false var usesBottomNavigation = false
@ -81,24 +81,24 @@ abstract class BaseMainFragment<VB : ViewBinding> : BaseFragment<VB>() {
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
activity?.showBackButton = showsBackButton mainActivity?.showBackButton = showsBackButton
activity?.supportActionBar?.setDisplayHomeAsUpEnabled(true) mainActivity?.supportActionBar?.setDisplayHomeAsUpEnabled(true)
} }
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
super.onCreateOptionsMenu(menu, inflater) super.onCreateOptionsMenu(menu, inflater)
activity?.toolbar?.let { ToolbarColorHelper.colorizeToolbar(it, activity) } mainActivity?.toolbar?.let { ToolbarColorHelper.colorizeToolbar(it, mainActivity) }
updateToolbarInteractivity() updateToolbarInteractivity()
} }
var isTitleInteractive = false var isTitleInteractive = false
open fun updateToolbarInteractivity() { 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) { if (isTitleInteractive) {
activity?.binding?.content?.toolbarTitle?.setScaledPadding(context, 16, 4, 16, 4) mainActivity?.binding?.content?.toolbarTitle?.setScaledPadding(context, 16, 4, 16, 4)
} else { } else {
activity?.binding?.content?.toolbarTitle?.setPadding(0) mainActivity?.binding?.content?.toolbarTitle?.setPadding(0)
} }
} }
@ -118,11 +118,11 @@ abstract class BaseMainFragment<VB : ViewBinding> : BaseFragment<VB>() {
} }
private fun hideToolbar() { private fun hideToolbar() {
activity?.binding?.content?.headerView?.visibility = View.GONE mainActivity?.binding?.content?.headerView?.visibility = View.GONE
} }
private fun showToolbar() { private fun showToolbar() {
activity?.binding?.content?.headerView?.visibility = View.VISIBLE mainActivity?.binding?.content?.headerView?.visibility = View.VISIBLE
} }
private fun disableToolbarScrolling() { private fun disableToolbarScrolling() {

View file

@ -19,7 +19,6 @@ import androidx.drawerlayout.widget.DrawerLayout
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.SimpleItemAnimator import androidx.recyclerview.widget.SimpleItemAnimator
import com.habitrpg.android.habitica.HabiticaBaseApplication
import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.data.ContentRepository import com.habitrpg.android.habitica.data.ContentRepository
import com.habitrpg.android.habitica.data.InventoryRepository import com.habitrpg.android.habitica.data.InventoryRepository
@ -59,7 +58,9 @@ import kotlin.time.Duration
import kotlin.time.DurationUnit import kotlin.time.DurationUnit
import kotlin.time.ExperimentalTime import kotlin.time.ExperimentalTime
import kotlin.time.toDuration import kotlin.time.toDuration
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class NavigationDrawerFragment : DialogFragment() { class NavigationDrawerFragment : DialogFragment() {
private var binding: DrawerMainBinding? = null private var binding: DrawerMainBinding? = null
@ -110,7 +111,6 @@ class NavigationDrawerFragment : DialogFragment() {
} else { } else {
NavigationDrawerAdapter(0, 0) NavigationDrawerAdapter(0, 0)
} }
HabiticaBaseApplication.userComponent?.inject(this)
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
if (savedInstanceState != null) { if (savedInstanceState != null) {

View file

@ -11,12 +11,13 @@ import android.webkit.WebView
import android.webkit.WebViewClient import android.webkit.WebViewClient
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.habitrpg.android.habitica.R 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.databinding.FragmentNewsBinding
import com.habitrpg.android.habitica.helpers.MainNavigationController import com.habitrpg.android.habitica.helpers.MainNavigationController
import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.common.habitica.helpers.ExceptionHandler
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@AndroidEntryPoint
class NewsFragment : BaseMainFragment<FragmentNewsBinding>() { class NewsFragment : BaseMainFragment<FragmentNewsBinding>() {
override var binding: FragmentNewsBinding? = null override var binding: FragmentNewsBinding? = null
@ -71,9 +72,6 @@ class NewsFragment : BaseMainFragment<FragmentNewsBinding>() {
binding?.newsWebview?.loadUrl("$address/static/new-stuff") binding?.newsWebview?.loadUrl("$address/static/new-stuff")
} }
override fun injectFragment(component: UserComponent) {
component.inject(this)
}
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()

View file

@ -4,11 +4,12 @@ import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.databinding.FragmentPromoInfoBinding import com.habitrpg.android.habitica.databinding.FragmentPromoInfoBinding
import com.habitrpg.android.habitica.helpers.AppConfigManager import com.habitrpg.android.habitica.helpers.AppConfigManager
import javax.inject.Inject import javax.inject.Inject
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class PromoInfoFragment : BaseMainFragment<FragmentPromoInfoBinding>() { class PromoInfoFragment : BaseMainFragment<FragmentPromoInfoBinding>() {
override var binding: FragmentPromoInfoBinding? = null override var binding: FragmentPromoInfoBinding? = null
@ -20,9 +21,6 @@ class PromoInfoFragment : BaseMainFragment<FragmentPromoInfoBinding>() {
@Inject @Inject
lateinit var configManager: AppConfigManager lateinit var configManager: AppConfigManager
override fun injectFragment(component: UserComponent) {
component.inject(this)
}
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
@ -41,6 +39,6 @@ class PromoInfoFragment : BaseMainFragment<FragmentPromoInfoBinding>() {
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
activity?.title = "" mainActivity?.title = ""
} }
} }

View file

@ -11,7 +11,9 @@ import com.habitrpg.android.habitica.databinding.FragmentNewsBinding
import com.habitrpg.android.habitica.modules.AppModule import com.habitrpg.android.habitica.modules.AppModule
import javax.inject.Inject import javax.inject.Inject
import javax.inject.Named import javax.inject.Named
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class PromoWebFragment : BaseMainFragment<FragmentNewsBinding>() { class PromoWebFragment : BaseMainFragment<FragmentNewsBinding>() {
@field:[Inject Named(AppModule.NAMED_USER_ID)] @field:[Inject Named(AppModule.NAMED_USER_ID)]
lateinit var userID: String lateinit var userID: String
@ -47,7 +49,4 @@ class PromoWebFragment : BaseMainFragment<FragmentNewsBinding>() {
} }
} }
override fun injectFragment(component: UserComponent) {
component.inject(this)
}
} }

View file

@ -6,9 +6,7 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.habitrpg.android.habitica.HabiticaBaseApplication
import com.habitrpg.android.habitica.R 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.InventoryRepository
import com.habitrpg.android.habitica.databinding.FragmentStatsBinding import com.habitrpg.android.habitica.databinding.FragmentStatsBinding
import com.habitrpg.android.habitica.extensions.addOkButton import com.habitrpg.android.habitica.extensions.addOkButton
@ -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.extensions.getThemeColor
import com.habitrpg.common.habitica.helpers.launchCatching import com.habitrpg.common.habitica.helpers.launchCatching
import com.habitrpg.shared.habitica.models.tasks.Attribute import com.habitrpg.shared.habitica.models.tasks.Attribute
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.firstOrNull
import javax.inject.Inject import javax.inject.Inject
import kotlin.math.min import kotlin.math.min
@AndroidEntryPoint
class StatsFragment : BaseMainFragment<FragmentStatsBinding>() { class StatsFragment : BaseMainFragment<FragmentStatsBinding>() {
override var binding: FragmentStatsBinding? = null override var binding: FragmentStatsBinding? = null
@ -156,7 +156,7 @@ class StatsFragment : BaseMainFragment<FragmentStatsBinding>() {
private fun showBulkAllocateDialog() { private fun showBulkAllocateDialog() {
context?.let { context -> context?.let { context ->
val dialog = BulkAllocateStatsDialog(context, HabiticaBaseApplication.userComponent) val dialog = BulkAllocateStatsDialog(context, userRepository)
dialog.show() dialog.show()
} }
} }
@ -245,9 +245,6 @@ class StatsFragment : BaseMainFragment<FragmentStatsBinding>() {
binding?.numberOfPointsTextView?.setScaledPadding(context, 18, 4, 18, 4) binding?.numberOfPointsTextView?.setScaledPadding(context, 18, 4, 18, 4)
} }
override fun injectFragment(component: UserComponent) {
component.inject(this)
}
private fun updateStats(user: User) { private fun updateStats(user: User) {
val outfit = user.items?.gear?.equipped val outfit = user.items?.gear?.equipped

View file

@ -20,7 +20,6 @@ import com.google.android.flexbox.FlexDirection.ROW
import com.google.android.flexbox.FlexboxLayoutManager import com.google.android.flexbox.FlexboxLayoutManager
import com.google.android.flexbox.JustifyContent import com.google.android.flexbox.JustifyContent
import com.habitrpg.android.habitica.R 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.CustomizationRepository
import com.habitrpg.android.habitica.data.InventoryRepository import com.habitrpg.android.habitica.data.InventoryRepository
import com.habitrpg.android.habitica.databinding.BottomSheetBackgroundsFilterBinding import com.habitrpg.android.habitica.databinding.BottomSheetBackgroundsFilterBinding
@ -28,6 +27,7 @@ import com.habitrpg.android.habitica.databinding.FragmentRefreshRecyclerviewBind
import com.habitrpg.android.habitica.extensions.setTintWith import com.habitrpg.android.habitica.extensions.setTintWith
import com.habitrpg.android.habitica.models.CustomizationFilter import com.habitrpg.android.habitica.models.CustomizationFilter
import com.habitrpg.android.habitica.models.inventory.Customization import com.habitrpg.android.habitica.models.inventory.Customization
import com.habitrpg.android.habitica.models.shops.ShopItem
import com.habitrpg.android.habitica.models.user.OwnedCustomization import com.habitrpg.android.habitica.models.user.OwnedCustomization
import com.habitrpg.android.habitica.models.user.User import com.habitrpg.android.habitica.models.user.User
import com.habitrpg.android.habitica.ui.adapter.CustomizationRecyclerViewAdapter 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.helpers.SafeDefaultItemAnimator
import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel
import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaBottomSheetDialog 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.dpToPx
import com.habitrpg.common.habitica.extensions.getThemeColor import com.habitrpg.common.habitica.extensions.getThemeColor
import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.common.habitica.helpers.ExceptionHandler
import com.habitrpg.common.habitica.helpers.launchCatching import com.habitrpg.common.habitica.helpers.launchCatching
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.map
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import javax.inject.Inject import javax.inject.Inject
@AndroidEntryPoint
class AvatarCustomizationFragment : class AvatarCustomizationFragment :
BaseMainFragment<FragmentRefreshRecyclerviewBinding>(), BaseMainFragment<FragmentRefreshRecyclerviewBinding>(),
SwipeRefreshLayout.OnRefreshListener { SwipeRefreshLayout.OnRefreshListener {
@ -69,7 +72,7 @@ class AvatarCustomizationFragment :
private var activeCustomization: String? = null private var activeCustomization: String? = null
internal var adapter: CustomizationRecyclerViewAdapter = CustomizationRecyclerViewAdapter() 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 currentFilter = MutableStateFlow(CustomizationFilter(false, true))
private val ownedCustomizations = MutableStateFlow<List<OwnedCustomization>>(emptyList()) private val ownedCustomizations = MutableStateFlow<List<OwnedCustomization>>(emptyList())
@ -96,6 +99,10 @@ class AvatarCustomizationFragment :
} }
} }
} }
adapter.onShowPurchaseDialog = { item ->
val dialog = PurchaseDialog(requireContext(), userRepository, inventoryRepository, item)
dialog.show()
}
lifecycleScope.launchCatching { lifecycleScope.launchCatching {
inventoryRepository.getInAppRewards() inventoryRepository.getInAppRewards()
@ -118,7 +125,7 @@ class AvatarCustomizationFragment :
} }
adapter.customizationType = type adapter.customizationType = type
binding?.refreshLayout?.setOnRefreshListener(this) binding?.refreshLayout?.setOnRefreshListener(this)
layoutManager = FlexboxLayoutManager(activity, ROW) layoutManager = FlexboxLayoutManager(mainActivity, ROW)
layoutManager.justifyContent = JustifyContent.CENTER layoutManager.justifyContent = JustifyContent.CENTER
layoutManager.alignItems = AlignItems.FLEX_START layoutManager.alignItems = AlignItems.FLEX_START
binding?.recyclerView?.layoutManager = layoutManager binding?.recyclerView?.layoutManager = layoutManager
@ -184,9 +191,6 @@ class AvatarCustomizationFragment :
return super.onOptionsItemSelected(item) return super.onOptionsItemSelected(item)
} }
override fun injectFragment(component: UserComponent) {
component.inject(this)
}
private fun loadCustomizations() { private fun loadCustomizations() {
val type = this.type ?: return val type = this.type ?: return

View file

@ -8,7 +8,6 @@ import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.GridLayoutManager
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.habitrpg.android.habitica.R 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.InventoryRepository
import com.habitrpg.android.habitica.databinding.FragmentRefreshRecyclerviewBinding import com.habitrpg.android.habitica.databinding.FragmentRefreshRecyclerviewBinding
import com.habitrpg.android.habitica.models.user.User 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 com.habitrpg.common.habitica.helpers.launchCatching
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import javax.inject.Inject import javax.inject.Inject
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class AvatarEquipmentFragment : class AvatarEquipmentFragment :
BaseMainFragment<FragmentRefreshRecyclerviewBinding>(), BaseMainFragment<FragmentRefreshRecyclerviewBinding>(),
SwipeRefreshLayout.OnRefreshListener { SwipeRefreshLayout.OnRefreshListener {
@ -42,7 +43,7 @@ class AvatarEquipmentFragment :
private var activeEquipment: String? = null private var activeEquipment: String? = null
internal var adapter: CustomizationEquipmentRecyclerViewAdapter = CustomizationEquipmentRecyclerViewAdapter() internal var adapter: CustomizationEquipmentRecyclerViewAdapter = CustomizationEquipmentRecyclerViewAdapter()
internal var layoutManager: GridLayoutManager = GridLayoutManager(activity, 2) internal var layoutManager: GridLayoutManager = GridLayoutManager(mainActivity, 2)
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
@ -77,7 +78,7 @@ class AvatarEquipmentFragment :
} }
binding?.refreshLayout?.setOnRefreshListener(this) binding?.refreshLayout?.setOnRefreshListener(this)
setGridSpanCount(view.width) setGridSpanCount(view.width)
val layoutManager = GridLayoutManager(activity, 4) val layoutManager = GridLayoutManager(mainActivity, 4)
layoutManager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() { layoutManager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
override fun getSpanSize(position: Int): Int { override fun getSpanSize(position: Int): Int {
return if (adapter.getItemViewType(position) == 0) { return if (adapter.getItemViewType(position) == 0) {
@ -97,9 +98,6 @@ class AvatarEquipmentFragment :
userViewModel.user.observe(viewLifecycleOwner) { updateUser(it) } userViewModel.user.observe(viewLifecycleOwner) { updateUser(it) }
} }
override fun injectFragment(component: UserComponent) {
component.inject(this)
}
private fun loadEquipment() { private fun loadEquipment() {
val type = this.type ?: return val type = this.type ?: return

View file

@ -106,9 +106,6 @@ open class AvatarOverviewFragment :
return view return view
} }
override fun injectFragment(component: UserComponent) {
component.inject(this)
}
private fun displayCustomizationFragment(type: String, category: String?) { private fun displayCustomizationFragment(type: String, category: String?) {
MainNavigationController.navigate( MainNavigationController.navigate(

View file

@ -1,7 +1,9 @@
package com.habitrpg.android.habitica.ui.fragments.inventory.customization package com.habitrpg.android.habitica.ui.fragments.inventory.customization
import android.os.Bundle import android.os.Bundle
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class EquipmentOverviewFragment : AvatarOverviewFragment() { class EquipmentOverviewFragment : AvatarOverviewFragment() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
showCustomization = false showCustomization = false

View file

@ -9,7 +9,6 @@ import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.habitrpg.android.habitica.R 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.InventoryRepository
import com.habitrpg.android.habitica.databinding.FragmentRefreshRecyclerviewBinding import com.habitrpg.android.habitica.databinding.FragmentRefreshRecyclerviewBinding
import com.habitrpg.android.habitica.helpers.MainNavigationController 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 com.habitrpg.common.habitica.helpers.launchCatching
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import javax.inject.Inject import javax.inject.Inject
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class EquipmentDetailFragment : class EquipmentDetailFragment :
BaseMainFragment<FragmentRefreshRecyclerviewBinding>(), BaseMainFragment<FragmentRefreshRecyclerviewBinding>(),
SwipeRefreshLayout.OnRefreshListener { SwipeRefreshLayout.OnRefreshListener {
@ -80,7 +81,7 @@ class EquipmentDetailFragment :
this.adapter.type = this.type this.adapter.type = this.type
binding?.recyclerView?.adapter = this.adapter binding?.recyclerView?.adapter = this.adapter
binding?.recyclerView?.layoutManager = LinearLayoutManager(activity) binding?.recyclerView?.layoutManager = LinearLayoutManager(mainActivity)
binding?.recyclerView?.addItemDecoration(DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL)) binding?.recyclerView?.addItemDecoration(DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL))
binding?.recyclerView?.itemAnimator = SafeDefaultItemAnimator() binding?.recyclerView?.itemAnimator = SafeDefaultItemAnimator()
@ -96,9 +97,6 @@ class EquipmentDetailFragment :
super.onDestroy() super.onDestroy()
} }
override fun injectFragment(component: UserComponent) {
component.inject(this)
}
override fun onRefresh() { override fun onRefresh() {
lifecycleScope.launch(ExceptionHandler.coroutine()) { lifecycleScope.launch(ExceptionHandler.coroutine()) {

View file

@ -41,7 +41,9 @@ import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import javax.inject.Inject import javax.inject.Inject
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class ItemDialogFragment : BaseDialogFragment<FragmentItemsDialogBinding>() { class ItemDialogFragment : BaseDialogFragment<FragmentItemsDialogBinding>() {
@Inject @Inject
@ -78,9 +80,6 @@ class ItemDialogFragment : BaseDialogFragment<FragmentItemsDialogBinding>() {
super.onDestroy() super.onDestroy()
} }
override fun injectFragment(component: UserComponent) {
component.inject(this)
}
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,

View file

@ -48,7 +48,9 @@ import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import javax.inject.Inject import javax.inject.Inject
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class ItemRecyclerFragment : BaseFragment<FragmentItemsBinding>(), SwipeRefreshLayout.OnRefreshListener { class ItemRecyclerFragment : BaseFragment<FragmentItemsBinding>(), SwipeRefreshLayout.OnRefreshListener {
@Inject @Inject
@ -81,9 +83,6 @@ class ItemRecyclerFragment : BaseFragment<FragmentItemsBinding>(), SwipeRefreshL
super.onDestroy() super.onDestroy()
} }
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) super.onViewCreated(view, savedInstanceState)

View file

@ -8,10 +8,11 @@ import androidx.viewpager2.adapter.FragmentStateAdapter
import com.google.android.material.tabs.TabLayout import com.google.android.material.tabs.TabLayout
import com.google.android.material.tabs.TabLayoutMediator import com.google.android.material.tabs.TabLayoutMediator
import com.habitrpg.android.habitica.R 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.databinding.FragmentViewpagerBinding
import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class ItemsFragment : BaseMainFragment<FragmentViewpagerBinding>() { class ItemsFragment : BaseMainFragment<FragmentViewpagerBinding>() {
override var binding: FragmentViewpagerBinding? = null override var binding: FragmentViewpagerBinding? = null
@ -48,9 +49,6 @@ class ItemsFragment : BaseMainFragment<FragmentViewpagerBinding>() {
} }
} }
override fun injectFragment(component: UserComponent) {
component.inject(this)
}
private fun setViewPagerAdapter() { private fun setViewPagerAdapter() {
val fragmentManager = childFragmentManager val fragmentManager = childFragmentManager
@ -91,11 +89,11 @@ class ItemsFragment : BaseMainFragment<FragmentViewpagerBinding>() {
private fun getPageTitle(position: Int): String { private fun getPageTitle(position: Int): String {
return when (position) { return when (position) {
0 -> activity?.getString(R.string.eggs) 0 -> mainActivity?.getString(R.string.eggs)
1 -> activity?.getString(R.string.hatching_potions) 1 -> mainActivity?.getString(R.string.hatching_potions)
2 -> activity?.getString(R.string.food) 2 -> mainActivity?.getString(R.string.food)
3 -> activity?.getString(R.string.quests) 3 -> mainActivity?.getString(R.string.quests)
4 -> activity?.getString(R.string.special) 4 -> mainActivity?.getString(R.string.special)
else -> "" else -> ""
} ?: "" } ?: ""
} }

View file

@ -5,7 +5,9 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import com.habitrpg.android.habitica.models.shops.Shop import com.habitrpg.android.habitica.models.shops.Shop
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class MarketFragment : ShopFragment() { class MarketFragment : ShopFragment() {
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,

View file

@ -5,7 +5,9 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import com.habitrpg.android.habitica.models.shops.Shop import com.habitrpg.android.habitica.models.shops.Shop
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class QuestShopFragment : ShopFragment() { class QuestShopFragment : ShopFragment() {
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,

View file

@ -5,7 +5,9 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import com.habitrpg.android.habitica.models.shops.Shop import com.habitrpg.android.habitica.models.shops.Shop
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class SeasonalShopFragment : ShopFragment() { class SeasonalShopFragment : ShopFragment() {
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,

View file

@ -13,7 +13,6 @@ import androidx.core.os.bundleOf
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.GridLayoutManager
import com.habitrpg.android.habitica.R 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.InventoryRepository
import com.habitrpg.android.habitica.data.SocialRepository import com.habitrpg.android.habitica.data.SocialRepository
import com.habitrpg.android.habitica.databinding.FragmentRefreshRecyclerviewBinding 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.viewmodels.MainUserViewModel
import com.habitrpg.android.habitica.ui.views.CurrencyText import com.habitrpg.android.habitica.ui.views.CurrencyText
import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog 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.ExceptionHandler
import com.habitrpg.common.habitica.helpers.RecyclerViewState import com.habitrpg.common.habitica.helpers.RecyclerViewState
import com.habitrpg.common.habitica.helpers.launchCatching import com.habitrpg.common.habitica.helpers.launchCatching
@ -103,6 +103,18 @@ open class ShopFragment : BaseMainFragment<FragmentRefreshRecyclerviewBinding>()
loadMarketGear() 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 adapter?.context = context
binding?.recyclerView?.adapter = adapter binding?.recyclerView?.adapter = adapter
binding?.recyclerView?.itemAnimator = SafeDefaultItemAnimator() binding?.recyclerView?.itemAnimator = SafeDefaultItemAnimator()
@ -291,9 +303,6 @@ open class ShopFragment : BaseMainFragment<FragmentRefreshRecyclerviewBinding>()
} }
} }
override fun injectFragment(component: UserComponent) {
component.inject(this)
}
override fun onSaveInstanceState(outState: Bundle) { override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState) super.onSaveInstanceState(outState)

View file

@ -6,7 +6,9 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import com.habitrpg.android.habitica.models.shops.Shop import com.habitrpg.android.habitica.models.shops.Shop
import com.habitrpg.android.habitica.ui.views.CurrencyText import com.habitrpg.android.habitica.ui.views.CurrencyText
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class TimeTravelersShopFragment : ShopFragment() { class TimeTravelersShopFragment : ShopFragment() {
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,

View file

@ -7,7 +7,6 @@ import android.view.ViewGroup
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.habitrpg.android.habitica.R 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.InventoryRepository
import com.habitrpg.android.habitica.databinding.FragmentRefreshRecyclerviewBinding import com.habitrpg.android.habitica.databinding.FragmentRefreshRecyclerviewBinding
import com.habitrpg.android.habitica.extensions.getTranslatedType import com.habitrpg.android.habitica.extensions.getTranslatedType
@ -25,7 +24,9 @@ import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import javax.inject.Inject import javax.inject.Inject
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class MountDetailRecyclerFragment : class MountDetailRecyclerFragment :
BaseMainFragment<FragmentRefreshRecyclerviewBinding>(), BaseMainFragment<FragmentRefreshRecyclerviewBinding>(),
SwipeRefreshLayout.OnRefreshListener { SwipeRefreshLayout.OnRefreshListener {
@ -61,9 +62,6 @@ class MountDetailRecyclerFragment :
super.onDestroy() super.onDestroy()
} }
override fun injectFragment(component: UserComponent) {
component.inject(this)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
showsBackButton = true showsBackButton = true
@ -79,7 +77,7 @@ class MountDetailRecyclerFragment :
} }
binding?.refreshLayout?.setOnRefreshListener(this) 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() { layoutManager?.spanSizeLookup = object : androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup() {
override fun getSpanSize(position: Int): Int { override fun getSpanSize(position: Int): Int {
return if (adapter?.getItemViewType(position) == 0 || adapter?.getItemViewType(position) == 1) { return if (adapter?.getItemViewType(position) == 0 || adapter?.getItemViewType(position) == 1) {

View file

@ -7,7 +7,6 @@ import android.view.ViewGroup
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.habitrpg.android.habitica.R 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.InventoryRepository
import com.habitrpg.android.habitica.databinding.FragmentRefreshRecyclerviewBinding import com.habitrpg.android.habitica.databinding.FragmentRefreshRecyclerviewBinding
import com.habitrpg.android.habitica.extensions.getTranslatedType import com.habitrpg.android.habitica.extensions.getTranslatedType
@ -31,7 +30,9 @@ import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import javax.inject.Inject import javax.inject.Inject
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class PetDetailRecyclerFragment : class PetDetailRecyclerFragment :
BaseMainFragment<FragmentRefreshRecyclerviewBinding>(), BaseMainFragment<FragmentRefreshRecyclerviewBinding>(),
SwipeRefreshLayout.OnRefreshListener { SwipeRefreshLayout.OnRefreshListener {
@ -77,9 +78,6 @@ class PetDetailRecyclerFragment :
super.onDestroy() super.onDestroy()
} }
override fun injectFragment(component: UserComponent) {
component.inject(this)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
showsBackButton = true showsBackButton = true
@ -143,7 +141,7 @@ class PetDetailRecyclerFragment :
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
activity?.title = animalType mainActivity?.title = animalType
} }
override fun onSaveInstanceState(outState: Bundle) { override fun onSaveInstanceState(outState: Bundle) {
@ -224,7 +222,7 @@ class PetDetailRecyclerFragment :
private fun showFeedingDialog(pet: Pet, food: Food?) { private fun showFeedingDialog(pet: Pet, food: Food?) {
if (food != null) { if (food != null) {
val context = activity ?: context ?: return val context = mainActivity ?: context ?: return
lifecycleScope.launchCatching { lifecycleScope.launchCatching {
feedPetUseCase.callInteractor( feedPetUseCase.callInteractor(
FeedPetUseCase.RequestValues( FeedPetUseCase.RequestValues(

View file

@ -8,11 +8,12 @@ import androidx.fragment.app.viewModels
import androidx.viewpager2.adapter.FragmentStateAdapter import androidx.viewpager2.adapter.FragmentStateAdapter
import com.google.android.material.tabs.TabLayoutMediator import com.google.android.material.tabs.TabLayoutMediator
import com.habitrpg.android.habitica.R 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.databinding.FragmentViewpagerBinding
import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment
import com.habitrpg.android.habitica.ui.viewmodels.StableViewModel import com.habitrpg.android.habitica.ui.viewmodels.StableViewModel
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class StableFragment : BaseMainFragment<FragmentViewpagerBinding>() { class StableFragment : BaseMainFragment<FragmentViewpagerBinding>() {
override var binding: FragmentViewpagerBinding? = null override var binding: FragmentViewpagerBinding? = null
@ -40,9 +41,6 @@ class StableFragment : BaseMainFragment<FragmentViewpagerBinding>() {
setViewPagerAdapter() setViewPagerAdapter()
} }
override fun injectFragment(component: UserComponent) {
component.inject(this)
}
private fun setViewPagerAdapter() { private fun setViewPagerAdapter() {
val fragmentManager = childFragmentManager val fragmentManager = childFragmentManager
@ -80,8 +78,8 @@ class StableFragment : BaseMainFragment<FragmentViewpagerBinding>() {
private fun getPageTitle(position: Int): String { private fun getPageTitle(position: Int): String {
return when (position) { return when (position) {
0 -> activity?.getString(R.string.pets) 0 -> mainActivity?.getString(R.string.pets)
1 -> activity?.getString(R.string.mounts) 1 -> mainActivity?.getString(R.string.mounts)
else -> "" else -> ""
} ?: "" } ?: ""
} }

View file

@ -1,6 +1,5 @@
package com.habitrpg.android.habitica.ui.fragments.inventory.stable package com.habitrpg.android.habitica.ui.fragments.inventory.stable
import android.app.Application
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
@ -9,7 +8,6 @@ import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.habitrpg.android.habitica.R 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.InventoryRepository
import com.habitrpg.android.habitica.data.UserRepository import com.habitrpg.android.habitica.data.UserRepository
import com.habitrpg.android.habitica.databinding.FragmentRefreshRecyclerviewBinding import com.habitrpg.android.habitica.databinding.FragmentRefreshRecyclerviewBinding
@ -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.helpers.SafeDefaultItemAnimator
import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel
import com.habitrpg.android.habitica.ui.viewmodels.StableViewModel 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.EmptyItem
import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.common.habitica.helpers.ExceptionHandler
import com.habitrpg.common.habitica.helpers.launchCatching import com.habitrpg.common.habitica.helpers.launchCatching
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.firstOrNull
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import javax.inject.Inject import javax.inject.Inject
@AndroidEntryPoint
class StableRecyclerFragment : class StableRecyclerFragment :
BaseFragment<FragmentRefreshRecyclerviewBinding>(), BaseFragment<FragmentRefreshRecyclerviewBinding>(),
SwipeRefreshLayout.OnRefreshListener { SwipeRefreshLayout.OnRefreshListener {
private val viewModel: StableViewModel by viewModels(factoryProducer = { private val viewModel: StableViewModel by viewModels()
StableViewModelFactory(context?.applicationContext as? Application, itemType)
})
@Inject @Inject
lateinit var inventoryRepository: InventoryRepository lateinit var inventoryRepository: InventoryRepository
@ -75,9 +72,6 @@ class StableRecyclerFragment :
super.onDestroy() super.onDestroy()
} }
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) super.onViewCreated(view, savedInstanceState)

View file

@ -44,7 +44,9 @@ import com.habitrpg.common.habitica.helpers.launchCatching
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import retrofit2.HttpException import retrofit2.HttpException
import javax.inject.Inject import javax.inject.Inject
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class AccountPreferenceFragment : class AccountPreferenceFragment :
BasePreferencesFragment(), BasePreferencesFragment(),
SharedPreferences.OnSharedPreferenceChangeListener, SharedPreferences.OnSharedPreferenceChangeListener,
@ -53,8 +55,8 @@ class AccountPreferenceFragment :
lateinit var hostConfig: HostConfig lateinit var hostConfig: HostConfig
@Inject @Inject
lateinit var apiClient: ApiClient lateinit var apiClient: ApiClient
@Inject
private lateinit var viewModel: AuthenticationViewModel lateinit var viewModel: AuthenticationViewModel
private lateinit var accountDialog: HabiticaAccountDialog private lateinit var accountDialog: HabiticaAccountDialog
override var user: User? = null override var user: User? = null
@ -64,9 +66,7 @@ class AccountPreferenceFragment :
} }
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
HabiticaBaseApplication.userComponent?.inject(this)
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
viewModel = AuthenticationViewModel()
findPreference<Preference>("confirm_username")?.isVisible = user?.flags?.verifiedUsername == false findPreference<Preference>("confirm_username")?.isVisible = user?.flags?.verifiedUsername == false
} }
@ -277,7 +277,7 @@ class AccountPreferenceFragment :
context?.let { context -> context?.let { context ->
val dialog = HabiticaAlertDialog(context) val dialog = HabiticaAlertDialog(context)
dialog.setTitle(R.string.change_password) 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) KeyboardUtil.dismissKeyboard(activity)
passwordEditText?.showErrorIfNecessary() passwordEditText?.showErrorIfNecessary()
passwordRepeatEditText?.showErrorIfNecessary() passwordRepeatEditText?.showErrorIfNecessary()
@ -293,7 +293,7 @@ class AccountPreferenceFragment :
displayType = HabiticaSnackbar.SnackbarDisplayType.SUCCESS displayType = HabiticaSnackbar.SnackbarDisplayType.SUCCESS
) )
} }
dialog.dismiss() d.dismiss()
} }
dialog.addCancelButton() dialog.addCancelButton()
dialog.setAdditionalContentView(view) dialog.setAdditionalContentView(view)

View file

@ -1,22 +1,18 @@
package com.habitrpg.android.habitica.ui.fragments.preferences package com.habitrpg.android.habitica.ui.fragments.preferences
import android.content.SharedPreferences import android.content.SharedPreferences
import android.os.Bundle
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.preference.CheckBoxPreference import androidx.preference.CheckBoxPreference
import com.habitrpg.android.habitica.HabiticaBaseApplication
import com.habitrpg.android.habitica.models.user.User import com.habitrpg.android.habitica.models.user.User
import com.habitrpg.common.habitica.helpers.launchCatching import com.habitrpg.common.habitica.helpers.launchCatching
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class EmailNotificationsPreferencesFragment : BasePreferencesFragment(), SharedPreferences.OnSharedPreferenceChangeListener { class EmailNotificationsPreferencesFragment : BasePreferencesFragment(), SharedPreferences.OnSharedPreferenceChangeListener {
private var isInitialSet: Boolean = true private var isInitialSet: Boolean = true
private var isSettingUser: Boolean = false private var isSettingUser: Boolean = false
override fun onCreate(savedInstanceState: Bundle?) {
HabiticaBaseApplication.userComponent?.inject(this)
super.onCreate(savedInstanceState)
}
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()

View file

@ -14,7 +14,9 @@ import androidx.fragment.app.DialogFragment
import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.databinding.DialogHabiticaAccountBinding import com.habitrpg.android.habitica.databinding.DialogHabiticaAccountBinding
import com.habitrpg.android.habitica.models.user.User 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) { class HabiticaAccountDialog(private var thisContext: Context) : DialogFragment(R.layout.dialog_habitica_account) {
private var _binding: DialogHabiticaAccountBinding? = null private var _binding: DialogHabiticaAccountBinding? = null
private val binding get() = _binding!! private val binding get() = _binding!!

View file

@ -54,11 +54,13 @@ import com.habitrpg.common.habitica.helpers.AppTestingLevel
import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.common.habitica.helpers.ExceptionHandler
import com.habitrpg.common.habitica.helpers.LanguageHelper import com.habitrpg.common.habitica.helpers.LanguageHelper
import com.habitrpg.common.habitica.helpers.launchCatching import com.habitrpg.common.habitica.helpers.launchCatching
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.firstOrNull
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import java.util.Locale import java.util.Locale
import javax.inject.Inject import javax.inject.Inject
@AndroidEntryPoint
class PreferencesFragment : BasePreferencesFragment(), class PreferencesFragment : BasePreferencesFragment(),
SharedPreferences.OnSharedPreferenceChangeListener { SharedPreferences.OnSharedPreferenceChangeListener {
@ -84,11 +86,6 @@ class PreferencesFragment : BasePreferencesFragment(),
private var serverUrlPreference : ListPreference? = null private var serverUrlPreference : ListPreference? = null
private var taskListPreference : 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?) { override fun onViewCreated(view : View, savedInstanceState : Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
listView.itemAnimator = null listView.itemAnimator = null

View file

@ -1,23 +1,18 @@
package com.habitrpg.android.habitica.ui.fragments.preferences package com.habitrpg.android.habitica.ui.fragments.preferences
import android.content.SharedPreferences import android.content.SharedPreferences
import android.os.Bundle
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.preference.CheckBoxPreference import androidx.preference.CheckBoxPreference
import com.habitrpg.android.habitica.HabiticaBaseApplication
import com.habitrpg.android.habitica.models.user.User import com.habitrpg.android.habitica.models.user.User
import com.habitrpg.common.habitica.helpers.launchCatching import com.habitrpg.common.habitica.helpers.launchCatching
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class PushNotificationsPreferencesFragment : BasePreferencesFragment(), SharedPreferences.OnSharedPreferenceChangeListener { class PushNotificationsPreferencesFragment : BasePreferencesFragment(), SharedPreferences.OnSharedPreferenceChangeListener {
private var isInitialSet: Boolean = true private var isInitialSet: Boolean = true
private var isSettingUser: Boolean = false private var isSettingUser: Boolean = false
override fun onCreate(savedInstanceState: Bundle?) {
HabiticaBaseApplication.userComponent?.inject(this)
super.onCreate(savedInstanceState)
}
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
preferenceScreen.sharedPreferences?.registerOnSharedPreferenceChangeListener(this) preferenceScreen.sharedPreferences?.registerOnSharedPreferenceChangeListener(this)

View file

@ -9,7 +9,9 @@ import androidx.preference.PreferenceDialogFragmentCompat
import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceFragmentCompat
import com.habitrpg.android.habitica.prefs.TimePreference import com.habitrpg.android.habitica.prefs.TimePreference
import java.util.Locale import java.util.Locale
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class TimePreferenceDialogFragment : PreferenceDialogFragmentCompat() { class TimePreferenceDialogFragment : PreferenceDialogFragmentCompat() {
lateinit var picker: TimePicker lateinit var picker: TimePicker

View file

@ -40,7 +40,9 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import javax.inject.Inject import javax.inject.Inject
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class GemsPurchaseFragment : BaseFragment<FragmentGemPurchaseBinding>() { class GemsPurchaseFragment : BaseFragment<FragmentGemPurchaseBinding>() {
override var binding: FragmentGemPurchaseBinding? = null override var binding: FragmentGemPurchaseBinding? = null
@ -56,9 +58,6 @@ class GemsPurchaseFragment : BaseFragment<FragmentGemPurchaseBinding>() {
@Inject @Inject
lateinit var purchaseHandler: PurchaseHandler lateinit var purchaseHandler: PurchaseHandler
override fun injectFragment(component: UserComponent) {
component.inject(this)
}
private var isGemSaleHappening = false private var isGemSaleHappening = false

View file

@ -18,7 +18,9 @@ import com.habitrpg.android.habitica.ui.fragments.BaseFragment
import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog
import com.habitrpg.common.habitica.helpers.launchCatching import com.habitrpg.common.habitica.helpers.launchCatching
import javax.inject.Inject import javax.inject.Inject
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class GiftBalanceGemsFragment : BaseFragment<FragmentGiftGemBalanceBinding>() { class GiftBalanceGemsFragment : BaseFragment<FragmentGiftGemBalanceBinding>() {
@Inject @Inject
@ -60,9 +62,6 @@ class GiftBalanceGemsFragment : BaseFragment<FragmentGiftGemBalanceBinding>() {
binding?.usernameTextview?.text = it.formattedUsername binding?.usernameTextview?.text = it.formattedUsername
} }
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) super.onViewCreated(view, savedInstanceState)

View file

@ -20,7 +20,9 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import javax.inject.Inject import javax.inject.Inject
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class GiftPurchaseGemsFragment : BaseFragment<FragmentGiftGemPurchaseBinding>() { class GiftPurchaseGemsFragment : BaseFragment<FragmentGiftGemPurchaseBinding>() {
@Inject @Inject
@ -46,9 +48,6 @@ class GiftPurchaseGemsFragment : BaseFragment<FragmentGiftGemPurchaseBinding>()
private var purchaseHandler: PurchaseHandler? = null private var purchaseHandler: PurchaseHandler? = null
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) super.onViewCreated(view, savedInstanceState)

View file

@ -43,7 +43,9 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import javax.inject.Inject import javax.inject.Inject
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class SubscriptionFragment : BaseFragment<FragmentSubscriptionBinding>() { class SubscriptionFragment : BaseFragment<FragmentSubscriptionBinding>() {
override var binding: FragmentSubscriptionBinding? = null override var binding: FragmentSubscriptionBinding? = null
@ -149,9 +151,6 @@ class SubscriptionFragment : BaseFragment<FragmentSubscriptionBinding>() {
} }
} }
override fun injectFragment(component: UserComponent) {
component.inject(this)
}
private fun loadInventory() { private fun loadInventory() {
CoroutineScope(Dispatchers.IO).launchCatching { CoroutineScope(Dispatchers.IO).launchCatching {

View file

@ -24,7 +24,9 @@ import com.habitrpg.android.habitica.ui.views.setup.AvatarCategoryView
import com.habitrpg.common.habitica.helpers.launchCatching import com.habitrpg.common.habitica.helpers.launchCatching
import java.util.Random import java.util.Random
import javax.inject.Inject import javax.inject.Inject
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class AvatarSetupFragment : BaseFragment<FragmentSetupAvatarBinding>() { class AvatarSetupFragment : BaseFragment<FragmentSetupAvatarBinding>() {
@Inject @Inject
@ -113,9 +115,6 @@ class AvatarSetupFragment : BaseFragment<FragmentSetupAvatarBinding>() {
} }
} }
override fun injectFragment(component: UserComponent) {
component.inject(this)
}
private fun loadCustomizations() { private fun loadCustomizations() {
val user = this.user ?: return val user = this.user ?: return

View file

@ -8,7 +8,9 @@ import android.view.ViewGroup
import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.databinding.FragmentIntroBinding import com.habitrpg.android.habitica.databinding.FragmentIntroBinding
import com.habitrpg.android.habitica.ui.fragments.BaseFragment import com.habitrpg.android.habitica.ui.fragments.BaseFragment
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class IntroFragment : BaseFragment<FragmentIntroBinding>() { class IntroFragment : BaseFragment<FragmentIntroBinding>() {
override var binding: FragmentIntroBinding? = null override var binding: FragmentIntroBinding? = null
@ -52,9 +54,6 @@ class IntroFragment : BaseFragment<FragmentIntroBinding>() {
} }
} }
override fun injectFragment(component: UserComponent) {
component.inject(this)
}
fun setImage(image: Drawable?) { fun setImage(image: Drawable?) {
this.image = image this.image = image

View file

@ -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.Frequency
import com.habitrpg.shared.habitica.models.tasks.TaskType import com.habitrpg.shared.habitica.models.tasks.TaskType
import java.util.Date import java.util.Date
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class TaskSetupFragment : BaseFragment<FragmentSetupTasksBinding>() { class TaskSetupFragment : BaseFragment<FragmentSetupTasksBinding>() {
var activity: SetupActivity? = null var activity: SetupActivity? = null
@ -73,9 +75,6 @@ class TaskSetupFragment : BaseFragment<FragmentSetupTasksBinding>() {
} }
} }
override fun injectFragment(component: UserComponent) {
component.inject(this)
}
private fun setTasks() { 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)) 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))

View file

@ -25,7 +25,9 @@ import kotlinx.coroutines.flow.firstOrNull
import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.map
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import javax.inject.Inject import javax.inject.Inject
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class WelcomeFragment : BaseFragment<FragmentWelcomeBinding>() { class WelcomeFragment : BaseFragment<FragmentWelcomeBinding>() {
var onNameValid: ((Boolean?) -> Unit)? = null var onNameValid: ((Boolean?) -> Unit)? = null
@ -144,7 +146,4 @@ class WelcomeFragment : BaseFragment<FragmentWelcomeBinding>() {
} }
} }
override fun injectFragment(component: UserComponent) {
component.inject(this)
}
} }

View file

@ -16,7 +16,9 @@ import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel
import com.habitrpg.shared.habitica.models.tasks.TaskType import com.habitrpg.shared.habitica.models.tasks.TaskType
import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.map
import javax.inject.Inject import javax.inject.Inject
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class SkillTasksRecyclerViewFragment : BaseFragment<FragmentRecyclerviewBinding>() { class SkillTasksRecyclerViewFragment : BaseFragment<FragmentRecyclerviewBinding>() {
@Inject @Inject
lateinit var taskRepository: TaskRepository lateinit var taskRepository: TaskRepository
@ -35,9 +37,6 @@ class SkillTasksRecyclerViewFragment : BaseFragment<FragmentRecyclerviewBinding>
var onTaskSelection: ((Task) -> Unit)? = null var onTaskSelection: ((Task) -> Unit)? = null
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) super.onViewCreated(view, savedInstanceState)

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