android6.0 添加电量百分比

要完成这个功能需要修改SystemUI和Settings两部分
一、Settings添加开关——控制是否打开此功能
我选择把开关添加到display模块下

diff --git a/packages/apps/Settings/res/xml/display_settings.xml b/packages/apps/Settings/res/xml/display_settings.xml
index 7150150..590bee9 100644
--- a/packages/apps/Settings/res/xml/display_settings.xml
+++ b/packages/apps/Settings/res/xml/display_settings.xml
@@ -110,4 +110,9 @@
                 settings:keywords="@string/keywords_display_cast_screen"
                 android:fragment="com.android.settings.wfd.WifiDisplaySettings" />

+       
+        android:key="battery_pct"
+        android:title="@string/show_battery_percentage"
+        android:persistent="false" />
+
 

然后在packages/apps/Settings/src/com/android/settings/DisplaySettings.java 对SwitchPreference进行控制监听

diff --git a/packages/apps/Settings/src/com/android/settings/DisplaySettings.java b/packages/apps/Settings/src/com/android/s
index 9f29ca5..d1eafba 100755
--- a/packages/apps/Settings/src/com/android/settings/DisplaySettings.java
+++ b/packages/apps/Settings/src/com/android/settings/DisplaySettings.java
@@ -42,16 +42,22 @@ import android.content.Context;
 import android.content.pm.PackageManager;
 import android.content.res.Configuration;
 import android.content.res.Resources;
+import android.database.ContentObserver;
 import android.hardware.Sensor;
 import android.hardware.SensorManager;
+import android.net.Uri;
 import android.os.Build;
 import android.os.Bundle;
+import android.os.Handler;
 import android.os.RemoteException;
 import android.os.SystemProperties;
 import android.preference.ListPreference;
 import android.preference.Preference;
 import android.preference.Preference.OnPreferenceClickListener;
+import android.preference.Preference.OnPreferenceChangeListener;
 import android.preference.PreferenceScreen;
+import android.provider.Settings;
+import android.provider.Settings.System;
 import android.preference.SwitchPreference;
 import android.provider.SearchIndexableResource;
 import android.provider.Settings;
@@ -78,6 +84,7 @@ public class DisplaySettings extends SettingsPreferenceFragment implements
     private static final String KEY_AUTO_ROTATE = "auto_rotate";
     private static final String KEY_NIGHT_MODE = "night_mode";
     private static final String KEY_CAMERA_GESTURE = "camera_gesture";
+    private static final String KEY_BATTERY_PCT = "battery_pct";
     private static final String KEY_CAMERA_DOUBLE_TAP_POWER_GESTURE
             = "camera_double_tap_power_gesture";

@@ -96,6 +103,8 @@ public class DisplaySettings extends SettingsPreferenceFragment implements
     private SwitchPreference mAutoBrightnessPreference;
     private SwitchPreference mCameraGesturePreference;
     private SwitchPreference mCameraDoubleTapPowerGesturePreference;
+    private SwitchPreference mBatteryPct;
+    private final SettingObserver mSettingObserver = new SettingObserver();

     @Override
     protected int getMetricsCategory() {
@@ -130,6 +139,8 @@ public class DisplaySettings extends SettingsPreferenceFragment implements
         mFontSizePref.setOnPreferenceChangeListener(this);
         mFontSizePref.setOnPreferenceClickListener(this);

+       mBatteryPct = (SwitchPreference) findPreference(KEY_BATTERY_PCT);
+
         if (hasLightSensor && isAutomaticBrightnessAvailable(getResources())) {
             mAutoBrightnessPreference = (SwitchPreference) findPreference(KEY_AUTO_BRIGHTNESS);
             mAutoBrightnessPreference.setOnPreferenceChangeListener(this);
@@ -221,6 +232,23 @@ public class DisplaySettings extends SettingsPreferenceFragment implements
         }
     }

