begin using dagger

This commit is contained in:
Phillip Thelen 2016-06-02 10:58:22 +02:00
parent c8a44f28a9
commit e5cc8cf09d
57 changed files with 785 additions and 256 deletions

View file

@ -2,7 +2,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.habitrpg.android.habitica"
android:versionCode="84"
android:versionCode="86"
android:versionName="0.0.30.1"
android:screenOrientation="portrait"
android:installLocation="auto" >

View file

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

View file

@ -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<Throwable> {
// 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<Throwable> {
//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<List<TaskTag>>() {
}.getType();
Type skillListType = new TypeToken<List<Skill>>() {}.getType();
Type customizationListType = new TypeToken<List<Customization>>() {}.getType();
Type tutorialStepListType = new TypeToken<List<TutorialStep>>() {}.getType();
Type faqArticleListType = new TypeToken<List<FAQArticle>>() {}.getType();
Type itemDataListType = new TypeToken<List<ItemData>>() {}.getType();
Type eggListType = new TypeToken<List<Egg>>() {}.getType();
Type foodListType = new TypeToken<List<Food>>() {}.getType();
Type hatchingPotionListType = new TypeToken<List<HatchingPotion>>() {}.getType();
Type questContentListType = new TypeToken<List<QuestContent>>() {}.getType();
Type petListType = new TypeToken<HashMap<String, Pet>>() {}.getType();
Type mountListType = new TypeToken<HashMap<String, Mount>>() {}.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<Throwable> {
.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<Throwable> {
})
.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<Throwable> {
.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<Boolean> booleanAsIntAdapter = new TypeAdapter<Boolean>() {
@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<UserAuthResponse> 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<Throwable> {
}
public PurchaseValidationResult validatePurchase(PurchaseValidationRequest request) throws IOException {
Call<PurchaseValidationResult> response = inAppPurchasesService.validatePurchase(cfg.getUser(), cfg.getApi(), request);
Call<PurchaseValidationResult> response = apiService.validatePurchase(request);
return response.execute().body();
}
@ -430,4 +270,12 @@ public class APIHelper implements Action1<Throwable> {
public <T> Observable.Transformer<T, T> configureApiCallObserver() {
return (Observable.Transformer<T, T>) 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());
}
}

View file

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

View file

@ -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<br />
* 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

View file

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

View file

@ -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<List<TaskTag>>() {}.getType();
Type skillListType = new TypeToken<List<Skill>>() {}.getType();
Type customizationListType = new TypeToken<List<Customization>>() {}.getType();
Type tutorialStepListType = new TypeToken<List<TutorialStep>>() {}.getType();
Type faqArticleListType = new TypeToken<List<FAQArticle>>() {}.getType();
Type itemDataListType = new TypeToken<List<ItemData>>() {}.getType();
Type eggListType = new TypeToken<List<Egg>>() {}.getType();
Type foodListType = new TypeToken<List<Food>>() {}.getType();
Type hatchingPotionListType = new TypeToken<List<HatchingPotion>>() {}.getType();
Type questContentListType = new TypeToken<List<QuestContent>>() {}.getType();
Type petListType = new TypeToken<HashMap<String, Pet>>() {}.getType();
Type mountListType = new TypeToken<HashMap<String, Mount>>() {}.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);
}
}

View file

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

View file

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

View file

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

View file

@ -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<Habi
}
}
@Override
protected void injectActivity(AppComponent component) {
component.inject(this);
}
public HabitRPGUser makeUser(Preferences preferences, Outfit outfit) {
HabitRPGUser user = new HabitRPGUser();
user.setPreferences(preferences);

View file

@ -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.ui.helpers.UiUtils;
import com.habitrpg.android.habitica.ui.helpers.MarkdownParser;
@ -120,6 +121,12 @@ public class GroupFormActivity extends BaseActivity {
}
}
@Override
protected void injectActivity(AppComponent component) {
component.inject(this);
}
private void fillForm() {
this.groupNameEditText.setText(this.groupName);
this.groupDescriptionEditText.setText(this.groupDescription);

View file

@ -3,6 +3,7 @@ package com.habitrpg.android.habitica.ui.activities;
import com.habitrpg.android.habitica.APIHelper;
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.setup.IntroFragment;
import com.viewpagerindicator.CirclePageIndicator;
@ -15,6 +16,8 @@ import android.support.v4.view.ViewPager;
import android.view.View;
import android.widget.Button;
import javax.inject.Inject;
import butterknife.BindView;
public class IntroActivity extends BaseActivity implements View.OnClickListener, ViewPager.OnPageChangeListener {
@ -31,6 +34,9 @@ public class IntroActivity extends BaseActivity implements View.OnClickListener,
@BindView(R.id.finishButton)
Button finishButton;
@Inject
public APIHelper apiHelper;
@Override
protected int getLayoutResId() {
return R.layout.activity_intro;
@ -40,19 +46,24 @@ public class IntroActivity extends BaseActivity implements View.OnClickListener,
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getHabiticaApplication().getComponent().inject(this);
setupIntro();
indicator.setViewPager(pager);
this.skipButton.setOnClickListener(this);
this.finishButton.setOnClickListener(this);
HostConfig hostConfig = PrefsActivity.fromContext(this);
APIHelper apiHelper = new APIHelper(hostConfig);
apiHelper.apiService.getContent()
.compose(apiHelper.configureApiCallObserver())
.subscribe(contentResult -> {}, throwable -> {});
}
@Override
protected void injectActivity(AppComponent component) {
component.inject(this);
}
private void setupIntro() {
android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();

View file

@ -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<UserAuthResponse>, 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");

View file

@ -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<Throwable>, 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<Throwable>, 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<Throwable>, 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<Throwable>, 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<Throwable>, Ha
}
private void checkMaintenance() {
this.apiHelper.maintenanceService.getMaintenanceStatus()
this.maintenanceService.getMaintenanceStatus()
.compose(apiHelper.configureApiCallObserver())
.subscribe(maintenanceResponse -> {
if (maintenanceResponse.activeMaintenance) {

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -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"},

View file

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

View file

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

View file

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

View file

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

View file

@ -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<Group> {
return v;
}
@Override
public void injectFragment(AppComponent component) {
component.inject(this);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -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<Void> leaveQuest(@Path("gid") String groupId);
@POST("/iap/android/verify")
Call<PurchaseValidationResult> validatePurchase(@Body PurchaseValidationRequest request);
}

View file

@ -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<PurchaseValidationResult> validatePurchase(@Query("_id") String id, @Query("apiToken") String apiToken, @Body PurchaseValidationRequest request);
}

View file

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