package com.m.ui.activity;
import java.lang.ref.WeakReference;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import org.android.loader.BitmapLoader;
import org.android.loader.core.BitmapOwner;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Rect;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import com.m.common.context.GlobalContext;
import com.m.common.settings.SettingUtility;
import com.m.common.utils.ActivityHelper;
import com.m.common.utils.CommSettings;
import com.m.common.utils.Logger;
import com.m.common.utils.SystemBarTintManager;
import com.m.common.utils.SystemUtility;
import com.m.support.Inject.InjectUtility;
import com.m.support.task.ITaskManager;
import com.m.support.task.TaskManager;
import com.m.support.task.WorkTask;
import com.m.ui.fragment.ABaseFragment;
import com.m.ui.utils.ViewUtils;
public class BaseActivity extends Activity implements ITaskManager, BitmapOwner {
static final String TAG = "BaseActivity";
private int theme = 0;
private Locale language = null;
private TaskManager taskManager;
private boolean isDestory;
// 当有Fragment Attach到这个Activity的时候,就会保存
private Map<String, WeakReference<ABaseFragment>> fragmentRefs;
private static BaseActivity runningActivity;
private AActivityHelper activityHelper;
private SystemBarTintManager systemBarTintManager;
private View rootView;
public static BaseActivity getRunningActivity() {
return runningActivity;
}
public static void setRunningActivity(BaseActivity activity) {
runningActivity = activity;
}
public BaseActivity() {
try {
if (SettingUtility.getSetting("activity_lifecycle") != null) {
Class<?> clazz = Class.forName(SettingUtility.getStringSetting("activity_lifecycle"));
activityHelper = (AActivityHelper) clazz.newInstance();
activityHelper.setBaseActivity(this);
}
} catch (Exception e) {
e.printStackTrace();
}
}
protected int configTheme() {
return CommSettings.getAppTheme();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
// Logger.w(Locale.getDefault().getLanguage() + "()" + Locale.getDefault().getCountry());
fragmentRefs = new HashMap<String, WeakReference<ABaseFragment>>();
if (savedInstanceState == null) {
theme = configTheme();
language = new Locale(SettingUtility.getPermanentSettingAsStr("language", Locale.getDefault().getLanguage()),
SettingUtility.getPermanentSettingAsStr("language-country", Locale.getDefault().getCountry()));
} else {
theme = savedInstanceState.getInt("theme");
language = new Locale(savedInstanceState.getString("language"), savedInstanceState.getString("language-country"));
}
// 设置主题
if (theme > 0)
setTheme(theme);
// 设置语言
setLanguage(language);
taskManager = new TaskManager();
// 取消重新启动
if (ActivityHelper.getInstance().getBooleanShareData("crash_flag", false)) {
ActivityHelper.getInstance().putBooleanShareData("crash_flag", false);
Intent intent = new Intent();
intent.setAction("com.m.common.crash_restart");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent restartIntent = PendingIntent.getActivity(GlobalContext.getInstance(), 11111, intent, Intent.FLAG_ACTIVITY_NEW_TASK);
AlarmManager mgr = (AlarmManager) GlobalContext.getInstance().getSystemService(Context.ALARM_SERVICE);
mgr.cancel(restartIntent);
}
// 如果设备有实体MENU按键,overflow菜单不会再显示
ViewConfiguration viewConfiguration = ViewConfiguration.get(this);
if (viewConfiguration.hasPermanentMenuKey()) {
try {
Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");
menuKeyField.setAccessible(true);
menuKeyField.setBoolean(viewConfiguration, false);
} catch (Exception e) {
}
}
if (activityHelper != null)
activityHelper.onCreate(savedInstanceState);
super.onCreate(savedInstanceState);
}
@Override
public void setContentView(int layoutResID) {
ViewGroup contentView = null;
boolean set = false;
if (activityHelper != null) {
contentView = activityHelper.setContentView(layoutResID);
if (contentView != null) {
rootView = contentView;
set = true;
super.setContentView(contentView, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
}
}
if (!set)
super.setContentView(layoutResID);
InjectUtility.initInjectedView(this);
}
public View getRootView() {
return rootView;
}
@Override
public void setContentView(View view, LayoutParams params) {
super.setContentView(view, params);
rootView = view;
InjectUtility.initInjectedView(this);
}
@Override
public void setContentView(View view) {
super.setContentView(view);
rootView = view;
InjectUtility.initInjectedView(this);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (activityHelper != null)
activityHelper.onSaveInstanceState(outState);
outState.putInt("theme", theme);
outState.putString("language", language.getLanguage());
outState.putString("language-country", language.getCountry());
}
public void addFragment(String tag, ABaseFragment fragment) {
fragmentRefs.put(tag, new WeakReference<ABaseFragment>(fragment));
}
public void removeFragment(String tag) {
fragmentRefs.remove(tag);
}
@Override
protected void onResume() {
super.onResume();
if (activityHelper != null)
activityHelper.onResume();
runningActivity = this;
if (theme == configTheme()) {
} else {
Logger.i("theme changed, reload()");
reload();
return;
}
String languageStr = SettingUtility.getPermanentSettingAsStr("language", Locale.getDefault().getLanguage());
String country = SettingUtility.getPermanentSettingAsStr("language-country", Locale.getDefault().getCountry());
if (language != null && language.getLanguage().equals(languageStr) && country.equals(language.getCountry())) {
}
else {
Logger.i("language changed, reload()");
reload();
return;
}
}
@Override
protected void onPause() {
super.onPause();
if (activityHelper != null)
activityHelper.onPause();
// doAnimation();
}
@Override
protected void onStop() {
super.onStop();
if (activityHelper != null)
activityHelper.onStop();
}
public void setLanguage(Locale locale) {
Resources resources =getResources();//获得res资源对象
Configuration config = resources.getConfiguration();//获得设置对象
config.locale = locale;
DisplayMetrics dm = resources.getDisplayMetrics();//获得屏幕参数:主要是分辨率,像素等。
resources.updateConfiguration(config, dm);
}
public void reload() {
Intent intent = getIntent();
overridePendingTransition(0, 0);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
// intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
finish();
overridePendingTransition(0, 0);
startActivity(intent);
}
@Override
public void onDestroy() {
isDestory = true;
if (activityHelper != null)
activityHelper.onDestroy();
removeAllTask(true);
BitmapLoader.getInstance().cancelPotentialTask(this);
super.onDestroy();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (activityHelper != null)
activityHelper.onActivityResult(requestCode, resultCode, data);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
if (activityHelper != null)
activityHelper.onCreateOptionsMenu(menu, getMenuInflater());
return super.onCreateOptionsMenu(menu);
}
protected void resetAcUnused() {
lastAcUnusedClickTime = 0L;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
lastAcUnusedClickTime = 0L;
Logger.v(TAG, "onOptionsItemSelected");
switch (item.getItemId()) {
case android.R.id.home:
if (activityHelper != null)
if (activityHelper.onHomeClick())
return true;
if (onHomeClick())
return true;
break;
default:
if (activityHelper != null)
if (activityHelper.onOptionsItemSelected(item))
return true;
break;
}
return super.onOptionsItemSelected(item);
}
public boolean onHomeClick() {
Set<String> keys = fragmentRefs.keySet();
for (String key : keys) {
WeakReference<ABaseFragment> fragmentRef = fragmentRefs.get(key);
ABaseFragment fragment = fragmentRef.get();
if (fragment != null && fragment.onHomeClick())
return true;
}
finish();
return true;
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
if (activityHelper != null)
if (activityHelper.onBackClick())
return true;
if (onBackClick())
return true;
}
return super.onKeyDown(keyCode, event);
}
public boolean onBackClick() {
Set<String> keys = fragmentRefs.keySet();
for (String key : keys) {
WeakReference<ABaseFragment> fragmentRef = fragmentRefs.get(key);
ABaseFragment fragment = fragmentRef.get();
if (fragment != null && fragment.onBackClick())
return true;
}
finish();
return true;
}
@Override
final public void addTask(@SuppressWarnings("rawtypes") WorkTask task) {
taskManager.addTask(task);
}
@Override
final public void removeTask(String taskId, boolean cancelIfRunning) {
taskManager.removeTask(taskId, cancelIfRunning);
}
@Override
final public void removeAllTask(boolean cancelIfRunning) {
taskManager.removeAllTask(cancelIfRunning);
}
@Override
final public int getTaskCount(String taskId) {
return taskManager.getTaskCount(taskId);
}
/**
* 以Toast形式显示一个消息
*
* @param msg
*/
public void showMessage(CharSequence msg) {
ViewUtils.showMessage(msg.toString());
}
/**
* @param msgId
*/
public void showMessage(int msgId) {
showMessage(getText(msgId));
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (activityHelper != null) {
if (activityHelper.onTouchEvent(event))
return true;
}
return super.onTouchEvent(event);
}
private long lastAcUnusedClickTime = 0L;
private Rect mRect;
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_UP) {
if (mRect == null) {
mRect = new Rect(0, 0, SystemUtility.getScreenWidth(), 0);
mRect.top = SystemUtility.getStatusBarHeight(this);
mRect.bottom = mRect.top + SystemUtility.getActionBarHeight(this);
}
if (mRect.contains(Math.round(ev.getX()), Math.round(ev.getY()))) {
if (System.currentTimeMillis() - lastAcUnusedClickTime < 1 * 1000) {
if (onAcUnusedDoubleClicked())
return super.dispatchTouchEvent(ev);
}
lastAcUnusedClickTime = System.currentTimeMillis();
}
}
if (activityHelper != null) {
if (activityHelper.dispatchTouchEvent(ev))
return true;
}
return super.dispatchTouchEvent(ev);
}
public boolean onAcUnusedDoubleClicked() {
Set<String> keys = fragmentRefs.keySet();
for (String key : keys) {
WeakReference<ABaseFragment> fragmentRef = fragmentRefs.get(key);
ABaseFragment fragment = fragmentRef.get();
if (fragment != null && fragment instanceof IAcUnusedDoubleClickedHandler) {
if (((IAcUnusedDoubleClickedHandler) fragment).onAcUnusedDoubleClicked())
return true;
}
}
return false;
}
@Override
public void finish() {
// 2014-09-12 解决ATabTitlePagerFragment的destoryFragments方法报错的BUG
setMDestory(true);
super.finish();
// setCancelAnim();
}
// protected boolean myIsDestoryed() {
// return isDestory;
// }
//
public boolean mIsDestoryed() {
return isDestory;
}
public void setMDestory(boolean destory) {
this.isDestory = destory;
}
@Override
public boolean canDisplay() {
return true;
}
public AActivityHelper getActivityHelper() {
return activityHelper;
}
public void setSystemBarTintManager(SystemBarTintManager systemBarTintManager) {
this.systemBarTintManager = systemBarTintManager;
}
public SystemBarTintManager getSystemBarTintManager() {
return systemBarTintManager;
}
/********************
* 界面切换动画
*/
// private int startInAnimId = R.anim.zoom_in_center;
// private int startOutAnimId = R.anim.slide_out_right;
// private int exitInAnimId = R.anim.slide_in_right;
// private int exitOutAnimId = R.anim.zoom_out_center;
//
// protected void clearActivityAnim() {
// overridePendingTransition(0, 0);
// }
//
// protected void setCancelAnim() {
// setStartAnimation(true);
// }
//
// private boolean isStartAnimation = false;
//
// public boolean isStartAnimation() {
// return isStartAnimation;
// }
//
// public void setStartAnimation(boolean isStartAnimation) {
// this.isStartAnimation = isStartAnimation;
// }
//
// private void doAnimation() {
// if (isStartAnimation) {
// startTransAnimation();
// } else {
// exitTransAnimation();
// }
// }
//
// private void startTransAnimation() {
// overridePendingTransition(startInAnimId, startOutAnimId);
// }
//
// private void exitTransAnimation() {
// overridePendingTransition(exitInAnimId, exitOutAnimId);
// }
//
// public int getStartInAnimId() {
// return startInAnimId;
// }
//
// public void setStartInAnimId(int startInAnimId) {
// this.startInAnimId = startInAnimId;
// }
//
// public int getStartOutAnimId() {
// return startOutAnimId;
// }
//
// public void setStartOutAnimId(int startOutAnimId) {
// this.startOutAnimId = startOutAnimId;
// }
//
// public int getExitInAnimId() {
// return exitInAnimId;
// }
//
// public void setExitInAnimId(int exitInAnimId) {
// this.exitInAnimId = exitInAnimId;
// }
//
// public int getExitOutAnimId() {
// return exitOutAnimId;
// }
//
// public void setExitOutAnimId(int exitOutAnimId) {
// this.exitOutAnimId = exitOutAnimId;
// }
public interface IAcUnusedDoubleClickedHandler {
public boolean onAcUnusedDoubleClicked();
}
}