+    public final String SHOW_PERCENT_SETTING = "status_bar_show_battery_percent";
+    private final OnPreferenceChangeListener mBatteryPctChange = new OnPreferenceChangeListener() {
+        @Override
+        public boolean onPreferenceChange(Preference preference, Object newValue) {
+            final boolean v = (Boolean) newValue;
+            MetricsLogger.action(getContext(), MetricsLogger.TUNER_BATTERY_PERCENTAGE, v);
+            System.putInt(getContext().getContentResolver(), SHOW_PERCENT_SETTING, v ? 1 : 0);
+            return true;
+        }
+    };
+    private void updateBatteryPct() {
+        mBatteryPct.setOnPreferenceChangeListener(null);
+        mBatteryPct.setChecked(System.getInt(getContext().getContentResolver(),
+                SHOW_PERCENT_SETTING, 0) != 0);
+        mBatteryPct.setOnPreferenceChangeListener(mBatteryPctChange);
+    }
+
     private static boolean allowAllRotations(Context context) {
         return Resources.getSystem().getBoolean(
                 com.android.internal.R.bool.config_allowAllRotations);
@@ -370,6 +398,17 @@ public class DisplaySettings extends SettingsPreferenceFragment implements
     public void onResume() {
         super.onResume();
         updateState();
+       updateBatteryPct();
+       getContext().getContentResolver().registerContentObserver(
+                System.getUriFor(SHOW_PERCENT_SETTING), false, mSettingObserver);
+       MetricsLogger.visibility(getContext(), MetricsLogger.TUNER, true);
+    }
+
+    @Override
+    public void onPause(){
+       super.onPause();
+       getContext().getContentResolver().unregisterContentObserver(mSettingObserver);
+       MetricsLogger.visibility(getContext(), MetricsLogger.TUNER, false);
     }

     @Override
@@ -575,4 +614,16 @@ public class DisplaySettings extends SettingsPreferenceFragment implements
                     return result;
                 }
             };
+
+    private final class SettingObserver extends ContentObserver {
+        public SettingObserver() {
+            super(new Handler());
+        }
+
+        @Override
+        public void onChange(boolean selfChange, Uri uri, int userId) {
+            super.onChange(selfChange, uri, userId);
+            updateBatteryPct();
+        }
+    }

其中使用到了[ContentObserver]这个类用来监听数据库中某个数值的变化可以去看这篇文章。
到此settings部分完成。
二、SystemUI部分—–添加显示百分比
首先在frameworks/base/packages/SystemUI/res/layout/status_bar.xml添加一个TextView如下

diff --git a/frameworks/base/packages/SystemUI/res/layout/status_bar.xml b/frameworks/base/packages/SystemUI/res/layout/stat
index 8d4e33f..cb74062 100644
--- a/frameworks/base/packages/SystemUI/res/layout/status_bar.xml
+++ b/frameworks/base/packages/SystemUI/res/layout/status_bar.xml
@@ -96,6 +96,15 @@

             

+           
+                android:id="@+id/percentage"  
+                android:layout_height="wrap_content"  
+                android:layout_width="wrap_content"  
+                android:visibility = "gone"  
+                android:paddingLeft="4dip"  
+                android:textSize="@dimen/status_bar_clock_size"  
+                android:textColor="@color/qs_text"/>
+
             

添加万textView后就可以到代码中进行控制我们可以在frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java中对它进行显示/隐藏/赋值
在这之前需要把textview传到BatteryController

diff --git a/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/frameworks/bas
index 6bde992..e8751c0 100644
--- a/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java

@@ -821,6 +821,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
         mLocationController = new LocationControllerImpl(mContext,
                 mHandlerThread.getLooper()); // will post a notification
         mBatteryController = new BatteryController(mContext);
