package com.khmelenko.lab.varis.mvp;
import android.app.ProgressDialog;
import android.support.annotation.IdRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.StringRes;
import android.support.v4.app.Fragment;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.app.AppCompatDelegate;
import android.widget.Toast;
import com.khmelenko.lab.varis.R;
/**
* Base activity for MVP architecture
*
* @author Dmytro Khmelenko (d.khmelenko@gmail.com)
*/
public abstract class MvpActivity<T extends MvpPresenter> extends AppCompatActivity {
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}
private ProgressDialog mProgressDialog;
@Override
protected void onResume() {
super.onResume();
attachPresenter();
}
@Override
protected void onPause() {
super.onPause();
showLoadingProgress(false);
getPresenter().detach();
}
/**
* Shows the progress of the loading
*
* @param isLoading True, if loading is in progress. False otherwise
*/
protected void showLoadingProgress(boolean isLoading) {
if (isLoading) {
mProgressDialog = ProgressDialog.show(this, "", getString(R.string.loading_msg));
} else {
if (mProgressDialog != null) {
mProgressDialog.dismiss();
}
}
}
/**
* Shows a toast message
*
* @param message Message
*/
protected void showToast(String message) {
Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
}
/**
* Shows a toast message
*
* @param resId Message
*/
protected void showToast(@StringRes int resId) {
Toast.makeText(this, resId, Toast.LENGTH_SHORT).show();
}
/**
* Adds new fragment
*
* @param containerViewId ID of the container view for fragment
* @param fragment Fragment instance
* @param fragmentTag Fragment tag
*/
protected void addFragment(@IdRes int containerViewId,
@NonNull Fragment fragment,
@NonNull String fragmentTag) {
if (!fragment.isAdded()) {
getSupportFragmentManager()
.beginTransaction()
.add(containerViewId, fragment, fragmentTag)
.disallowAddToBackStack()
.commit();
}
}
/**
* Replaces fragment
*
* @param containerViewId ID of the container view for fragment
* @param fragment Fragment instance
* @param fragmentTag Fragment tag
* @param backStackStateName Name in back stack
*/
protected void replaceFragment(@IdRes int containerViewId,
@NonNull Fragment fragment,
@NonNull String fragmentTag,
@Nullable String backStackStateName) {
getSupportFragmentManager()
.beginTransaction()
.replace(containerViewId, fragment, fragmentTag)
.addToBackStack(backStackStateName)
.commit();
}
/**
* Replaces fragment
*
* @param containerViewId ID of the container view for fragment
* @param fragment Fragment instance
* @param fragmentTag Fragment tag
*/
protected void replaceFragment(@IdRes int containerViewId,
@NonNull Fragment fragment,
@NonNull String fragmentTag) {
getSupportFragmentManager()
.beginTransaction()
.replace(containerViewId, fragment, fragmentTag)
.commit();
}
/**
* Detaches fragment
*
* @param fragment Fragment
*/
protected void detachFragment(Fragment fragment) {
getSupportFragmentManager()
.beginTransaction()
.detach(fragment)
.commit();
}
/**
* Gets attached presenter
*
* @return Presenter
*/
protected abstract T getPresenter();
/**
* Does presenter attachment
*/
protected abstract void attachPresenter();
}