package com.netease.nim.uikit.common.activity;
import android.annotation.TargetApi;
import android.content.Context;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
import android.view.KeyEvent;
import android.view.MenuItem;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import com.netease.nim.uikit.common.fragment.TFragment;
import com.netease.nim.uikit.common.util.log.LogUtil;
import com.netease.nim.uikit.common.util.sys.ReflectionUtil;
import com.netease.nim.uikit.model.ToolBarOptions;
import java.util.ArrayList;
import java.util.List;
public abstract class UI extends AppCompatActivity {
private boolean destroyed = false;
private static Handler handler;
private Toolbar toolbar;
@Override
protected void onStart() {
super.onStart();
}
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LogUtil.ui("activity: " + getClass().getSimpleName() + " onCreate()");
}
@Override
public void onBackPressed() {
invokeFragmentManagerNoteStateNotSaved();
super.onBackPressed();
}
@Override
protected void onDestroy() {
super.onDestroy();
LogUtil.ui("activity: " + getClass().getSimpleName() + " onDestroy()");
destroyed = true;
}
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onPause() {
super.onPause();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
onNavigateUpClicked();
return true;
}
return super.onOptionsItemSelected(item);
}
public void setToolBar(int toolBarId, ToolBarOptions options) {
toolbar = (Toolbar) findViewById(toolBarId);
if (options.titleId != 0) {
toolbar.setTitle(options.titleId);
}
if (!TextUtils.isEmpty(options.titleString)) {
toolbar.setTitle(options.titleString);
}
if (options.logoId != 0) {
toolbar.setLogo(options.logoId);
}
setSupportActionBar(toolbar);
if (options.isNeedNavigate) {
toolbar.setNavigationIcon(options.navigateId);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onNavigateUpClicked();
}
});
}
}
public void setToolBar(int toolbarId, int titleId, int logoId) {
toolbar = (Toolbar) findViewById(toolbarId);
toolbar.setTitle(titleId);
toolbar.setLogo(logoId);
setSupportActionBar(toolbar);
}
public Toolbar getToolBar() {
return toolbar;
}
public int getToolBarHeight() {
if (toolbar != null) {
return toolbar.getHeight();
}
return 0;
}
public void onNavigateUpClicked() {
onBackPressed();
}
@Override
public void setTitle(CharSequence title) {
super.setTitle(title);
if (toolbar != null) {
toolbar.setTitle(title);
}
}
public void setSubTitle(String subTitle) {
if (toolbar != null) {
toolbar.setSubtitle(subTitle);
}
}
protected final Handler getHandler() {
if (handler == null) {
handler = new Handler(getMainLooper());
}
return handler;
}
protected void showKeyboard(boolean isShow) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if (isShow) {
if (getCurrentFocus() == null) {
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
} else {
imm.showSoftInput(getCurrentFocus(), 0);
}
} else {
if (getCurrentFocus() != null) {
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}
}
/**
* 延时弹出键盘
*
* @param focus 键盘的焦点项
*/
protected void showKeyboardDelayed(View focus) {
final View viewToFocus = focus;
if (focus != null) {
focus.requestFocus();
}
getHandler().postDelayed(new Runnable() {
@Override
public void run() {
if (viewToFocus == null || viewToFocus.isFocused()) {
showKeyboard(true);
}
}
}, 200);
}
public boolean isDestroyedCompatible() {
if (Build.VERSION.SDK_INT >= 17) {
return isDestroyedCompatible17();
} else {
return destroyed || super.isFinishing();
}
}
@TargetApi(17)
private boolean isDestroyedCompatible17() {
return super.isDestroyed();
}
/**
* fragment management
*/
public TFragment addFragment(TFragment fragment) {
List<TFragment> fragments = new ArrayList<TFragment>(1);
fragments.add(fragment);
List<TFragment> fragments2 = addFragments(fragments);
return fragments2.get(0);
}
public List<TFragment> addFragments(List<TFragment> fragments) {
List<TFragment> fragments2 = new ArrayList<TFragment>(fragments.size());
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction transaction = fm.beginTransaction();
boolean commit = false;
for (int i = 0; i < fragments.size(); i++) {
// install
TFragment fragment = fragments.get(i);
int id = fragment.getContainerId();
// exists
TFragment fragment2 = (TFragment) fm.findFragmentById(id);
if (fragment2 == null) {
fragment2 = fragment;
transaction.add(id, fragment);
commit = true;
}
fragments2.add(i, fragment2);
}
if (commit) {
try {
transaction.commitAllowingStateLoss();
} catch (Exception e) {
}
}
return fragments2;
}
public TFragment switchContent(TFragment fragment) {
return switchContent(fragment, false);
}
protected TFragment switchContent(TFragment fragment, boolean needAddToBackStack) {
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fm.beginTransaction();
fragmentTransaction.replace(fragment.getContainerId(), fragment);
if (needAddToBackStack) {
fragmentTransaction.addToBackStack(null);
}
try {
fragmentTransaction.commitAllowingStateLoss();
} catch (Exception e) {
}
return fragment;
}
protected boolean displayHomeAsUpEnabled() {
return true;
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_MENU:
return onMenuKeyDown();
default:
return super.onKeyDown(keyCode, event);
}
}
protected boolean onMenuKeyDown() {
return false;
}
private void invokeFragmentManagerNoteStateNotSaved() {
FragmentManager fm = getSupportFragmentManager();
ReflectionUtil.invokeMethod(fm, "noteStateNotSaved", null);
}
protected void switchFragmentContent(TFragment fragment) {
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction transaction = fm.beginTransaction();
transaction.replace(fragment.getContainerId(), fragment);
try {
transaction.commitAllowingStateLoss();
} catch (Exception e) {
e.printStackTrace();
}
}
protected boolean isCompatible(int apiLevel) {
return Build.VERSION.SDK_INT >= apiLevel;
}
protected <T extends View> T findView(int resId) {
return (T) (findViewById(resId));
}
}