+       mBatteryController.setTextView((TextView) mStatusBarWindow.findViewById(R.id.percentage));
         mBatteryController.addStateChangedCallback(new BatteryStateChangeCallback() {
             @Override
diff --git a/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java b/frameworks
index d1b69ab..0fd4961 100644
--- a/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java
+++ b/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java
@@ -20,9 +20,15 @@ import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.database.ContentObserver;
+import android.net.Uri;
 import android.os.BatteryManager;
+import android.os.Handler;
 import android.os.PowerManager;
+import android.provider.Settings;
 import android.util.Log;
+import android.widget.TextView;
+import android.view.View;

 import java.io.FileDescriptor;
 import java.io.PrintWriter;
@@ -31,7 +37,7 @@ import java.util.ArrayList;
 public class BatteryController extends BroadcastReceiver {
     private static final String TAG = "BatteryController";
     private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
-
+    private final String SHOW_PERCENT_SETTING = "status_bar_show_battery_percent";
     private final ArrayList mChangeCallbacks = new ArrayList<>();
     private final PowerManager mPowerManager;

@@ -40,16 +46,23 @@ public class BatteryController extends BroadcastReceiver {
     private boolean mCharging;
     private boolean mCharged;
     private boolean mPowerSave;
+    private TextView mBatteryPercent;
+    private boolean mShowPercent;
+    private String mPercent = "100%";
+    private Context mContext;
+    private final SettingObserver mSettingObserver = new SettingObserver();

     public BatteryController(Context context) {
         mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
-
+        mContext = context;
         IntentFilter filter = new IntentFilter();
         filter.addAction(Intent.ACTION_BATTERY_CHANGED);
         filter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED);
         filter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGING);
         context.registerReceiver(this, filter);
-
+        context.getContentResolver().registerContentObserver(
+                Settings.System.getUriFor(SHOW_PERCENT_SETTING), false, mSettingObserver);
+       updateShowPercent();
         updatePowerSave();
     }

@@ -71,6 +84,26 @@ public class BatteryController extends BroadcastReceiver {
         mChangeCallbacks.remove(cb);
     }

+    public void setTextView(TextView batteryPercent){
+       mBatteryPercent = batteryPercent;
+    }
+
+    private String getBatteryPercentage(Intent batteryChangedIntent) {  
+        int level = batteryChangedIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);  
+        int scale = batteryChangedIntent.getIntExtra(BatteryManager.EXTRA_SCALE, 100);  
+        return String.valueOf(level * 100 / scale) + "%";  
+    }
+
+    private void setPercent() {
+       if (mBatteryPercent == null) return;
+       if (mShowPercent) {
+           mBatteryPercent.setText(mPercent);
+           mBatteryPercent.setVisibility(View.VISIBLE);
+       } else {
+           mBatteryPercent.setVisibility(View.GONE);
+       }
+    } 
+
     public void onReceive(Context context, Intent intent) {
         final String action = intent.getAction();
         if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {
@@ -83,7 +116,8 @@ public class BatteryController extends BroadcastReceiver {
                     BatteryManager.BATTERY_STATUS_UNKNOWN);
             mCharged = status == BatteryManager.BATTERY_STATUS_FULL;
             mCharging = mCharged || status == BatteryManager.BATTERY_STATUS_CHARGING;
-
+           mPercent = getBatteryPercentage(intent);
+           setPercent();
             fireBatteryLevelChanged();
         } else if (action.equals(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED)) {
             updatePowerSave();
@@ -125,4 +159,28 @@ public class BatteryController extends BroadcastReceiver {
         void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging);
         void onPowerSaveChanged();
     }
+
+    private void updateShowPercent() {
+        mShowPercent = 0 != Settings.System.getInt(mContext.getContentResolver(),
+                SHOW_PERCENT_SETTING, 0);
+    }
+
+    private final class SettingObserver extends ContentObserver {
+        public SettingObserver() {
+            super(new Handler());
+        }
+
+        @Override
+        public void onChange(boolean selfChange, Uri uri) {
+            super.onChange(selfChange, uri);
+            updateShowPercent();
+           if (mBatteryPercent != null){
+               if (mShowPercent) {
+                   mBatteryPercent.setVisibility(View.VISIBLE);
+               } else {
+                    mBatteryPercent.setVisibility(View.GONE);
+               }
+           }
+        }
+    }
 }

这样只是在statubar显示电量百分比,系统有个地方还会显示,当充电时锁屏界面会显示。所以我们要改一下它的逻辑让它也由SHOW_PERCENT_SETTING控制如下更改

diff --git a/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java b/framewo
index b93fc76..e75bbcf 100644
--- a/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
+++ b/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
@@ -35,9 +35,11 @@ import com.android.systemui.statusbar.policy.BatteryController;
 import com.android.systemui.statusbar.policy.KeyguardUserSwitcher;
 import com.android.systemui.statusbar.policy.UserInfoController;
 import com.android.systemui.statusbar.policy.UserSwitcherController;
-
+import android.provider.Settings;
 import java.text.NumberFormat;
-
+import android.database.ContentObserver;
+import android.net.Uri;
+import android.os.Handler;
 /**
  * The header group on Keyguard.
  */
@@ -59,9 +61,13 @@ public class KeyguardStatusBarView extends RelativeLayout

     private int mSystemIconsSwitcherHiddenExpandedMargin;
     private Interpolator mFastOutSlowInInterpolator;
-
+    private final String SHOW_PERCENT_SETTING = "status_bar_show_battery_percent";
+    private final SettingObserver mSettingObserver = new SettingObserver();  
     public KeyguardStatusBarView(Context context, AttributeSet attrs) {
         super(context, attrs);
+       context.getContentResolver().registerContentObserver(
+                Settings.System.getUriFor(SHOW_PERCENT_SETTING), false, mSettingObserver);
+
     }

     @Override
@@ -76,6 +82,7 @@ public class KeyguardStatusBarView extends RelativeLayout
         mFastOutSlowInInterpolator = AnimationUtils.loadInterpolator(getContext(),
                 android.R.interpolator.fast_out_slow_in);
         updateUserSwitcher();
+       updateVisibilities();
     }

     @Override
