package com.elphin.framework.app.fpstack;
import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import java.lang.reflect.Field;
import java.util.Observable;
/**
* 页面基类实现
* <p>
* 页面基类使用时注意View的生命周期和整个Fragment的生命周期
* </p>
*
* @version 1.0
* @author elphinkuo
* @date 13-5-26 下午3:47
*/
public class BasePage extends Fragment implements Page {
private static final String TAG = BasePage.class.getSimpleName();
private static final boolean DEBUG = false;
private static final String STATE_BACK_KEY = "BasePage.is_back";
private static final String STATE_BACK_ARGS = "BasePage.back_args";
private static final String STATE_PAGE_TAG = "BasePage.page_tag";
/**
* 页面回退标志
*/
protected boolean mIsBack = false;
protected Bundle mBackArgs = null;
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
if(isNavigateBack()) {
onBackFromOtherPage(mBackArgs);
}
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if(DEBUG)
android.util.Log.e(TAG,getClass().getSimpleName()+" onConfigurationChanged " + newConfig.orientation);
View newContent = buildOrientationContentView(newConfig);
ViewGroup rootView = (ViewGroup) getView();
if(newContent != null) {
// Remove all the existing views from the root view.
rootView.removeAllViews();
rootView.addView(newContent);
updateOrientationUI(newConfig);
}
}
private String pageTag = PageFactory.DEFAULT_PAGE_TAG;
private Task mTask;
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
saveState(outState);
}
private void saveState(Bundle outState) {
outState.putBoolean(STATE_BACK_KEY,mIsBack);
outState.putString(STATE_PAGE_TAG,pageTag);
if(mBackArgs!=null)
outState.putBundle(STATE_BACK_ARGS,mBackArgs);
}
private void restoreState(Bundle savedInstanceState) {
if(savedInstanceState == null)
return;
mIsBack = savedInstanceState.getBoolean(STATE_BACK_KEY);
pageTag = savedInstanceState.getString(STATE_PAGE_TAG);
mBackArgs = savedInstanceState.getBundle(STATE_BACK_ARGS);
mTask = (BaseTask)getActivity();
}
protected void setTask(Task task) {
this.mTask = task;
}
@Override
public void setPageTag(String pageTag) {
this.pageTag = pageTag;
}
@Override
final public String getPageTag() {
return this.pageTag;
}
@Override
public Task getTask() {
return mTask;
}
@Override
public boolean onBackPressed() {
return false;
}
@Override
public Bundle getPageArguments() {
return getArguments();
}
/**
*
* @param args
*/
@Override
public void setArguments(Bundle args) {
super.setArguments(args);
}
/**
* {@inheritDoc}
*/
@Override
public void setPageArguments(Bundle args) {
setArguments(args);
}
/**
* {@inheritDoc}
*/
@Override
public void setBackwardArguments(Bundle args) {
mBackArgs = args;
}
/**
* {@inheritDoc}
*/
@Override
public Bundle getBackwardArguments() {
return mBackArgs;
}
/**
* {@inheritDoc}
*/
@Override
public boolean isNavigateBack() {
return mIsBack;
}
/**
* {@inheritDoc}
*/
@Override
public void onBackFromOtherPage(Bundle args) {
}
/**
* 触发页面回退操作
*/
public void goBack() {
goBack(null);
}
/**
* 触发页面回退操作
*/
public void goBack(Bundle args) {
getTask().goBack(args);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
if(DEBUG)
android.util.Log.e(TAG,getClass().getSimpleName()+" onAttach");
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/**屏幕常亮的控制逻辑*/
if (GlobalConfig.getInstance().isAllBright()) {
getActivity().getWindow().setFlags(
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
} else {
getActivity().getWindow().clearFlags(
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
if(DEBUG)
android.util.Log.e(TAG,getClass().getSimpleName()+" onCreate");
if(savedInstanceState!=null) {
restoreState(savedInstanceState);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if(DEBUG)
android.util.Log.e(TAG,getClass().getSimpleName()+" onCreateView");
return super.onCreateView(inflater,container,savedInstanceState);
}
@Override
public void onPause() {
super.onPause();
if(DEBUG)
android.util.Log.e(TAG,getClass().getSimpleName()+" onPause");
}
@Override
public void onResume() {
super.onResume();
if(DEBUG)
android.util.Log.e(TAG,getClass().getSimpleName()+" onResume");
boolean shouldOverrideOrientation = this.shouldOverrideRequestedOrientation();
if (getActivity() != null && !getActivity().isFinishing()) {
if (shouldOverrideOrientation) {
int orientation = getDefaultRequestedOrientation();
getActivity().setRequestedOrientation(orientation);
} else {
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}
}
String pageLogTag = getPageLogTag();
if(!TextUtils.isEmpty(pageLogTag)) {
PerformanceMonitor.getInstance().addEndTime(pageLogTag,System.currentTimeMillis());
}
}
@Override
public void onStop() {
super.onStop();
if(DEBUG)
android.util.Log.e(TAG,getClass().getSimpleName()+" onStop");
}
/**
* Modified by HanSiwen
* 增加将mChildFragmentManager置为null,子类在执行super.onDetach后不要再执行getChildFragmentManager
* 因为使用了反射,所以今后替换support包时请验证此方法
* */
@Override
public void onDetach() {
super.onDetach();
if(DEBUG)
android.util.Log.e(TAG,getClass().getSimpleName()+" onDetach");
mBackArgs = null;
mIsBack = false;
try {
Field childFMField = Fragment.class.getDeclaredField("mChildFragmentManager");
childFMField.setAccessible(true);
childFMField.set(this, null);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onDestroy() {
super.onDestroy();
if(DEBUG)
android.util.Log.e(TAG,getClass().getSimpleName()+" onDestroy");
}
@Override
public void onDestroyView() {
super.onDestroyView();
if(DEBUG)
android.util.Log.e(TAG,getClass().getSimpleName()+" onDestroyView");
}
/**
* 根据横竖屏状态构建View,横竖屏切换不同布局时需要实现
* @see {@link BasePage#onConfigurationChanged(android.content.res.Configuration)}
* @return 所需的竖屏布局
*/
public View buildOrientationContentView(Configuration newConfig){
return null;
}
/**
* 更新UI界面,有横竖屏切换布局时需要实现
* 在横竖屏切换后,更新相关的布局 @see {@link BasePage#onConfigurationChanged(android.content.res.Configuration)}
*/
public void updateOrientationUI(Configuration newConfig){}
@Override
public void update(Observable observable, Object data) {
}
/**
* {@inheritDoc}
*/
@Override
public int[] getCustomAnimations() {
return new int[] { 0, 0, 0, 0 };
}
/**
* {@inheritDoc}
*/
@Override
public boolean shouldOverrideCustomAnimations() {
return true;
}
/**
* {@inheritDoc}
*/
@Override
public String getPageLogTag() {
return null;
}
/**
* {@inheritDoc}
* @return
*/
@Override
public int getDefaultRequestedOrientation() {
return ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
}
/**
* {@inheritDoc}
* @return
*/
@Override
public boolean shouldOverrideRequestedOrientation() {
return false;
}
}