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" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
package="com.habitrpg.android.habitica" package="com.habitrpg.android.habitica"
android:versionCode="84" android:versionCode="86"
android:versionName="0.0.30.1" android:versionName="0.0.30.1"
android:screenOrientation="portrait" android:screenOrientation="portrait"
android:installLocation="auto" > android:installLocation="auto" >

View file

@ -63,6 +63,10 @@ dependencies {
compile 'com.jakewharton:butterknife:8.0.1' compile 'com.jakewharton:butterknife:8.0.1'
apt 'com.jakewharton:butterknife-compiler: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 //App Compatibility and Material Design
compile('com.mikepenz:materialdrawer:5.2.6@aar') { compile('com.mikepenz:materialdrawer:5.2.6@aar') {
transitive = true transitive = true

View file

@ -1,86 +1,29 @@
package com.habitrpg.android.habitica; 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.amplitude.api.Amplitude;
import com.crashlytics.android.Crashlytics; 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.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.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.HabitRPGUser;
import com.magicmicky.habitrpgwrapper.lib.models.PurchaseValidationRequest; import com.magicmicky.habitrpgwrapper.lib.models.PurchaseValidationRequest;
import com.magicmicky.habitrpgwrapper.lib.models.PurchaseValidationResult; 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.UserAuth;
import com.magicmicky.habitrpgwrapper.lib.models.UserAuthResponse; import com.magicmicky.habitrpgwrapper.lib.models.UserAuthResponse;
import com.magicmicky.habitrpgwrapper.lib.models.UserAuthSocial; import com.magicmicky.habitrpgwrapper.lib.models.UserAuthSocial;
import com.magicmicky.habitrpgwrapper.lib.models.UserAuthSocialTokens; 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.Task;
import com.magicmicky.habitrpgwrapper.lib.models.tasks.TaskList; 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.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import android.app.Activity; import android.app.Activity;
import android.support.v7.app.AlertDialog; import android.support.v7.app.AlertDialog;
import android.util.Log;
import java.io.IOException; import java.io.IOException;
import java.lang.annotation.Annotation; import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.net.ConnectException; import java.net.ConnectException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; 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 // I think we don't need the APIHelper anymore we could just use ApiService
public final ApiService apiService; public final ApiService apiService;
private final InAppPurchasesApiService inAppPurchasesService;
public final MaintenanceApiService maintenanceService;
private final GsonConverterFactory gsonConverter; private final GsonConverterFactory gsonConverter;
private final HostConfig hostConfig;
private final Retrofit retrofitAdapter; private final Retrofit retrofitAdapter;
private HostConfig cfg;
final Observable.Transformer apiCallTransformer = final Observable.Transformer apiCallTransformer =
observable -> ((Observable)observable).subscribeOn(Schedulers.io()) observable -> ((Observable)observable).subscribeOn(Schedulers.io())
@ -122,67 +63,12 @@ public class APIHelper implements Action1<Throwable> {
//private OnHabitsAPIResult mResultListener; //private OnHabitsAPIResult mResultListener;
//private HostConfig mConfig; //private HostConfig mConfig;
public APIHelper(final HostConfig cfg) { public APIHelper(GsonConverterFactory gsonConverter, HostConfig hostConfig) {
this.cfg = cfg; this.gsonConverter = gsonConverter;
Crashlytics.getInstance().core.setUserIdentifier(cfg.getUser()); this.hostConfig = hostConfig;
Crashlytics.getInstance().core.setUserName(cfg.getUser()); Crashlytics.getInstance().core.setUserIdentifier(this.hostConfig.getUser());
Amplitude.getInstance().setUserId(cfg.getUser()); Crashlytics.getInstance().core.setUserName(this.hostConfig.getUser());
Amplitude.getInstance().setUserId(this.hostConfig.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();
Interceptor remove_data_interceptor = chain -> { Interceptor remove_data_interceptor = chain -> {
Response response = chain.proceed(chain.request()); Response response = chain.proceed(chain.request());
@ -218,10 +104,10 @@ public class APIHelper implements Action1<Throwable> {
.addInterceptor(logging) .addInterceptor(logging)
.addNetworkInterceptor(chain -> { .addNetworkInterceptor(chain -> {
Request original = chain.request(); Request original = chain.request();
if (cfg.getUser() != null) { if (this.hostConfig.getUser() != null) {
Request request = original.newBuilder() Request request = original.newBuilder()
.header("x-api-key", cfg.getApi()) .header("x-api-key", this.hostConfig.getApi())
.header("x-api-user", cfg.getUser()) .header("x-api-user", this.hostConfig.getUser())
.header("x-client", "habitica-android") .header("x-client", "habitica-android")
.method(original.method(), original.body()) .method(original.method(), original.body())
.build(); .build();
@ -232,10 +118,7 @@ public class APIHelper implements Action1<Throwable> {
}) })
.build(); .build();
Server server = new Server(this.hostConfig.getAddress());
gsonConverter = GsonConverterFactory.create(gson);
Server server = new Server(cfg.getAddress());
retrofitAdapter = new Retrofit.Builder() retrofitAdapter = new Retrofit.Builder()
.client(client) .client(client)
.baseUrl(server.toString()) .baseUrl(server.toString())
@ -243,51 +126,8 @@ public class APIHelper implements Action1<Throwable> {
.addConverterFactory(gsonConverter) .addConverterFactory(gsonConverter)
.build(); .build();
this.apiService = retrofitAdapter.create(ApiService.class); 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) { public Observable<UserAuthResponse> registerUser(String username, String email, String password, String confirmPassword) {
UserAuth auth = new UserAuth(); UserAuth auth = new UserAuth();
auth.setUsername(username); auth.setUsername(username);
@ -422,7 +262,7 @@ public class APIHelper implements Action1<Throwable> {
} }
public PurchaseValidationResult validatePurchase(PurchaseValidationRequest request) throws IOException { 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(); return response.execute().body();
} }
@ -430,4 +270,12 @@ public class APIHelper implements Action1<Throwable> {
public <T> Observable.Transformer<T, T> configureApiCallObserver() { public <T> Observable.Transformer<T, T> configureApiCallObserver() {
return (Observable.Transformer<T, T>) apiCallTransformer; 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.Crashlytics;
import com.crashlytics.android.core.CrashlyticsCore; import com.crashlytics.android.core.CrashlyticsCore;
import com.facebook.FacebookSdk; import com.facebook.FacebookSdk;
import com.habitrpg.android.habitica.components.AppComponent;
import com.facebook.drawee.backends.pipeline.Fresco; 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.IntroActivity;
import com.habitrpg.android.habitica.ui.activities.LoginActivity; import com.habitrpg.android.habitica.ui.activities.LoginActivity;
import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser;
@ -36,6 +40,9 @@ import java.io.File;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.Arrays; import java.util.Arrays;
import javax.inject.Inject;
import dagger.Lazy;
import io.fabric.sdk.android.Fabric; import io.fabric.sdk.android.Fabric;
public class HabiticaApplication extends MultiDexApplication { public class HabiticaApplication extends MultiDexApplication {
@ -44,6 +51,10 @@ public class HabiticaApplication extends MultiDexApplication {
public static HabitRPGUser User; public static HabitRPGUser User;
public static APIHelper ApiHelper; public static APIHelper ApiHelper;
public static Activity currentActivity = null; public static Activity currentActivity = null;
private AppComponent component;
@Inject
Lazy<APIHelper> lazyApiHelper;
public static HabiticaApplication getInstance(Context context) { public static HabiticaApplication getInstance(Context context) {
return (HabiticaApplication) context.getApplicationContext(); return (HabiticaApplication) context.getApplicationContext();
@ -52,6 +63,7 @@ public class HabiticaApplication extends MultiDexApplication {
@Override @Override
public void onCreate() { public void onCreate() {
super.onCreate(); super.onCreate();
setupDagger();
setupLeakCanary(); setupLeakCanary();
setupFlowManager(); setupFlowManager();
setupFacebookSdk(); setupFacebookSdk();
@ -59,10 +71,15 @@ public class HabiticaApplication extends MultiDexApplication {
createBillingAndCheckout(); createBillingAndCheckout();
registerActivityLifecycleCallbacks(); registerActivityLifecycleCallbacks();
Amplitude.getInstance().initialize(this, getString(R.string.amplitude_app_id)).enableForegroundTracking(this); Amplitude.getInstance().initialize(this, getString(R.string.amplitude_app_id)).enableForegroundTracking(this);
Fresco.initialize(this); Fresco.initialize(this);
} }
private void setupDagger() {
component = DaggerAppComponent.builder()
.appModule(new AppModule(this))
.build();
}
private void setupLeakCanary() { private void setupLeakCanary() {
// LeakCanary 1.3.1 has problems on Marshmallow; can remove check once updated with fixes // LeakCanary 1.3.1 has problems on Marshmallow; can remove check once updated with fixes
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { 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.putBoolean("use_reminder", use_reminder);
editor.putString("reminder_time", reminder_time); editor.putString("reminder_time", reminder_time);
editor.apply(); editor.apply();
getInstance(context).lazyApiHelper.get().updateAuthenticationCredentials(null, null);
startActivity(LoginActivity.class, context); startActivity(LoginActivity.class, context);
} }
@ -283,4 +301,8 @@ public class HabiticaApplication extends MultiDexApplication {
} }
// endregion // endregion
public AppComponent getComponent() {
return component;
}
} }

View file

@ -1,5 +1,9 @@
package com.habitrpg.android.habitica; package com.habitrpg.android.habitica;
import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
/** /**
* The configuration of the host<br /> * The configuration of the host<br />
* Currently, the Port isn't used at all. * Currently, the Port isn't used at all.
@ -10,6 +14,15 @@ public class HostConfig {
private String port; private String port;
private String api; private String api;
private String user; 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 * Create a new HostConfig
* @param address the address of the server * @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; package com.habitrpg.android.habitica.ui.activities;
import com.habitrpg.android.habitica.R; import com.habitrpg.android.habitica.R;
import com.habitrpg.android.habitica.components.AppComponent;
import com.habitrpg.android.habitica.ui.fragments.AboutFragment; import com.habitrpg.android.habitica.ui.fragments.AboutFragment;
import com.mikepenz.aboutlibraries.Libs; import com.mikepenz.aboutlibraries.Libs;
import com.mikepenz.aboutlibraries.LibsBuilder; import com.mikepenz.aboutlibraries.LibsBuilder;
@ -70,6 +71,10 @@ public class AboutActivity extends BaseActivity {
tabLayout.setupWithViewPager(pager); tabLayout.setupWithViewPager(pager);
} }
@Override
protected void injectActivity(AppComponent component) {
component.inject(this);
}
@Override @Override
public boolean onOptionsItemSelected(MenuItem item) { public boolean onOptionsItemSelected(MenuItem item) {

View file

@ -1,5 +1,8 @@
package com.habitrpg.android.habitica.ui.activities; 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.os.Bundle;
import android.support.v7.app.ActionBar; import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity; import android.support.v7.app.AppCompatActivity;
@ -20,10 +23,13 @@ public abstract class BaseActivity extends AppCompatActivity {
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
injectActivity(getHabiticaApplication().getComponent());
setContentView(getLayoutResId()); setContentView(getLayoutResId());
ButterKnife.bind(this); ButterKnife.bind(this);
} }
protected abstract void injectActivity(AppComponent component);
protected void setupToolbar(Toolbar toolbar) { protected void setupToolbar(Toolbar toolbar) {
if (toolbar != null) { if (toolbar != null) {
setSupportActionBar(toolbar); setSupportActionBar(toolbar);
@ -44,4 +50,8 @@ public abstract class BaseActivity extends AppCompatActivity {
destroyed = true; destroyed = true;
super.onDestroy(); 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.APIHelper;
import com.habitrpg.android.habitica.HabiticaApplication; import com.habitrpg.android.habitica.HabiticaApplication;
import com.habitrpg.android.habitica.R; 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.AvatarView;
import com.magicmicky.habitrpgwrapper.lib.models.Gear; import com.magicmicky.habitrpgwrapper.lib.models.Gear;
import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser;
@ -16,9 +17,6 @@ import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.support.v7.app.AlertDialog; import android.support.v7.app.AlertDialog;
import java.util.HashMap;
import java.util.Map;
import butterknife.BindView; import butterknife.BindView;
import butterknife.OnClick; import butterknife.OnClick;
import rx.functions.Action1; 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) { public HabitRPGUser makeUser(Preferences preferences, Outfit outfit) {
HabitRPGUser user = new HabitRPGUser(); HabitRPGUser user = new HabitRPGUser();
user.setPreferences(preferences); 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.EmojiEditText;
import com.github.data5tream.emojilib.EmojiPopup; import com.github.data5tream.emojilib.EmojiPopup;
import com.habitrpg.android.habitica.R; 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.UiUtils;
import com.habitrpg.android.habitica.ui.helpers.MarkdownParser; 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() { private void fillForm() {
this.groupNameEditText.setText(this.groupName); this.groupNameEditText.setText(this.groupName);
this.groupDescriptionEditText.setText(this.groupDescription); 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.APIHelper;
import com.habitrpg.android.habitica.HostConfig; import com.habitrpg.android.habitica.HostConfig;
import com.habitrpg.android.habitica.R; import com.habitrpg.android.habitica.R;
import com.habitrpg.android.habitica.components.AppComponent;
import com.habitrpg.android.habitica.ui.fragments.setup.IntroFragment; import com.habitrpg.android.habitica.ui.fragments.setup.IntroFragment;
import com.viewpagerindicator.CirclePageIndicator; import com.viewpagerindicator.CirclePageIndicator;
@ -15,6 +16,8 @@ import android.support.v4.view.ViewPager;
import android.view.View; import android.view.View;
import android.widget.Button; import android.widget.Button;
import javax.inject.Inject;
import butterknife.BindView; import butterknife.BindView;
public class IntroActivity extends BaseActivity implements View.OnClickListener, ViewPager.OnPageChangeListener { 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) @BindView(R.id.finishButton)
Button finishButton; Button finishButton;
@Inject
public APIHelper apiHelper;
@Override @Override
protected int getLayoutResId() { protected int getLayoutResId() {
return R.layout.activity_intro; return R.layout.activity_intro;
@ -40,19 +46,24 @@ public class IntroActivity extends BaseActivity implements View.OnClickListener,
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
getHabiticaApplication().getComponent().inject(this);
setupIntro(); setupIntro();
indicator.setViewPager(pager); indicator.setViewPager(pager);
this.skipButton.setOnClickListener(this); this.skipButton.setOnClickListener(this);
this.finishButton.setOnClickListener(this); this.finishButton.setOnClickListener(this);
HostConfig hostConfig = PrefsActivity.fromContext(this);
APIHelper apiHelper = new APIHelper(hostConfig);
apiHelper.apiService.getContent() apiHelper.apiService.getContent()
.compose(apiHelper.configureApiCallObserver()) .compose(apiHelper.configureApiCallObserver())
.subscribe(contentResult -> {}, throwable -> {}); .subscribe(contentResult -> {}, throwable -> {});
} }
@Override
protected void injectActivity(AppComponent component) {
component.inject(this);
}
private void setupIntro() { private void setupIntro() {
android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager(); 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.facebook.login.widget.LoginButton;
import com.habitrpg.android.habitica.APIHelper; import com.habitrpg.android.habitica.APIHelper;
import com.habitrpg.android.habitica.BuildConfig; import com.habitrpg.android.habitica.BuildConfig;
import com.habitrpg.android.habitica.HostConfig;
import com.habitrpg.android.habitica.R; import com.habitrpg.android.habitica.R;
import com.habitrpg.android.habitica.callbacks.HabitRPGUserCallback; 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.IntentIntegrator;
import com.habitrpg.android.habitica.prefs.scanner.IntentResult; import com.habitrpg.android.habitica.prefs.scanner.IntentResult;
import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser;
@ -26,7 +26,6 @@ import android.graphics.Color;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.support.design.widget.Snackbar; import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.preference.PreferenceManager; import android.support.v7.preference.PreferenceManager;
import android.text.SpannableString; import android.text.SpannableString;
import android.text.style.UnderlineSpan; import android.text.style.UnderlineSpan;
@ -41,6 +40,8 @@ import android.widget.ProgressBar;
import android.widget.TableRow; import android.widget.TableRow;
import android.widget.TextView; import android.widget.TextView;
import javax.inject.Inject;
import butterknife.BindView; import butterknife.BindView;
import butterknife.ButterKnife; import butterknife.ButterKnife;
import rx.functions.Action1; import rx.functions.Action1;
@ -48,13 +49,16 @@ import rx.functions.Action1;
/** /**
* @author Mickael Goubin * @author Mickael Goubin
*/ */
public class LoginActivity extends AppCompatActivity public class LoginActivity extends BaseActivity
implements Action1<UserAuthResponse>, HabitRPGUserCallback.OnUserReceived { implements Action1<UserAuthResponse>, HabitRPGUserCallback.OnUserReceived {
private final static String TAG_ADDRESS="address"; private final static String TAG_ADDRESS="address";
private final static String TAG_USERID="user"; private final static String TAG_USERID="user";
private final static String TAG_APIKEY="key"; private final static String TAG_APIKEY="key";
private APIHelper apiHelper; @Inject
public APIHelper apiHelper;
@Inject
public SharedPreferences sharedPrefs;
public String mTmpUserToken; public String mTmpUserToken;
public String mTmpApiToken; public String mTmpApiToken;
public Boolean isRegistering; public Boolean isRegistering;
@ -92,9 +96,13 @@ public class LoginActivity extends AppCompatActivity
@BindView(R.id.forgot_pw_tv) @BindView(R.id.forgot_pw_tv)
TextView mForgotPWTV; TextView mForgotPWTV;
protected void onCreate(Bundle savedInstanceState) { @Override
protected int getLayoutResId() {
return R.layout.activity_login;
}
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
//Set default values to avoid null-responses when requesting unedited settings //Set default values to avoid null-responses when requesting unedited settings
PreferenceManager.setDefaultValues(this, R.xml.preferences_fragment, false); PreferenceManager.setDefaultValues(this, R.xml.preferences_fragment, false);
@ -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; this.isRegistering = true;
JSONObject eventProperties = new JSONObject(); JSONObject eventProperties = new JSONObject();
@ -151,7 +153,12 @@ public class LoginActivity extends AppCompatActivity
Amplitude.getInstance().logEvent("navigate", eventProperties); 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.isRegistering) {
if (this.mEmailRow.getVisibility() == View.GONE) { if (this.mEmailRow.getVisibility() == View.GONE) {
show(this.mEmailRow); show(this.mEmailRow);
@ -323,11 +330,10 @@ startActivity(i);
} }
private void saveTokens(String api, String user) throws Exception { private void saveTokens(String api, String user) throws Exception {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(LoginActivity.this); this.apiHelper.updateAuthenticationCredentials(user, api);
SharedPreferences.Editor editor = prefs.edit(); SharedPreferences.Editor editor = sharedPrefs.edit();
boolean ans = editor.putString(getString(R.string.SP_APIToken), api) boolean ans = editor.putString(getString(R.string.SP_APIToken), api)
.putString(getString(R.string.SP_userID), user) .putString(getString(R.string.SP_userID), user)
.putString(getString(R.string.SP_address),BuildConfig.BASE_URL)
.commit(); .commit();
if(!ans) { if(!ans) {
throw new Exception("PB_string_commit"); 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.MergeUserCallback;
import com.habitrpg.android.habitica.callbacks.TaskScoringCallback; import com.habitrpg.android.habitica.callbacks.TaskScoringCallback;
import com.habitrpg.android.habitica.callbacks.UnlockCallback; 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.databinding.ValueBarBinding;
import com.habitrpg.android.habitica.events.ContentReloadedEvent; import com.habitrpg.android.habitica.events.ContentReloadedEvent;
import com.habitrpg.android.habitica.events.DisplayFragmentEvent; 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.fragments.GemsPurchaseFragment;
import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils; import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils;
import com.habitrpg.android.habitica.userpicture.BitmapUtils; 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.HabitRPGUser;
import com.magicmicky.habitrpgwrapper.lib.models.SuppressedModals; 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.TaskDirection;
import com.magicmicky.habitrpgwrapper.lib.models.TaskDirectionData; import com.magicmicky.habitrpgwrapper.lib.models.TaskDirectionData;
import com.magicmicky.habitrpgwrapper.lib.models.TutorialStep; 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.Drawer;
import com.mikepenz.materialdrawer.DrawerBuilder; import com.mikepenz.materialdrawer.DrawerBuilder;
import com.mikepenz.materialdrawer.model.PrimaryDrawerItem; 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.IDrawerItem;
import com.mikepenz.materialdrawer.model.interfaces.IProfile; import com.mikepenz.materialdrawer.model.interfaces.IProfile;
import com.raizlabs.android.dbflow.runtime.TransactionManager; import com.raizlabs.android.dbflow.runtime.TransactionManager;
@ -128,6 +129,8 @@ import java.util.Map;
import java.util.TimeZone; import java.util.TimeZone;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import javax.inject.Inject;
import butterknife.BindView; import butterknife.BindView;
import rx.functions.Action1; import rx.functions.Action1;
@ -156,12 +159,18 @@ public class MainActivity extends BaseActivity implements Action1<Throwable>, Ha
public ActivityCheckout checkout = null; public ActivityCheckout checkout = null;
private Drawer drawer; private Drawer drawer;
private Drawer filterDrawer; private Drawer filterDrawer;
@Inject
protected HostConfig hostConfig; protected HostConfig hostConfig;
@Inject
public APIHelper apiHelper;
@Inject
public MaintenanceApiService maintenanceService;
public HabitRPGUser user; public HabitRPGUser user;
private AccountHeader accountHeader; private AccountHeader accountHeader;
private BaseMainFragment activeFragment; private BaseMainFragment activeFragment;
private AvatarWithBarsViewModel avatarInHeader; private AvatarWithBarsViewModel avatarInHeader;
private APIHelper apiHelper;
private AlertDialog faintDialog; private AlertDialog faintDialog;
private AvatarView sideAvatarView; private AvatarView sideAvatarView;
@ -181,15 +190,12 @@ public class MainActivity extends BaseActivity implements Action1<Throwable>, Ha
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
this.hostConfig = PrefsActivity.fromContext(this);
if (!HabiticaApplication.checkUserAuthentication(this, hostConfig)) if (!HabiticaApplication.checkUserAuthentication(this, hostConfig))
return; return;
//Check if reminder alarm is set //Check if reminder alarm is set
scheduleReminder(this); scheduleReminder(this);
HabiticaApplication.ApiHelper = this.apiHelper = new APIHelper(hostConfig);
new Select().from(HabitRPGUser.class).where(Condition.column("id").eq(hostConfig.getUser())).async().querySingle(userTransactionListener); new Select().from(HabitRPGUser.class).where(Condition.column("id").eq(hostConfig.getUser())).async().querySingle(userTransactionListener);
setupToolbar(toolbar); setupToolbar(toolbar);
@ -213,6 +219,11 @@ public class MainActivity extends BaseActivity implements Action1<Throwable>, Ha
EventBus.getDefault().register(this); EventBus.getDefault().register(this);
} }
@Override
protected void injectActivity(AppComponent component) {
component.inject(this);
}
@Override @Override
protected void onResume() { protected void onResume() {
super.onResume(); super.onResume();
@ -269,7 +280,6 @@ public class MainActivity extends BaseActivity implements Action1<Throwable>, Ha
} }
this.activeFragment = fragment; this.activeFragment = fragment;
fragment.setArguments(getIntent().getExtras()); fragment.setArguments(getIntent().getExtras());
fragment.apiHelper = apiHelper;
fragment.setUser(user); fragment.setUser(user);
fragment.setActivity(this); fragment.setActivity(this);
fragment.setTabLayout(detail_tabs); fragment.setTabLayout(detail_tabs);
@ -1214,7 +1224,7 @@ public class MainActivity extends BaseActivity implements Action1<Throwable>, Ha
} }
private void checkMaintenance() { private void checkMaintenance() {
this.apiHelper.maintenanceService.getMaintenanceStatus() this.maintenanceService.getMaintenanceStatus()
.compose(apiHelper.configureApiCallObserver()) .compose(apiHelper.configureApiCallObserver())
.subscribe(maintenanceResponse -> { .subscribe(maintenanceResponse -> {
if (maintenanceResponse.activeMaintenance) { if (maintenanceResponse.activeMaintenance) {

View file

@ -2,9 +2,12 @@ package com.habitrpg.android.habitica.ui.activities;
import com.github.data5tream.emojilib.EmojiTextView; import com.github.data5tream.emojilib.EmojiTextView;
import com.habitrpg.android.habitica.APIHelper; import com.habitrpg.android.habitica.APIHelper;
import com.habitrpg.android.habitica.HabiticaApplication;
import com.habitrpg.android.habitica.HostConfig; import com.habitrpg.android.habitica.HostConfig;
import com.habitrpg.android.habitica.R; import com.habitrpg.android.habitica.R;
import com.habitrpg.android.habitica.components.AppComponent;
import com.habitrpg.android.habitica.ui.helpers.MarkdownParser; import com.habitrpg.android.habitica.ui.helpers.MarkdownParser;
import com.magicmicky.habitrpgwrapper.lib.api.MaintenanceApiService;
import com.squareup.picasso.Picasso; import com.squareup.picasso.Picasso;
import android.content.Intent; import android.content.Intent;
@ -16,8 +19,12 @@ import android.widget.Button;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import javax.inject.Inject;
import butterknife.BindView; import butterknife.BindView;
import butterknife.OnClick; import butterknife.OnClick;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
public class MaintenanceActivity extends BaseActivity { public class MaintenanceActivity extends BaseActivity {
@ -32,7 +39,10 @@ public class MaintenanceActivity extends BaseActivity {
@BindView(R.id.playStoreButton) @BindView(R.id.playStoreButton)
Button playStoreButton; Button playStoreButton;
private APIHelper apiHelper;
@Inject
public MaintenanceApiService maintenanceService;
private Boolean isDeprecationNotice; private Boolean isDeprecationNotice;
@Override @Override
@ -57,16 +67,20 @@ public class MaintenanceActivity extends BaseActivity {
} else { } else {
this.playStoreButton.setVisibility(View.GONE); this.playStoreButton.setVisibility(View.GONE);
} }
HostConfig hostConfig = PrefsActivity.fromContext(this); }
apiHelper = new APIHelper(hostConfig);
@Override
protected void injectActivity(AppComponent component) {
component.inject(this);
} }
@Override @Override
protected void onResume() { protected void onResume() {
super.onResume(); super.onResume();
if (!isDeprecationNotice) { if (!isDeprecationNotice) {
this.apiHelper.maintenanceService.getMaintenanceStatus() this.maintenanceService.getMaintenanceStatus()
.compose(this.apiHelper.configureApiCallObserver()) .subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(maintenanceResponse -> { .subscribe(maintenanceResponse -> {
if (!maintenanceResponse.activeMaintenance) { if (!maintenanceResponse.activeMaintenance) {
finish(); finish();

View file

@ -1,6 +1,7 @@
package com.habitrpg.android.habitica.ui.activities; package com.habitrpg.android.habitica.ui.activities;
import com.habitrpg.android.habitica.R; import com.habitrpg.android.habitica.R;
import com.habitrpg.android.habitica.components.AppComponent;
import com.habitrpg.android.habitica.ui.fragments.social.party.PartyInviteFragment; import com.habitrpg.android.habitica.ui.fragments.social.party.PartyInviteFragment;
import android.content.Intent; import android.content.Intent;
@ -41,6 +42,11 @@ public class PartyInviteActivity extends BaseActivity {
setViewPagerAdapter(); setViewPagerAdapter();
} }
@Override
protected void injectActivity(AppComponent component) {
component.inject(this);
}
@Override @Override
public boolean onCreateOptionsMenu(Menu menu) { 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.BuildConfig;
import com.habitrpg.android.habitica.HostConfig; import com.habitrpg.android.habitica.HostConfig;
import com.habitrpg.android.habitica.R; 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.AccountDetailsFragment;
import com.habitrpg.android.habitica.ui.fragments.preferences.PreferencesFragment; import com.habitrpg.android.habitica.ui.fragments.preferences.PreferencesFragment;
@ -38,6 +39,11 @@ public class PrefsActivity extends BaseActivity implements
.commit(); .commit();
} }
@Override
protected void injectActivity(AppComponent component) {
component.inject(this);
}
@Override @Override
public boolean onSupportNavigateUp() { public boolean onSupportNavigateUp() {
if (getSupportFragmentManager().getBackStackEntryCount() > 0) { 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.R;
import com.habitrpg.android.habitica.callbacks.HabitRPGUserCallback; import com.habitrpg.android.habitica.callbacks.HabitRPGUserCallback;
import com.habitrpg.android.habitica.callbacks.MergeUserCallback; 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.events.commands.UpdateUserCommand;
import com.habitrpg.android.habitica.ui.fragments.setup.AvatarSetupFragment; import com.habitrpg.android.habitica.ui.fragments.setup.AvatarSetupFragment;
import com.habitrpg.android.habitica.ui.fragments.setup.TaskSetupFragment; import com.habitrpg.android.habitica.ui.fragments.setup.TaskSetupFragment;
@ -30,6 +31,8 @@ import android.widget.Button;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import javax.inject.Inject;
import butterknife.BindView; import butterknife.BindView;
public class SetupActivity extends BaseActivity implements View.OnClickListener, ViewPager.OnPageChangeListener, HabitRPGUserCallback.OnUserReceived { 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; AvatarSetupFragment avatarSetupFragment;
TaskSetupFragment taskSetupFragment; TaskSetupFragment taskSetupFragment;
private APIHelper apiHelper; @Inject
public APIHelper apiHelper;
@Inject
protected HostConfig hostConfig; protected HostConfig hostConfig;
HabitRPGUser user; HabitRPGUser user;
Boolean completedSetup; Boolean completedSetup;
@ -62,14 +67,8 @@ public class SetupActivity extends BaseActivity implements View.OnClickListener,
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(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.user = new Select().from(HabitRPGUser.class).where(Condition.column("id").eq(hostConfig.getUser())).querySingle();
this.skipButton.setOnClickListener(this); this.skipButton.setOnClickListener(this);
this.nextButton.setOnClickListener(this); this.nextButton.setOnClickListener(this);
this.previousButton.setOnClickListener(this); this.previousButton.setOnClickListener(this);
@ -86,6 +85,11 @@ public class SetupActivity extends BaseActivity implements View.OnClickListener,
Amplitude.getInstance().logEvent("setup", eventProperties); Amplitude.getInstance().logEvent("setup", eventProperties);
} }
@Override
protected void injectActivity(AppComponent component) {
component.inject(this);
}
@Override @Override
protected void onStart() { protected void onStart() {
super.onStart(); super.onStart();

View file

@ -1,6 +1,7 @@
package com.habitrpg.android.habitica.ui.activities; package com.habitrpg.android.habitica.ui.activities;
import com.habitrpg.android.habitica.R; 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.adapter.SkillTasksRecyclerViewAdapter;
import com.habitrpg.android.habitica.ui.fragments.skills.SkillTasksRecyclerViewFragment; import com.habitrpg.android.habitica.ui.fragments.skills.SkillTasksRecyclerViewFragment;
import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser;
@ -40,6 +41,11 @@ public class SkillTasksActivity extends BaseActivity {
loadTaskLists(); loadTaskLists();
} }
@Override
protected void injectActivity(AppComponent component) {
component.inject(this);
}
public void loadTaskLists() { public void loadTaskLists() {
android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager(); 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.EmojiEditText;
import com.github.data5tream.emojilib.EmojiPopup; import com.github.data5tream.emojilib.EmojiPopup;
import com.habitrpg.android.habitica.R; 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.TaskSaveEvent;
import com.habitrpg.android.habitica.events.commands.DeleteTaskCommand; import com.habitrpg.android.habitica.events.commands.DeleteTaskCommand;
import com.habitrpg.android.habitica.ui.WrapContentRecyclerViewLayoutManager; 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) { private boolean isEmojiEditText(View view) {
return view instanceof EmojiEditText; return view instanceof EmojiEditText;
} }

View file

@ -1,7 +1,9 @@
package com.habitrpg.android.habitica.ui.fragments; package com.habitrpg.android.habitica.ui.fragments;
import com.amplitude.api.Amplitude; import com.amplitude.api.Amplitude;
import com.habitrpg.android.habitica.components.AppComponent;
import com.habitrpg.android.habitica.events.DisplayTutorialEvent; import com.habitrpg.android.habitica.events.DisplayTutorialEvent;
import com.habitrpg.android.habitica.ui.activities.MainActivity;
import com.magicmicky.habitrpgwrapper.lib.models.TutorialStep; import com.magicmicky.habitrpgwrapper.lib.models.TutorialStep;
import com.raizlabs.android.dbflow.runtime.transaction.BaseTransaction; import com.raizlabs.android.dbflow.runtime.transaction.BaseTransaction;
import com.raizlabs.android.dbflow.runtime.transaction.TransactionListener; import com.raizlabs.android.dbflow.runtime.transaction.TransactionListener;
@ -26,7 +28,7 @@ import java.util.Date;
import butterknife.ButterKnife; import butterknife.ButterKnife;
import butterknife.Unbinder; import butterknife.Unbinder;
public class BaseFragment extends DialogFragment { public abstract class BaseFragment extends DialogFragment {
private boolean registerEventBus = false; private boolean registerEventBus = false;
@ -63,6 +65,8 @@ public class BaseFragment extends DialogFragment {
@Override @Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
injectFragment(((MainActivity)getActivity()).getHabiticaApplication().getComponent());
// Receive Events // Receive Events
try { try {
EventBus.getDefault().register(this); EventBus.getDefault().register(this);
@ -74,6 +78,8 @@ public class BaseFragment extends DialogFragment {
return null; return null;
} }
public abstract void injectFragment(AppComponent component);
@CallSuper @CallSuper
@Override @Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {

View file

@ -15,12 +15,16 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import javax.inject.Inject;
public abstract class BaseMainFragment extends BaseFragment { public abstract class BaseMainFragment extends BaseFragment {
@Inject
public APIHelper apiHelper;
public MainActivity activity; public MainActivity activity;
public TabLayout tabLayout; public TabLayout tabLayout;
public FrameLayout floatingMenuWrapper; public FrameLayout floatingMenuWrapper;
public APIHelper apiHelper;
protected HabitRPGUser user; protected HabitRPGUser user;
public boolean usesTabLayout; public boolean usesTabLayout;
public int fragmentSidebarPosition; 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) { if (floatingMenuWrapper != null) {
floatingMenuWrapper.removeAllViews(); 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.HabiticaApplication;
import com.habitrpg.android.habitica.R; 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.events.BoughtGemsEvent;
import com.habitrpg.android.habitica.ui.helpers.ViewHelper; 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); return inflater.inflate(R.layout.fragment_gem_purchase, container, false);
} }
@Override
public void injectFragment(AppComponent component) {
component.inject(this);
}
@Override @Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, 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.BuildConfig;
import com.habitrpg.android.habitica.R; import com.habitrpg.android.habitica.R;
import com.habitrpg.android.habitica.components.AppComponent;
import android.os.Bundle; import android.os.Bundle;
import android.view.LayoutInflater; import android.view.LayoutInflater;
@ -33,4 +34,9 @@ public class NewsFragment extends BaseMainFragment {
return view; 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; package com.habitrpg.android.habitica.ui.fragments.faq;
import com.habitrpg.android.habitica.R; 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.fragments.BaseMainFragment;
import com.habitrpg.android.habitica.ui.helpers.MarkdownParser; import com.habitrpg.android.habitica.ui.helpers.MarkdownParser;
import com.magicmicky.habitrpgwrapper.lib.models.FAQArticle; import com.magicmicky.habitrpgwrapper.lib.models.FAQArticle;
@ -40,6 +41,10 @@ public class FAQDetailFragment extends BaseMainFragment {
return view; return view;
} }
@Override
public void injectFragment(AppComponent component) {
}
public void setArticle(FAQArticle article) { public void setArticle(FAQArticle article) {
this.article = article; this.article = article;
if (this.questionTextView != null) { if (this.questionTextView != null) {

View file

@ -1,6 +1,7 @@
package com.habitrpg.android.habitica.ui.fragments.faq; package com.habitrpg.android.habitica.ui.fragments.faq;
import com.habitrpg.android.habitica.R; 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.menu.DividerItemDecoration;
import com.habitrpg.android.habitica.ui.adapter.FAQOverviewRecyclerAdapter; import com.habitrpg.android.habitica.ui.adapter.FAQOverviewRecyclerAdapter;
import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment; import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment;
@ -42,7 +43,12 @@ public class FAQOverviewFragment extends BaseMainFragment {
return view; return view;
} }
private void loadArticles() { @Override
public void injectFragment(AppComponent component) {
component.inject(this);
}
private void loadArticles() {
if(user == null || adapter == null){ if(user == null || adapter == null){
return; return;
} }

View file

@ -1,6 +1,7 @@
package com.habitrpg.android.habitica.ui.fragments.inventory.customization; package com.habitrpg.android.habitica.ui.fragments.inventory.customization;
import com.habitrpg.android.habitica.R; 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.adapter.CustomizationRecyclerViewAdapter;
import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment; import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment;
import com.habitrpg.android.habitica.ui.helpers.MarginDecoration; import com.habitrpg.android.habitica.ui.helpers.MarginDecoration;
@ -76,6 +77,11 @@ public class AvatarCustomizationFragment extends BaseMainFragment {
return view; return view;
} }
@Override
public void injectFragment(AppComponent component) {
component.inject(this);
}
private void loadCustomizations() { private void loadCustomizations() {
if(user == null || adapter == null){ if(user == null || adapter == null){
return; 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.R;
import com.habitrpg.android.habitica.callbacks.MergeUserCallback; 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.databinding.FragmentAvatarOverviewBinding;
import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment; import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment;
import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser;
@ -100,6 +101,11 @@ public class AvatarOverviewFragment extends BaseMainFragment implements AdapterV
return view; return view;
} }
@Override
public void injectFragment(AppComponent component) {
component.inject(this);
}
private void displayCustomizationFragment(String type, String category) { private void displayCustomizationFragment(String type, String category) {
AvatarCustomizationFragment fragment = new AvatarCustomizationFragment(); AvatarCustomizationFragment fragment = new AvatarCustomizationFragment();
fragment.type = type; fragment.type = type;

View file

@ -1,6 +1,7 @@
package com.habitrpg.android.habitica.ui.fragments.inventory.equipment; package com.habitrpg.android.habitica.ui.fragments.inventory.equipment;
import com.habitrpg.android.habitica.R; 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.menu.DividerItemDecoration;
import com.habitrpg.android.habitica.ui.adapter.inventory.EquipmentRecyclerViewAdapter; import com.habitrpg.android.habitica.ui.adapter.inventory.EquipmentRecyclerViewAdapter;
import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment; import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment;
@ -54,6 +55,11 @@ public class EquipmentDetailFragment extends BaseMainFragment {
return v; return v;
} }
@Override
public void injectFragment(AppComponent component) {
component.inject(this);
}
private void loadGear() { private void loadGear() {
if(user == null || adapter == null){ if(user == null || adapter == null){
return; return;

View file

@ -1,6 +1,7 @@
package com.habitrpg.android.habitica.ui.fragments.inventory.equipment; package com.habitrpg.android.habitica.ui.fragments.inventory.equipment;
import com.habitrpg.android.habitica.R; 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.databinding.FragmentEquipmentOverviewBinding;
import com.habitrpg.android.habitica.events.commands.UpdateUserCommand; import com.habitrpg.android.habitica.events.commands.UpdateUserCommand;
import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment; import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment;
@ -131,6 +132,11 @@ public class EquipmentOverviewFragment extends BaseMainFragment implements Trans
return v; return v;
} }
@Override
public void injectFragment(AppComponent component) {
component.inject(this);
}
private void displayEquipmentDetailList(String type, String equipped, Boolean isCostume) { private void displayEquipmentDetailList(String type, String equipped, Boolean isCostume) {
EquipmentDetailFragment fragment = new EquipmentDetailFragment(); EquipmentDetailFragment fragment = new EquipmentDetailFragment();
fragment.type = type; fragment.type = type;

View file

@ -1,6 +1,7 @@
package com.habitrpg.android.habitica.ui.fragments.inventory.items; package com.habitrpg.android.habitica.ui.fragments.inventory.items;
import com.habitrpg.android.habitica.R; 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.ContentReloadedEvent;
import com.habitrpg.android.habitica.ui.menu.DividerItemDecoration; import com.habitrpg.android.habitica.ui.menu.DividerItemDecoration;
import com.habitrpg.android.habitica.ui.adapter.inventory.ItemRecyclerAdapter; import com.habitrpg.android.habitica.ui.adapter.inventory.ItemRecyclerAdapter;
@ -114,6 +115,11 @@ public class ItemRecyclerFragment extends BaseFragment {
return view; return view;
} }
@Override
public void injectFragment(AppComponent component) {
component.inject(this);
}
@Override @Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState); super.onViewCreated(view, savedInstanceState);

View file

@ -1,6 +1,7 @@
package com.habitrpg.android.habitica.ui.fragments.inventory.items; package com.habitrpg.android.habitica.ui.fragments.inventory.items;
import com.habitrpg.android.habitica.R; 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.HatchingCommand;
import com.habitrpg.android.habitica.events.commands.InvitePartyToQuestCommand; import com.habitrpg.android.habitica.events.commands.InvitePartyToQuestCommand;
import com.habitrpg.android.habitica.events.commands.OpenMenuItemCommand; import com.habitrpg.android.habitica.events.commands.OpenMenuItemCommand;
@ -38,6 +39,11 @@ public class ItemsFragment extends BaseMainFragment {
return v; return v;
} }
@Override
public void injectFragment(AppComponent component) {
component.inject(this);
}
public void setViewPagerAdapter() { public void setViewPagerAdapter() {
android.support.v4.app.FragmentManager fragmentManager = getChildFragmentManager(); android.support.v4.app.FragmentManager fragmentManager = getChildFragmentManager();

View file

@ -1,6 +1,7 @@
package com.habitrpg.android.habitica.ui.fragments.inventory.stable; package com.habitrpg.android.habitica.ui.fragments.inventory.stable;
import com.habitrpg.android.habitica.R; 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.adapter.inventory.MountDetailRecyclerAdapter;
import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment; import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment;
import com.habitrpg.android.habitica.ui.helpers.MarginDecoration; import com.habitrpg.android.habitica.ui.helpers.MarginDecoration;
@ -62,6 +63,11 @@ public class MountDetailRecyclerFragment extends BaseMainFragment {
return view; return view;
} }
@Override
public void injectFragment(AppComponent component) {
component.inject(this);
}
@Override @Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState); super.onViewCreated(view, savedInstanceState);

View file

@ -1,6 +1,7 @@
package com.habitrpg.android.habitica.ui.fragments.inventory.stable; package com.habitrpg.android.habitica.ui.fragments.inventory.stable;
import com.habitrpg.android.habitica.R; 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.events.commands.FeedCommand;
import com.habitrpg.android.habitica.ui.adapter.inventory.PetDetailRecyclerAdapter; import com.habitrpg.android.habitica.ui.adapter.inventory.PetDetailRecyclerAdapter;
import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment; import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment;
@ -67,6 +68,11 @@ public class PetDetailRecyclerFragment extends BaseMainFragment {
return view; return view;
} }
@Override
public void injectFragment(AppComponent component) {
component.inject(this);
}
@Override @Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState); super.onViewCreated(view, savedInstanceState);

View file

@ -1,6 +1,7 @@
package com.habitrpg.android.habitica.ui.fragments.inventory.stable; package com.habitrpg.android.habitica.ui.fragments.inventory.stable;
import com.habitrpg.android.habitica.R; 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.fragments.BaseMainFragment;
import android.os.Bundle; import android.os.Bundle;
@ -31,6 +32,11 @@ public class StableFragment extends BaseMainFragment {
return v; return v;
} }
@Override
public void injectFragment(AppComponent component) {
component.inject(this);
}
public void setViewPagerAdapter() { public void setViewPagerAdapter() {
android.support.v4.app.FragmentManager fragmentManager = getChildFragmentManager(); android.support.v4.app.FragmentManager fragmentManager = getChildFragmentManager();

View file

@ -1,6 +1,7 @@
package com.habitrpg.android.habitica.ui.fragments.inventory.stable; package com.habitrpg.android.habitica.ui.fragments.inventory.stable;
import com.habitrpg.android.habitica.R; 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.ContentReloadedEvent;
import com.habitrpg.android.habitica.events.ReloadContentEvent; import com.habitrpg.android.habitica.events.ReloadContentEvent;
import com.habitrpg.android.habitica.ui.activities.MainActivity; import com.habitrpg.android.habitica.ui.activities.MainActivity;
@ -97,6 +98,11 @@ public class StableRecyclerFragment extends BaseFragment {
return view; return view;
} }
@Override
public void injectFragment(AppComponent component) {
component.inject(this);
}
@Override @Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState); super.onViewCreated(view, savedInstanceState);

View file

@ -1,6 +1,7 @@
package com.habitrpg.android.habitica.ui.fragments.setup; package com.habitrpg.android.habitica.ui.fragments.setup;
import com.habitrpg.android.habitica.R; 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.AvatarView;
import com.habitrpg.android.habitica.ui.activities.SetupActivity; import com.habitrpg.android.habitica.ui.activities.SetupActivity;
import com.habitrpg.android.habitica.ui.adapter.setup.CustomizationSetupAdapter; import com.habitrpg.android.habitica.ui.adapter.setup.CustomizationSetupAdapter;
@ -81,6 +82,11 @@ public class AvatarSetupFragment extends BaseFragment {
return view; return view;
} }
@Override
public void injectFragment(AppComponent component) {
component.inject(this);
}
@Override @Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState); super.onViewCreated(view, savedInstanceState);

View file

@ -1,6 +1,7 @@
package com.habitrpg.android.habitica.ui.fragments.setup; package com.habitrpg.android.habitica.ui.fragments.setup;
import com.habitrpg.android.habitica.R; import com.habitrpg.android.habitica.R;
import com.habitrpg.android.habitica.components.AppComponent;
import com.habitrpg.android.habitica.ui.fragments.BaseFragment; import com.habitrpg.android.habitica.ui.fragments.BaseFragment;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
@ -53,6 +54,11 @@ public class IntroFragment extends BaseFragment {
return v; return v;
} }
@Override
public void injectFragment(AppComponent component) {
component.inject(this);
}
public void setImage(Drawable image) { public void setImage(Drawable image) {
this.image = image; this.image = image;
if (this.imageView != null && image != null) { if (this.imageView != null && image != null) {

View file

@ -1,6 +1,7 @@
package com.habitrpg.android.habitica.ui.fragments.setup; package com.habitrpg.android.habitica.ui.fragments.setup;
import com.habitrpg.android.habitica.R; 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.activities.SetupActivity;
import com.habitrpg.android.habitica.ui.adapter.setup.TaskSetupAdapter; import com.habitrpg.android.habitica.ui.adapter.setup.TaskSetupAdapter;
import com.habitrpg.android.habitica.ui.fragments.BaseFragment; import com.habitrpg.android.habitica.ui.fragments.BaseFragment;
@ -56,6 +57,11 @@ public class TaskSetupFragment extends BaseFragment {
return view; return view;
} }
@Override
public void injectFragment(AppComponent component) {
component.inject(this);
}
private void setTasks() { private void setTasks() {
this.taskGroups = new String[][]{ this.taskGroups = new String[][]{
{getString(R.string.setup_group_work), "work"}, {getString(R.string.setup_group_work), "work"},

View file

@ -1,8 +1,10 @@
package com.habitrpg.android.habitica.ui.fragments.skills; package com.habitrpg.android.habitica.ui.fragments.skills;
import com.habitrpg.android.habitica.R; 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.events.commands.AddNewTaskCommand;
import com.habitrpg.android.habitica.ui.adapter.SkillTasksRecyclerViewAdapter; import com.habitrpg.android.habitica.ui.adapter.SkillTasksRecyclerViewAdapter;
import com.habitrpg.android.habitica.ui.fragments.BaseFragment;
import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.EventBus;
@ -15,7 +17,7 @@ import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; 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 mRecyclerView;
public RecyclerView.Adapter mAdapter; public RecyclerView.Adapter mAdapter;
private String classType; private String classType;
@ -35,7 +37,12 @@ public class SkillTasksRecyclerViewFragment extends Fragment implements View.OnC
return view; return view;
} }
LinearLayoutManager layoutManager = null; @Override
public void injectFragment(AppComponent component) {
component.inject(this);
}
LinearLayoutManager layoutManager = null;
@Override @Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 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.R;
import com.habitrpg.android.habitica.callbacks.MergeUserCallback; import com.habitrpg.android.habitica.callbacks.MergeUserCallback;
import com.habitrpg.android.habitica.callbacks.SkillCallback; 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.SkillUsedEvent;
import com.habitrpg.android.habitica.events.commands.UseSkillCommand; import com.habitrpg.android.habitica.events.commands.UseSkillCommand;
import com.habitrpg.android.habitica.ui.helpers.UiUtils; import com.habitrpg.android.habitica.ui.helpers.UiUtils;
@ -58,6 +59,11 @@ public class SkillsFragment extends BaseMainFragment {
return view; return view;
} }
@Override
public void injectFragment(AppComponent component) {
component.inject(this);
}
@BindView(R.id.recyclerView) @BindView(R.id.recyclerView)
RecyclerView mRecyclerView; 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.APIHelper;
import com.habitrpg.android.habitica.HabiticaApplication; import com.habitrpg.android.habitica.HabiticaApplication;
import com.habitrpg.android.habitica.R; 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.ToggledInnStateEvent;
import com.habitrpg.android.habitica.events.commands.DeleteChatMessageCommand; import com.habitrpg.android.habitica.events.commands.DeleteChatMessageCommand;
import com.habitrpg.android.habitica.events.commands.FlagChatMessageCommand; import com.habitrpg.android.habitica.events.commands.FlagChatMessageCommand;
@ -39,6 +40,8 @@ import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import javax.inject.Inject;
import butterknife.BindView; import butterknife.BindView;
import butterknife.ButterKnife; import butterknife.ButterKnife;
import rx.functions.Action1; import rx.functions.Action1;
@ -48,7 +51,9 @@ public class ChatListFragment extends BaseFragment implements SwipeRefreshLayout
private Context ctx; private Context ctx;
private String groupId; private String groupId;
public String seenGroupId; public String seenGroupId;
private APIHelper apiHelper;
@Inject
public APIHelper apiHelper;
private HabitRPGUser user; private HabitRPGUser user;
private String userId; private String userId;
public boolean isTavern; public boolean isTavern;
@ -94,13 +99,14 @@ public class ChatListFragment extends BaseFragment implements SwipeRefreshLayout
if (view == null) if (view == null)
view = inflater.inflate(R.layout.fragment_chatlist, container, false); view = inflater.inflate(R.layout.fragment_chatlist, container, false);
if (apiHelper == null) {
apiHelper = new APIHelper(PrefsActivity.fromContext(getContext()));
}
return view; return view;
} }
@Override
public void injectFragment(AppComponent component) {
component.inject(this);
}
@BindView(R.id.chat_list) @BindView(R.id.chat_list)
RecyclerView mRecyclerView; 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.APIHelper;
import com.habitrpg.android.habitica.R; 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.FragmentGroupInfoBinding;
import com.habitrpg.android.habitica.databinding.ValueBarBinding; import com.habitrpg.android.habitica.databinding.ValueBarBinding;
import com.habitrpg.android.habitica.ui.adapter.social.QuestCollectRecyclerViewAdapter; import com.habitrpg.android.habitica.ui.adapter.social.QuestCollectRecyclerViewAdapter;
@ -99,6 +100,11 @@ public class GroupInformationFragment extends BaseFragment {
return view; return view;
} }
@Override
public void injectFragment(AppComponent component) {
component.inject(this);
}
@Override @Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState); super.onViewCreated(view, savedInstanceState);

View file

@ -1,6 +1,7 @@
package com.habitrpg.android.habitica.ui.fragments.social; package com.habitrpg.android.habitica.ui.fragments.social;
import com.habitrpg.android.habitica.R; 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.GroupFormActivity;
import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment; import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment;
import com.magicmicky.habitrpgwrapper.lib.models.Group; import com.magicmicky.habitrpgwrapper.lib.models.Group;
@ -60,6 +61,11 @@ public class GuildFragment extends BaseMainFragment implements Action1<Group> {
return v; return v;
} }
@Override
public void injectFragment(AppComponent component) {
component.inject(this);
}
@Override @Override
public void onViewCreated(View view, Bundle savedInstanceState) { public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState); super.onViewCreated(view, savedInstanceState);

View file

@ -1,6 +1,7 @@
package com.habitrpg.android.habitica.ui.fragments.social; package com.habitrpg.android.habitica.ui.fragments.social;
import com.habitrpg.android.habitica.R; 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.fragments.BaseMainFragment;
import com.magicmicky.habitrpgwrapper.lib.models.Group; import com.magicmicky.habitrpgwrapper.lib.models.Group;
@ -54,6 +55,11 @@ public class GuildsOverviewFragment extends BaseMainFragment implements View.OnC
return v; return v;
} }
@Override
public void injectFragment(AppComponent component) {
component.inject(this);
}
@Override @Override
public void onRefresh() { public void onRefresh() {
swipeRefreshLayout.setRefreshing(true); swipeRefreshLayout.setRefreshing(true);

View file

@ -1,6 +1,7 @@
package com.habitrpg.android.habitica.ui.fragments.social; package com.habitrpg.android.habitica.ui.fragments.social;
import com.habitrpg.android.habitica.R; 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.menu.DividerItemDecoration;
import com.habitrpg.android.habitica.ui.adapter.social.PublicGuildsRecyclerViewAdapter; import com.habitrpg.android.habitica.ui.adapter.social.PublicGuildsRecyclerViewAdapter;
import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment; import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment;
@ -51,6 +52,11 @@ public class PublicGuildsFragment extends BaseMainFragment {
return view; return view;
} }
@Override
public void injectFragment(AppComponent component) {
component.inject(this);
}
@Override @Override
public void onCreate(Bundle savedInstance) { public void onCreate(Bundle savedInstance) {
super.onCreate(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.ContentCache;
import com.habitrpg.android.habitica.R; 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.fragments.BaseMainFragment;
import com.magicmicky.habitrpgwrapper.lib.models.Group; import com.magicmicky.habitrpgwrapper.lib.models.Group;
@ -39,6 +40,11 @@ public class TavernFragment extends BaseMainFragment {
return v; return v;
} }
@Override
public void injectFragment(AppComponent component) {
component.inject(this);
}
@Override @Override
public void onViewCreated(View view, Bundle savedInstanceState) { public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, 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.ContentCache;
import com.habitrpg.android.habitica.R; 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.GroupFormActivity;
import com.habitrpg.android.habitica.ui.activities.PartyInviteActivity; import com.habitrpg.android.habitica.ui.activities.PartyInviteActivity;
import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment; import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment;
@ -92,6 +93,11 @@ public class PartyFragment extends BaseMainFragment {
return v; return v;
} }
@Override
public void injectFragment(AppComponent component) {
component.inject(this);
}
private void updateGroupUI() { private void updateGroupUI() {
if (partyMemberListFragment != null) { if (partyMemberListFragment != null) {
partyMemberListFragment.setMemberList(group.members); partyMemberListFragment.setMemberList(group.members);

View file

@ -1,6 +1,7 @@
package com.habitrpg.android.habitica.ui.fragments.social.party; package com.habitrpg.android.habitica.ui.fragments.social.party;
import com.habitrpg.android.habitica.R; import com.habitrpg.android.habitica.R;
import com.habitrpg.android.habitica.components.AppComponent;
import com.habitrpg.android.habitica.ui.fragments.BaseFragment; import com.habitrpg.android.habitica.ui.fragments.BaseFragment;
import android.os.Bundle; import android.os.Bundle;
@ -48,6 +49,11 @@ public class PartyInviteFragment extends BaseFragment {
return v; return v;
} }
@Override
public void injectFragment(AppComponent component) {
component.inject(this);
}
@OnClick(R.id.addInviteButton) @OnClick(R.id.addInviteButton)
public void addInviteField() { public void addInviteField() {
EditText editText = new EditText(getContext()); EditText editText = new EditText(getContext());

View file

@ -1,6 +1,7 @@
package com.habitrpg.android.habitica.ui.fragments.social.party; package com.habitrpg.android.habitica.ui.fragments.social.party;
import com.habitrpg.android.habitica.R; 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.adapter.social.PartyMemberRecyclerViewAdapter;
import com.habitrpg.android.habitica.ui.fragments.BaseFragment; import com.habitrpg.android.habitica.ui.fragments.BaseFragment;
import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser;
@ -49,6 +50,11 @@ public class PartyMemberListFragment extends BaseFragment {
return view; return view;
} }
@Override
public void injectFragment(AppComponent component) {
component.inject(this);
}
@Override @Override
public void onViewCreated(View view, Bundle savedInstanceState) { public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState); super.onViewCreated(view, savedInstanceState);

View file

@ -1,6 +1,7 @@
package com.habitrpg.android.habitica.ui.fragments.tasks; package com.habitrpg.android.habitica.ui.fragments.tasks;
import com.habitrpg.android.habitica.R; 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.events.commands.AddNewTaskCommand;
import com.habitrpg.android.habitica.ui.menu.DividerItemDecoration; import com.habitrpg.android.habitica.ui.menu.DividerItemDecoration;
import com.habitrpg.android.habitica.ui.adapter.tasks.BaseTasksRecyclerViewAdapter; import com.habitrpg.android.habitica.ui.adapter.tasks.BaseTasksRecyclerViewAdapter;
@ -86,6 +87,11 @@ public class TaskRecyclerViewFragment extends BaseFragment implements View.OnCli
return view; return view;
} }
@Override
public void injectFragment(AppComponent component) {
component.inject(this);
}
LinearLayoutManager layoutManager = null; LinearLayoutManager layoutManager = null;
@Override @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.TaskCreationCallback;
import com.habitrpg.android.habitica.callbacks.TaskScoringCallback; import com.habitrpg.android.habitica.callbacks.TaskScoringCallback;
import com.habitrpg.android.habitica.callbacks.TaskUpdateCallback; 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.HabitScoreEvent;
import com.habitrpg.android.habitica.events.TaskSaveEvent; import com.habitrpg.android.habitica.events.TaskSaveEvent;
import com.habitrpg.android.habitica.events.TaskTappedEvent; import com.habitrpg.android.habitica.events.TaskTappedEvent;
@ -124,6 +125,7 @@ public class TasksFragment extends BaseMainFragment implements OnCheckedChangeLi
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) { Bundle savedInstanceState) {
this.usesTabLayout = true; this.usesTabLayout = true;
this.displayingTaskForm = false; this.displayingTaskForm = false;
super.onCreateView(inflater, container, savedInstanceState); super.onCreateView(inflater, container, savedInstanceState);
@ -154,6 +156,11 @@ public class TasksFragment extends BaseMainFragment implements OnCheckedChangeLi
return v; return v;
} }
@Override
public void injectFragment(AppComponent component) {
component.inject(this);
}
@Override @Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.menu_main_activity, menu); inflater.inflate(R.menu.menu_main_activity, menu);

View file

@ -1,12 +1,14 @@
package com.habitrpg.android.habitica.widget; package com.habitrpg.android.habitica.widget;
import com.habitrpg.android.habitica.APIHelper; import com.habitrpg.android.habitica.APIHelper;
import com.habitrpg.android.habitica.HabiticaApplication;
import com.habitrpg.android.habitica.HostConfig; import com.habitrpg.android.habitica.HostConfig;
import com.habitrpg.android.habitica.R; import com.habitrpg.android.habitica.R;
import com.habitrpg.android.habitica.callbacks.HabitRPGUserCallback; import com.habitrpg.android.habitica.callbacks.HabitRPGUserCallback;
import com.habitrpg.android.habitica.ui.activities.MainActivity; import com.habitrpg.android.habitica.ui.activities.MainActivity;
import com.habitrpg.android.habitica.ui.activities.PrefsActivity; import com.habitrpg.android.habitica.ui.activities.PrefsActivity;
import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser;
import com.raizlabs.android.dbflow.sql.language.Update;
import android.app.PendingIntent; import android.app.PendingIntent;
import android.app.Service; import android.app.Service;
@ -17,6 +19,8 @@ import android.os.IBinder;
import android.util.Log; import android.util.Log;
import android.widget.RemoteViews; import android.widget.RemoteViews;
import javax.inject.Inject;
/** /**
* The service that should update the simple widget * The service that should update the simple widget
* *
@ -26,30 +30,30 @@ import android.widget.RemoteViews;
public class UpdateWidgetService extends Service implements HabitRPGUserCallback.OnUserReceived { public class UpdateWidgetService extends Service implements HabitRPGUserCallback.OnUserReceived {
private static final String LOG = ".simplewidget.service"; private static final String LOG = ".simplewidget.service";
private AppWidgetManager appWidgetManager; private AppWidgetManager appWidgetManager;
private APIHelper apiHelper;
@Inject
public APIHelper apiHelper;
public UpdateWidgetService() {
super();
((HabiticaApplication)getApplication()).getComponent().inject(this);
}
@Override @Override
public int onStartCommand(final Intent intent, int flags, int startId) { public int onStartCommand(final Intent intent, int flags, int startId) {
Log.i(LOG, "Service onStart Called");
this.appWidgetManager = AppWidgetManager.getInstance(this); this.appWidgetManager = AppWidgetManager.getInstance(this);
int[] allWidgetIds = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS); int[] allWidgetIds = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS);
ComponentName thisWidget = new ComponentName(this, ComponentName thisWidget = new ComponentName(this,
SimpleWidget.class); SimpleWidget.class);
int[] allWidgetIds2 = appWidgetManager.getAppWidgetIds(thisWidget); 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 (apiHelper != null) {
if (hc != null && hc.getApi() != null && !hc.getApi().equals("") && hc.getUser() != null && !hc.getUser().equals("")) {
this.apiHelper = new APIHelper(hc);
apiHelper.retrieveUser(true).subscribe(new HabitRPGUserCallback(this)); apiHelper.retrieveUser(true).subscribe(new HabitRPGUserCallback(this));
for (int widgetId : allWidgetIds) { for (int widgetId : allWidgetIds) {
RemoteViews remoteViews = new RemoteViews(this.getPackageName(), R.layout.simple_widget); RemoteViews remoteViews = new RemoteViews(this.getPackageName(), R.layout.simple_widget);
appWidgetManager.updateAppWidget(widgetId, remoteViews); appWidgetManager.updateAppWidget(widgetId, remoteViews);
} }
} else { } else {
Log.w(LOG, "HostConfig is null");
for (int widgetId : allWidgetIds) { for (int widgetId : allWidgetIds) {
RemoteViews remoteViews = new RemoteViews(this.getPackageName(), R.layout.simple_widget); RemoteViews remoteViews = new RemoteViews(this.getPackageName(), R.layout.simple_widget);
RemoteViews textConnect = new RemoteViews(this.getPackageName(), R.layout.simple_textview); 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.HabitRPGUser;
import com.magicmicky.habitrpgwrapper.lib.models.Items; import com.magicmicky.habitrpgwrapper.lib.models.Items;
import com.magicmicky.habitrpgwrapper.lib.models.PostChatMessageResult; 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.Quest;
import com.magicmicky.habitrpgwrapper.lib.models.Status; import com.magicmicky.habitrpgwrapper.lib.models.Status;
import com.magicmicky.habitrpgwrapper.lib.models.Tag; import com.magicmicky.habitrpgwrapper.lib.models.Tag;
@ -25,6 +27,7 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import retrofit2.Call;
import retrofit2.http.Body; import retrofit2.http.Body;
import retrofit2.http.DELETE; import retrofit2.http.DELETE;
import retrofit2.http.GET; import retrofit2.http.GET;
@ -206,4 +209,8 @@ public interface ApiService {
@POST("groups/{gid}/quests/leave") @POST("groups/{gid}/quests/leave")
Observable<Void> leaveQuest(@Path("gid") String groupId); 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);
}
}
}