AbsStatusBar.java 4.02 KB
package com.sunvote.statusbar;

import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.PixelFormat;
import android.os.IBinder;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;

import com.sunvote.statusbar.view.BarItem;
import com.sunvote.statusbar.view.StatusBar;

/**
 * 自定义状态栏
 * {@link #getStatusBarLayoutId()} 通过Xml配置状态栏
 * {@link #initStatusBar(StatusBar)}通过代码创建状态栏
 * @author
 */
public abstract class AbsStatusBar extends Service {

    /**
     * {@link android.view.View#GONE}、{@link android.view.View#VISIBLE}
     */
    public static final String EXTRA_STATE = "me.kaini.extra.STATE";

    /**
     * 状态栏的状态
     * {@link #EXTRA_STATE}
     */
    public static final String ACTION_STATUS_BAR_STATE = "me.kaini.intent.action.STATUS_BAR_STATE";

    private WindowManager winMgr;

    private StatusBar statusBar;

    private int mStatusBarHeight;

    private BroadcastReceiver mStatusBarStateReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            int visibility = intent.getExtras().getInt(EXTRA_STATE, View.VISIBLE);
            setStatusBarVisibility(visibility);
        }
    };

    @Override
    public void onCreate() {
        super.onCreate();
        winMgr = (WindowManager)getSystemService(Context.WINDOW_SERVICE);

        statusBar = getStatusBar();

        initStatusBar(statusBar);

        statusBar.measure(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        mStatusBarHeight = statusBar.getMeasuredHeight();

        winMgr.addView(statusBar, getStatusBarLayoutParams(mStatusBarHeight));

        IntentFilter statusBarFilter = new IntentFilter(ACTION_STATUS_BAR_STATE);
        registerReceiver(mStatusBarStateReceiver, statusBarFilter);

    }

    protected void setStatusBarVisibility(int visibility){
        statusBar.setVisibility(visibility);
    }

    private StatusBar getStatusBar(){
        LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        ViewGroup v = (ViewGroup)inflater.inflate(getStatusBarLayoutId(), null);

        StatusBar statusBar;
        if(v instanceof  StatusBar){
            statusBar = (StatusBar)v;
        }else{
            statusBar = new StatusBar(this);
            int childCount = v.getChildCount();
            for (int i = 0; i < childCount; i++){
                BarItem item = (BarItem)v.getChildAt(i);
                statusBar.addItem(item, i);
            }
        }
        return statusBar;
    }

    protected WindowManager.LayoutParams getStatusBarLayoutParams(int statusBarHieght){
        WindowManager.LayoutParams wlp = new WindowManager.LayoutParams();

        wlp.format = PixelFormat.TRANSPARENT;

        wlp.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;

        wlp.x = 0;
        wlp.y = 0;

        wlp.height = statusBarHieght;
        wlp.width = ViewGroup.LayoutParams.MATCH_PARENT;
        wlp.type = WindowManager.LayoutParams.TYPE_PHONE;
        wlp.gravity = getStatusBarGravity();
        return wlp;
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    /**
     * 获取状态栏布局,Root
     * @return
     */
    protected abstract int getStatusBarLayoutId();

    /**
     * 初始化状态图标
     * @param statusBar
     */
    protected void initStatusBar(StatusBar statusBar){}

    protected int getStatusBarGravity(){
        return Gravity.LEFT | Gravity.BOTTOM;
    }

    @Override
    public void onDestroy() {
        unregisterReceiver(mStatusBarStateReceiver);
        winMgr.removeView(statusBar);
        super.onDestroy();
    }
}