Last active
November 3, 2016 17:31
-
-
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//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); | |
} | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//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); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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()); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public interface MessageShower extends CanShowMessage { | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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