package com.wenming.weiswift.ui.common;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.Dialog;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import com.readystatesoftware.systembartint.SystemBarTintManager;
import com.wenming.weiswift.R;
import com.wenming.weiswift.utils.LogUtil;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
/**
* 用于设置状态栏的颜色,包括背景色和文字的颜色
* Created by wenmingvs on 16/8/12.
*/
public final class StatusBarUtils {
/**
* 是否处理stausbar的文字为深色
*/
private boolean lightStatusBar = true;
/**
* 是否把状态栏设置为透明的
*/
private boolean transparentStatusBar = false;
/**
* 是否把导航栏设置为透明的
*/
private boolean transparentNavigationbar = false;
/**
* 窗口,外出传入
*/
private final Window window;
/**
* 导航栏的view,外部传入,可以返回导航栏的高度和偏移位置
*/
private final View actionBarView;
/**
* 需要把statusBar设置为什么颜色
*/
private final int statusBarColor;
/**
* 当前的sdk版本
*/
private final int current = Build.VERSION.SDK_INT;
/**
* 支持状态栏文字变色的机型
*/
private ArrayList<String> mChangeTextMobilelist = new ArrayList<>(Arrays.asList("Meizu", "Xiaomi"));
private StatusBarUtils(Window window, boolean lightStatusBar, boolean transparentStatusBar, boolean transparentNavigationbar, View actionBarView, int statusBarColor) {
this.lightStatusBar = lightStatusBar;
this.transparentStatusBar = transparentStatusBar;
this.window = window;
this.transparentNavigationbar = transparentNavigationbar;
this.actionBarView = actionBarView;
this.statusBarColor = statusBarColor;
}
/**
* 配置完成后,调用此方法开始根据配置对标题栏做一系列处理
*
* @param activity
*/
private void process(Activity activity) {
//处理状态栏透明度
if (current >= Build.VERSION_CODES.KITKAT && current < Build.VERSION_CODES.M) {
processKitkat(activity);
} else if (current == Build.VERSION_CODES.LOLLIPOP) {
//处理状态栏透明度的同时,还需要且设置statusbar的文字变色
processM();
} else if (current >= Build.VERSION_CODES.M) {
//处理状态栏透明度的同时,还需要且设置statusbar的文字变色
processM();
}
//处理android4.4.4到android5.0的状态栏的文字变色
processPrivateAPI();
}
/**
* 调用私有API处理颜色
*/
private void processPrivateAPI() {
try {
processFlyMe(lightStatusBar);
} catch (Exception e) {
try {
processMIUI(lightStatusBar);
} catch (Exception e2) {
}
}
}
/**
* 处理4.4~5.0沉浸,把状态栏变成透明的,然后叠一层纯色的view上去
*/
@TargetApi(Build.VERSION_CODES.KITKAT)
private void processKitkat(Activity activity) {
WindowManager.LayoutParams winParams = window.getAttributes();
//只有支持状态栏文字变色的机型,才修改状态栏为全透明
LogUtil.d("Build.MANUFACTURER = " + Build.MANUFACTURER);
if (mChangeTextMobilelist.contains(Build.MANUFACTURER) && transparentStatusBar) {
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
} else {
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
window.setAttributes(winParams);
if (mChangeTextMobilelist.contains(Build.MANUFACTURER)) {
SystemBarTintManager tintManager = new SystemBarTintManager(activity);
// 激活状态栏设置
tintManager.setStatusBarTintEnabled(true);
// 使用颜色资源
tintManager.setStatusBarTintResource(R.color.home_status_text);
}
}
/**
* 改变小米的状态栏字体颜色为黑色, 要求MIUI6以上
* Tested on: MIUIV7 5.0 Redmi-Note3
*/
private void processMIUI(boolean lightStatusBar) throws Exception {
Class<? extends Window> clazz = window.getClass();
int darkModeFlag;
Class<?> layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");
Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");
darkModeFlag = field.getInt(layoutParams);
Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class);
extraFlagField.invoke(window, lightStatusBar ? darkModeFlag : 0, darkModeFlag);
}
/**
* 改变魅族的状态栏字体为黑色,要求FlyMe4以上
*/
private void processFlyMe(boolean isLightStatusBar) throws Exception {
WindowManager.LayoutParams lp = window.getAttributes();
Class<?> instance = Class.forName("android.view.WindowManager$LayoutParams");
int value = instance.getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON").getInt(lp);
Field field = instance.getDeclaredField("meizuFlags");
field.setAccessible(true);
int origin = field.getInt(lp);
if (isLightStatusBar) {
field.set(lp, origin | value);
} else {
field.set(lp, (~value) & origin);
}
}
@TargetApi(Build.VERSION_CODES.M)
private void processM() {
if (current < Build.VERSION_CODES.M) {
return;
}
int flag = window.getDecorView().getSystemUiVisibility();
if (lightStatusBar) {
//改变字体颜色
flag |= (WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
window.setStatusBarColor(statusBarColor);
}
if (transparentStatusBar) {
//flag |= View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
flag |= View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
window.setStatusBarColor(statusBarColor);
}
if (transparentNavigationbar) {
flag |= (View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
window.setNavigationBarColor(statusBarColor);
}
window.getDecorView().setSystemUiVisibility(flag);
}
public static Builder from(Activity activity) {
return new Builder().setWindow(activity);
}
public static Builder from(Dialog dialog) {
return new Builder().setWindow(dialog);
}
public static Builder from(Window window) {
return new Builder().setWindow(window);
}
/**
* 配置类
*/
final public static class Builder {
private Window window;
private boolean lightStatusBar = false;
private boolean transparentStatusbar = false;
private boolean transparentNavigationbar = false;
private int statusBarColor;
private View actionBarView;
public Builder setActionbarView(@Nullable View actionbarView) {
this.actionBarView = actionbarView;
return this;
}
private Builder setWindow(@NonNull Window Window) {
this.window = Window;
return this;
}
private Builder setWindow(@NonNull Activity activity) {
this.window = activity.getWindow();
return this;
}
private Builder setWindow(@NonNull Dialog dialog) {
this.window = dialog.getWindow();
return this;
}
public Builder setLightStatusBar(boolean lightStatusBar) {
this.lightStatusBar = lightStatusBar;
return this;
}
public Builder setTransparentStatusbar(boolean transparentStatusbar) {
this.transparentStatusbar = transparentStatusbar;
return this;
}
public Builder setTransparentNavigationbar(boolean transparentNavigationbar) {
this.transparentNavigationbar = transparentNavigationbar;
return this;
}
public Builder setStatusBarColor(int statusBarColor) {
this.statusBarColor = statusBarColor;
return this;
}
public void process(Activity activity) {
new StatusBarUtils(window, lightStatusBar, transparentStatusbar, transparentNavigationbar,
actionBarView, statusBarColor).process(activity);
}
}
}