package org.petabytes.awesomeblogs;
import android.app.Activity;
import android.app.Application;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import com.annimon.stream.Optional;
import com.crashlytics.android.Crashlytics;
import com.f2prateek.rx.preferences.Preference;
import com.f2prateek.rx.preferences.RxSharedPreferences;
import com.google.firebase.analytics.FirebaseAnalytics;
import com.google.firebase.iid.FirebaseInstanceId;
import org.petabytes.api.Api;
import org.petabytes.awesomeblogs.auth.Authenticator;
import org.petabytes.awesomeblogs.base.Verifiable;
import org.petabytes.awesomeblogs.feeds.FeedsActivity;
import org.petabytes.awesomeblogs.util.Devices;
import org.petabytes.awesomeblogs.util.LifeCycles;
import org.petabytes.awesomeblogs.util.Preferences;
import org.petabytes.awesomeblogs.util.Strings;
import org.petabytes.coordinator.ActivityLayoutBinder;
import hugo.weaving.DebugLog;
import io.fabric.sdk.android.Fabric;
import rx.Observable;
import uk.co.chrisjenx.calligraphy.CalligraphyConfig;
public class AwesomeBlogsApp extends Application {
private static AwesomeBlogsApp instance;
private ActivityLayoutBinder activityLayoutBinder;
private Api api;
private Authenticator authenticator;
private RxSharedPreferences preferences;
private FirebaseAnalytics analytics;
@DebugLog
@Override
public void onCreate() {
super.onCreate();
Fabric.with(this, new Crashlytics());
instance = this;
CalligraphyConfig.initDefault(new CalligraphyConfig.Builder()
.setDefaultFontPath("fonts/NanumBarunGothicLight.otf")
.setFontAttrId(R.attr.fontPath)
.build());
registerActivityLifecycleCallbacks(new LifeCycles.Activity() {
@DebugLog
@Override
public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {
if (!(activity instanceof Verifiable)) {
return;
}
authenticator().isSignIn()
.filter(isSignIn -> !isSignIn)
.doOnNext($ -> activity.finish())
.doOnNext($ -> Preferences.accessToken().set(null))
.flatMap($ -> authenticator().signIn(instance))
.take(1)
.onErrorResumeNext(Observable.empty())
.subscribe($ -> startActivity(FeedsActivity.intent(instance)));
}
});
}
public static AwesomeBlogsApp get() {
return instance;
}
public final ActivityLayoutBinder activityLayoutBinder() {
return activityLayoutBinder == null ? activityLayoutBinder = createActivityLayoutBinder() : activityLayoutBinder;
}
protected ActivityLayoutBinder createActivityLayoutBinder() {
return ActivityLayoutBinder.DEFAULT;
}
public final Api api() {
return api == null ? api = createApi() : api;
}
protected Api createApi() {
return new Api(this,
() -> "awesome-blogs-android/" + BuildConfig.VERSION_NAME,
() -> {
Preference<String> preference = Preferences.deviceId();
String deviceId = preference.get();
if (TextUtils.isEmpty(deviceId)) {
deviceId = Devices.getId(this);
preference.set(deviceId);
}
return deviceId;
},
() -> {
Preference<String> preference = Preferences.fcmToken();
String fcmToken = preference.get();
if (TextUtils.isEmpty(fcmToken)) {
fcmToken = Optional.ofNullable(FirebaseInstanceId.getInstance().getToken()).orElse(Strings.EMPTY);
preference.set(fcmToken);
}
return fcmToken;
},
() -> Preferences.accessToken().get(),
false);
}
public final Authenticator authenticator() {
return authenticator == null ? authenticator = createAuthenticator() : authenticator;
}
protected Authenticator createAuthenticator() {
return new Authenticator();
}
public final RxSharedPreferences preferences() {
return preferences == null ? preferences = createPreferences() : preferences;
}
RxSharedPreferences createPreferences() {
return RxSharedPreferences.create(PreferenceManager.getDefaultSharedPreferences(this));
}
public final FirebaseAnalytics analytics() {
return analytics == null ? analytics = createAnalytics() : analytics;
}
FirebaseAnalytics createAnalytics() {
return FirebaseAnalytics.getInstance(this);
}
}