package com.yydcdut.note.views; import android.annotation.TargetApi; import android.content.res.TypedArray; import android.graphics.Color; import android.graphics.Point; import android.os.Build; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v7.app.AppCompatActivity; import android.util.TypedValue; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.widget.FrameLayout; import android.widget.LinearLayout; import com.umeng.analytics.MobclickAgent; import com.yydcdut.note.NoteApplication; import com.yydcdut.note.R; import com.yydcdut.note.injector.component.ActivityComponent; import com.yydcdut.note.injector.component.DaggerActivityComponent; import com.yydcdut.note.injector.module.ActivityModule; import com.yydcdut.note.presenters.IPresenter; import com.yydcdut.note.presenters.ThemePresenter; import com.yydcdut.note.utils.ActivityCollector; import com.yydcdut.note.utils.AppCompat; import com.yydcdut.note.utils.ThemeHelper; import com.yydcdut.note.utils.YLog; import com.yydcdut.note.widget.StatusBarView; import java.lang.reflect.Field; /** * Created by yyd on 15-4-6. */ public abstract class BaseActivity extends AppCompatActivity implements IThemeView { protected ActivityComponent mActivityComponent; public static final int RESULT_NOTHING = 1; public static final int RESULT_DATA = 2; public static final int RESULT_PICTURE = 3; public static final int RESULT_DATA_QQ = 4; public static final int RESULT_DATA_EVERNOTE = 5; public static final int RESULT_DATA_USER = 6; public static final int RESULT_DATA_IMAGE = 7; public static final int REQUEST_NOTHING = 1; public static final int REQUEST_DATA_IMAGE = 2; public static final int REQUEST_CODE = 1; public static final int CODE_RESULT_CHANGED = 1; public static final int CODE_RESULT_NOT_CHANGED = -1; public static final String INTENT_PAGE = "page"; public static final String INTENT_FOLDER = "folder"; public static final String INTENT_PREVIEW_SELECTED = "preview_selected"; private ThemePresenter mThemePresenter; //不能为null protected IPresenter mIPresenter; @TargetApi(Build.VERSION_CODES.LOLLIPOP) @Override public void setActivityTheme(int index) { super.setTheme(ThemeHelper.THEME.get(index).getStyle()); if (AppCompat.AFTER_LOLLIPOP) { //NavigationBar getWindow().setNavigationBarColor(AppCompat.getColor(ThemeHelper.THEME.get(index).getColorPrimary(), this)); } } @TargetApi(Build.VERSION_CODES.LOLLIPOP) @Override public void setStatusBarTranslation(boolean translation) { int color = ThemeHelper.getDarkPrimaryColor(this); if (translation) { color = ThemeHelper.getPrimaryColor(this); } if (AppCompat.AFTER_LOLLIPOP) { getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); getWindow().setStatusBarColor(color); } if (AppCompat.AFTER_KITKAT) { getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); View statusView = createStatusBarView(color, 255); ViewGroup decorView = (ViewGroup) getWindow().getDecorView(); if (AppCompat.AFTER_LOLLIPOP) { View view = decorView.getChildAt(0); if (view instanceof FrameLayout) { FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) view.getLayoutParams(); layoutParams.topMargin = getStatusBarSize(); view.setLayoutParams(layoutParams); } } decorView.addView(statusView); setRootView(); } } protected StatusBarView createStatusBarView(int color, int alpha) { StatusBarView statusBarView = new StatusBarView(this); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarSize()); statusBarView.setLayoutParams(params); statusBarView.setBackgroundColor(Color.argb(alpha, Color.red(color), Color.green(color), Color.blue(color))); return statusBarView; } /** * 设置根布局参数 */ private void setRootView() { ViewGroup rootView = (ViewGroup) ((ViewGroup) findViewById(android.R.id.content)).getChildAt(0); if (rootView == null) { return; } rootView.setFitsSystemWindows(true); rootView.setClipToPadding(true); } /** * 设置状态栏 * * @param wannaSet * @return */ public boolean setWindowStatusBar(boolean wannaSet) { if (AppCompat.AFTER_LOLLIPOP && wannaSet) { getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); return true; } return false; } /** * 是否让BaseActivity去设置statusBar * 设置成透明或者沉浸状态栏 * * @return */ public abstract boolean setStatusBar(); /** * 设置view * * @return */ public abstract int setContentView(); /** * 注入Injector */ public abstract void initInjector(); /** * init UI && Listener */ public abstract void initUiAndListener(); /** * 开启activity的动画 */ public void startActivityAnimation() { } @Override protected void onCreate(Bundle savedInstanceState) { mActivityComponent = DaggerActivityComponent.builder() .activityModule(new ActivityModule(this)) .applicationComponent(((NoteApplication) getApplication()).getApplicationComponent()) .build(); ActivityCollector.addActivity(this); mThemePresenter = new ThemePresenter(getApplicationContext()); mThemePresenter.attachView(this); mThemePresenter.setTheme(); boolean isSet = setWindowStatusBar(setStatusBar()); super.onCreate(savedInstanceState); int layout = setContentView(); if (isSet) { mThemePresenter.setStatusBar(); } setContentView(layout); initInjector(); initUiAndListener(); startActivityAnimation(); } /** * 得到actionbar大小 * * @return */ public int getActionBarSize() { TypedValue typedValue = new TypedValue(); int[] textSizeAttr = new int[]{R.attr.actionBarSize}; int indexOfAttrTextSize = 0; TypedArray a = obtainStyledAttributes(typedValue.data, textSizeAttr); int actionBarSize = a.getDimensionPixelSize(indexOfAttrTextSize, -1); a.recycle(); return actionBarSize; } /** * 得到stausBar高度 * * @return */ public int getStatusBarSize() { Class<?> c = null; Object obj = null; Field field = null; int x = 0, sbar = 38;//默认为38,貌似大部分是这样的 try { c = Class.forName("com.android.internal.R$dimen"); obj = c.newInstance(); field = c.getField("status_bar_height"); x = Integer.parseInt(field.get(obj).toString()); sbar = getResources().getDimensionPixelSize(x); } catch (Exception e1) { YLog.e(e1); } return sbar; } /** * 主题 * * @return */ public int getThemeColor() { TypedValue typedValue = new TypedValue(); int[] colorAttr = new int[]{R.attr.colorPrimary}; int indexOfAttrColor = 0; TypedArray a = obtainStyledAttributes(typedValue.data, colorAttr); int color = a.getColor(indexOfAttrColor, -1); a.recycle(); return color; } /** * 计算坐标 * * @param src * @param target * @return */ public Point getLocationInView(View src, View target) { final int[] l0 = new int[2]; src.getLocationOnScreen(l0); final int[] l1 = new int[2]; target.getLocationOnScreen(l1); l1[0] = l1[0] - l0[0] + target.getWidth() / 2; l1[1] = l1[1] - l0[1] + target.getHeight() / 2; return new Point(l1[0], l1[1]); } @Override protected void onDestroy() { super.onDestroy(); ActivityCollector.removeActivity(this); if (mIPresenter != null) { mIPresenter.detachView(); } else { YLog.wtf("yuyidong", "this activity " + this.getClass().getSimpleName() + " 没有设置 IPresenter!!!"); } } @Override protected void onResume() { super.onResume(); MobclickAgent.onResume(this); } @Override protected void onPause() { super.onPause(); MobclickAgent.onPause(this); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); YLog.i("yuyidong", "onRequestPermissionsResult"); } public IPresenter getPresenter() { return mIPresenter; } }