content: /**
   * Copyright 2017 JessYan
   * <p>
   * 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
   * <p>
   * http://www.apache.org/licenses/LICENSE-2.0
   * <p>
   * 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.
   */
  package <%= appPackage %>.integration;
  
  import android.app.Activity;
  import android.app.Application;
  import android.os.Bundle;
  import android.support.v4.app.FragmentActivity;
  import android.support.v4.app.FragmentManager;
  
  import <%= appPackage %>.base.BaseFragment;
  import <%= appPackage %>.base.delegate.ActivityDelegate;
  import <%= appPackage %>.base.delegate.ActivityDelegateImpl;
  import <%= appPackage %>.base.delegate.FragmentDelegate;
  import <%= appPackage %>.base.delegate.IActivity;
  import <%= appPackage %>.integration.cache.Cache;
  
  import java.util.ArrayList;
  import java.util.List;
  
  import javax.inject.Inject;
  import javax.inject.Singleton;
  
  
  /**
   * ================================================
   * {@link Application.ActivityLifecycleCallbacks} 默认实现类
   * 通过 {@link ActivityDelegate} 管理 {@link Activity}
   *
   * @see <a href="http://www.jianshu.com/p/75a5c24174b2">ActivityLifecycleCallbacks 分析文章</a>
   * Created by JessYan on 21/02/2017 14:23
   * <a href="mailto:jess.yan.effort@gmail.com">Contact me</a>
   * <a href="https://github.com/JessYanCoding">Follow me</a>
   * ================================================
   */
  @Singleton
  public class ActivityLifecycle implements Application.ActivityLifecycleCallbacks {
  
      private AppManager mAppManager;
      private Application mApplication;
      private Cache<String, Object> mExtras;
      private FragmentManager.FragmentLifecycleCallbacks mFragmentLifecycle;
      private List<FragmentManager.FragmentLifecycleCallbacks> mFragmentLifecycles;
  
      @Inject
      public ActivityLifecycle(AppManager appManager, Application application, Cache<String, Object> extras) {
          this.mAppManager = appManager;
          this.mApplication = application;
          this.mExtras = extras;
      }
  
      @Override
      public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
          //如果 intent 包含了此字段,并且为 true 说明不加入到 list 进行统一管理
          boolean isNotAdd = false;
          if (activity.getIntent() != null)
              isNotAdd = activity.getIntent().getBooleanExtra(AppManager.IS_NOT_ADD_ACTIVITY_LIST, false);
  
          if (!isNotAdd)
              mAppManager.addActivity(activity);
  
          //配置ActivityDelegate
          if (activity instanceof IActivity && activity.getIntent() != null) {
              ActivityDelegate activityDelegate = fetchActivityDelegate(activity);
              if (activityDelegate == null) {
                  activityDelegate = new ActivityDelegateImpl(activity);
                  activity.getIntent().putExtra(ActivityDelegate.ACTIVITY_DELEGATE, activityDelegate);
              }
              activityDelegate.onCreate(savedInstanceState);
          }
  
          registerFragmentCallbacks(activity);
      }
  
  
      @Override
      public void onActivityStarted(Activity activity) {
          ActivityDelegate activityDelegate = fetchActivityDelegate(activity);
          if (activityDelegate != null) {
              activityDelegate.onStart();
          }
      }
  
      @Override
      public void onActivityResumed(Activity activity) {
          mAppManager.setCurrentActivity(activity);
  
          ActivityDelegate activityDelegate = fetchActivityDelegate(activity);
          if (activityDelegate != null) {
              activityDelegate.onResume();
          }
      }
  
      @Override
      public void onActivityPaused(Activity activity) {
          ActivityDelegate activityDelegate = fetchActivityDelegate(activity);
          if (activityDelegate != null) {
              activityDelegate.onPause();
          }
      }
  
      @Override
      public void onActivityStopped(Activity activity) {
          if (mAppManager.getCurrentActivity() == activity) {
              mAppManager.setCurrentActivity(null);
          }
  
          ActivityDelegate activityDelegate = fetchActivityDelegate(activity);
          if (activityDelegate != null) {
              activityDelegate.onStop();
          }
      }
  
      @Override
      public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
          ActivityDelegate activityDelegate = fetchActivityDelegate(activity);
          if (activityDelegate != null) {
              activityDelegate.onSaveInstanceState(outState);
          }
      }
  
      @Override
      public void onActivityDestroyed(Activity activity) {
          mAppManager.removeActivity(activity);
  
          ActivityDelegate activityDelegate = fetchActivityDelegate(activity);
          if (activityDelegate != null) {
              activityDelegate.onDestroy();
              activity.getIntent().removeExtra(ActivityDelegate.ACTIVITY_DELEGATE);
          }
      }
  
      /**
       * 给每个 Activity 的所有 Fragment 设置监听其生命周期, Activity 可以通过 {@link IActivity#useFragment()}
       * 设置是否使用监听,如果这个 Activity 返回 false 的话,这个 Activity 下面的所有 Fragment 将不能使用 {@link FragmentDelegate}
       * 意味着 {@link BaseFragment} 也不能使用
       *
       * @param activity
       */
      private void registerFragmentCallbacks(Activity activity) {
          boolean useFragment = activity instanceof IActivity ? ((IActivity) activity).useFragment() : true;
          if (activity instanceof FragmentActivity && useFragment) {
  
              if (mFragmentLifecycle == null) {
                  mFragmentLifecycle = new FragmentLifecycle();
              }
  
              ((FragmentActivity) activity).getSupportFragmentManager().registerFragmentLifecycleCallbacks(mFragmentLifecycle, true);
  
              if (mFragmentLifecycles == null && mExtras.containsKey(ConfigModule.class.getName())) {
                  mFragmentLifecycles = new ArrayList<>();
                  List<ConfigModule> modules = (List<ConfigModule>) mExtras.get(ConfigModule.class.getName());
                  for (ConfigModule module : modules) {
                      module.injectFragmentLifecycle(mApplication, mFragmentLifecycles);
                  }
                  mExtras.remove(ConfigModule.class.getName());
              }
  
              for (FragmentManager.FragmentLifecycleCallbacks fragmentLifecycle : mFragmentLifecycles) {
                  ((FragmentActivity) activity).getSupportFragmentManager().registerFragmentLifecycleCallbacks(fragmentLifecycle, true);
              }
          }
      }
  
      private ActivityDelegate fetchActivityDelegate(Activity activity) {
          ActivityDelegate activityDelegate = null;
          if (activity instanceof IActivity && activity.getIntent() != null) {
              activity.getIntent().setExtrasClassLoader(getClass().getClassLoader());
              activityDelegate = activity.getIntent().getParcelableExtra(ActivityDelegate.ACTIVITY_DELEGATE);
          }
          return activityDelegate;
      }
  
  }
  