LightStatusBarCompat.java 源代码


package com.githang.statusbar;

import android.os.Build;
import android.os.Environment;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Properties;

class LightStatusBarCompat {
    private static final ILightStatusBar IMPL;

    interface ILightStatusBar {
        void setLightStatusBar(Window window, boolean z);
    }

    LightStatusBarCompat() {
    }

    static {
        if (MIUILightStatusBarImpl.isMe()) {
            if (Build.VERSION.SDK_INT >= 23) {
                IMPL = new MLightStatusBarImpl() {
                    private final ILightStatusBar DELEGATE = new MIUILightStatusBarImpl();

                    @Override
                    public void setLightStatusBar(Window window, boolean z) {
                        super.setLightStatusBar(window, z);
                        this.DELEGATE.setLightStatusBar(window, z);
                    }
                };
                return;
            } else {
                IMPL = new MIUILightStatusBarImpl();
                return;
            }
        }
        if (Build.VERSION.SDK_INT >= 23) {
            IMPL = new MLightStatusBarImpl();
        } else if (MeizuLightStatusBarImpl.isMe()) {
            IMPL = new MeizuLightStatusBarImpl();
        } else {
            IMPL = new ILightStatusBar() {
                @Override
                public void setLightStatusBar(Window window, boolean z) {
                }
            };
        }
    }

    public static void setLightStatusBar(Window window, boolean z) {
        IMPL.setLightStatusBar(window, z);
    }

    private static class MLightStatusBarImpl implements ILightStatusBar {
        private MLightStatusBarImpl() {
        }

        @Override
        public void setLightStatusBar(Window window, boolean z) {
            View decorView = window.getDecorView();
            int systemUiVisibility = decorView.getSystemUiVisibility();
            decorView.setSystemUiVisibility(z ? systemUiVisibility | 8192 : systemUiVisibility & (-8193));
        }
    }

    private static class MIUILightStatusBarImpl implements ILightStatusBar {
        private static final String KEY_MIUI_INTERNAL_STORAGE = "ro.miui.internal.storage";
        private static final String KEY_MIUI_VERSION_CODE = "ro.miui.ui.version.code";
        private static final String KEY_MIUI_VERSION_NAME = "ro.miui.ui.version.name";

        private MIUILightStatusBarImpl() {
        }

        static boolean isMe() {
            boolean z = false;
            FileInputStream fileInputStream = null;
            try {
                FileInputStream fileInputStream2 = new FileInputStream(new File(Environment.getRootDirectory(), "build.prop"));
                try {
                    Properties properties = new Properties();
                    properties.load(fileInputStream2);
                    if (properties.getProperty(KEY_MIUI_VERSION_CODE) == null && properties.getProperty(KEY_MIUI_VERSION_NAME) == null) {
                    }
                    z = true;
                    try {
                        fileInputStream2.close();
                    } catch (IOException unused) {
                    }
                    return z;
                } catch (IOException unused2) {
                    fileInputStream = fileInputStream2;
                    if (fileInputStream != null) {
                        try {
                            fileInputStream.close();
                        } catch (IOException unused3) {
                        }
                    }
                    return false;
                } catch (Throwable th) {
                    th = th;
                    fileInputStream = fileInputStream2;
                    if (fileInputStream != null) {
                        try {
                            fileInputStream.close();
                        } catch (IOException unused4) {
                        }
                    }
                    throw th;
                }
            } catch (IOException unused5) {
            } catch (Throwable th2) {
                th = th2;
            }
        }

        @Override
        public void setLightStatusBar(Window window, boolean z) {
            Class<?> cls = window.getClass();
            try {
                Class<?> cls2 = Class.forName("android.view.MiuiWindowManager$LayoutParams");
                int i = cls2.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE").getInt(cls2);
                Method method = cls.getMethod("setExtraFlags", Integer.TYPE, Integer.TYPE);
                Object[] objArr = new Object[2];
                objArr[0] = Integer.valueOf(z ? i : 0);
                objArr[1] = Integer.valueOf(i);
                method.invoke(window, objArr);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    private static class MeizuLightStatusBarImpl implements ILightStatusBar {
        private MeizuLightStatusBarImpl() {
        }

        static boolean isMe() {
            return Build.DISPLAY.startsWith("Flyme");
        }

        @Override
        public void setLightStatusBar(Window window, boolean z) {
            WindowManager.LayoutParams attributes = window.getAttributes();
            try {
                Field declaredField = WindowManager.LayoutParams.class.getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON");
                Field declaredField2 = WindowManager.LayoutParams.class.getDeclaredField("meizuFlags");
                declaredField.setAccessible(true);
                declaredField2.setAccessible(true);
                int i = declaredField.getInt(null);
                int i2 = declaredField2.getInt(attributes);
                declaredField2.setInt(attributes, z ? i2 | i : (~i) & i2);
                window.setAttributes(attributes);
                declaredField.setAccessible(false);
                declaredField2.setAccessible(false);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}