package com.mfh.comna.view;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import android.annotation.SuppressLint;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.PopupMenu;
import com.mfh.comn.config.UConfig;
import com.mfh.comna.bizz.BizApplication;
import com.mfh.comna.R;
import net.tsz.afinal.FinalDb;
/**
* 可作为系统一级模块的基类,可作为最顶层Acitivity.
* 而BaseComnActivity往往是二级Acitivity
* 本类继承于BaseFragmentActive,
* 因此BaseFragmentActive既可以作为一级Acitivty也可以作为二级Activity。
* @author zhangyz created on 2013-4-19
* @since Framework 1.0
*/
public abstract class BaseAppActivity extends BaseFragmentActive implements DialogInterface.OnClickListener,
PopupMenu.OnMenuItemClickListener{
protected static List<BaseAppActivity> activityList = new LinkedList<>();
@SuppressLint("UseSparseArrays")
protected static Map<Integer, Class<?>> menuActivityMap = new HashMap<>();
private static void addActivity(BaseAppActivity activity){
activityList.add(activity);
}
/**
*
* @param menuId
* @param acitvityClass
* @author zhangyz created on 2013-6-16
*/
public static void addActivity(Integer menuId, Class<?> acitvityClass) {
menuActivityMap.put(menuId, acitvityClass);
}
/**
* 关闭数据库
*/
protected void exitDb() {
String dbName = BizApplication.getUconfig().getDomain(UConfig.CONFIG_COMMON).getString("app.db.name", "mfh.db");
FinalDb db = FinalDb.getDb(dbName);
if (db != null) {
db.close();
}
}
/**
* 完整退出程序
*
* @author zhangyz created on 2013-4-19
*/
protected void exit() {
for(BaseAppActivity activity : activityList){
activity.finish();
}
exitDb();
System.exit(0);
}
private boolean bHaveCanced = false;//是否已经按过退出键
private ImageView homeButton = null;
protected int mSysMenuId = -1;//当前选中的哪个菜单项
protected abstract int getMenuId();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
homeButton = (ImageView)this.findViewById(android.R.id.home);
//if (homeButton != null) //用单击弹出了,不用上下文菜单了。
// registerForContextMenu(homeButton);
mSysMenuId = this.getMenuId();
addActivity(this);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
if (v.getId() == android.R.id.home) {//禁用了
getMenuInflater().inflate(R.menu.sys_menu, menu);
}
else
super.onCreateContextMenu(menu, v, menuInfo);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home: {
if (!backUpFragment()) {
PopupMenu popup = new PopupMenu(this, homeButton);
MenuInflater inflater = popup.getMenuInflater();
inflater.inflate(R.menu.sys_menu, popup.getMenu());
popup.setOnMenuItemClickListener(this);
Menu menu = popup.getMenu();
MenuItem menItem;
for (int ii = 0; ii < menu.size(); ii++) {
menItem = menu.getItem(ii);
if (menItem.getItemId() == mSysMenuId && menItem.getItemId() != R.id.exitAppmenu) {
menItem.setEnabled(false);
}
}
popup.show();
//this.openContextMenu(findViewById(android.R.id.home));
}
}
}
return true;
}
@Override
public boolean onContextItemSelected(MenuItem item) {
Intent intent = null;
int itemId = item.getItemId();
if (itemId == R.id.exitAppmenu) {
this.showYesNoDialog("您真的要退出系统吗?", this);
}
else {
Class<?> activityClass = menuActivityMap.get(itemId);
if (activityClass != null) {
intent = new Intent(this, activityClass);
Object me = this;
Class<?> curClass = me.getClass();
if (!(intent.getClass().equals(curClass) )) {
this.startActivity(intent);
}
}
}
return super.onContextItemSelected(item);
}
@Override
public boolean onMenuItemClick(MenuItem item) {
return onContextItemSelected(item);
}
@Override
public void onClick(DialogInterface arg0, int which) {
if (DialogInterface.BUTTON_POSITIVE == which) {
exit();
}
}
@Override
public void onBackPressed() {
if (!bHaveCanced) {
this.showHint("再按一次退出程序!");
bHaveCanced = true;
}
else
exit();
}
}