From e5cc8cf09dffeedeb698bf24973409b2ccab0507 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Thu, 2 Jun 2016 10:58:22 +0200 Subject: [PATCH] begin using dagger --- Habitica/AndroidManifest.xml | 2 +- Habitica/build.gradle | 4 + .../habitrpg/android/habitica/APIHelper.java | 192 ++---------------- .../android/habitica/HabiticaApplication.java | 24 ++- .../habitrpg/android/habitica/HostConfig.java | 13 ++ .../habitica/components/AppComponent.java | 143 +++++++++++++ .../android/habitica/modules/ApiModule.java | 154 ++++++++++++++ .../android/habitica/modules/AppModule.java | 33 +++ .../habitica/ui/activities/AboutActivity.java | 5 + .../habitica/ui/activities/BaseActivity.java | 10 + .../ui/activities/ClassSelectionActivity.java | 9 +- .../ui/activities/GroupFormActivity.java | 7 + .../habitica/ui/activities/IntroActivity.java | 15 +- .../habitica/ui/activities/LoginActivity.java | 38 ++-- .../habitica/ui/activities/MainActivity.java | 26 ++- .../ui/activities/MaintenanceActivity.java | 24 ++- .../ui/activities/PartyInviteActivity.java | 6 + .../habitica/ui/activities/PrefsActivity.java | 6 + .../habitica/ui/activities/SetupActivity.java | 18 +- .../ui/activities/SkillTasksActivity.java | 6 + .../ui/activities/TaskFormActivity.java | 6 + .../habitica/ui/fragments/BaseFragment.java | 8 +- .../ui/fragments/BaseMainFragment.java | 10 +- .../ui/fragments/GemsPurchaseFragment.java | 6 + .../habitica/ui/fragments/NewsFragment.java | 6 + .../ui/fragments/faq/FAQDetailFragment.java | 5 + .../ui/fragments/faq/FAQOverviewFragment.java | 8 +- .../AvatarCustomizationFragment.java | 6 + .../customization/AvatarOverviewFragment.java | 6 + .../equipment/EquipmentDetailFragment.java | 6 + .../equipment/EquipmentOverviewFragment.java | 6 + .../inventory/items/ItemRecyclerFragment.java | 6 + .../inventory/items/ItemsFragment.java | 6 + .../stable/MountDetailRecyclerFragment.java | 6 + .../stable/PetDetailRecyclerFragment.java | 6 + .../inventory/stable/StableFragment.java | 6 + .../stable/StableRecyclerFragment.java | 6 + .../fragments/setup/AvatarSetupFragment.java | 6 + .../ui/fragments/setup/IntroFragment.java | 6 + .../ui/fragments/setup/TaskSetupFragment.java | 6 + .../SkillTasksRecyclerViewFragment.java | 11 +- .../ui/fragments/skills/SkillsFragment.java | 6 + .../ui/fragments/social/ChatListFragment.java | 16 +- .../social/GroupInformationFragment.java | 6 + .../ui/fragments/social/GuildFragment.java | 6 + .../social/GuildsOverviewFragment.java | 6 + .../social/PublicGuildsFragment.java | 6 + .../ui/fragments/social/TavernFragment.java | 6 + .../fragments/social/party/PartyFragment.java | 6 + .../social/party/PartyInviteFragment.java | 6 + .../social/party/PartyMemberListFragment.java | 6 + .../tasks/TaskRecyclerViewFragment.java | 6 + .../ui/fragments/tasks/TasksFragment.java | 7 + .../habitica/widget/UpdateWidgetService.java | 22 +- .../habitrpgwrapper/lib/api/ApiService.java | 7 + .../lib/api/InAppPurchasesApiService.java | 18 -- .../lib/utils/BooleanAsIntAdapter.java | 38 ++++ 57 files changed, 785 insertions(+), 256 deletions(-) create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/modules/ApiModule.java create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/modules/AppModule.java delete mode 100644 Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/InAppPurchasesApiService.java create mode 100644 Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/BooleanAsIntAdapter.java diff --git a/Habitica/AndroidManifest.xml b/Habitica/AndroidManifest.xml index c42caef89..734f1b000 100644 --- a/Habitica/AndroidManifest.xml +++ b/Habitica/AndroidManifest.xml @@ -2,7 +2,7 @@ diff --git a/Habitica/build.gradle b/Habitica/build.gradle index 5a50b6d4d..079b2a47e 100644 --- a/Habitica/build.gradle +++ b/Habitica/build.gradle @@ -63,6 +63,10 @@ dependencies { compile 'com.jakewharton:butterknife:8.0.1' apt 'com.jakewharton:butterknife-compiler:8.0.1' + //Dependency Injection + compile 'com.google.dagger:dagger:2.2' + apt 'com.google.dagger:dagger-compiler:2.2' + provided 'org.glassfish:javax.annotation:10.0-b28' //App Compatibility and Material Design compile('com.mikepenz:materialdrawer:5.2.6@aar') { transitive = true diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/APIHelper.java b/Habitica/src/main/java/com/habitrpg/android/habitica/APIHelper.java index d90eb877f..a8e53a87e 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/APIHelper.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/APIHelper.java @@ -1,86 +1,29 @@ package com.habitrpg.android.habitica; -import com.google.gson.ExclusionStrategy; -import com.google.gson.FieldAttributes; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.TypeAdapter; -import com.google.gson.reflect.TypeToken; -import com.google.gson.stream.JsonReader; -import com.google.gson.stream.JsonToken; -import com.google.gson.stream.JsonWriter; - import com.amplitude.api.Amplitude; import com.crashlytics.android.Crashlytics; -import com.habitrpg.android.habitica.database.CheckListItemExcludeStrategy; import com.magicmicky.habitrpgwrapper.lib.api.ApiService; -import com.magicmicky.habitrpgwrapper.lib.api.InAppPurchasesApiService; -import com.magicmicky.habitrpgwrapper.lib.api.MaintenanceApiService; import com.magicmicky.habitrpgwrapper.lib.api.Server; -import com.magicmicky.habitrpgwrapper.lib.models.ChatMessage; -import com.magicmicky.habitrpgwrapper.lib.models.ContentResult; -import com.magicmicky.habitrpgwrapper.lib.models.Customization; -import com.magicmicky.habitrpgwrapper.lib.models.FAQArticle; -import com.magicmicky.habitrpgwrapper.lib.models.Group; import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; import com.magicmicky.habitrpgwrapper.lib.models.PurchaseValidationRequest; import com.magicmicky.habitrpgwrapper.lib.models.PurchaseValidationResult; -import com.magicmicky.habitrpgwrapper.lib.models.Purchases; -import com.magicmicky.habitrpgwrapper.lib.models.Skill; -import com.magicmicky.habitrpgwrapper.lib.models.TutorialStep; import com.magicmicky.habitrpgwrapper.lib.models.UserAuth; import com.magicmicky.habitrpgwrapper.lib.models.UserAuthResponse; import com.magicmicky.habitrpgwrapper.lib.models.UserAuthSocial; import com.magicmicky.habitrpgwrapper.lib.models.UserAuthSocialTokens; -import com.magicmicky.habitrpgwrapper.lib.models.inventory.Egg; -import com.magicmicky.habitrpgwrapper.lib.models.inventory.Food; -import com.magicmicky.habitrpgwrapper.lib.models.inventory.HatchingPotion; -import com.magicmicky.habitrpgwrapper.lib.models.inventory.Mount; -import com.magicmicky.habitrpgwrapper.lib.models.inventory.Pet; -import com.magicmicky.habitrpgwrapper.lib.models.inventory.QuestContent; -import com.magicmicky.habitrpgwrapper.lib.models.responses.FeedResponse; -import com.magicmicky.habitrpgwrapper.lib.models.tasks.ChecklistItem; -import com.magicmicky.habitrpgwrapper.lib.models.tasks.ItemData; import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; import com.magicmicky.habitrpgwrapper.lib.models.tasks.TaskList; -import com.magicmicky.habitrpgwrapper.lib.models.tasks.TaskTag; -import com.magicmicky.habitrpgwrapper.lib.utils.ChatMessageDeserializer; -import com.magicmicky.habitrpgwrapper.lib.utils.ChecklistItemSerializer; -import com.magicmicky.habitrpgwrapper.lib.utils.ContentDeserializer; -import com.magicmicky.habitrpgwrapper.lib.utils.CustomizationDeserializer; -import com.magicmicky.habitrpgwrapper.lib.utils.DateDeserializer; -import com.magicmicky.habitrpgwrapper.lib.utils.EggListDeserializer; -import com.magicmicky.habitrpgwrapper.lib.utils.FAQArticleListDeserilializer; -import com.magicmicky.habitrpgwrapper.lib.utils.FeedResponseDeserializer; -import com.magicmicky.habitrpgwrapper.lib.utils.FoodListDeserializer; -import com.magicmicky.habitrpgwrapper.lib.utils.GroupSerialization; -import com.magicmicky.habitrpgwrapper.lib.utils.HatchingPotionListDeserializer; -import com.magicmicky.habitrpgwrapper.lib.utils.ItemDataListDeserializer; -import com.magicmicky.habitrpgwrapper.lib.utils.MountListDeserializer; -import com.magicmicky.habitrpgwrapper.lib.utils.PetListDeserializer; -import com.magicmicky.habitrpgwrapper.lib.utils.PurchasedDeserializer; -import com.magicmicky.habitrpgwrapper.lib.utils.QuestListDeserializer; -import com.magicmicky.habitrpgwrapper.lib.utils.SkillDeserializer; -import com.magicmicky.habitrpgwrapper.lib.utils.TaskListDeserializer; -import com.magicmicky.habitrpgwrapper.lib.utils.TaskSerializer; -import com.magicmicky.habitrpgwrapper.lib.utils.TaskTagDeserializer; -import com.magicmicky.habitrpgwrapper.lib.utils.TutorialStepListDeserializer; -import com.raizlabs.android.dbflow.structure.ModelAdapter; import org.json.JSONException; import org.json.JSONObject; import android.app.Activity; import android.support.v7.app.AlertDialog; -import android.util.Log; import java.io.IOException; import java.lang.annotation.Annotation; -import java.lang.reflect.Type; import java.net.ConnectException; import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -107,11 +50,9 @@ public class APIHelper implements Action1 { // I think we don't need the APIHelper anymore we could just use ApiService public final ApiService apiService; - private final InAppPurchasesApiService inAppPurchasesService; - public final MaintenanceApiService maintenanceService; private final GsonConverterFactory gsonConverter; + private final HostConfig hostConfig; private final Retrofit retrofitAdapter; - private HostConfig cfg; final Observable.Transformer apiCallTransformer = observable -> ((Observable)observable).subscribeOn(Schedulers.io()) @@ -122,67 +63,12 @@ public class APIHelper implements Action1 { //private OnHabitsAPIResult mResultListener; //private HostConfig mConfig; - public APIHelper(final HostConfig cfg) { - this.cfg = cfg; - Crashlytics.getInstance().core.setUserIdentifier(cfg.getUser()); - Crashlytics.getInstance().core.setUserName(cfg.getUser()); - Amplitude.getInstance().setUserId(cfg.getUser()); - - Type taskTagClassListType = new TypeToken>() { - }.getType(); - - - Type skillListType = new TypeToken>() {}.getType(); - Type customizationListType = new TypeToken>() {}.getType(); - Type tutorialStepListType = new TypeToken>() {}.getType(); - Type faqArticleListType = new TypeToken>() {}.getType(); - Type itemDataListType = new TypeToken>() {}.getType(); - Type eggListType = new TypeToken>() {}.getType(); - Type foodListType = new TypeToken>() {}.getType(); - Type hatchingPotionListType = new TypeToken>() {}.getType(); - Type questContentListType = new TypeToken>() {}.getType(); - Type petListType = new TypeToken>() {}.getType(); - Type mountListType = new TypeToken>() {}.getType(); - - //Exclusion strategy needed for DBFlow https://github.com/Raizlabs/DBFlow/issues/121 - Gson gson = new GsonBuilder() - .setExclusionStrategies(new CheckListItemExcludeStrategy()) - .setExclusionStrategies(new ExclusionStrategy() { - @Override - public boolean shouldSkipField(FieldAttributes f) { - return f.getDeclaredClass().equals(ModelAdapter.class); - } - - @Override - public boolean shouldSkipClass(Class clazz) { - return false; - } - }) - .registerTypeAdapter(taskTagClassListType, new TaskTagDeserializer()) - .registerTypeAdapter(Boolean.class, booleanAsIntAdapter) - .registerTypeAdapter(boolean.class, booleanAsIntAdapter) - .registerTypeAdapter(skillListType, new SkillDeserializer()) - .registerTypeAdapter(ChecklistItem.class, new ChecklistItemSerializer()) - .registerTypeAdapter(TaskList.class, new TaskListDeserializer()) - .registerTypeAdapter(Purchases.class, new PurchasedDeserializer()) - .registerTypeAdapter(customizationListType, new CustomizationDeserializer()) - .registerTypeAdapter(tutorialStepListType, new TutorialStepListDeserializer()) - .registerTypeAdapter(faqArticleListType, new FAQArticleListDeserilializer()) - .registerTypeAdapter(Group.class, new GroupSerialization()) - .registerTypeAdapter(Date.class, new DateDeserializer()) - .registerTypeAdapter(itemDataListType, new ItemDataListDeserializer()) - .registerTypeAdapter(eggListType, new EggListDeserializer()) - .registerTypeAdapter(foodListType, new FoodListDeserializer()) - .registerTypeAdapter(hatchingPotionListType, new HatchingPotionListDeserializer()) - .registerTypeAdapter(questContentListType, new QuestListDeserializer()) - .registerTypeAdapter(petListType, new PetListDeserializer()) - .registerTypeAdapter(mountListType, new MountListDeserializer()) - .registerTypeAdapter(ChatMessage.class, new ChatMessageDeserializer()) - .registerTypeAdapter(Task.class, new TaskSerializer()) - .registerTypeAdapter(ContentResult.class, new ContentDeserializer()) - .registerTypeAdapter(FeedResponse.class, new FeedResponseDeserializer()) - .setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'") - .create(); + public APIHelper(GsonConverterFactory gsonConverter, HostConfig hostConfig) { + this.gsonConverter = gsonConverter; + this.hostConfig = hostConfig; + Crashlytics.getInstance().core.setUserIdentifier(this.hostConfig.getUser()); + Crashlytics.getInstance().core.setUserName(this.hostConfig.getUser()); + Amplitude.getInstance().setUserId(this.hostConfig.getUser()); Interceptor remove_data_interceptor = chain -> { Response response = chain.proceed(chain.request()); @@ -218,10 +104,10 @@ public class APIHelper implements Action1 { .addInterceptor(logging) .addNetworkInterceptor(chain -> { Request original = chain.request(); - if (cfg.getUser() != null) { + if (this.hostConfig.getUser() != null) { Request request = original.newBuilder() - .header("x-api-key", cfg.getApi()) - .header("x-api-user", cfg.getUser()) + .header("x-api-key", this.hostConfig.getApi()) + .header("x-api-user", this.hostConfig.getUser()) .header("x-client", "habitica-android") .method(original.method(), original.body()) .build(); @@ -232,10 +118,7 @@ public class APIHelper implements Action1 { }) .build(); - - gsonConverter = GsonConverterFactory.create(gson); - - Server server = new Server(cfg.getAddress()); + Server server = new Server(this.hostConfig.getAddress()); retrofitAdapter = new Retrofit.Builder() .client(client) .baseUrl(server.toString()) @@ -243,51 +126,8 @@ public class APIHelper implements Action1 { .addConverterFactory(gsonConverter) .build(); this.apiService = retrofitAdapter.create(ApiService.class); - - server = new Server(cfg.getAddress(), false); - Retrofit adapter = new Retrofit.Builder() - .baseUrl(server.toString()) - .addConverterFactory(gsonConverter) - .build(); - this.inAppPurchasesService = adapter.create(InAppPurchasesApiService.class); - - adapter = new Retrofit.Builder() - .baseUrl("https://habitica-assets.s3.amazonaws.com/mobileApp/endpoint/") - .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) - .addConverterFactory(gsonConverter) - .build(); - this.maintenanceService = adapter.create(MaintenanceApiService.class); } - private static final TypeAdapter booleanAsIntAdapter = new TypeAdapter() { - @Override - public void write(JsonWriter out, Boolean value) throws IOException { - if (value == null) { - out.nullValue(); - } else { - out.value(value); - } - } - - @Override - public Boolean read(JsonReader in) throws IOException { - JsonToken peek = in.peek(); - switch (peek) { - case BOOLEAN: - return in.nextBoolean(); - case NULL: - in.nextNull(); - return null; - case NUMBER: - return in.nextInt() != 0; - case STRING: - return Boolean.parseBoolean(in.nextString()); - default: - throw new IllegalStateException("Expected BOOLEAN or NUMBER but was " + peek); - } - } - }; - public Observable registerUser(String username, String email, String password, String confirmPassword) { UserAuth auth = new UserAuth(); auth.setUsername(username); @@ -422,7 +262,7 @@ public class APIHelper implements Action1 { } public PurchaseValidationResult validatePurchase(PurchaseValidationRequest request) throws IOException { - Call response = inAppPurchasesService.validatePurchase(cfg.getUser(), cfg.getApi(), request); + Call response = apiService.validatePurchase(request); return response.execute().body(); } @@ -430,4 +270,12 @@ public class APIHelper implements Action1 { public Observable.Transformer configureApiCallObserver() { return (Observable.Transformer) apiCallTransformer; } + + public void updateAuthenticationCredentials(String userID, String apiToken) { + this.hostConfig.setUser(userID); + this.hostConfig.setApi(apiToken); + Crashlytics.getInstance().core.setUserIdentifier(this.hostConfig.getUser()); + Crashlytics.getInstance().core.setUserName(this.hostConfig.getUser()); + Amplitude.getInstance().setUserId(this.hostConfig.getUser()); + } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaApplication.java b/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaApplication.java index 861d80d01..713d8ecfa 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaApplication.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/HabiticaApplication.java @@ -4,7 +4,11 @@ import com.amplitude.api.Amplitude; import com.crashlytics.android.Crashlytics; import com.crashlytics.android.core.CrashlyticsCore; import com.facebook.FacebookSdk; +import com.habitrpg.android.habitica.components.AppComponent; import com.facebook.drawee.backends.pipeline.Fresco; +import com.habitrpg.android.habitica.components.DaggerAppComponent; +import com.habitrpg.android.habitica.modules.ApiModule; +import com.habitrpg.android.habitica.modules.AppModule; import com.habitrpg.android.habitica.ui.activities.IntroActivity; import com.habitrpg.android.habitica.ui.activities.LoginActivity; import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; @@ -36,6 +40,9 @@ import java.io.File; import java.lang.reflect.Field; import java.util.Arrays; +import javax.inject.Inject; + +import dagger.Lazy; import io.fabric.sdk.android.Fabric; public class HabiticaApplication extends MultiDexApplication { @@ -44,6 +51,10 @@ public class HabiticaApplication extends MultiDexApplication { public static HabitRPGUser User; public static APIHelper ApiHelper; public static Activity currentActivity = null; + private AppComponent component; + + @Inject + Lazy lazyApiHelper; public static HabiticaApplication getInstance(Context context) { return (HabiticaApplication) context.getApplicationContext(); @@ -52,6 +63,7 @@ public class HabiticaApplication extends MultiDexApplication { @Override public void onCreate() { super.onCreate(); + setupDagger(); setupLeakCanary(); setupFlowManager(); setupFacebookSdk(); @@ -59,10 +71,15 @@ public class HabiticaApplication extends MultiDexApplication { createBillingAndCheckout(); registerActivityLifecycleCallbacks(); Amplitude.getInstance().initialize(this, getString(R.string.amplitude_app_id)).enableForegroundTracking(this); - Fresco.initialize(this); } + private void setupDagger() { + component = DaggerAppComponent.builder() + .appModule(new AppModule(this)) + .build(); + } + private void setupLeakCanary() { // LeakCanary 1.3.1 has problems on Marshmallow; can remove check once updated with fixes if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { @@ -217,6 +234,7 @@ public class HabiticaApplication extends MultiDexApplication { editor.putBoolean("use_reminder", use_reminder); editor.putString("reminder_time", reminder_time); editor.apply(); + getInstance(context).lazyApiHelper.get().updateAuthenticationCredentials(null, null); startActivity(LoginActivity.class, context); } @@ -283,4 +301,8 @@ public class HabiticaApplication extends MultiDexApplication { } // endregion + + public AppComponent getComponent() { + return component; + } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/HostConfig.java b/Habitica/src/main/java/com/habitrpg/android/habitica/HostConfig.java index 8a03462df..77a27518f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/HostConfig.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/HostConfig.java @@ -1,5 +1,9 @@ package com.habitrpg.android.habitica; +import android.content.Context; +import android.content.SharedPreferences; +import android.preference.PreferenceManager; + /** * The configuration of the host
* Currently, the Port isn't used at all. @@ -10,6 +14,15 @@ public class HostConfig { private String port; private String api; private String user; + + public HostConfig(SharedPreferences sharedPreferences, Context context) { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + this.port = BuildConfig.PORT; + this.address = BuildConfig.DEBUG ? BuildConfig.BASE_URL : context.getString(R.string.base_url); + this.api = prefs.getString(context.getString(R.string.SP_APIToken), null); + this.user = prefs.getString(context.getString(R.string.SP_userID), null); + } + /** * Create a new HostConfig * @param address the address of the server diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java b/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java new file mode 100644 index 000000000..0e352d645 --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java @@ -0,0 +1,143 @@ +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.ui.activities.AboutActivity; +import com.habitrpg.android.habitica.ui.activities.BaseActivity; +import com.habitrpg.android.habitica.ui.activities.ClassSelectionActivity; +import com.habitrpg.android.habitica.ui.activities.GroupFormActivity; +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.PartyInviteActivity; +import com.habitrpg.android.habitica.ui.activities.PrefsActivity; +import com.habitrpg.android.habitica.ui.activities.SetupActivity; +import com.habitrpg.android.habitica.ui.activities.SkillTasksActivity; +import com.habitrpg.android.habitica.ui.activities.TaskFormActivity; +import com.habitrpg.android.habitica.ui.fragments.BaseFragment; +import com.habitrpg.android.habitica.ui.fragments.GemsPurchaseFragment; +import com.habitrpg.android.habitica.ui.fragments.NewsFragment; +import com.habitrpg.android.habitica.ui.fragments.faq.FAQDetailFragment; +import com.habitrpg.android.habitica.ui.fragments.faq.FAQOverviewFragment; +import com.habitrpg.android.habitica.ui.fragments.inventory.customization.AvatarCustomizationFragment; +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.equipment.EquipmentOverviewFragment; +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.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.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.skills.SkillTasksRecyclerViewFragment; +import com.habitrpg.android.habitica.ui.fragments.skills.SkillsFragment; +import com.habitrpg.android.habitica.ui.fragments.social.ChatListFragment; +import com.habitrpg.android.habitica.ui.fragments.social.GroupInformationFragment; +import com.habitrpg.android.habitica.ui.fragments.social.GuildFragment; +import com.habitrpg.android.habitica.ui.fragments.social.GuildsOverviewFragment; +import com.habitrpg.android.habitica.ui.fragments.social.PublicGuildsFragment; +import com.habitrpg.android.habitica.ui.fragments.social.TavernFragment; +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.PartyMemberListFragment; +import com.habitrpg.android.habitica.ui.fragments.tasks.TaskRecyclerViewFragment; +import com.habitrpg.android.habitica.ui.fragments.tasks.TasksFragment; +import com.habitrpg.android.habitica.widget.UpdateWidgetService; + +import javax.inject.Singleton; + +import dagger.Component; + +@Singleton +@Component(modules = {AppModule.class, ApiModule.class}) +public interface AppComponent { + void inject(UpdateWidgetService target); + + void inject(ClassSelectionActivity classSelectionActivity); + + void inject(AboutActivity aboutActivity); + + void inject(GroupFormActivity groupFormActivity); + + void inject(IntroActivity introActivity); + + void inject(LoginActivity loginActivity); + + void inject(MainActivity mainActivity); + + void inject(MaintenanceActivity maintenanceActivity); + + void inject(PartyInviteActivity partyInviteActivity); + + void inject(PrefsActivity prefsActivity); + + void inject(SetupActivity setupActivity); + + void inject(SkillTasksActivity skillTasksActivity); + + void inject(TaskFormActivity taskFormActivity); + + void inject(TasksFragment tasksFragment); + + void inject(FAQDetailFragment faqDetailFragment); + + void inject(FAQOverviewFragment faqOverviewFragment); + + void inject(AvatarCustomizationFragment avatarCustomizationFragment); + + void inject(AvatarOverviewFragment avatarOverviewFragment); + + void inject(EquipmentDetailFragment equipmentDetailFragment); + + void inject(EquipmentOverviewFragment equipmentOverviewFragment); + + 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(PartyMemberListFragment partyMemberListFragment); + + void inject(ChatListFragment chatListFragment); + + void inject(GroupInformationFragment groupInformationFragment); + + void inject(GuildFragment guildFragment); + + void inject(GuildsOverviewFragment guildsOverviewFragment); + + void inject(PublicGuildsFragment publicGuildsFragment); + + void inject(TavernFragment tavernFragment); + + void inject(TaskRecyclerViewFragment taskRecyclerViewFragment); + + void inject(GemsPurchaseFragment gemsPurchaseFragment); + + void inject(NewsFragment newsFragment); +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/modules/ApiModule.java b/Habitica/src/main/java/com/habitrpg/android/habitica/modules/ApiModule.java new file mode 100644 index 000000000..618c639ad --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/modules/ApiModule.java @@ -0,0 +1,154 @@ +package com.habitrpg.android.habitica.modules; + +import com.google.gson.ExclusionStrategy; +import com.google.gson.FieldAttributes; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.reflect.TypeToken; + +import com.habitrpg.android.habitica.APIHelper; +import com.habitrpg.android.habitica.HostConfig; +import com.habitrpg.android.habitica.database.CheckListItemExcludeStrategy; +import com.magicmicky.habitrpgwrapper.lib.api.MaintenanceApiService; +import com.magicmicky.habitrpgwrapper.lib.models.ChatMessage; +import com.magicmicky.habitrpgwrapper.lib.models.ContentResult; +import com.magicmicky.habitrpgwrapper.lib.models.Customization; +import com.magicmicky.habitrpgwrapper.lib.models.FAQArticle; +import com.magicmicky.habitrpgwrapper.lib.models.Group; +import com.magicmicky.habitrpgwrapper.lib.models.Purchases; +import com.magicmicky.habitrpgwrapper.lib.models.Skill; +import com.magicmicky.habitrpgwrapper.lib.models.TutorialStep; +import com.magicmicky.habitrpgwrapper.lib.models.inventory.Egg; +import com.magicmicky.habitrpgwrapper.lib.models.inventory.Food; +import com.magicmicky.habitrpgwrapper.lib.models.inventory.HatchingPotion; +import com.magicmicky.habitrpgwrapper.lib.models.inventory.Mount; +import com.magicmicky.habitrpgwrapper.lib.models.inventory.Pet; +import com.magicmicky.habitrpgwrapper.lib.models.inventory.QuestContent; +import com.magicmicky.habitrpgwrapper.lib.models.responses.FeedResponse; +import com.magicmicky.habitrpgwrapper.lib.models.tasks.ChecklistItem; +import com.magicmicky.habitrpgwrapper.lib.models.tasks.ItemData; +import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; +import com.magicmicky.habitrpgwrapper.lib.models.tasks.TaskList; +import com.magicmicky.habitrpgwrapper.lib.models.tasks.TaskTag; +import com.magicmicky.habitrpgwrapper.lib.utils.BooleanAsIntAdapter; +import com.magicmicky.habitrpgwrapper.lib.utils.ChatMessageDeserializer; +import com.magicmicky.habitrpgwrapper.lib.utils.ChecklistItemSerializer; +import com.magicmicky.habitrpgwrapper.lib.utils.ContentDeserializer; +import com.magicmicky.habitrpgwrapper.lib.utils.CustomizationDeserializer; +import com.magicmicky.habitrpgwrapper.lib.utils.DateDeserializer; +import com.magicmicky.habitrpgwrapper.lib.utils.EggListDeserializer; +import com.magicmicky.habitrpgwrapper.lib.utils.FAQArticleListDeserilializer; +import com.magicmicky.habitrpgwrapper.lib.utils.FeedResponseDeserializer; +import com.magicmicky.habitrpgwrapper.lib.utils.FoodListDeserializer; +import com.magicmicky.habitrpgwrapper.lib.utils.GroupSerialization; +import com.magicmicky.habitrpgwrapper.lib.utils.HatchingPotionListDeserializer; +import com.magicmicky.habitrpgwrapper.lib.utils.ItemDataListDeserializer; +import com.magicmicky.habitrpgwrapper.lib.utils.MountListDeserializer; +import com.magicmicky.habitrpgwrapper.lib.utils.PetListDeserializer; +import com.magicmicky.habitrpgwrapper.lib.utils.PurchasedDeserializer; +import com.magicmicky.habitrpgwrapper.lib.utils.QuestListDeserializer; +import com.magicmicky.habitrpgwrapper.lib.utils.SkillDeserializer; +import com.magicmicky.habitrpgwrapper.lib.utils.TaskListDeserializer; +import com.magicmicky.habitrpgwrapper.lib.utils.TaskSerializer; +import com.magicmicky.habitrpgwrapper.lib.utils.TaskTagDeserializer; +import com.magicmicky.habitrpgwrapper.lib.utils.TutorialStepListDeserializer; +import com.raizlabs.android.dbflow.structure.ModelAdapter; + +import android.content.Context; +import android.content.SharedPreferences; + +import java.lang.reflect.Type; +import java.util.Date; +import java.util.HashMap; +import java.util.List; + +import javax.inject.Singleton; + +import dagger.Module; +import dagger.Provides; +import retrofit2.Retrofit; +import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory; +import retrofit2.converter.gson.GsonConverterFactory; + +@Module +public class ApiModule { + + @Provides + @Singleton + public HostConfig providesHostConfig(SharedPreferences sharedPreferences, Context context) { + return new HostConfig(sharedPreferences, context); + } + + @Provides + public GsonConverterFactory providesGsonConverterFactory() { + Type taskTagClassListType = new TypeToken>() {}.getType(); + Type skillListType = new TypeToken>() {}.getType(); + Type customizationListType = new TypeToken>() {}.getType(); + Type tutorialStepListType = new TypeToken>() {}.getType(); + Type faqArticleListType = new TypeToken>() {}.getType(); + Type itemDataListType = new TypeToken>() {}.getType(); + Type eggListType = new TypeToken>() {}.getType(); + Type foodListType = new TypeToken>() {}.getType(); + Type hatchingPotionListType = new TypeToken>() {}.getType(); + Type questContentListType = new TypeToken>() {}.getType(); + Type petListType = new TypeToken>() {}.getType(); + Type mountListType = new TypeToken>() {}.getType(); + + //Exclusion strategy needed for DBFlow https://github.com/Raizlabs/DBFlow/issues/121 + Gson gson = new GsonBuilder() + .setExclusionStrategies(new CheckListItemExcludeStrategy()) + .setExclusionStrategies(new ExclusionStrategy() { + @Override + public boolean shouldSkipField(FieldAttributes f) { + return f.getDeclaredClass().equals(ModelAdapter.class); + } + + @Override + public boolean shouldSkipClass(Class clazz) { + return false; + } + }) + .registerTypeAdapter(taskTagClassListType, new TaskTagDeserializer()) + .registerTypeAdapter(Boolean.class, new BooleanAsIntAdapter()) + .registerTypeAdapter(boolean.class, new BooleanAsIntAdapter()) + .registerTypeAdapter(skillListType, new SkillDeserializer()) + .registerTypeAdapter(ChecklistItem.class, new ChecklistItemSerializer()) + .registerTypeAdapter(TaskList.class, new TaskListDeserializer()) + .registerTypeAdapter(Purchases.class, new PurchasedDeserializer()) + .registerTypeAdapter(customizationListType, new CustomizationDeserializer()) + .registerTypeAdapter(tutorialStepListType, new TutorialStepListDeserializer()) + .registerTypeAdapter(faqArticleListType, new FAQArticleListDeserilializer()) + .registerTypeAdapter(Group.class, new GroupSerialization()) + .registerTypeAdapter(Date.class, new DateDeserializer()) + .registerTypeAdapter(itemDataListType, new ItemDataListDeserializer()) + .registerTypeAdapter(eggListType, new EggListDeserializer()) + .registerTypeAdapter(foodListType, new FoodListDeserializer()) + .registerTypeAdapter(hatchingPotionListType, new HatchingPotionListDeserializer()) + .registerTypeAdapter(questContentListType, new QuestListDeserializer()) + .registerTypeAdapter(petListType, new PetListDeserializer()) + .registerTypeAdapter(mountListType, new MountListDeserializer()) + .registerTypeAdapter(ChatMessage.class, new ChatMessageDeserializer()) + .registerTypeAdapter(Task.class, new TaskSerializer()) + .registerTypeAdapter(ContentResult.class, new ContentDeserializer()) + .registerTypeAdapter(FeedResponse.class, new FeedResponseDeserializer()) + .setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'") + .create(); + return GsonConverterFactory.create(gson); + } + + @Provides + @Singleton + public APIHelper providesApiHelper(GsonConverterFactory gsonConverter, HostConfig hostConfig) { + return new APIHelper(gsonConverter, hostConfig); + } + + @Provides + public MaintenanceApiService providesMaintenanceApiService(GsonConverterFactory gsonConverter, HostConfig hostConfig) { + Retrofit adapter = new Retrofit.Builder() + .baseUrl("https://habitica-assets.s3.amazonaws.com/mobileApp/endpoint/") + .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) + .addConverterFactory(gsonConverter) + .build(); + return adapter.create(MaintenanceApiService.class); + } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/modules/AppModule.java b/Habitica/src/main/java/com/habitrpg/android/habitica/modules/AppModule.java new file mode 100644 index 000000000..46b95ca28 --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/modules/AppModule.java @@ -0,0 +1,33 @@ +package com.habitrpg.android.habitica.modules; + +import com.habitrpg.android.habitica.HabiticaApplication; + +import android.content.Context; +import android.content.SharedPreferences; +import android.support.v7.preference.PreferenceManager; + +import javax.inject.Singleton; + +import dagger.Module; +import dagger.Provides; + +@Module +public class AppModule { + + private HabiticaApplication application; + + public AppModule(HabiticaApplication application) { + this.application = application; + } + + @Provides + @Singleton + public Context providesContext() { + return application; + } + + @Provides @Singleton + public SharedPreferences provideSharedPreferences(Context context) { + return PreferenceManager.getDefaultSharedPreferences(context); + } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/AboutActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/AboutActivity.java index 8da2152ca..8b106f40a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/AboutActivity.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/AboutActivity.java @@ -1,6 +1,7 @@ package com.habitrpg.android.habitica.ui.activities; import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.ui.fragments.AboutFragment; import com.mikepenz.aboutlibraries.Libs; import com.mikepenz.aboutlibraries.LibsBuilder; @@ -70,6 +71,10 @@ public class AboutActivity extends BaseActivity { tabLayout.setupWithViewPager(pager); } + @Override + protected void injectActivity(AppComponent component) { + component.inject(this); + } @Override public boolean onOptionsItemSelected(MenuItem item) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/BaseActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/BaseActivity.java index c7495233c..8e9f05328 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/BaseActivity.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/BaseActivity.java @@ -1,5 +1,8 @@ package com.habitrpg.android.habitica.ui.activities; +import com.habitrpg.android.habitica.HabiticaApplication; +import com.habitrpg.android.habitica.components.AppComponent; + import android.os.Bundle; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; @@ -20,10 +23,13 @@ public abstract class BaseActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + injectActivity(getHabiticaApplication().getComponent()); setContentView(getLayoutResId()); ButterKnife.bind(this); } + protected abstract void injectActivity(AppComponent component); + protected void setupToolbar(Toolbar toolbar) { if (toolbar != null) { setSupportActionBar(toolbar); @@ -44,4 +50,8 @@ public abstract class BaseActivity extends AppCompatActivity { destroyed = true; super.onDestroy(); } + + public HabiticaApplication getHabiticaApplication() { + return (HabiticaApplication)getApplication(); + } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ClassSelectionActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ClassSelectionActivity.java index d7d97191f..b417035a4 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ClassSelectionActivity.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ClassSelectionActivity.java @@ -3,6 +3,7 @@ package com.habitrpg.android.habitica.ui.activities; import com.habitrpg.android.habitica.APIHelper; import com.habitrpg.android.habitica.HabiticaApplication; import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.ui.AvatarView; import com.magicmicky.habitrpgwrapper.lib.models.Gear; import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; @@ -16,9 +17,6 @@ import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AlertDialog; -import java.util.HashMap; -import java.util.Map; - import butterknife.BindView; import butterknife.OnClick; import rx.functions.Action1; @@ -110,6 +108,11 @@ public class ClassSelectionActivity extends BaseActivity implements Action1 {}, throwable -> {}); } + @Override + protected void injectActivity(AppComponent component) { + component.inject(this); + } + private void setupIntro() { android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager(); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.java index e0a181725..9e6c01cc8 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/LoginActivity.java @@ -9,9 +9,9 @@ import com.facebook.login.LoginResult; import com.facebook.login.widget.LoginButton; import com.habitrpg.android.habitica.APIHelper; import com.habitrpg.android.habitica.BuildConfig; -import com.habitrpg.android.habitica.HostConfig; import com.habitrpg.android.habitica.R; import com.habitrpg.android.habitica.callbacks.HabitRPGUserCallback; +import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.prefs.scanner.IntentIntegrator; import com.habitrpg.android.habitica.prefs.scanner.IntentResult; import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; @@ -26,7 +26,6 @@ import android.graphics.Color; import android.net.Uri; import android.os.Bundle; import android.support.design.widget.Snackbar; -import android.support.v7.app.AppCompatActivity; import android.support.v7.preference.PreferenceManager; import android.text.SpannableString; import android.text.style.UnderlineSpan; @@ -41,6 +40,8 @@ import android.widget.ProgressBar; import android.widget.TableRow; import android.widget.TextView; +import javax.inject.Inject; + import butterknife.BindView; import butterknife.ButterKnife; import rx.functions.Action1; @@ -48,13 +49,16 @@ import rx.functions.Action1; /** * @author Mickael Goubin */ -public class LoginActivity extends AppCompatActivity +public class LoginActivity extends BaseActivity implements Action1, HabitRPGUserCallback.OnUserReceived { private final static String TAG_ADDRESS="address"; private final static String TAG_USERID="user"; private final static String TAG_APIKEY="key"; - private APIHelper apiHelper; + @Inject + public APIHelper apiHelper; + @Inject + public SharedPreferences sharedPrefs; public String mTmpUserToken; public String mTmpApiToken; public Boolean isRegistering; @@ -92,9 +96,13 @@ public class LoginActivity extends AppCompatActivity @BindView(R.id.forgot_pw_tv) TextView mForgotPWTV; - protected void onCreate(Bundle savedInstanceState) { + @Override + protected int getLayoutResId() { + return R.layout.activity_login; + } + + protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.activity_login); //Set default values to avoid null-responses when requesting unedited settings PreferenceManager.setDefaultValues(this, R.xml.preferences_fragment, false); @@ -132,12 +140,6 @@ public class LoginActivity extends AppCompatActivity } }); - HostConfig hc= PrefsActivity.fromContext(this); - if(hc ==null) { - hc = new HostConfig(BuildConfig.BASE_URL, BuildConfig.PORT, "", ""); - } - apiHelper = new APIHelper(hc); - this.isRegistering = true; JSONObject eventProperties = new JSONObject(); @@ -151,7 +153,12 @@ public class LoginActivity extends AppCompatActivity Amplitude.getInstance().logEvent("navigate", eventProperties); } - private void resetLayout() { + @Override + protected void injectActivity(AppComponent component) { + component.inject(this); + } + + private void resetLayout() { if (this.isRegistering) { if (this.mEmailRow.getVisibility() == View.GONE) { show(this.mEmailRow); @@ -323,11 +330,10 @@ startActivity(i); } private void saveTokens(String api, String user) throws Exception { - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(LoginActivity.this); - SharedPreferences.Editor editor = prefs.edit(); + this.apiHelper.updateAuthenticationCredentials(user, api); + SharedPreferences.Editor editor = sharedPrefs.edit(); boolean ans = editor.putString(getString(R.string.SP_APIToken), api) .putString(getString(R.string.SP_userID), user) - .putString(getString(R.string.SP_address),BuildConfig.BASE_URL) .commit(); if(!ans) { throw new Exception("PB_string_commit"); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java index 7e1146951..a04e9444b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java @@ -11,6 +11,7 @@ import com.habitrpg.android.habitica.callbacks.ItemsCallback; import com.habitrpg.android.habitica.callbacks.MergeUserCallback; import com.habitrpg.android.habitica.callbacks.TaskScoringCallback; import com.habitrpg.android.habitica.callbacks.UnlockCallback; +import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.databinding.ValueBarBinding; import com.habitrpg.android.habitica.events.ContentReloadedEvent; import com.habitrpg.android.habitica.events.DisplayFragmentEvent; @@ -39,9 +40,10 @@ import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment; import com.habitrpg.android.habitica.ui.fragments.GemsPurchaseFragment; import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils; import com.habitrpg.android.habitica.userpicture.BitmapUtils; +import com.habitrpg.android.habitica.userpicture.UserPicture; +import com.magicmicky.habitrpgwrapper.lib.api.MaintenanceApiService; import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; import com.magicmicky.habitrpgwrapper.lib.models.SuppressedModals; -import com.magicmicky.habitrpgwrapper.lib.models.Tag; import com.magicmicky.habitrpgwrapper.lib.models.TaskDirection; import com.magicmicky.habitrpgwrapper.lib.models.TaskDirectionData; import com.magicmicky.habitrpgwrapper.lib.models.TutorialStep; @@ -61,7 +63,6 @@ import com.mikepenz.materialdrawer.AccountHeader; import com.mikepenz.materialdrawer.Drawer; import com.mikepenz.materialdrawer.DrawerBuilder; import com.mikepenz.materialdrawer.model.PrimaryDrawerItem; -import com.mikepenz.materialdrawer.model.SwitchDrawerItem; import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem; import com.mikepenz.materialdrawer.model.interfaces.IProfile; import com.raizlabs.android.dbflow.runtime.TransactionManager; @@ -128,6 +129,8 @@ import java.util.Map; import java.util.TimeZone; import java.util.concurrent.TimeUnit; +import javax.inject.Inject; + import butterknife.BindView; import rx.functions.Action1; @@ -156,12 +159,18 @@ public class MainActivity extends BaseActivity implements Action1, Ha public ActivityCheckout checkout = null; private Drawer drawer; private Drawer filterDrawer; + + @Inject protected HostConfig hostConfig; + @Inject + public APIHelper apiHelper; + @Inject + public MaintenanceApiService maintenanceService; + public HabitRPGUser user; private AccountHeader accountHeader; private BaseMainFragment activeFragment; private AvatarWithBarsViewModel avatarInHeader; - private APIHelper apiHelper; private AlertDialog faintDialog; private AvatarView sideAvatarView; @@ -181,15 +190,12 @@ public class MainActivity extends BaseActivity implements Action1, Ha public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - this.hostConfig = PrefsActivity.fromContext(this); if (!HabiticaApplication.checkUserAuthentication(this, hostConfig)) return; //Check if reminder alarm is set scheduleReminder(this); - HabiticaApplication.ApiHelper = this.apiHelper = new APIHelper(hostConfig); - new Select().from(HabitRPGUser.class).where(Condition.column("id").eq(hostConfig.getUser())).async().querySingle(userTransactionListener); setupToolbar(toolbar); @@ -213,6 +219,11 @@ public class MainActivity extends BaseActivity implements Action1, Ha EventBus.getDefault().register(this); } + @Override + protected void injectActivity(AppComponent component) { + component.inject(this); + } + @Override protected void onResume() { super.onResume(); @@ -269,7 +280,6 @@ public class MainActivity extends BaseActivity implements Action1, Ha } this.activeFragment = fragment; fragment.setArguments(getIntent().getExtras()); - fragment.apiHelper = apiHelper; fragment.setUser(user); fragment.setActivity(this); fragment.setTabLayout(detail_tabs); @@ -1214,7 +1224,7 @@ public class MainActivity extends BaseActivity implements Action1, Ha } private void checkMaintenance() { - this.apiHelper.maintenanceService.getMaintenanceStatus() + this.maintenanceService.getMaintenanceStatus() .compose(apiHelper.configureApiCallObserver()) .subscribe(maintenanceResponse -> { if (maintenanceResponse.activeMaintenance) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MaintenanceActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MaintenanceActivity.java index fec3ae336..be874f6f8 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MaintenanceActivity.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MaintenanceActivity.java @@ -2,9 +2,12 @@ package com.habitrpg.android.habitica.ui.activities; import com.github.data5tream.emojilib.EmojiTextView; import com.habitrpg.android.habitica.APIHelper; +import com.habitrpg.android.habitica.HabiticaApplication; import com.habitrpg.android.habitica.HostConfig; import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.ui.helpers.MarkdownParser; +import com.magicmicky.habitrpgwrapper.lib.api.MaintenanceApiService; import com.squareup.picasso.Picasso; import android.content.Intent; @@ -16,8 +19,12 @@ import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; +import javax.inject.Inject; + import butterknife.BindView; import butterknife.OnClick; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; public class MaintenanceActivity extends BaseActivity { @@ -32,7 +39,10 @@ public class MaintenanceActivity extends BaseActivity { @BindView(R.id.playStoreButton) Button playStoreButton; - private APIHelper apiHelper; + + @Inject + public MaintenanceApiService maintenanceService; + private Boolean isDeprecationNotice; @Override @@ -57,16 +67,20 @@ public class MaintenanceActivity extends BaseActivity { } else { this.playStoreButton.setVisibility(View.GONE); } - HostConfig hostConfig = PrefsActivity.fromContext(this); - apiHelper = new APIHelper(hostConfig); + } + + @Override + protected void injectActivity(AppComponent component) { + component.inject(this); } @Override protected void onResume() { super.onResume(); if (!isDeprecationNotice) { - this.apiHelper.maintenanceService.getMaintenanceStatus() - .compose(this.apiHelper.configureApiCallObserver()) + this.maintenanceService.getMaintenanceStatus() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) .subscribe(maintenanceResponse -> { if (!maintenanceResponse.activeMaintenance) { finish(); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/PartyInviteActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/PartyInviteActivity.java index ad4809b0e..d3c69b306 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/PartyInviteActivity.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/PartyInviteActivity.java @@ -1,6 +1,7 @@ package com.habitrpg.android.habitica.ui.activities; import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.ui.fragments.social.party.PartyInviteFragment; import android.content.Intent; @@ -41,6 +42,11 @@ public class PartyInviteActivity extends BaseActivity { setViewPagerAdapter(); } + @Override + protected void injectActivity(AppComponent component) { + component.inject(this); + } + @Override public boolean onCreateOptionsMenu(Menu menu) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/PrefsActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/PrefsActivity.java index d91469584..a4046c7c2 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/PrefsActivity.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/PrefsActivity.java @@ -3,6 +3,7 @@ package com.habitrpg.android.habitica.ui.activities; import com.habitrpg.android.habitica.BuildConfig; import com.habitrpg.android.habitica.HostConfig; import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.ui.fragments.preferences.AccountDetailsFragment; import com.habitrpg.android.habitica.ui.fragments.preferences.PreferencesFragment; @@ -38,6 +39,11 @@ public class PrefsActivity extends BaseActivity implements .commit(); } + @Override + protected void injectActivity(AppComponent component) { + component.inject(this); + } + @Override public boolean onSupportNavigateUp() { if (getSupportFragmentManager().getBackStackEntryCount() > 0) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SetupActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SetupActivity.java index 50892889f..fcb1248ca 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SetupActivity.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SetupActivity.java @@ -6,6 +6,7 @@ import com.habitrpg.android.habitica.HostConfig; import com.habitrpg.android.habitica.R; import com.habitrpg.android.habitica.callbacks.HabitRPGUserCallback; import com.habitrpg.android.habitica.callbacks.MergeUserCallback; +import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.events.commands.UpdateUserCommand; import com.habitrpg.android.habitica.ui.fragments.setup.AvatarSetupFragment; import com.habitrpg.android.habitica.ui.fragments.setup.TaskSetupFragment; @@ -30,6 +31,8 @@ import android.widget.Button; import java.util.List; import java.util.Map; +import javax.inject.Inject; + import butterknife.BindView; public class SetupActivity extends BaseActivity implements View.OnClickListener, ViewPager.OnPageChangeListener, HabitRPGUserCallback.OnUserReceived { @@ -49,7 +52,9 @@ public class SetupActivity extends BaseActivity implements View.OnClickListener, AvatarSetupFragment avatarSetupFragment; TaskSetupFragment taskSetupFragment; - private APIHelper apiHelper; + @Inject + public APIHelper apiHelper; + @Inject protected HostConfig hostConfig; HabitRPGUser user; Boolean completedSetup; @@ -62,14 +67,8 @@ public class SetupActivity extends BaseActivity implements View.OnClickListener, @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - - this.hostConfig = PrefsActivity.fromContext(this); - - this.apiHelper = new APIHelper(hostConfig); - this.user = new Select().from(HabitRPGUser.class).where(Condition.column("id").eq(hostConfig.getUser())).querySingle(); - this.skipButton.setOnClickListener(this); this.nextButton.setOnClickListener(this); this.previousButton.setOnClickListener(this); @@ -86,6 +85,11 @@ public class SetupActivity extends BaseActivity implements View.OnClickListener, Amplitude.getInstance().logEvent("setup", eventProperties); } + @Override + protected void injectActivity(AppComponent component) { + component.inject(this); + } + @Override protected void onStart() { super.onStart(); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SkillTasksActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SkillTasksActivity.java index f4d3a4767..25ae9cf06 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SkillTasksActivity.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SkillTasksActivity.java @@ -1,6 +1,7 @@ package com.habitrpg.android.habitica.ui.activities; import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.ui.adapter.SkillTasksRecyclerViewAdapter; import com.habitrpg.android.habitica.ui.fragments.skills.SkillTasksRecyclerViewFragment; import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; @@ -40,6 +41,11 @@ public class SkillTasksActivity extends BaseActivity { loadTaskLists(); } + @Override + protected void injectActivity(AppComponent component) { + component.inject(this); + } + public void loadTaskLists() { android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager(); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.java index 0c6bd837f..b03652070 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.java @@ -3,6 +3,7 @@ package com.habitrpg.android.habitica.ui.activities; import com.github.data5tream.emojilib.EmojiEditText; import com.github.data5tream.emojilib.EmojiPopup; import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.events.TaskSaveEvent; import com.habitrpg.android.habitica.events.commands.DeleteTaskCommand; import com.habitrpg.android.habitica.ui.WrapContentRecyclerViewLayoutManager; @@ -393,6 +394,11 @@ public class TaskFormActivity extends BaseActivity implements AdapterView.OnItem ); } + @Override + protected void injectActivity(AppComponent component) { + component.inject(this); + } + private boolean isEmojiEditText(View view) { return view instanceof EmojiEditText; } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseFragment.java index 3db645ec2..4db5d132d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseFragment.java @@ -1,7 +1,9 @@ package com.habitrpg.android.habitica.ui.fragments; import com.amplitude.api.Amplitude; +import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.events.DisplayTutorialEvent; +import com.habitrpg.android.habitica.ui.activities.MainActivity; import com.magicmicky.habitrpgwrapper.lib.models.TutorialStep; import com.raizlabs.android.dbflow.runtime.transaction.BaseTransaction; import com.raizlabs.android.dbflow.runtime.transaction.TransactionListener; @@ -26,7 +28,7 @@ import java.util.Date; import butterknife.ButterKnife; import butterknife.Unbinder; -public class BaseFragment extends DialogFragment { +public abstract class BaseFragment extends DialogFragment { private boolean registerEventBus = false; @@ -63,6 +65,8 @@ public class BaseFragment extends DialogFragment { @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + injectFragment(((MainActivity)getActivity()).getHabiticaApplication().getComponent()); + // Receive Events try { EventBus.getDefault().register(this); @@ -74,6 +78,8 @@ public class BaseFragment extends DialogFragment { return null; } + public abstract void injectFragment(AppComponent component); + @CallSuper @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseMainFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseMainFragment.java index d7bb6d699..7b1f866ce 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseMainFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/BaseMainFragment.java @@ -15,12 +15,16 @@ import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; +import javax.inject.Inject; + public abstract class BaseMainFragment extends BaseFragment { + @Inject + public APIHelper apiHelper; + public MainActivity activity; public TabLayout tabLayout; public FrameLayout floatingMenuWrapper; - public APIHelper apiHelper; protected HabitRPGUser user; public boolean usesTabLayout; public int fragmentSidebarPosition; @@ -75,10 +79,6 @@ public abstract class BaseMainFragment extends BaseFragment { } } - if (apiHelper == null) { - apiHelper = new APIHelper(PrefsActivity.fromContext(getContext())); - } - if (floatingMenuWrapper != null) { floatingMenuWrapper.removeAllViews(); } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/GemsPurchaseFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/GemsPurchaseFragment.java index a4de54711..63b70faa2 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/GemsPurchaseFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/GemsPurchaseFragment.java @@ -2,6 +2,7 @@ package com.habitrpg.android.habitica.ui.fragments; import com.habitrpg.android.habitica.HabiticaApplication; import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.events.BoughtGemsEvent; import com.habitrpg.android.habitica.ui.helpers.ViewHelper; @@ -57,6 +58,11 @@ public class GemsPurchaseFragment extends BaseMainFragment { return inflater.inflate(R.layout.fragment_gem_purchase, container, false); } + @Override + public void injectFragment(AppComponent component) { + component.inject(this); + } + @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NewsFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NewsFragment.java index d2422d8f2..52385e4f7 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NewsFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NewsFragment.java @@ -2,6 +2,7 @@ package com.habitrpg.android.habitica.ui.fragments; import com.habitrpg.android.habitica.BuildConfig; import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.components.AppComponent; import android.os.Bundle; import android.view.LayoutInflater; @@ -33,4 +34,9 @@ public class NewsFragment extends BaseMainFragment { return view; } + @Override + public void injectFragment(AppComponent component) { + component.inject(this); + } + } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/faq/FAQDetailFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/faq/FAQDetailFragment.java index c5572d16e..f7491642b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/faq/FAQDetailFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/faq/FAQDetailFragment.java @@ -1,6 +1,7 @@ package com.habitrpg.android.habitica.ui.fragments.faq; import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment; import com.habitrpg.android.habitica.ui.helpers.MarkdownParser; import com.magicmicky.habitrpgwrapper.lib.models.FAQArticle; @@ -40,6 +41,10 @@ public class FAQDetailFragment extends BaseMainFragment { return view; } + @Override + public void injectFragment(AppComponent component) { + } + public void setArticle(FAQArticle article) { this.article = article; if (this.questionTextView != null) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/faq/FAQOverviewFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/faq/FAQOverviewFragment.java index 627f12d3a..bb0079103 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/faq/FAQOverviewFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/faq/FAQOverviewFragment.java @@ -1,6 +1,7 @@ package com.habitrpg.android.habitica.ui.fragments.faq; import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.ui.menu.DividerItemDecoration; import com.habitrpg.android.habitica.ui.adapter.FAQOverviewRecyclerAdapter; import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment; @@ -42,7 +43,12 @@ public class FAQOverviewFragment extends BaseMainFragment { return view; } - private void loadArticles() { + @Override + public void injectFragment(AppComponent component) { + component.inject(this); + } + + private void loadArticles() { if(user == null || adapter == null){ return; } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarCustomizationFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarCustomizationFragment.java index 410d92b58..aa89e9cc8 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarCustomizationFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarCustomizationFragment.java @@ -1,6 +1,7 @@ package com.habitrpg.android.habitica.ui.fragments.inventory.customization; import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.ui.adapter.CustomizationRecyclerViewAdapter; import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment; import com.habitrpg.android.habitica.ui.helpers.MarginDecoration; @@ -76,6 +77,11 @@ public class AvatarCustomizationFragment extends BaseMainFragment { return view; } + @Override + public void injectFragment(AppComponent component) { + component.inject(this); + } + private void loadCustomizations() { if(user == null || adapter == null){ return; diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarOverviewFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarOverviewFragment.java index 9a84d5be1..3dd7148b6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarOverviewFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarOverviewFragment.java @@ -2,6 +2,7 @@ package com.habitrpg.android.habitica.ui.fragments.inventory.customization; import com.habitrpg.android.habitica.R; import com.habitrpg.android.habitica.callbacks.MergeUserCallback; +import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.databinding.FragmentAvatarOverviewBinding; import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment; import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; @@ -100,6 +101,11 @@ public class AvatarOverviewFragment extends BaseMainFragment implements AdapterV return view; } + @Override + public void injectFragment(AppComponent component) { + component.inject(this); + } + private void displayCustomizationFragment(String type, String category) { AvatarCustomizationFragment fragment = new AvatarCustomizationFragment(); fragment.type = type; diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/equipment/EquipmentDetailFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/equipment/EquipmentDetailFragment.java index 2c845a392..ea4040943 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/equipment/EquipmentDetailFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/equipment/EquipmentDetailFragment.java @@ -1,6 +1,7 @@ package com.habitrpg.android.habitica.ui.fragments.inventory.equipment; import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.ui.menu.DividerItemDecoration; import com.habitrpg.android.habitica.ui.adapter.inventory.EquipmentRecyclerViewAdapter; import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment; @@ -54,6 +55,11 @@ public class EquipmentDetailFragment extends BaseMainFragment { return v; } + @Override + public void injectFragment(AppComponent component) { + component.inject(this); + } + private void loadGear() { if(user == null || adapter == null){ return; diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/equipment/EquipmentOverviewFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/equipment/EquipmentOverviewFragment.java index 886fb06ac..5982ba1c2 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/equipment/EquipmentOverviewFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/equipment/EquipmentOverviewFragment.java @@ -1,6 +1,7 @@ package com.habitrpg.android.habitica.ui.fragments.inventory.equipment; import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.databinding.FragmentEquipmentOverviewBinding; import com.habitrpg.android.habitica.events.commands.UpdateUserCommand; import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment; @@ -131,6 +132,11 @@ public class EquipmentOverviewFragment extends BaseMainFragment implements Trans return v; } + @Override + public void injectFragment(AppComponent component) { + component.inject(this); + } + private void displayEquipmentDetailList(String type, String equipped, Boolean isCostume) { EquipmentDetailFragment fragment = new EquipmentDetailFragment(); fragment.type = type; diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemRecyclerFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemRecyclerFragment.java index 6a68626c1..0772064be 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemRecyclerFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemRecyclerFragment.java @@ -1,6 +1,7 @@ package com.habitrpg.android.habitica.ui.fragments.inventory.items; import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.events.ContentReloadedEvent; import com.habitrpg.android.habitica.ui.menu.DividerItemDecoration; import com.habitrpg.android.habitica.ui.adapter.inventory.ItemRecyclerAdapter; @@ -114,6 +115,11 @@ public class ItemRecyclerFragment extends BaseFragment { return view; } + @Override + public void injectFragment(AppComponent component) { + component.inject(this); + } + @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemsFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemsFragment.java index 6e5e4cdfb..aba6ae7bb 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemsFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/items/ItemsFragment.java @@ -1,6 +1,7 @@ package com.habitrpg.android.habitica.ui.fragments.inventory.items; import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.events.commands.HatchingCommand; import com.habitrpg.android.habitica.events.commands.InvitePartyToQuestCommand; import com.habitrpg.android.habitica.events.commands.OpenMenuItemCommand; @@ -38,6 +39,11 @@ public class ItemsFragment extends BaseMainFragment { return v; } + @Override + public void injectFragment(AppComponent component) { + component.inject(this); + } + public void setViewPagerAdapter() { android.support.v4.app.FragmentManager fragmentManager = getChildFragmentManager(); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/MountDetailRecyclerFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/MountDetailRecyclerFragment.java index c835e017d..868d33488 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/MountDetailRecyclerFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/MountDetailRecyclerFragment.java @@ -1,6 +1,7 @@ package com.habitrpg.android.habitica.ui.fragments.inventory.stable; import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.ui.adapter.inventory.MountDetailRecyclerAdapter; import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment; import com.habitrpg.android.habitica.ui.helpers.MarginDecoration; @@ -62,6 +63,11 @@ public class MountDetailRecyclerFragment extends BaseMainFragment { return view; } + @Override + public void injectFragment(AppComponent component) { + component.inject(this); + } + @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/PetDetailRecyclerFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/PetDetailRecyclerFragment.java index f95fc2c88..01abf4956 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/PetDetailRecyclerFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/PetDetailRecyclerFragment.java @@ -1,6 +1,7 @@ package com.habitrpg.android.habitica.ui.fragments.inventory.stable; import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.events.commands.FeedCommand; import com.habitrpg.android.habitica.ui.adapter.inventory.PetDetailRecyclerAdapter; import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment; @@ -67,6 +68,11 @@ public class PetDetailRecyclerFragment extends BaseMainFragment { return view; } + @Override + public void injectFragment(AppComponent component) { + component.inject(this); + } + @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/StableFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/StableFragment.java index 64c77f902..8c89704f0 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/StableFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/StableFragment.java @@ -1,6 +1,7 @@ package com.habitrpg.android.habitica.ui.fragments.inventory.stable; import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment; import android.os.Bundle; @@ -31,6 +32,11 @@ public class StableFragment extends BaseMainFragment { return v; } + @Override + public void injectFragment(AppComponent component) { + component.inject(this); + } + public void setViewPagerAdapter() { android.support.v4.app.FragmentManager fragmentManager = getChildFragmentManager(); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/StableRecyclerFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/StableRecyclerFragment.java index feeb427a7..de95f6e84 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/StableRecyclerFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/stable/StableRecyclerFragment.java @@ -1,6 +1,7 @@ package com.habitrpg.android.habitica.ui.fragments.inventory.stable; import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.events.ContentReloadedEvent; import com.habitrpg.android.habitica.events.ReloadContentEvent; import com.habitrpg.android.habitica.ui.activities.MainActivity; @@ -97,6 +98,11 @@ public class StableRecyclerFragment extends BaseFragment { return view; } + @Override + public void injectFragment(AppComponent component) { + component.inject(this); + } + @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/AvatarSetupFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/AvatarSetupFragment.java index 9b3f28ddd..596407fe8 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/AvatarSetupFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/AvatarSetupFragment.java @@ -1,6 +1,7 @@ package com.habitrpg.android.habitica.ui.fragments.setup; import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.ui.AvatarView; import com.habitrpg.android.habitica.ui.activities.SetupActivity; import com.habitrpg.android.habitica.ui.adapter.setup.CustomizationSetupAdapter; @@ -81,6 +82,11 @@ public class AvatarSetupFragment extends BaseFragment { return view; } + @Override + public void injectFragment(AppComponent component) { + component.inject(this); + } + @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/IntroFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/IntroFragment.java index f184a9748..50b747297 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/IntroFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/IntroFragment.java @@ -1,6 +1,7 @@ package com.habitrpg.android.habitica.ui.fragments.setup; import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.ui.fragments.BaseFragment; import android.graphics.drawable.Drawable; @@ -53,6 +54,11 @@ public class IntroFragment extends BaseFragment { return v; } + @Override + public void injectFragment(AppComponent component) { + component.inject(this); + } + public void setImage(Drawable image) { this.image = image; if (this.imageView != null && image != null) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/TaskSetupFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/TaskSetupFragment.java index ba3c70b5c..8db5280e0 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/TaskSetupFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/TaskSetupFragment.java @@ -1,6 +1,7 @@ package com.habitrpg.android.habitica.ui.fragments.setup; import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.ui.activities.SetupActivity; import com.habitrpg.android.habitica.ui.adapter.setup.TaskSetupAdapter; import com.habitrpg.android.habitica.ui.fragments.BaseFragment; @@ -56,6 +57,11 @@ public class TaskSetupFragment extends BaseFragment { return view; } + @Override + public void injectFragment(AppComponent component) { + component.inject(this); + } + private void setTasks() { this.taskGroups = new String[][]{ {getString(R.string.setup_group_work), "work"}, diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/skills/SkillTasksRecyclerViewFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/skills/SkillTasksRecyclerViewFragment.java index 05ef77341..440fd6e23 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/skills/SkillTasksRecyclerViewFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/skills/SkillTasksRecyclerViewFragment.java @@ -1,8 +1,10 @@ package com.habitrpg.android.habitica.ui.fragments.skills; import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.events.commands.AddNewTaskCommand; import com.habitrpg.android.habitica.ui.adapter.SkillTasksRecyclerViewAdapter; +import com.habitrpg.android.habitica.ui.fragments.BaseFragment; import org.greenrobot.eventbus.EventBus; @@ -15,7 +17,7 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -public class SkillTasksRecyclerViewFragment extends Fragment implements View.OnClickListener { +public class SkillTasksRecyclerViewFragment extends BaseFragment implements View.OnClickListener { public RecyclerView mRecyclerView; public RecyclerView.Adapter mAdapter; private String classType; @@ -35,7 +37,12 @@ public class SkillTasksRecyclerViewFragment extends Fragment implements View.OnC return view; } - LinearLayoutManager layoutManager = null; + @Override + public void injectFragment(AppComponent component) { + component.inject(this); + } + + LinearLayoutManager layoutManager = null; @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/skills/SkillsFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/skills/SkillsFragment.java index 921b48dd6..5d2679a96 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/skills/SkillsFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/skills/SkillsFragment.java @@ -3,6 +3,7 @@ package com.habitrpg.android.habitica.ui.fragments.skills; import com.habitrpg.android.habitica.R; import com.habitrpg.android.habitica.callbacks.MergeUserCallback; import com.habitrpg.android.habitica.callbacks.SkillCallback; +import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.events.SkillUsedEvent; import com.habitrpg.android.habitica.events.commands.UseSkillCommand; import com.habitrpg.android.habitica.ui.helpers.UiUtils; @@ -58,6 +59,11 @@ public class SkillsFragment extends BaseMainFragment { return view; } + @Override + public void injectFragment(AppComponent component) { + component.inject(this); + } + @BindView(R.id.recyclerView) RecyclerView mRecyclerView; diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/ChatListFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/ChatListFragment.java index c1d698568..115f079f4 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/ChatListFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/ChatListFragment.java @@ -3,6 +3,7 @@ package com.habitrpg.android.habitica.ui.fragments.social; import com.habitrpg.android.habitica.APIHelper; import com.habitrpg.android.habitica.HabiticaApplication; import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.events.ToggledInnStateEvent; import com.habitrpg.android.habitica.events.commands.DeleteChatMessageCommand; import com.habitrpg.android.habitica.events.commands.FlagChatMessageCommand; @@ -39,6 +40,8 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import javax.inject.Inject; + import butterknife.BindView; import butterknife.ButterKnife; import rx.functions.Action1; @@ -48,7 +51,9 @@ public class ChatListFragment extends BaseFragment implements SwipeRefreshLayout private Context ctx; private String groupId; public String seenGroupId; - private APIHelper apiHelper; + + @Inject + public APIHelper apiHelper; private HabitRPGUser user; private String userId; public boolean isTavern; @@ -94,13 +99,14 @@ public class ChatListFragment extends BaseFragment implements SwipeRefreshLayout if (view == null) view = inflater.inflate(R.layout.fragment_chatlist, container, false); - if (apiHelper == null) { - apiHelper = new APIHelper(PrefsActivity.fromContext(getContext())); - } - return view; } + @Override + public void injectFragment(AppComponent component) { + component.inject(this); + } + @BindView(R.id.chat_list) RecyclerView mRecyclerView; diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/GroupInformationFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/GroupInformationFragment.java index cef2274f8..5f57ca619 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/GroupInformationFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/GroupInformationFragment.java @@ -2,6 +2,7 @@ package com.habitrpg.android.habitica.ui.fragments.social; import com.habitrpg.android.habitica.APIHelper; import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.databinding.FragmentGroupInfoBinding; import com.habitrpg.android.habitica.databinding.ValueBarBinding; import com.habitrpg.android.habitica.ui.adapter.social.QuestCollectRecyclerViewAdapter; @@ -99,6 +100,11 @@ public class GroupInformationFragment extends BaseFragment { return view; } + @Override + public void injectFragment(AppComponent component) { + component.inject(this); + } + @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/GuildFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/GuildFragment.java index 9e4c87018..9c5b29c80 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/GuildFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/GuildFragment.java @@ -1,6 +1,7 @@ package com.habitrpg.android.habitica.ui.fragments.social; import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.ui.activities.GroupFormActivity; import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment; import com.magicmicky.habitrpgwrapper.lib.models.Group; @@ -60,6 +61,11 @@ public class GuildFragment extends BaseMainFragment implements Action1 { return v; } + @Override + public void injectFragment(AppComponent component) { + component.inject(this); + } + @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/GuildsOverviewFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/GuildsOverviewFragment.java index cfb4070e8..fd11fd012 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/GuildsOverviewFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/GuildsOverviewFragment.java @@ -1,6 +1,7 @@ package com.habitrpg.android.habitica.ui.fragments.social; import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment; import com.magicmicky.habitrpgwrapper.lib.models.Group; @@ -54,6 +55,11 @@ public class GuildsOverviewFragment extends BaseMainFragment implements View.OnC return v; } + @Override + public void injectFragment(AppComponent component) { + component.inject(this); + } + @Override public void onRefresh() { swipeRefreshLayout.setRefreshing(true); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/PublicGuildsFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/PublicGuildsFragment.java index b42396e29..1148f69ce 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/PublicGuildsFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/PublicGuildsFragment.java @@ -1,6 +1,7 @@ package com.habitrpg.android.habitica.ui.fragments.social; import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.ui.menu.DividerItemDecoration; import com.habitrpg.android.habitica.ui.adapter.social.PublicGuildsRecyclerViewAdapter; import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment; @@ -51,6 +52,11 @@ public class PublicGuildsFragment extends BaseMainFragment { return view; } + @Override + public void injectFragment(AppComponent component) { + component.inject(this); + } + @Override public void onCreate(Bundle savedInstance) { super.onCreate(savedInstance); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/TavernFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/TavernFragment.java index ab7a69399..cc3360d5e 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/TavernFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/TavernFragment.java @@ -2,6 +2,7 @@ package com.habitrpg.android.habitica.ui.fragments.social; import com.habitrpg.android.habitica.ContentCache; import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment; import com.magicmicky.habitrpgwrapper.lib.models.Group; @@ -39,6 +40,11 @@ public class TavernFragment extends BaseMainFragment { return v; } + @Override + public void injectFragment(AppComponent component) { + component.inject(this); + } + @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyFragment.java index f406251c1..140ffa162 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyFragment.java @@ -2,6 +2,7 @@ package com.habitrpg.android.habitica.ui.fragments.social.party; import com.habitrpg.android.habitica.ContentCache; import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.ui.activities.GroupFormActivity; import com.habitrpg.android.habitica.ui.activities.PartyInviteActivity; import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment; @@ -92,6 +93,11 @@ public class PartyFragment extends BaseMainFragment { return v; } + @Override + public void injectFragment(AppComponent component) { + component.inject(this); + } + private void updateGroupUI() { if (partyMemberListFragment != null) { partyMemberListFragment.setMemberList(group.members); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyInviteFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyInviteFragment.java index 9ec75ac9f..87e063ee6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyInviteFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyInviteFragment.java @@ -1,6 +1,7 @@ package com.habitrpg.android.habitica.ui.fragments.social.party; import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.ui.fragments.BaseFragment; import android.os.Bundle; @@ -48,6 +49,11 @@ public class PartyInviteFragment extends BaseFragment { return v; } + @Override + public void injectFragment(AppComponent component) { + component.inject(this); + } + @OnClick(R.id.addInviteButton) public void addInviteField() { EditText editText = new EditText(getContext()); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyMemberListFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyMemberListFragment.java index 5fd3cdada..c0c8cbbd1 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyMemberListFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyMemberListFragment.java @@ -1,6 +1,7 @@ package com.habitrpg.android.habitica.ui.fragments.social.party; import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.ui.adapter.social.PartyMemberRecyclerViewAdapter; import com.habitrpg.android.habitica.ui.fragments.BaseFragment; import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; @@ -49,6 +50,11 @@ public class PartyMemberListFragment extends BaseFragment { return view; } + @Override + public void injectFragment(AppComponent component) { + component.inject(this); + } + @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragment.java index 71097a6c3..c7bb27946 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragment.java @@ -1,6 +1,7 @@ package com.habitrpg.android.habitica.ui.fragments.tasks; import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.events.commands.AddNewTaskCommand; import com.habitrpg.android.habitica.ui.menu.DividerItemDecoration; import com.habitrpg.android.habitica.ui.adapter.tasks.BaseTasksRecyclerViewAdapter; @@ -86,6 +87,11 @@ public class TaskRecyclerViewFragment extends BaseFragment implements View.OnCli return view; } + @Override + public void injectFragment(AppComponent component) { + component.inject(this); + } + LinearLayoutManager layoutManager = null; @Override diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.java index 9e282f6cd..1be5a16a9 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.java @@ -8,6 +8,7 @@ import com.habitrpg.android.habitica.callbacks.HabitRPGUserCallback; import com.habitrpg.android.habitica.callbacks.TaskCreationCallback; import com.habitrpg.android.habitica.callbacks.TaskScoringCallback; import com.habitrpg.android.habitica.callbacks.TaskUpdateCallback; +import com.habitrpg.android.habitica.components.AppComponent; import com.habitrpg.android.habitica.events.HabitScoreEvent; import com.habitrpg.android.habitica.events.TaskSaveEvent; import com.habitrpg.android.habitica.events.TaskTappedEvent; @@ -124,6 +125,7 @@ public class TasksFragment extends BaseMainFragment implements OnCheckedChangeLi @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + this.usesTabLayout = true; this.displayingTaskForm = false; super.onCreateView(inflater, container, savedInstanceState); @@ -154,6 +156,11 @@ public class TasksFragment extends BaseMainFragment implements OnCheckedChangeLi return v; } + @Override + public void injectFragment(AppComponent component) { + component.inject(this); + } + @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.menu_main_activity, menu); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/UpdateWidgetService.java b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/UpdateWidgetService.java index fd100c5c1..1fb4946cc 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/widget/UpdateWidgetService.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/widget/UpdateWidgetService.java @@ -1,12 +1,14 @@ package com.habitrpg.android.habitica.widget; import com.habitrpg.android.habitica.APIHelper; +import com.habitrpg.android.habitica.HabiticaApplication; import com.habitrpg.android.habitica.HostConfig; import com.habitrpg.android.habitica.R; import com.habitrpg.android.habitica.callbacks.HabitRPGUserCallback; import com.habitrpg.android.habitica.ui.activities.MainActivity; import com.habitrpg.android.habitica.ui.activities.PrefsActivity; import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; +import com.raizlabs.android.dbflow.sql.language.Update; import android.app.PendingIntent; import android.app.Service; @@ -17,6 +19,8 @@ import android.os.IBinder; import android.util.Log; import android.widget.RemoteViews; +import javax.inject.Inject; + /** * The service that should update the simple widget * @@ -26,30 +30,30 @@ import android.widget.RemoteViews; public class UpdateWidgetService extends Service implements HabitRPGUserCallback.OnUserReceived { private static final String LOG = ".simplewidget.service"; private AppWidgetManager appWidgetManager; - private APIHelper apiHelper; + + @Inject + public APIHelper apiHelper; + + public UpdateWidgetService() { + super(); + ((HabiticaApplication)getApplication()).getComponent().inject(this); + } @Override public int onStartCommand(final Intent intent, int flags, int startId) { - Log.i(LOG, "Service onStart Called"); - this.appWidgetManager = AppWidgetManager.getInstance(this); int[] allWidgetIds = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS); ComponentName thisWidget = new ComponentName(this, SimpleWidget.class); int[] allWidgetIds2 = appWidgetManager.getAppWidgetIds(thisWidget); - Log.w(LOG, "From Intent" + String.valueOf(allWidgetIds.length)); - Log.w(LOG, "Direct" + String.valueOf(allWidgetIds2.length)); - HostConfig hc = PrefsActivity.fromContext(this); - if (hc != null && hc.getApi() != null && !hc.getApi().equals("") && hc.getUser() != null && !hc.getUser().equals("")) { - this.apiHelper = new APIHelper(hc); + if (apiHelper != null) { apiHelper.retrieveUser(true).subscribe(new HabitRPGUserCallback(this)); for (int widgetId : allWidgetIds) { RemoteViews remoteViews = new RemoteViews(this.getPackageName(), R.layout.simple_widget); appWidgetManager.updateAppWidget(widgetId, remoteViews); } } else { - Log.w(LOG, "HostConfig is null"); for (int widgetId : allWidgetIds) { RemoteViews remoteViews = new RemoteViews(this.getPackageName(), R.layout.simple_widget); RemoteViews textConnect = new RemoteViews(this.getPackageName(), R.layout.simple_textview); diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java index abe8db7fc..b3b04b0ee 100644 --- a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java +++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java @@ -6,6 +6,8 @@ import com.magicmicky.habitrpgwrapper.lib.models.Group; import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; import com.magicmicky.habitrpgwrapper.lib.models.Items; import com.magicmicky.habitrpgwrapper.lib.models.PostChatMessageResult; +import com.magicmicky.habitrpgwrapper.lib.models.PurchaseValidationRequest; +import com.magicmicky.habitrpgwrapper.lib.models.PurchaseValidationResult; import com.magicmicky.habitrpgwrapper.lib.models.Quest; import com.magicmicky.habitrpgwrapper.lib.models.Status; import com.magicmicky.habitrpgwrapper.lib.models.Tag; @@ -25,6 +27,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import retrofit2.Call; import retrofit2.http.Body; import retrofit2.http.DELETE; import retrofit2.http.GET; @@ -206,4 +209,8 @@ public interface ApiService { @POST("groups/{gid}/quests/leave") Observable leaveQuest(@Path("gid") String groupId); + + @POST("/iap/android/verify") + Call validatePurchase(@Body PurchaseValidationRequest request); + } diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/InAppPurchasesApiService.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/InAppPurchasesApiService.java deleted file mode 100644 index 2fa64a8b1..000000000 --- a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/InAppPurchasesApiService.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.magicmicky.habitrpgwrapper.lib.api; - -import com.magicmicky.habitrpgwrapper.lib.models.PurchaseValidationRequest; -import com.magicmicky.habitrpgwrapper.lib.models.PurchaseValidationResult; - -import retrofit2.Call; -import retrofit2.http.Body; -import retrofit2.http.POST; -import retrofit2.http.Query; - - -/** - * Created by Negue on 27.11.2015. - */ -public interface InAppPurchasesApiService { - @POST("iap/android/verify") - Call validatePurchase(@Query("_id") String id, @Query("apiToken") String apiToken, @Body PurchaseValidationRequest request); -} diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/BooleanAsIntAdapter.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/BooleanAsIntAdapter.java new file mode 100644 index 000000000..1c5ecf577 --- /dev/null +++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/BooleanAsIntAdapter.java @@ -0,0 +1,38 @@ +package com.magicmicky.habitrpgwrapper.lib.utils; + +import com.google.gson.TypeAdapter; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonToken; +import com.google.gson.stream.JsonWriter; + +import java.io.IOException; + +public class BooleanAsIntAdapter extends TypeAdapter { + + @Override + public void write(JsonWriter out, Boolean value) throws IOException { + if (value == null) { + out.nullValue(); + } else { + out.value(value); + } + } + + @Override + public Boolean read(JsonReader in) throws IOException { + JsonToken peek = in.peek(); + switch (peek) { + case BOOLEAN: + return in.nextBoolean(); + case NULL: + in.nextNull(); + return null; + case NUMBER: + return in.nextInt() != 0; + case STRING: + return Boolean.parseBoolean(in.nextString()); + default: + throw new IllegalStateException("Expected BOOLEAN or NUMBER but was " + peek); + } + } +}