package com.patloew.countries.ui.base.navigator; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.os.Parcelable; import android.support.annotation.IdRes; import android.support.annotation.NonNull; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import com.patloew.countries.util.PlainConsumer; /* Copyright 2016 Patrick Löwenstein * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * * ------ * * FILE CHANGED 2017 Tailored Media GmbH * */ public class ActivityNavigator implements Navigator { protected final FragmentActivity activity; public ActivityNavigator(FragmentActivity activity) { this.activity = activity; } @Override public void finishActivity() { activity.finish(); } @Override public final void startActivity(@NonNull Intent intent) { activity.startActivity(intent); } @Override public final void startActivity(@NonNull String action) { activity.startActivity(new Intent(action)); } @Override public final void startActivity(@NonNull String action, @NonNull Uri uri) { activity.startActivity(new Intent(action, uri)); } @Override public final void startActivity(@NonNull Class<? extends Activity> activityClass) { startActivityInternal(activityClass, null, null); } @Override public void startActivity(@NonNull Class<? extends Activity> activityClass, @NonNull PlainConsumer<Intent> setArgsAction) { startActivityInternal(activityClass, setArgsAction, null); } @Override public void startActivity(@NonNull Class<? extends Activity> activityClass, Bundle args) { startActivityInternal(activityClass, intent -> intent.putExtra(EXTRA_ARG, args), null); } @Override public final void startActivity(@NonNull Class<? extends Activity> activityClass, @NonNull Parcelable arg) { startActivityInternal(activityClass, intent -> intent.putExtra(EXTRA_ARG, arg), null); } @Override public final void startActivity(@NonNull Class<? extends Activity> activityClass, @NonNull String arg) { startActivityInternal(activityClass, intent -> intent.putExtra(EXTRA_ARG, arg), null); } @Override public final void startActivity(@NonNull Class<? extends Activity> activityClass, int arg) { startActivityInternal(activityClass, intent -> intent.putExtra(EXTRA_ARG, arg), null); } @Override public final void startActivityForResult(@NonNull Class<? extends Activity> activityClass, int requestCode) { startActivityInternal(activityClass, null, requestCode); } @Override public void startActivityForResult(@NonNull Class<? extends Activity> activityClass, @NonNull PlainConsumer<Intent> setArgsAction, int requestCode) { startActivityInternal(activityClass, setArgsAction, requestCode); } @Override public final void startActivityForResult(@NonNull Class<? extends Activity> activityClass, @NonNull Parcelable arg, int requestCode) { startActivityInternal(activityClass, intent -> intent.putExtra(EXTRA_ARG, arg), requestCode); } @Override public final void startActivityForResult(@NonNull Class<? extends Activity> activityClass, @NonNull String arg, int requestCode) { startActivityInternal(activityClass, intent -> intent.putExtra(EXTRA_ARG, arg), requestCode); } @Override public final void startActivityForResult(@NonNull Class<? extends Activity> activityClass, int arg, int requestCode) { startActivityInternal(activityClass, intent -> intent.putExtra(EXTRA_ARG, arg), requestCode); } private void startActivityInternal(Class<? extends Activity> activityClass, PlainConsumer<Intent> setArgsAction, Integer requestCode) { Intent intent = new Intent(activity, activityClass); if(setArgsAction != null) { setArgsAction.accept(intent); } if(requestCode != null) { activity.startActivityForResult(intent, requestCode); } else { activity.startActivity(intent); } } @Override public final void replaceFragment(@IdRes int containerId, Fragment fragment, Bundle args) { replaceFragmentInternal(activity.getSupportFragmentManager(), containerId, fragment, null, args, false, null); } @Override public final void replaceFragment(@IdRes int containerId, @NonNull Fragment fragment, @NonNull String fragmentTag, Bundle args) { replaceFragmentInternal(activity.getSupportFragmentManager(), containerId, fragment, fragmentTag, args, false, null); } @Override public final void replaceFragmentAndAddToBackStack(@IdRes int containerId, Fragment fragment, Bundle args, String backstackTag) { replaceFragmentInternal(activity.getSupportFragmentManager(), containerId, fragment, null, args, true, backstackTag); } @Override public final void replaceFragmentAndAddToBackStack(@IdRes int containerId, @NonNull Fragment fragment, @NonNull String fragmentTag, Bundle args, String backstackTag) { replaceFragmentInternal(activity.getSupportFragmentManager(), containerId, fragment, fragmentTag, args, true, backstackTag); } protected final void replaceFragmentInternal(FragmentManager fm, @IdRes int containerId, Fragment fragment, String fragmentTag, Bundle args, boolean addToBackstack, String backstackTag) { if(args != null) { fragment.setArguments(args);} FragmentTransaction ft = fm.beginTransaction().replace(containerId, fragment, fragmentTag); if(addToBackstack) { ft.addToBackStack(backstackTag).commit(); fm.executePendingTransactions(); } else { ft.commitNow(); } } }