Skip to content

Instantly share code, notes, and snippets.

@NomenSvyat
Last active November 3, 2016 17:31
Show Gist options
  • Save NomenSvyat/585d9f2c0b5a9ba7ca8b3d73e18b212d to your computer and use it in GitHub Desktop.
Save NomenSvyat/585d9f2c0b5a9ba7ca8b3d73e18b212d to your computer and use it in GitHub Desktop.
Simple way to centralize message showing. Now we can inject MessageShower into whatever we want. In BaseActivity class I'm forwarding all CanShowMessage interfece's methods to MessageShower.
//Provide different MessageShowers for different qualifiers
@PerActivity
@Provides
MessageShower provideMessageShower(@ActivityContext Context context,
PreferencesManager preferencesManager) {
return new ToastMessageShower(context, preferencesManager);
}
@Named("login")
@PerActivity
@Provides
MessageShower provideLoginMessageShower(@ActivityContext Context context) {
return new LoginToastMessageShower(context);
}
//There is no really big profit to use TBinding generic here
public abstract class BaseActivity<TBinding extends ViewDataBinding, TPresenter extends BasePresenter>
extends BaseCalligraphyActivity
implements HasActivityComponent, CanShowMessage {
@Inject
protected MessageShower messageShower;
private TBinding binding;
private ActivityComponent activityComponent;
private CompositeSubscription compositeSubscription;
@Override
public ActivityComponent getActivityComponent() {
return activityComponent;
}
@Override
public void onCreate(Bundle savedInstanceState) {
buildActivityComponent();
super.onCreate(savedInstanceState);
binding = inflateBinding();
if (getPresenter() != null) {
getPresenter().onCreate();
}
}
private void buildActivityComponent() {
activityComponent = DaggerActivityComponent.builder()
.appComponent(getAppComponent())
.activityModule(new ActivityModule(this))
.build();
inject(activityComponent);
}
protected abstract TBinding inflateBinding();
@Nullable
public abstract TPresenter getPresenter();
protected AppComponent getAppComponent() {
return ManagerApplication.getApplication().getAppComponent();
}
protected abstract void inject(ActivityComponent activityComponent);
final protected void addSubscription(Subscription subscription) {
if (compositeSubscription == null || compositeSubscription.isUnsubscribed()) {
compositeSubscription = new CompositeSubscription();
}
compositeSubscription.add(subscription);
}
@Override
protected void onStart() {
super.onStart();
if (getPresenter() != null) {
getPresenter().onStart();
}
}
@Override
protected void onStop() {
if (getPresenter() != null) {
getPresenter().onStop();
}
unsubscribeComposite();
super.onStop();
}
private void unsubscribeComposite() {
if (compositeSubscription != null && compositeSubscription.hasSubscriptions()) {
compositeSubscription.unsubscribe();
compositeSubscription = null;
}
}
@Override
protected void onDestroy() {
if (getPresenter() != null) {
getPresenter().onDestroy();
}
super.onDestroy();
}
@Nullable
public TBinding getBinding() {
return binding;
}
@Override
public void showMessage(String message) {
messageShower.showMessage(message);
}
@Override
public void showMessage(@StringRes int messageRes) {
messageShower.showMessage(messageRes);
}
@Override
public void showMessage(Throwable throwable) {
messageShower.showMessage(throwable);
}
}
public class LoginToastMessageShower implements MessageShower {
@NonNull private final Context context;
public LoginToastMessageShower(@NonNull Context context) {
this.context = context;
}
@Override
public void showMessage(@NonNull String message) {
Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
}
@Override
public void showMessage(@StringRes int messageRes) {
showMessage(context.getString(messageRes));
}
@Override
public void showMessage(@NonNull Throwable throwable) {
if (throwable instanceof RxRuntimeException) {
throwable = throwable.getCause();
}
if (throwable instanceof HasLocalizedMessage) {
showMessage(((HasLocalizedMessage) throwable).getMessage(context));
} else {
showMessage(throwable.getMessage());
}
Timber.e(throwable, "Showing error message in %s", context.getClass().getName());
}
}
public interface MessageShower extends CanShowMessage {
}
public class ToastMessageShower implements MessageShower {
@NonNull private final Context context;
@NonNull private final PreferencesManager preferencesManager;
public ToastMessageShower(@NonNull Context context,@NonNull PreferencesManager preferencesManager) {
this.context = context;
this.preferencesManager = preferencesManager;
}
@Override
public void showMessage(@NonNull String message) {
Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
}
@Override
public void showMessage(@StringRes int messageRes) {
showMessage(context.getString(messageRes));
}
@Override
public void showMessage(@NonNull Throwable throwable) {
if (throwable instanceof RxRuntimeException) {
throwable = throwable.getCause();
}
if (throwable instanceof UnauthorizedException) {
onUnauthorized();
} else if (throwable instanceof HasLocalizedMessage) {
showMessage(((HasLocalizedMessage) throwable).getMessage(context));
} else {
showMessage(throwable.getMessage());
}
Timber.e(throwable, "Showing error message in %s", context.getClass().getName());
}
private void onUnauthorized() {
Toast.makeText(context, R.string.unauthorized_error_message, Toast.LENGTH_SHORT).show();
preferencesManager.setToken("");
LoginActivity.start(context);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment