SystemUI狀態欄添加電量百分比顯示

OS: MTK 6.0

1.添加一個控制顯示的開關
  • 源碼路徑:/packages/apps/Settings/src/com/mediatek/settings/fuelgauge/PowerUsageExts.java
    在setting中電量設置項新增一項
  public void initPowerUsageExtItems() {
 		 ...
     // add  for battery percentage   
     mBatteryPercentPrf = new SwitchPreference(mContext);
     mBatteryPercentPrf.setKey(KEY_BATTERY_PERCENTAGE_ENABLE);
     mBatteryPercentPrf.setTitle(R.string.battery_percentage_title);
     mBatteryPercentPrf.setOrder(PREFERENCE_ORDER_FIRST);
     mBatteryPercentPrf.setChecked(true);
     mPowerUsageScreen.addPreference(mBatteryPercentPrf);
  	 //add end
  }
   
  public boolean onPowerUsageExtItemsClick(PreferenceScreen preferenceScreen
       		 Preference preference) {
     // add by wxd for battery percentage
     if (KEY_BATTERY_PERCENTAGE_ENABLE.equals(preference.getKey())) {
         if (preference instanceof SwitchPreference) {
             SwitchPreference pref = (SwitchPreference) preference;
             int bgState = pref.isChecked() ? 1 : 0;
             Log.d(TAG, "battery percentage enable state: " + bgState);
             Settings.System.putInt(mContext.getContentResolver(),
                         "BATTERY_PERCENTAGE_ENABLE", bgState);
                         
             Intent intent = new Intent(ACTION_BATTERY_PERCENTAGE_ENABLE);
             mContext.sendBroadcast(intent);     // 狀態發生變化發送廣播,顯示或隱藏電量百分比
             
             if (mBatteryPercentPrf != null) {
                 mBatteryPercentPrf.setChecked(pref.isChecked());
             }       
          }
          return true;
      }
      //add end 		 
2.添加電量顯示的textview
  • 源碼路徑:/frameworks/base/packages/SystemUI/res/layout/status_bar.xml
 <include layout="@layout/system_icons" />
 
 <TextView android:id="@+id/battery_level"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_gravity="center_vertical"
      android:paddingEnd="@dimen/battery_level_padding_end"
      android:textColor="#ffffff"
      android:visibility="gone"
      android:textSize="@dimen/battery_level_text_size"
      android:importantForAccessibility="noHideDescendants"/>
3.電量顯示
  • 源碼路徑:/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
    PhoneStatusBar中有個電量變化的監聽回調
  protected PhoneStatusBarView makeStatusBarView() {
 		 ...
    battery_level_tv = (TextView)mStatusBarView.findViewById(R.id.battery_level);  // add
   		 ...
   	mBatteryController.addStateChangedCallback(new BatteryStateChangeCallback() {
          @Override
          public void onPowerSaveChanged() {   // 省電模式變化
             mHandler.post(mCheckBarModes);
             if (mDozeServiceHost != null) {
                 mDozeServiceHost.firePowerSaveChanged(mBatteryController.isPowerSave());
             }
          }
          
          @Override
          public void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging) {    // 電量變化回調
                // add start
             percentage = NumberFormat.getPercentInstance().format((double) level / 100.0);
             isBatteryPercentage = Settings.System.getInt(mContext.getContentResolver(),
                    "BATTERY_PERCENTAGE_ENABLE", 1) != 0;
             refreshBatteryPercentage();
               // add end
          }
    });	 
         ...
     // add 註冊電量顯示開關使能廣播
    IntentFilter batteryPercentfilter = new IntentFilter();
    batteryPercentfilter.addAction(ACTION_BATTERY_PERCENTAGE_ENABLE);
    context.registerReceiver(mBatteryPercentReceiver, batteryPercentfilter);
     //add end    
     		...
  }

  // add for battery percentage
   private void refreshBatteryPercentage(){
      if (isBatteryPercentage) {
          battery_level_tv.setText(percentage);
          battery_level_tv.setVisibility(View.VISIBLE);
      } else {
          battery_level_tv.setVisibility(View.GONE);
      }
   }

   private TextView battery_level_tv;
   private String percentage;
   private boolean isBatteryPercentage = false;
   private static final String ACTION_BATTERY_PERCENTAGE_ENABLE = "action_battery_percentage_enable";

   private BroadcastReceiver mBatteryPercentReceiver = new BroadcastReceiver() {
   		 @Override
         public void onReceive(Context context, Intent intent) {
             String action = intent.getAction();
             if (ACTION_BATTERY_PERCENTAGE_ENABLE.equals(action)) {
                if (battery_level_tv == null) {
                    battery_level_tv = (TextView)mStatusBarView.findViewById(R.id.battery_level);
                } 
                isBatteryPercentage = Settings.System.getInt(mContext.getContentResolver(),
                    "BATTERY_PERCENTAGE_ENABLE", 1) != 0;
                refreshBatteryPercentage();
             }
         }
   };
     // add end

其實,上面的mBatteryController是一個廣播,監聽電量變化的廣播Intent.ACTION_BATTERY_CHANGED

  • 源碼路徑:/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章