package com.jdroid.android.activity; import android.app.Activity; import android.content.Intent; import android.content.res.Configuration; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.Menu; import android.view.MenuItem; import android.view.View; import com.google.android.gms.common.api.GoogleApiClient; import com.jdroid.android.application.AbstractApplication; import com.jdroid.android.application.AppModule; import com.jdroid.android.fragment.UseCaseFragment; import com.jdroid.android.loading.ActivityLoading; import com.jdroid.android.navdrawer.NavDrawer; import com.jdroid.android.uri.UriHandler; import com.jdroid.java.exception.UnexpectedException; /** * Base {@link Activity} * */ public abstract class AbstractFragmentActivity extends AppCompatActivity implements ActivityIf { private ActivityHelper activityHelper; public ActivityHelper getActivityHelper() { return activityHelper; } @Override public Boolean onBeforeSetContentView() { return activityHelper.onBeforeSetContentView(); } @Override public void onAfterSetContentView(Bundle savedInstanceState) { activityHelper.onAfterSetContentView(savedInstanceState); } @Override protected void onCreate(Bundle savedInstanceState) { // TODO Should we create a new instance on rotation? activityHelper = AbstractApplication.get().createActivityHelper(this); activityHelper.beforeOnCreate(); super.onCreate(savedInstanceState); activityHelper.onCreate(savedInstanceState); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); activityHelper.onSaveInstanceState(outState); } @Override protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); activityHelper.onRestoreInstanceState(savedInstanceState); } @Override protected void onStart() { super.onStart(); activityHelper.onStart(); } @Override protected void onResume() { super.onResume(); activityHelper.onResume(); } @Override protected void onPause() { activityHelper.onBeforePause(); super.onPause(); activityHelper.onPause(); } @Override protected void onStop() { activityHelper.onBeforeStop(); super.onStop(); activityHelper.onStop(); } @Override protected void onDestroy() { activityHelper.onBeforeDestroy(); super.onDestroy(); activityHelper.onDestroy(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); activityHelper.onActivityResult(requestCode, resultCode, data); } @Override public boolean onCreateOptionsMenu(Menu menu) { return activityHelper.onCreateOptionsMenu(menu); } @Override public boolean onPrepareOptionsMenu(Menu menu) { activityHelper.onPrepareOptionsMenu(menu); return super.onPrepareOptionsMenu(menu); } @Override public Integer getMenuResourceId() { return activityHelper.getMenuResourceId(); } @Override public void doOnCreateOptionsMenu(Menu menu) { activityHelper.doOnCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { return activityHelper.onOptionsItemSelected(item) || super.onOptionsItemSelected(item); } @Override public <V extends View> V findView(int id) { return activityHelper.findView(id); } @Override public View inflate(int resource) { return activityHelper.inflate(resource); } @Override public <E> E getExtra(String key) { return activityHelper.getExtra(key); } public void loadUseCaseFragment(Bundle savedInstanceState, Class<? extends UseCaseFragment<?>> useCaseFragmentClass) { if (savedInstanceState == null) { try { FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); fragmentTransaction.add(useCaseFragmentClass.newInstance(), useCaseFragmentClass.getSimpleName()); fragmentTransaction.commit(); } catch (InstantiationException e) { throw new UnexpectedException(e); } catch (IllegalAccessException e) { throw new UnexpectedException(e); } } } public void removeUseCaseFragment(Class<? extends UseCaseFragment<?>> useCaseFragmentClass) { FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); fragmentTransaction.remove(getUseCaseUseCaseFragment(useCaseFragmentClass)); fragmentTransaction.commit(); } public UseCaseFragment<?> getUseCaseUseCaseFragment(Class<? extends UseCaseFragment<?>> useCaseFragmentClass) { return (UseCaseFragment<?>)getSupportFragmentManager().findFragmentByTag(useCaseFragmentClass.getSimpleName()); } @SuppressWarnings("unchecked") public <E extends Fragment> E getFragment(Class<E> fragmentClass) { return (E)getSupportFragmentManager().findFragmentByTag(fragmentClass.getSimpleName()); } public void addFragment(Fragment newFragment, int containerId, boolean addToBackStack) { FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); fragmentTransaction.add(containerId, newFragment, newFragment.getClass().getSimpleName()); if (addToBackStack) { fragmentTransaction.addToBackStack(newFragment.getClass().getSimpleName()); } fragmentTransaction.commit(); } public void replaceFragment(Fragment newFragment, int containerId, boolean addToBackStack) { FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); fragmentTransaction.replace(containerId, newFragment); if (addToBackStack) { fragmentTransaction.addToBackStack(newFragment.getClass().getSimpleName()); } fragmentTransaction.commit(); } public <E extends Fragment> E instanceFragment(Class<E> fragmentClass, Bundle bundle) { E fragment; try { fragment = fragmentClass.newInstance(); } catch (InstantiationException e) { throw new UnexpectedException(e); } catch (IllegalAccessException e) { throw new UnexpectedException(e); } fragment.setArguments(bundle); return fragment; } public void commitFragment(int containerViewId, Fragment fragment) { FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); fragmentTransaction.add(containerViewId, fragment); fragmentTransaction.commit(); } @Override public Boolean isLauncherActivity() { return activityHelper.isLauncherActivity(); } @Override public Long getLocationFrequency() { return activityHelper.getLocationFrequency(); } @Override public Boolean isLocationServicesEnabled() { return activityHelper.isLocationServicesEnabled(); } @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); activityHelper.onPostCreate(savedInstanceState); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); activityHelper.onConfigurationChanged(newConfig); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); activityHelper.onNewIntent(intent); } @Override public void executeOnUIThread(Runnable runnable) { activityHelper.executeOnUIThread(runnable); } @Override public Boolean isActivityDestroyed() { return activityHelper.isActivityDestroyed(); } @Override public Boolean isGooglePlayServicesVerificationEnabled() { return activityHelper.isGooglePlayServicesVerificationEnabled(); } // //////////////////////// Loading //////////////////////// // @Override public void showLoading() { activityHelper.showLoading(); } @Override public void dismissLoading() { activityHelper.dismissLoading(); } @NonNull @Override public ActivityLoading getDefaultLoading() { return activityHelper.getDefaultLoading(); } @Override public void setLoading(ActivityLoading loading) { activityHelper.setLoading(loading); } @Override public void onBackPressed() { if (!onBackPressedHandled()) { super.onBackPressed(); } } public Boolean onBackPressedHandled() { return activityHelper.onBackPressedHandled(); } // //////////////////////// Navigation Drawer //////////////////////// // @Override public void initNavDrawer(Toolbar appBar) { activityHelper.initNavDrawer(appBar); } @Override public NavDrawer createNavDrawer(AbstractFragmentActivity activity, Toolbar appBar) { return activityHelper.createNavDrawer(activity, appBar); } @Override public Boolean isNavDrawerEnabled() { return activityHelper.isNavDrawerEnabled(); } @Override public ActivityDelegate createActivityDelegate(AppModule appModule) { return activityHelper.createActivityDelegate(appModule); } @Override public ActivityDelegate getActivityDelegate(AppModule appModule) { return activityHelper.getActivityDelegate(appModule); } // //////////////////////// Uri, Dynamic Links & App Invites //////////////////////// // @Override public UriHandler createUriHandler() { return activityHelper.createUriHandler(); } @Override public Boolean isAppInviteEnabled() { return activityHelper.isAppInviteEnabled(); } @Override public void onAppInvite(String deepLink, String invitationId) { activityHelper.onAppInvite(deepLink, invitationId); } @Override public GoogleApiClient getGoogleApiClient() { return activityHelper.getGoogleApiClient(); } }