@@ -94,6 +101,22 @@ public class KeyguardStatusBarView extends RelativeLayout
         mSystemIconsSwitcherHiddenExpandedMargin = getResources().getDimensionPixelSize(
                 R.dimen.system_icons_switcher_hidden_expanded_margin);
     }
+       
+    private final class SettingObserver extends ContentObserver {
+        public SettingObserver() {
+            super(new Handler());
+        }
+
+        @Override
+        public void onChange(boolean selfChange, Uri uri) {
+            super.onChange(selfChange, uri);
+            updateVisibilities();
+       }
+    }
+    
+
+
+

     private void updateVisibilities() {
         if (mMultiUserSwitch.getParent() != this && !mKeyguardUserSwitcherShowing) {
@@ -104,7 +127,15 @@ public class KeyguardStatusBarView extends RelativeLayout
         } else if (mMultiUserSwitch.getParent() == this && mKeyguardUserSwitcherShowing) {
             removeView(mMultiUserSwitch);
         }
-        mBatteryLevel.setVisibility(mBatteryCharging ? View.VISIBLE : View.GONE);
+       int isDisplay=Settings.System.getInt(mContext.getContentResolver(),
+                SHOW_PERCENT_SETTING, 0);
+       if(isDisplay==0){
+               mBatteryLevel.setVisibility(View.GONE); 
+       }else{
+               mBatteryLevel.setVisibility(View.VISIBLE);
+       }
+        //mBatteryLevel.setVisibility(isDisplay ? View.VISIBLE : View.GONE);
+       //mBatteryLevel.setVisibility(mBatteryCharging ? View.VISIBLE : View.GONE);
     }

到此显示也完成了。
但是SHOW_PERCENT_SETTING这个值还会控制Android自带的一个功能(把电量显示到电池图标内)。所以我们要把这个功能屏蔽了
屏蔽如下

diff --git a/frameworks/base/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java b/frameworks/base/packages/Sys
index 95b58e5..21de480 100755
--- a/frameworks/base/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
+++ b/frameworks/base/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
@@ -54,7 +54,7 @@ public class BatteryMeterView extends View implements DemoMode,

     private final int[] mColors;

-    private boolean mShowPercent;
+    private boolean mShowPercent = false;
     private float mButtonHeightFraction;
     private float mSubpixelSmoothingLeft;
     private float mSubpixelSmoothingRight;
@@ -231,8 +231,8 @@ public class BatteryMeterView extends View implements DemoMode,
     }

     private void updateShowPercent() {
-        mShowPercent = 0 != Settings.System.getInt(getContext().getContentResolver(),
-                SHOW_PERCENT_SETTING, 0);
+       // mShowPercent = 0 != Settings.System.getInt(getContext().getContentResolver(),
+         //       SHOW_PERCENT_SETTING, 0);
     }

     private int getColorForLevel(int percent) {

你可能感兴趣的:(android)